From 67d9f85ccb2f8b43169a93caa3625fed02d83034 Mon Sep 17 00:00:00 2001 From: achou11 Date: Tue, 7 Sep 2021 17:12:12 -0400 Subject: [PATCH 01/77] WIP: rebased onto develop after 0.65 work --- .flowconfig | 10 +- .gitattributes | 4 +- android/app/build.gradle | 17 +- android/app/src/debug/AndroidManifest.xml | 9 +- android/app/src/main/AndroidManifest.xml | 1 - .../main/java/com/mapeo/MainApplication.java | 4 +- android/app/src/main/res/values/styles.xml | 2 +- android/build.gradle | 13 +- android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/gradlew.bat | 21 +- metro.config.js | 2 +- package-lock.json | 9272 +++++++++++++---- package.json | 25 +- src/frontend/App.js | 2 + src/frontend/lib/logger.js | 2 +- 16 files changed, 7030 insertions(+), 2358 deletions(-) diff --git a/.flowconfig b/.flowconfig index b41785995..f33a5401a 100644 --- a/.flowconfig +++ b/.flowconfig @@ -51,8 +51,7 @@ node_modules/react-native/flow/ [options] emoji=true -esproposal.optional_chaining=enable -esproposal.nullish_coalescing=enable +exact_by_default=true module.file_ext=.js module.file_ext=.json @@ -68,10 +67,6 @@ suppress_type=$FlowFixMe suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeState -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native\\(_ios\\)?_\\(oss\\|fb\\)[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - [lints] sketchy-null-number=warn sketchy-null-mixed=warn @@ -82,7 +77,6 @@ deprecated-type=warn unsafe-getters-setters=warn unnecessary-invariant=warn signature-verification-failure=warn -deprecated-utility=error [strict] deprecated-type @@ -94,4 +88,4 @@ untyped-import untyped-type-import [version] -^0.122.0 +^0.149.0 diff --git a/.gitattributes b/.gitattributes index e27f70fa4..45a3dcb2a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ -*.pbxproj -text -# specific for windows script files +# Windows files should use crlf line endings +# https://help.github.com/articles/dealing-with-line-endings/ *.bat text eol=crlf diff --git a/android/app/build.gradle b/android/app/build.gradle index 3ef2bea0f..0e576ad5a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -180,9 +180,12 @@ def myVersionName = getenv("ANDROID_VERSION_NAME") ?: getenv("npm_package_versio println("Version name") println(myVersionName) +def paths = [ + new File("app/build/jni/libs") +] + bugsnag { - ndk true - sharedObjectPath "app/build/jni/libs" + sharedObjectPaths = paths } String shouldRebuildNativeModules = System.getenv('NODEJS_MOBILE_BUILD_NATIVE_MODULES'); @@ -306,7 +309,7 @@ android { def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + defaultConfig.versionCode * 1000 + versionCodes.get(abi) } } } @@ -325,12 +328,6 @@ android { // This is for react-native-v8 exclude "**/libjsc.so" } - - // Use Java 1.8 - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } } configurations.all { @@ -379,7 +376,7 @@ dependencies { // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile + from configurations.implementation into 'libs' } diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index a9633a69d..1e7d5a80a 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -2,7 +2,10 @@ - + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 07ebca9d4..6f6153b18 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -49,7 +49,6 @@ - `, ++ ' ', ++ ' ', ++ `

Index of ${he.encode(pathname)}

`, ++ ].join('\n')}\n`; ++ ++ html += ''; ++ ++ const failed = false; ++ const writeRow = (file) => { ++ // render a row given a [name, stat] tuple ++ const isDir = file[1].isDirectory && file[1].isDirectory(); ++ let href = `${parsed.pathname.replace(/\/$/, '')}/${encodeURIComponent(file[0])}`; ++ ++ // append trailing slash and query for dir entry ++ if (isDir) { ++ href += `/${he.encode((parsed.search) ? parsed.search : '')}`; ++ } ++ ++ const displayName = he.encode(file[0]) + ((isDir) ? '/' : ''); ++ const ext = file[0].split('.').pop(); ++ const classForNonDir = supportedIcons[ext] ? ext : '_page'; ++ const iconClass = `icon-${isDir ? '_blank' : classForNonDir}`; ++ ++ // TODO: use stylessheets? ++ html += `${'' + ++ '`; ++ if (!hidePermissions) { ++ html += ``; ++ } ++ html += ++ `` + ++ `` + ++ '\n'; ++ }; ++ ++ dirs.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow); ++ renderFiles.sort((a, b) => a.toString().localeCompare(b.toString())).forEach(writeRow); ++ lolwuts.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow); ++ ++ html += '
(${permsToString(file[1])})${sizeToString(file[1], humanReadable, si)}${displayName}
\n'; ++ html += `
Node.js ++ ${process.version} ++ / ecstatic ` + ++ `server running @ ++ ${he.encode(req.headers.host || '')} ++
\n` + ++ '' ++ ; ++ ++ if (!failed) { ++ res.writeHead(200, { 'Content-Type': 'text/html' }); ++ res.end(html); ++ } ++ } ++ ++ sortFiles(dir, files, (lolwuts, dirs, sortedFiles) => { ++ // It's possible to get stat errors for all sorts of reasons here. ++ // Unfortunately, our two choices are to either bail completely, ++ // or just truck along as though everything's cool. In this case, ++ // I decided to just tack them on as "??!?" items along with dirs ++ // and files. ++ // ++ // Whatever. ++ ++ // if it makes sense to, add a .. link ++ if (path.resolve(dir, '..').slice(0, root.length) === root) { ++ fs.stat(path.join(dir, '..'), (err, s) => { ++ if (err) { ++ status[500](res, next, { error: err, handleError }); ++ return; ++ } ++ dirs.unshift(['..', s]); ++ render(dirs, sortedFiles, lolwuts); ++ }); ++ } else { ++ render(dirs, sortedFiles, lolwuts); ++ } ++ }); ++ }); ++ }); ++ }; ++}; ++ ++}, ++"uWcSP5eXqxOfD2T43fElUt/DO/DebNoNF2+rKQVzbj8=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * is-accessor-descriptor ++ * ++ * Copyright (c) 2015-2017, Jon Schlinkert. ++ * Released under the MIT License. ++ */ ++ ++'use strict'; ++ ++var typeOf = require('kind-of'); ++ ++// accessor descriptor properties ++var accessor = { ++ get: 'function', ++ set: 'function', ++ configurable: 'boolean', ++ enumerable: 'boolean' ++}; ++ ++function isAccessorDescriptor(obj, prop) { ++ if (typeof prop === 'string') { ++ var val = Object.getOwnPropertyDescriptor(obj, prop); ++ return typeof val !== 'undefined'; ++ } ++ ++ if (typeOf(obj) !== 'object') { ++ return false; ++ } ++ ++ if (has(obj, 'value') || has(obj, 'writable')) { ++ return false; ++ } ++ ++ if (!has(obj, 'get') || typeof obj.get !== 'function') { ++ return false; ++ } ++ ++ // tldr: it's valid to have "set" be undefined ++ // "set" might be undefined if `Object.getOwnPropertyDescriptor` ++ // was used to get the value, and only `get` was defined by the user ++ if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') { ++ return false; ++ } ++ ++ for (var key in obj) { ++ if (!accessor.hasOwnProperty(key)) { ++ continue; ++ } ++ ++ if (typeOf(obj[key]) === accessor[key]) { ++ continue; ++ } ++ ++ if (typeof obj[key] !== 'undefined') { ++ return false; ++ } ++ } ++ return true; ++} ++ ++function has(obj, key) { ++ return {}.hasOwnProperty.call(obj, key); ++} ++ ++/** ++ * Expose `isAccessorDescriptor` ++ */ ++ ++module.exports = isAccessorDescriptor; ++ ++}, ++"udZGnuv7ue91kOch3Wcw6ChfoYv1xu5uJPEhxq0BKBM=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * unset-value ++ * ++ * Copyright (c) 2015, 2017, Jon Schlinkert. ++ * Released under the MIT License. ++ */ ++ ++'use strict'; ++ ++var isObject = require('isobject'); ++var has = require('has-value'); ++ ++module.exports = function unset(obj, prop) { ++ if (!isObject(obj)) { ++ throw new TypeError('expected an object.'); ++ } ++ if (obj.hasOwnProperty(prop)) { ++ delete obj[prop]; ++ return true; ++ } ++ ++ if (has(obj, prop)) { ++ var segs = prop.split('.'); ++ var last = segs.pop(); ++ while (segs.length && segs[segs.length - 1].slice(-1) === '\\') { ++ last = segs.pop().slice(0, -1) + '.' + last; ++ } ++ while (segs.length) obj = obj[prop = segs.shift()]; ++ return (delete obj[last]); ++ } ++ return true; ++}; ++ ++}, ++"ugzenaMHgsENI3304+ktMtqcO8LSeNibQ1XkpvVAzPc=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++var util = require('./util'); ++ ++var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; ++var DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31]; ++var TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i; ++var HOSTNAME = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i; ++var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; ++var URIREF = /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; ++// uri-template: https://tools.ietf.org/html/rfc6570 ++var URITEMPLATE = /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; ++// For the source: https://gist.github.com/dperini/729294 ++// For test cases: https://mathiasbynens.be/demo/url-regex ++// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. ++// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; ++var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; ++var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; ++var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; ++var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; ++var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; ++ ++ ++module.exports = formats; ++ ++function formats(mode) { ++ mode = mode == 'full' ? 'full' : 'fast'; ++ return util.copy(formats[mode]); ++} ++ ++ ++formats.fast = { ++ // date: http://tools.ietf.org/html/rfc3339#section-5.6 ++ date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, ++ // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 ++ time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, ++ 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, ++ // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js ++ uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, ++ 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, ++ 'uri-template': URITEMPLATE, ++ url: URL, ++ // email (sources from jsen validator): ++ // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 ++ // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') ++ email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, ++ hostname: HOSTNAME, ++ // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html ++ ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, ++ // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses ++ ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, ++ regex: regex, ++ // uuid: http://tools.ietf.org/html/rfc4122 ++ uuid: UUID, ++ // JSON-pointer: https://tools.ietf.org/html/rfc6901 ++ // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A ++ 'json-pointer': JSON_POINTER, ++ 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, ++ // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 ++ 'relative-json-pointer': RELATIVE_JSON_POINTER ++}; ++ ++ ++formats.full = { ++ date: date, ++ time: time, ++ 'date-time': date_time, ++ uri: uri, ++ 'uri-reference': URIREF, ++ 'uri-template': URITEMPLATE, ++ url: URL, ++ email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, ++ hostname: HOSTNAME, ++ ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, ++ ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, ++ regex: regex, ++ uuid: UUID, ++ 'json-pointer': JSON_POINTER, ++ 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, ++ 'relative-json-pointer': RELATIVE_JSON_POINTER ++}; ++ ++ ++function isLeapYear(year) { ++ // https://tools.ietf.org/html/rfc3339#appendix-C ++ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); ++} ++ ++ ++function date(str) { ++ // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 ++ var matches = str.match(DATE); ++ if (!matches) return false; ++ ++ var year = +matches[1]; ++ var month = +matches[2]; ++ var day = +matches[3]; ++ ++ return month >= 1 && month <= 12 && day >= 1 && ++ day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); ++} ++ ++ ++function time(str, full) { ++ var matches = str.match(TIME); ++ if (!matches) return false; ++ ++ var hour = matches[1]; ++ var minute = matches[2]; ++ var second = matches[3]; ++ var timeZone = matches[5]; ++ return ((hour <= 23 && minute <= 59 && second <= 59) || ++ (hour == 23 && minute == 59 && second == 60)) && ++ (!full || timeZone); ++} ++ ++ ++var DATE_TIME_SEPARATOR = /t|\s/i; ++function date_time(str) { ++ // http://tools.ietf.org/html/rfc3339#section-5.6 ++ var dateTime = str.split(DATE_TIME_SEPARATOR); ++ return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); ++} ++ ++ ++var NOT_URI_FRAGMENT = /\/|:/; ++function uri(str) { ++ // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." ++ return NOT_URI_FRAGMENT.test(str) && URI.test(str); ++} ++ ++ ++var Z_ANCHOR = /[^\\]\\Z/; ++function regex(str) { ++ if (Z_ANCHOR.test(str)) return false; ++ try { ++ new RegExp(str); ++ return true; ++ } catch(e) { ++ return false; ++ } ++} ++ ++}, ++"umkKKpEGau7k61gQBI0wq42O3weWyfCzB1xBb1fTMqY=": ++function (require, module, exports, __dirname, __filename) { ++var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN ++var inherits = require('inherits') ++var DeferredIterator = require('./deferred-iterator') ++var deferrables = 'put get del batch clear'.split(' ') ++var optionalDeferrables = 'approximateSize compactRange'.split(' ') ++ ++function DeferredLevelDOWN (db) { ++ AbstractLevelDOWN.call(this, db.supports || {}) ++ ++ // TODO (future major): remove this fallback; db must have manifest that ++ // declares approximateSize and compactRange in additionalMethods. ++ optionalDeferrables.forEach(function (m) { ++ if (typeof db[m] === 'function' && !this.supports.additionalMethods[m]) { ++ this.supports.additionalMethods[m] = true ++ } ++ }, this) ++ ++ this._db = db ++ this._operations = [] ++ closed(this) ++} ++ ++inherits(DeferredLevelDOWN, AbstractLevelDOWN) ++ ++DeferredLevelDOWN.prototype.type = 'deferred-leveldown' ++ ++DeferredLevelDOWN.prototype._open = function (options, callback) { ++ var self = this ++ ++ this._db.open(options, function (err) { ++ if (err) return callback(err) ++ ++ self._operations.forEach(function (op) { ++ if (op.iterator) { ++ op.iterator.setDb(self._db) ++ } else { ++ self._db[op.method].apply(self._db, op.args) ++ } ++ }) ++ self._operations = [] ++ ++ open(self) ++ callback() ++ }) ++} ++ ++DeferredLevelDOWN.prototype._close = function (callback) { ++ var self = this ++ ++ this._db.close(function (err) { ++ if (err) return callback(err) ++ closed(self) ++ callback() ++ }) ++} ++ ++function open (self) { ++ deferrables.concat('iterator').forEach(function (m) { ++ self['_' + m] = function () { ++ return this._db[m].apply(this._db, arguments) ++ } ++ }) ++ Object.keys(self.supports.additionalMethods).forEach(function (m) { ++ self[m] = function () { ++ return this._db[m].apply(this._db, arguments) ++ } ++ }) ++} ++ ++function closed (self) { ++ deferrables.forEach(function (m) { ++ self['_' + m] = function () { ++ this._operations.push({ method: m, args: arguments }) ++ } ++ }) ++ Object.keys(self.supports.additionalMethods).forEach(function (m) { ++ self[m] = function () { ++ this._operations.push({ method: m, args: arguments }) ++ } ++ }) ++ self._iterator = function (options) { ++ var it = new DeferredIterator(self, options) ++ this._operations.push({ iterator: it }) ++ return it ++ } ++} ++ ++DeferredLevelDOWN.prototype._serializeKey = function (key) { ++ return key ++} ++ ++DeferredLevelDOWN.prototype._serializeValue = function (value) { ++ return value ++} ++ ++module.exports = DeferredLevelDOWN ++module.exports.DeferredIterator = DeferredIterator ++ ++}, ++"upsqoqqkUfGlHrXHavp0b4DzMJy0VWXEcajSm2FpGc8=": ++function (require, module, exports, __dirname, __filename) { ++/* Node.js 6.4.0 and up has full support */ ++var hasFullSupport = (function () { ++ try { ++ if (!Buffer.isEncoding('latin1')) { ++ return false ++ } ++ ++ var buf = Buffer.alloc ? Buffer.alloc(4) : new Buffer(4) ++ ++ buf.fill('ab', 'ucs2') ++ ++ return (buf.toString('hex') === '61006200') ++ } catch (_) { ++ return false ++ } ++}()) ++ ++function isSingleByte (val) { ++ return (val.length === 1 && val.charCodeAt(0) < 256) ++} ++ ++function fillWithNumber (buffer, val, start, end) { ++ if (start < 0 || end > buffer.length) { ++ throw new RangeError('Out of range index') ++ } ++ ++ start = start >>> 0 ++ end = end === undefined ? buffer.length : end >>> 0 ++ ++ if (end > start) { ++ buffer.fill(val, start, end) ++ } ++ ++ return buffer ++} ++ ++function fillWithBuffer (buffer, val, start, end) { ++ if (start < 0 || end > buffer.length) { ++ throw new RangeError('Out of range index') ++ } ++ ++ if (end <= start) { ++ return buffer ++ } ++ ++ start = start >>> 0 ++ end = end === undefined ? buffer.length : end >>> 0 ++ ++ var pos = start ++ var len = val.length ++ while (pos <= (end - len)) { ++ val.copy(buffer, pos) ++ pos += len ++ } ++ ++ if (pos !== end) { ++ val.copy(buffer, pos, 0, end - pos) ++ } ++ ++ return buffer ++} ++ ++function fill (buffer, val, start, end, encoding) { ++ if (hasFullSupport) { ++ return buffer.fill(val, start, end, encoding) ++ } ++ ++ if (typeof val === 'number') { ++ return fillWithNumber(buffer, val, start, end) ++ } ++ ++ if (typeof val === 'string') { ++ if (typeof start === 'string') { ++ encoding = start ++ start = 0 ++ end = buffer.length ++ } else if (typeof end === 'string') { ++ encoding = end ++ end = buffer.length ++ } ++ ++ if (encoding !== undefined && typeof encoding !== 'string') { ++ throw new TypeError('encoding must be a string') ++ } ++ ++ if (encoding === 'latin1') { ++ encoding = 'binary' ++ } ++ ++ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { ++ throw new TypeError('Unknown encoding: ' + encoding) ++ } ++ ++ if (val === '') { ++ return fillWithNumber(buffer, 0, start, end) ++ } ++ ++ if (isSingleByte(val)) { ++ return fillWithNumber(buffer, val.charCodeAt(0), start, end) ++ } ++ ++ val = new Buffer(val, encoding) ++ } ++ ++ if (Buffer.isBuffer(val)) { ++ return fillWithBuffer(buffer, val, start, end) ++ } ++ ++ // Other values (e.g. undefined, boolean, object) results in zero-fill ++ return fillWithNumber(buffer, 0, start, end) ++} ++ ++module.exports = fill ++ ++}, ++"uwGJS8pFXXzEfElXaHKT7w+nQPxQ6a8TUVF+etZn0Ao=": ++function (require, module, exports, __dirname, __filename) { ++const {dirname} = require('path') ++const {findMade, findMadeSync} = require('./find-made.js') ++const {mkdirpManual, mkdirpManualSync} = require('./mkdirp-manual.js') ++ ++const mkdirpNative = (path, opts) => { ++ opts.recursive = true ++ const parent = dirname(path) ++ if (parent === path) ++ return opts.mkdirAsync(path, opts) ++ ++ return findMade(opts, path).then(made => ++ opts.mkdirAsync(path, opts).then(() => made) ++ .catch(er => { ++ if (er.code === 'ENOENT') ++ return mkdirpManual(path, opts) ++ else ++ throw er ++ })) ++} ++ ++const mkdirpNativeSync = (path, opts) => { ++ opts.recursive = true ++ const parent = dirname(path) ++ if (parent === path) ++ return opts.mkdirSync(path, opts) ++ ++ const made = findMadeSync(opts, path) ++ try { ++ opts.mkdirSync(path, opts) ++ return made ++ } catch (er) { ++ if (er.code === 'ENOENT') ++ return mkdirpManualSync(path, opts) ++ else ++ throw er ++ } ++} ++ ++module.exports = {mkdirpNative, mkdirpNativeSync} ++ ++}, ++"uzgPMr71/rGGePD0X4gHP+1degBpowkTLLIIDNVT1cc=": ++function (require, module, exports, __dirname, __filename) { ++try { ++ var util = require('util'); ++ /* istanbul ignore next */ ++ if (typeof util.inherits !== 'function') throw ''; ++ module.exports = util.inherits; ++} catch (e) { ++ /* istanbul ignore next */ ++ module.exports = require('./inherits_browser.js'); ++} ++ ++}, ++"v1OwOo9/rCWjc5XjHGlHsLX/BbgqJOXs638jI3c4IEI=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * is-number ++ * ++ * Copyright (c) 2014-2015, Jon Schlinkert. ++ * Licensed under the MIT License. ++ */ ++ ++'use strict'; ++ ++var typeOf = require('kind-of'); ++ ++module.exports = function isNumber(num) { ++ var type = typeOf(num); ++ ++ if (type === 'string') { ++ if (!num.trim()) return false; ++ } else if (type !== 'number') { ++ return false; ++ } ++ ++ return (num - num + 1) >= 0; ++}; ++ ++}, ++"v2FFCx/1+U/qnUZmXpMRGWQgNMkD5jzCJLTJZHLu1NQ=": ++function (require, module, exports, __dirname, __filename) { ++// Copyright Joyent, Inc. and other Node contributors. ++// ++// Permission is hereby granted, free of charge, to any person obtaining a ++// copy of this software and associated documentation files (the ++// "Software"), to deal in the Software without restriction, including ++// without limitation the rights to use, copy, modify, merge, publish, ++// distribute, sublicense, and/or sell copies of the Software, and to permit ++// persons to whom the Software is furnished to do so, subject to the ++// following conditions: ++// ++// The above copyright notice and this permission notice shall be included ++// in all copies or substantial portions of the Software. ++// ++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN ++// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++// USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++// a passthrough stream. ++// basically just the most minimal sort of Transform stream. ++// Every written chunk gets output as-is. ++ ++'use strict'; ++ ++module.exports = PassThrough; ++ ++var Transform = require('./_stream_transform'); ++ ++/**/ ++var util = Object.create(require('core-util-is')); ++util.inherits = require('inherits'); ++/**/ ++ ++util.inherits(PassThrough, Transform); ++ ++function PassThrough(options) { ++ if (!(this instanceof PassThrough)) return new PassThrough(options); ++ ++ Transform.call(this, options); ++} ++ ++PassThrough.prototype._transform = function (chunk, encoding, cb) { ++ cb(null, chunk); ++}; ++}, ++"v4J0FVF4WmGxbPDZEqMP0dXbZqcjBIrdbvjPDIZGVlg=": ++function (require, module, exports, __dirname, __filename) { ++const util = require('util') ++const AbstractIterator = require('abstract-leveldown').AbstractIterator ++const binding = require('./binding') ++ ++function Iterator (db, options) { ++ AbstractIterator.call(this, db) ++ ++ this.context = binding.iterator_init(db.context, options) ++ this.cache = null ++ this.finished = false ++} ++ ++util.inherits(Iterator, AbstractIterator) ++ ++Iterator.prototype._seek = function (target) { ++ if (target.length === 0) { ++ throw new Error('cannot seek() to an empty target') ++ } ++ ++ this.cache = null ++ binding.iterator_seek(this.context, target) ++ this.finished = false ++} ++ ++Iterator.prototype._next = function (callback) { ++ var that = this ++ ++ if (this.cache && this.cache.length) { ++ process.nextTick(callback, null, this.cache.pop(), this.cache.pop()) ++ } else if (this.finished) { ++ process.nextTick(callback) ++ } else { ++ binding.iterator_next(this.context, function (err, array, finished) { ++ if (err) return callback(err) ++ ++ that.cache = array ++ that.finished = finished ++ that._next(callback) ++ }) ++ } ++ ++ return this ++} ++ ++Iterator.prototype._end = function (callback) { ++ delete this.cache ++ binding.iterator_end(this.context, callback) ++} ++ ++module.exports = Iterator ++ ++}, ++"v4J93VLC6ZgZattkCuEZL33EnOXm5ZJuhhmP7rlFQqg=": ++function (require, module, exports, __dirname, __filename) { ++// String encode/decode helpers ++'use strict'; ++ ++ ++var utils = require('./common'); ++ ++ ++// Quick check if we can use fast array to bin string conversion ++// ++// - apply(Array) can fail on Android 2.2 ++// - apply(Uint8Array) can fail on iOS 5.1 Safari ++// ++var STR_APPLY_OK = true; ++var STR_APPLY_UIA_OK = true; ++ ++try { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; } ++try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } ++ ++ ++// Table with utf8 lengths (calculated by first byte of sequence) ++// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, ++// because max possible codepoint is 0x10ffff ++var _utf8len = new utils.Buf8(256); ++for (var q = 0; q < 256; q++) { ++ _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); ++} ++_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start ++ ++ ++// convert string to array (typed, when possible) ++exports.string2buf = function (str) { ++ var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; ++ ++ // count binary size ++ for (m_pos = 0; m_pos < str_len; m_pos++) { ++ c = str.charCodeAt(m_pos); ++ if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { ++ c2 = str.charCodeAt(m_pos + 1); ++ if ((c2 & 0xfc00) === 0xdc00) { ++ c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); ++ m_pos++; ++ } ++ } ++ buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; ++ } ++ ++ // allocate buffer ++ buf = new utils.Buf8(buf_len); ++ ++ // convert ++ for (i = 0, m_pos = 0; i < buf_len; m_pos++) { ++ c = str.charCodeAt(m_pos); ++ if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { ++ c2 = str.charCodeAt(m_pos + 1); ++ if ((c2 & 0xfc00) === 0xdc00) { ++ c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); ++ m_pos++; ++ } ++ } ++ if (c < 0x80) { ++ /* one byte */ ++ buf[i++] = c; ++ } else if (c < 0x800) { ++ /* two bytes */ ++ buf[i++] = 0xC0 | (c >>> 6); ++ buf[i++] = 0x80 | (c & 0x3f); ++ } else if (c < 0x10000) { ++ /* three bytes */ ++ buf[i++] = 0xE0 | (c >>> 12); ++ buf[i++] = 0x80 | (c >>> 6 & 0x3f); ++ buf[i++] = 0x80 | (c & 0x3f); ++ } else { ++ /* four bytes */ ++ buf[i++] = 0xf0 | (c >>> 18); ++ buf[i++] = 0x80 | (c >>> 12 & 0x3f); ++ buf[i++] = 0x80 | (c >>> 6 & 0x3f); ++ buf[i++] = 0x80 | (c & 0x3f); ++ } ++ } ++ ++ return buf; ++}; ++ ++// Helper (used in 2 places) ++function buf2binstring(buf, len) { ++ // On Chrome, the arguments in a function call that are allowed is `65534`. ++ // If the length of the buffer is smaller than that, we can use this optimization, ++ // otherwise we will take a slower path. ++ if (len < 65534) { ++ if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) { ++ return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len)); ++ } ++ } ++ ++ var result = ''; ++ for (var i = 0; i < len; i++) { ++ result += String.fromCharCode(buf[i]); ++ } ++ return result; ++} ++ ++ ++// Convert byte array to binary string ++exports.buf2binstring = function (buf) { ++ return buf2binstring(buf, buf.length); ++}; ++ ++ ++// Convert binary string (typed, when possible) ++exports.binstring2buf = function (str) { ++ var buf = new utils.Buf8(str.length); ++ for (var i = 0, len = buf.length; i < len; i++) { ++ buf[i] = str.charCodeAt(i); ++ } ++ return buf; ++}; ++ ++ ++// convert array to string ++exports.buf2string = function (buf, max) { ++ var i, out, c, c_len; ++ var len = max || buf.length; ++ ++ // Reserve max possible length (2 words per char) ++ // NB: by unknown reasons, Array is significantly faster for ++ // String.fromCharCode.apply than Uint16Array. ++ var utf16buf = new Array(len * 2); ++ ++ for (out = 0, i = 0; i < len;) { ++ c = buf[i++]; ++ // quick process ascii ++ if (c < 0x80) { utf16buf[out++] = c; continue; } ++ ++ c_len = _utf8len[c]; ++ // skip 5 & 6 byte codes ++ if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } ++ ++ // apply mask on first byte ++ c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; ++ // join the rest ++ while (c_len > 1 && i < len) { ++ c = (c << 6) | (buf[i++] & 0x3f); ++ c_len--; ++ } ++ ++ // terminated by end of string? ++ if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } ++ ++ if (c < 0x10000) { ++ utf16buf[out++] = c; ++ } else { ++ c -= 0x10000; ++ utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); ++ utf16buf[out++] = 0xdc00 | (c & 0x3ff); ++ } ++ } ++ ++ return buf2binstring(utf16buf, out); ++}; ++ ++ ++// Calculate max possible position in utf8 buffer, ++// that will not break sequence. If that's not possible ++// - (very small limits) return max size as is. ++// ++// buf[] - utf8 bytes array ++// max - length limit (mandatory); ++exports.utf8border = function (buf, max) { ++ var pos; ++ ++ max = max || buf.length; ++ if (max > buf.length) { max = buf.length; } ++ ++ // go back from last position, until start of sequence found ++ pos = max - 1; ++ while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } ++ ++ // Very small and broken sequence, ++ // return max, because we should return something anyway. ++ if (pos < 0) { return max; } ++ ++ // If we came to start of buffer - that means buffer is too small, ++ // return max too. ++ if (pos === 0) { return max; } ++ ++ return (pos + _utf8len[buf[pos]] > max) ? pos : max; ++}; ++ ++}, ++"v4JUyXmCgvNb4iS6tBNaR71ire2ayWOXpdSNcLA5mxY=": ++function (require, module, exports, __dirname, __filename) { ++var toBuffer = require('to-buffer') ++var varint = require('varint') ++var randomBytes = require('randombytes') ++var d64 = require('d64') ++ ++module.exports = { ++ validateBoundingBox: validateBoundingBox, ++ generateId: generateId, ++ populateElementDefaults: populateElementDefaults, ++ versionToNode: versionToNode, ++ nodeToVersion: nodeToVersion, ++ versionFromKeySeq: versionFromKeySeq, ++ hyperDbKeyToId: hyperDbKeyToId, ++ getPreviousHeads: getPreviousHeads ++} ++ ++// [[minLat,maxLat],[minLon,maxLon]] -> Error? [Mutate] ++function validateBoundingBox (bbox) { ++ if (!Array.isArray(bbox) || bbox.length !== 2 || ++ bbox[0].length !== 2 || bbox[1].length !== 2) { ++ return new Error('bbox format is [[minLat,maxLat],[minLon,maxLon]]') ++ } ++ ++ // Cap off the edges of the bounding box ++ bound(bbox[0][0], -90, 90) ++ bound(bbox[0][1], -90, 90) ++ bound(bbox[1][0], -180, 180) ++ bound(bbox[1][1], -180, 180) ++ ++ // Check whether min < max on the bbox ++ if (bbox[0][0] > bbox[0][1] || bbox[1][0] > bbox[1][1]) { ++ return new Error('max cannot be smaller than min') ++ } ++} ++ ++// bound :: Number, Number, Number -> Number ++function bound (n, min, max) { ++ return Math.min(max, Math.max(min, n)) ++} ++ ++// generateId :: String ++function generateId () { ++ return randomBytes(8).toString('hex') ++} ++ ++// OsmElement -> undefined [Mutate] ++function populateElementDefaults (elm) { ++ if (!elm.timestamp) { ++ elm.timestamp = (new Date()).toISOString() ++ } ++} ++ ++// HyperDB, String -> Node ++function versionToNode (db, version, cb) { ++ var feedseq = decodeVersion(version) ++ ++ for (var i = 0; i < db._writers.length; i++) { ++ var w = db._writers[i] ++ if (feedseq.key.equals(w.key)) { ++ return w.get(feedseq.seq, cb) ++ } ++ } ++ ++ throw new Error('node doesnt exist in db') ++} ++ ++// String -> { key, seq } ++function decodeVersion (version) { ++ var buf = d64.decode(version) ++ var key = buf.slice(0, 32) ++ var seq = varint.decode(buf, 32) ++ return { ++ key: key, ++ seq: seq ++ } ++} ++ ++// HyperDB, Node -> Buffer ++function nodeToVersion (db, node) { ++ for (var i = 0; i < db._writers.length; i++) { ++ var w = db._writers[i] ++ if (i === node.feed) { ++ return versionFromKeySeq(w.key, node.seq) ++ } ++ } ++ ++ throw new Error('node doesnt exist in db') ++} ++ ++// Buffer, Number -> String ++function versionFromKeySeq (key, seq) { ++ return d64.encode( ++ Buffer.concat([ ++ key, ++ toBuffer(varint.encode(seq)) ++ ]) ++ ) ++} ++ ++// Takes a hyperdb key like /foo/bar/baz and returns the last element (baz) ++// String -> String ++function hyperDbKeyToId (key) { ++ var components = key.split('/') ++ return components[components.length - 1] ++} ++ ++// HACK: hyperdb does not yet have a public API for this, so what follows is a ++// manual dirty process of reaching our arms in elbow-deep into the private ++// internals in order to retrieve the old heads of a node. ++// ++// HyperDB, HyperDBNode -> [HyperDBNode] ++function getPreviousHeads (db, node, cb) { ++ var clock = node.clock.slice() ++ ++ // -1. fudge clock ++ clock[node.feed] = node.seq + 1 ++ ++ // 0. skip edge cases I haven't figured out yet ++ if (clock[node.feed] === 0) return cb() ++ ++ // 1. turn back the clock ++ clock[node.feed]-- ++ ++ // 2. turn the clock into db heads ++ var arr = [] ++ for (var i = 0; i < clock.length; i++) { ++ if (clock[i] <= 0) continue ++ arr.push({key: db._writers[i].key, seq: clock[i] - 1}) ++ } ++ if (!arr.length) return cb(null, []) ++ ++ // 3. convert heads to a hyperdb version buffer ++ var version = headsToVersion(arr) ++ ++ // 4. checkout that version ++ var oldDb = db.checkout(version) ++ ++ // 5. do a lookup on that key ++ oldDb.get(node.key, cb) ++} ++ ++// [Head] -> Buffer ++function headsToVersion (heads) { ++ var bufAccum = [] ++ ++ for (var i = 0; i < heads.length; i++) { ++ bufAccum.push(heads[i].key) ++ bufAccum.push(toBuffer(varint.encode(heads[i].seq))) ++ } ++ ++ return Buffer.concat(bufAccum) ++} ++ ++}, ++"v6/R+UHs/jH+jydduQdJXQYynBbNGhgeNdbojls7K6U=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++// ++// Allowed token characters: ++// ++// '!', '#', '$', '%', '&', ''', '*', '+', '-', ++// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~' ++// ++// tokenChars[32] === 0 // ' ' ++// tokenChars[33] === 1 // '!' ++// tokenChars[34] === 0 // '"' ++// ... ++// ++const tokenChars = [ ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 ++ 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47 ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 ++ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79 ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95 ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111 ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127 ++]; ++ ++/** ++ * Adds an offer to the map of extension offers or a parameter to the map of ++ * parameters. ++ * ++ * @param {Object} dest The map of extension offers or parameters ++ * @param {String} name The extension or parameter name ++ * @param {(Object|Boolean|String)} elem The extension parameters or the ++ * parameter value ++ * @private ++ */ ++function push (dest, name, elem) { ++ if (Object.prototype.hasOwnProperty.call(dest, name)) dest[name].push(elem); ++ else dest[name] = [elem]; ++} ++ ++/** ++ * Parses the `Sec-WebSocket-Extensions` header into an object. ++ * ++ * @param {String} header The field value of the header ++ * @return {Object} The parsed object ++ * @public ++ */ ++function parse (header) { ++ const offers = {}; ++ ++ if (header === undefined || header === '') return offers; ++ ++ var params = {}; ++ var mustUnescape = false; ++ var isEscaping = false; ++ var inQuotes = false; ++ var extensionName; ++ var paramName; ++ var start = -1; ++ var end = -1; ++ ++ for (var i = 0; i < header.length; i++) { ++ const code = header.charCodeAt(i); ++ ++ if (extensionName === undefined) { ++ if (end === -1 && tokenChars[code] === 1) { ++ if (start === -1) start = i; ++ } else if (code === 0x20/* ' ' */|| code === 0x09/* '\t' */) { ++ if (end === -1 && start !== -1) end = i; ++ } else if (code === 0x3b/* ';' */ || code === 0x2c/* ',' */) { ++ if (start === -1) throw new Error(`unexpected character at index ${i}`); ++ ++ if (end === -1) end = i; ++ const name = header.slice(start, end); ++ if (code === 0x2c) { ++ push(offers, name, params); ++ params = {}; ++ } else { ++ extensionName = name; ++ } ++ ++ start = end = -1; ++ } else { ++ throw new Error(`unexpected character at index ${i}`); ++ } ++ } else if (paramName === undefined) { ++ if (end === -1 && tokenChars[code] === 1) { ++ if (start === -1) start = i; ++ } else if (code === 0x20 || code === 0x09) { ++ if (end === -1 && start !== -1) end = i; ++ } else if (code === 0x3b || code === 0x2c) { ++ if (start === -1) throw new Error(`unexpected character at index ${i}`); ++ ++ if (end === -1) end = i; ++ push(params, header.slice(start, end), true); ++ if (code === 0x2c) { ++ push(offers, extensionName, params); ++ params = {}; ++ extensionName = undefined; ++ } ++ ++ start = end = -1; ++ } else if (code === 0x3d/* '=' */&& start !== -1 && end === -1) { ++ paramName = header.slice(start, i); ++ start = end = -1; ++ } else { ++ throw new Error(`unexpected character at index ${i}`); ++ } ++ } else { ++ // ++ // The value of a quoted-string after unescaping must conform to the ++ // token ABNF, so only token characters are valid. ++ // Ref: https://tools.ietf.org/html/rfc6455#section-9.1 ++ // ++ if (isEscaping) { ++ if (tokenChars[code] !== 1) { ++ throw new Error(`unexpected character at index ${i}`); ++ } ++ if (start === -1) start = i; ++ else if (!mustUnescape) mustUnescape = true; ++ isEscaping = false; ++ } else if (inQuotes) { ++ if (tokenChars[code] === 1) { ++ if (start === -1) start = i; ++ } else if (code === 0x22/* '"' */ && start !== -1) { ++ inQuotes = false; ++ end = i; ++ } else if (code === 0x5c/* '\' */) { ++ isEscaping = true; ++ } else { ++ throw new Error(`unexpected character at index ${i}`); ++ } ++ } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) { ++ inQuotes = true; ++ } else if (end === -1 && tokenChars[code] === 1) { ++ if (start === -1) start = i; ++ } else if (start !== -1 && (code === 0x20 || code === 0x09)) { ++ if (end === -1) end = i; ++ } else if (code === 0x3b || code === 0x2c) { ++ if (start === -1) throw new Error(`unexpected character at index ${i}`); ++ ++ if (end === -1) end = i; ++ var value = header.slice(start, end); ++ if (mustUnescape) { ++ value = value.replace(/\\/g, ''); ++ mustUnescape = false; ++ } ++ push(params, paramName, value); ++ if (code === 0x2c) { ++ push(offers, extensionName, params); ++ params = {}; ++ extensionName = undefined; ++ } ++ ++ paramName = undefined; ++ start = end = -1; ++ } else { ++ throw new Error(`unexpected character at index ${i}`); ++ } ++ } ++ } ++ ++ if (start === -1 || inQuotes) throw new Error('unexpected end of input'); ++ ++ if (end === -1) end = i; ++ const token = header.slice(start, end); ++ if (extensionName === undefined) { ++ push(offers, token, {}); ++ } else { ++ if (paramName === undefined) { ++ push(params, token, true); ++ } else if (mustUnescape) { ++ push(params, paramName, token.replace(/\\/g, '')); ++ } else { ++ push(params, paramName, token); ++ } ++ push(offers, extensionName, params); ++ } ++ ++ return offers; ++} ++ ++/** ++ * Serializes a parsed `Sec-WebSocket-Extensions` header to a string. ++ * ++ * @param {Object} value The object to format ++ * @return {String} A string representing the given value ++ * @public ++ */ ++function format (value) { ++ return Object.keys(value).map((token) => { ++ var paramsList = value[token]; ++ if (!Array.isArray(paramsList)) paramsList = [paramsList]; ++ return paramsList.map((params) => { ++ return [token].concat(Object.keys(params).map((k) => { ++ var p = params[k]; ++ if (!Array.isArray(p)) p = [p]; ++ return p.map((v) => v === true ? k : `${k}=${v}`).join('; '); ++ })).join('; '); ++ }).join(', '); ++ }).join(', '); ++} ++ ++module.exports = { format, parse }; ++ ++}, ++"v8VTn89e4ngZFwsNL7zODeRGqKJIVPjVAwMKaDmsw74=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++const mime = require('mime'); ++const charset = require('charset'); ++ ++ ++exports.define = mappings => mime.define(mappings, true); ++ ++let customGetType = (file, defaultValue) => null; // eslint-disable-line no-unused-vars ++ ++exports.setCustomGetType = (fn) => { customGetType = fn; }; ++ ++exports.getType = (file, defaultValue) => ( ++ customGetType(file, defaultValue) || ++ mime.getType(file) || ++ defaultValue ++); ++ ++let customLookupCharset = mimeType => null; // eslint-disable-line no-unused-vars ++ ++exports.setCustomLookupCharset = (fn) => { customLookupCharset = fn; }; ++ ++exports.lookupCharset = mimeType => ( ++ customLookupCharset(mimeType) || ++ charset(mimeType) ++); ++ ++}, ++"v9gdZSUPsYgK0FCkuD/o9+NAg1xAY2M2r4CL+QzUELY=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++var Readable = require('readable-stream').Readable; ++ ++var utils = require('../utils'); ++utils.inherits(NodejsStreamOutputAdapter, Readable); ++ ++/** ++* A nodejs stream using a worker as source. ++* @see the SourceWrapper in http://nodejs.org/api/stream.html ++* @constructor ++* @param {StreamHelper} helper the helper wrapping the worker ++* @param {Object} options the nodejs stream options ++* @param {Function} updateCb the update callback. ++*/ ++function NodejsStreamOutputAdapter(helper, options, updateCb) { ++ Readable.call(this, options); ++ this._helper = helper; ++ ++ var self = this; ++ helper.on("data", function (data, meta) { ++ if (!self.push(data)) { ++ self._helper.pause(); ++ } ++ if(updateCb) { ++ updateCb(meta); ++ } ++ }) ++ .on("error", function(e) { ++ self.emit('error', e); ++ }) ++ .on("end", function () { ++ self.push(null); ++ }); ++} ++ ++ ++NodejsStreamOutputAdapter.prototype._read = function() { ++ this._helper.resume(); ++}; ++ ++module.exports = NodejsStreamOutputAdapter; ++ ++}, ++"vFWqrHa0YEh+TAVYP/JEvCroWtmdoABZzYcnc8SOqQI=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++var token = '%[a-f0-9]{2}'; ++var singleMatcher = new RegExp(token, 'gi'); ++var multiMatcher = new RegExp('(' + token + ')+', 'gi'); ++ ++function decodeComponents(components, split) { ++ try { ++ // Try to decode the entire string first ++ return decodeURIComponent(components.join('')); ++ } catch (err) { ++ // Do nothing ++ } ++ ++ if (components.length === 1) { ++ return components; ++ } ++ ++ split = split || 1; ++ ++ // Split the array in 2 parts ++ var left = components.slice(0, split); ++ var right = components.slice(split); ++ ++ return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); ++} ++ ++function decode(input) { ++ try { ++ return decodeURIComponent(input); ++ } catch (err) { ++ var tokens = input.match(singleMatcher); ++ ++ for (var i = 1; i < tokens.length; i++) { ++ input = decodeComponents(tokens, i).join(''); ++ ++ tokens = input.match(singleMatcher); ++ } ++ ++ return input; ++ } ++} ++ ++function customDecodeURIComponent(input) { ++ // Keep track of all the replacements and prefill the map with the `BOM` ++ var replaceMap = { ++ '%FE%FF': '\uFFFD\uFFFD', ++ '%FF%FE': '\uFFFD\uFFFD' ++ }; ++ ++ var match = multiMatcher.exec(input); ++ while (match) { ++ try { ++ // Decode as big chunks as possible ++ replaceMap[match[0]] = decodeURIComponent(match[0]); ++ } catch (err) { ++ var result = decode(match[0]); ++ ++ if (result !== match[0]) { ++ replaceMap[match[0]] = result; ++ } ++ } ++ ++ match = multiMatcher.exec(input); ++ } ++ ++ // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else ++ replaceMap['%C2'] = '\uFFFD'; ++ ++ var entries = Object.keys(replaceMap); ++ ++ for (var i = 0; i < entries.length; i++) { ++ // Replace all decoded components ++ var key = entries[i]; ++ input = input.replace(new RegExp(key, 'g'), replaceMap[key]); ++ } ++ ++ return input; ++} ++ ++module.exports = function (encodedURI) { ++ if (typeof encodedURI !== 'string') { ++ throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`'); ++ } ++ ++ try { ++ encodedURI = encodedURI.replace(/\+/g, ' '); ++ ++ // Try the built in decoder first ++ return decodeURIComponent(encodedURI); ++ } catch (err) { ++ // Fallback to a more advanced decoder ++ return customDecodeURIComponent(encodedURI); ++ } ++}; ++ ++}, ++"vI7NBVNoKizw/T7ablYtwI3LpO0i3o35fx5BICdyws8=": ++function (require, module, exports, __dirname, __filename) { ++module.exports = function(it){ ++ if(typeof it != 'function')throw TypeError(it + ' is not a function!'); ++ return it; ++}; ++}, ++"vKwBiwziEY5xgv7FtmRX88z+ZLGD6rfEbFuh2YJM2Lg=": ++function (require, module, exports, __dirname, __filename) { ++// https://github.com/topojson/topojson-server v3.0.1 Copyright 2019 Mike Bostock ++(function (global, factory) { ++typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : ++typeof define === 'function' && define.amd ? define(['exports'], factory) : ++(global = global || self, factory(global.topojson = global.topojson || {})); ++}(this, function (exports) { 'use strict'; ++ ++var hasOwnProperty = Object.prototype.hasOwnProperty; ++ ++// Computes the bounding box of the specified hash of GeoJSON objects. ++function bounds(objects) { ++ var x0 = Infinity, ++ y0 = Infinity, ++ x1 = -Infinity, ++ y1 = -Infinity; ++ ++ function boundGeometry(geometry) { ++ if (geometry != null && hasOwnProperty.call(boundGeometryType, geometry.type)) boundGeometryType[geometry.type](geometry); ++ } ++ ++ var boundGeometryType = { ++ GeometryCollection: function(o) { o.geometries.forEach(boundGeometry); }, ++ Point: function(o) { boundPoint(o.coordinates); }, ++ MultiPoint: function(o) { o.coordinates.forEach(boundPoint); }, ++ LineString: function(o) { boundLine(o.arcs); }, ++ MultiLineString: function(o) { o.arcs.forEach(boundLine); }, ++ Polygon: function(o) { o.arcs.forEach(boundLine); }, ++ MultiPolygon: function(o) { o.arcs.forEach(boundMultiLine); } ++ }; ++ ++ function boundPoint(coordinates) { ++ var x = coordinates[0], ++ y = coordinates[1]; ++ if (x < x0) x0 = x; ++ if (x > x1) x1 = x; ++ if (y < y0) y0 = y; ++ if (y > y1) y1 = y; ++ } ++ ++ function boundLine(coordinates) { ++ coordinates.forEach(boundPoint); ++ } ++ ++ function boundMultiLine(coordinates) { ++ coordinates.forEach(boundLine); ++ } ++ ++ for (var key in objects) { ++ boundGeometry(objects[key]); ++ } ++ ++ return x1 >= x0 && y1 >= y0 ? [x0, y0, x1, y1] : undefined; ++} ++ ++function hashset(size, hash, equal, type, empty) { ++ if (arguments.length === 3) { ++ type = Array; ++ empty = null; ++ } ++ ++ var store = new type(size = 1 << Math.max(4, Math.ceil(Math.log(size) / Math.LN2))), ++ mask = size - 1; ++ ++ for (var i = 0; i < size; ++i) { ++ store[i] = empty; ++ } ++ ++ function add(value) { ++ var index = hash(value) & mask, ++ match = store[index], ++ collisions = 0; ++ while (match != empty) { ++ if (equal(match, value)) return true; ++ if (++collisions >= size) throw new Error("full hashset"); ++ match = store[index = (index + 1) & mask]; ++ } ++ store[index] = value; ++ return true; ++ } ++ ++ function has(value) { ++ var index = hash(value) & mask, ++ match = store[index], ++ collisions = 0; ++ while (match != empty) { ++ if (equal(match, value)) return true; ++ if (++collisions >= size) break; ++ match = store[index = (index + 1) & mask]; ++ } ++ return false; ++ } ++ ++ function values() { ++ var values = []; ++ for (var i = 0, n = store.length; i < n; ++i) { ++ var match = store[i]; ++ if (match != empty) values.push(match); ++ } ++ return values; ++ } ++ ++ return { ++ add: add, ++ has: has, ++ values: values ++ }; ++} ++ ++function hashmap(size, hash, equal, keyType, keyEmpty, valueType) { ++ if (arguments.length === 3) { ++ keyType = valueType = Array; ++ keyEmpty = null; ++ } ++ ++ var keystore = new keyType(size = 1 << Math.max(4, Math.ceil(Math.log(size) / Math.LN2))), ++ valstore = new valueType(size), ++ mask = size - 1; ++ ++ for (var i = 0; i < size; ++i) { ++ keystore[i] = keyEmpty; ++ } ++ ++ function set(key, value) { ++ var index = hash(key) & mask, ++ matchKey = keystore[index], ++ collisions = 0; ++ while (matchKey != keyEmpty) { ++ if (equal(matchKey, key)) return valstore[index] = value; ++ if (++collisions >= size) throw new Error("full hashmap"); ++ matchKey = keystore[index = (index + 1) & mask]; ++ } ++ keystore[index] = key; ++ valstore[index] = value; ++ return value; ++ } ++ ++ function maybeSet(key, value) { ++ var index = hash(key) & mask, ++ matchKey = keystore[index], ++ collisions = 0; ++ while (matchKey != keyEmpty) { ++ if (equal(matchKey, key)) return valstore[index]; ++ if (++collisions >= size) throw new Error("full hashmap"); ++ matchKey = keystore[index = (index + 1) & mask]; ++ } ++ keystore[index] = key; ++ valstore[index] = value; ++ return value; ++ } ++ ++ function get(key, missingValue) { ++ var index = hash(key) & mask, ++ matchKey = keystore[index], ++ collisions = 0; ++ while (matchKey != keyEmpty) { ++ if (equal(matchKey, key)) return valstore[index]; ++ if (++collisions >= size) break; ++ matchKey = keystore[index = (index + 1) & mask]; ++ } ++ return missingValue; ++ } ++ ++ function keys() { ++ var keys = []; ++ for (var i = 0, n = keystore.length; i < n; ++i) { ++ var matchKey = keystore[i]; ++ if (matchKey != keyEmpty) keys.push(matchKey); ++ } ++ return keys; ++ } ++ ++ return { ++ set: set, ++ maybeSet: maybeSet, // set if unset ++ get: get, ++ keys: keys ++ }; ++} ++ ++function equalPoint(pointA, pointB) { ++ return pointA[0] === pointB[0] && pointA[1] === pointB[1]; ++} ++ ++// TODO if quantized, use simpler Int32 hashing? ++ ++var buffer = new ArrayBuffer(16), ++ floats = new Float64Array(buffer), ++ uints = new Uint32Array(buffer); ++ ++function hashPoint(point) { ++ floats[0] = point[0]; ++ floats[1] = point[1]; ++ var hash = uints[0] ^ uints[1]; ++ hash = hash << 5 ^ hash >> 7 ^ uints[2] ^ uints[3]; ++ return hash & 0x7fffffff; ++} ++ ++// Given an extracted (pre-)topology, identifies all of the junctions. These are ++// the points at which arcs (lines or rings) will need to be cut so that each ++// arc is represented uniquely. ++// ++// A junction is a point where at least one arc deviates from another arc going ++// through the same point. For example, consider the point B. If there is a arc ++// through ABC and another arc through CBA, then B is not a junction because in ++// both cases the adjacent point pairs are {A,C}. However, if there is an ++// additional arc ABD, then {A,D} != {A,C}, and thus B becomes a junction. ++// ++// For a closed ring ABCA, the first point A’s adjacent points are the second ++// and last point {B,C}. For a line, the first and last point are always ++// considered junctions, even if the line is closed; this ensures that a closed ++// line is never rotated. ++function join(topology) { ++ var coordinates = topology.coordinates, ++ lines = topology.lines, ++ rings = topology.rings, ++ indexes = index(), ++ visitedByIndex = new Int32Array(coordinates.length), ++ leftByIndex = new Int32Array(coordinates.length), ++ rightByIndex = new Int32Array(coordinates.length), ++ junctionByIndex = new Int8Array(coordinates.length), ++ junctionCount = 0, // upper bound on number of junctions ++ i, n, ++ previousIndex, ++ currentIndex, ++ nextIndex; ++ ++ for (i = 0, n = coordinates.length; i < n; ++i) { ++ visitedByIndex[i] = leftByIndex[i] = rightByIndex[i] = -1; ++ } ++ ++ for (i = 0, n = lines.length; i < n; ++i) { ++ var line = lines[i], ++ lineStart = line[0], ++ lineEnd = line[1]; ++ currentIndex = indexes[lineStart]; ++ nextIndex = indexes[++lineStart]; ++ ++junctionCount, junctionByIndex[currentIndex] = 1; // start ++ while (++lineStart <= lineEnd) { ++ sequence(i, previousIndex = currentIndex, currentIndex = nextIndex, nextIndex = indexes[lineStart]); ++ } ++ ++junctionCount, junctionByIndex[nextIndex] = 1; // end ++ } ++ ++ for (i = 0, n = coordinates.length; i < n; ++i) { ++ visitedByIndex[i] = -1; ++ } ++ ++ for (i = 0, n = rings.length; i < n; ++i) { ++ var ring = rings[i], ++ ringStart = ring[0] + 1, ++ ringEnd = ring[1]; ++ previousIndex = indexes[ringEnd - 1]; ++ currentIndex = indexes[ringStart - 1]; ++ nextIndex = indexes[ringStart]; ++ sequence(i, previousIndex, currentIndex, nextIndex); ++ while (++ringStart <= ringEnd) { ++ sequence(i, previousIndex = currentIndex, currentIndex = nextIndex, nextIndex = indexes[ringStart]); ++ } ++ } ++ ++ function sequence(i, previousIndex, currentIndex, nextIndex) { ++ if (visitedByIndex[currentIndex] === i) return; // ignore self-intersection ++ visitedByIndex[currentIndex] = i; ++ var leftIndex = leftByIndex[currentIndex]; ++ if (leftIndex >= 0) { ++ var rightIndex = rightByIndex[currentIndex]; ++ if ((leftIndex !== previousIndex || rightIndex !== nextIndex) ++ && (leftIndex !== nextIndex || rightIndex !== previousIndex)) { ++ ++junctionCount, junctionByIndex[currentIndex] = 1; ++ } ++ } else { ++ leftByIndex[currentIndex] = previousIndex; ++ rightByIndex[currentIndex] = nextIndex; ++ } ++ } ++ ++ function index() { ++ var indexByPoint = hashmap(coordinates.length * 1.4, hashIndex, equalIndex, Int32Array, -1, Int32Array), ++ indexes = new Int32Array(coordinates.length); ++ ++ for (var i = 0, n = coordinates.length; i < n; ++i) { ++ indexes[i] = indexByPoint.maybeSet(i, i); ++ } ++ ++ return indexes; ++ } ++ ++ function hashIndex(i) { ++ return hashPoint(coordinates[i]); ++ } ++ ++ function equalIndex(i, j) { ++ return equalPoint(coordinates[i], coordinates[j]); ++ } ++ ++ visitedByIndex = leftByIndex = rightByIndex = null; ++ ++ var junctionByPoint = hashset(junctionCount * 1.4, hashPoint, equalPoint), j; ++ ++ // Convert back to a standard hashset by point for caller convenience. ++ for (i = 0, n = coordinates.length; i < n; ++i) { ++ if (junctionByIndex[j = indexes[i]]) { ++ junctionByPoint.add(coordinates[j]); ++ } ++ } ++ ++ return junctionByPoint; ++} ++ ++// Given an extracted (pre-)topology, cuts (or rotates) arcs so that all shared ++// point sequences are identified. The topology can then be subsequently deduped ++// to remove exact duplicate arcs. ++function cut(topology) { ++ var junctions = join(topology), ++ coordinates = topology.coordinates, ++ lines = topology.lines, ++ rings = topology.rings, ++ next, ++ i, n; ++ ++ for (i = 0, n = lines.length; i < n; ++i) { ++ var line = lines[i], ++ lineMid = line[0], ++ lineEnd = line[1]; ++ while (++lineMid < lineEnd) { ++ if (junctions.has(coordinates[lineMid])) { ++ next = {0: lineMid, 1: line[1]}; ++ line[1] = lineMid; ++ line = line.next = next; ++ } ++ } ++ } ++ ++ for (i = 0, n = rings.length; i < n; ++i) { ++ var ring = rings[i], ++ ringStart = ring[0], ++ ringMid = ringStart, ++ ringEnd = ring[1], ++ ringFixed = junctions.has(coordinates[ringStart]); ++ while (++ringMid < ringEnd) { ++ if (junctions.has(coordinates[ringMid])) { ++ if (ringFixed) { ++ next = {0: ringMid, 1: ring[1]}; ++ ring[1] = ringMid; ++ ring = ring.next = next; ++ } else { // For the first junction, we can rotate rather than cut. ++ rotateArray(coordinates, ringStart, ringEnd, ringEnd - ringMid); ++ coordinates[ringEnd] = coordinates[ringStart]; ++ ringFixed = true; ++ ringMid = ringStart; // restart; we may have skipped junctions ++ } ++ } ++ } ++ } ++ ++ return topology; ++} ++ ++function rotateArray(array, start, end, offset) { ++ reverse(array, start, end); ++ reverse(array, start, start + offset); ++ reverse(array, start + offset, end); ++} ++ ++function reverse(array, start, end) { ++ for (var mid = start + ((end-- - start) >> 1), t; start < mid; ++start, --end) { ++ t = array[start], array[start] = array[end], array[end] = t; ++ } ++} ++ ++// Given a cut topology, combines duplicate arcs. ++function dedup(topology) { ++ var coordinates = topology.coordinates, ++ lines = topology.lines, line, ++ rings = topology.rings, ring, ++ arcCount = lines.length + rings.length, ++ i, n; ++ ++ delete topology.lines; ++ delete topology.rings; ++ ++ // Count the number of (non-unique) arcs to initialize the hashmap safely. ++ for (i = 0, n = lines.length; i < n; ++i) { ++ line = lines[i]; while (line = line.next) ++arcCount; ++ } ++ for (i = 0, n = rings.length; i < n; ++i) { ++ ring = rings[i]; while (ring = ring.next) ++arcCount; ++ } ++ ++ var arcsByEnd = hashmap(arcCount * 2 * 1.4, hashPoint, equalPoint), ++ arcs = topology.arcs = []; ++ ++ for (i = 0, n = lines.length; i < n; ++i) { ++ line = lines[i]; ++ do { ++ dedupLine(line); ++ } while (line = line.next); ++ } ++ ++ for (i = 0, n = rings.length; i < n; ++i) { ++ ring = rings[i]; ++ if (ring.next) { // arc is no longer closed ++ do { ++ dedupLine(ring); ++ } while (ring = ring.next); ++ } else { ++ dedupRing(ring); ++ } ++ } ++ ++ function dedupLine(arc) { ++ var startPoint, ++ endPoint, ++ startArcs, startArc, ++ endArcs, endArc, ++ i, n; ++ ++ // Does this arc match an existing arc in order? ++ if (startArcs = arcsByEnd.get(startPoint = coordinates[arc[0]])) { ++ for (i = 0, n = startArcs.length; i < n; ++i) { ++ startArc = startArcs[i]; ++ if (equalLine(startArc, arc)) { ++ arc[0] = startArc[0]; ++ arc[1] = startArc[1]; ++ return; ++ } ++ } ++ } ++ ++ // Does this arc match an existing arc in reverse order? ++ if (endArcs = arcsByEnd.get(endPoint = coordinates[arc[1]])) { ++ for (i = 0, n = endArcs.length; i < n; ++i) { ++ endArc = endArcs[i]; ++ if (reverseEqualLine(endArc, arc)) { ++ arc[1] = endArc[0]; ++ arc[0] = endArc[1]; ++ return; ++ } ++ } ++ } ++ ++ if (startArcs) startArcs.push(arc); else arcsByEnd.set(startPoint, [arc]); ++ if (endArcs) endArcs.push(arc); else arcsByEnd.set(endPoint, [arc]); ++ arcs.push(arc); ++ } ++ ++ function dedupRing(arc) { ++ var endPoint, ++ endArcs, ++ endArc, ++ i, n; ++ ++ // Does this arc match an existing line in order, or reverse order? ++ // Rings are closed, so their start point and end point is the same. ++ if (endArcs = arcsByEnd.get(endPoint = coordinates[arc[0]])) { ++ for (i = 0, n = endArcs.length; i < n; ++i) { ++ endArc = endArcs[i]; ++ if (equalRing(endArc, arc)) { ++ arc[0] = endArc[0]; ++ arc[1] = endArc[1]; ++ return; ++ } ++ if (reverseEqualRing(endArc, arc)) { ++ arc[0] = endArc[1]; ++ arc[1] = endArc[0]; ++ return; ++ } ++ } ++ } ++ ++ // Otherwise, does this arc match an existing ring in order, or reverse order? ++ if (endArcs = arcsByEnd.get(endPoint = coordinates[arc[0] + findMinimumOffset(arc)])) { ++ for (i = 0, n = endArcs.length; i < n; ++i) { ++ endArc = endArcs[i]; ++ if (equalRing(endArc, arc)) { ++ arc[0] = endArc[0]; ++ arc[1] = endArc[1]; ++ return; ++ } ++ if (reverseEqualRing(endArc, arc)) { ++ arc[0] = endArc[1]; ++ arc[1] = endArc[0]; ++ return; ++ } ++ } ++ } ++ ++ if (endArcs) endArcs.push(arc); else arcsByEnd.set(endPoint, [arc]); ++ arcs.push(arc); ++ } ++ ++ function equalLine(arcA, arcB) { ++ var ia = arcA[0], ib = arcB[0], ++ ja = arcA[1], jb = arcB[1]; ++ if (ia - ja !== ib - jb) return false; ++ for (; ia <= ja; ++ia, ++ib) if (!equalPoint(coordinates[ia], coordinates[ib])) return false; ++ return true; ++ } ++ ++ function reverseEqualLine(arcA, arcB) { ++ var ia = arcA[0], ib = arcB[0], ++ ja = arcA[1], jb = arcB[1]; ++ if (ia - ja !== ib - jb) return false; ++ for (; ia <= ja; ++ia, --jb) if (!equalPoint(coordinates[ia], coordinates[jb])) return false; ++ return true; ++ } ++ ++ function equalRing(arcA, arcB) { ++ var ia = arcA[0], ib = arcB[0], ++ ja = arcA[1], jb = arcB[1], ++ n = ja - ia; ++ if (n !== jb - ib) return false; ++ var ka = findMinimumOffset(arcA), ++ kb = findMinimumOffset(arcB); ++ for (var i = 0; i < n; ++i) { ++ if (!equalPoint(coordinates[ia + (i + ka) % n], coordinates[ib + (i + kb) % n])) return false; ++ } ++ return true; ++ } ++ ++ function reverseEqualRing(arcA, arcB) { ++ var ia = arcA[0], ib = arcB[0], ++ ja = arcA[1], jb = arcB[1], ++ n = ja - ia; ++ if (n !== jb - ib) return false; ++ var ka = findMinimumOffset(arcA), ++ kb = n - findMinimumOffset(arcB); ++ for (var i = 0; i < n; ++i) { ++ if (!equalPoint(coordinates[ia + (i + ka) % n], coordinates[jb - (i + kb) % n])) return false; ++ } ++ return true; ++ } ++ ++ // Rings are rotated to a consistent, but arbitrary, start point. ++ // This is necessary to detect when a ring and a rotated copy are dupes. ++ function findMinimumOffset(arc) { ++ var start = arc[0], ++ end = arc[1], ++ mid = start, ++ minimum = mid, ++ minimumPoint = coordinates[mid]; ++ while (++mid < end) { ++ var point = coordinates[mid]; ++ if (point[0] < minimumPoint[0] || point[0] === minimumPoint[0] && point[1] < minimumPoint[1]) { ++ minimum = mid; ++ minimumPoint = point; ++ } ++ } ++ return minimum - start; ++ } ++ ++ return topology; ++} ++ ++// Given an array of arcs in absolute (but already quantized!) coordinates, ++// converts to fixed-point delta encoding. ++// This is a destructive operation that modifies the given arcs! ++function delta(arcs) { ++ var i = -1, ++ n = arcs.length; ++ ++ while (++i < n) { ++ var arc = arcs[i], ++ j = 0, ++ k = 1, ++ m = arc.length, ++ point = arc[0], ++ x0 = point[0], ++ y0 = point[1], ++ x1, ++ y1; ++ ++ while (++j < m) { ++ point = arc[j], x1 = point[0], y1 = point[1]; ++ if (x1 !== x0 || y1 !== y0) arc[k++] = [x1 - x0, y1 - y0], x0 = x1, y0 = y1; ++ } ++ ++ if (k === 1) arc[k++] = [0, 0]; // Each arc must be an array of two or more positions. ++ ++ arc.length = k; ++ } ++ ++ return arcs; ++} ++ ++// Extracts the lines and rings from the specified hash of geometry objects. ++// ++// Returns an object with three properties: ++// ++// * coordinates - shared buffer of [x, y] coordinates ++// * lines - lines extracted from the hash, of the form [start, end] ++// * rings - rings extracted from the hash, of the form [start, end] ++// ++// For each ring or line, start and end represent inclusive indexes into the ++// coordinates buffer. For rings (and closed lines), coordinates[start] equals ++// coordinates[end]. ++// ++// For each line or polygon geometry in the input hash, including nested ++// geometries as in geometry collections, the `coordinates` array is replaced ++// with an equivalent `arcs` array that, for each line (for line string ++// geometries) or ring (for polygon geometries), points to one of the above ++// lines or rings. ++function extract(objects) { ++ var index = -1, ++ lines = [], ++ rings = [], ++ coordinates = []; ++ ++ function extractGeometry(geometry) { ++ if (geometry && hasOwnProperty.call(extractGeometryType, geometry.type)) extractGeometryType[geometry.type](geometry); ++ } ++ ++ var extractGeometryType = { ++ GeometryCollection: function(o) { o.geometries.forEach(extractGeometry); }, ++ LineString: function(o) { o.arcs = extractLine(o.arcs); }, ++ MultiLineString: function(o) { o.arcs = o.arcs.map(extractLine); }, ++ Polygon: function(o) { o.arcs = o.arcs.map(extractRing); }, ++ MultiPolygon: function(o) { o.arcs = o.arcs.map(extractMultiRing); } ++ }; ++ ++ function extractLine(line) { ++ for (var i = 0, n = line.length; i < n; ++i) coordinates[++index] = line[i]; ++ var arc = {0: index - n + 1, 1: index}; ++ lines.push(arc); ++ return arc; ++ } ++ ++ function extractRing(ring) { ++ for (var i = 0, n = ring.length; i < n; ++i) coordinates[++index] = ring[i]; ++ var arc = {0: index - n + 1, 1: index}; ++ rings.push(arc); ++ return arc; ++ } ++ ++ function extractMultiRing(rings) { ++ return rings.map(extractRing); ++ } ++ ++ for (var key in objects) { ++ extractGeometry(objects[key]); ++ } ++ ++ return { ++ type: "Topology", ++ coordinates: coordinates, ++ lines: lines, ++ rings: rings, ++ objects: objects ++ }; ++} ++ ++// Given a hash of GeoJSON objects, returns a hash of GeoJSON geometry objects. ++// Any null input geometry objects are represented as {type: null} in the output. ++// Any feature.{id,properties,bbox} are transferred to the output geometry object. ++// Each output geometry object is a shallow copy of the input (e.g., properties, coordinates)! ++function geometry(inputs) { ++ var outputs = {}, key; ++ for (key in inputs) outputs[key] = geomifyObject(inputs[key]); ++ return outputs; ++} ++ ++function geomifyObject(input) { ++ return input == null ? {type: null} ++ : (input.type === "FeatureCollection" ? geomifyFeatureCollection ++ : input.type === "Feature" ? geomifyFeature ++ : geomifyGeometry)(input); ++} ++ ++function geomifyFeatureCollection(input) { ++ var output = {type: "GeometryCollection", geometries: input.features.map(geomifyFeature)}; ++ if (input.bbox != null) output.bbox = input.bbox; ++ return output; ++} ++ ++function geomifyFeature(input) { ++ var output = geomifyGeometry(input.geometry), key; // eslint-disable-line no-unused-vars ++ if (input.id != null) output.id = input.id; ++ if (input.bbox != null) output.bbox = input.bbox; ++ for (key in input.properties) { output.properties = input.properties; break; } ++ return output; ++} ++ ++function geomifyGeometry(input) { ++ if (input == null) return {type: null}; ++ var output = input.type === "GeometryCollection" ? {type: "GeometryCollection", geometries: input.geometries.map(geomifyGeometry)} ++ : input.type === "Point" || input.type === "MultiPoint" ? {type: input.type, coordinates: input.coordinates} ++ : {type: input.type, arcs: input.coordinates}; // TODO Check for unknown types? ++ if (input.bbox != null) output.bbox = input.bbox; ++ return output; ++} ++ ++function prequantize(objects, bbox, n) { ++ var x0 = bbox[0], ++ y0 = bbox[1], ++ x1 = bbox[2], ++ y1 = bbox[3], ++ kx = x1 - x0 ? (n - 1) / (x1 - x0) : 1, ++ ky = y1 - y0 ? (n - 1) / (y1 - y0) : 1; ++ ++ function quantizePoint(input) { ++ return [Math.round((input[0] - x0) * kx), Math.round((input[1] - y0) * ky)]; ++ } ++ ++ function quantizePoints(input, m) { ++ var i = -1, ++ j = 0, ++ n = input.length, ++ output = new Array(n), // pessimistic ++ pi, ++ px, ++ py, ++ x, ++ y; ++ ++ while (++i < n) { ++ pi = input[i]; ++ x = Math.round((pi[0] - x0) * kx); ++ y = Math.round((pi[1] - y0) * ky); ++ if (x !== px || y !== py) output[j++] = [px = x, py = y]; // non-coincident points ++ } ++ ++ output.length = j; ++ while (j < m) j = output.push([output[0][0], output[0][1]]); ++ return output; ++ } ++ ++ function quantizeLine(input) { ++ return quantizePoints(input, 2); ++ } ++ ++ function quantizeRing(input) { ++ return quantizePoints(input, 4); ++ } ++ ++ function quantizePolygon(input) { ++ return input.map(quantizeRing); ++ } ++ ++ function quantizeGeometry(o) { ++ if (o != null && hasOwnProperty.call(quantizeGeometryType, o.type)) quantizeGeometryType[o.type](o); ++ } ++ ++ var quantizeGeometryType = { ++ GeometryCollection: function(o) { o.geometries.forEach(quantizeGeometry); }, ++ Point: function(o) { o.coordinates = quantizePoint(o.coordinates); }, ++ MultiPoint: function(o) { o.coordinates = o.coordinates.map(quantizePoint); }, ++ LineString: function(o) { o.arcs = quantizeLine(o.arcs); }, ++ MultiLineString: function(o) { o.arcs = o.arcs.map(quantizeLine); }, ++ Polygon: function(o) { o.arcs = quantizePolygon(o.arcs); }, ++ MultiPolygon: function(o) { o.arcs = o.arcs.map(quantizePolygon); } ++ }; ++ ++ for (var key in objects) { ++ quantizeGeometry(objects[key]); ++ } ++ ++ return { ++ scale: [1 / kx, 1 / ky], ++ translate: [x0, y0] ++ }; ++} ++ ++// Constructs the TopoJSON Topology for the specified hash of features. ++// Each object in the specified hash must be a GeoJSON object, ++// meaning FeatureCollection, a Feature or a geometry object. ++function topology(objects, quantization) { ++ var bbox = bounds(objects = geometry(objects)), ++ transform = quantization > 0 && bbox && prequantize(objects, bbox, quantization), ++ topology = dedup(cut(extract(objects))), ++ coordinates = topology.coordinates, ++ indexByArc = hashmap(topology.arcs.length * 1.4, hashArc, equalArc); ++ ++ objects = topology.objects; // for garbage collection ++ topology.bbox = bbox; ++ topology.arcs = topology.arcs.map(function(arc, i) { ++ indexByArc.set(arc, i); ++ return coordinates.slice(arc[0], arc[1] + 1); ++ }); ++ ++ delete topology.coordinates; ++ coordinates = null; ++ ++ function indexGeometry(geometry) { ++ if (geometry && hasOwnProperty.call(indexGeometryType, geometry.type)) indexGeometryType[geometry.type](geometry); ++ } ++ ++ var indexGeometryType = { ++ GeometryCollection: function(o) { o.geometries.forEach(indexGeometry); }, ++ LineString: function(o) { o.arcs = indexArcs(o.arcs); }, ++ MultiLineString: function(o) { o.arcs = o.arcs.map(indexArcs); }, ++ Polygon: function(o) { o.arcs = o.arcs.map(indexArcs); }, ++ MultiPolygon: function(o) { o.arcs = o.arcs.map(indexMultiArcs); } ++ }; ++ ++ function indexArcs(arc) { ++ var indexes = []; ++ do { ++ var index = indexByArc.get(arc); ++ indexes.push(arc[0] < arc[1] ? index : ~index); ++ } while (arc = arc.next); ++ return indexes; ++ } ++ ++ function indexMultiArcs(arcs) { ++ return arcs.map(indexArcs); ++ } ++ ++ for (var key in objects) { ++ indexGeometry(objects[key]); ++ } ++ ++ if (transform) { ++ topology.transform = transform; ++ topology.arcs = delta(topology.arcs); ++ } ++ ++ return topology; ++} ++ ++function hashArc(arc) { ++ var i = arc[0], j = arc[1], t; ++ if (j < i) t = i, i = j, j = t; ++ return i + 31 * j; ++} ++ ++function equalArc(arcA, arcB) { ++ var ia = arcA[0], ja = arcA[1], ++ ib = arcB[0], jb = arcB[1], t; ++ if (ja < ia) t = ia, ia = ja, ja = t; ++ if (jb < ib) t = ib, ib = jb, jb = t; ++ return ia === ib && ja === jb; ++} ++ ++exports.topology = topology; ++ ++Object.defineProperty(exports, '__esModule', { value: true }); ++ ++})); ++ ++}, ++"vMvUl2GCcHlq150WIx8dO+j/kbxWVyyfipz6wBdpmRw=": ++function (require, module, exports, __dirname, __filename) { ++var dgram = require('dgram') ++var bencode = require('bencode') ++var isIP = require('net').isIP ++var dns = require('dns') ++var util = require('util') ++var events = require('events') ++ ++var ETIMEDOUT = new Error('Query timed out') ++ETIMEDOUT.code = 'ETIMEDOUT' ++ ++var EUNEXPECTEDNODE = new Error('Unexpected node id') ++EUNEXPECTEDNODE.code = 'EUNEXPECTEDNODE' ++ ++module.exports = RPC ++ ++function RPC (opts) { ++ if (!(this instanceof RPC)) return new RPC(opts) ++ if (!opts) opts = {} ++ ++ var self = this ++ ++ this.timeout = opts.timeout || 2000 ++ this.inflight = 0 ++ this.destroyed = false ++ this.isIP = opts.isIP || isIP ++ this.socket = opts.socket || dgram.createSocket('udp4') ++ this.socket.on('message', onmessage) ++ this.socket.on('error', onerror) ++ this.socket.on('listening', onlistening) ++ ++ this._tick = 0 ++ this._ids = [] ++ this._reqs = [] ++ this._timer = setInterval(check, Math.floor(this.timeout / 4)) ++ ++ events.EventEmitter.call(this) ++ ++ function check () { ++ var missing = self.inflight ++ if (!missing) return ++ for (var i = 0; i < self._reqs.length; i++) { ++ var req = self._reqs[i] ++ if (!req) continue ++ if (req.ttl) req.ttl-- ++ else self._cancel(i, ETIMEDOUT) ++ if (!--missing) return ++ } ++ } ++ ++ function onlistening () { ++ self.emit('listening') ++ } ++ ++ function onerror (err) { ++ if (err.code === 'EACCES' || err.code === 'EADDRINUSE') self.emit('error', err) ++ else self.emit('warning', err) ++ } ++ ++ function onmessage (buf, rinfo) { ++ if (self.destroyed) return ++ if (!rinfo.port) return // seems like a node bug that this is nessesary? ++ ++ try { ++ var message = bencode.decode(buf) ++ } catch (e) { ++ return self.emit('warning', e) ++ } ++ ++ var type = message && message.y && message.y.toString() ++ ++ if (type === 'r' || type === 'e') { ++ if (!Buffer.isBuffer(message.t)) return ++ ++ try { ++ var tid = message.t.readUInt16BE(0) ++ } catch (err) { ++ return self.emit('warning', err) ++ } ++ ++ var index = self._ids.indexOf(tid) ++ if (index === -1 || tid === 0) { ++ self.emit('response', message, rinfo) ++ self.emit('warning', new Error('Unexpected transaction id: ' + tid)) ++ return ++ } ++ ++ var req = self._reqs[index] ++ if (req.peer.host !== rinfo.address) { ++ self.emit('response', message, rinfo) ++ self.emit('warning', new Error('Out of order response')) ++ return ++ } ++ ++ self._ids[index] = 0 ++ self._reqs[index] = null ++ self.inflight-- ++ ++ if (type === 'e') { ++ var isArray = Array.isArray(message.e) ++ var err = new Error(isArray ? message.e.join(' ') : 'Unknown error') ++ err.code = isArray && message.e.length && typeof message.e[0] === 'number' ? message.e[0] : 0 ++ req.callback(err, message, rinfo, req.message) ++ self.emit('update') ++ self.emit('postupdate') ++ return ++ } ++ ++ var rid = message.r && message.r.id ++ if (req.peer && req.peer.id && rid && !req.peer.id.equals(rid)) { ++ req.callback(EUNEXPECTEDNODE, null, rinfo) ++ self.emit('update') ++ self.emit('postupdate') ++ return ++ } ++ ++ req.callback(null, message, rinfo, req.message) ++ self.emit('update') ++ self.emit('postupdate') ++ self.emit('response', message, rinfo) ++ } else if (type === 'q') { ++ self.emit('query', message, rinfo) ++ } else { ++ self.emit('warning', new Error('Unknown type: ' + type)) ++ } ++ } ++} ++ ++util.inherits(RPC, events.EventEmitter) ++ ++RPC.prototype.address = function () { ++ return this.socket.address() ++} ++ ++RPC.prototype.response = function (peer, req, res, cb) { ++ this.send(peer, { t: req.t, y: 'r', r: res }, cb) ++} ++ ++RPC.prototype.error = function (peer, req, error, cb) { ++ this.send(peer, { t: req.t, y: 'e', e: [].concat(error.message || error) }, cb) ++} ++ ++RPC.prototype.send = function (peer, message, cb) { ++ var buf = bencode.encode(message) ++ this.socket.send(buf, 0, buf.length, peer.port, peer.address || peer.host, cb || noop) ++} ++ ++// bind([port], [address], [callback]) ++RPC.prototype.bind = function () { ++ this.socket.bind.apply(this.socket, arguments) ++} ++ ++RPC.prototype.destroy = function (cb) { ++ this.destroyed = true ++ clearInterval(this._timer) ++ if (cb) this.socket.on('close', cb) ++ for (var i = 0; i < this._ids.length; i++) this._cancel(i) ++ this.socket.close() ++} ++ ++RPC.prototype.query = function (peer, query, cb) { ++ if (!cb) cb = noop ++ if (!this.isIP(peer.host)) return this._resolveAndQuery(peer, query, cb) ++ ++ var message = { ++ t: Buffer.allocUnsafe(2), ++ y: 'q', ++ q: query.q, ++ a: query.a ++ } ++ ++ var req = { ++ ttl: 4, ++ peer: peer, ++ message: message, ++ callback: cb ++ } ++ ++ if (this._tick === 65535) this._tick = 0 ++ var tid = ++this._tick ++ ++ var free = this._ids.indexOf(0) ++ if (free === -1) free = this._ids.push(0) - 1 ++ this._ids[free] = tid ++ while (this._reqs.length < free) this._reqs.push(null) ++ this._reqs[free] = req ++ ++ this.inflight++ ++ message.t.writeUInt16BE(tid, 0) ++ this.send(peer, message) ++ return tid ++} ++ ++RPC.prototype.cancel = function (tid, err) { ++ var index = this._ids.indexOf(tid) ++ if (index > -1) this._cancel(index, err) ++} ++ ++RPC.prototype._cancel = function (index, err) { ++ var req = this._reqs[index] ++ this._ids[index] = 0 ++ this._reqs[index] = null ++ if (req) { ++ this.inflight-- ++ req.callback(err || new Error('Query was cancelled'), null, req.peer) ++ this.emit('update') ++ this.emit('postupdate') ++ } ++} ++ ++RPC.prototype._resolveAndQuery = function (peer, query, cb) { ++ var self = this ++ ++ dns.lookup(peer.host, function (err, ip) { ++ if (err) return cb(err) ++ if (self.destroyed) return cb(new Error('k-rpc-socket is destroyed')) ++ self.query({ host: ip, port: peer.port }, query, cb) ++ }) ++} ++ ++function noop () {} ++ ++}, ++"vQE+osHigJqVHWyVubkwkYDV9fvcnBlS1F4mQ+JKlVs=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { ++ if (k2 === undefined) k2 = k; ++ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); ++}) : (function(o, m, k, k2) { ++ if (k2 === undefined) k2 = k; ++ o[k2] = m[k]; ++})); ++var __exportStar = (this && this.__exportStar) || function(m, exports) { ++ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); ++}; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const url_1 = require("url"); ++const create_1 = require("./create"); ++const defaults = { ++ options: { ++ method: 'GET', ++ retry: { ++ limit: 2, ++ methods: [ ++ 'GET', ++ 'PUT', ++ 'HEAD', ++ 'DELETE', ++ 'OPTIONS', ++ 'TRACE' ++ ], ++ statusCodes: [ ++ 408, ++ 413, ++ 429, ++ 500, ++ 502, ++ 503, ++ 504, ++ 521, ++ 522, ++ 524 ++ ], ++ errorCodes: [ ++ 'ETIMEDOUT', ++ 'ECONNRESET', ++ 'EADDRINUSE', ++ 'ECONNREFUSED', ++ 'EPIPE', ++ 'ENOTFOUND', ++ 'ENETUNREACH', ++ 'EAI_AGAIN' ++ ], ++ maxRetryAfter: undefined, ++ calculateDelay: ({ computedValue }) => computedValue ++ }, ++ timeout: {}, ++ headers: { ++ 'user-agent': 'got (https://github.com/sindresorhus/got)' ++ }, ++ hooks: { ++ init: [], ++ beforeRequest: [], ++ beforeRedirect: [], ++ beforeRetry: [], ++ beforeError: [], ++ afterResponse: [] ++ }, ++ cache: undefined, ++ dnsCache: undefined, ++ decompress: true, ++ throwHttpErrors: true, ++ followRedirect: true, ++ isStream: false, ++ responseType: 'text', ++ resolveBodyOnly: false, ++ maxRedirects: 10, ++ prefixUrl: '', ++ methodRewriting: true, ++ ignoreInvalidCookies: false, ++ context: {}, ++ // TODO: Set this to `true` when Got 12 gets released ++ http2: false, ++ allowGetBody: false, ++ https: undefined, ++ pagination: { ++ transform: (response) => { ++ if (response.request.options.responseType === 'json') { ++ return response.body; ++ } ++ return JSON.parse(response.body); ++ }, ++ paginate: response => { ++ if (!Reflect.has(response.headers, 'link')) { ++ return false; ++ } ++ const items = response.headers.link.split(','); ++ let next; ++ for (const item of items) { ++ const parsed = item.split(';'); ++ if (parsed[1].includes('next')) { ++ next = parsed[0].trimStart().trim(); ++ next = next.slice(1, -1); ++ break; ++ } ++ } ++ if (next) { ++ const options = { ++ url: new url_1.URL(next) ++ }; ++ return options; ++ } ++ return false; ++ }, ++ filter: () => true, ++ shouldContinue: () => true, ++ countLimit: Infinity, ++ backoff: 0, ++ requestLimit: 10000, ++ stackAllItems: true ++ }, ++ parseJson: (text) => JSON.parse(text), ++ stringifyJson: (object) => JSON.stringify(object), ++ cacheOptions: {} ++ }, ++ handlers: [create_1.defaultHandler], ++ mutableDefaults: false ++}; ++const got = create_1.default(defaults); ++exports.default = got; ++// For CommonJS default export support ++module.exports = got; ++module.exports.default = got; ++module.exports.__esModule = true; // Workaround for TS issue: https://github.com/sindresorhus/got/pull/1267 ++__exportStar(require("./create"), exports); ++__exportStar(require("./as-promise"), exports); ++ ++}, ++"vbdI62o94a9x5thTSnOwtqgzR/r+J89nsb8aKGRU/zw=": ++function (require, module, exports, __dirname, __filename) { ++const util = require('util') ++const AbstractChainedBatch = require('abstract-leveldown').AbstractChainedBatch ++const binding = require('./binding') ++ ++function ChainedBatch (db) { ++ AbstractChainedBatch.call(this, db) ++ this.context = binding.batch_init(db.context) ++} ++ ++ChainedBatch.prototype._put = function (key, value) { ++ binding.batch_put(this.context, key, value) ++} ++ ++ChainedBatch.prototype._del = function (key) { ++ binding.batch_del(this.context, key) ++} ++ ++ChainedBatch.prototype._clear = function () { ++ binding.batch_clear(this.context) ++} ++ ++ChainedBatch.prototype._write = function (options, callback) { ++ binding.batch_write(this.context, options, callback) ++} ++ ++util.inherits(ChainedBatch, AbstractChainedBatch) ++ ++module.exports = ChainedBatch ++ ++}, ++"vfbFX/IxQxrXQwdZm/Tjzz6vfYOsdJ8jSDDoO57ShaU=": ++function (require, module, exports, __dirname, __filename) { ++var Readable = require('stream').Readable ++ ++function fromString (str) { ++ var data = new Readable() ++ data._read = function (size) { ++ if (str.length <= 0) return this.push(null) ++ var push = str.slice(0, size) ++ if (this.push(push)) str = str.slice(size) ++ } ++ return data ++} ++ ++function fromBuffer (buf) { ++ var data = new Readable() ++ data._read = function (size) { ++ if (buf.length <= 0) return this.push(null) ++ var push = buf.slice(0, size) ++ if (this.push(push)) buf = buf.slice(size) ++ } ++ return data ++} ++ ++module.exports = { ++ fromString: fromString, ++ fromBuffer: fromBuffer ++} ++ ++}, ++"vw2FitHggz8pcRdBfiiTapLSaKzcfIedwVuab+Q3fr0=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++// EXPORTS // ++ ++module.exports = require( './copy.js' ); ++ ++}, ++"vwMevFPNV2f6MqVJ4w0GKzDf1e6gsSK2T4aOaFVgJks=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++class WeakableMap { ++ constructor() { ++ this.weakMap = new WeakMap(); ++ this.map = new Map(); ++ } ++ set(key, value) { ++ if (typeof key === 'object') { ++ this.weakMap.set(key, value); ++ } ++ else { ++ this.map.set(key, value); ++ } ++ } ++ get(key) { ++ if (typeof key === 'object') { ++ return this.weakMap.get(key); ++ } ++ return this.map.get(key); ++ } ++ has(key) { ++ if (typeof key === 'object') { ++ return this.weakMap.has(key); ++ } ++ return this.map.has(key); ++ } ++} ++exports.default = WeakableMap; ++ ++}, ++"vwPewjageNJiz8CU6BcT2wNKVMv3ZOvwnUwDLF54I9A=": ++function (require, module, exports, __dirname, __filename) { ++'use strict' ++ ++const FindMyWay = require('find-my-way') ++ ++const Reply = require('./reply') ++const Request = require('./request') ++const Context = require('./context') ++const { ++ kRoutePrefix, ++ kCanSetNotFoundHandler, ++ kFourOhFourLevelInstance, ++ kReply, ++ kRequest, ++ kContentTypeParser, ++ kBodyLimit, ++ kLogLevel, ++ kFourOhFourContext, ++ kHooks, ++ kErrorHandler ++} = require('./symbols.js') ++const { lifecycleHooks } = require('./hooks') ++const fourOhFourContext = { ++ config: { ++ }, ++ onSend: [], ++ onError: [] ++} ++ ++/** ++ * Each fastify instance have a: ++ * kFourOhFourLevelInstance: point to a fastify instance that has the 404 handler setted ++ * kCanSetNotFoundHandler: bool to track if the 404 handler has already been set ++ * kFourOhFour: the singleton instance of this 404 module ++ * kFourOhFourContext: the context in the reply object where the handler will be executed ++ */ ++function fourOhFour (options) { ++ const { logger, genReqId } = options ++ ++ // 404 router, used for handling encapsulated 404 handlers ++ const router = FindMyWay({ defaultRoute: fourOhFourFallBack }) ++ ++ return { router, setNotFoundHandler, setContext, arrange404 } ++ ++ function arrange404 (instance) { ++ // Change the pointer of the fastify instance to itself, so register + prefix can add new 404 handler ++ instance[kFourOhFourLevelInstance] = instance ++ instance[kCanSetNotFoundHandler] = true ++ } ++ ++ function basic404 (request, reply) { ++ const { url, method } = request.raw ++ const message = `Route ${method}:${url} not found` ++ request.log.info(message) ++ reply.code(404).send({ ++ message, ++ error: 'Not Found', ++ statusCode: 404 ++ }) ++ } ++ ++ function setContext (instance, context) { ++ const _404Context = Object.assign({}, instance[kFourOhFourContext]) ++ _404Context.onSend = context.onSend ++ context[kFourOhFourContext] = _404Context ++ } ++ ++ function setNotFoundHandler (opts, handler, avvio, routeHandler) { ++ // First initialization of the fastify root instance ++ if (this[kCanSetNotFoundHandler] === undefined) { ++ this[kCanSetNotFoundHandler] = true ++ } ++ if (this[kFourOhFourContext] === undefined) { ++ this[kFourOhFourContext] = null ++ } ++ ++ const _fastify = this ++ const prefix = this[kRoutePrefix] || '/' ++ ++ if (this[kCanSetNotFoundHandler] === false) { ++ throw new Error(`Not found handler already set for Fastify instance with prefix: '${prefix}'`) ++ } ++ ++ if (typeof opts === 'object') { ++ if (opts.preHandler) { ++ if (Array.isArray(opts.preHandler)) { ++ opts.preHandler = opts.preHandler.map(hook => hook.bind(_fastify)) ++ } else { ++ opts.preHandler = opts.preHandler.bind(_fastify) ++ } ++ } ++ ++ if (opts.preValidation) { ++ if (Array.isArray(opts.preValidation)) { ++ opts.preValidation = opts.preValidation.map(hook => hook.bind(_fastify)) ++ } else { ++ opts.preValidation = opts.preValidation.bind(_fastify) ++ } ++ } ++ } ++ ++ if (typeof opts === 'function') { ++ handler = opts ++ opts = undefined ++ } ++ opts = opts || {} ++ ++ if (handler) { ++ this[kFourOhFourLevelInstance][kCanSetNotFoundHandler] = false ++ handler = handler.bind(this) ++ } else { ++ handler = basic404 ++ } ++ ++ this.after((notHandledErr, done) => { ++ _setNotFoundHandler.call(this, prefix, opts, handler, avvio, routeHandler) ++ done(notHandledErr) ++ }) ++ } ++ ++ function _setNotFoundHandler (prefix, opts, handler, avvio, routeHandler) { ++ const context = new Context( ++ opts.schema, ++ handler, ++ this[kReply], ++ this[kRequest], ++ this[kContentTypeParser], ++ opts.config || {}, ++ this[kErrorHandler], ++ this[kBodyLimit], ++ this[kLogLevel] ++ ) ++ ++ avvio.once('preReady', () => { ++ const context = this[kFourOhFourContext] ++ for (const hook of lifecycleHooks) { ++ const toSet = this[kHooks][hook] ++ .concat(opts[hook] || []) ++ .map(h => h.bind(this)) ++ context[hook] = toSet.length ? toSet : null ++ } ++ }) ++ ++ if (this[kFourOhFourContext] !== null && prefix === '/') { ++ Object.assign(this[kFourOhFourContext], context) // Replace the default 404 handler ++ return ++ } ++ ++ this[kFourOhFourLevelInstance][kFourOhFourContext] = context ++ ++ router.all(prefix + (prefix.endsWith('/') ? '*' : '/*'), routeHandler, context) ++ router.all(prefix, routeHandler, context) ++ } ++ ++ function fourOhFourFallBack (req, res) { ++ // if this happen, we have a very bad bug ++ // we might want to do some hard debugging ++ // here, let's print out as much info as ++ // we can ++ const id = genReqId(req) ++ const childLogger = logger.child({ reqId: id }) ++ ++ childLogger.info({ req }, 'incoming request') ++ ++ const request = new Request(id, null, req, null, childLogger, fourOhFourContext) ++ const reply = new Reply(res, request, childLogger) ++ ++ request.log.warn('the default handler for 404 did not catch this, this is likely a fastify bug, please report it') ++ request.log.warn(router.prettyPrint()) ++ reply.code(404).send(new Error('Not Found')) ++ } ++} ++ ++module.exports = fourOhFour ++ ++}, ++"w+yTwoRdPBilTObVR0DQqmiTQu3TSAr9KyUMv5A45PQ=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++module.exports = { ++ 2: 'need dictionary', /* Z_NEED_DICT 2 */ ++ 1: 'stream end', /* Z_STREAM_END 1 */ ++ 0: '', /* Z_OK 0 */ ++ '-1': 'file error', /* Z_ERRNO (-1) */ ++ '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ ++ '-3': 'data error', /* Z_DATA_ERROR (-3) */ ++ '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ ++ '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ ++ '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ ++}; ++ ++}, ++"w1oqbztfx7eMyI2R3JaRHM6LbBmRzAELr+yv7fer9hw=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * object.pick ++ * ++ * Copyright (c) 2014-2015 Jon Schlinkert, contributors. ++ * Licensed under the MIT License ++ */ ++ ++'use strict'; ++ ++var isObject = require('isobject'); ++ ++module.exports = function pick(obj, keys) { ++ if (!isObject(obj) && typeof obj !== 'function') { ++ return {}; ++ } ++ ++ var res = {}; ++ if (typeof keys === 'string') { ++ if (keys in obj) { ++ res[keys] = obj[keys]; ++ } ++ return res; ++ } ++ ++ var len = keys.length; ++ var idx = -1; ++ ++ while (++idx < len) { ++ var key = keys[idx]; ++ if (key in obj) { ++ res[key] = obj[key]; ++ } ++ } ++ return res; ++}; ++ ++}, ++"w3TpuoEbfPzO062zkw92oG91Sw9Fkuto1bf3gP3WK3M=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++exports.STORE = { ++ magic: "\x00\x00", ++ compress: function(content, compressionOptions) { ++ return content; // no compression ++ }, ++ uncompress: function(content) { ++ return content; // no compression ++ }, ++ compressInputType: null, ++ uncompressInputType: null ++}; ++exports.DEFLATE = require('./flate'); ++ ++}, ++"w5+qRzW62ls4RguIOMlaOUnoyOaoGQExr5JFHcDDZ5o=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * Tmp ++ * ++ * Copyright (c) 2011-2017 KARASZI Istvan ++ * ++ * MIT Licensed ++ */ ++ ++/* ++ * Module dependencies. ++ */ ++const fs = require('fs'); ++const os = require('os'); ++const path = require('path'); ++const crypto = require('crypto'); ++const _c = fs.constants && os.constants ? ++ { fs: fs.constants, os: os.constants } : ++ process.binding('constants'); ++const rimraf = require('rimraf'); ++ ++/* ++ * The working inner variables. ++ */ ++const ++ // the random characters to choose from ++ RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', ++ ++ TEMPLATE_PATTERN = /XXXXXX/, ++ ++ DEFAULT_TRIES = 3, ++ ++ CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR), ++ ++ EBADF = _c.EBADF || _c.os.errno.EBADF, ++ ENOENT = _c.ENOENT || _c.os.errno.ENOENT, ++ ++ DIR_MODE = 448 /* 0o700 */, ++ FILE_MODE = 384 /* 0o600 */, ++ ++ EXIT = 'exit', ++ ++ SIGINT = 'SIGINT', ++ ++ // this will hold the objects need to be removed on exit ++ _removeObjects = []; ++ ++var ++ _gracefulCleanup = false; ++ ++/** ++ * Random name generator based on crypto. ++ * Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript ++ * ++ * @param {number} howMany ++ * @returns {string} the generated random name ++ * @private ++ */ ++function _randomChars(howMany) { ++ var ++ value = [], ++ rnd = null; ++ ++ // make sure that we do not fail because we ran out of entropy ++ try { ++ rnd = crypto.randomBytes(howMany); ++ } catch (e) { ++ rnd = crypto.pseudoRandomBytes(howMany); ++ } ++ ++ for (var i = 0; i < howMany; i++) { ++ value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]); ++ } ++ ++ return value.join(''); ++} ++ ++/** ++ * Checks whether the `obj` parameter is defined or not. ++ * ++ * @param {Object} obj ++ * @returns {boolean} true if the object is undefined ++ * @private ++ */ ++function _isUndefined(obj) { ++ return typeof obj === 'undefined'; ++} ++ ++/** ++ * Parses the function arguments. ++ * ++ * This function helps to have optional arguments. ++ * ++ * @param {(Options|Function)} options ++ * @param {Function} callback ++ * @returns {Array} parsed arguments ++ * @private ++ */ ++function _parseArguments(options, callback) { ++ /* istanbul ignore else */ ++ if (typeof options === 'function') { ++ return [{}, options]; ++ } ++ ++ /* istanbul ignore else */ ++ if (_isUndefined(options)) { ++ return [{}, callback]; ++ } ++ ++ return [options, callback]; ++} ++ ++/** ++ * Generates a new temporary name. ++ * ++ * @param {Object} opts ++ * @returns {string} the new random name according to opts ++ * @private ++ */ ++function _generateTmpName(opts) { ++ ++ const tmpDir = _getTmpDir(); ++ ++ // fail early on missing tmp dir ++ if (isBlank(opts.dir) && isBlank(tmpDir)) { ++ throw new Error('No tmp dir specified'); ++ } ++ ++ /* istanbul ignore else */ ++ if (!isBlank(opts.name)) { ++ return path.join(opts.dir || tmpDir, opts.name); ++ } ++ ++ // mkstemps like template ++ // opts.template has already been guarded in tmpName() below ++ /* istanbul ignore else */ ++ if (opts.template) { ++ var template = opts.template; ++ // make sure that we prepend the tmp path if none was given ++ /* istanbul ignore else */ ++ if (path.basename(template) === template) ++ template = path.join(opts.dir || tmpDir, template); ++ return template.replace(TEMPLATE_PATTERN, _randomChars(6)); ++ } ++ ++ // prefix and postfix ++ const name = [ ++ (isBlank(opts.prefix) ? 'tmp-' : opts.prefix), ++ process.pid, ++ _randomChars(12), ++ (opts.postfix ? opts.postfix : '') ++ ].join(''); ++ ++ return path.join(opts.dir || tmpDir, name); ++} ++ ++/** ++ * Gets a temporary file name. ++ * ++ * @param {(Options|tmpNameCallback)} options options or callback ++ * @param {?tmpNameCallback} callback the callback function ++ */ ++function tmpName(options, callback) { ++ var ++ args = _parseArguments(options, callback), ++ opts = args[0], ++ cb = args[1], ++ tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES; ++ ++ /* istanbul ignore else */ ++ if (isNaN(tries) || tries < 0) ++ return cb(new Error('Invalid tries')); ++ ++ /* istanbul ignore else */ ++ if (opts.template && !opts.template.match(TEMPLATE_PATTERN)) ++ return cb(new Error('Invalid template provided')); ++ ++ (function _getUniqueName() { ++ try { ++ const name = _generateTmpName(opts); ++ ++ // check whether the path exists then retry if needed ++ fs.stat(name, function (err) { ++ /* istanbul ignore else */ ++ if (!err) { ++ /* istanbul ignore else */ ++ if (tries-- > 0) return _getUniqueName(); ++ ++ return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name)); ++ } ++ ++ cb(null, name); ++ }); ++ } catch (err) { ++ cb(err); ++ } ++ }()); ++} ++ ++/** ++ * Synchronous version of tmpName. ++ * ++ * @param {Object} options ++ * @returns {string} the generated random name ++ * @throws {Error} if the options are invalid or could not generate a filename ++ */ ++function tmpNameSync(options) { ++ var ++ args = _parseArguments(options), ++ opts = args[0], ++ tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES; ++ ++ /* istanbul ignore else */ ++ if (isNaN(tries) || tries < 0) ++ throw new Error('Invalid tries'); ++ ++ /* istanbul ignore else */ ++ if (opts.template && !opts.template.match(TEMPLATE_PATTERN)) ++ throw new Error('Invalid template provided'); ++ ++ do { ++ const name = _generateTmpName(opts); ++ try { ++ fs.statSync(name); ++ } catch (e) { ++ return name; ++ } ++ } while (tries-- > 0); ++ ++ throw new Error('Could not get a unique tmp filename, max tries reached'); ++} ++ ++/** ++ * Creates and opens a temporary file. ++ * ++ * @param {(Options|fileCallback)} options the config options or the callback function ++ * @param {?fileCallback} callback ++ */ ++function file(options, callback) { ++ var ++ args = _parseArguments(options, callback), ++ opts = args[0], ++ cb = args[1]; ++ ++ // gets a temporary filename ++ tmpName(opts, function _tmpNameCreated(err, name) { ++ /* istanbul ignore else */ ++ if (err) return cb(err); ++ ++ // create and open the file ++ fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) { ++ /* istanbul ignore else */ ++ if (err) return cb(err); ++ ++ if (opts.discardDescriptor) { ++ return fs.close(fd, function _discardCallback(err) { ++ /* istanbul ignore else */ ++ if (err) { ++ // Low probability, and the file exists, so this could be ++ // ignored. If it isn't we certainly need to unlink the ++ // file, and if that fails too its error is more ++ // important. ++ try { ++ fs.unlinkSync(name); ++ } catch (e) { ++ if (!isENOENT(e)) { ++ err = e; ++ } ++ } ++ return cb(err); ++ } ++ cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts)); ++ }); ++ } ++ /* istanbul ignore else */ ++ if (opts.detachDescriptor) { ++ return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts)); ++ } ++ cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts)); ++ }); ++ }); ++} ++ ++/** ++ * Synchronous version of file. ++ * ++ * @param {Options} options ++ * @returns {FileSyncObject} object consists of name, fd and removeCallback ++ * @throws {Error} if cannot create a file ++ */ ++function fileSync(options) { ++ var ++ args = _parseArguments(options), ++ opts = args[0]; ++ ++ const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor; ++ const name = tmpNameSync(opts); ++ var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE); ++ /* istanbul ignore else */ ++ if (opts.discardDescriptor) { ++ fs.closeSync(fd); ++ fd = undefined; ++ } ++ ++ return { ++ name: name, ++ fd: fd, ++ removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts) ++ }; ++} ++ ++/** ++ * Creates a temporary directory. ++ * ++ * @param {(Options|dirCallback)} options the options or the callback function ++ * @param {?dirCallback} callback ++ */ ++function dir(options, callback) { ++ var ++ args = _parseArguments(options, callback), ++ opts = args[0], ++ cb = args[1]; ++ ++ // gets a temporary filename ++ tmpName(opts, function _tmpNameCreated(err, name) { ++ /* istanbul ignore else */ ++ if (err) return cb(err); ++ ++ // create the directory ++ fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) { ++ /* istanbul ignore else */ ++ if (err) return cb(err); ++ ++ cb(null, name, _prepareTmpDirRemoveCallback(name, opts)); ++ }); ++ }); ++} ++ ++/** ++ * Synchronous version of dir. ++ * ++ * @param {Options} options ++ * @returns {DirSyncObject} object consists of name and removeCallback ++ * @throws {Error} if it cannot create a directory ++ */ ++function dirSync(options) { ++ var ++ args = _parseArguments(options), ++ opts = args[0]; ++ ++ const name = tmpNameSync(opts); ++ fs.mkdirSync(name, opts.mode || DIR_MODE); ++ ++ return { ++ name: name, ++ removeCallback: _prepareTmpDirRemoveCallback(name, opts) ++ }; ++} ++ ++/** ++ * Removes files asynchronously. ++ * ++ * @param {Object} fdPath ++ * @param {Function} next ++ * @private ++ */ ++function _removeFileAsync(fdPath, next) { ++ const _handler = function (err) { ++ if (err && !isENOENT(err)) { ++ // reraise any unanticipated error ++ return next(err); ++ } ++ next(); ++ } ++ ++ if (0 <= fdPath[0]) ++ fs.close(fdPath[0], function (err) { ++ fs.unlink(fdPath[1], _handler); ++ }); ++ else fs.unlink(fdPath[1], _handler); ++} ++ ++/** ++ * Removes files synchronously. ++ * ++ * @param {Object} fdPath ++ * @private ++ */ ++function _removeFileSync(fdPath) { ++ try { ++ if (0 <= fdPath[0]) fs.closeSync(fdPath[0]); ++ } catch (e) { ++ // reraise any unanticipated error ++ if (!isEBADF(e) && !isENOENT(e)) throw e; ++ } finally { ++ try { ++ fs.unlinkSync(fdPath[1]); ++ } ++ catch (e) { ++ // reraise any unanticipated error ++ if (!isENOENT(e)) throw e; ++ } ++ } ++} ++ ++/** ++ * Prepares the callback for removal of the temporary file. ++ * ++ * @param {string} name the path of the file ++ * @param {number} fd file descriptor ++ * @param {Object} opts ++ * @returns {fileCallback} ++ * @private ++ */ ++function _prepareTmpFileRemoveCallback(name, fd, opts) { ++ const removeCallbackSync = _prepareRemoveCallback(_removeFileSync, [fd, name]); ++ const removeCallback = _prepareRemoveCallback(_removeFileAsync, [fd, name], removeCallbackSync); ++ ++ if (!opts.keep) _removeObjects.unshift(removeCallbackSync); ++ ++ return removeCallback; ++} ++ ++/** ++ * Simple wrapper for rimraf. ++ * ++ * @param {string} dirPath ++ * @param {Function} next ++ * @private ++ */ ++function _rimrafRemoveDirWrapper(dirPath, next) { ++ rimraf(dirPath, next); ++} ++ ++/** ++ * Simple wrapper for rimraf.sync. ++ * ++ * @param {string} dirPath ++ * @private ++ */ ++function _rimrafRemoveDirSyncWrapper(dirPath, next) { ++ try { ++ return next(null, rimraf.sync(dirPath)); ++ } catch (err) { ++ return next(err); ++ } ++} ++ ++/** ++ * Prepares the callback for removal of the temporary directory. ++ * ++ * @param {string} name ++ * @param {Object} opts ++ * @returns {Function} the callback ++ * @private ++ */ ++function _prepareTmpDirRemoveCallback(name, opts) { ++ const removeFunction = opts.unsafeCleanup ? _rimrafRemoveDirWrapper : fs.rmdir.bind(fs); ++ const removeFunctionSync = opts.unsafeCleanup ? _rimrafRemoveDirSyncWrapper : fs.rmdirSync.bind(fs); ++ const removeCallbackSync = _prepareRemoveCallback(removeFunctionSync, name); ++ const removeCallback = _prepareRemoveCallback(removeFunction, name, removeCallbackSync); ++ if (!opts.keep) _removeObjects.unshift(removeCallbackSync); ++ ++ return removeCallback; ++} ++ ++/** ++ * Creates a guarded function wrapping the removeFunction call. ++ * ++ * @param {Function} removeFunction ++ * @param {Object} arg ++ * @returns {Function} ++ * @private ++ */ ++function _prepareRemoveCallback(removeFunction, arg, cleanupCallbackSync) { ++ var called = false; ++ ++ return function _cleanupCallback(next) { ++ next = next || function () {}; ++ if (!called) { ++ const toRemove = cleanupCallbackSync || _cleanupCallback; ++ const index = _removeObjects.indexOf(toRemove); ++ /* istanbul ignore else */ ++ if (index >= 0) _removeObjects.splice(index, 1); ++ ++ called = true; ++ // sync? ++ if (removeFunction.length === 1) { ++ try { ++ removeFunction(arg); ++ return next(null); ++ } ++ catch (err) { ++ // if no next is provided and since we are ++ // in silent cleanup mode on process exit, ++ // we will ignore the error ++ return next(err); ++ } ++ } else return removeFunction(arg, next); ++ } else return next(new Error('cleanup callback has already been called')); ++ }; ++} ++ ++/** ++ * The garbage collector. ++ * ++ * @private ++ */ ++function _garbageCollector() { ++ /* istanbul ignore else */ ++ if (!_gracefulCleanup) return; ++ ++ // the function being called removes itself from _removeObjects, ++ // loop until _removeObjects is empty ++ while (_removeObjects.length) { ++ try { ++ _removeObjects[0](); ++ } catch (e) { ++ // already removed? ++ } ++ } ++} ++ ++/** ++ * Helper for testing against EBADF to compensate changes made to Node 7.x under Windows. ++ */ ++function isEBADF(error) { ++ return isExpectedError(error, -EBADF, 'EBADF'); ++} ++ ++/** ++ * Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows. ++ */ ++function isENOENT(error) { ++ return isExpectedError(error, -ENOENT, 'ENOENT'); ++} ++ ++/** ++ * Helper to determine whether the expected error code matches the actual code and errno, ++ * which will differ between the supported node versions. ++ * ++ * - Node >= 7.0: ++ * error.code {string} ++ * error.errno {string|number} any numerical value will be negated ++ * ++ * - Node >= 6.0 < 7.0: ++ * error.code {string} ++ * error.errno {number} negated ++ * ++ * - Node >= 4.0 < 6.0: introduces SystemError ++ * error.code {string} ++ * error.errno {number} negated ++ * ++ * - Node >= 0.10 < 4.0: ++ * error.code {number} negated ++ * error.errno n/a ++ */ ++function isExpectedError(error, code, errno) { ++ return error.code === code || error.code === errno; ++} ++ ++/** ++ * Helper which determines whether a string s is blank, that is undefined, or empty or null. ++ * ++ * @private ++ * @param {string} s ++ * @returns {Boolean} true whether the string s is blank, false otherwise ++ */ ++function isBlank(s) { ++ return s === null || s === undefined || !s.trim(); ++} ++ ++/** ++ * Sets the graceful cleanup. ++ */ ++function setGracefulCleanup() { ++ _gracefulCleanup = true; ++} ++ ++/** ++ * Returns the currently configured tmp dir from os.tmpdir(). ++ * ++ * @private ++ * @returns {string} the currently configured tmp dir ++ */ ++function _getTmpDir() { ++ return os.tmpdir(); ++} ++ ++/** ++ * If there are multiple different versions of tmp in place, make sure that ++ * we recognize the old listeners. ++ * ++ * @param {Function} listener ++ * @private ++ * @returns {Boolean} true whether listener is a legacy listener ++ */ ++function _is_legacy_listener(listener) { ++ return (listener.name === '_exit' || listener.name === '_uncaughtExceptionThrown') ++ && listener.toString().indexOf('_garbageCollector();') > -1; ++} ++ ++/** ++ * Safely install SIGINT listener. ++ * ++ * NOTE: this will only work on OSX and Linux. ++ * ++ * @private ++ */ ++function _safely_install_sigint_listener() { ++ ++ const listeners = process.listeners(SIGINT); ++ const existingListeners = []; ++ for (let i = 0, length = listeners.length; i < length; i++) { ++ const lstnr = listeners[i]; ++ /* istanbul ignore else */ ++ if (lstnr.name === '_tmp$sigint_listener') { ++ existingListeners.push(lstnr); ++ process.removeListener(SIGINT, lstnr); ++ } ++ } ++ process.on(SIGINT, function _tmp$sigint_listener(doExit) { ++ for (let i = 0, length = existingListeners.length; i < length; i++) { ++ // let the existing listener do the garbage collection (e.g. jest sandbox) ++ try { ++ existingListeners[i](false); ++ } catch (err) { ++ // ignore ++ } ++ } ++ try { ++ // force the garbage collector even it is called again in the exit listener ++ _garbageCollector(); ++ } finally { ++ if (!!doExit) { ++ process.exit(0); ++ } ++ } ++ }); ++} ++ ++/** ++ * Safely install process exit listener. ++ * ++ * @private ++ */ ++function _safely_install_exit_listener() { ++ const listeners = process.listeners(EXIT); ++ ++ // collect any existing listeners ++ const existingListeners = []; ++ for (let i = 0, length = listeners.length; i < length; i++) { ++ const lstnr = listeners[i]; ++ /* istanbul ignore else */ ++ // TODO: remove support for legacy listeners once release 1.0.0 is out ++ if (lstnr.name === '_tmp$safe_listener' || _is_legacy_listener(lstnr)) { ++ // we must forget about the uncaughtException listener, hopefully it is ours ++ if (lstnr.name !== '_uncaughtExceptionThrown') { ++ existingListeners.push(lstnr); ++ } ++ process.removeListener(EXIT, lstnr); ++ } ++ } ++ // TODO: what was the data parameter good for? ++ process.addListener(EXIT, function _tmp$safe_listener(data) { ++ for (let i = 0, length = existingListeners.length; i < length; i++) { ++ // let the existing listener do the garbage collection (e.g. jest sandbox) ++ try { ++ existingListeners[i](data); ++ } catch (err) { ++ // ignore ++ } ++ } ++ _garbageCollector(); ++ }); ++} ++ ++_safely_install_exit_listener(); ++_safely_install_sigint_listener(); ++ ++/** ++ * Configuration options. ++ * ++ * @typedef {Object} Options ++ * @property {?number} tries the number of tries before give up the name generation ++ * @property {?string} template the "mkstemp" like filename template ++ * @property {?string} name fix name ++ * @property {?string} dir the tmp directory to use ++ * @property {?string} prefix prefix for the generated name ++ * @property {?string} postfix postfix for the generated name ++ * @property {?boolean} unsafeCleanup recursively removes the created temporary directory, even when it's not empty ++ */ ++ ++/** ++ * @typedef {Object} FileSyncObject ++ * @property {string} name the name of the file ++ * @property {string} fd the file descriptor ++ * @property {fileCallback} removeCallback the callback function to remove the file ++ */ ++ ++/** ++ * @typedef {Object} DirSyncObject ++ * @property {string} name the name of the directory ++ * @property {fileCallback} removeCallback the callback function to remove the directory ++ */ ++ ++/** ++ * @callback tmpNameCallback ++ * @param {?Error} err the error object if anything goes wrong ++ * @param {string} name the temporary file name ++ */ ++ ++/** ++ * @callback fileCallback ++ * @param {?Error} err the error object if anything goes wrong ++ * @param {string} name the temporary file name ++ * @param {number} fd the file descriptor ++ * @param {cleanupCallback} fn the cleanup callback function ++ */ ++ ++/** ++ * @callback dirCallback ++ * @param {?Error} err the error object if anything goes wrong ++ * @param {string} name the temporary file name ++ * @param {cleanupCallback} fn the cleanup callback function ++ */ ++ ++/** ++ * Removes the temporary created file or directory. ++ * ++ * @callback cleanupCallback ++ * @param {simpleCallback} [next] function to call after entry was removed ++ */ ++ ++/** ++ * Callback function for function composition. ++ * @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57} ++ * ++ * @callback simpleCallback ++ */ ++ ++// exporting all the needed methods ++ ++// evaluate os.tmpdir() lazily, mainly for simplifying testing but it also will ++// allow users to reconfigure the temporary directory ++Object.defineProperty(module.exports, 'tmpdir', { ++ enumerable: true, ++ configurable: false, ++ get: function () { ++ return _getTmpDir(); ++ } ++}); ++ ++module.exports.dir = dir; ++module.exports.dirSync = dirSync; ++ ++module.exports.file = file; ++module.exports.fileSync = fileSync; ++ ++module.exports.tmpName = tmpName; ++module.exports.tmpNameSync = tmpNameSync; ++ ++module.exports.setGracefulCleanup = setGracefulCleanup; ++ ++}, ++"w61Ht0qGD0v9dg+p6HjQzwYL4OBnW5KYmWu3Ko45bss=": ++function (require, module, exports, __dirname, __filename) { ++const rnBridge = require("rn-bridge"); ++const log = require("debug")("mapeo-core:status"); ++const constants = require("./constants"); ++const main = require("./index"); ++ ++class ServerStatus { ++ constructor() { ++ this.setState(constants.IDLE); ++ rnBridge.channel.on("request-status", () => { ++ log("status request -> " + this.state); ++ rnBridge.channel.post("status", { value: this.state }); ++ }); ++ } ++ startHeartbeat() { ++ log("Start heartbeat"); ++ if (this.intervalId) return; // Don't have two heartbeats ++ this.intervalId = setInterval(() => { ++ rnBridge.channel.post("status", { value: this.state }); ++ }, 4000); ++ } ++ pauseHeartbeat() { ++ log("Pause heartbeat"); ++ clearInterval(this.intervalId); ++ this.intervalId = null; ++ } ++ getState() { ++ return this.state; ++ } ++ setState(nextState, { error, context } = {}) { ++ if (nextState === this.state) return; ++ log("state changed", nextState); ++ // Once we have an uncaught error, don't try to pretend it's gone away ++ if (this.state === constants.ERROR) return; ++ if (nextState === constants.ERROR) { ++ error = error || new Error("Unknown server error"); ++ log(context, error.message); ++ main.bugsnag.notify(error, { context }); ++ } ++ this.state = nextState; ++ rnBridge.channel.post("status", { ++ value: nextState, ++ error: error && error.message, ++ context, ++ }); ++ } ++} ++ ++module.exports = ServerStatus; ++ ++}, ++"w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=": ++function (require, module, exports, __dirname, __filename) { ++// Copyright Joyent, Inc. and other Node contributors. ++// ++// Permission is hereby granted, free of charge, to any person obtaining a ++// copy of this software and associated documentation files (the ++// "Software"), to deal in the Software without restriction, including ++// without limitation the rights to use, copy, modify, merge, publish, ++// distribute, sublicense, and/or sell copies of the Software, and to permit ++// persons to whom the Software is furnished to do so, subject to the ++// following conditions: ++// ++// The above copyright notice and this permission notice shall be included ++// in all copies or substantial portions of the Software. ++// ++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN ++// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ++// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ++// USE OR OTHER DEALINGS IN THE SOFTWARE. ++// a duplex stream is just a stream that is both readable and writable. ++// Since JS doesn't have multiple prototypal inheritance, this class ++// prototypally inherits from Readable, and then parasitically from ++// Writable. ++'use strict'; ++/**/ ++ ++var objectKeys = Object.keys || function (obj) { ++ var keys = []; ++ ++ for (var key in obj) { ++ keys.push(key); ++ } ++ ++ return keys; ++}; ++/**/ ++ ++ ++module.exports = Duplex; ++ ++var Readable = require('./_stream_readable'); ++ ++var Writable = require('./_stream_writable'); ++ ++require('inherits')(Duplex, Readable); ++ ++{ ++ // Allow the keys array to be GC'ed. ++ var keys = objectKeys(Writable.prototype); ++ ++ for (var v = 0; v < keys.length; v++) { ++ var method = keys[v]; ++ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; ++ } ++} ++ ++function Duplex(options) { ++ if (!(this instanceof Duplex)) return new Duplex(options); ++ Readable.call(this, options); ++ Writable.call(this, options); ++ this.allowHalfOpen = true; ++ ++ if (options) { ++ if (options.readable === false) this.readable = false; ++ if (options.writable === false) this.writable = false; ++ ++ if (options.allowHalfOpen === false) { ++ this.allowHalfOpen = false; ++ this.once('end', onend); ++ } ++ } ++} ++ ++Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._writableState.highWaterMark; ++ } ++}); ++Object.defineProperty(Duplex.prototype, 'writableBuffer', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._writableState && this._writableState.getBuffer(); ++ } ++}); ++Object.defineProperty(Duplex.prototype, 'writableLength', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._writableState.length; ++ } ++}); // the no-half-open enforcer ++ ++function onend() { ++ // If the writable side ended, then we're ok. ++ if (this._writableState.ended) return; // no more data can be written. ++ // But allow more writes to happen in this tick. ++ ++ process.nextTick(onEndNT, this); ++} ++ ++function onEndNT(self) { ++ self.end(); ++} ++ ++Object.defineProperty(Duplex.prototype, 'destroyed', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ if (this._readableState === undefined || this._writableState === undefined) { ++ return false; ++ } ++ ++ return this._readableState.destroyed && this._writableState.destroyed; ++ }, ++ set: function set(value) { ++ // we ignore the value if the stream ++ // has not been initialized yet ++ if (this._readableState === undefined || this._writableState === undefined) { ++ return; ++ } // backward compatibility, the user is explicitly ++ // managing destroyed ++ ++ ++ this._readableState.destroyed = value; ++ this._writableState.destroyed = value; ++ } ++}); ++}, ++"wCjG5RX/lhZqNW+n+TXsJsVIyG5nX7hngZgg5ESu9Go=": ++function (require, module, exports, __dirname, __filename) { ++module.exports = require('level-packager')(require('leveldown')) ++ ++}, ++"wDldIgTWkq3WWCNiCxvD5kG+5npYBS8nTJk+tkylzvU=": ++function (require, module, exports, __dirname, __filename) { ++'use strict' ++ ++// For (old) browser support ++var xtend = require('xtend') ++var assign = require('xtend/mutable') ++ ++module.exports = function supports () { ++ var manifest = xtend.apply(null, arguments) ++ ++ return assign(manifest, { ++ // Features of abstract-leveldown ++ bufferKeys: manifest.bufferKeys || false, ++ snapshots: manifest.snapshots || false, ++ permanence: manifest.permanence || false, ++ seek: manifest.seek || false, ++ clear: manifest.clear || false, ++ ++ // Features of abstract-leveldown that levelup doesn't have ++ status: manifest.status || false, ++ ++ // Features of disk-based implementations ++ createIfMissing: manifest.createIfMissing || false, ++ errorIfExists: manifest.errorIfExists || false, ++ ++ // Features of level(up) that abstract-leveldown doesn't have yet ++ deferredOpen: manifest.deferredOpen || false, ++ openCallback: manifest.openCallback || false, ++ promises: manifest.promises || false, ++ streams: manifest.streams || false, ++ encodings: manifest.encodings || false, ++ ++ // Methods that are not part of abstract-leveldown or levelup ++ additionalMethods: xtend(manifest.additionalMethods) ++ }) ++} ++ ++}, ++"wOsU2J+v8D5povtXnv2iaAG82fiQsfmMwudy5EjJN1w=": ++function (require, module, exports, __dirname, __filename) { ++module.exports = minimatch ++minimatch.Minimatch = Minimatch ++ ++var path = { sep: '/' } ++try { ++ path = require('path') ++} catch (er) {} ++ ++var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} ++var expand = require('brace-expansion') ++ ++var plTypes = { ++ '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, ++ '?': { open: '(?:', close: ')?' }, ++ '+': { open: '(?:', close: ')+' }, ++ '*': { open: '(?:', close: ')*' }, ++ '@': { open: '(?:', close: ')' } ++} ++ ++// any single thing other than / ++// don't need to escape / when using new RegExp() ++var qmark = '[^/]' ++ ++// * => any number of characters ++var star = qmark + '*?' ++ ++// ** when dots are allowed. Anything goes, except .. and . ++// not (^ or / followed by one or two dots followed by $ or /), ++// followed by anything, any number of times. ++var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' ++ ++// not a ^ or / followed by a dot, ++// followed by anything, any number of times. ++var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' ++ ++// characters that need to be escaped in RegExp. ++var reSpecials = charSet('().*{}+?[]^$\\!') ++ ++// "abc" -> { a:true, b:true, c:true } ++function charSet (s) { ++ return s.split('').reduce(function (set, c) { ++ set[c] = true ++ return set ++ }, {}) ++} ++ ++// normalizes slashes. ++var slashSplit = /\/+/ ++ ++minimatch.filter = filter ++function filter (pattern, options) { ++ options = options || {} ++ return function (p, i, list) { ++ return minimatch(p, pattern, options) ++ } ++} ++ ++function ext (a, b) { ++ a = a || {} ++ b = b || {} ++ var t = {} ++ Object.keys(b).forEach(function (k) { ++ t[k] = b[k] ++ }) ++ Object.keys(a).forEach(function (k) { ++ t[k] = a[k] ++ }) ++ return t ++} ++ ++minimatch.defaults = function (def) { ++ if (!def || !Object.keys(def).length) return minimatch ++ ++ var orig = minimatch ++ ++ var m = function minimatch (p, pattern, options) { ++ return orig.minimatch(p, pattern, ext(def, options)) ++ } ++ ++ m.Minimatch = function Minimatch (pattern, options) { ++ return new orig.Minimatch(pattern, ext(def, options)) ++ } ++ ++ return m ++} ++ ++Minimatch.defaults = function (def) { ++ if (!def || !Object.keys(def).length) return Minimatch ++ return minimatch.defaults(def).Minimatch ++} ++ ++function minimatch (p, pattern, options) { ++ if (typeof pattern !== 'string') { ++ throw new TypeError('glob pattern string required') ++ } ++ ++ if (!options) options = {} ++ ++ // shortcut: comments match nothing. ++ if (!options.nocomment && pattern.charAt(0) === '#') { ++ return false ++ } ++ ++ // "" only matches "" ++ if (pattern.trim() === '') return p === '' ++ ++ return new Minimatch(pattern, options).match(p) ++} ++ ++function Minimatch (pattern, options) { ++ if (!(this instanceof Minimatch)) { ++ return new Minimatch(pattern, options) ++ } ++ ++ if (typeof pattern !== 'string') { ++ throw new TypeError('glob pattern string required') ++ } ++ ++ if (!options) options = {} ++ pattern = pattern.trim() ++ ++ // windows support: need to use /, not \ ++ if (path.sep !== '/') { ++ pattern = pattern.split(path.sep).join('/') ++ } ++ ++ this.options = options ++ this.set = [] ++ this.pattern = pattern ++ this.regexp = null ++ this.negate = false ++ this.comment = false ++ this.empty = false ++ ++ // make the set of regexps etc. ++ this.make() ++} ++ ++Minimatch.prototype.debug = function () {} ++ ++Minimatch.prototype.make = make ++function make () { ++ // don't do it more than once. ++ if (this._made) return ++ ++ var pattern = this.pattern ++ var options = this.options ++ ++ // empty patterns and comments match nothing. ++ if (!options.nocomment && pattern.charAt(0) === '#') { ++ this.comment = true ++ return ++ } ++ if (!pattern) { ++ this.empty = true ++ return ++ } ++ ++ // step 1: figure out negation, etc. ++ this.parseNegate() ++ ++ // step 2: expand braces ++ var set = this.globSet = this.braceExpand() ++ ++ if (options.debug) this.debug = console.error ++ ++ this.debug(this.pattern, set) ++ ++ // step 3: now we have a set, so turn each one into a series of path-portion ++ // matching patterns. ++ // These will be regexps, except in the case of "**", which is ++ // set to the GLOBSTAR object for globstar behavior, ++ // and will not contain any / characters ++ set = this.globParts = set.map(function (s) { ++ return s.split(slashSplit) ++ }) ++ ++ this.debug(this.pattern, set) ++ ++ // glob --> regexps ++ set = set.map(function (s, si, set) { ++ return s.map(this.parse, this) ++ }, this) ++ ++ this.debug(this.pattern, set) ++ ++ // filter out everything that didn't compile properly. ++ set = set.filter(function (s) { ++ return s.indexOf(false) === -1 ++ }) ++ ++ this.debug(this.pattern, set) ++ ++ this.set = set ++} ++ ++Minimatch.prototype.parseNegate = parseNegate ++function parseNegate () { ++ var pattern = this.pattern ++ var negate = false ++ var options = this.options ++ var negateOffset = 0 ++ ++ if (options.nonegate) return ++ ++ for (var i = 0, l = pattern.length ++ ; i < l && pattern.charAt(i) === '!' ++ ; i++) { ++ negate = !negate ++ negateOffset++ ++ } ++ ++ if (negateOffset) this.pattern = pattern.substr(negateOffset) ++ this.negate = negate ++} ++ ++// Brace expansion: ++// a{b,c}d -> abd acd ++// a{b,}c -> abc ac ++// a{0..3}d -> a0d a1d a2d a3d ++// a{b,c{d,e}f}g -> abg acdfg acefg ++// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg ++// ++// Invalid sets are not expanded. ++// a{2..}b -> a{2..}b ++// a{b}c -> a{b}c ++minimatch.braceExpand = function (pattern, options) { ++ return braceExpand(pattern, options) ++} ++ ++Minimatch.prototype.braceExpand = braceExpand ++ ++function braceExpand (pattern, options) { ++ if (!options) { ++ if (this instanceof Minimatch) { ++ options = this.options ++ } else { ++ options = {} ++ } ++ } ++ ++ pattern = typeof pattern === 'undefined' ++ ? this.pattern : pattern ++ ++ if (typeof pattern === 'undefined') { ++ throw new TypeError('undefined pattern') ++ } ++ ++ if (options.nobrace || ++ !pattern.match(/\{.*\}/)) { ++ // shortcut. no need to expand. ++ return [pattern] ++ } ++ ++ return expand(pattern) ++} ++ ++// parse a component of the expanded set. ++// At this point, no pattern may contain "/" in it ++// so we're going to return a 2d array, where each entry is the full ++// pattern, split on '/', and then turned into a regular expression. ++// A regexp is made at the end which joins each array with an ++// escaped /, and another full one which joins each regexp with |. ++// ++// Following the lead of Bash 4.1, note that "**" only has special meaning ++// when it is the *only* thing in a path portion. Otherwise, any series ++// of * is equivalent to a single *. Globstar behavior is enabled by ++// default, and can be disabled by setting options.noglobstar. ++Minimatch.prototype.parse = parse ++var SUBPARSE = {} ++function parse (pattern, isSub) { ++ if (pattern.length > 1024 * 64) { ++ throw new TypeError('pattern is too long') ++ } ++ ++ var options = this.options ++ ++ // shortcuts ++ if (!options.noglobstar && pattern === '**') return GLOBSTAR ++ if (pattern === '') return '' ++ ++ var re = '' ++ var hasMagic = !!options.nocase ++ var escaping = false ++ // ? => one single character ++ var patternListStack = [] ++ var negativeLists = [] ++ var stateChar ++ var inClass = false ++ var reClassStart = -1 ++ var classStart = -1 ++ // . and .. never match anything that doesn't start with ., ++ // even when options.dot is set. ++ var patternStart = pattern.charAt(0) === '.' ? '' // anything ++ // not (start or / followed by . or .. followed by / or end) ++ : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' ++ : '(?!\\.)' ++ var self = this ++ ++ function clearStateChar () { ++ if (stateChar) { ++ // we had some state-tracking character ++ // that wasn't consumed by this pass. ++ switch (stateChar) { ++ case '*': ++ re += star ++ hasMagic = true ++ break ++ case '?': ++ re += qmark ++ hasMagic = true ++ break ++ default: ++ re += '\\' + stateChar ++ break ++ } ++ self.debug('clearStateChar %j %j', stateChar, re) ++ stateChar = false ++ } ++ } ++ ++ for (var i = 0, len = pattern.length, c ++ ; (i < len) && (c = pattern.charAt(i)) ++ ; i++) { ++ this.debug('%s\t%s %s %j', pattern, i, re, c) ++ ++ // skip over any that are escaped. ++ if (escaping && reSpecials[c]) { ++ re += '\\' + c ++ escaping = false ++ continue ++ } ++ ++ switch (c) { ++ case '/': ++ // completely not allowed, even escaped. ++ // Should already be path-split by now. ++ return false ++ ++ case '\\': ++ clearStateChar() ++ escaping = true ++ continue ++ ++ // the various stateChar values ++ // for the "extglob" stuff. ++ case '?': ++ case '*': ++ case '+': ++ case '@': ++ case '!': ++ this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) ++ ++ // all of those are literals inside a class, except that ++ // the glob [!a] means [^a] in regexp ++ if (inClass) { ++ this.debug(' in class') ++ if (c === '!' && i === classStart + 1) c = '^' ++ re += c ++ continue ++ } ++ ++ // if we already have a stateChar, then it means ++ // that there was something like ** or +? in there. ++ // Handle the stateChar, then proceed with this one. ++ self.debug('call clearStateChar %j', stateChar) ++ clearStateChar() ++ stateChar = c ++ // if extglob is disabled, then +(asdf|foo) isn't a thing. ++ // just clear the statechar *now*, rather than even diving into ++ // the patternList stuff. ++ if (options.noext) clearStateChar() ++ continue ++ ++ case '(': ++ if (inClass) { ++ re += '(' ++ continue ++ } ++ ++ if (!stateChar) { ++ re += '\\(' ++ continue ++ } ++ ++ patternListStack.push({ ++ type: stateChar, ++ start: i - 1, ++ reStart: re.length, ++ open: plTypes[stateChar].open, ++ close: plTypes[stateChar].close ++ }) ++ // negation is (?:(?!js)[^/]*) ++ re += stateChar === '!' ? '(?:(?!(?:' : '(?:' ++ this.debug('plType %j %j', stateChar, re) ++ stateChar = false ++ continue ++ ++ case ')': ++ if (inClass || !patternListStack.length) { ++ re += '\\)' ++ continue ++ } ++ ++ clearStateChar() ++ hasMagic = true ++ var pl = patternListStack.pop() ++ // negation is (?:(?!js)[^/]*) ++ // The others are (?:) ++ re += pl.close ++ if (pl.type === '!') { ++ negativeLists.push(pl) ++ } ++ pl.reEnd = re.length ++ continue ++ ++ case '|': ++ if (inClass || !patternListStack.length || escaping) { ++ re += '\\|' ++ escaping = false ++ continue ++ } ++ ++ clearStateChar() ++ re += '|' ++ continue ++ ++ // these are mostly the same in regexp and glob ++ case '[': ++ // swallow any state-tracking char before the [ ++ clearStateChar() ++ ++ if (inClass) { ++ re += '\\' + c ++ continue ++ } ++ ++ inClass = true ++ classStart = i ++ reClassStart = re.length ++ re += c ++ continue ++ ++ case ']': ++ // a right bracket shall lose its special ++ // meaning and represent itself in ++ // a bracket expression if it occurs ++ // first in the list. -- POSIX.2 2.8.3.2 ++ if (i === classStart + 1 || !inClass) { ++ re += '\\' + c ++ escaping = false ++ continue ++ } ++ ++ // handle the case where we left a class open. ++ // "[z-a]" is valid, equivalent to "\[z-a\]" ++ if (inClass) { ++ // split where the last [ was, make sure we don't have ++ // an invalid re. if so, re-walk the contents of the ++ // would-be class to re-translate any characters that ++ // were passed through as-is ++ // TODO: It would probably be faster to determine this ++ // without a try/catch and a new RegExp, but it's tricky ++ // to do safely. For now, this is safe and works. ++ var cs = pattern.substring(classStart + 1, i) ++ try { ++ RegExp('[' + cs + ']') ++ } catch (er) { ++ // not a valid class! ++ var sp = this.parse(cs, SUBPARSE) ++ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' ++ hasMagic = hasMagic || sp[1] ++ inClass = false ++ continue ++ } ++ } ++ ++ // finish up the class. ++ hasMagic = true ++ inClass = false ++ re += c ++ continue ++ ++ default: ++ // swallow any state char that wasn't consumed ++ clearStateChar() ++ ++ if (escaping) { ++ // no need ++ escaping = false ++ } else if (reSpecials[c] ++ && !(c === '^' && inClass)) { ++ re += '\\' ++ } ++ ++ re += c ++ ++ } // switch ++ } // for ++ ++ // handle the case where we left a class open. ++ // "[abc" is valid, equivalent to "\[abc" ++ if (inClass) { ++ // split where the last [ was, and escape it ++ // this is a huge pita. We now have to re-walk ++ // the contents of the would-be class to re-translate ++ // any characters that were passed through as-is ++ cs = pattern.substr(classStart + 1) ++ sp = this.parse(cs, SUBPARSE) ++ re = re.substr(0, reClassStart) + '\\[' + sp[0] ++ hasMagic = hasMagic || sp[1] ++ } ++ ++ // handle the case where we had a +( thing at the *end* ++ // of the pattern. ++ // each pattern list stack adds 3 chars, and we need to go through ++ // and escape any | chars that were passed through as-is for the regexp. ++ // Go through and escape them, taking care not to double-escape any ++ // | chars that were already escaped. ++ for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { ++ var tail = re.slice(pl.reStart + pl.open.length) ++ this.debug('setting tail', re, pl) ++ // maybe some even number of \, then maybe 1 \, followed by a | ++ tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { ++ if (!$2) { ++ // the | isn't already escaped, so escape it. ++ $2 = '\\' ++ } ++ ++ // need to escape all those slashes *again*, without escaping the ++ // one that we need for escaping the | character. As it works out, ++ // escaping an even number of slashes can be done by simply repeating ++ // it exactly after itself. That's why this trick works. ++ // ++ // I am sorry that you have to see this. ++ return $1 + $1 + $2 + '|' ++ }) ++ ++ this.debug('tail=%j\n %s', tail, tail, pl, re) ++ var t = pl.type === '*' ? star ++ : pl.type === '?' ? qmark ++ : '\\' + pl.type ++ ++ hasMagic = true ++ re = re.slice(0, pl.reStart) + t + '\\(' + tail ++ } ++ ++ // handle trailing things that only matter at the very end. ++ clearStateChar() ++ if (escaping) { ++ // trailing \\ ++ re += '\\\\' ++ } ++ ++ // only need to apply the nodot start if the re starts with ++ // something that could conceivably capture a dot ++ var addPatternStart = false ++ switch (re.charAt(0)) { ++ case '.': ++ case '[': ++ case '(': addPatternStart = true ++ } ++ ++ // Hack to work around lack of negative lookbehind in JS ++ // A pattern like: *.!(x).!(y|z) needs to ensure that a name ++ // like 'a.xyz.yz' doesn't match. So, the first negative ++ // lookahead, has to look ALL the way ahead, to the end of ++ // the pattern. ++ for (var n = negativeLists.length - 1; n > -1; n--) { ++ var nl = negativeLists[n] ++ ++ var nlBefore = re.slice(0, nl.reStart) ++ var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) ++ var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) ++ var nlAfter = re.slice(nl.reEnd) ++ ++ nlLast += nlAfter ++ ++ // Handle nested stuff like *(*.js|!(*.json)), where open parens ++ // mean that we should *not* include the ) in the bit that is considered ++ // "after" the negated section. ++ var openParensBefore = nlBefore.split('(').length - 1 ++ var cleanAfter = nlAfter ++ for (i = 0; i < openParensBefore; i++) { ++ cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') ++ } ++ nlAfter = cleanAfter ++ ++ var dollar = '' ++ if (nlAfter === '' && isSub !== SUBPARSE) { ++ dollar = '$' ++ } ++ var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast ++ re = newRe ++ } ++ ++ // if the re is not "" at this point, then we need to make sure ++ // it doesn't match against an empty path part. ++ // Otherwise a/* will match a/, which it should not. ++ if (re !== '' && hasMagic) { ++ re = '(?=.)' + re ++ } ++ ++ if (addPatternStart) { ++ re = patternStart + re ++ } ++ ++ // parsing just a piece of a larger pattern. ++ if (isSub === SUBPARSE) { ++ return [re, hasMagic] ++ } ++ ++ // skip the regexp for non-magical patterns ++ // unescape anything in it, though, so that it'll be ++ // an exact match against a file etc. ++ if (!hasMagic) { ++ return globUnescape(pattern) ++ } ++ ++ var flags = options.nocase ? 'i' : '' ++ try { ++ var regExp = new RegExp('^' + re + '$', flags) ++ } catch (er) { ++ // If it was an invalid regular expression, then it can't match ++ // anything. This trick looks for a character after the end of ++ // the string, which is of course impossible, except in multi-line ++ // mode, but it's not a /m regex. ++ return new RegExp('$.') ++ } ++ ++ regExp._glob = pattern ++ regExp._src = re ++ ++ return regExp ++} ++ ++minimatch.makeRe = function (pattern, options) { ++ return new Minimatch(pattern, options || {}).makeRe() ++} ++ ++Minimatch.prototype.makeRe = makeRe ++function makeRe () { ++ if (this.regexp || this.regexp === false) return this.regexp ++ ++ // at this point, this.set is a 2d array of partial ++ // pattern strings, or "**". ++ // ++ // It's better to use .match(). This function shouldn't ++ // be used, really, but it's pretty convenient sometimes, ++ // when you just want to work with a regex. ++ var set = this.set ++ ++ if (!set.length) { ++ this.regexp = false ++ return this.regexp ++ } ++ var options = this.options ++ ++ var twoStar = options.noglobstar ? star ++ : options.dot ? twoStarDot ++ : twoStarNoDot ++ var flags = options.nocase ? 'i' : '' ++ ++ var re = set.map(function (pattern) { ++ return pattern.map(function (p) { ++ return (p === GLOBSTAR) ? twoStar ++ : (typeof p === 'string') ? regExpEscape(p) ++ : p._src ++ }).join('\\\/') ++ }).join('|') ++ ++ // must match entire pattern ++ // ending in a * or ** will make it less strict. ++ re = '^(?:' + re + ')$' ++ ++ // can match anything, as long as it's not this. ++ if (this.negate) re = '^(?!' + re + ').*$' ++ ++ try { ++ this.regexp = new RegExp(re, flags) ++ } catch (ex) { ++ this.regexp = false ++ } ++ return this.regexp ++} ++ ++minimatch.match = function (list, pattern, options) { ++ options = options || {} ++ var mm = new Minimatch(pattern, options) ++ list = list.filter(function (f) { ++ return mm.match(f) ++ }) ++ if (mm.options.nonull && !list.length) { ++ list.push(pattern) ++ } ++ return list ++} ++ ++Minimatch.prototype.match = match ++function match (f, partial) { ++ this.debug('match', f, this.pattern) ++ // short-circuit in the case of busted things. ++ // comments, etc. ++ if (this.comment) return false ++ if (this.empty) return f === '' ++ ++ if (f === '/' && partial) return true ++ ++ var options = this.options ++ ++ // windows: need to use /, not \ ++ if (path.sep !== '/') { ++ f = f.split(path.sep).join('/') ++ } ++ ++ // treat the test path as a set of pathparts. ++ f = f.split(slashSplit) ++ this.debug(this.pattern, 'split', f) ++ ++ // just ONE of the pattern sets in this.set needs to match ++ // in order for it to be valid. If negating, then just one ++ // match means that we have failed. ++ // Either way, return on the first hit. ++ ++ var set = this.set ++ this.debug(this.pattern, 'set', set) ++ ++ // Find the basename of the path by looking for the last non-empty segment ++ var filename ++ var i ++ for (i = f.length - 1; i >= 0; i--) { ++ filename = f[i] ++ if (filename) break ++ } ++ ++ for (i = 0; i < set.length; i++) { ++ var pattern = set[i] ++ var file = f ++ if (options.matchBase && pattern.length === 1) { ++ file = [filename] ++ } ++ var hit = this.matchOne(file, pattern, partial) ++ if (hit) { ++ if (options.flipNegate) return true ++ return !this.negate ++ } ++ } ++ ++ // didn't get any hits. this is success if it's a negative ++ // pattern, failure otherwise. ++ if (options.flipNegate) return false ++ return this.negate ++} ++ ++// set partial to true to test if, for example, ++// "/a/b" matches the start of "/*/b/*/d" ++// Partial means, if you run out of file before you run ++// out of pattern, then that's fine, as long as all ++// the parts match. ++Minimatch.prototype.matchOne = function (file, pattern, partial) { ++ var options = this.options ++ ++ this.debug('matchOne', ++ { 'this': this, file: file, pattern: pattern }) ++ ++ this.debug('matchOne', file.length, pattern.length) ++ ++ for (var fi = 0, ++ pi = 0, ++ fl = file.length, ++ pl = pattern.length ++ ; (fi < fl) && (pi < pl) ++ ; fi++, pi++) { ++ this.debug('matchOne loop') ++ var p = pattern[pi] ++ var f = file[fi] ++ ++ this.debug(pattern, p, f) ++ ++ // should be impossible. ++ // some invalid regexp stuff in the set. ++ if (p === false) return false ++ ++ if (p === GLOBSTAR) { ++ this.debug('GLOBSTAR', [pattern, p, f]) ++ ++ // "**" ++ // a/**/b/**/c would match the following: ++ // a/b/x/y/z/c ++ // a/x/y/z/b/c ++ // a/b/x/b/x/c ++ // a/b/c ++ // To do this, take the rest of the pattern after ++ // the **, and see if it would match the file remainder. ++ // If so, return success. ++ // If not, the ** "swallows" a segment, and try again. ++ // This is recursively awful. ++ // ++ // a/**/b/**/c matching a/b/x/y/z/c ++ // - a matches a ++ // - doublestar ++ // - matchOne(b/x/y/z/c, b/**/c) ++ // - b matches b ++ // - doublestar ++ // - matchOne(x/y/z/c, c) -> no ++ // - matchOne(y/z/c, c) -> no ++ // - matchOne(z/c, c) -> no ++ // - matchOne(c, c) yes, hit ++ var fr = fi ++ var pr = pi + 1 ++ if (pr === pl) { ++ this.debug('** at the end') ++ // a ** at the end will just swallow the rest. ++ // We have found a match. ++ // however, it will not swallow /.x, unless ++ // options.dot is set. ++ // . and .. are *never* matched by **, for explosively ++ // exponential reasons. ++ for (; fi < fl; fi++) { ++ if (file[fi] === '.' || file[fi] === '..' || ++ (!options.dot && file[fi].charAt(0) === '.')) return false ++ } ++ return true ++ } ++ ++ // ok, let's see if we can swallow whatever we can. ++ while (fr < fl) { ++ var swallowee = file[fr] ++ ++ this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) ++ ++ // XXX remove this slice. Just pass the start index. ++ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { ++ this.debug('globstar found match!', fr, fl, swallowee) ++ // found a match. ++ return true ++ } else { ++ // can't swallow "." or ".." ever. ++ // can only swallow ".foo" when explicitly asked. ++ if (swallowee === '.' || swallowee === '..' || ++ (!options.dot && swallowee.charAt(0) === '.')) { ++ this.debug('dot detected!', file, fr, pattern, pr) ++ break ++ } ++ ++ // ** swallows a segment, and continue. ++ this.debug('globstar swallow a segment, and continue') ++ fr++ ++ } ++ } ++ ++ // no match was found. ++ // However, in partial mode, we can't say this is necessarily over. ++ // If there's more *pattern* left, then ++ if (partial) { ++ // ran out of file ++ this.debug('\n>>> no match, partial?', file, fr, pattern, pr) ++ if (fr === fl) return true ++ } ++ return false ++ } ++ ++ // something other than ** ++ // non-magic patterns just have to match exactly ++ // patterns with magic have been turned into regexps. ++ var hit ++ if (typeof p === 'string') { ++ if (options.nocase) { ++ hit = f.toLowerCase() === p.toLowerCase() ++ } else { ++ hit = f === p ++ } ++ this.debug('string match', p, f, hit) ++ } else { ++ hit = f.match(p) ++ this.debug('pattern match', p, f, hit) ++ } ++ ++ if (!hit) return false ++ } ++ ++ // Note: ending in / means that we'll get a final "" ++ // at the end of the pattern. This can only match a ++ // corresponding "" at the end of the file. ++ // If the file ends in /, then it can only match a ++ // a pattern that ends in /, unless the pattern just ++ // doesn't have any more for it. But, a/b/ should *not* ++ // match "a/b/*", even though "" matches against the ++ // [^/]*? pattern, except in partial mode, where it might ++ // simply not be reached yet. ++ // However, a/b/ should still satisfy a/* ++ ++ // now either we fell off the end of the pattern, or we're done. ++ if (fi === fl && pi === pl) { ++ // ran out of pattern and filename at the same time. ++ // an exact hit! ++ return true ++ } else if (fi === fl) { ++ // ran out of file, but still had pattern left. ++ // this is ok if we're doing the match as part of ++ // a glob fs traversal. ++ return partial ++ } else if (pi === pl) { ++ // ran out of pattern, still have file left. ++ // this is only acceptable if we're on the very last ++ // empty segment of a file with a trailing slash. ++ // a/* should match a/b/ ++ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') ++ return emptyFileEnd ++ } ++ ++ // should be unreachable. ++ throw new Error('wtf?') ++} ++ ++// replace stuff like \* with * ++function globUnescape (s) { ++ return s.replace(/\\(.)/g, '$1') ++} ++ ++function regExpEscape (s) { ++ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') ++} ++ ++}, ++"wTJvQs1y90XgwlPsAgkOxa1tdXOLvlDc48ymH9y0zXo=": ++function (require, module, exports, __dirname, __filename) { ++/*! ++ * is-accessor-descriptor ++ * ++ * Copyright (c) 2015, Jon Schlinkert. ++ * Licensed under the MIT License. ++ */ ++ ++'use strict'; ++ ++var typeOf = require('kind-of'); ++ ++// accessor descriptor properties ++var accessor = { ++ get: 'function', ++ set: 'function', ++ configurable: 'boolean', ++ enumerable: 'boolean' ++}; ++ ++function isAccessorDescriptor(obj, prop) { ++ if (typeof prop === 'string') { ++ var val = Object.getOwnPropertyDescriptor(obj, prop); ++ return typeof val !== 'undefined'; ++ } ++ ++ if (typeOf(obj) !== 'object') { ++ return false; ++ } ++ ++ if (has(obj, 'value') || has(obj, 'writable')) { ++ return false; ++ } ++ ++ if (!has(obj, 'get') || typeof obj.get !== 'function') { ++ return false; ++ } ++ ++ // tldr: it's valid to have "set" be undefined ++ // "set" might be undefined if `Object.getOwnPropertyDescriptor` ++ // was used to get the value, and only `get` was defined by the user ++ if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') { ++ return false; ++ } ++ ++ for (var key in obj) { ++ if (!accessor.hasOwnProperty(key)) { ++ continue; ++ } ++ ++ if (typeOf(obj[key]) === accessor[key]) { ++ continue; ++ } ++ ++ if (typeof obj[key] !== 'undefined') { ++ return false; ++ } ++ } ++ return true; ++} ++ ++function has(obj, key) { ++ return {}.hasOwnProperty.call(obj, key); ++} ++ ++/** ++ * Expose `isAccessorDescriptor` ++ */ ++ ++module.exports = isAccessorDescriptor; ++ ++}, ++"wVceO0zBSDLugck3/TH7J6XyvjkC8ahW6AYxIcOjA3o=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++/** ++ * Class representing an event. ++ * ++ * @private ++ */ ++class Event { ++ /** ++ * Create a new `Event`. ++ * ++ * @param {String} type The name of the event ++ * @param {Object} target A reference to the target to which the event was dispatched ++ */ ++ constructor (type, target) { ++ this.target = target; ++ this.type = type; ++ } ++} ++ ++/** ++ * Class representing a message event. ++ * ++ * @extends Event ++ * @private ++ */ ++class MessageEvent extends Event { ++ /** ++ * Create a new `MessageEvent`. ++ * ++ * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data ++ * @param {WebSocket} target A reference to the target to which the event was dispatched ++ */ ++ constructor (data, target) { ++ super('message', target); ++ ++ this.data = data; ++ } ++} ++ ++/** ++ * Class representing a close event. ++ * ++ * @extends Event ++ * @private ++ */ ++class CloseEvent extends Event { ++ /** ++ * Create a new `CloseEvent`. ++ * ++ * @param {Number} code The status code explaining why the connection is being closed ++ * @param {String} reason A human-readable string explaining why the connection is closing ++ * @param {WebSocket} target A reference to the target to which the event was dispatched ++ */ ++ constructor (code, reason, target) { ++ super('close', target); ++ ++ this.wasClean = target._closeFrameReceived && target._closeFrameSent; ++ this.reason = reason; ++ this.code = code; ++ } ++} ++ ++/** ++ * Class representing an open event. ++ * ++ * @extends Event ++ * @private ++ */ ++class OpenEvent extends Event { ++ /** ++ * Create a new `OpenEvent`. ++ * ++ * @param {WebSocket} target A reference to the target to which the event was dispatched ++ */ ++ constructor (target) { ++ super('open', target); ++ } ++} ++ ++/** ++ * This provides methods for emulating the `EventTarget` interface. It's not ++ * meant to be used directly. ++ * ++ * @mixin ++ */ ++const EventTarget = { ++ /** ++ * Register an event listener. ++ * ++ * @param {String} method A string representing the event type to listen for ++ * @param {Function} listener The listener to add ++ * @public ++ */ ++ addEventListener (method, listener) { ++ if (typeof listener !== 'function') return; ++ ++ function onMessage (data) { ++ listener.call(this, new MessageEvent(data, this)); ++ } ++ ++ function onClose (code, message) { ++ listener.call(this, new CloseEvent(code, message, this)); ++ } ++ ++ function onError (event) { ++ event.type = 'error'; ++ event.target = this; ++ listener.call(this, event); ++ } ++ ++ function onOpen () { ++ listener.call(this, new OpenEvent(this)); ++ } ++ ++ if (method === 'message') { ++ onMessage._listener = listener; ++ this.on(method, onMessage); ++ } else if (method === 'close') { ++ onClose._listener = listener; ++ this.on(method, onClose); ++ } else if (method === 'error') { ++ onError._listener = listener; ++ this.on(method, onError); ++ } else if (method === 'open') { ++ onOpen._listener = listener; ++ this.on(method, onOpen); ++ } else { ++ this.on(method, listener); ++ } ++ }, ++ ++ /** ++ * Remove an event listener. ++ * ++ * @param {String} method A string representing the event type to remove ++ * @param {Function} listener The listener to remove ++ * @public ++ */ ++ removeEventListener (method, listener) { ++ const listeners = this.listeners(method); ++ ++ for (var i = 0; i < listeners.length; i++) { ++ if (listeners[i] === listener || listeners[i]._listener === listener) { ++ this.removeListener(method, listeners[i]); ++ } ++ } ++ } ++}; ++ ++module.exports = EventTarget; ++ ++}, ++"wXAitLtm/BlHHvcAzRNP8diRd9fZ2mnI+c8EYk2ZjFQ=": ++function (require, module, exports, __dirname, __filename) { ++var BKD = require('bkd-tree') ++var once = require('once') ++ ++module.exports = MBKD ++ ++function MBKD (opts) { ++ if (!(this instanceof MBKD)) return new MBKD(opts) ++ this.storage = opts.storage ++ this._getPoint = opts.getPoint ++ this._isLinked = opts.isLinked ++ this.bkd = new BKD(this.storage, { ++ type: opts.type, ++ branchFactor: opts.branchFactor, ++ levels: opts.levels, ++ compare: opts.compare ++ }) ++} ++ ++MBKD.prototype.batch = function (rows, cb) { ++ var self = this ++ cb = once(cb || noop) ++ var ops = [] ++ var pending = 1 ++ rows.forEach(function (row) { ++ var links = row.links || [] ++ links.forEach(function (link) { ++ pending++ ++ self._getPoint(link, function (err, pt) { ++ if (err) return cb(err) ++ if (pt) { ++ ops.push({ ++ type: 'delete', ++ point: pt.point, ++ value: pt.value ++ }) ++ } ++ if (--pending === 0) done() ++ }) ++ }) ++ pending++ ++ self._isLinked(row.id, function (err, ex) { ++ if (err) return cb(err) ++ if (!ex) { ++ ops.push({ ++ type: row.type === 'delete' ? 'delete' : 'insert', ++ point: row.point, ++ value: Array.isArray(row.id) ? row.id : [row.id] ++ }) ++ } ++ if (--pending === 0) done() ++ }) ++ }) ++ if (--pending === 0) done() ++ ++ function done () { ++ self.bkd.batch(ops, cb) ++ } ++} ++ ++MBKD.prototype.query = function (bbox, cb) { ++ return this.bkd.query(bbox, cb) ++} ++ ++function noop () {} ++ ++}, ++"wXBboLka1DXM60zfySYMwfUtjeTA2Q0R8bwkJZiYX6U=": ++function (require, module, exports, __dirname, __filename) { ++var parse = require('ret'); ++var types = parse.types; ++ ++module.exports = function (re, opts) { ++ if (!opts) opts = {}; ++ var replimit = opts.limit === undefined ? 25 : opts.limit; ++ ++ if (isRegExp(re)) re = re.source; ++ else if (typeof re !== 'string') re = String(re); ++ ++ try { re = parse(re) } ++ catch (err) { return false } ++ ++ var reps = 0; ++ return (function walk (node, starHeight) { ++ if (node.type === types.REPETITION) { ++ starHeight ++; ++ reps ++; ++ if (starHeight > 1) return false; ++ if (reps > replimit) return false; ++ } ++ ++ if (node.options) { ++ for (var i = 0, len = node.options.length; i < len; i++) { ++ var ok = walk({ stack: node.options[i] }, starHeight); ++ if (!ok) return false; ++ } ++ } ++ var stack = node.stack || (node.value && node.value.stack); ++ if (!stack) return true; ++ ++ for (var i = 0; i < stack.length; i++) { ++ var ok = walk(stack[i], starHeight); ++ if (!ok) return false; ++ } ++ ++ return true; ++ })(re, 0); ++}; ++ ++function isRegExp (x) { ++ return {}.toString.call(x) === '[object RegExp]'; ++} ++ ++}, ++"wciDz4KPqtivLLn4mHW71x6Y6XEAydFH2ERlwxQlfUM=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.ValueScope = exports.ValueScopeName = exports.Scope = exports.varKinds = exports.UsedValueState = void 0; ++const code_1 = require("./code"); ++class ValueError extends Error { ++ constructor(name) { ++ super(`CodeGen: "code" for ${name} not defined`); ++ this.value = name.value; ++ } ++} ++var UsedValueState; ++(function (UsedValueState) { ++ UsedValueState[UsedValueState["Started"] = 0] = "Started"; ++ UsedValueState[UsedValueState["Completed"] = 1] = "Completed"; ++})(UsedValueState = exports.UsedValueState || (exports.UsedValueState = {})); ++exports.varKinds = { ++ const: new code_1.Name("const"), ++ let: new code_1.Name("let"), ++ var: new code_1.Name("var"), ++}; ++class Scope { ++ constructor({ prefixes, parent } = {}) { ++ this._names = {}; ++ this._prefixes = prefixes; ++ this._parent = parent; ++ } ++ toName(nameOrPrefix) { ++ return nameOrPrefix instanceof code_1.Name ? nameOrPrefix : this.name(nameOrPrefix); ++ } ++ name(prefix) { ++ return new code_1.Name(this._newName(prefix)); ++ } ++ _newName(prefix) { ++ const ng = this._names[prefix] || this._nameGroup(prefix); ++ return `${prefix}${ng.index++}`; ++ } ++ _nameGroup(prefix) { ++ var _a, _b; ++ if (((_b = (_a = this._parent) === null || _a === void 0 ? void 0 : _a._prefixes) === null || _b === void 0 ? void 0 : _b.has(prefix)) || (this._prefixes && !this._prefixes.has(prefix))) { ++ throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`); ++ } ++ return (this._names[prefix] = { prefix, index: 0 }); ++ } ++} ++exports.Scope = Scope; ++class ValueScopeName extends code_1.Name { ++ constructor(prefix, nameStr) { ++ super(nameStr); ++ this.prefix = prefix; ++ } ++ setValue(value, { property, itemIndex }) { ++ this.value = value; ++ this.scopePath = code_1._ `.${new code_1.Name(property)}[${itemIndex}]`; ++ } ++} ++exports.ValueScopeName = ValueScopeName; ++const line = code_1._ `\n`; ++class ValueScope extends Scope { ++ constructor(opts) { ++ super(opts); ++ this._values = {}; ++ this._scope = opts.scope; ++ this.opts = { ...opts, _n: opts.lines ? line : code_1.nil }; ++ } ++ get() { ++ return this._scope; ++ } ++ name(prefix) { ++ return new ValueScopeName(prefix, this._newName(prefix)); ++ } ++ value(nameOrPrefix, value) { ++ var _a; ++ if (value.ref === undefined) ++ throw new Error("CodeGen: ref must be passed in value"); ++ const name = this.toName(nameOrPrefix); ++ const { prefix } = name; ++ const valueKey = (_a = value.key) !== null && _a !== void 0 ? _a : value.ref; ++ let vs = this._values[prefix]; ++ if (vs) { ++ const _name = vs.get(valueKey); ++ if (_name) ++ return _name; ++ } ++ else { ++ vs = this._values[prefix] = new Map(); ++ } ++ vs.set(valueKey, name); ++ const s = this._scope[prefix] || (this._scope[prefix] = []); ++ const itemIndex = s.length; ++ s[itemIndex] = value.ref; ++ name.setValue(value, { property: prefix, itemIndex }); ++ return name; ++ } ++ getValue(prefix, keyOrRef) { ++ const vs = this._values[prefix]; ++ if (!vs) ++ return; ++ return vs.get(keyOrRef); ++ } ++ scopeRefs(scopeName, values = this._values) { ++ return this._reduceValues(values, (name) => { ++ if (name.scopePath === undefined) ++ throw new Error(`CodeGen: name "${name}" has no value`); ++ return code_1._ `${scopeName}${name.scopePath}`; ++ }); ++ } ++ scopeCode(values = this._values, usedValues, getCode) { ++ return this._reduceValues(values, (name) => { ++ if (name.value === undefined) ++ throw new Error(`CodeGen: name "${name}" has no value`); ++ return name.value.code; ++ }, usedValues, getCode); ++ } ++ _reduceValues(values, valueCode, usedValues = {}, getCode) { ++ let code = code_1.nil; ++ for (const prefix in values) { ++ const vs = values[prefix]; ++ if (!vs) ++ continue; ++ const nameSet = (usedValues[prefix] = usedValues[prefix] || new Map()); ++ vs.forEach((name) => { ++ if (nameSet.has(name)) ++ return; ++ nameSet.set(name, UsedValueState.Started); ++ let c = valueCode(name); ++ if (c) { ++ const def = this.opts.es5 ? exports.varKinds.var : exports.varKinds.const; ++ code = code_1._ `${code}${def} ${name} = ${c};${this.opts._n}`; ++ } ++ else if ((c = getCode === null || getCode === void 0 ? void 0 : getCode(name))) { ++ code = code_1._ `${code}${c}${this.opts._n}`; ++ } ++ else { ++ throw new ValueError(name); ++ } ++ nameSet.set(name, UsedValueState.Completed); ++ }); ++ } ++ return code; ++ } ++} ++exports.ValueScope = ValueScope; ++//# sourceMappingURL=scope.js.map ++}, ++"wvyth804TQ+xl66bjWSR/vXfYfkjeb4J0piqD77QQGw=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.reportTypeError = exports.checkDataTypes = exports.checkDataType = exports.coerceAndCheckDataType = exports.getJSONTypes = exports.getSchemaTypes = exports.DataType = void 0; ++const rules_1 = require("../rules"); ++const applicability_1 = require("./applicability"); ++const errors_1 = require("../errors"); ++const codegen_1 = require("../codegen"); ++const util_1 = require("../util"); ++var DataType; ++(function (DataType) { ++ DataType[DataType["Correct"] = 0] = "Correct"; ++ DataType[DataType["Wrong"] = 1] = "Wrong"; ++})(DataType = exports.DataType || (exports.DataType = {})); ++function getSchemaTypes(schema) { ++ const types = getJSONTypes(schema.type); ++ const hasNull = types.includes("null"); ++ if (hasNull) { ++ if (schema.nullable === false) ++ throw new Error("type: null contradicts nullable: false"); ++ } ++ else { ++ if (!types.length && schema.nullable !== undefined) { ++ throw new Error('"nullable" cannot be used without "type"'); ++ } ++ if (schema.nullable === true) ++ types.push("null"); ++ } ++ return types; ++} ++exports.getSchemaTypes = getSchemaTypes; ++function getJSONTypes(ts) { ++ const types = Array.isArray(ts) ? ts : ts ? [ts] : []; ++ if (types.every(rules_1.isJSONType)) ++ return types; ++ throw new Error("type must be JSONType or JSONType[]: " + types.join(",")); ++} ++exports.getJSONTypes = getJSONTypes; ++function coerceAndCheckDataType(it, types) { ++ const { gen, data, opts } = it; ++ const coerceTo = coerceToTypes(types, opts.coerceTypes); ++ const checkTypes = types.length > 0 && ++ !(coerceTo.length === 0 && types.length === 1 && applicability_1.schemaHasRulesForType(it, types[0])); ++ if (checkTypes) { ++ const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong); ++ gen.if(wrongType, () => { ++ if (coerceTo.length) ++ coerceData(it, types, coerceTo); ++ else ++ reportTypeError(it); ++ }); ++ } ++ return checkTypes; ++} ++exports.coerceAndCheckDataType = coerceAndCheckDataType; ++const COERCIBLE = new Set(["string", "number", "integer", "boolean", "null"]); ++function coerceToTypes(types, coerceTypes) { ++ return coerceTypes ++ ? types.filter((t) => COERCIBLE.has(t) || (coerceTypes === "array" && t === "array")) ++ : []; ++} ++function coerceData(it, types, coerceTo) { ++ const { gen, data, opts } = it; ++ const dataType = gen.let("dataType", codegen_1._ `typeof ${data}`); ++ const coerced = gen.let("coerced", codegen_1._ `undefined`); ++ if (opts.coerceTypes === "array") { ++ gen.if(codegen_1._ `${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () => gen ++ .assign(data, codegen_1._ `${data}[0]`) ++ .assign(dataType, codegen_1._ `typeof ${data}`) ++ .if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))); ++ } ++ gen.if(codegen_1._ `${coerced} !== undefined`); ++ for (const t of coerceTo) { ++ if (COERCIBLE.has(t) || (t === "array" && opts.coerceTypes === "array")) { ++ coerceSpecificType(t); ++ } ++ } ++ gen.else(); ++ reportTypeError(it); ++ gen.endIf(); ++ gen.if(codegen_1._ `${coerced} !== undefined`, () => { ++ gen.assign(data, coerced); ++ assignParentData(it, coerced); ++ }); ++ function coerceSpecificType(t) { ++ switch (t) { ++ case "string": ++ gen ++ .elseIf(codegen_1._ `${dataType} == "number" || ${dataType} == "boolean"`) ++ .assign(coerced, codegen_1._ `"" + ${data}`) ++ .elseIf(codegen_1._ `${data} === null`) ++ .assign(coerced, codegen_1._ `""`); ++ return; ++ case "number": ++ gen ++ .elseIf(codegen_1._ `${dataType} == "boolean" || ${data} === null ++ || (${dataType} == "string" && ${data} && ${data} == +${data})`) ++ .assign(coerced, codegen_1._ `+${data}`); ++ return; ++ case "integer": ++ gen ++ .elseIf(codegen_1._ `${dataType} === "boolean" || ${data} === null ++ || (${dataType} === "string" && ${data} && ${data} == +${data} && !(${data} % 1))`) ++ .assign(coerced, codegen_1._ `+${data}`); ++ return; ++ case "boolean": ++ gen ++ .elseIf(codegen_1._ `${data} === "false" || ${data} === 0 || ${data} === null`) ++ .assign(coerced, false) ++ .elseIf(codegen_1._ `${data} === "true" || ${data} === 1`) ++ .assign(coerced, true); ++ return; ++ case "null": ++ gen.elseIf(codegen_1._ `${data} === "" || ${data} === 0 || ${data} === false`); ++ gen.assign(coerced, null); ++ return; ++ case "array": ++ gen ++ .elseIf(codegen_1._ `${dataType} === "string" || ${dataType} === "number" ++ || ${dataType} === "boolean" || ${data} === null`) ++ .assign(coerced, codegen_1._ `[${data}]`); ++ } ++ } ++} ++function assignParentData({ gen, parentData, parentDataProperty }, expr) { ++ // TODO use gen.property ++ gen.if(codegen_1._ `${parentData} !== undefined`, () => gen.assign(codegen_1._ `${parentData}[${parentDataProperty}]`, expr)); ++} ++function checkDataType(dataType, data, strictNums, correct = DataType.Correct) { ++ const EQ = correct === DataType.Correct ? codegen_1.operators.EQ : codegen_1.operators.NEQ; ++ let cond; ++ switch (dataType) { ++ case "null": ++ return codegen_1._ `${data} ${EQ} null`; ++ case "array": ++ cond = codegen_1._ `Array.isArray(${data})`; ++ break; ++ case "object": ++ cond = codegen_1._ `${data} && typeof ${data} == "object" && !Array.isArray(${data})`; ++ break; ++ case "integer": ++ cond = numCond(codegen_1._ `!(${data} % 1) && !isNaN(${data})`); ++ break; ++ case "number": ++ cond = numCond(); ++ break; ++ default: ++ return codegen_1._ `typeof ${data} ${EQ} ${dataType}`; ++ } ++ return correct === DataType.Correct ? cond : codegen_1.not(cond); ++ function numCond(_cond = codegen_1.nil) { ++ return codegen_1.and(codegen_1._ `typeof ${data} == "number"`, _cond, strictNums ? codegen_1._ `isFinite(${data})` : codegen_1.nil); ++ } ++} ++exports.checkDataType = checkDataType; ++function checkDataTypes(dataTypes, data, strictNums, correct) { ++ if (dataTypes.length === 1) { ++ return checkDataType(dataTypes[0], data, strictNums, correct); ++ } ++ let cond; ++ const types = util_1.toHash(dataTypes); ++ if (types.array && types.object) { ++ const notObj = codegen_1._ `typeof ${data} != "object"`; ++ cond = types.null ? notObj : codegen_1._ `!${data} || ${notObj}`; ++ delete types.null; ++ delete types.array; ++ delete types.object; ++ } ++ else { ++ cond = codegen_1.nil; ++ } ++ if (types.number) ++ delete types.integer; ++ for (const t in types) ++ cond = codegen_1.and(cond, checkDataType(t, data, strictNums, correct)); ++ return cond; ++} ++exports.checkDataTypes = checkDataTypes; ++const typeError = { ++ message: ({ schema }) => `must be ${schema}`, ++ params: ({ schema, schemaValue }) => typeof schema == "string" ? codegen_1._ `{type: ${schema}}` : codegen_1._ `{type: ${schemaValue}}`, ++}; ++function reportTypeError(it) { ++ const cxt = getTypeErrorContext(it); ++ errors_1.reportError(cxt, typeError); ++} ++exports.reportTypeError = reportTypeError; ++function getTypeErrorContext(it) { ++ const { gen, data, schema } = it; ++ const schemaCode = util_1.schemaRefOrVal(it, schema, "type"); ++ return { ++ gen, ++ keyword: "type", ++ data, ++ schema: schema.type, ++ schemaCode, ++ schemaValue: schemaCode, ++ parentSchema: schema, ++ params: {}, ++ it, ++ }; ++} ++//# sourceMappingURL=dataType.js.map ++}, ++"x+A/u5vBUo6haBwkM61z0kGwI8YgCnsT+mPsCDuB4Bc=": ++function (require, module, exports, __dirname, __filename) { ++const SemVer = require('../classes/semver') ++const major = (a, loose) => new SemVer(a, loose).major ++module.exports = major ++ ++}, ++"x/SkehJa8L2GBEPf1x0vQS0al9y1OrcDgYnWO5HcMr0=": ++function (require, module, exports, __dirname, __filename) { ++/* -*- Mode: js; js-indent-level: 2; -*- */ ++/* ++ * Copyright 2011 Mozilla Foundation and contributors ++ * Licensed under the New BSD license. See LICENSE or: ++ * http://opensource.org/licenses/BSD-3-Clause ++ */ ++ ++exports.GREATEST_LOWER_BOUND = 1; ++exports.LEAST_UPPER_BOUND = 2; ++ ++/** ++ * Recursive implementation of binary search. ++ * ++ * @param aLow Indices here and lower do not contain the needle. ++ * @param aHigh Indices here and higher do not contain the needle. ++ * @param aNeedle The element being searched for. ++ * @param aHaystack The non-empty array being searched. ++ * @param aCompare Function which takes two elements and returns -1, 0, or 1. ++ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or ++ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the ++ * closest element that is smaller than or greater than the one we are ++ * searching for, respectively, if the exact element cannot be found. ++ */ ++function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { ++ // This function terminates when one of the following is true: ++ // ++ // 1. We find the exact element we are looking for. ++ // ++ // 2. We did not find the exact element, but we can return the index of ++ // the next-closest element. ++ // ++ // 3. We did not find the exact element, and there is no next-closest ++ // element than the one we are searching for, so we return -1. ++ var mid = Math.floor((aHigh - aLow) / 2) + aLow; ++ var cmp = aCompare(aNeedle, aHaystack[mid], true); ++ if (cmp === 0) { ++ // Found the element we are looking for. ++ return mid; ++ } ++ else if (cmp > 0) { ++ // Our needle is greater than aHaystack[mid]. ++ if (aHigh - mid > 1) { ++ // The element is in the upper half. ++ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); ++ } ++ ++ // The exact needle element was not found in this haystack. Determine if ++ // we are in termination case (3) or (2) and return the appropriate thing. ++ if (aBias == exports.LEAST_UPPER_BOUND) { ++ return aHigh < aHaystack.length ? aHigh : -1; ++ } else { ++ return mid; ++ } ++ } ++ else { ++ // Our needle is less than aHaystack[mid]. ++ if (mid - aLow > 1) { ++ // The element is in the lower half. ++ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); ++ } ++ ++ // we are in termination case (3) or (2) and return the appropriate thing. ++ if (aBias == exports.LEAST_UPPER_BOUND) { ++ return mid; ++ } else { ++ return aLow < 0 ? -1 : aLow; ++ } ++ } ++} ++ ++/** ++ * This is an implementation of binary search which will always try and return ++ * the index of the closest element if there is no exact hit. This is because ++ * mappings between original and generated line/col pairs are single points, ++ * and there is an implicit region between each of them, so a miss just means ++ * that you aren't on the very start of a region. ++ * ++ * @param aNeedle The element you are looking for. ++ * @param aHaystack The array that is being searched. ++ * @param aCompare A function which takes the needle and an element in the ++ * array and returns -1, 0, or 1 depending on whether the needle is less ++ * than, equal to, or greater than the element, respectively. ++ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or ++ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the ++ * closest element that is smaller than or greater than the one we are ++ * searching for, respectively, if the exact element cannot be found. ++ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. ++ */ ++exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { ++ if (aHaystack.length === 0) { ++ return -1; ++ } ++ ++ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, ++ aCompare, aBias || exports.GREATEST_LOWER_BOUND); ++ if (index < 0) { ++ return -1; ++ } ++ ++ // We have found either the exact element, or the next-closest element than ++ // the one we are searching for. However, there may be more than one such ++ // element. Make sure we always return the smallest of these. ++ while (index - 1 >= 0) { ++ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { ++ break; ++ } ++ --index; ++ } ++ ++ return index; ++}; ++ ++}, ++"x0iMaqNlst14z89o06Dn5qILdB4SVT1ZLCwHt7tYY3s=": ++function (require, module, exports, __dirname, __filename) { ++var xtend = require('xtend') ++var supports = require('level-supports') ++var Buffer = require('buffer').Buffer ++var AbstractIterator = require('./abstract-iterator') ++var AbstractChainedBatch = require('./abstract-chained-batch') ++var nextTick = require('./next-tick') ++var hasOwnProperty = Object.prototype.hasOwnProperty ++var rangeOptions = 'start end gt gte lt lte'.split(' ') ++ ++function AbstractLevelDOWN (manifest) { ++ this.status = 'new' ++ ++ // TODO (next major): make this mandatory ++ this.supports = supports(manifest, { ++ status: true ++ }) ++} ++ ++AbstractLevelDOWN.prototype.open = function (options, callback) { ++ var self = this ++ var oldStatus = this.status ++ ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('open() requires a callback argument') ++ } ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ options.createIfMissing = options.createIfMissing !== false ++ options.errorIfExists = !!options.errorIfExists ++ ++ this.status = 'opening' ++ this._open(options, function (err) { ++ if (err) { ++ self.status = oldStatus ++ return callback(err) ++ } ++ self.status = 'open' ++ callback() ++ }) ++} ++ ++AbstractLevelDOWN.prototype._open = function (options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.close = function (callback) { ++ var self = this ++ var oldStatus = this.status ++ ++ if (typeof callback !== 'function') { ++ throw new Error('close() requires a callback argument') ++ } ++ ++ this.status = 'closing' ++ this._close(function (err) { ++ if (err) { ++ self.status = oldStatus ++ return callback(err) ++ } ++ self.status = 'closed' ++ callback() ++ }) ++} ++ ++AbstractLevelDOWN.prototype._close = function (callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.get = function (key, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('get() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ options.asBuffer = options.asBuffer !== false ++ ++ this._get(key, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._get = function (key, options, callback) { ++ nextTick(function () { callback(new Error('NotFound')) }) ++} ++ ++AbstractLevelDOWN.prototype.put = function (key, value, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('put() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) || this._checkValue(value) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ value = this._serializeValue(value) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ this._put(key, value, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._put = function (key, value, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.del = function (key, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('del() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ this._del(key, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._del = function (key, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.batch = function (array, options, callback) { ++ if (!arguments.length) return this._chainedBatch() ++ ++ if (typeof options === 'function') callback = options ++ ++ if (typeof array === 'function') callback = array ++ ++ if (typeof callback !== 'function') { ++ throw new Error('batch(array) requires a callback argument') ++ } ++ ++ if (!Array.isArray(array)) { ++ return nextTick(callback, new Error('batch(array) requires an array argument')) ++ } ++ ++ if (array.length === 0) { ++ return nextTick(callback) ++ } ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ var serialized = new Array(array.length) ++ ++ for (var i = 0; i < array.length; i++) { ++ if (typeof array[i] !== 'object' || array[i] === null) { ++ return nextTick(callback, new Error('batch(array) element must be an object and not `null`')) ++ } ++ ++ var e = xtend(array[i]) ++ ++ if (e.type !== 'put' && e.type !== 'del') { ++ return nextTick(callback, new Error("`type` must be 'put' or 'del'")) ++ } ++ ++ var err = this._checkKey(e.key) ++ if (err) return nextTick(callback, err) ++ ++ e.key = this._serializeKey(e.key) ++ ++ if (e.type === 'put') { ++ var valueErr = this._checkValue(e.value) ++ if (valueErr) return nextTick(callback, valueErr) ++ ++ e.value = this._serializeValue(e.value) ++ } ++ ++ serialized[i] = e ++ } ++ ++ this._batch(serialized, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._batch = function (array, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.clear = function (options, callback) { ++ if (typeof options === 'function') { ++ callback = options ++ } else if (typeof callback !== 'function') { ++ throw new Error('clear() requires a callback argument') ++ } ++ ++ options = cleanRangeOptions(this, options) ++ options.reverse = !!options.reverse ++ options.limit = 'limit' in options ? options.limit : -1 ++ ++ this._clear(options, callback) ++} ++ ++AbstractLevelDOWN.prototype._clear = function (options, callback) { ++ // Avoid setupIteratorOptions, would serialize range options a second time. ++ options.keys = true ++ options.values = false ++ options.keyAsBuffer = true ++ options.valueAsBuffer = true ++ ++ var iterator = this._iterator(options) ++ var emptyOptions = {} ++ var self = this ++ ++ var next = function (err) { ++ if (err) { ++ return iterator.end(function () { ++ callback(err) ++ }) ++ } ++ ++ iterator.next(function (err, key) { ++ if (err) return next(err) ++ if (key === undefined) return iterator.end(callback) ++ ++ // This could be optimized by using a batch, but the default _clear ++ // is not meant to be fast. Implementations have more room to optimize ++ // if they override _clear. Note: using _del bypasses key serialization. ++ self._del(key, emptyOptions, next) ++ }) ++ } ++ ++ next() ++} ++ ++AbstractLevelDOWN.prototype._setupIteratorOptions = function (options) { ++ options = cleanRangeOptions(this, options) ++ ++ options.reverse = !!options.reverse ++ options.keys = options.keys !== false ++ options.values = options.values !== false ++ options.limit = 'limit' in options ? options.limit : -1 ++ options.keyAsBuffer = options.keyAsBuffer !== false ++ options.valueAsBuffer = options.valueAsBuffer !== false ++ ++ return options ++} ++ ++function cleanRangeOptions (db, options) { ++ var result = {} ++ ++ for (var k in options) { ++ if (!hasOwnProperty.call(options, k)) continue ++ ++ var opt = options[k] ++ ++ if (isRangeOption(k)) { ++ // Note that we don't reject nullish and empty options here. While ++ // those types are invalid as keys, they are valid as range options. ++ opt = db._serializeKey(opt) ++ } ++ ++ result[k] = opt ++ } ++ ++ return result ++} ++ ++function isRangeOption (k) { ++ return rangeOptions.indexOf(k) !== -1 ++} ++ ++AbstractLevelDOWN.prototype.iterator = function (options) { ++ if (typeof options !== 'object' || options === null) options = {} ++ options = this._setupIteratorOptions(options) ++ return this._iterator(options) ++} ++ ++AbstractLevelDOWN.prototype._iterator = function (options) { ++ return new AbstractIterator(this) ++} ++ ++AbstractLevelDOWN.prototype._chainedBatch = function () { ++ return new AbstractChainedBatch(this) ++} ++ ++AbstractLevelDOWN.prototype._serializeKey = function (key) { ++ return key ++} ++ ++AbstractLevelDOWN.prototype._serializeValue = function (value) { ++ return value ++} ++ ++AbstractLevelDOWN.prototype._checkKey = function (key) { ++ if (key === null || key === undefined) { ++ return new Error('key cannot be `null` or `undefined`') ++ } else if (Buffer.isBuffer(key) && key.length === 0) { ++ return new Error('key cannot be an empty Buffer') ++ } else if (key === '') { ++ return new Error('key cannot be an empty String') ++ } else if (Array.isArray(key) && key.length === 0) { ++ return new Error('key cannot be an empty Array') ++ } ++} ++ ++AbstractLevelDOWN.prototype._checkValue = function (value) { ++ if (value === null || value === undefined) { ++ return new Error('value cannot be `null` or `undefined`') ++ } ++} ++ ++// Expose browser-compatible nextTick for dependents ++AbstractLevelDOWN.prototype._nextTick = nextTick ++ ++module.exports = AbstractLevelDOWN ++ ++}, ++"xFF+R8b+MP+Rm1ZL733UushOGL/LNh7c2l4FkopkydU=": ++function (require, module, exports, __dirname, __filename) { ++var flat = require('flat-tree') ++var bitfield = require('sparse-bitfield') ++ ++module.exports = TreeIndex ++ ++function TreeIndex (bits) { ++ if (!(this instanceof TreeIndex)) return new TreeIndex(bits) ++ this.bitfield = bits || bitfield() ++} ++ ++TreeIndex.prototype.proof = function (index, opts) { ++ if (!opts) opts = {} ++ ++ var nodes = [] ++ var remoteTree = opts.tree || new TreeIndex() ++ var digest = opts.digest || 0 ++ ++ if (!this.get(index)) return null ++ if (opts.hash) nodes.push(index) // always return hash - no matter what the digest says ++ if (digest === 1) return {nodes: nodes, verifiedBy: 0} ++ ++ var roots = null ++ var sibling = index ++ var next = index ++ var hasRoot = digest & 1 ++ digest = rightShift(digest) ++ ++ while (digest) { ++ if (digest === 1 && hasRoot) { ++ if (this.get(next)) remoteTree.set(next) ++ ++ // having a root implies having prev roots as well ++ // TODO: this can be optimized away be only sending "newer" roots, ++ // when sending roots ++ if (flat.sibling(next) < next) next = flat.sibling(next) ++ roots = flat.fullRoots(flat.rightSpan(next) + 2) ++ for (var i = 0; i < roots.length; i++) { ++ if (this.get(roots[i])) remoteTree.set(roots[i]) ++ } ++ break ++ } ++ ++ sibling = flat.sibling(next) ++ if (digest & 1) { ++ if (this.get(sibling)) remoteTree.set(sibling) ++ } ++ next = flat.parent(next) ++ digest = rightShift(digest) ++ } ++ ++ next = index ++ ++ while (!remoteTree.get(next)) { ++ sibling = flat.sibling(next) ++ if (!this.get(sibling)) { ++ // next is a local root ++ var verifiedBy = this.verifiedBy(next) ++ addFullRoots(verifiedBy, nodes, next, remoteTree) ++ return {nodes: nodes, verifiedBy: verifiedBy} ++ } else { ++ if (!remoteTree.get(sibling)) nodes.push(sibling) ++ } ++ ++ next = flat.parent(next) ++ } ++ ++ return {nodes: nodes, verifiedBy: 0} ++} ++ ++TreeIndex.prototype.digest = function (index) { ++ if (this.get(index)) return 1 ++ ++ var digest = 0 ++ var next = flat.sibling(index) ++ var max = Math.max(next + 2, this.bitfield.length) // TODO: make this less ... hacky ++ ++ var bit = 2 ++ var depth = flat.depth(index) ++ var parent = flat.parent(next, depth++) ++ ++ while (flat.rightSpan(next) < max || flat.leftSpan(parent) > 0) { ++ if (this.get(next)) { ++ digest += bit // + cause in this case it's the same as | but works for large nums ++ } ++ if (this.get(parent)) { ++ digest += 2 * bit ++ if (!(digest & 1)) digest += 1 ++ if (digest + 1 === 4 * bit) return 1 ++ return digest ++ } ++ next = flat.sibling(parent) ++ parent = flat.parent(next, depth++) ++ bit *= 2 ++ } ++ ++ return digest ++} ++ ++TreeIndex.prototype.blocks = function () { ++ var top = 0 ++ var next = 0 ++ var max = this.bitfield.length ++ ++ while (flat.rightSpan(next) < max) { ++ next = flat.parent(next) ++ if (this.get(next)) top = next ++ } ++ ++ return (this.get(top) ? this.verifiedBy(top) : 0) / 2 ++} ++ ++TreeIndex.prototype.roots = function () { ++ return flat.fullRoots(2 * this.blocks()) ++} ++ ++TreeIndex.prototype.verifiedBy = function (index, nodes) { ++ var hasIndex = this.get(index) ++ if (!hasIndex) return 0 ++ ++ // find root of current tree ++ ++ var depth = flat.depth(index) ++ var top = index ++ var parent = flat.parent(top, depth++) ++ while (this.get(parent) && this.get(flat.sibling(top))) { ++ top = parent ++ parent = flat.parent(top, depth++) ++ } ++ ++ // expand right down ++ ++ depth-- ++ while (depth) { ++ top = flat.leftChild(flat.index(depth, flat.offset(top, depth) + 1), depth) ++ depth-- ++ ++ while (!this.get(top) && depth) top = flat.leftChild(top, depth--) ++ if (nodes && this.get(top)) nodes.push(top) ++ } ++ ++ return this.get(top) ? top + 2 : top ++} ++ ++TreeIndex.prototype.get = function (index) { ++ return this.bitfield.get(index) ++} ++ ++TreeIndex.prototype.set = function (index) { ++ if (!this.bitfield.set(index, true)) return false ++ while (this.bitfield.get(flat.sibling(index))) { ++ index = flat.parent(index) ++ if (!this.bitfield.set(index, true)) break ++ } ++ return true ++} ++ ++function rightShift (n) { ++ return (n - (n & 1)) / 2 ++} ++ ++function addFullRoots (verifiedBy, nodes, root, remoteTree) { ++ var roots = flat.fullRoots(verifiedBy) ++ for (var i = 0; i < roots.length; i++) { ++ if (roots[i] !== root && !remoteTree.get(roots[i])) nodes.push(roots[i]) ++ } ++} ++ ++}, ++"xQjahSzoz5R/vvL/rYa08HUZSv8hBEAKNYzUgT30m5w=": ++function (require, module, exports, __dirname, __filename) { ++'use strict' ++function tryStringify (o) { ++ try { return JSON.stringify(o) } catch(e) { return '"[Circular]"' } ++} ++ ++module.exports = format ++ ++function format(f, args, opts) { ++ var ss = (opts && opts.stringify) || tryStringify ++ var offset = 1 ++ if (typeof f === 'object' && f !== null) { ++ var len = args.length + offset ++ if (len === 1) return f ++ var objects = new Array(len) ++ objects[0] = ss(f) ++ for (var index = 1; index < len; index++) { ++ objects[index] = ss(args[index]) ++ } ++ return objects.join(' ') ++ } ++ if (typeof f !== 'string') { ++ return f ++ } ++ var argLen = args.length ++ if (argLen === 0) return f ++ var str = '' ++ var a = 1 - offset ++ var lastPos = -1 ++ var flen = (f && f.length) || 0 ++ for (var i = 0; i < flen;) { ++ if (f.charCodeAt(i) === 37 && i + 1 < flen) { ++ lastPos = lastPos > -1 ? lastPos : 0 ++ switch (f.charCodeAt(i + 1)) { ++ case 100: // 'd' ++ case 102: // 'f' ++ if (a >= argLen) ++ break ++ if (lastPos < i) ++ str += f.slice(lastPos, i) ++ if (args[a] == null) break ++ str += Number(args[a]) ++ lastPos = i = i + 2 ++ break ++ case 105: // 'i' ++ if (a >= argLen) ++ break ++ if (lastPos < i) ++ str += f.slice(lastPos, i) ++ if (args[a] == null) break ++ str += Math.floor(Number(args[a])) ++ lastPos = i = i + 2 ++ break ++ case 79: // 'O' ++ case 111: // 'o' ++ case 106: // 'j' ++ if (a >= argLen) ++ break ++ if (lastPos < i) ++ str += f.slice(lastPos, i) ++ if (args[a] === undefined) break ++ var type = typeof args[a] ++ if (type === 'string') { ++ str += '\'' + args[a] + '\'' ++ lastPos = i + 2 ++ i++ ++ break ++ } ++ if (type === 'function') { ++ str += args[a].name || '' ++ lastPos = i + 2 ++ i++ ++ break ++ } ++ str += ss(args[a]) ++ lastPos = i + 2 ++ i++ ++ break ++ case 115: // 's' ++ if (a >= argLen) ++ break ++ if (lastPos < i) ++ str += f.slice(lastPos, i) ++ str += String(args[a]) ++ lastPos = i + 2 ++ i++ ++ break ++ case 37: // '%' ++ if (lastPos < i) ++ str += f.slice(lastPos, i) ++ str += '%' ++ lastPos = i + 2 ++ i++ ++ a-- ++ break ++ } ++ ++a ++ } ++ ++i ++ } ++ if (lastPos === -1) ++ return f ++ else if (lastPos < flen) { ++ str += f.slice(lastPos) ++ } ++ ++ return str ++} ++ ++}, ++"xRDY2rTel8H0YNVOp5AUwoOEFiUUjcUAc5gTAABd1C0=": ++function (require, module, exports, __dirname, __filename) { ++var isES5 = (function(){ ++ "use strict"; ++ return this === undefined; ++})(); ++ ++if (isES5) { ++ module.exports = { ++ freeze: Object.freeze, ++ defineProperty: Object.defineProperty, ++ getDescriptor: Object.getOwnPropertyDescriptor, ++ keys: Object.keys, ++ names: Object.getOwnPropertyNames, ++ getPrototypeOf: Object.getPrototypeOf, ++ isArray: Array.isArray, ++ isES5: isES5, ++ propertyIsWritable: function(obj, prop) { ++ var descriptor = Object.getOwnPropertyDescriptor(obj, prop); ++ return !!(!descriptor || descriptor.writable || descriptor.set); ++ } ++ }; ++} else { ++ var has = {}.hasOwnProperty; ++ var str = {}.toString; ++ var proto = {}.constructor.prototype; ++ ++ var ObjectKeys = function (o) { ++ var ret = []; ++ for (var key in o) { ++ if (has.call(o, key)) { ++ ret.push(key); ++ } ++ } ++ return ret; ++ }; ++ ++ var ObjectGetDescriptor = function(o, key) { ++ return {value: o[key]}; ++ }; ++ ++ var ObjectDefineProperty = function (o, key, desc) { ++ o[key] = desc.value; ++ return o; ++ }; ++ ++ var ObjectFreeze = function (obj) { ++ return obj; ++ }; ++ ++ var ObjectGetPrototypeOf = function (obj) { ++ try { ++ return Object(obj).constructor.prototype; ++ } ++ catch (e) { ++ return proto; ++ } ++ }; ++ ++ var ArrayIsArray = function (obj) { ++ try { ++ return str.call(obj) === "[object Array]"; ++ } ++ catch(e) { ++ return false; ++ } ++ }; ++ ++ module.exports = { ++ isArray: ArrayIsArray, ++ keys: ObjectKeys, ++ names: ObjectKeys, ++ defineProperty: ObjectDefineProperty, ++ getDescriptor: ObjectGetDescriptor, ++ freeze: ObjectFreeze, ++ getPrototypeOf: ObjectGetPrototypeOf, ++ isES5: isES5, ++ propertyIsWritable: function() { ++ return true; ++ } ++ }; ++} ++ ++}, ++"xSdr936z5i/OFskqSwZqEOrVlRDoJLkBX8Ln3eRHJhY=": ++function (require, module, exports, __dirname, __filename) { ++module.exports = function (work) { ++ var pending = null ++ var callback = null ++ var callbacks = null ++ var next = null ++ ++ return function (val, cb) { ++ next = val ++ update(cb || noop) ++ } ++ ++ function update (cb) { ++ if (callback) { ++ if (!pending) pending = [] ++ pending.push(cb) ++ return ++ } ++ ++ var val = next ++ next = null ++ callback = cb ++ work(val, done) ++ } ++ ++ function done (err) { ++ var cb = callback ++ var cbs = callbacks ++ callbacks = null ++ callback = null ++ ++ if (pending) { ++ callbacks = pending ++ pending = null ++ update(noop) ++ } ++ ++ if (cbs) { ++ for (var i = 0; i < cbs.length; i++) cbs[i](err) ++ } ++ cb(err) ++ } ++} ++ ++function noop (_) {} ++ ++}, ++"xT9nq7mah+p1AVEl5xBCcx5MtfZjL98MVaTnPNdbyz8=": ++function (require, module, exports, __dirname, __filename) { ++var Stream = require('stream') ++ ++// through ++// ++// a stream that does nothing but re-emit the input. ++// useful for aggregating a series of changing but not ending streams into one stream) ++ ++exports = module.exports = through ++through.through = through ++ ++//create a readable writable stream. ++ ++function through (write, end, opts) { ++ write = write || function (data) { this.queue(data) } ++ end = end || function () { this.queue(null) } ++ ++ var ended = false, destroyed = false, buffer = [], _ended = false ++ var stream = new Stream() ++ stream.readable = stream.writable = true ++ stream.paused = false ++ ++// stream.autoPause = !(opts && opts.autoPause === false) ++ stream.autoDestroy = !(opts && opts.autoDestroy === false) ++ ++ stream.write = function (data) { ++ write.call(this, data) ++ return !stream.paused ++ } ++ ++ function drain() { ++ while(buffer.length && !stream.paused) { ++ var data = buffer.shift() ++ if(null === data) ++ return stream.emit('end') ++ else ++ stream.emit('data', data) ++ } ++ } ++ ++ stream.queue = stream.push = function (data) { ++// console.error(ended) ++ if(_ended) return stream ++ if(data === null) _ended = true ++ buffer.push(data) ++ drain() ++ return stream ++ } ++ ++ //this will be registered as the first 'end' listener ++ //must call destroy next tick, to make sure we're after any ++ //stream piped from here. ++ //this is only a problem if end is not emitted synchronously. ++ //a nicer way to do this is to make sure this is the last listener for 'end' ++ ++ stream.on('end', function () { ++ stream.readable = false ++ if(!stream.writable && stream.autoDestroy) ++ process.nextTick(function () { ++ stream.destroy() ++ }) ++ }) ++ ++ function _end () { ++ stream.writable = false ++ end.call(stream) ++ if(!stream.readable && stream.autoDestroy) ++ stream.destroy() ++ } ++ ++ stream.end = function (data) { ++ if(ended) return ++ ended = true ++ if(arguments.length) stream.write(data) ++ _end() // will emit or queue ++ return stream ++ } ++ ++ stream.destroy = function () { ++ if(destroyed) return ++ destroyed = true ++ ended = true ++ buffer.length = 0 ++ stream.writable = stream.readable = false ++ stream.emit('close') ++ return stream ++ } ++ ++ stream.pause = function () { ++ if(stream.paused) return ++ stream.paused = true ++ return stream ++ } ++ ++ stream.resume = function () { ++ if(stream.paused) { ++ stream.paused = false ++ stream.emit('resume') ++ } ++ drain() ++ //may have become paused again, ++ //as drain emits 'data'. ++ if(!stream.paused) ++ stream.emit('drain') ++ return stream ++ } ++ return stream ++} ++ ++ ++}, ++"xceavwV0ID6njdGtXmYY/8GIPVCMhk0B97D4W0D+2OA=": ++function (require, module, exports, __dirname, __filename) { ++var uint64be = require('uint64be') ++var flat = require('flat-tree') ++var alru = require('array-lru') ++var bufferAlloc = require('buffer-alloc-unsafe') ++var bufferAllocSafe = require('buffer-alloc') ++ ++module.exports = Storage ++ ++var noarr = [] ++ ++function Storage (create, cacheSize) { ++ if (!(this instanceof Storage)) return new Storage(create, cacheSize) ++ cacheSize = typeof cacheSize === 'undefined' ? 65536 : cacheSize ++ ++ this.cache = cacheSize > 0 ? alru(cacheSize, {indexedValues: true}) : null ++ this.key = null ++ this.secretKey = null ++ this.tree = null ++ this.data = null ++ this.bitfield = null ++ this.signatures = null ++ this.create = create ++} ++ ++Storage.prototype.putData = function (index, data, nodes, cb) { ++ if (!cb) cb = noop ++ var self = this ++ if (!data.length) return cb(null) ++ this.dataOffset(index, nodes, function (err, offset, size) { ++ if (err) return cb(err) ++ if (size !== data.length) return cb(new Error('Unexpected data size')) ++ self.data.write(offset, data, cb) ++ }) ++} ++ ++Storage.prototype.getData = function (index, cb) { ++ var self = this ++ this.dataOffset(index, noarr, function (err, offset, size) { ++ if (err) return cb(err) ++ self.data.read(offset, size, cb) ++ }) ++} ++ ++Storage.prototype.nextSignature = function (index, cb) { ++ var self = this ++ ++ this._getSignature(index, function (err, signature) { ++ if (err) return cb(err) ++ if (isBlank(signature)) return self.nextSignature(index + 1, cb) ++ cb(null, { index: index, signature: signature }) ++ }) ++} ++ ++Storage.prototype.getSignature = function (index, cb) { ++ this._getSignature(index, function (err, signature) { ++ if (err) return cb(err) ++ if (isBlank(signature)) return cb(new Error('No signature found')) ++ cb(null, signature) ++ }) ++} ++ ++Storage.prototype._getSignature = function (index, cb) { ++ this.signatures.read(32 + 64 * index, 64, cb) ++} ++ ++Storage.prototype.putSignature = function (index, signature, cb) { ++ this.signatures.write(32 + 64 * index, signature, cb) ++} ++ ++Storage.prototype.dataOffset = function (index, cachedNodes, cb) { ++ var roots = flat.fullRoots(2 * index) ++ var self = this ++ var offset = 0 ++ var pending = roots.length ++ var error = null ++ var blk = 2 * index ++ ++ if (!pending) { ++ pending = 1 ++ onnode(null, null) ++ return ++ } ++ ++ for (var i = 0; i < roots.length; i++) { ++ var node = findNode(cachedNodes, roots[i]) ++ if (node) onnode(null, node) ++ else this.getNode(roots[i], onnode) ++ } ++ ++ function onlast (err, node) { ++ if (err) return cb(err) ++ cb(null, offset, node.size) ++ } ++ ++ function onnode (err, node) { ++ if (err) error = err ++ if (node) offset += node.size ++ if (--pending) return ++ ++ if (error) return cb(error) ++ ++ var last = findNode(cachedNodes, blk) ++ if (last) onlast(null, last) ++ else self.getNode(blk, onlast) ++ } ++} ++ ++Storage.prototype.getDataBatch = function (start, n, cb) { ++ var result = new Array(n) ++ var sizes = new Array(n) ++ var self = this ++ ++ this.dataOffset(start, noarr, function (err, offset, size) { ++ if (err) return cb(err) ++ ++ start++ ++ n-- ++ ++ if (n <= 0) return ontree(null, null) ++ self.tree.read(32 + 80 * start, 80 * n - 40, ontree) ++ ++ function ontree (err, buf) { ++ if (err) return cb(err) ++ ++ var total = sizes[0] = size ++ ++ if (buf) { ++ for (var i = 1; i < sizes.length; i++) { ++ sizes[i] = uint64be.decode(buf, 32 + (i - 1) * 80) ++ total += sizes[i] ++ } ++ } ++ ++ self.data.read(offset, total, ondata) ++ } ++ ++ function ondata (err, buf) { ++ if (err) return cb(err) ++ var total = 0 ++ for (var i = 0; i < result.length; i++) { ++ result[i] = buf.slice(total, total += sizes[i]) ++ } ++ ++ cb(null, result) ++ } ++ }) ++} ++ ++Storage.prototype.getNode = function (index, cb) { ++ if (this.cache) { ++ var cached = this.cache.get(index) ++ if (cached) return cb(null, cached) ++ } ++ ++ var self = this ++ ++ this.tree.read(32 + 40 * index, 40, function (err, buf) { ++ if (err) return cb(err) ++ ++ var hash = buf.slice(0, 32) ++ var size = uint64be.decode(buf, 32) ++ ++ if (!size && isBlank(hash)) return cb(new Error('No node found')) ++ ++ var val = new Node(index, hash, size, null) ++ if (self.cache) self.cache.set(index, val) ++ cb(null, val) ++ }) ++} ++ ++Storage.prototype.putNodeBatch = function (index, nodes, cb) { ++ if (!cb) cb = noop ++ ++ var buf = bufferAllocSafe(nodes.length * 40) ++ ++ for (var i = 0; i < nodes.length; i++) { ++ var offset = i * 40 ++ var node = nodes[i] ++ if (!node) continue ++ node.hash.copy(buf, offset) ++ uint64be.encode(node.size, buf, 32 + offset) ++ } ++ ++ this.tree.write(32 + 40 * index, buf, cb) ++} ++ ++Storage.prototype.putNode = function (index, node, cb) { ++ if (!cb) cb = noop ++ ++ // TODO: re-enable put cache. currently this causes a memleak ++ // because node.hash is a slice of the big data buffer on replicate ++ // if (this.cache) this.cache.set(index, node) ++ ++ var buf = bufferAlloc(40) ++ ++ node.hash.copy(buf, 0) ++ uint64be.encode(node.size, buf, 32) ++ this.tree.write(32 + 40 * index, buf, cb) ++} ++ ++Storage.prototype.putBitfield = function (offset, data, cb) { ++ this.bitfield.write(32 + offset, data, cb) ++} ++ ++Storage.prototype.close = function (cb) { ++ if (!cb) cb = noop ++ var missing = 6 ++ var error = null ++ ++ close(this.bitfield, done) ++ close(this.tree, done) ++ close(this.data, done) ++ close(this.key, done) ++ close(this.secretKey, done) ++ close(this.signatures, done) ++ ++ function done (err) { ++ if (err) error = err ++ if (--missing) return ++ cb(error) ++ } ++} ++ ++Storage.prototype.openKey = function (opts, cb) { ++ if (typeof opts === 'function') return this.openKey({}, opts) ++ if (!this.key) this.key = this.create('key', opts) ++ this.key.read(0, 32, cb) ++} ++ ++Storage.prototype.open = function (opts, cb) { ++ if (typeof opts === 'function') return this.open({}, opts) ++ ++ var self = this ++ var error = null ++ var missing = 5 ++ ++ if (!this.key) this.key = this.create('key', opts) ++ if (!this.secretKey) this.secretKey = this.create('secret_key', opts) ++ if (!this.tree) this.tree = this.create('tree', opts) ++ if (!this.data) this.data = this.create('data', opts) ++ if (!this.bitfield) this.bitfield = this.create('bitfield', opts) ++ if (!this.signatures) this.signatures = this.create('signatures', opts) ++ ++ var result = { ++ bitfield: [], ++ bitfieldPageSize: 3584, // we upgraded the page size to fix a bug ++ secretKey: null, ++ key: null ++ } ++ ++ this.bitfield.read(0, 32, function (_, h) { ++ if (h) result.bitfieldPageSize = h.readUInt16BE(5) ++ self.bitfield.write(0, header(0, result.bitfieldPageSize, null), function (err) { ++ if (err) return cb(err) ++ readAll(self.bitfield, 32, result.bitfieldPageSize, function (err, pages) { ++ if (pages) result.bitfield = pages ++ done(err) ++ }) ++ }) ++ }) ++ ++ this.signatures.write(0, header(1, 64, 'Ed25519'), done) ++ this.tree.write(0, header(2, 40, 'BLAKE2b'), done) ++ ++ // TODO: Improve the error handling here. ++ // I.e. if secretKey length === 64 and it fails, error ++ ++ this.secretKey.read(0, 64, function (_, data) { ++ if (data) result.secretKey = data ++ done(null) ++ }) ++ ++ this.key.read(0, 32, function (_, data) { ++ if (data) result.key = data ++ done(null) ++ }) ++ ++ function done (err) { ++ if (err) error = err ++ if (--missing) return ++ if (error) cb(error) ++ else cb(null, result) ++ } ++} ++ ++Storage.Node = Node ++ ++function noop () {} ++ ++function header (type, size, name) { ++ var buf = bufferAlloc(32) ++ buf.fill(0) ++ ++ // magic number ++ buf[0] = 5 ++ buf[1] = 2 ++ buf[2] = 87 ++ buf[3] = type ++ ++ // version ++ buf[4] = 0 ++ ++ // block size ++ buf.writeUInt16BE(size, 5) ++ ++ if (name) { ++ // algo name ++ buf[7] = name.length ++ buf.write(name, 8) ++ } ++ ++ return buf ++} ++ ++function Node (index, hash, size) { ++ this.index = index ++ this.hash = hash ++ this.size = size ++} ++ ++function findNode (nodes, index) { ++ for (var i = 0; i < nodes.length; i++) { ++ if (nodes[i].index === index) return nodes[i] ++ } ++ return null ++} ++ ++function isBlank (buf) { ++ for (var i = 0; i < buf.length; i++) { ++ if (buf[i]) return false ++ } ++ return true ++} ++ ++function close (st, cb) { ++ if (st.close) st.close(cb) ++ else cb() ++} ++ ++function statAndReadAll (st, offset, pageSize, cb) { ++ st.stat(function (err, stat) { ++ if (err) return cb(null, []) ++ ++ var result = [] ++ ++ loop(null, null) ++ ++ function loop (err, batch) { ++ if (err) return cb(err) ++ ++ if (batch) { ++ offset += batch.length ++ for (var i = 0; i < batch.length; i += pageSize) { ++ result.push(batch.slice(i, i + pageSize)) ++ } ++ } ++ ++ var next = Math.min(stat.size - offset, 32 * pageSize) ++ if (!next) return cb(null, result) ++ ++ st.read(offset, next, loop) ++ } ++ }) ++} ++ ++function readAll (st, offset, pageSize, cb) { ++ if (st.statable === true) return statAndReadAll(st, offset, pageSize, cb) ++ ++ var bufs = [] ++ ++ st.read(offset, pageSize, loop) ++ ++ function loop (err, buf) { ++ if (err) return cb(null, bufs) ++ bufs.push(buf) ++ st.read(offset + bufs.length * pageSize, pageSize, loop) ++ } ++} ++ ++}, ++"xgj39jflA7o09CneEK3OJP/Pl+qOj5a/Azf32B0iw/o=": ++function (require, module, exports, __dirname, __filename) { ++'use strict' ++ ++const validator = require('./lib/validator') ++const parse = require('./lib/parse') ++const redactor = require('./lib/redactor') ++const restorer = require('./lib/restorer') ++const { groupRedact, nestedRedact } = require('./lib/modifiers') ++const state = require('./lib/state') ++const rx = require('./lib/rx') ++const validate = validator() ++const noop = (o) => o ++noop.restore = noop ++ ++const DEFAULT_CENSOR = '[REDACTED]' ++fastRedact.rx = rx ++fastRedact.validator = validator ++ ++module.exports = fastRedact ++ ++function fastRedact (opts = {}) { ++ const paths = Array.from(new Set(opts.paths || [])) ++ const serialize = 'serialize' in opts ? ( ++ opts.serialize === false ? opts.serialize ++ : (typeof opts.serialize === 'function' ? opts.serialize : JSON.stringify) ++ ) : JSON.stringify ++ const remove = opts.remove ++ if (remove === true && serialize !== JSON.stringify) { ++ throw Error('fast-redact – remove option may only be set when serializer is JSON.stringify') ++ } ++ const censor = remove === true ++ ? undefined ++ : 'censor' in opts ? opts.censor : DEFAULT_CENSOR ++ ++ const isCensorFct = typeof censor === 'function' ++ const censorFctTakesPath = isCensorFct && censor.length > 1 ++ ++ if (paths.length === 0) return serialize || noop ++ ++ validate({ paths, serialize, censor }) ++ ++ const { wildcards, wcLen, secret } = parse({ paths, censor }) ++ ++ const compileRestore = restorer({ secret, wcLen }) ++ const strict = 'strict' in opts ? opts.strict : true ++ ++ return redactor({ secret, wcLen, serialize, strict, isCensorFct, censorFctTakesPath }, state({ ++ secret, ++ censor, ++ compileRestore, ++ serialize, ++ groupRedact, ++ nestedRedact, ++ wildcards, ++ wcLen ++ })) ++} ++ ++}, ++"xkQFJQcxwb8xnn+mdgVdWf3SQU+rE7SU+kypcEJ7Tnk=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++exports.checkStrictMode = exports.getErrorPath = exports.Type = exports.useFunc = exports.setEvaluated = exports.evaluatedPropsToName = exports.mergeEvaluated = exports.eachItem = exports.unescapeJsonPointer = exports.escapeJsonPointer = exports.escapeFragment = exports.unescapeFragment = exports.schemaRefOrVal = exports.schemaHasRulesButRef = exports.schemaHasRules = exports.checkUnknownRules = exports.alwaysValidSchema = exports.toHash = void 0; ++const codegen_1 = require("./codegen"); ++const code_1 = require("./codegen/code"); ++// TODO refactor to use Set ++function toHash(arr) { ++ const hash = {}; ++ for (const item of arr) ++ hash[item] = true; ++ return hash; ++} ++exports.toHash = toHash; ++function alwaysValidSchema(it, schema) { ++ if (typeof schema == "boolean") ++ return schema; ++ if (Object.keys(schema).length === 0) ++ return true; ++ checkUnknownRules(it, schema); ++ return !schemaHasRules(schema, it.self.RULES.all); ++} ++exports.alwaysValidSchema = alwaysValidSchema; ++function checkUnknownRules(it, schema = it.schema) { ++ const { opts, self } = it; ++ if (!opts.strictSchema) ++ return; ++ if (typeof schema === "boolean") ++ return; ++ const rules = self.RULES.keywords; ++ for (const key in schema) { ++ if (!rules[key]) ++ checkStrictMode(it, `unknown keyword: "${key}"`); ++ } ++} ++exports.checkUnknownRules = checkUnknownRules; ++function schemaHasRules(schema, rules) { ++ if (typeof schema == "boolean") ++ return !schema; ++ for (const key in schema) ++ if (rules[key]) ++ return true; ++ return false; ++} ++exports.schemaHasRules = schemaHasRules; ++function schemaHasRulesButRef(schema, RULES) { ++ if (typeof schema == "boolean") ++ return !schema; ++ for (const key in schema) ++ if (key !== "$ref" && RULES.all[key]) ++ return true; ++ return false; ++} ++exports.schemaHasRulesButRef = schemaHasRulesButRef; ++function schemaRefOrVal({ topSchemaRef, schemaPath }, schema, keyword, $data) { ++ if (!$data) { ++ if (typeof schema == "number" || typeof schema == "boolean") ++ return schema; ++ if (typeof schema == "string") ++ return codegen_1._ `${schema}`; ++ } ++ return codegen_1._ `${topSchemaRef}${schemaPath}${codegen_1.getProperty(keyword)}`; ++} ++exports.schemaRefOrVal = schemaRefOrVal; ++function unescapeFragment(str) { ++ return unescapeJsonPointer(decodeURIComponent(str)); ++} ++exports.unescapeFragment = unescapeFragment; ++function escapeFragment(str) { ++ return encodeURIComponent(escapeJsonPointer(str)); ++} ++exports.escapeFragment = escapeFragment; ++function escapeJsonPointer(str) { ++ if (typeof str == "number") ++ return `${str}`; ++ return str.replace(/~/g, "~0").replace(/\//g, "~1"); ++} ++exports.escapeJsonPointer = escapeJsonPointer; ++function unescapeJsonPointer(str) { ++ return str.replace(/~1/g, "/").replace(/~0/g, "~"); ++} ++exports.unescapeJsonPointer = unescapeJsonPointer; ++function eachItem(xs, f) { ++ if (Array.isArray(xs)) { ++ for (const x of xs) ++ f(x); ++ } ++ else { ++ f(xs); ++ } ++} ++exports.eachItem = eachItem; ++function makeMergeEvaluated({ mergeNames, mergeToName, mergeValues, resultToName, }) { ++ return (gen, from, to, toName) => { ++ const res = to === undefined ++ ? from ++ : to instanceof codegen_1.Name ++ ? (from instanceof codegen_1.Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to) ++ : from instanceof codegen_1.Name ++ ? (mergeToName(gen, to, from), from) ++ : mergeValues(from, to); ++ return toName === codegen_1.Name && !(res instanceof codegen_1.Name) ? resultToName(gen, res) : res; ++ }; ++} ++exports.mergeEvaluated = { ++ props: makeMergeEvaluated({ ++ mergeNames: (gen, from, to) => gen.if(codegen_1._ `${to} !== true && ${from} !== undefined`, () => { ++ gen.if(codegen_1._ `${from} === true`, () => gen.assign(to, true), () => gen.assign(to, codegen_1._ `${to} || {}`).code(codegen_1._ `Object.assign(${to}, ${from})`)); ++ }), ++ mergeToName: (gen, from, to) => gen.if(codegen_1._ `${to} !== true`, () => { ++ if (from === true) { ++ gen.assign(to, true); ++ } ++ else { ++ gen.assign(to, codegen_1._ `${to} || {}`); ++ setEvaluated(gen, to, from); ++ } ++ }), ++ mergeValues: (from, to) => (from === true ? true : { ...from, ...to }), ++ resultToName: evaluatedPropsToName, ++ }), ++ items: makeMergeEvaluated({ ++ mergeNames: (gen, from, to) => gen.if(codegen_1._ `${to} !== true && ${from} !== undefined`, () => gen.assign(to, codegen_1._ `${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)), ++ mergeToName: (gen, from, to) => gen.if(codegen_1._ `${to} !== true`, () => gen.assign(to, from === true ? true : codegen_1._ `${to} > ${from} ? ${to} : ${from}`)), ++ mergeValues: (from, to) => (from === true ? true : Math.max(from, to)), ++ resultToName: (gen, items) => gen.var("items", items), ++ }), ++}; ++function evaluatedPropsToName(gen, ps) { ++ if (ps === true) ++ return gen.var("props", true); ++ const props = gen.var("props", codegen_1._ `{}`); ++ if (ps !== undefined) ++ setEvaluated(gen, props, ps); ++ return props; ++} ++exports.evaluatedPropsToName = evaluatedPropsToName; ++function setEvaluated(gen, props, ps) { ++ Object.keys(ps).forEach((p) => gen.assign(codegen_1._ `${props}${codegen_1.getProperty(p)}`, true)); ++} ++exports.setEvaluated = setEvaluated; ++const snippets = {}; ++function useFunc(gen, f) { ++ return gen.scopeValue("func", { ++ ref: f, ++ code: snippets[f.code] || (snippets[f.code] = new code_1._Code(f.code)), ++ }); ++} ++exports.useFunc = useFunc; ++var Type; ++(function (Type) { ++ Type[Type["Num"] = 0] = "Num"; ++ Type[Type["Str"] = 1] = "Str"; ++})(Type = exports.Type || (exports.Type = {})); ++function getErrorPath(dataProp, dataPropType, jsPropertySyntax) { ++ // let path ++ if (dataProp instanceof codegen_1.Name) { ++ const isNumber = dataPropType === Type.Num; ++ return jsPropertySyntax ++ ? isNumber ++ ? codegen_1._ `"[" + ${dataProp} + "]"` ++ : codegen_1._ `"['" + ${dataProp} + "']"` ++ : isNumber ++ ? codegen_1._ `"/" + ${dataProp}` ++ : codegen_1._ `"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`; // TODO maybe use global escapePointer ++ } ++ return jsPropertySyntax ? codegen_1.getProperty(dataProp).toString() : "/" + escapeJsonPointer(dataProp); ++} ++exports.getErrorPath = getErrorPath; ++function checkStrictMode(it, msg, mode = it.opts.strictSchema) { ++ if (!mode) ++ return; ++ msg = `strict mode: ${msg}`; ++ if (mode === true) ++ throw new Error(msg); ++ it.self.logger.warn(msg); ++} ++exports.checkStrictMode = checkStrictMode; ++//# sourceMappingURL=util.js.map ++}, ++"xpSM2LHgz5JWp8S4pR4S9hZUZVor167wqBCLKia3NR0=": ++function (require, module, exports, __dirname, __filename) { ++var isError = function(err) { // inlined from util so this works in the browser ++ return Object.prototype.toString.call(err) === '[object Error]'; ++}; ++ ++var thunky = function(fn) { ++ var run = function(callback) { ++ var stack = [callback]; ++ ++ state = function(callback) { ++ stack.push(callback); ++ }; ++ ++ fn(function(err) { ++ var args = arguments; ++ var apply = function(callback) { ++ if (callback) callback.apply(null, args); ++ }; ++ ++ state = isError(err) ? run : apply; ++ while (stack.length) apply(stack.shift()); ++ }); ++ }; ++ ++ var state = run; ++ ++ return function(callback) { ++ state(callback); ++ }; ++}; ++ ++module.exports = thunky; ++}, ++"xv0xyeZs6j8WAXxc++bI6yXqgki4UgAm4F/0xYAsvpk=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++module.exports = function generate_anyOf(it, $keyword, $ruleType) { ++ var out = ' '; ++ var $lvl = it.level; ++ var $dataLvl = it.dataLevel; ++ var $schema = it.schema[$keyword]; ++ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); ++ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; ++ var $breakOnError = !it.opts.allErrors; ++ var $data = 'data' + ($dataLvl || ''); ++ var $valid = 'valid' + $lvl; ++ var $errs = 'errs__' + $lvl; ++ var $it = it.util.copy(it); ++ var $closingBraces = ''; ++ $it.level++; ++ var $nextValid = 'valid' + $it.level; ++ var $noEmptySchema = $schema.every(function($sch) { ++ return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); ++ }); ++ if ($noEmptySchema) { ++ var $currentBaseId = $it.baseId; ++ out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; ++ var $wasComposite = it.compositeRule; ++ it.compositeRule = $it.compositeRule = true; ++ var arr1 = $schema; ++ if (arr1) { ++ var $sch, $i = -1, ++ l1 = arr1.length - 1; ++ while ($i < l1) { ++ $sch = arr1[$i += 1]; ++ $it.schema = $sch; ++ $it.schemaPath = $schemaPath + '[' + $i + ']'; ++ $it.errSchemaPath = $errSchemaPath + '/' + $i; ++ out += ' ' + (it.validate($it)) + ' '; ++ $it.baseId = $currentBaseId; ++ out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; ++ $closingBraces += '}'; ++ } ++ } ++ it.compositeRule = $it.compositeRule = $wasComposite; ++ out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ ++ if (it.createErrors !== false) { ++ out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; ++ if (it.opts.messages !== false) { ++ out += ' , message: \'should match some schema in anyOf\' '; ++ } ++ if (it.opts.verbose) { ++ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; ++ } ++ out += ' } '; ++ } else { ++ out += ' {} '; ++ } ++ out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; ++ if (!it.compositeRule && $breakOnError) { ++ /* istanbul ignore if */ ++ if (it.async) { ++ out += ' throw new ValidationError(vErrors); '; ++ } else { ++ out += ' validate.errors = vErrors; return false; '; ++ } ++ } ++ out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; ++ if (it.opts.allErrors) { ++ out += ' } '; ++ } ++ } else { ++ if ($breakOnError) { ++ out += ' if (true) { '; ++ } ++ } ++ return out; ++} ++ ++}, ++"xwNbRxsZe6bUh5toA7bKJzoXr2yKI4Lcul6zunCkOsI=": ++function (require, module, exports, __dirname, __filename) { ++var path = require('path'); ++var fs = require('fs'); ++var _0777 = parseInt('0777', 8); ++ ++module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; ++ ++function mkdirP (p, opts, f, made) { ++ if (typeof opts === 'function') { ++ f = opts; ++ opts = {}; ++ } ++ else if (!opts || typeof opts !== 'object') { ++ opts = { mode: opts }; ++ } ++ ++ var mode = opts.mode; ++ var xfs = opts.fs || fs; ++ ++ if (mode === undefined) { ++ mode = _0777 ++ } ++ if (!made) made = null; ++ ++ var cb = f || function () {}; ++ p = path.resolve(p); ++ ++ xfs.mkdir(p, mode, function (er) { ++ if (!er) { ++ made = made || p; ++ return cb(null, made); ++ } ++ switch (er.code) { ++ case 'ENOENT': ++ if (path.dirname(p) === p) return cb(er); ++ mkdirP(path.dirname(p), opts, function (er, made) { ++ if (er) cb(er, made); ++ else mkdirP(p, opts, cb, made); ++ }); ++ break; ++ ++ // In the case of any other error, just see if there's a dir ++ // there already. If so, then hooray! If not, then something ++ // is borked. ++ default: ++ xfs.stat(p, function (er2, stat) { ++ // if the stat fails, then that's super weird. ++ // let the original error be the failure reason. ++ if (er2 || !stat.isDirectory()) cb(er, made) ++ else cb(null, made); ++ }); ++ break; ++ } ++ }); ++} ++ ++mkdirP.sync = function sync (p, opts, made) { ++ if (!opts || typeof opts !== 'object') { ++ opts = { mode: opts }; ++ } ++ ++ var mode = opts.mode; ++ var xfs = opts.fs || fs; ++ ++ if (mode === undefined) { ++ mode = _0777 ++ } ++ if (!made) made = null; ++ ++ p = path.resolve(p); ++ ++ try { ++ xfs.mkdirSync(p, mode); ++ made = made || p; ++ } ++ catch (err0) { ++ switch (err0.code) { ++ case 'ENOENT' : ++ made = sync(path.dirname(p), opts, made); ++ sync(p, opts, made); ++ break; ++ ++ // In the case of any other error, just see if there's a dir ++ // there already. If so, then hooray! If not, then something ++ // is borked. ++ default: ++ var stat; ++ try { ++ stat = xfs.statSync(p); ++ } ++ catch (err1) { ++ throw err0; ++ } ++ if (!stat.isDirectory()) throw err0; ++ break; ++ } ++ } ++ ++ return made; ++}; ++ ++}, ++"y8VgBIwG+xo8dUEmOL+J3bl4Lzc6dE/8TY8qoLjRHDw=": ++function (require, module, exports, __dirname, __filename) { ++const SemVer = require('../classes/semver') ++const Range = require('../classes/range') ++ ++const maxSatisfying = (versions, range, options) => { ++ let max = null ++ let maxSV = null ++ let rangeObj = null ++ try { ++ rangeObj = new Range(range, options) ++ } catch (er) { ++ return null ++ } ++ versions.forEach((v) => { ++ if (rangeObj.test(v)) { ++ // satisfies(v, range, options) ++ if (!max || maxSV.compare(v) === -1) { ++ // compare(max, v, true) ++ max = v ++ maxSV = new SemVer(max, options) ++ } ++ } ++ }) ++ return max ++} ++module.exports = maxSatisfying ++ ++}, ++"yAnvLCey6eR86meB0bYekq2rzLE5q/rACd8lPPxPb9M=": ++function (require, module, exports, __dirname, __filename) { ++const Range = require('../classes/range') ++ ++// Mostly just for testing and legacy API reasons ++const toComparators = (range, options) => ++ new Range(range, options).set ++ .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) ++ ++module.exports = toComparators ++ ++}, ++"yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++var isObject = require('is-extendable'); ++ ++module.exports = function extend(o/*, objects*/) { ++ if (!isObject(o)) { o = {}; } ++ ++ var len = arguments.length; ++ for (var i = 1; i < len; i++) { ++ var obj = arguments[i]; ++ ++ if (isObject(obj)) { ++ assign(o, obj); ++ } ++ } ++ return o; ++}; ++ ++function assign(a, b) { ++ for (var key in b) { ++ if (hasOwn(b, key)) { ++ a[key] = b[key]; ++ } ++ } ++} ++ ++/** ++ * Returns true if the given `key` is an own property of `obj`. ++ */ ++ ++function hasOwn(obj, key) { ++ return Object.prototype.hasOwnProperty.call(obj, key); ++} ++ ++}, ++"yFQLBuyAunq5B404xIGLggl6KCFZmB83f6KDGGzGRJI=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++var KEYWORDS = [ ++ 'multipleOf', ++ 'maximum', ++ 'exclusiveMaximum', ++ 'minimum', ++ 'exclusiveMinimum', ++ 'maxLength', ++ 'minLength', ++ 'pattern', ++ 'additionalItems', ++ 'maxItems', ++ 'minItems', ++ 'uniqueItems', ++ 'maxProperties', ++ 'minProperties', ++ 'required', ++ 'additionalProperties', ++ 'enum', ++ 'format', ++ 'const' ++]; ++ ++module.exports = function (metaSchema, keywordsJsonPointers) { ++ for (var i=0; i*/ ++ ++var Duplex; ++/**/ ++ ++Readable.ReadableState = ReadableState; ++/**/ ++ ++var EE = require('events').EventEmitter; ++ ++var EElistenerCount = function EElistenerCount(emitter, type) { ++ return emitter.listeners(type).length; ++}; ++/**/ ++ ++/**/ ++ ++ ++var Stream = require('./internal/streams/stream'); ++/**/ ++ ++ ++var Buffer = require('buffer').Buffer; ++ ++var OurUint8Array = global.Uint8Array || function () {}; ++ ++function _uint8ArrayToBuffer(chunk) { ++ return Buffer.from(chunk); ++} ++ ++function _isUint8Array(obj) { ++ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; ++} ++/**/ ++ ++ ++var debugUtil = require('util'); ++ ++var debug; ++ ++if (debugUtil && debugUtil.debuglog) { ++ debug = debugUtil.debuglog('stream'); ++} else { ++ debug = function debug() {}; ++} ++/**/ ++ ++ ++var BufferList = require('./internal/streams/buffer_list'); ++ ++var destroyImpl = require('./internal/streams/destroy'); ++ ++var _require = require('./internal/streams/state'), ++ getHighWaterMark = _require.getHighWaterMark; ++ ++var _require$codes = require('../errors').codes, ++ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ++ ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ++ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ++ ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. ++ ++ ++var StringDecoder; ++var createReadableStreamAsyncIterator; ++var from; ++ ++require('inherits')(Readable, Stream); ++ ++var errorOrDestroy = destroyImpl.errorOrDestroy; ++var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; ++ ++function prependListener(emitter, event, fn) { ++ // Sadly this is not cacheable as some libraries bundle their own ++ // event emitter implementation with them. ++ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any ++ // userland ones. NEVER DO THIS. This is here only because this code needs ++ // to continue to work with older versions of Node.js that do not include ++ // the prependListener() method. The goal is to eventually remove this hack. ++ ++ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; ++} ++ ++function ReadableState(options, stream, isDuplex) { ++ Duplex = Duplex || require('./_stream_duplex'); ++ options = options || {}; // Duplex streams are both readable and writable, but share ++ // the same options object. ++ // However, some cases require setting options to different ++ // values for the readable and the writable sides of the duplex stream. ++ // These options can be provided separately as readableXXX and writableXXX. ++ ++ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to ++ // make all the buffer merging and length checks go away ++ ++ this.objectMode = !!options.objectMode; ++ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer ++ // Note: 0 is a valid value, means "don't call _read preemptively ever" ++ ++ this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the ++ // linked list can remove elements from the beginning faster than ++ // array.shift() ++ ++ this.buffer = new BufferList(); ++ this.length = 0; ++ this.pipes = null; ++ this.pipesCount = 0; ++ this.flowing = null; ++ this.ended = false; ++ this.endEmitted = false; ++ this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted ++ // immediately, or on a later tick. We set this to true at first, because ++ // any actions that shouldn't happen until "later" should generally also ++ // not happen before the first read call. ++ ++ this.sync = true; // whenever we return null, then we set a flag to say ++ // that we're awaiting a 'readable' event emission. ++ ++ this.needReadable = false; ++ this.emittedReadable = false; ++ this.readableListening = false; ++ this.resumeScheduled = false; ++ this.paused = true; // Should close be emitted on destroy. Defaults to true. ++ ++ this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') ++ ++ this.autoDestroy = !!options.autoDestroy; // has it been destroyed ++ ++ this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string ++ // encoding is 'binary' so we have to make this configurable. ++ // Everything else in the universe uses 'utf8', though. ++ ++ this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s ++ ++ this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled ++ ++ this.readingMore = false; ++ this.decoder = null; ++ this.encoding = null; ++ ++ if (options.encoding) { ++ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; ++ this.decoder = new StringDecoder(options.encoding); ++ this.encoding = options.encoding; ++ } ++} ++ ++function Readable(options) { ++ Duplex = Duplex || require('./_stream_duplex'); ++ if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside ++ // the ReadableState constructor, at least with V8 6.5 ++ ++ var isDuplex = this instanceof Duplex; ++ this._readableState = new ReadableState(options, this, isDuplex); // legacy ++ ++ this.readable = true; ++ ++ if (options) { ++ if (typeof options.read === 'function') this._read = options.read; ++ if (typeof options.destroy === 'function') this._destroy = options.destroy; ++ } ++ ++ Stream.call(this); ++} ++ ++Object.defineProperty(Readable.prototype, 'destroyed', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ if (this._readableState === undefined) { ++ return false; ++ } ++ ++ return this._readableState.destroyed; ++ }, ++ set: function set(value) { ++ // we ignore the value if the stream ++ // has not been initialized yet ++ if (!this._readableState) { ++ return; ++ } // backward compatibility, the user is explicitly ++ // managing destroyed ++ ++ ++ this._readableState.destroyed = value; ++ } ++}); ++Readable.prototype.destroy = destroyImpl.destroy; ++Readable.prototype._undestroy = destroyImpl.undestroy; ++ ++Readable.prototype._destroy = function (err, cb) { ++ cb(err); ++}; // Manually shove something into the read() buffer. ++// This returns true if the highWaterMark has not been hit yet, ++// similar to how Writable.write() returns true if you should ++// write() some more. ++ ++ ++Readable.prototype.push = function (chunk, encoding) { ++ var state = this._readableState; ++ var skipChunkCheck; ++ ++ if (!state.objectMode) { ++ if (typeof chunk === 'string') { ++ encoding = encoding || state.defaultEncoding; ++ ++ if (encoding !== state.encoding) { ++ chunk = Buffer.from(chunk, encoding); ++ encoding = ''; ++ } ++ ++ skipChunkCheck = true; ++ } ++ } else { ++ skipChunkCheck = true; ++ } ++ ++ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); ++}; // Unshift should *always* be something directly out of read() ++ ++ ++Readable.prototype.unshift = function (chunk) { ++ return readableAddChunk(this, chunk, null, true, false); ++}; ++ ++function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { ++ debug('readableAddChunk', chunk); ++ var state = stream._readableState; ++ ++ if (chunk === null) { ++ state.reading = false; ++ onEofChunk(stream, state); ++ } else { ++ var er; ++ if (!skipChunkCheck) er = chunkInvalid(state, chunk); ++ ++ if (er) { ++ errorOrDestroy(stream, er); ++ } else if (state.objectMode || chunk && chunk.length > 0) { ++ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { ++ chunk = _uint8ArrayToBuffer(chunk); ++ } ++ ++ if (addToFront) { ++ if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); ++ } else if (state.ended) { ++ errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); ++ } else if (state.destroyed) { ++ return false; ++ } else { ++ state.reading = false; ++ ++ if (state.decoder && !encoding) { ++ chunk = state.decoder.write(chunk); ++ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); ++ } else { ++ addChunk(stream, state, chunk, false); ++ } ++ } ++ } else if (!addToFront) { ++ state.reading = false; ++ maybeReadMore(stream, state); ++ } ++ } // We can push more data if we are below the highWaterMark. ++ // Also, if we have no data yet, we can stand some more bytes. ++ // This is to work around cases where hwm=0, such as the repl. ++ ++ ++ return !state.ended && (state.length < state.highWaterMark || state.length === 0); ++} ++ ++function addChunk(stream, state, chunk, addToFront) { ++ if (state.flowing && state.length === 0 && !state.sync) { ++ state.awaitDrain = 0; ++ stream.emit('data', chunk); ++ } else { ++ // update the buffer info. ++ state.length += state.objectMode ? 1 : chunk.length; ++ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); ++ if (state.needReadable) emitReadable(stream); ++ } ++ ++ maybeReadMore(stream, state); ++} ++ ++function chunkInvalid(state, chunk) { ++ var er; ++ ++ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { ++ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); ++ } ++ ++ return er; ++} ++ ++Readable.prototype.isPaused = function () { ++ return this._readableState.flowing === false; ++}; // backwards compatibility. ++ ++ ++Readable.prototype.setEncoding = function (enc) { ++ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; ++ var decoder = new StringDecoder(enc); ++ this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 ++ ++ this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: ++ ++ var p = this._readableState.buffer.head; ++ var content = ''; ++ ++ while (p !== null) { ++ content += decoder.write(p.data); ++ p = p.next; ++ } ++ ++ this._readableState.buffer.clear(); ++ ++ if (content !== '') this._readableState.buffer.push(content); ++ this._readableState.length = content.length; ++ return this; ++}; // Don't raise the hwm > 1GB ++ ++ ++var MAX_HWM = 0x40000000; ++ ++function computeNewHighWaterMark(n) { ++ if (n >= MAX_HWM) { ++ // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. ++ n = MAX_HWM; ++ } else { ++ // Get the next highest power of 2 to prevent increasing hwm excessively in ++ // tiny amounts ++ n--; ++ n |= n >>> 1; ++ n |= n >>> 2; ++ n |= n >>> 4; ++ n |= n >>> 8; ++ n |= n >>> 16; ++ n++; ++ } ++ ++ return n; ++} // This function is designed to be inlinable, so please take care when making ++// changes to the function body. ++ ++ ++function howMuchToRead(n, state) { ++ if (n <= 0 || state.length === 0 && state.ended) return 0; ++ if (state.objectMode) return 1; ++ ++ if (n !== n) { ++ // Only flow one buffer at a time ++ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; ++ } // If we're asking for more than the current hwm, then raise the hwm. ++ ++ ++ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); ++ if (n <= state.length) return n; // Don't have enough ++ ++ if (!state.ended) { ++ state.needReadable = true; ++ return 0; ++ } ++ ++ return state.length; ++} // you can override either this method, or the async _read(n) below. ++ ++ ++Readable.prototype.read = function (n) { ++ debug('read', n); ++ n = parseInt(n, 10); ++ var state = this._readableState; ++ var nOrig = n; ++ if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we ++ // already have a bunch of data in the buffer, then just trigger ++ // the 'readable' event and move on. ++ ++ if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { ++ debug('read: emitReadable', state.length, state.ended); ++ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); ++ return null; ++ } ++ ++ n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. ++ ++ if (n === 0 && state.ended) { ++ if (state.length === 0) endReadable(this); ++ return null; ++ } // All the actual chunk generation logic needs to be ++ // *below* the call to _read. The reason is that in certain ++ // synthetic stream cases, such as passthrough streams, _read ++ // may be a completely synchronous operation which may change ++ // the state of the read buffer, providing enough data when ++ // before there was *not* enough. ++ // ++ // So, the steps are: ++ // 1. Figure out what the state of things will be after we do ++ // a read from the buffer. ++ // ++ // 2. If that resulting state will trigger a _read, then call _read. ++ // Note that this may be asynchronous, or synchronous. Yes, it is ++ // deeply ugly to write APIs this way, but that still doesn't mean ++ // that the Readable class should behave improperly, as streams are ++ // designed to be sync/async agnostic. ++ // Take note if the _read call is sync or async (ie, if the read call ++ // has returned yet), so that we know whether or not it's safe to emit ++ // 'readable' etc. ++ // ++ // 3. Actually pull the requested chunks out of the buffer and return. ++ // if we need a readable event, then we need to do some reading. ++ ++ ++ var doRead = state.needReadable; ++ debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some ++ ++ if (state.length === 0 || state.length - n < state.highWaterMark) { ++ doRead = true; ++ debug('length less than watermark', doRead); ++ } // however, if we've ended, then there's no point, and if we're already ++ // reading, then it's unnecessary. ++ ++ ++ if (state.ended || state.reading) { ++ doRead = false; ++ debug('reading or ended', doRead); ++ } else if (doRead) { ++ debug('do read'); ++ state.reading = true; ++ state.sync = true; // if the length is currently zero, then we *need* a readable event. ++ ++ if (state.length === 0) state.needReadable = true; // call internal read method ++ ++ this._read(state.highWaterMark); ++ ++ state.sync = false; // If _read pushed data synchronously, then `reading` will be false, ++ // and we need to re-evaluate how much data we can return to the user. ++ ++ if (!state.reading) n = howMuchToRead(nOrig, state); ++ } ++ ++ var ret; ++ if (n > 0) ret = fromList(n, state);else ret = null; ++ ++ if (ret === null) { ++ state.needReadable = state.length <= state.highWaterMark; ++ n = 0; ++ } else { ++ state.length -= n; ++ state.awaitDrain = 0; ++ } ++ ++ if (state.length === 0) { ++ // If we have nothing in the buffer, then we want to know ++ // as soon as we *do* get something into the buffer. ++ if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. ++ ++ if (nOrig !== n && state.ended) endReadable(this); ++ } ++ ++ if (ret !== null) this.emit('data', ret); ++ return ret; ++}; ++ ++function onEofChunk(stream, state) { ++ debug('onEofChunk'); ++ if (state.ended) return; ++ ++ if (state.decoder) { ++ var chunk = state.decoder.end(); ++ ++ if (chunk && chunk.length) { ++ state.buffer.push(chunk); ++ state.length += state.objectMode ? 1 : chunk.length; ++ } ++ } ++ ++ state.ended = true; ++ ++ if (state.sync) { ++ // if we are sync, wait until next tick to emit the data. ++ // Otherwise we risk emitting data in the flow() ++ // the readable code triggers during a read() call ++ emitReadable(stream); ++ } else { ++ // emit 'readable' now to make sure it gets picked up. ++ state.needReadable = false; ++ ++ if (!state.emittedReadable) { ++ state.emittedReadable = true; ++ emitReadable_(stream); ++ } ++ } ++} // Don't emit readable right away in sync mode, because this can trigger ++// another read() call => stack overflow. This way, it might trigger ++// a nextTick recursion warning, but that's not so bad. ++ ++ ++function emitReadable(stream) { ++ var state = stream._readableState; ++ debug('emitReadable', state.needReadable, state.emittedReadable); ++ state.needReadable = false; ++ ++ if (!state.emittedReadable) { ++ debug('emitReadable', state.flowing); ++ state.emittedReadable = true; ++ process.nextTick(emitReadable_, stream); ++ } ++} ++ ++function emitReadable_(stream) { ++ var state = stream._readableState; ++ debug('emitReadable_', state.destroyed, state.length, state.ended); ++ ++ if (!state.destroyed && (state.length || state.ended)) { ++ stream.emit('readable'); ++ state.emittedReadable = false; ++ } // The stream needs another readable event if ++ // 1. It is not flowing, as the flow mechanism will take ++ // care of it. ++ // 2. It is not ended. ++ // 3. It is below the highWaterMark, so we can schedule ++ // another readable later. ++ ++ ++ state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; ++ flow(stream); ++} // at this point, the user has presumably seen the 'readable' event, ++// and called read() to consume some data. that may have triggered ++// in turn another _read(n) call, in which case reading = true if ++// it's in progress. ++// However, if we're not ended, or reading, and the length < hwm, ++// then go ahead and try to read some more preemptively. ++ ++ ++function maybeReadMore(stream, state) { ++ if (!state.readingMore) { ++ state.readingMore = true; ++ process.nextTick(maybeReadMore_, stream, state); ++ } ++} ++ ++function maybeReadMore_(stream, state) { ++ // Attempt to read more data if we should. ++ // ++ // The conditions for reading more data are (one of): ++ // - Not enough data buffered (state.length < state.highWaterMark). The loop ++ // is responsible for filling the buffer with enough data if such data ++ // is available. If highWaterMark is 0 and we are not in the flowing mode ++ // we should _not_ attempt to buffer any extra data. We'll get more data ++ // when the stream consumer calls read() instead. ++ // - No data in the buffer, and the stream is in flowing mode. In this mode ++ // the loop below is responsible for ensuring read() is called. Failing to ++ // call read here would abort the flow and there's no other mechanism for ++ // continuing the flow if the stream consumer has just subscribed to the ++ // 'data' event. ++ // ++ // In addition to the above conditions to keep reading data, the following ++ // conditions prevent the data from being read: ++ // - The stream has ended (state.ended). ++ // - There is already a pending 'read' operation (state.reading). This is a ++ // case where the the stream has called the implementation defined _read() ++ // method, but they are processing the call asynchronously and have _not_ ++ // called push() with new data. In this case we skip performing more ++ // read()s. The execution ends in this method again after the _read() ends ++ // up calling push() with more data. ++ while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { ++ var len = state.length; ++ debug('maybeReadMore read 0'); ++ stream.read(0); ++ if (len === state.length) // didn't get any data, stop spinning. ++ break; ++ } ++ ++ state.readingMore = false; ++} // abstract method. to be overridden in specific implementation classes. ++// call cb(er, data) where data is <= n in length. ++// for virtual (non-string, non-buffer) streams, "length" is somewhat ++// arbitrary, and perhaps not very meaningful. ++ ++ ++Readable.prototype._read = function (n) { ++ errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); ++}; ++ ++Readable.prototype.pipe = function (dest, pipeOpts) { ++ var src = this; ++ var state = this._readableState; ++ ++ switch (state.pipesCount) { ++ case 0: ++ state.pipes = dest; ++ break; ++ ++ case 1: ++ state.pipes = [state.pipes, dest]; ++ break; ++ ++ default: ++ state.pipes.push(dest); ++ break; ++ } ++ ++ state.pipesCount += 1; ++ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); ++ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; ++ var endFn = doEnd ? onend : unpipe; ++ if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); ++ dest.on('unpipe', onunpipe); ++ ++ function onunpipe(readable, unpipeInfo) { ++ debug('onunpipe'); ++ ++ if (readable === src) { ++ if (unpipeInfo && unpipeInfo.hasUnpiped === false) { ++ unpipeInfo.hasUnpiped = true; ++ cleanup(); ++ } ++ } ++ } ++ ++ function onend() { ++ debug('onend'); ++ dest.end(); ++ } // when the dest drains, it reduces the awaitDrain counter ++ // on the source. This would be more elegant with a .once() ++ // handler in flow(), but adding and removing repeatedly is ++ // too slow. ++ ++ ++ var ondrain = pipeOnDrain(src); ++ dest.on('drain', ondrain); ++ var cleanedUp = false; ++ ++ function cleanup() { ++ debug('cleanup'); // cleanup event handlers once the pipe is broken ++ ++ dest.removeListener('close', onclose); ++ dest.removeListener('finish', onfinish); ++ dest.removeListener('drain', ondrain); ++ dest.removeListener('error', onerror); ++ dest.removeListener('unpipe', onunpipe); ++ src.removeListener('end', onend); ++ src.removeListener('end', unpipe); ++ src.removeListener('data', ondata); ++ cleanedUp = true; // if the reader is waiting for a drain event from this ++ // specific writer, then it would cause it to never start ++ // flowing again. ++ // So, if this is awaiting a drain, then we just call it now. ++ // If we don't know, then assume that we are waiting for one. ++ ++ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); ++ } ++ ++ src.on('data', ondata); ++ ++ function ondata(chunk) { ++ debug('ondata'); ++ var ret = dest.write(chunk); ++ debug('dest.write', ret); ++ ++ if (ret === false) { ++ // If the user unpiped during `dest.write()`, it is possible ++ // to get stuck in a permanently paused state if that write ++ // also returned false. ++ // => Check whether `dest` is still a piping destination. ++ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { ++ debug('false write response, pause', state.awaitDrain); ++ state.awaitDrain++; ++ } ++ ++ src.pause(); ++ } ++ } // if the dest has an error, then stop piping into it. ++ // however, don't suppress the throwing behavior for this. ++ ++ ++ function onerror(er) { ++ debug('onerror', er); ++ unpipe(); ++ dest.removeListener('error', onerror); ++ if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); ++ } // Make sure our error handler is attached before userland ones. ++ ++ ++ prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. ++ ++ function onclose() { ++ dest.removeListener('finish', onfinish); ++ unpipe(); ++ } ++ ++ dest.once('close', onclose); ++ ++ function onfinish() { ++ debug('onfinish'); ++ dest.removeListener('close', onclose); ++ unpipe(); ++ } ++ ++ dest.once('finish', onfinish); ++ ++ function unpipe() { ++ debug('unpipe'); ++ src.unpipe(dest); ++ } // tell the dest that it's being piped to ++ ++ ++ dest.emit('pipe', src); // start the flow if it hasn't been started already. ++ ++ if (!state.flowing) { ++ debug('pipe resume'); ++ src.resume(); ++ } ++ ++ return dest; ++}; ++ ++function pipeOnDrain(src) { ++ return function pipeOnDrainFunctionResult() { ++ var state = src._readableState; ++ debug('pipeOnDrain', state.awaitDrain); ++ if (state.awaitDrain) state.awaitDrain--; ++ ++ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { ++ state.flowing = true; ++ flow(src); ++ } ++ }; ++} ++ ++Readable.prototype.unpipe = function (dest) { ++ var state = this._readableState; ++ var unpipeInfo = { ++ hasUnpiped: false ++ }; // if we're not piping anywhere, then do nothing. ++ ++ if (state.pipesCount === 0) return this; // just one destination. most common case. ++ ++ if (state.pipesCount === 1) { ++ // passed in one, but it's not the right one. ++ if (dest && dest !== state.pipes) return this; ++ if (!dest) dest = state.pipes; // got a match. ++ ++ state.pipes = null; ++ state.pipesCount = 0; ++ state.flowing = false; ++ if (dest) dest.emit('unpipe', this, unpipeInfo); ++ return this; ++ } // slow case. multiple pipe destinations. ++ ++ ++ if (!dest) { ++ // remove all. ++ var dests = state.pipes; ++ var len = state.pipesCount; ++ state.pipes = null; ++ state.pipesCount = 0; ++ state.flowing = false; ++ ++ for (var i = 0; i < len; i++) { ++ dests[i].emit('unpipe', this, { ++ hasUnpiped: false ++ }); ++ } ++ ++ return this; ++ } // try to find the right one. ++ ++ ++ var index = indexOf(state.pipes, dest); ++ if (index === -1) return this; ++ state.pipes.splice(index, 1); ++ state.pipesCount -= 1; ++ if (state.pipesCount === 1) state.pipes = state.pipes[0]; ++ dest.emit('unpipe', this, unpipeInfo); ++ return this; ++}; // set up data events if they are asked for ++// Ensure readable listeners eventually get something ++ ++ ++Readable.prototype.on = function (ev, fn) { ++ var res = Stream.prototype.on.call(this, ev, fn); ++ var state = this._readableState; ++ ++ if (ev === 'data') { ++ // update readableListening so that resume() may be a no-op ++ // a few lines down. This is needed to support once('readable'). ++ state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused ++ ++ if (state.flowing !== false) this.resume(); ++ } else if (ev === 'readable') { ++ if (!state.endEmitted && !state.readableListening) { ++ state.readableListening = state.needReadable = true; ++ state.flowing = false; ++ state.emittedReadable = false; ++ debug('on readable', state.length, state.reading); ++ ++ if (state.length) { ++ emitReadable(this); ++ } else if (!state.reading) { ++ process.nextTick(nReadingNextTick, this); ++ } ++ } ++ } ++ ++ return res; ++}; ++ ++Readable.prototype.addListener = Readable.prototype.on; ++ ++Readable.prototype.removeListener = function (ev, fn) { ++ var res = Stream.prototype.removeListener.call(this, ev, fn); ++ ++ if (ev === 'readable') { ++ // We need to check if there is someone still listening to ++ // readable and reset the state. However this needs to happen ++ // after readable has been emitted but before I/O (nextTick) to ++ // support once('readable', fn) cycles. This means that calling ++ // resume within the same tick will have no ++ // effect. ++ process.nextTick(updateReadableListening, this); ++ } ++ ++ return res; ++}; ++ ++Readable.prototype.removeAllListeners = function (ev) { ++ var res = Stream.prototype.removeAllListeners.apply(this, arguments); ++ ++ if (ev === 'readable' || ev === undefined) { ++ // We need to check if there is someone still listening to ++ // readable and reset the state. However this needs to happen ++ // after readable has been emitted but before I/O (nextTick) to ++ // support once('readable', fn) cycles. This means that calling ++ // resume within the same tick will have no ++ // effect. ++ process.nextTick(updateReadableListening, this); ++ } ++ ++ return res; ++}; ++ ++function updateReadableListening(self) { ++ var state = self._readableState; ++ state.readableListening = self.listenerCount('readable') > 0; ++ ++ if (state.resumeScheduled && !state.paused) { ++ // flowing needs to be set to true now, otherwise ++ // the upcoming resume will not flow. ++ state.flowing = true; // crude way to check if we should resume ++ } else if (self.listenerCount('data') > 0) { ++ self.resume(); ++ } ++} ++ ++function nReadingNextTick(self) { ++ debug('readable nexttick read 0'); ++ self.read(0); ++} // pause() and resume() are remnants of the legacy readable stream API ++// If the user uses them, then switch into old mode. ++ ++ ++Readable.prototype.resume = function () { ++ var state = this._readableState; ++ ++ if (!state.flowing) { ++ debug('resume'); // we flow only if there is no one listening ++ // for readable, but we still have to call ++ // resume() ++ ++ state.flowing = !state.readableListening; ++ resume(this, state); ++ } ++ ++ state.paused = false; ++ return this; ++}; ++ ++function resume(stream, state) { ++ if (!state.resumeScheduled) { ++ state.resumeScheduled = true; ++ process.nextTick(resume_, stream, state); ++ } ++} ++ ++function resume_(stream, state) { ++ debug('resume', state.reading); ++ ++ if (!state.reading) { ++ stream.read(0); ++ } ++ ++ state.resumeScheduled = false; ++ stream.emit('resume'); ++ flow(stream); ++ if (state.flowing && !state.reading) stream.read(0); ++} ++ ++Readable.prototype.pause = function () { ++ debug('call pause flowing=%j', this._readableState.flowing); ++ ++ if (this._readableState.flowing !== false) { ++ debug('pause'); ++ this._readableState.flowing = false; ++ this.emit('pause'); ++ } ++ ++ this._readableState.paused = true; ++ return this; ++}; ++ ++function flow(stream) { ++ var state = stream._readableState; ++ debug('flow', state.flowing); ++ ++ while (state.flowing && stream.read() !== null) { ++ ; ++ } ++} // wrap an old-style stream as the async data source. ++// This is *not* part of the readable stream interface. ++// It is an ugly unfortunate mess of history. ++ ++ ++Readable.prototype.wrap = function (stream) { ++ var _this = this; ++ ++ var state = this._readableState; ++ var paused = false; ++ stream.on('end', function () { ++ debug('wrapped end'); ++ ++ if (state.decoder && !state.ended) { ++ var chunk = state.decoder.end(); ++ if (chunk && chunk.length) _this.push(chunk); ++ } ++ ++ _this.push(null); ++ }); ++ stream.on('data', function (chunk) { ++ debug('wrapped data'); ++ if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode ++ ++ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; ++ ++ var ret = _this.push(chunk); ++ ++ if (!ret) { ++ paused = true; ++ stream.pause(); ++ } ++ }); // proxy all the other methods. ++ // important when wrapping filters and duplexes. ++ ++ for (var i in stream) { ++ if (this[i] === undefined && typeof stream[i] === 'function') { ++ this[i] = function methodWrap(method) { ++ return function methodWrapReturnFunction() { ++ return stream[method].apply(stream, arguments); ++ }; ++ }(i); ++ } ++ } // proxy certain important events. ++ ++ ++ for (var n = 0; n < kProxyEvents.length; n++) { ++ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); ++ } // when we try to consume some more bytes, simply unpause the ++ // underlying stream. ++ ++ ++ this._read = function (n) { ++ debug('wrapped _read', n); ++ ++ if (paused) { ++ paused = false; ++ stream.resume(); ++ } ++ }; ++ ++ return this; ++}; ++ ++if (typeof Symbol === 'function') { ++ Readable.prototype[Symbol.asyncIterator] = function () { ++ if (createReadableStreamAsyncIterator === undefined) { ++ createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); ++ } ++ ++ return createReadableStreamAsyncIterator(this); ++ }; ++} ++ ++Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._readableState.highWaterMark; ++ } ++}); ++Object.defineProperty(Readable.prototype, 'readableBuffer', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._readableState && this._readableState.buffer; ++ } ++}); ++Object.defineProperty(Readable.prototype, 'readableFlowing', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._readableState.flowing; ++ }, ++ set: function set(state) { ++ if (this._readableState) { ++ this._readableState.flowing = state; ++ } ++ } ++}); // exposed for testing purposes only. ++ ++Readable._fromList = fromList; ++Object.defineProperty(Readable.prototype, 'readableLength', { ++ // making it explicit this property is not enumerable ++ // because otherwise some prototype manipulation in ++ // userland will fail ++ enumerable: false, ++ get: function get() { ++ return this._readableState.length; ++ } ++}); // Pluck off n bytes from an array of buffers. ++// Length is the combined lengths of all the buffers in the list. ++// This function is designed to be inlinable, so please take care when making ++// changes to the function body. ++ ++function fromList(n, state) { ++ // nothing buffered ++ if (state.length === 0) return null; ++ var ret; ++ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { ++ // read it all, truncate the list ++ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); ++ state.buffer.clear(); ++ } else { ++ // read part of list ++ ret = state.buffer.consume(n, state.decoder); ++ } ++ return ret; ++} ++ ++function endReadable(stream) { ++ var state = stream._readableState; ++ debug('endReadable', state.endEmitted); ++ ++ if (!state.endEmitted) { ++ state.ended = true; ++ process.nextTick(endReadableNT, state, stream); ++ } ++} ++ ++function endReadableNT(state, stream) { ++ debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. ++ ++ if (!state.endEmitted && state.length === 0) { ++ state.endEmitted = true; ++ stream.readable = false; ++ stream.emit('end'); ++ ++ if (state.autoDestroy) { ++ // In case of duplex streams we need a way to detect ++ // if the writable side is ready for autoDestroy as well ++ var wState = stream._writableState; ++ ++ if (!wState || wState.autoDestroy && wState.finished) { ++ stream.destroy(); ++ } ++ } ++ } ++} ++ ++if (typeof Symbol === 'function') { ++ Readable.from = function (iterable, opts) { ++ if (from === undefined) { ++ from = require('./internal/streams/from'); ++ } ++ ++ return from(Readable, iterable, opts); ++ }; ++} ++ ++function indexOf(xs, x) { ++ for (var i = 0, l = xs.length; i < l; i++) { ++ if (xs[i] === x) return i; ++ } ++ ++ return -1; ++} ++}, ++"yURn2gnulOXRlEg6erghubs78cBDlycPKrU96p3lknQ=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++// https://github.com/ajv-validator/ajv/issues/889 ++const equal = require("fast-deep-equal"); ++equal.code = 'require("ajv/dist/runtime/equal").default'; ++exports.default = equal; ++//# sourceMappingURL=equal.js.map ++}, ++"yZejfjSsnSGf+ZBjgm2xhfUoUqD3LLk/QL8txumIzXg=": ++function (require, module, exports, __dirname, __filename) { ++var bencode = module.exports ++ ++bencode.encode = require('./encode') ++bencode.decode = require('./decode') ++ ++/** ++ * Determines the amount of bytes ++ * needed to encode the given value ++ * @param {Object|Array|Buffer|String|Number|Boolean} value ++ * @return {Number} byteCount ++ */ ++bencode.byteLength = bencode.encodingLength = function (value) { ++ return bencode.encode(value).length ++} ++ ++}, ++"yaphZhXIkWCXJDD0TVLV17SRY62G8z3E98aHMsHxhsM=": ++function (require, module, exports, __dirname, __filename) { ++module.exports = { ++ "autoIndex": [ "autoIndex", "autoindex" ], ++ "showDir": [ "showDir", "showdir" ], ++ "showDotfiles": ["showDotfiles", "showdotfiles"], ++ "humanReadable": [ "humanReadable", "humanreadable", "human-readable" ], ++ "hidePermissions": ["hidePermissions", "hidepermissions", "hide-permissions"], ++ "si": [ "si", "index" ], ++ "handleError": [ "handleError", "handleerror" ], ++ "cors": [ "cors", "CORS" ], ++ "headers": [ "H", "header", "headers" ], ++ "serverHeader": [ "serverHeader", "serverheader", "server-header" ], ++ "contentType": [ "contentType", "contenttype", "content-type" ], ++ "mimeType": [ ++ "mimetype", ++ "mimetypes", ++ "mimeType", ++ "mimeTypes", ++ "mime-type", ++ "mime-types", ++ "mime-Type", ++ "mime-Types" ++ ], ++ "weakEtags": [ "weakEtags", "weaketags", "weak-etags" ], ++ "weakCompare": [ ++ "weakcompare", ++ "weakCompare", ++ "weak-compare", ++ "weak-Compare" ++ ], ++ "handleOptionsMethod": [ ++ "handleOptionsMethod", ++ "handleoptionsmethod", ++ "handle-options-method" ++ ] ++} ++ ++}, ++"ydPbt27q/TAHvOyjdq/HQzcKsMVIfXi1xuCXpLD23Zs=": ++function (require, module, exports, __dirname, __filename) { ++var Symbol = require('./_Symbol'), ++ getRawTag = require('./_getRawTag'), ++ objectToString = require('./_objectToString'); ++ ++/** `Object#toString` result references. */ ++var nullTag = '[object Null]', ++ undefinedTag = '[object Undefined]'; ++ ++/** Built-in value references. */ ++var symToStringTag = Symbol ? Symbol.toStringTag : undefined; ++ ++/** ++ * The base implementation of `getTag` without fallbacks for buggy environments. ++ * ++ * @private ++ * @param {*} value The value to query. ++ * @returns {string} Returns the `toStringTag`. ++ */ ++function baseGetTag(value) { ++ if (value == null) { ++ return value === undefined ? undefinedTag : nullTag; ++ } ++ return (symToStringTag && symToStringTag in Object(value)) ++ ? getRawTag(value) ++ : objectToString(value); ++} ++ ++module.exports = baseGetTag; ++ ++}, ++"yds//vKsQ82TtChBR83Uv7Jk7sCtGj5pEJvANxsSjuc=": ++function (require, module, exports, __dirname, __filename) { ++const assert = require("assert") ++const path = require("path") ++const fs = require("fs") ++let glob = undefined ++try { ++ glob = require("glob") ++} catch (_err) { ++ // treat glob as optional. ++} ++ ++const defaultGlobOpts = { ++ nosort: true, ++ silent: true ++} ++ ++// for EMFILE handling ++let timeout = 0 ++ ++const isWindows = (process.platform === "win32") ++ ++const defaults = options => { ++ const methods = [ ++ 'unlink', ++ 'chmod', ++ 'stat', ++ 'lstat', ++ 'rmdir', ++ 'readdir' ++ ] ++ methods.forEach(m => { ++ options[m] = options[m] || fs[m] ++ m = m + 'Sync' ++ options[m] = options[m] || fs[m] ++ }) ++ ++ options.maxBusyTries = options.maxBusyTries || 3 ++ options.emfileWait = options.emfileWait || 1000 ++ if (options.glob === false) { ++ options.disableGlob = true ++ } ++ if (options.disableGlob !== true && glob === undefined) { ++ throw Error('glob dependency not found, set `options.disableGlob = true` if intentional') ++ } ++ options.disableGlob = options.disableGlob || false ++ options.glob = options.glob || defaultGlobOpts ++} ++ ++const rimraf = (p, options, cb) => { ++ if (typeof options === 'function') { ++ cb = options ++ options = {} ++ } ++ ++ assert(p, 'rimraf: missing path') ++ assert.equal(typeof p, 'string', 'rimraf: path should be a string') ++ assert.equal(typeof cb, 'function', 'rimraf: callback function required') ++ assert(options, 'rimraf: invalid options argument provided') ++ assert.equal(typeof options, 'object', 'rimraf: options should be object') ++ ++ defaults(options) ++ ++ let busyTries = 0 ++ let errState = null ++ let n = 0 ++ ++ const next = (er) => { ++ errState = errState || er ++ if (--n === 0) ++ cb(errState) ++ } ++ ++ const afterGlob = (er, results) => { ++ if (er) ++ return cb(er) ++ ++ n = results.length ++ if (n === 0) ++ return cb() ++ ++ results.forEach(p => { ++ const CB = (er) => { ++ if (er) { ++ if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") && ++ busyTries < options.maxBusyTries) { ++ busyTries ++ ++ // try again, with the same exact callback as this one. ++ return setTimeout(() => rimraf_(p, options, CB), busyTries * 100) ++ } ++ ++ // this one won't happen if graceful-fs is used. ++ if (er.code === "EMFILE" && timeout < options.emfileWait) { ++ return setTimeout(() => rimraf_(p, options, CB), timeout ++) ++ } ++ ++ // already gone ++ if (er.code === "ENOENT") er = null ++ } ++ ++ timeout = 0 ++ next(er) ++ } ++ rimraf_(p, options, CB) ++ }) ++ } ++ ++ if (options.disableGlob || !glob.hasMagic(p)) ++ return afterGlob(null, [p]) ++ ++ options.lstat(p, (er, stat) => { ++ if (!er) ++ return afterGlob(null, [p]) ++ ++ glob(p, options.glob, afterGlob) ++ }) ++ ++} ++ ++// Two possible strategies. ++// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR ++// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR ++// ++// Both result in an extra syscall when you guess wrong. However, there ++// are likely far more normal files in the world than directories. This ++// is based on the assumption that a the average number of files per ++// directory is >= 1. ++// ++// If anyone ever complains about this, then I guess the strategy could ++// be made configurable somehow. But until then, YAGNI. ++const rimraf_ = (p, options, cb) => { ++ assert(p) ++ assert(options) ++ assert(typeof cb === 'function') ++ ++ // sunos lets the root user unlink directories, which is... weird. ++ // so we have to lstat here and make sure it's not a dir. ++ options.lstat(p, (er, st) => { ++ if (er && er.code === "ENOENT") ++ return cb(null) ++ ++ // Windows can EPERM on stat. Life is suffering. ++ if (er && er.code === "EPERM" && isWindows) ++ fixWinEPERM(p, options, er, cb) ++ ++ if (st && st.isDirectory()) ++ return rmdir(p, options, er, cb) ++ ++ options.unlink(p, er => { ++ if (er) { ++ if (er.code === "ENOENT") ++ return cb(null) ++ if (er.code === "EPERM") ++ return (isWindows) ++ ? fixWinEPERM(p, options, er, cb) ++ : rmdir(p, options, er, cb) ++ if (er.code === "EISDIR") ++ return rmdir(p, options, er, cb) ++ } ++ return cb(er) ++ }) ++ }) ++} ++ ++const fixWinEPERM = (p, options, er, cb) => { ++ assert(p) ++ assert(options) ++ assert(typeof cb === 'function') ++ ++ options.chmod(p, 0o666, er2 => { ++ if (er2) ++ cb(er2.code === "ENOENT" ? null : er) ++ else ++ options.stat(p, (er3, stats) => { ++ if (er3) ++ cb(er3.code === "ENOENT" ? null : er) ++ else if (stats.isDirectory()) ++ rmdir(p, options, er, cb) ++ else ++ options.unlink(p, cb) ++ }) ++ }) ++} ++ ++const fixWinEPERMSync = (p, options, er) => { ++ assert(p) ++ assert(options) ++ ++ try { ++ options.chmodSync(p, 0o666) ++ } catch (er2) { ++ if (er2.code === "ENOENT") ++ return ++ else ++ throw er ++ } ++ ++ let stats ++ try { ++ stats = options.statSync(p) ++ } catch (er3) { ++ if (er3.code === "ENOENT") ++ return ++ else ++ throw er ++ } ++ ++ if (stats.isDirectory()) ++ rmdirSync(p, options, er) ++ else ++ options.unlinkSync(p) ++} ++ ++const rmdir = (p, options, originalEr, cb) => { ++ assert(p) ++ assert(options) ++ assert(typeof cb === 'function') ++ ++ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) ++ // if we guessed wrong, and it's not a directory, then ++ // raise the original error. ++ options.rmdir(p, er => { ++ if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) ++ rmkids(p, options, cb) ++ else if (er && er.code === "ENOTDIR") ++ cb(originalEr) ++ else ++ cb(er) ++ }) ++} ++ ++const rmkids = (p, options, cb) => { ++ assert(p) ++ assert(options) ++ assert(typeof cb === 'function') ++ ++ options.readdir(p, (er, files) => { ++ if (er) ++ return cb(er) ++ let n = files.length ++ if (n === 0) ++ return options.rmdir(p, cb) ++ let errState ++ files.forEach(f => { ++ rimraf(path.join(p, f), options, er => { ++ if (errState) ++ return ++ if (er) ++ return cb(errState = er) ++ if (--n === 0) ++ options.rmdir(p, cb) ++ }) ++ }) ++ }) ++} ++ ++// this looks simpler, and is strictly *faster*, but will ++// tie up the JavaScript thread and fail on excessively ++// deep directory trees. ++const rimrafSync = (p, options) => { ++ options = options || {} ++ defaults(options) ++ ++ assert(p, 'rimraf: missing path') ++ assert.equal(typeof p, 'string', 'rimraf: path should be a string') ++ assert(options, 'rimraf: missing options') ++ assert.equal(typeof options, 'object', 'rimraf: options should be object') ++ ++ let results ++ ++ if (options.disableGlob || !glob.hasMagic(p)) { ++ results = [p] ++ } else { ++ try { ++ options.lstatSync(p) ++ results = [p] ++ } catch (er) { ++ results = glob.sync(p, options.glob) ++ } ++ } ++ ++ if (!results.length) ++ return ++ ++ for (let i = 0; i < results.length; i++) { ++ const p = results[i] ++ ++ let st ++ try { ++ st = options.lstatSync(p) ++ } catch (er) { ++ if (er.code === "ENOENT") ++ return ++ ++ // Windows can EPERM on stat. Life is suffering. ++ if (er.code === "EPERM" && isWindows) ++ fixWinEPERMSync(p, options, er) ++ } ++ ++ try { ++ // sunos lets the root user unlink directories, which is... weird. ++ if (st && st.isDirectory()) ++ rmdirSync(p, options, null) ++ else ++ options.unlinkSync(p) ++ } catch (er) { ++ if (er.code === "ENOENT") ++ return ++ if (er.code === "EPERM") ++ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) ++ if (er.code !== "EISDIR") ++ throw er ++ ++ rmdirSync(p, options, er) ++ } ++ } ++} ++ ++const rmdirSync = (p, options, originalEr) => { ++ assert(p) ++ assert(options) ++ ++ try { ++ options.rmdirSync(p) ++ } catch (er) { ++ if (er.code === "ENOENT") ++ return ++ if (er.code === "ENOTDIR") ++ throw originalEr ++ if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") ++ rmkidsSync(p, options) ++ } ++} ++ ++const rmkidsSync = (p, options) => { ++ assert(p) ++ assert(options) ++ options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options)) ++ ++ // We only end up here once we got ENOTEMPTY at least once, and ++ // at this point, we are guaranteed to have removed all the kids. ++ // So, we know that it won't be ENOENT or ENOTDIR or anything else. ++ // try really hard to delete stuff on windows, because it has a ++ // PROFOUNDLY annoying habit of not closing handles promptly when ++ // files are deleted, resulting in spurious ENOTEMPTY errors. ++ const retries = isWindows ? 100 : 1 ++ let i = 0 ++ do { ++ let threw = true ++ try { ++ const ret = options.rmdirSync(p, options) ++ threw = false ++ return ret ++ } finally { ++ if (++i < retries && threw) ++ continue ++ } ++ } while (true) ++} ++ ++module.exports = rimraf ++rimraf.sync = rimrafSync ++ ++}, ++"ygOScCldDCHPllTEdRxcLOrk/3GVXO1TfF0MpVmh0to=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++Object.defineProperty(exports, "__esModule", { value: true }); ++const code_1 = require("../code"); ++const codegen_1 = require("../../compile/codegen"); ++const util_1 = require("../../compile/util"); ++const util_2 = require("../../compile/util"); ++const def = { ++ keyword: "patternProperties", ++ type: "object", ++ schemaType: "object", ++ code(cxt) { ++ const { gen, schema, data, parentSchema, it } = cxt; ++ const { opts } = it; ++ const patterns = code_1.schemaProperties(it, schema); ++ // TODO mark properties matching patterns with always valid schemas as evaluated ++ if (patterns.length === 0) ++ return; ++ const checkProperties = opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties; ++ const valid = gen.name("valid"); ++ if (it.props !== true && !(it.props instanceof codegen_1.Name)) { ++ it.props = util_2.evaluatedPropsToName(gen, it.props); ++ } ++ const { props } = it; ++ validatePatternProperties(); ++ function validatePatternProperties() { ++ for (const pat of patterns) { ++ if (checkProperties) ++ checkMatchingProperties(pat); ++ if (it.allErrors) { ++ validateProperties(pat); ++ } ++ else { ++ gen.var(valid, true); // TODO var ++ validateProperties(pat); ++ gen.if(valid); ++ } ++ } ++ } ++ function checkMatchingProperties(pat) { ++ for (const prop in checkProperties) { ++ if (new RegExp(pat).test(prop)) { ++ util_1.checkStrictMode(it, `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`); ++ } ++ } ++ } ++ function validateProperties(pat) { ++ gen.forIn("key", data, (key) => { ++ gen.if(codegen_1._ `${code_1.usePattern(cxt, pat)}.test(${key})`, () => { ++ cxt.subschema({ ++ keyword: "patternProperties", ++ schemaProp: pat, ++ dataProp: key, ++ dataPropType: util_2.Type.Str, ++ }, valid); ++ if (it.opts.unevaluated && props !== true) { ++ gen.assign(codegen_1._ `${props}[${key}]`, true); ++ } ++ else if (!it.allErrors) { ++ // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false) ++ // or if all properties were evaluated (props === true) ++ gen.if(codegen_1.not(valid), () => gen.break()); ++ } ++ }); ++ }); ++ } ++ }, ++}; ++exports.default = def; ++//# sourceMappingURL=patternProperties.js.map ++}, ++"yoGIqzcoRqcSC6y5U7Ams/9QZr2yimu/URgetuNzRRg=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++ ++module.exports = make ++module.exports.ctor = ctor ++module.exports.objCtor = objCtor ++module.exports.obj = obj ++ ++var through2 = require("through2") ++var xtend = require("xtend") ++ ++function ctor(options, fn) { ++ if (typeof options == "function") { ++ fn = options ++ options = {} ++ } ++ ++ var Filter = through2.ctor(options, function (chunk, encoding, callback) { ++ if (this.options.wantStrings) chunk = chunk.toString() ++ try { ++ if (fn.call(this, chunk, this._index++)) this.push(chunk) ++ return callback() ++ } catch (e) { ++ return callback(e) ++ } ++ }) ++ Filter.prototype._index = 0 ++ return Filter ++} ++ ++function objCtor(options, fn) { ++ if (typeof options === "function") { ++ fn = options ++ options = {} ++ } ++ options = xtend({objectMode: true, highWaterMark: 16}, options) ++ return ctor(options, fn) ++} ++ ++function make(options, fn) { ++ return ctor(options, fn)() ++} ++ ++function obj(options, fn) { ++ if (typeof options === "function") { ++ fn = options ++ options = {} ++ } ++ options = xtend({objectMode: true, highWaterMark: 16}, options) ++ return make(options, fn) ++} ++ ++}, ++"yuDKxxEbN73GJptcJKODz8UIJ/1c8t/2vQLq2F1NkCo=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++ ++var utils = require('../utils/common'); ++ ++/* Public constants ==========================================================*/ ++/* ===========================================================================*/ ++ ++ ++//var Z_FILTERED = 1; ++//var Z_HUFFMAN_ONLY = 2; ++//var Z_RLE = 3; ++var Z_FIXED = 4; ++//var Z_DEFAULT_STRATEGY = 0; ++ ++/* Possible values of the data_type field (though see inflate()) */ ++var Z_BINARY = 0; ++var Z_TEXT = 1; ++//var Z_ASCII = 1; // = Z_TEXT ++var Z_UNKNOWN = 2; ++ ++/*============================================================================*/ ++ ++ ++function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } ++ ++// From zutil.h ++ ++var STORED_BLOCK = 0; ++var STATIC_TREES = 1; ++var DYN_TREES = 2; ++/* The three kinds of block type */ ++ ++var MIN_MATCH = 3; ++var MAX_MATCH = 258; ++/* The minimum and maximum match lengths */ ++ ++// From deflate.h ++/* =========================================================================== ++ * Internal compression state. ++ */ ++ ++var LENGTH_CODES = 29; ++/* number of length codes, not counting the special END_BLOCK code */ ++ ++var LITERALS = 256; ++/* number of literal bytes 0..255 */ ++ ++var L_CODES = LITERALS + 1 + LENGTH_CODES; ++/* number of Literal or Length codes, including the END_BLOCK code */ ++ ++var D_CODES = 30; ++/* number of distance codes */ ++ ++var BL_CODES = 19; ++/* number of codes used to transfer the bit lengths */ ++ ++var HEAP_SIZE = 2 * L_CODES + 1; ++/* maximum heap size */ ++ ++var MAX_BITS = 15; ++/* All codes must not exceed MAX_BITS bits */ ++ ++var Buf_size = 16; ++/* size of bit buffer in bi_buf */ ++ ++ ++/* =========================================================================== ++ * Constants ++ */ ++ ++var MAX_BL_BITS = 7; ++/* Bit length codes must not exceed MAX_BL_BITS bits */ ++ ++var END_BLOCK = 256; ++/* end of block literal code */ ++ ++var REP_3_6 = 16; ++/* repeat previous bit length 3-6 times (2 bits of repeat count) */ ++ ++var REPZ_3_10 = 17; ++/* repeat a zero length 3-10 times (3 bits of repeat count) */ ++ ++var REPZ_11_138 = 18; ++/* repeat a zero length 11-138 times (7 bits of repeat count) */ ++ ++/* eslint-disable comma-spacing,array-bracket-spacing */ ++var extra_lbits = /* extra bits for each length code */ ++ [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; ++ ++var extra_dbits = /* extra bits for each distance code */ ++ [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; ++ ++var extra_blbits = /* extra bits for each bit length code */ ++ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; ++ ++var bl_order = ++ [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; ++/* eslint-enable comma-spacing,array-bracket-spacing */ ++ ++/* The lengths of the bit length codes are sent in order of decreasing ++ * probability, to avoid transmitting the lengths for unused bit length codes. ++ */ ++ ++/* =========================================================================== ++ * Local data. These are initialized only once. ++ */ ++ ++// We pre-fill arrays with 0 to avoid uninitialized gaps ++ ++var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ ++ ++// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 ++var static_ltree = new Array((L_CODES + 2) * 2); ++zero(static_ltree); ++/* The static literal tree. Since the bit lengths are imposed, there is no ++ * need for the L_CODES extra codes used during heap construction. However ++ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init ++ * below). ++ */ ++ ++var static_dtree = new Array(D_CODES * 2); ++zero(static_dtree); ++/* The static distance tree. (Actually a trivial tree since all codes use ++ * 5 bits.) ++ */ ++ ++var _dist_code = new Array(DIST_CODE_LEN); ++zero(_dist_code); ++/* Distance codes. The first 256 values correspond to the distances ++ * 3 .. 258, the last 256 values correspond to the top 8 bits of ++ * the 15 bit distances. ++ */ ++ ++var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); ++zero(_length_code); ++/* length code for each normalized match length (0 == MIN_MATCH) */ ++ ++var base_length = new Array(LENGTH_CODES); ++zero(base_length); ++/* First normalized length for each code (0 = MIN_MATCH) */ ++ ++var base_dist = new Array(D_CODES); ++zero(base_dist); ++/* First normalized distance for each code (0 = distance of 1) */ ++ ++ ++function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { ++ ++ this.static_tree = static_tree; /* static tree or NULL */ ++ this.extra_bits = extra_bits; /* extra bits for each code or NULL */ ++ this.extra_base = extra_base; /* base index for extra_bits */ ++ this.elems = elems; /* max number of elements in the tree */ ++ this.max_length = max_length; /* max bit length for the codes */ ++ ++ // show if `static_tree` has data or dummy - needed for monomorphic objects ++ this.has_stree = static_tree && static_tree.length; ++} ++ ++ ++var static_l_desc; ++var static_d_desc; ++var static_bl_desc; ++ ++ ++function TreeDesc(dyn_tree, stat_desc) { ++ this.dyn_tree = dyn_tree; /* the dynamic tree */ ++ this.max_code = 0; /* largest code with non zero frequency */ ++ this.stat_desc = stat_desc; /* the corresponding static tree */ ++} ++ ++ ++ ++function d_code(dist) { ++ return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; ++} ++ ++ ++/* =========================================================================== ++ * Output a short LSB first on the stream. ++ * IN assertion: there is enough room in pendingBuf. ++ */ ++function put_short(s, w) { ++// put_byte(s, (uch)((w) & 0xff)); ++// put_byte(s, (uch)((ush)(w) >> 8)); ++ s.pending_buf[s.pending++] = (w) & 0xff; ++ s.pending_buf[s.pending++] = (w >>> 8) & 0xff; ++} ++ ++ ++/* =========================================================================== ++ * Send a value on a given number of bits. ++ * IN assertion: length <= 16 and value fits in length bits. ++ */ ++function send_bits(s, value, length) { ++ if (s.bi_valid > (Buf_size - length)) { ++ s.bi_buf |= (value << s.bi_valid) & 0xffff; ++ put_short(s, s.bi_buf); ++ s.bi_buf = value >> (Buf_size - s.bi_valid); ++ s.bi_valid += length - Buf_size; ++ } else { ++ s.bi_buf |= (value << s.bi_valid) & 0xffff; ++ s.bi_valid += length; ++ } ++} ++ ++ ++function send_code(s, c, tree) { ++ send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); ++} ++ ++ ++/* =========================================================================== ++ * Reverse the first len bits of a code, using straightforward code (a faster ++ * method would use a table) ++ * IN assertion: 1 <= len <= 15 ++ */ ++function bi_reverse(code, len) { ++ var res = 0; ++ do { ++ res |= code & 1; ++ code >>>= 1; ++ res <<= 1; ++ } while (--len > 0); ++ return res >>> 1; ++} ++ ++ ++/* =========================================================================== ++ * Flush the bit buffer, keeping at most 7 bits in it. ++ */ ++function bi_flush(s) { ++ if (s.bi_valid === 16) { ++ put_short(s, s.bi_buf); ++ s.bi_buf = 0; ++ s.bi_valid = 0; ++ ++ } else if (s.bi_valid >= 8) { ++ s.pending_buf[s.pending++] = s.bi_buf & 0xff; ++ s.bi_buf >>= 8; ++ s.bi_valid -= 8; ++ } ++} ++ ++ ++/* =========================================================================== ++ * Compute the optimal bit lengths for a tree and update the total bit length ++ * for the current block. ++ * IN assertion: the fields freq and dad are set, heap[heap_max] and ++ * above are the tree nodes sorted by increasing frequency. ++ * OUT assertions: the field len is set to the optimal bit length, the ++ * array bl_count contains the frequencies for each bit length. ++ * The length opt_len is updated; static_len is also updated if stree is ++ * not null. ++ */ ++function gen_bitlen(s, desc) ++// deflate_state *s; ++// tree_desc *desc; /* the tree descriptor */ ++{ ++ var tree = desc.dyn_tree; ++ var max_code = desc.max_code; ++ var stree = desc.stat_desc.static_tree; ++ var has_stree = desc.stat_desc.has_stree; ++ var extra = desc.stat_desc.extra_bits; ++ var base = desc.stat_desc.extra_base; ++ var max_length = desc.stat_desc.max_length; ++ var h; /* heap index */ ++ var n, m; /* iterate over the tree elements */ ++ var bits; /* bit length */ ++ var xbits; /* extra bits */ ++ var f; /* frequency */ ++ var overflow = 0; /* number of elements with bit length too large */ ++ ++ for (bits = 0; bits <= MAX_BITS; bits++) { ++ s.bl_count[bits] = 0; ++ } ++ ++ /* In a first pass, compute the optimal bit lengths (which may ++ * overflow in the case of the bit length tree). ++ */ ++ tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ ++ ++ for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { ++ n = s.heap[h]; ++ bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; ++ if (bits > max_length) { ++ bits = max_length; ++ overflow++; ++ } ++ tree[n * 2 + 1]/*.Len*/ = bits; ++ /* We overwrite tree[n].Dad which is no longer needed */ ++ ++ if (n > max_code) { continue; } /* not a leaf node */ ++ ++ s.bl_count[bits]++; ++ xbits = 0; ++ if (n >= base) { ++ xbits = extra[n - base]; ++ } ++ f = tree[n * 2]/*.Freq*/; ++ s.opt_len += f * (bits + xbits); ++ if (has_stree) { ++ s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); ++ } ++ } ++ if (overflow === 0) { return; } ++ ++ // Trace((stderr,"\nbit length overflow\n")); ++ /* This happens for example on obj2 and pic of the Calgary corpus */ ++ ++ /* Find the first bit length which could increase: */ ++ do { ++ bits = max_length - 1; ++ while (s.bl_count[bits] === 0) { bits--; } ++ s.bl_count[bits]--; /* move one leaf down the tree */ ++ s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ ++ s.bl_count[max_length]--; ++ /* The brother of the overflow item also moves one step up, ++ * but this does not affect bl_count[max_length] ++ */ ++ overflow -= 2; ++ } while (overflow > 0); ++ ++ /* Now recompute all bit lengths, scanning in increasing frequency. ++ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all ++ * lengths instead of fixing only the wrong ones. This idea is taken ++ * from 'ar' written by Haruhiko Okumura.) ++ */ ++ for (bits = max_length; bits !== 0; bits--) { ++ n = s.bl_count[bits]; ++ while (n !== 0) { ++ m = s.heap[--h]; ++ if (m > max_code) { continue; } ++ if (tree[m * 2 + 1]/*.Len*/ !== bits) { ++ // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); ++ s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; ++ tree[m * 2 + 1]/*.Len*/ = bits; ++ } ++ n--; ++ } ++ } ++} ++ ++ ++/* =========================================================================== ++ * Generate the codes for a given tree and bit counts (which need not be ++ * optimal). ++ * IN assertion: the array bl_count contains the bit length statistics for ++ * the given tree and the field len is set for all tree elements. ++ * OUT assertion: the field code is set for all tree elements of non ++ * zero code length. ++ */ ++function gen_codes(tree, max_code, bl_count) ++// ct_data *tree; /* the tree to decorate */ ++// int max_code; /* largest code with non zero frequency */ ++// ushf *bl_count; /* number of codes at each bit length */ ++{ ++ var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ ++ var code = 0; /* running code value */ ++ var bits; /* bit index */ ++ var n; /* code index */ ++ ++ /* The distribution counts are first used to generate the code values ++ * without bit reversal. ++ */ ++ for (bits = 1; bits <= MAX_BITS; bits++) { ++ next_code[bits] = code = (code + bl_count[bits - 1]) << 1; ++ } ++ /* Check that the bit counts in bl_count are consistent. The last code ++ * must be all ones. ++ */ ++ //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ ++ length = 0; ++ for (code = 0; code < LENGTH_CODES - 1; code++) { ++ base_length[code] = length; ++ for (n = 0; n < (1 << extra_lbits[code]); n++) { ++ _length_code[length++] = code; ++ } ++ } ++ //Assert (length == 256, "tr_static_init: length != 256"); ++ /* Note that the length 255 (match length 258) can be represented ++ * in two different ways: code 284 + 5 bits or code 285, so we ++ * overwrite length_code[255] to use the best encoding: ++ */ ++ _length_code[length - 1] = code; ++ ++ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ ++ dist = 0; ++ for (code = 0; code < 16; code++) { ++ base_dist[code] = dist; ++ for (n = 0; n < (1 << extra_dbits[code]); n++) { ++ _dist_code[dist++] = code; ++ } ++ } ++ //Assert (dist == 256, "tr_static_init: dist != 256"); ++ dist >>= 7; /* from now on, all distances are divided by 128 */ ++ for (; code < D_CODES; code++) { ++ base_dist[code] = dist << 7; ++ for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { ++ _dist_code[256 + dist++] = code; ++ } ++ } ++ //Assert (dist == 256, "tr_static_init: 256+dist != 512"); ++ ++ /* Construct the codes of the static literal tree */ ++ for (bits = 0; bits <= MAX_BITS; bits++) { ++ bl_count[bits] = 0; ++ } ++ ++ n = 0; ++ while (n <= 143) { ++ static_ltree[n * 2 + 1]/*.Len*/ = 8; ++ n++; ++ bl_count[8]++; ++ } ++ while (n <= 255) { ++ static_ltree[n * 2 + 1]/*.Len*/ = 9; ++ n++; ++ bl_count[9]++; ++ } ++ while (n <= 279) { ++ static_ltree[n * 2 + 1]/*.Len*/ = 7; ++ n++; ++ bl_count[7]++; ++ } ++ while (n <= 287) { ++ static_ltree[n * 2 + 1]/*.Len*/ = 8; ++ n++; ++ bl_count[8]++; ++ } ++ /* Codes 286 and 287 do not exist, but we must include them in the ++ * tree construction to get a canonical Huffman tree (longest code ++ * all ones) ++ */ ++ gen_codes(static_ltree, L_CODES + 1, bl_count); ++ ++ /* The static distance tree is trivial: */ ++ for (n = 0; n < D_CODES; n++) { ++ static_dtree[n * 2 + 1]/*.Len*/ = 5; ++ static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); ++ } ++ ++ // Now data ready and we can init static trees ++ static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); ++ static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); ++ static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); ++ ++ //static_init_done = true; ++} ++ ++ ++/* =========================================================================== ++ * Initialize a new block. ++ */ ++function init_block(s) { ++ var n; /* iterates over tree elements */ ++ ++ /* Initialize the trees. */ ++ for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } ++ for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } ++ for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } ++ ++ s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; ++ s.opt_len = s.static_len = 0; ++ s.last_lit = s.matches = 0; ++} ++ ++ ++/* =========================================================================== ++ * Flush the bit buffer and align the output on a byte boundary ++ */ ++function bi_windup(s) ++{ ++ if (s.bi_valid > 8) { ++ put_short(s, s.bi_buf); ++ } else if (s.bi_valid > 0) { ++ //put_byte(s, (Byte)s->bi_buf); ++ s.pending_buf[s.pending++] = s.bi_buf; ++ } ++ s.bi_buf = 0; ++ s.bi_valid = 0; ++} ++ ++/* =========================================================================== ++ * Copy a stored block, storing first the length and its ++ * one's complement if requested. ++ */ ++function copy_block(s, buf, len, header) ++//DeflateState *s; ++//charf *buf; /* the input data */ ++//unsigned len; /* its length */ ++//int header; /* true if block header must be written */ ++{ ++ bi_windup(s); /* align on byte boundary */ ++ ++ if (header) { ++ put_short(s, len); ++ put_short(s, ~len); ++ } ++// while (len--) { ++// put_byte(s, *buf++); ++// } ++ utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); ++ s.pending += len; ++} ++ ++/* =========================================================================== ++ * Compares to subtrees, using the tree depth as tie breaker when ++ * the subtrees have equal frequency. This minimizes the worst case length. ++ */ ++function smaller(tree, n, m, depth) { ++ var _n2 = n * 2; ++ var _m2 = m * 2; ++ return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || ++ (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); ++} ++ ++/* =========================================================================== ++ * Restore the heap property by moving down the tree starting at node k, ++ * exchanging a node with the smallest of its two sons if necessary, stopping ++ * when the heap property is re-established (each father smaller than its ++ * two sons). ++ */ ++function pqdownheap(s, tree, k) ++// deflate_state *s; ++// ct_data *tree; /* the tree to restore */ ++// int k; /* node to move down */ ++{ ++ var v = s.heap[k]; ++ var j = k << 1; /* left son of k */ ++ while (j <= s.heap_len) { ++ /* Set j to the smallest of the two sons: */ ++ if (j < s.heap_len && ++ smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { ++ j++; ++ } ++ /* Exit if v is smaller than both sons */ ++ if (smaller(tree, v, s.heap[j], s.depth)) { break; } ++ ++ /* Exchange v with the smallest son */ ++ s.heap[k] = s.heap[j]; ++ k = j; ++ ++ /* And continue down the tree, setting j to the left son of k */ ++ j <<= 1; ++ } ++ s.heap[k] = v; ++} ++ ++ ++// inlined manually ++// var SMALLEST = 1; ++ ++/* =========================================================================== ++ * Send the block data compressed using the given Huffman trees ++ */ ++function compress_block(s, ltree, dtree) ++// deflate_state *s; ++// const ct_data *ltree; /* literal tree */ ++// const ct_data *dtree; /* distance tree */ ++{ ++ var dist; /* distance of matched string */ ++ var lc; /* match length or unmatched char (if dist == 0) */ ++ var lx = 0; /* running index in l_buf */ ++ var code; /* the code to send */ ++ var extra; /* number of extra bits to send */ ++ ++ if (s.last_lit !== 0) { ++ do { ++ dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); ++ lc = s.pending_buf[s.l_buf + lx]; ++ lx++; ++ ++ if (dist === 0) { ++ send_code(s, lc, ltree); /* send a literal byte */ ++ //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); ++ } else { ++ /* Here, lc is the match length - MIN_MATCH */ ++ code = _length_code[lc]; ++ send_code(s, code + LITERALS + 1, ltree); /* send the length code */ ++ extra = extra_lbits[code]; ++ if (extra !== 0) { ++ lc -= base_length[code]; ++ send_bits(s, lc, extra); /* send the extra length bits */ ++ } ++ dist--; /* dist is now the match distance - 1 */ ++ code = d_code(dist); ++ //Assert (code < D_CODES, "bad d_code"); ++ ++ send_code(s, code, dtree); /* send the distance code */ ++ extra = extra_dbits[code]; ++ if (extra !== 0) { ++ dist -= base_dist[code]; ++ send_bits(s, dist, extra); /* send the extra distance bits */ ++ } ++ } /* literal or match pair ? */ ++ ++ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ ++ //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, ++ // "pendingBuf overflow"); ++ ++ } while (lx < s.last_lit); ++ } ++ ++ send_code(s, END_BLOCK, ltree); ++} ++ ++ ++/* =========================================================================== ++ * Construct one Huffman tree and assigns the code bit strings and lengths. ++ * Update the total bit length for the current block. ++ * IN assertion: the field freq is set for all tree elements. ++ * OUT assertions: the fields len and code are set to the optimal bit length ++ * and corresponding code. The length opt_len is updated; static_len is ++ * also updated if stree is not null. The field max_code is set. ++ */ ++function build_tree(s, desc) ++// deflate_state *s; ++// tree_desc *desc; /* the tree descriptor */ ++{ ++ var tree = desc.dyn_tree; ++ var stree = desc.stat_desc.static_tree; ++ var has_stree = desc.stat_desc.has_stree; ++ var elems = desc.stat_desc.elems; ++ var n, m; /* iterate over heap elements */ ++ var max_code = -1; /* largest code with non zero frequency */ ++ var node; /* new node being created */ ++ ++ /* Construct the initial heap, with least frequent element in ++ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. ++ * heap[0] is not used. ++ */ ++ s.heap_len = 0; ++ s.heap_max = HEAP_SIZE; ++ ++ for (n = 0; n < elems; n++) { ++ if (tree[n * 2]/*.Freq*/ !== 0) { ++ s.heap[++s.heap_len] = max_code = n; ++ s.depth[n] = 0; ++ ++ } else { ++ tree[n * 2 + 1]/*.Len*/ = 0; ++ } ++ } ++ ++ /* The pkzip format requires that at least one distance code exists, ++ * and that at least one bit should be sent even if there is only one ++ * possible code. So to avoid special checks later on we force at least ++ * two codes of non zero frequency. ++ */ ++ while (s.heap_len < 2) { ++ node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); ++ tree[node * 2]/*.Freq*/ = 1; ++ s.depth[node] = 0; ++ s.opt_len--; ++ ++ if (has_stree) { ++ s.static_len -= stree[node * 2 + 1]/*.Len*/; ++ } ++ /* node is 0 or 1 so it does not have extra bits */ ++ } ++ desc.max_code = max_code; ++ ++ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, ++ * establish sub-heaps of increasing lengths: ++ */ ++ for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } ++ ++ /* Construct the Huffman tree by repeatedly combining the least two ++ * frequent nodes. ++ */ ++ node = elems; /* next internal node of the tree */ ++ do { ++ //pqremove(s, tree, n); /* n = node of least frequency */ ++ /*** pqremove ***/ ++ n = s.heap[1/*SMALLEST*/]; ++ s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; ++ pqdownheap(s, tree, 1/*SMALLEST*/); ++ /***/ ++ ++ m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ ++ ++ s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ ++ s.heap[--s.heap_max] = m; ++ ++ /* Create a new node father of n and m */ ++ tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; ++ s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; ++ tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; ++ ++ /* and insert the new node in the heap */ ++ s.heap[1/*SMALLEST*/] = node++; ++ pqdownheap(s, tree, 1/*SMALLEST*/); ++ ++ } while (s.heap_len >= 2); ++ ++ s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; ++ ++ /* At this point, the fields freq and dad are set. We can now ++ * generate the bit lengths. ++ */ ++ gen_bitlen(s, desc); ++ ++ /* The field len is now set, we can generate the bit codes */ ++ gen_codes(tree, max_code, s.bl_count); ++} ++ ++ ++/* =========================================================================== ++ * Scan a literal or distance tree to determine the frequencies of the codes ++ * in the bit length tree. ++ */ ++function scan_tree(s, tree, max_code) ++// deflate_state *s; ++// ct_data *tree; /* the tree to be scanned */ ++// int max_code; /* and its largest code of non zero frequency */ ++{ ++ var n; /* iterates over all tree elements */ ++ var prevlen = -1; /* last emitted length */ ++ var curlen; /* length of current code */ ++ ++ var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ ++ ++ var count = 0; /* repeat count of the current code */ ++ var max_count = 7; /* max repeat count */ ++ var min_count = 4; /* min repeat count */ ++ ++ if (nextlen === 0) { ++ max_count = 138; ++ min_count = 3; ++ } ++ tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; ++ nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; ++ ++ if (++count < max_count && curlen === nextlen) { ++ continue; ++ ++ } else if (count < min_count) { ++ s.bl_tree[curlen * 2]/*.Freq*/ += count; ++ ++ } else if (curlen !== 0) { ++ ++ if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } ++ s.bl_tree[REP_3_6 * 2]/*.Freq*/++; ++ ++ } else if (count <= 10) { ++ s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; ++ ++ } else { ++ s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; ++ } ++ ++ count = 0; ++ prevlen = curlen; ++ ++ if (nextlen === 0) { ++ max_count = 138; ++ min_count = 3; ++ ++ } else if (curlen === nextlen) { ++ max_count = 6; ++ min_count = 3; ++ ++ } else { ++ max_count = 7; ++ min_count = 4; ++ } ++ } ++} ++ ++ ++/* =========================================================================== ++ * Send a literal or distance tree in compressed form, using the codes in ++ * bl_tree. ++ */ ++function send_tree(s, tree, max_code) ++// deflate_state *s; ++// ct_data *tree; /* the tree to be scanned */ ++// int max_code; /* and its largest code of non zero frequency */ ++{ ++ var n; /* iterates over all tree elements */ ++ var prevlen = -1; /* last emitted length */ ++ var curlen; /* length of current code */ ++ ++ var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ ++ ++ var count = 0; /* repeat count of the current code */ ++ var max_count = 7; /* max repeat count */ ++ var min_count = 4; /* min repeat count */ ++ ++ /* tree[max_code+1].Len = -1; */ /* guard already set */ ++ if (nextlen === 0) { ++ max_count = 138; ++ min_count = 3; ++ } ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; ++ nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; ++ ++ if (++count < max_count && curlen === nextlen) { ++ continue; ++ ++ } else if (count < min_count) { ++ do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); ++ ++ } else if (curlen !== 0) { ++ if (curlen !== prevlen) { ++ send_code(s, curlen, s.bl_tree); ++ count--; ++ } ++ //Assert(count >= 3 && count <= 6, " 3_6?"); ++ send_code(s, REP_3_6, s.bl_tree); ++ send_bits(s, count - 3, 2); ++ ++ } else if (count <= 10) { ++ send_code(s, REPZ_3_10, s.bl_tree); ++ send_bits(s, count - 3, 3); ++ ++ } else { ++ send_code(s, REPZ_11_138, s.bl_tree); ++ send_bits(s, count - 11, 7); ++ } ++ ++ count = 0; ++ prevlen = curlen; ++ if (nextlen === 0) { ++ max_count = 138; ++ min_count = 3; ++ ++ } else if (curlen === nextlen) { ++ max_count = 6; ++ min_count = 3; ++ ++ } else { ++ max_count = 7; ++ min_count = 4; ++ } ++ } ++} ++ ++ ++/* =========================================================================== ++ * Construct the Huffman tree for the bit lengths and return the index in ++ * bl_order of the last bit length code to send. ++ */ ++function build_bl_tree(s) { ++ var max_blindex; /* index of last bit length code of non zero freq */ ++ ++ /* Determine the bit length frequencies for literal and distance trees */ ++ scan_tree(s, s.dyn_ltree, s.l_desc.max_code); ++ scan_tree(s, s.dyn_dtree, s.d_desc.max_code); ++ ++ /* Build the bit length tree: */ ++ build_tree(s, s.bl_desc); ++ /* opt_len now includes the length of the tree representations, except ++ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. ++ */ ++ ++ /* Determine the number of bit length codes to send. The pkzip format ++ * requires that at least 4 bit length codes be sent. (appnote.txt says ++ * 3 but the actual value used is 4.) ++ */ ++ for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { ++ if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { ++ break; ++ } ++ } ++ /* Update opt_len to include the bit length tree and counts */ ++ s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; ++ //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", ++ // s->opt_len, s->static_len)); ++ ++ return max_blindex; ++} ++ ++ ++/* =========================================================================== ++ * Send the header for a block using dynamic Huffman trees: the counts, the ++ * lengths of the bit length codes, the literal tree and the distance tree. ++ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. ++ */ ++function send_all_trees(s, lcodes, dcodes, blcodes) ++// deflate_state *s; ++// int lcodes, dcodes, blcodes; /* number of codes for each tree */ ++{ ++ var rank; /* index in bl_order */ ++ ++ //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); ++ //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, ++ // "too many codes"); ++ //Tracev((stderr, "\nbl counts: ")); ++ send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ ++ send_bits(s, dcodes - 1, 5); ++ send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ ++ for (rank = 0; rank < blcodes; rank++) { ++ //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); ++ send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); ++ } ++ //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ ++ //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ ++ //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); ++} ++ ++ ++/* =========================================================================== ++ * Check if the data type is TEXT or BINARY, using the following algorithm: ++ * - TEXT if the two conditions below are satisfied: ++ * a) There are no non-portable control characters belonging to the ++ * "black list" (0..6, 14..25, 28..31). ++ * b) There is at least one printable character belonging to the ++ * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). ++ * - BINARY otherwise. ++ * - The following partially-portable control characters form a ++ * "gray list" that is ignored in this detection algorithm: ++ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). ++ * IN assertion: the fields Freq of dyn_ltree are set. ++ */ ++function detect_data_type(s) { ++ /* black_mask is the bit mask of black-listed bytes ++ * set bits 0..6, 14..25, and 28..31 ++ * 0xf3ffc07f = binary 11110011111111111100000001111111 ++ */ ++ var black_mask = 0xf3ffc07f; ++ var n; ++ ++ /* Check for non-textual ("black-listed") bytes. */ ++ for (n = 0; n <= 31; n++, black_mask >>>= 1) { ++ if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { ++ return Z_BINARY; ++ } ++ } ++ ++ /* Check for textual ("white-listed") bytes. */ ++ if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || ++ s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { ++ return Z_TEXT; ++ } ++ for (n = 32; n < LITERALS; n++) { ++ if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { ++ return Z_TEXT; ++ } ++ } ++ ++ /* There are no "black-listed" or "white-listed" bytes: ++ * this stream either is empty or has tolerated ("gray-listed") bytes only. ++ */ ++ return Z_BINARY; ++} ++ ++ ++var static_init_done = false; ++ ++/* =========================================================================== ++ * Initialize the tree data structures for a new zlib stream. ++ */ ++function _tr_init(s) ++{ ++ ++ if (!static_init_done) { ++ tr_static_init(); ++ static_init_done = true; ++ } ++ ++ s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); ++ s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); ++ s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); ++ ++ s.bi_buf = 0; ++ s.bi_valid = 0; ++ ++ /* Initialize the first block of the first file: */ ++ init_block(s); ++} ++ ++ ++/* =========================================================================== ++ * Send a stored block ++ */ ++function _tr_stored_block(s, buf, stored_len, last) ++//DeflateState *s; ++//charf *buf; /* input block */ ++//ulg stored_len; /* length of input block */ ++//int last; /* one if this is the last block for a file */ ++{ ++ send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ ++ copy_block(s, buf, stored_len, true); /* with header */ ++} ++ ++ ++/* =========================================================================== ++ * Send one empty static block to give enough lookahead for inflate. ++ * This takes 10 bits, of which 7 may remain in the bit buffer. ++ */ ++function _tr_align(s) { ++ send_bits(s, STATIC_TREES << 1, 3); ++ send_code(s, END_BLOCK, static_ltree); ++ bi_flush(s); ++} ++ ++ ++/* =========================================================================== ++ * Determine the best encoding for the current block: dynamic trees, static ++ * trees or store, and output the encoded block to the zip file. ++ */ ++function _tr_flush_block(s, buf, stored_len, last) ++//DeflateState *s; ++//charf *buf; /* input block, or NULL if too old */ ++//ulg stored_len; /* length of input block */ ++//int last; /* one if this is the last block for a file */ ++{ ++ var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ ++ var max_blindex = 0; /* index of last bit length code of non zero freq */ ++ ++ /* Build the Huffman trees unless a stored block is forced */ ++ if (s.level > 0) { ++ ++ /* Check if the file is binary or text */ ++ if (s.strm.data_type === Z_UNKNOWN) { ++ s.strm.data_type = detect_data_type(s); ++ } ++ ++ /* Construct the literal and distance trees */ ++ build_tree(s, s.l_desc); ++ // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, ++ // s->static_len)); ++ ++ build_tree(s, s.d_desc); ++ // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, ++ // s->static_len)); ++ /* At this point, opt_len and static_len are the total bit lengths of ++ * the compressed block data, excluding the tree representations. ++ */ ++ ++ /* Build the bit length tree for the above two trees, and get the index ++ * in bl_order of the last bit length code to send. ++ */ ++ max_blindex = build_bl_tree(s); ++ ++ /* Determine the best encoding. Compute the block lengths in bytes. */ ++ opt_lenb = (s.opt_len + 3 + 7) >>> 3; ++ static_lenb = (s.static_len + 3 + 7) >>> 3; ++ ++ // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", ++ // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, ++ // s->last_lit)); ++ ++ if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } ++ ++ } else { ++ // Assert(buf != (char*)0, "lost buf"); ++ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ ++ } ++ ++ if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { ++ /* 4: two words for the lengths */ ++ ++ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. ++ * Otherwise we can't have processed more than WSIZE input bytes since ++ * the last block flush, because compression would have been ++ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to ++ * transform a block into a stored block. ++ */ ++ _tr_stored_block(s, buf, stored_len, last); ++ ++ } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { ++ ++ send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); ++ compress_block(s, static_ltree, static_dtree); ++ ++ } else { ++ send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); ++ send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); ++ compress_block(s, s.dyn_ltree, s.dyn_dtree); ++ } ++ // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); ++ /* The above check is made mod 2^32, for files larger than 512 MB ++ * and uLong implemented on 32 bits. ++ */ ++ init_block(s); ++ ++ if (last) { ++ bi_windup(s); ++ } ++ // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, ++ // s->compressed_len-7*last)); ++} ++ ++/* =========================================================================== ++ * Save the match info and tally the frequency counts. Return true if ++ * the current block must be flushed. ++ */ ++function _tr_tally(s, dist, lc) ++// deflate_state *s; ++// unsigned dist; /* distance of matched string */ ++// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ ++{ ++ //var out_length, in_length, dcode; ++ ++ s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; ++ s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; ++ ++ s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; ++ s.last_lit++; ++ ++ if (dist === 0) { ++ /* lc is the unmatched char */ ++ s.dyn_ltree[lc * 2]/*.Freq*/++; ++ } else { ++ s.matches++; ++ /* Here, lc is the match length - MIN_MATCH */ ++ dist--; /* dist = match distance - 1 */ ++ //Assert((ush)dist < (ush)MAX_DIST(s) && ++ // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && ++ // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); ++ ++ s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; ++ s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; ++ } ++ ++// (!) This block is disabled in zlib defailts, ++// don't enable it for binary compatibility ++ ++//#ifdef TRUNCATE_BLOCK ++// /* Try to guess if it is profitable to stop the current block here */ ++// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { ++// /* Compute an upper bound for the compressed length */ ++// out_length = s.last_lit*8; ++// in_length = s.strstart - s.block_start; ++// ++// for (dcode = 0; dcode < D_CODES; dcode++) { ++// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); ++// } ++// out_length >>>= 3; ++// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", ++// // s->last_lit, in_length, out_length, ++// // 100L - out_length*100L/in_length)); ++// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { ++// return true; ++// } ++// } ++//#endif ++ ++ return (s.last_lit === s.lit_bufsize - 1); ++ /* We avoid equality with lit_bufsize because of wraparound at 64K ++ * on 16 bit machines and because stored blocks are restricted to ++ * 64K-1 bytes. ++ */ ++} ++ ++exports._tr_init = _tr_init; ++exports._tr_stored_block = _tr_stored_block; ++exports._tr_flush_block = _tr_flush_block; ++exports._tr_tally = _tr_tally; ++exports._tr_align = _tr_align; ++ ++}, ++"yxgrTU4etUDxqw4hYWW2VP0RaSrSFAX8bRoT3RQUMhM=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++module.exports = function generate_contains(it, $keyword, $ruleType) { ++ var out = ' '; ++ var $lvl = it.level; ++ var $dataLvl = it.dataLevel; ++ var $schema = it.schema[$keyword]; ++ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); ++ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; ++ var $breakOnError = !it.opts.allErrors; ++ var $data = 'data' + ($dataLvl || ''); ++ var $valid = 'valid' + $lvl; ++ var $errs = 'errs__' + $lvl; ++ var $it = it.util.copy(it); ++ var $closingBraces = ''; ++ $it.level++; ++ var $nextValid = 'valid' + $it.level; ++ var $idx = 'i' + $lvl, ++ $dataNxt = $it.dataLevel = it.dataLevel + 1, ++ $nextData = 'data' + $dataNxt, ++ $currentBaseId = it.baseId, ++ $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); ++ out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; ++ if ($nonEmptySchema) { ++ var $wasComposite = it.compositeRule; ++ it.compositeRule = $it.compositeRule = true; ++ $it.schema = $schema; ++ $it.schemaPath = $schemaPath; ++ $it.errSchemaPath = $errSchemaPath; ++ out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; ++ $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); ++ var $passData = $data + '[' + $idx + ']'; ++ $it.dataPathArr[$dataNxt] = $idx; ++ var $code = it.validate($it); ++ $it.baseId = $currentBaseId; ++ if (it.util.varOccurences($code, $nextData) < 2) { ++ out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; ++ } else { ++ out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; ++ } ++ out += ' if (' + ($nextValid) + ') break; } '; ++ it.compositeRule = $it.compositeRule = $wasComposite; ++ out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; ++ } else { ++ out += ' if (' + ($data) + '.length == 0) {'; ++ } ++ var $$outStack = $$outStack || []; ++ $$outStack.push(out); ++ out = ''; /* istanbul ignore else */ ++ if (it.createErrors !== false) { ++ out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; ++ if (it.opts.messages !== false) { ++ out += ' , message: \'should contain a valid item\' '; ++ } ++ if (it.opts.verbose) { ++ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; ++ } ++ out += ' } '; ++ } else { ++ out += ' {} '; ++ } ++ var __err = out; ++ out = $$outStack.pop(); ++ if (!it.compositeRule && $breakOnError) { ++ /* istanbul ignore if */ ++ if (it.async) { ++ out += ' throw new ValidationError([' + (__err) + ']); '; ++ } else { ++ out += ' validate.errors = [' + (__err) + ']; return false; '; ++ } ++ } else { ++ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; ++ } ++ out += ' } else { '; ++ if ($nonEmptySchema) { ++ out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; ++ } ++ if (it.opts.allErrors) { ++ out += ' } '; ++ } ++ return out; ++} ++ ++}, ++"yyGtXS3SVeIZVGDs1aC91lz/Ct7iqf1shglRwiyf1Lg=": ++function (require, module, exports, __dirname, __filename) { ++'use strict' ++ ++const { Buffer } = require('buffer') ++const symbol = Symbol.for('BufferList') ++ ++function BufferList (buf) { ++ if (!(this instanceof BufferList)) { ++ return new BufferList(buf) ++ } ++ ++ BufferList._init.call(this, buf) ++} ++ ++BufferList._init = function _init (buf) { ++ Object.defineProperty(this, symbol, { value: true }) ++ ++ this._bufs = [] ++ this.length = 0 ++ ++ if (buf) { ++ this.append(buf) ++ } ++} ++ ++BufferList.prototype._new = function _new (buf) { ++ return new BufferList(buf) ++} ++ ++BufferList.prototype._offset = function _offset (offset) { ++ if (offset === 0) { ++ return [0, 0] ++ } ++ ++ let tot = 0 ++ ++ for (let i = 0; i < this._bufs.length; i++) { ++ const _t = tot + this._bufs[i].length ++ if (offset < _t || i === this._bufs.length - 1) { ++ return [i, offset - tot] ++ } ++ tot = _t ++ } ++} ++ ++BufferList.prototype._reverseOffset = function (blOffset) { ++ const bufferId = blOffset[0] ++ let offset = blOffset[1] ++ ++ for (let i = 0; i < bufferId; i++) { ++ offset += this._bufs[i].length ++ } ++ ++ return offset ++} ++ ++BufferList.prototype.get = function get (index) { ++ if (index > this.length || index < 0) { ++ return undefined ++ } ++ ++ const offset = this._offset(index) ++ ++ return this._bufs[offset[0]][offset[1]] ++} ++ ++BufferList.prototype.slice = function slice (start, end) { ++ if (typeof start === 'number' && start < 0) { ++ start += this.length ++ } ++ ++ if (typeof end === 'number' && end < 0) { ++ end += this.length ++ } ++ ++ return this.copy(null, 0, start, end) ++} ++ ++BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { ++ if (typeof srcStart !== 'number' || srcStart < 0) { ++ srcStart = 0 ++ } ++ ++ if (typeof srcEnd !== 'number' || srcEnd > this.length) { ++ srcEnd = this.length ++ } ++ ++ if (srcStart >= this.length) { ++ return dst || Buffer.alloc(0) ++ } ++ ++ if (srcEnd <= 0) { ++ return dst || Buffer.alloc(0) ++ } ++ ++ const copy = !!dst ++ const off = this._offset(srcStart) ++ const len = srcEnd - srcStart ++ let bytes = len ++ let bufoff = (copy && dstStart) || 0 ++ let start = off[1] ++ ++ // copy/slice everything ++ if (srcStart === 0 && srcEnd === this.length) { ++ if (!copy) { ++ // slice, but full concat if multiple buffers ++ return this._bufs.length === 1 ++ ? this._bufs[0] ++ : Buffer.concat(this._bufs, this.length) ++ } ++ ++ // copy, need to copy individual buffers ++ for (let i = 0; i < this._bufs.length; i++) { ++ this._bufs[i].copy(dst, bufoff) ++ bufoff += this._bufs[i].length ++ } ++ ++ return dst ++ } ++ ++ // easy, cheap case where it's a subset of one of the buffers ++ if (bytes <= this._bufs[off[0]].length - start) { ++ return copy ++ ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) ++ : this._bufs[off[0]].slice(start, start + bytes) ++ } ++ ++ if (!copy) { ++ // a slice, we need something to copy in to ++ dst = Buffer.allocUnsafe(len) ++ } ++ ++ for (let i = off[0]; i < this._bufs.length; i++) { ++ const l = this._bufs[i].length - start ++ ++ if (bytes > l) { ++ this._bufs[i].copy(dst, bufoff, start) ++ bufoff += l ++ } else { ++ this._bufs[i].copy(dst, bufoff, start, start + bytes) ++ bufoff += l ++ break ++ } ++ ++ bytes -= l ++ ++ if (start) { ++ start = 0 ++ } ++ } ++ ++ // safeguard so that we don't return uninitialized memory ++ if (dst.length > bufoff) return dst.slice(0, bufoff) ++ ++ return dst ++} ++ ++BufferList.prototype.shallowSlice = function shallowSlice (start, end) { ++ start = start || 0 ++ end = typeof end !== 'number' ? this.length : end ++ ++ if (start < 0) { ++ start += this.length ++ } ++ ++ if (end < 0) { ++ end += this.length ++ } ++ ++ if (start === end) { ++ return this._new() ++ } ++ ++ const startOffset = this._offset(start) ++ const endOffset = this._offset(end) ++ const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1) ++ ++ if (endOffset[1] === 0) { ++ buffers.pop() ++ } else { ++ buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]) ++ } ++ ++ if (startOffset[1] !== 0) { ++ buffers[0] = buffers[0].slice(startOffset[1]) ++ } ++ ++ return this._new(buffers) ++} ++ ++BufferList.prototype.toString = function toString (encoding, start, end) { ++ return this.slice(start, end).toString(encoding) ++} ++ ++BufferList.prototype.consume = function consume (bytes) { ++ // first, normalize the argument, in accordance with how Buffer does it ++ bytes = Math.trunc(bytes) ++ // do nothing if not a positive number ++ if (Number.isNaN(bytes) || bytes <= 0) return this ++ ++ while (this._bufs.length) { ++ if (bytes >= this._bufs[0].length) { ++ bytes -= this._bufs[0].length ++ this.length -= this._bufs[0].length ++ this._bufs.shift() ++ } else { ++ this._bufs[0] = this._bufs[0].slice(bytes) ++ this.length -= bytes ++ break ++ } ++ } ++ ++ return this ++} ++ ++BufferList.prototype.duplicate = function duplicate () { ++ const copy = this._new() ++ ++ for (let i = 0; i < this._bufs.length; i++) { ++ copy.append(this._bufs[i]) ++ } ++ ++ return copy ++} ++ ++BufferList.prototype.append = function append (buf) { ++ if (buf == null) { ++ return this ++ } ++ ++ if (buf.buffer) { ++ // append a view of the underlying ArrayBuffer ++ this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)) ++ } else if (Array.isArray(buf)) { ++ for (let i = 0; i < buf.length; i++) { ++ this.append(buf[i]) ++ } ++ } else if (this._isBufferList(buf)) { ++ // unwrap argument into individual BufferLists ++ for (let i = 0; i < buf._bufs.length; i++) { ++ this.append(buf._bufs[i]) ++ } ++ } else { ++ // coerce number arguments to strings, since Buffer(number) does ++ // uninitialized memory allocation ++ if (typeof buf === 'number') { ++ buf = buf.toString() ++ } ++ ++ this._appendBuffer(Buffer.from(buf)) ++ } ++ ++ return this ++} ++ ++BufferList.prototype._appendBuffer = function appendBuffer (buf) { ++ this._bufs.push(buf) ++ this.length += buf.length ++} ++ ++BufferList.prototype.indexOf = function (search, offset, encoding) { ++ if (encoding === undefined && typeof offset === 'string') { ++ encoding = offset ++ offset = undefined ++ } ++ ++ if (typeof search === 'function' || Array.isArray(search)) { ++ throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.') ++ } else if (typeof search === 'number') { ++ search = Buffer.from([search]) ++ } else if (typeof search === 'string') { ++ search = Buffer.from(search, encoding) ++ } else if (this._isBufferList(search)) { ++ search = search.slice() ++ } else if (Array.isArray(search.buffer)) { ++ search = Buffer.from(search.buffer, search.byteOffset, search.byteLength) ++ } else if (!Buffer.isBuffer(search)) { ++ search = Buffer.from(search) ++ } ++ ++ offset = Number(offset || 0) ++ ++ if (isNaN(offset)) { ++ offset = 0 ++ } ++ ++ if (offset < 0) { ++ offset = this.length + offset ++ } ++ ++ if (offset < 0) { ++ offset = 0 ++ } ++ ++ if (search.length === 0) { ++ return offset > this.length ? this.length : offset ++ } ++ ++ const blOffset = this._offset(offset) ++ let blIndex = blOffset[0] // index of which internal buffer we're working on ++ let buffOffset = blOffset[1] // offset of the internal buffer we're working on ++ ++ // scan over each buffer ++ for (; blIndex < this._bufs.length; blIndex++) { ++ const buff = this._bufs[blIndex] ++ ++ while (buffOffset < buff.length) { ++ const availableWindow = buff.length - buffOffset ++ ++ if (availableWindow >= search.length) { ++ const nativeSearchResult = buff.indexOf(search, buffOffset) ++ ++ if (nativeSearchResult !== -1) { ++ return this._reverseOffset([blIndex, nativeSearchResult]) ++ } ++ ++ buffOffset = buff.length - search.length + 1 // end of native search window ++ } else { ++ const revOffset = this._reverseOffset([blIndex, buffOffset]) ++ ++ if (this._match(revOffset, search)) { ++ return revOffset ++ } ++ ++ buffOffset++ ++ } ++ } ++ ++ buffOffset = 0 ++ } ++ ++ return -1 ++} ++ ++BufferList.prototype._match = function (offset, search) { ++ if (this.length - offset < search.length) { ++ return false ++ } ++ ++ for (let searchOffset = 0; searchOffset < search.length; searchOffset++) { ++ if (this.get(offset + searchOffset) !== search[searchOffset]) { ++ return false ++ } ++ } ++ return true ++} ++ ++;(function () { ++ const methods = { ++ readDoubleBE: 8, ++ readDoubleLE: 8, ++ readFloatBE: 4, ++ readFloatLE: 4, ++ readInt32BE: 4, ++ readInt32LE: 4, ++ readUInt32BE: 4, ++ readUInt32LE: 4, ++ readInt16BE: 2, ++ readInt16LE: 2, ++ readUInt16BE: 2, ++ readUInt16LE: 2, ++ readInt8: 1, ++ readUInt8: 1, ++ readIntBE: null, ++ readIntLE: null, ++ readUIntBE: null, ++ readUIntLE: null ++ } ++ ++ for (const m in methods) { ++ (function (m) { ++ if (methods[m] === null) { ++ BufferList.prototype[m] = function (offset, byteLength) { ++ return this.slice(offset, offset + byteLength)[m](0, byteLength) ++ } ++ } else { ++ BufferList.prototype[m] = function (offset = 0) { ++ return this.slice(offset, offset + methods[m])[m](0) ++ } ++ } ++ }(m)) ++ } ++}()) ++ ++// Used internally by the class and also as an indicator of this object being ++// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser ++// environment because there could be multiple different copies of the ++// BufferList class and some `BufferList`s might be `BufferList`s. ++BufferList.prototype._isBufferList = function _isBufferList (b) { ++ return b instanceof BufferList || BufferList.isBufferList(b) ++} ++ ++BufferList.isBufferList = function isBufferList (b) { ++ return b != null && b[symbol] ++} ++ ++module.exports = BufferList ++ ++}, ++"z0Z6Sjt9EnghODz2IkC0JVHIGvdqmmUsKFwBWKxtAKo=": ++function (require, module, exports, __dirname, __filename) { ++/* -*- Mode: js; js-indent-level: 2; -*- */ ++/* ++ * Copyright 2011 Mozilla Foundation and contributors ++ * Licensed under the New BSD license. See LICENSE or: ++ * http://opensource.org/licenses/BSD-3-Clause ++ */ ++ ++/** ++ * This is a helper function for getting values from parameter/options ++ * objects. ++ * ++ * @param args The object we are extracting values from ++ * @param name The name of the property we are getting. ++ * @param defaultValue An optional value to return if the property is missing ++ * from the object. If this is not specified and the property is missing, an ++ * error will be thrown. ++ */ ++function getArg(aArgs, aName, aDefaultValue) { ++ if (aName in aArgs) { ++ return aArgs[aName]; ++ } else if (arguments.length === 3) { ++ return aDefaultValue; ++ } else { ++ throw new Error('"' + aName + '" is a required argument.'); ++ } ++} ++exports.getArg = getArg; ++ ++var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; ++var dataUrlRegexp = /^data:.+\,.+$/; ++ ++function urlParse(aUrl) { ++ var match = aUrl.match(urlRegexp); ++ if (!match) { ++ return null; ++ } ++ return { ++ scheme: match[1], ++ auth: match[2], ++ host: match[3], ++ port: match[4], ++ path: match[5] ++ }; ++} ++exports.urlParse = urlParse; ++ ++function urlGenerate(aParsedUrl) { ++ var url = ''; ++ if (aParsedUrl.scheme) { ++ url += aParsedUrl.scheme + ':'; ++ } ++ url += '//'; ++ if (aParsedUrl.auth) { ++ url += aParsedUrl.auth + '@'; ++ } ++ if (aParsedUrl.host) { ++ url += aParsedUrl.host; ++ } ++ if (aParsedUrl.port) { ++ url += ":" + aParsedUrl.port ++ } ++ if (aParsedUrl.path) { ++ url += aParsedUrl.path; ++ } ++ return url; ++} ++exports.urlGenerate = urlGenerate; ++ ++/** ++ * Normalizes a path, or the path portion of a URL: ++ * ++ * - Replaces consecutive slashes with one slash. ++ * - Removes unnecessary '.' parts. ++ * - Removes unnecessary '/..' parts. ++ * ++ * Based on code in the Node.js 'path' core module. ++ * ++ * @param aPath The path or url to normalize. ++ */ ++function normalize(aPath) { ++ var path = aPath; ++ var url = urlParse(aPath); ++ if (url) { ++ if (!url.path) { ++ return aPath; ++ } ++ path = url.path; ++ } ++ var isAbsolute = exports.isAbsolute(path); ++ ++ var parts = path.split(/\/+/); ++ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { ++ part = parts[i]; ++ if (part === '.') { ++ parts.splice(i, 1); ++ } else if (part === '..') { ++ up++; ++ } else if (up > 0) { ++ if (part === '') { ++ // The first part is blank if the path is absolute. Trying to go ++ // above the root is a no-op. Therefore we can remove all '..' parts ++ // directly after the root. ++ parts.splice(i + 1, up); ++ up = 0; ++ } else { ++ parts.splice(i, 2); ++ up--; ++ } ++ } ++ } ++ path = parts.join('/'); ++ ++ if (path === '') { ++ path = isAbsolute ? '/' : '.'; ++ } ++ ++ if (url) { ++ url.path = path; ++ return urlGenerate(url); ++ } ++ return path; ++} ++exports.normalize = normalize; ++ ++/** ++ * Joins two paths/URLs. ++ * ++ * @param aRoot The root path or URL. ++ * @param aPath The path or URL to be joined with the root. ++ * ++ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a ++ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended ++ * first. ++ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion ++ * is updated with the result and aRoot is returned. Otherwise the result ++ * is returned. ++ * - If aPath is absolute, the result is aPath. ++ * - Otherwise the two paths are joined with a slash. ++ * - Joining for example 'http://' and 'www.example.com' is also supported. ++ */ ++function join(aRoot, aPath) { ++ if (aRoot === "") { ++ aRoot = "."; ++ } ++ if (aPath === "") { ++ aPath = "."; ++ } ++ var aPathUrl = urlParse(aPath); ++ var aRootUrl = urlParse(aRoot); ++ if (aRootUrl) { ++ aRoot = aRootUrl.path || '/'; ++ } ++ ++ // `join(foo, '//www.example.org')` ++ if (aPathUrl && !aPathUrl.scheme) { ++ if (aRootUrl) { ++ aPathUrl.scheme = aRootUrl.scheme; ++ } ++ return urlGenerate(aPathUrl); ++ } ++ ++ if (aPathUrl || aPath.match(dataUrlRegexp)) { ++ return aPath; ++ } ++ ++ // `join('http://', 'www.example.com')` ++ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { ++ aRootUrl.host = aPath; ++ return urlGenerate(aRootUrl); ++ } ++ ++ var joined = aPath.charAt(0) === '/' ++ ? aPath ++ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); ++ ++ if (aRootUrl) { ++ aRootUrl.path = joined; ++ return urlGenerate(aRootUrl); ++ } ++ return joined; ++} ++exports.join = join; ++ ++exports.isAbsolute = function (aPath) { ++ return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp); ++}; ++ ++/** ++ * Make a path relative to a URL or another path. ++ * ++ * @param aRoot The root path or URL. ++ * @param aPath The path or URL to be made relative to aRoot. ++ */ ++function relative(aRoot, aPath) { ++ if (aRoot === "") { ++ aRoot = "."; ++ } ++ ++ aRoot = aRoot.replace(/\/$/, ''); ++ ++ // It is possible for the path to be above the root. In this case, simply ++ // checking whether the root is a prefix of the path won't work. Instead, we ++ // need to remove components from the root one by one, until either we find ++ // a prefix that fits, or we run out of components to remove. ++ var level = 0; ++ while (aPath.indexOf(aRoot + '/') !== 0) { ++ var index = aRoot.lastIndexOf("/"); ++ if (index < 0) { ++ return aPath; ++ } ++ ++ // If the only part of the root that is left is the scheme (i.e. http://, ++ // file:///, etc.), one or more slashes (/), or simply nothing at all, we ++ // have exhausted all components, so the path is not relative to the root. ++ aRoot = aRoot.slice(0, index); ++ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { ++ return aPath; ++ } ++ ++ ++level; ++ } ++ ++ // Make sure we add a "../" for each component we removed from the root. ++ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); ++} ++exports.relative = relative; ++ ++var supportsNullProto = (function () { ++ var obj = Object.create(null); ++ return !('__proto__' in obj); ++}()); ++ ++function identity (s) { ++ return s; ++} ++ ++/** ++ * Because behavior goes wacky when you set `__proto__` on objects, we ++ * have to prefix all the strings in our set with an arbitrary character. ++ * ++ * See https://github.com/mozilla/source-map/pull/31 and ++ * https://github.com/mozilla/source-map/issues/30 ++ * ++ * @param String aStr ++ */ ++function toSetString(aStr) { ++ if (isProtoString(aStr)) { ++ return '$' + aStr; ++ } ++ ++ return aStr; ++} ++exports.toSetString = supportsNullProto ? identity : toSetString; ++ ++function fromSetString(aStr) { ++ if (isProtoString(aStr)) { ++ return aStr.slice(1); ++ } ++ ++ return aStr; ++} ++exports.fromSetString = supportsNullProto ? identity : fromSetString; ++ ++function isProtoString(s) { ++ if (!s) { ++ return false; ++ } ++ ++ var length = s.length; ++ ++ if (length < 9 /* "__proto__".length */) { ++ return false; ++ } ++ ++ if (s.charCodeAt(length - 1) !== 95 /* '_' */ || ++ s.charCodeAt(length - 2) !== 95 /* '_' */ || ++ s.charCodeAt(length - 3) !== 111 /* 'o' */ || ++ s.charCodeAt(length - 4) !== 116 /* 't' */ || ++ s.charCodeAt(length - 5) !== 111 /* 'o' */ || ++ s.charCodeAt(length - 6) !== 114 /* 'r' */ || ++ s.charCodeAt(length - 7) !== 112 /* 'p' */ || ++ s.charCodeAt(length - 8) !== 95 /* '_' */ || ++ s.charCodeAt(length - 9) !== 95 /* '_' */) { ++ return false; ++ } ++ ++ for (var i = length - 10; i >= 0; i--) { ++ if (s.charCodeAt(i) !== 36 /* '$' */) { ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++/** ++ * Comparator between two mappings where the original positions are compared. ++ * ++ * Optionally pass in `true` as `onlyCompareGenerated` to consider two ++ * mappings with the same original source/line/column, but different generated ++ * line and column the same. Useful when searching for a mapping with a ++ * stubbed out mapping. ++ */ ++function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { ++ var cmp = mappingA.source - mappingB.source; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalLine - mappingB.originalLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalColumn - mappingB.originalColumn; ++ if (cmp !== 0 || onlyCompareOriginal) { ++ return cmp; ++ } ++ ++ cmp = mappingA.generatedColumn - mappingB.generatedColumn; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.generatedLine - mappingB.generatedLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ return mappingA.name - mappingB.name; ++} ++exports.compareByOriginalPositions = compareByOriginalPositions; ++ ++/** ++ * Comparator between two mappings with deflated source and name indices where ++ * the generated positions are compared. ++ * ++ * Optionally pass in `true` as `onlyCompareGenerated` to consider two ++ * mappings with the same generated line and column, but different ++ * source/name/original line and column the same. Useful when searching for a ++ * mapping with a stubbed out mapping. ++ */ ++function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { ++ var cmp = mappingA.generatedLine - mappingB.generatedLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.generatedColumn - mappingB.generatedColumn; ++ if (cmp !== 0 || onlyCompareGenerated) { ++ return cmp; ++ } ++ ++ cmp = mappingA.source - mappingB.source; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalLine - mappingB.originalLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalColumn - mappingB.originalColumn; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ return mappingA.name - mappingB.name; ++} ++exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; ++ ++function strcmp(aStr1, aStr2) { ++ if (aStr1 === aStr2) { ++ return 0; ++ } ++ ++ if (aStr1 > aStr2) { ++ return 1; ++ } ++ ++ return -1; ++} ++ ++/** ++ * Comparator between two mappings with inflated source and name strings where ++ * the generated positions are compared. ++ */ ++function compareByGeneratedPositionsInflated(mappingA, mappingB) { ++ var cmp = mappingA.generatedLine - mappingB.generatedLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.generatedColumn - mappingB.generatedColumn; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = strcmp(mappingA.source, mappingB.source); ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalLine - mappingB.originalLine; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ cmp = mappingA.originalColumn - mappingB.originalColumn; ++ if (cmp !== 0) { ++ return cmp; ++ } ++ ++ return strcmp(mappingA.name, mappingB.name); ++} ++exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; ++ ++}, ++"z8Kne0cMDrjIYDxVJXaLO6k7ACLH6Pj/KF5xJo0AimE=": ++function (require, module, exports, __dirname, __filename) { ++"use strict"; ++/// ++/// ++/// ++Object.defineProperty(exports, "__esModule", { value: true }); ++const typedArrayTypeNames = [ ++ 'Int8Array', ++ 'Uint8Array', ++ 'Uint8ClampedArray', ++ 'Int16Array', ++ 'Uint16Array', ++ 'Int32Array', ++ 'Uint32Array', ++ 'Float32Array', ++ 'Float64Array', ++ 'BigInt64Array', ++ 'BigUint64Array' ++]; ++function isTypedArrayName(name) { ++ return typedArrayTypeNames.includes(name); ++} ++const objectTypeNames = [ ++ 'Function', ++ 'Generator', ++ 'AsyncGenerator', ++ 'GeneratorFunction', ++ 'AsyncGeneratorFunction', ++ 'AsyncFunction', ++ 'Observable', ++ 'Array', ++ 'Buffer', ++ 'Object', ++ 'RegExp', ++ 'Date', ++ 'Error', ++ 'Map', ++ 'Set', ++ 'WeakMap', ++ 'WeakSet', ++ 'ArrayBuffer', ++ 'SharedArrayBuffer', ++ 'DataView', ++ 'Promise', ++ 'URL', ++ 'HTMLElement', ++ ...typedArrayTypeNames ++]; ++function isObjectTypeName(name) { ++ return objectTypeNames.includes(name); ++} ++const primitiveTypeNames = [ ++ 'null', ++ 'undefined', ++ 'string', ++ 'number', ++ 'bigint', ++ 'boolean', ++ 'symbol' ++]; ++function isPrimitiveTypeName(name) { ++ return primitiveTypeNames.includes(name); ++} ++// eslint-disable-next-line @typescript-eslint/ban-types ++function isOfType(type) { ++ return (value) => typeof value === type; ++} ++const { toString } = Object.prototype; ++const getObjectType = (value) => { ++ const objectTypeName = toString.call(value).slice(8, -1); ++ if (/HTML\w+Element/.test(objectTypeName) && is.domElement(value)) { ++ return 'HTMLElement'; ++ } ++ if (isObjectTypeName(objectTypeName)) { ++ return objectTypeName; ++ } ++ return undefined; ++}; ++const isObjectOfType = (type) => (value) => getObjectType(value) === type; ++function is(value) { ++ if (value === null) { ++ return 'null'; ++ } ++ switch (typeof value) { ++ case 'undefined': ++ return 'undefined'; ++ case 'string': ++ return 'string'; ++ case 'number': ++ return 'number'; ++ case 'boolean': ++ return 'boolean'; ++ case 'function': ++ return 'Function'; ++ case 'bigint': ++ return 'bigint'; ++ case 'symbol': ++ return 'symbol'; ++ default: ++ } ++ if (is.observable(value)) { ++ return 'Observable'; ++ } ++ if (is.array(value)) { ++ return 'Array'; ++ } ++ if (is.buffer(value)) { ++ return 'Buffer'; ++ } ++ const tagType = getObjectType(value); ++ if (tagType) { ++ return tagType; ++ } ++ if (value instanceof String || value instanceof Boolean || value instanceof Number) { ++ throw new TypeError('Please don\'t use object wrappers for primitive types'); ++ } ++ return 'Object'; ++} ++is.undefined = isOfType('undefined'); ++is.string = isOfType('string'); ++const isNumberType = isOfType('number'); ++is.number = (value) => isNumberType(value) && !is.nan(value); ++is.bigint = isOfType('bigint'); ++// eslint-disable-next-line @typescript-eslint/ban-types ++is.function_ = isOfType('function'); ++is.null_ = (value) => value === null; ++is.class_ = (value) => is.function_(value) && value.toString().startsWith('class '); ++is.boolean = (value) => value === true || value === false; ++is.symbol = isOfType('symbol'); ++is.numericString = (value) => is.string(value) && !is.emptyStringOrWhitespace(value) && !Number.isNaN(Number(value)); ++is.array = (value, assertion) => { ++ if (!Array.isArray(value)) { ++ return false; ++ } ++ if (!is.function_(assertion)) { ++ return true; ++ } ++ return value.every(assertion); ++}; ++is.buffer = (value) => { var _a, _b, _c, _d; return (_d = (_c = (_b = (_a = value) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.isBuffer) === null || _c === void 0 ? void 0 : _c.call(_b, value)) !== null && _d !== void 0 ? _d : false; }; ++is.nullOrUndefined = (value) => is.null_(value) || is.undefined(value); ++is.object = (value) => !is.null_(value) && (typeof value === 'object' || is.function_(value)); ++is.iterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.iterator]); }; ++is.asyncIterable = (value) => { var _a; return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a[Symbol.asyncIterator]); }; ++is.generator = (value) => is.iterable(value) && is.function_(value.next) && is.function_(value.throw); ++is.asyncGenerator = (value) => is.asyncIterable(value) && is.function_(value.next) && is.function_(value.throw); ++is.nativePromise = (value) => isObjectOfType('Promise')(value); ++const hasPromiseAPI = (value) => { ++ var _a, _b; ++ return is.function_((_a = value) === null || _a === void 0 ? void 0 : _a.then) && ++ is.function_((_b = value) === null || _b === void 0 ? void 0 : _b.catch); ++}; ++is.promise = (value) => is.nativePromise(value) || hasPromiseAPI(value); ++is.generatorFunction = isObjectOfType('GeneratorFunction'); ++is.asyncGeneratorFunction = (value) => getObjectType(value) === 'AsyncGeneratorFunction'; ++is.asyncFunction = (value) => getObjectType(value) === 'AsyncFunction'; ++// eslint-disable-next-line no-prototype-builtins, @typescript-eslint/ban-types ++is.boundFunction = (value) => is.function_(value) && !value.hasOwnProperty('prototype'); ++is.regExp = isObjectOfType('RegExp'); ++is.date = isObjectOfType('Date'); ++is.error = isObjectOfType('Error'); ++is.map = (value) => isObjectOfType('Map')(value); ++is.set = (value) => isObjectOfType('Set')(value); ++is.weakMap = (value) => isObjectOfType('WeakMap')(value); ++is.weakSet = (value) => isObjectOfType('WeakSet')(value); ++is.int8Array = isObjectOfType('Int8Array'); ++is.uint8Array = isObjectOfType('Uint8Array'); ++is.uint8ClampedArray = isObjectOfType('Uint8ClampedArray'); ++is.int16Array = isObjectOfType('Int16Array'); ++is.uint16Array = isObjectOfType('Uint16Array'); ++is.int32Array = isObjectOfType('Int32Array'); ++is.uint32Array = isObjectOfType('Uint32Array'); ++is.float32Array = isObjectOfType('Float32Array'); ++is.float64Array = isObjectOfType('Float64Array'); ++is.bigInt64Array = isObjectOfType('BigInt64Array'); ++is.bigUint64Array = isObjectOfType('BigUint64Array'); ++is.arrayBuffer = isObjectOfType('ArrayBuffer'); ++is.sharedArrayBuffer = isObjectOfType('SharedArrayBuffer'); ++is.dataView = isObjectOfType('DataView'); ++is.directInstanceOf = (instance, class_) => Object.getPrototypeOf(instance) === class_.prototype; ++is.urlInstance = (value) => isObjectOfType('URL')(value); ++is.urlString = (value) => { ++ if (!is.string(value)) { ++ return false; ++ } ++ try { ++ new URL(value); // eslint-disable-line no-new ++ return true; ++ } ++ catch (_a) { ++ return false; ++ } ++}; ++// TODO: Use the `not` operator with a type guard here when it's available. ++// Example: `is.truthy = (value: unknown): value is (not false | not 0 | not '' | not undefined | not null) => Boolean(value);` ++is.truthy = (value) => Boolean(value); ++// Example: `is.falsy = (value: unknown): value is (not true | 0 | '' | undefined | null) => Boolean(value);` ++is.falsy = (value) => !value; ++is.nan = (value) => Number.isNaN(value); ++is.primitive = (value) => is.null_(value) || isPrimitiveTypeName(typeof value); ++is.integer = (value) => Number.isInteger(value); ++is.safeInteger = (value) => Number.isSafeInteger(value); ++is.plainObject = (value) => { ++ // From: https://github.com/sindresorhus/is-plain-obj/blob/main/index.js ++ if (toString.call(value) !== '[object Object]') { ++ return false; ++ } ++ const prototype = Object.getPrototypeOf(value); ++ return prototype === null || prototype === Object.getPrototypeOf({}); ++}; ++is.typedArray = (value) => isTypedArrayName(getObjectType(value)); ++const isValidLength = (value) => is.safeInteger(value) && value >= 0; ++is.arrayLike = (value) => !is.nullOrUndefined(value) && !is.function_(value) && isValidLength(value.length); ++is.inRange = (value, range) => { ++ if (is.number(range)) { ++ return value >= Math.min(0, range) && value <= Math.max(range, 0); ++ } ++ if (is.array(range) && range.length === 2) { ++ return value >= Math.min(...range) && value <= Math.max(...range); ++ } ++ throw new TypeError(`Invalid range: ${JSON.stringify(range)}`); ++}; ++const NODE_TYPE_ELEMENT = 1; ++const DOM_PROPERTIES_TO_CHECK = [ ++ 'innerHTML', ++ 'ownerDocument', ++ 'style', ++ 'attributes', ++ 'nodeValue' ++]; ++is.domElement = (value) => { ++ return is.object(value) && ++ value.nodeType === NODE_TYPE_ELEMENT && ++ is.string(value.nodeName) && ++ !is.plainObject(value) && ++ DOM_PROPERTIES_TO_CHECK.every(property => property in value); ++}; ++is.observable = (value) => { ++ var _a, _b, _c, _d; ++ if (!value) { ++ return false; ++ } ++ // eslint-disable-next-line no-use-extend-native/no-use-extend-native ++ if (value === ((_b = (_a = value)[Symbol.observable]) === null || _b === void 0 ? void 0 : _b.call(_a))) { ++ return true; ++ } ++ if (value === ((_d = (_c = value)['@@observable']) === null || _d === void 0 ? void 0 : _d.call(_c))) { ++ return true; ++ } ++ return false; ++}; ++is.nodeStream = (value) => is.object(value) && is.function_(value.pipe) && !is.observable(value); ++is.infinite = (value) => value === Infinity || value === -Infinity; ++const isAbsoluteMod2 = (remainder) => (value) => is.integer(value) && Math.abs(value % 2) === remainder; ++is.evenInteger = isAbsoluteMod2(0); ++is.oddInteger = isAbsoluteMod2(1); ++is.emptyArray = (value) => is.array(value) && value.length === 0; ++is.nonEmptyArray = (value) => is.array(value) && value.length > 0; ++is.emptyString = (value) => is.string(value) && value.length === 0; ++// TODO: Use `not ''` when the `not` operator is available. ++is.nonEmptyString = (value) => is.string(value) && value.length > 0; ++const isWhiteSpaceString = (value) => is.string(value) && !/\S/.test(value); ++is.emptyStringOrWhitespace = (value) => is.emptyString(value) || isWhiteSpaceString(value); ++is.emptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length === 0; ++// TODO: Use `not` operator here to remove `Map` and `Set` from type guard: ++// - https://github.com/Microsoft/TypeScript/pull/29317 ++is.nonEmptyObject = (value) => is.object(value) && !is.map(value) && !is.set(value) && Object.keys(value).length > 0; ++is.emptySet = (value) => is.set(value) && value.size === 0; ++is.nonEmptySet = (value) => is.set(value) && value.size > 0; ++is.emptyMap = (value) => is.map(value) && value.size === 0; ++is.nonEmptyMap = (value) => is.map(value) && value.size > 0; ++const predicateOnArray = (method, predicate, values) => { ++ if (!is.function_(predicate)) { ++ throw new TypeError(`Invalid predicate: ${JSON.stringify(predicate)}`); ++ } ++ if (values.length === 0) { ++ throw new TypeError('Invalid number of values'); ++ } ++ return method.call(values, predicate); ++}; ++is.any = (predicate, ...values) => { ++ const predicates = is.array(predicate) ? predicate : [predicate]; ++ return predicates.some(singlePredicate => predicateOnArray(Array.prototype.some, singlePredicate, values)); ++}; ++is.all = (predicate, ...values) => predicateOnArray(Array.prototype.every, predicate, values); ++const assertType = (condition, description, value, options = {}) => { ++ if (!condition) { ++ const { multipleValues } = options; ++ const valuesMessage = multipleValues ? ++ `received values of types ${[ ++ ...new Set(value.map(singleValue => `\`${is(singleValue)}\``)) ++ ].join(', ')}` : ++ `received value of type \`${is(value)}\``; ++ throw new TypeError(`Expected value which is \`${description}\`, ${valuesMessage}.`); ++ } ++}; ++exports.assert = { ++ // Unknowns. ++ undefined: (value) => assertType(is.undefined(value), 'undefined', value), ++ string: (value) => assertType(is.string(value), 'string', value), ++ number: (value) => assertType(is.number(value), 'number', value), ++ bigint: (value) => assertType(is.bigint(value), 'bigint', value), ++ // eslint-disable-next-line @typescript-eslint/ban-types ++ function_: (value) => assertType(is.function_(value), 'Function', value), ++ null_: (value) => assertType(is.null_(value), 'null', value), ++ class_: (value) => assertType(is.class_(value), "Class" /* class_ */, value), ++ boolean: (value) => assertType(is.boolean(value), 'boolean', value), ++ symbol: (value) => assertType(is.symbol(value), 'symbol', value), ++ numericString: (value) => assertType(is.numericString(value), "string with a number" /* numericString */, value), ++ array: (value, assertion) => { ++ const assert = assertType; ++ assert(is.array(value), 'Array', value); ++ if (assertion) { ++ value.forEach(assertion); ++ } ++ }, ++ buffer: (value) => assertType(is.buffer(value), 'Buffer', value), ++ nullOrUndefined: (value) => assertType(is.nullOrUndefined(value), "null or undefined" /* nullOrUndefined */, value), ++ object: (value) => assertType(is.object(value), 'Object', value), ++ iterable: (value) => assertType(is.iterable(value), "Iterable" /* iterable */, value), ++ asyncIterable: (value) => assertType(is.asyncIterable(value), "AsyncIterable" /* asyncIterable */, value), ++ generator: (value) => assertType(is.generator(value), 'Generator', value), ++ asyncGenerator: (value) => assertType(is.asyncGenerator(value), 'AsyncGenerator', value), ++ nativePromise: (value) => assertType(is.nativePromise(value), "native Promise" /* nativePromise */, value), ++ promise: (value) => assertType(is.promise(value), 'Promise', value), ++ generatorFunction: (value) => assertType(is.generatorFunction(value), 'GeneratorFunction', value), ++ asyncGeneratorFunction: (value) => assertType(is.asyncGeneratorFunction(value), 'AsyncGeneratorFunction', value), ++ // eslint-disable-next-line @typescript-eslint/ban-types ++ asyncFunction: (value) => assertType(is.asyncFunction(value), 'AsyncFunction', value), ++ // eslint-disable-next-line @typescript-eslint/ban-types ++ boundFunction: (value) => assertType(is.boundFunction(value), 'Function', value), ++ regExp: (value) => assertType(is.regExp(value), 'RegExp', value), ++ date: (value) => assertType(is.date(value), 'Date', value), ++ error: (value) => assertType(is.error(value), 'Error', value), ++ map: (value) => assertType(is.map(value), 'Map', value), ++ set: (value) => assertType(is.set(value), 'Set', value), ++ weakMap: (value) => assertType(is.weakMap(value), 'WeakMap', value), ++ weakSet: (value) => assertType(is.weakSet(value), 'WeakSet', value), ++ int8Array: (value) => assertType(is.int8Array(value), 'Int8Array', value), ++ uint8Array: (value) => assertType(is.uint8Array(value), 'Uint8Array', value), ++ uint8ClampedArray: (value) => assertType(is.uint8ClampedArray(value), 'Uint8ClampedArray', value), ++ int16Array: (value) => assertType(is.int16Array(value), 'Int16Array', value), ++ uint16Array: (value) => assertType(is.uint16Array(value), 'Uint16Array', value), ++ int32Array: (value) => assertType(is.int32Array(value), 'Int32Array', value), ++ uint32Array: (value) => assertType(is.uint32Array(value), 'Uint32Array', value), ++ float32Array: (value) => assertType(is.float32Array(value), 'Float32Array', value), ++ float64Array: (value) => assertType(is.float64Array(value), 'Float64Array', value), ++ bigInt64Array: (value) => assertType(is.bigInt64Array(value), 'BigInt64Array', value), ++ bigUint64Array: (value) => assertType(is.bigUint64Array(value), 'BigUint64Array', value), ++ arrayBuffer: (value) => assertType(is.arrayBuffer(value), 'ArrayBuffer', value), ++ sharedArrayBuffer: (value) => assertType(is.sharedArrayBuffer(value), 'SharedArrayBuffer', value), ++ dataView: (value) => assertType(is.dataView(value), 'DataView', value), ++ urlInstance: (value) => assertType(is.urlInstance(value), 'URL', value), ++ urlString: (value) => assertType(is.urlString(value), "string with a URL" /* urlString */, value), ++ truthy: (value) => assertType(is.truthy(value), "truthy" /* truthy */, value), ++ falsy: (value) => assertType(is.falsy(value), "falsy" /* falsy */, value), ++ nan: (value) => assertType(is.nan(value), "NaN" /* nan */, value), ++ primitive: (value) => assertType(is.primitive(value), "primitive" /* primitive */, value), ++ integer: (value) => assertType(is.integer(value), "integer" /* integer */, value), ++ safeInteger: (value) => assertType(is.safeInteger(value), "integer" /* safeInteger */, value), ++ plainObject: (value) => assertType(is.plainObject(value), "plain object" /* plainObject */, value), ++ typedArray: (value) => assertType(is.typedArray(value), "TypedArray" /* typedArray */, value), ++ arrayLike: (value) => assertType(is.arrayLike(value), "array-like" /* arrayLike */, value), ++ domElement: (value) => assertType(is.domElement(value), "HTMLElement" /* domElement */, value), ++ observable: (value) => assertType(is.observable(value), 'Observable', value), ++ nodeStream: (value) => assertType(is.nodeStream(value), "Node.js Stream" /* nodeStream */, value), ++ infinite: (value) => assertType(is.infinite(value), "infinite number" /* infinite */, value), ++ emptyArray: (value) => assertType(is.emptyArray(value), "empty array" /* emptyArray */, value), ++ nonEmptyArray: (value) => assertType(is.nonEmptyArray(value), "non-empty array" /* nonEmptyArray */, value), ++ emptyString: (value) => assertType(is.emptyString(value), "empty string" /* emptyString */, value), ++ nonEmptyString: (value) => assertType(is.nonEmptyString(value), "non-empty string" /* nonEmptyString */, value), ++ emptyStringOrWhitespace: (value) => assertType(is.emptyStringOrWhitespace(value), "empty string or whitespace" /* emptyStringOrWhitespace */, value), ++ emptyObject: (value) => assertType(is.emptyObject(value), "empty object" /* emptyObject */, value), ++ nonEmptyObject: (value) => assertType(is.nonEmptyObject(value), "non-empty object" /* nonEmptyObject */, value), ++ emptySet: (value) => assertType(is.emptySet(value), "empty set" /* emptySet */, value), ++ nonEmptySet: (value) => assertType(is.nonEmptySet(value), "non-empty set" /* nonEmptySet */, value), ++ emptyMap: (value) => assertType(is.emptyMap(value), "empty map" /* emptyMap */, value), ++ nonEmptyMap: (value) => assertType(is.nonEmptyMap(value), "non-empty map" /* nonEmptyMap */, value), ++ // Numbers. ++ evenInteger: (value) => assertType(is.evenInteger(value), "even integer" /* evenInteger */, value), ++ oddInteger: (value) => assertType(is.oddInteger(value), "odd integer" /* oddInteger */, value), ++ // Two arguments. ++ directInstanceOf: (instance, class_) => assertType(is.directInstanceOf(instance, class_), "T" /* directInstanceOf */, instance), ++ inRange: (value, range) => assertType(is.inRange(value, range), "in range" /* inRange */, value), ++ // Variadic functions. ++ any: (predicate, ...values) => { ++ return assertType(is.any(predicate, ...values), "predicate returns truthy for any value" /* any */, values, { multipleValues: true }); ++ }, ++ all: (predicate, ...values) => assertType(is.all(predicate, ...values), "predicate returns truthy for all values" /* all */, values, { multipleValues: true }) ++}; ++// Some few keywords are reserved, but we'll populate them for Node.js users ++// See https://github.com/Microsoft/TypeScript/issues/2536 ++Object.defineProperties(is, { ++ class: { ++ value: is.class_ ++ }, ++ function: { ++ value: is.function_ ++ }, ++ null: { ++ value: is.null_ ++ } ++}); ++Object.defineProperties(exports.assert, { ++ class: { ++ value: exports.assert.class_ ++ }, ++ function: { ++ value: exports.assert.function_ ++ }, ++ null: { ++ value: exports.assert.null_ ++ } ++}); ++exports.default = is; ++// For CommonJS default export support ++module.exports = is; ++module.exports.default = is; ++module.exports.assert = exports.assert; ++ ++}, ++"zDCJmjyCMuEYPW9NJqVDliE/aPdHbDSS94PQjiVAECM=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++ ++var compileSchema = require('./compile') ++ , resolve = require('./compile/resolve') ++ , Cache = require('./cache') ++ , SchemaObject = require('./compile/schema_obj') ++ , stableStringify = require('fast-json-stable-stringify') ++ , formats = require('./compile/formats') ++ , rules = require('./compile/rules') ++ , $dataMetaSchema = require('./data') ++ , util = require('./compile/util'); ++ ++module.exports = Ajv; ++ ++Ajv.prototype.validate = validate; ++Ajv.prototype.compile = compile; ++Ajv.prototype.addSchema = addSchema; ++Ajv.prototype.addMetaSchema = addMetaSchema; ++Ajv.prototype.validateSchema = validateSchema; ++Ajv.prototype.getSchema = getSchema; ++Ajv.prototype.removeSchema = removeSchema; ++Ajv.prototype.addFormat = addFormat; ++Ajv.prototype.errorsText = errorsText; ++ ++Ajv.prototype._addSchema = _addSchema; ++Ajv.prototype._compile = _compile; ++ ++Ajv.prototype.compileAsync = require('./compile/async'); ++var customKeyword = require('./keyword'); ++Ajv.prototype.addKeyword = customKeyword.add; ++Ajv.prototype.getKeyword = customKeyword.get; ++Ajv.prototype.removeKeyword = customKeyword.remove; ++Ajv.prototype.validateKeyword = customKeyword.validate; ++ ++var errorClasses = require('./compile/error_classes'); ++Ajv.ValidationError = errorClasses.Validation; ++Ajv.MissingRefError = errorClasses.MissingRef; ++Ajv.$dataMetaSchema = $dataMetaSchema; ++ ++var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; ++ ++var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; ++var META_SUPPORT_DATA = ['/properties']; ++ ++/** ++ * Creates validator instance. ++ * Usage: `Ajv(opts)` ++ * @param {Object} opts optional options ++ * @return {Object} ajv instance ++ */ ++function Ajv(opts) { ++ if (!(this instanceof Ajv)) return new Ajv(opts); ++ opts = this._opts = util.copy(opts) || {}; ++ setLogger(this); ++ this._schemas = {}; ++ this._refs = {}; ++ this._fragments = {}; ++ this._formats = formats(opts.format); ++ ++ this._cache = opts.cache || new Cache; ++ this._loadingSchemas = {}; ++ this._compilations = []; ++ this.RULES = rules(); ++ this._getId = chooseGetId(opts); ++ ++ opts.loopRequired = opts.loopRequired || Infinity; ++ if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; ++ if (opts.serialize === undefined) opts.serialize = stableStringify; ++ this._metaOpts = getMetaSchemaOptions(this); ++ ++ if (opts.formats) addInitialFormats(this); ++ if (opts.keywords) addInitialKeywords(this); ++ addDefaultMetaSchema(this); ++ if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); ++ if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); ++ addInitialSchemas(this); ++} ++ ++ ++ ++/** ++ * Validate data using schema ++ * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. ++ * @this Ajv ++ * @param {String|Object} schemaKeyRef key, ref or schema object ++ * @param {Any} data to be validated ++ * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). ++ */ ++function validate(schemaKeyRef, data) { ++ var v; ++ if (typeof schemaKeyRef == 'string') { ++ v = this.getSchema(schemaKeyRef); ++ if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); ++ } else { ++ var schemaObj = this._addSchema(schemaKeyRef); ++ v = schemaObj.validate || this._compile(schemaObj); ++ } ++ ++ var valid = v(data); ++ if (v.$async !== true) this.errors = v.errors; ++ return valid; ++} ++ ++ ++/** ++ * Create validating function for passed schema. ++ * @this Ajv ++ * @param {Object} schema schema object ++ * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. ++ * @return {Function} validating function ++ */ ++function compile(schema, _meta) { ++ var schemaObj = this._addSchema(schema, undefined, _meta); ++ return schemaObj.validate || this._compile(schemaObj); ++} ++ ++ ++/** ++ * Adds schema to the instance. ++ * @this Ajv ++ * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. ++ * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. ++ * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. ++ * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. ++ * @return {Ajv} this for method chaining ++ */ ++function addSchema(schema, key, _skipValidation, _meta) { ++ if (Array.isArray(schema)){ ++ for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. ++ * @param {Object} options optional options with properties `separator` and `dataVar`. ++ * @return {String} human readable string with all errors descriptions ++ */ ++function errorsText(errors, options) { ++ errors = errors || this.errors; ++ if (!errors) return 'No errors'; ++ options = options || {}; ++ var separator = options.separator === undefined ? ', ' : options.separator; ++ var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; ++ ++ var text = ''; ++ for (var i=0; i 3 ++ * utils.popNode(parent); ++ * console.log(parent.nodes.length); //=> 2 ++ * ``` ++ * @param {Object} `parent` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. ++ * @api public ++ */ ++ ++utils.popNode = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ if (typeof node.pop === 'function') { ++ return node.pop(); ++ } ++ return node.nodes && node.nodes.pop(); ++}; ++ ++/** ++ * Shift the first `node` off of `parent.nodes`. The advantage of ++ * using this method is that it checks for `node.nodes` and works ++ * with any version of `snapdragon-node`. ++ * ++ * ```js ++ * var parent = new Node({type: 'foo'}); ++ * utils.pushNode(parent, new Node({type: 'foo'})); ++ * utils.pushNode(parent, new Node({type: 'bar'})); ++ * utils.pushNode(parent, new Node({type: 'baz'})); ++ * console.log(parent.nodes.length); //=> 3 ++ * utils.shiftNode(parent); ++ * console.log(parent.nodes.length); //=> 2 ++ * ``` ++ * @param {Object} `parent` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Number|Undefined} Returns the length of `node.nodes` or undefined. ++ * @api public ++ */ ++ ++utils.shiftNode = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ if (typeof node.shift === 'function') { ++ return node.shift(); ++ } ++ return node.nodes && node.nodes.shift(); ++}; ++ ++/** ++ * Remove the specified `node` from `parent.nodes`. ++ * ++ * ```js ++ * var parent = new Node({type: 'abc'}); ++ * var foo = new Node({type: 'foo'}); ++ * utils.pushNode(parent, foo); ++ * utils.pushNode(parent, new Node({type: 'bar'})); ++ * utils.pushNode(parent, new Node({type: 'baz'})); ++ * console.log(parent.nodes.length); //=> 3 ++ * utils.removeNode(parent, foo); ++ * console.log(parent.nodes.length); //=> 2 ++ * ``` ++ * @param {Object} `parent` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Object|undefined} Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`. ++ * @api public ++ */ ++ ++utils.removeNode = function(parent, node) { ++ assert(utils.isNode(parent), 'expected parent.node to be an instance of Node'); ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ ++ if (!parent.nodes) { ++ return null; ++ } ++ ++ if (typeof parent.remove === 'function') { ++ return parent.remove(node); ++ } ++ ++ var idx = parent.nodes.indexOf(node); ++ if (idx !== -1) { ++ return parent.nodes.splice(idx, 1); ++ } ++}; ++ ++/** ++ * Returns true if `node.type` matches the given `type`. Throws a ++ * `TypeError` if `node` is not an instance of `Node`. ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var node = new Node({type: 'foo'}); ++ * console.log(utils.isType(node, 'foo')); // false ++ * console.log(utils.isType(node, 'bar')); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @param {String} `type` ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isType = function(node, type) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ switch (typeOf(type)) { ++ case 'array': ++ var types = type.slice(); ++ for (var i = 0; i < types.length; i++) { ++ if (utils.isType(node, types[i])) { ++ return true; ++ } ++ } ++ return false; ++ case 'string': ++ return node.type === type; ++ case 'regexp': ++ return type.test(node.type); ++ default: { ++ throw new TypeError('expected "type" to be an array, string or regexp'); ++ } ++ } ++}; ++ ++/** ++ * Returns true if the given `node` has the given `type` in `node.nodes`. ++ * Throws a `TypeError` if `node` is not an instance of `Node`. ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var node = new Node({ ++ * type: 'foo', ++ * nodes: [ ++ * new Node({type: 'bar'}), ++ * new Node({type: 'baz'}) ++ * ] ++ * }); ++ * console.log(utils.hasType(node, 'xyz')); // false ++ * console.log(utils.hasType(node, 'baz')); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @param {String} `type` ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.hasType = function(node, type) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ if (!Array.isArray(node.nodes)) return false; ++ for (var i = 0; i < node.nodes.length; i++) { ++ if (utils.isType(node.nodes[i], type)) { ++ return true; ++ } ++ } ++ return false; ++}; ++ ++/** ++ * Returns the first node from `node.nodes` of the given `type` ++ * ++ * ```js ++ * var node = new Node({ ++ * type: 'foo', ++ * nodes: [ ++ * new Node({type: 'text', val: 'abc'}), ++ * new Node({type: 'text', val: 'xyz'}) ++ * ] ++ * }); ++ * ++ * var textNode = utils.firstOfType(node.nodes, 'text'); ++ * console.log(textNode.val); ++ * //=> 'abc' ++ * ``` ++ * @param {Array} `nodes` ++ * @param {String} `type` ++ * @return {Object|undefined} Returns the first matching node or undefined. ++ * @api public ++ */ ++ ++utils.firstOfType = function(nodes, type) { ++ for (var i = 0; i < nodes.length; i++) { ++ var node = nodes[i]; ++ if (utils.isType(node, type)) { ++ return node; ++ } ++ } ++}; ++ ++/** ++ * Returns the node at the specified index, or the first node of the ++ * given `type` from `node.nodes`. ++ * ++ * ```js ++ * var node = new Node({ ++ * type: 'foo', ++ * nodes: [ ++ * new Node({type: 'text', val: 'abc'}), ++ * new Node({type: 'text', val: 'xyz'}) ++ * ] ++ * }); ++ * ++ * var nodeOne = utils.findNode(node.nodes, 'text'); ++ * console.log(nodeOne.val); ++ * //=> 'abc' ++ * ++ * var nodeTwo = utils.findNode(node.nodes, 1); ++ * console.log(nodeTwo.val); ++ * //=> 'xyz' ++ * ``` ++ * ++ * @param {Array} `nodes` ++ * @param {String|Number} `type` Node type or index. ++ * @return {Object} Returns a node or undefined. ++ * @api public ++ */ ++ ++utils.findNode = function(nodes, type) { ++ if (!Array.isArray(nodes)) { ++ return null; ++ } ++ if (typeof type === 'number') { ++ return nodes[type]; ++ } ++ return utils.firstOfType(nodes, type); ++}; ++ ++/** ++ * Returns true if the given node is an "*.open" node. ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var brace = new Node({type: 'brace'}); ++ * var open = new Node({type: 'brace.open'}); ++ * var close = new Node({type: 'brace.close'}); ++ * ++ * console.log(utils.isOpen(brace)); // false ++ * console.log(utils.isOpen(open)); // true ++ * console.log(utils.isOpen(close)); // false ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isOpen = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ return node.type.slice(-5) === '.open'; ++}; ++ ++/** ++ * Returns true if the given node is a "*.close" node. ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var brace = new Node({type: 'brace'}); ++ * var open = new Node({type: 'brace.open'}); ++ * var close = new Node({type: 'brace.close'}); ++ * ++ * console.log(utils.isClose(brace)); // false ++ * console.log(utils.isClose(open)); // false ++ * console.log(utils.isClose(close)); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isClose = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ return node.type.slice(-6) === '.close'; ++}; ++ ++/** ++ * Returns true if `node.nodes` **has** an `.open` node ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var brace = new Node({ ++ * type: 'brace', ++ * nodes: [] ++ * }); ++ * ++ * var open = new Node({type: 'brace.open'}); ++ * console.log(utils.hasOpen(brace)); // false ++ * ++ * brace.pushNode(open); ++ * console.log(utils.hasOpen(brace)); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.hasOpen = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ var first = node.first || node.nodes ? node.nodes[0] : null; ++ if (utils.isNode(first)) { ++ return first.type === node.type + '.open'; ++ } ++ return false; ++}; ++ ++/** ++ * Returns true if `node.nodes` **has** a `.close` node ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var brace = new Node({ ++ * type: 'brace', ++ * nodes: [] ++ * }); ++ * ++ * var close = new Node({type: 'brace.close'}); ++ * console.log(utils.hasClose(brace)); // false ++ * ++ * brace.pushNode(close); ++ * console.log(utils.hasClose(brace)); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.hasClose = function(node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ var last = node.last || node.nodes ? node.nodes[node.nodes.length - 1] : null; ++ if (utils.isNode(last)) { ++ return last.type === node.type + '.close'; ++ } ++ return false; ++}; ++ ++/** ++ * Returns true if `node.nodes` has both `.open` and `.close` nodes ++ * ++ * ```js ++ * var Node = require('snapdragon-node'); ++ * var brace = new Node({ ++ * type: 'brace', ++ * nodes: [] ++ * }); ++ * ++ * var open = new Node({type: 'brace.open'}); ++ * var close = new Node({type: 'brace.close'}); ++ * console.log(utils.hasOpen(brace)); // false ++ * console.log(utils.hasClose(brace)); // false ++ * ++ * brace.pushNode(open); ++ * brace.pushNode(close); ++ * console.log(utils.hasOpen(brace)); // true ++ * console.log(utils.hasClose(brace)); // true ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.hasOpenAndClose = function(node) { ++ return utils.hasOpen(node) && utils.hasClose(node); ++}; ++ ++/** ++ * Push the given `node` onto the `state.inside` array for the ++ * given type. This array is used as a specialized "stack" for ++ * only the given `node.type`. ++ * ++ * ```js ++ * var state = { inside: {}}; ++ * var node = new Node({type: 'brace'}); ++ * utils.addType(state, node); ++ * console.log(state.inside); ++ * //=> { brace: [{type: 'brace'}] } ++ * ``` ++ * @param {Object} `state` The `compiler.state` object or custom state object. ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Array} Returns the `state.inside` stack for the given type. ++ * @api public ++ */ ++ ++utils.addType = function(state, node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ assert(isObject(state), 'expected state to be an object'); ++ ++ var type = node.parent ++ ? node.parent.type ++ : node.type.replace(/\.open$/, ''); ++ ++ if (!state.hasOwnProperty('inside')) { ++ state.inside = {}; ++ } ++ if (!state.inside.hasOwnProperty(type)) { ++ state.inside[type] = []; ++ } ++ ++ var arr = state.inside[type]; ++ arr.push(node); ++ return arr; ++}; ++ ++/** ++ * Remove the given `node` from the `state.inside` array for the ++ * given type. This array is used as a specialized "stack" for ++ * only the given `node.type`. ++ * ++ * ```js ++ * var state = { inside: {}}; ++ * var node = new Node({type: 'brace'}); ++ * utils.addType(state, node); ++ * console.log(state.inside); ++ * //=> { brace: [{type: 'brace'}] } ++ * utils.removeType(state, node); ++ * //=> { brace: [] } ++ * ``` ++ * @param {Object} `state` The `compiler.state` object or custom state object. ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @return {Array} Returns the `state.inside` stack for the given type. ++ * @api public ++ */ ++ ++utils.removeType = function(state, node) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ assert(isObject(state), 'expected state to be an object'); ++ ++ var type = node.parent ++ ? node.parent.type ++ : node.type.replace(/\.close$/, ''); ++ ++ if (state.inside.hasOwnProperty(type)) { ++ return state.inside[type].pop(); ++ } ++}; ++ ++/** ++ * Returns true if `node.val` is an empty string, or `node.nodes` does ++ * not contain any non-empty text nodes. ++ * ++ * ```js ++ * var node = new Node({type: 'text'}); ++ * utils.isEmpty(node); //=> true ++ * node.val = 'foo'; ++ * utils.isEmpty(node); //=> false ++ * ``` ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @param {Function} `fn` ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isEmpty = function(node, fn) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ ++ if (!Array.isArray(node.nodes)) { ++ if (node.type !== 'text') { ++ return true; ++ } ++ if (typeof fn === 'function') { ++ return fn(node, node.parent); ++ } ++ return !utils.trim(node.val); ++ } ++ ++ for (var i = 0; i < node.nodes.length; i++) { ++ var child = node.nodes[i]; ++ if (utils.isOpen(child) || utils.isClose(child)) { ++ continue; ++ } ++ if (!utils.isEmpty(child, fn)) { ++ return false; ++ } ++ } ++ ++ return true; ++}; ++ ++/** ++ * Returns true if the `state.inside` stack for the given type exists ++ * and has one or more nodes on it. ++ * ++ * ```js ++ * var state = { inside: {}}; ++ * var node = new Node({type: 'brace'}); ++ * console.log(utils.isInsideType(state, 'brace')); //=> false ++ * utils.addType(state, node); ++ * console.log(utils.isInsideType(state, 'brace')); //=> true ++ * utils.removeType(state, node); ++ * console.log(utils.isInsideType(state, 'brace')); //=> false ++ * ``` ++ * @param {Object} `state` ++ * @param {String} `type` ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isInsideType = function(state, type) { ++ assert(isObject(state), 'expected state to be an object'); ++ assert(isString(type), 'expected type to be a string'); ++ ++ if (!state.hasOwnProperty('inside')) { ++ return false; ++ } ++ ++ if (!state.inside.hasOwnProperty(type)) { ++ return false; ++ } ++ ++ return state.inside[type].length > 0; ++}; ++ ++/** ++ * Returns true if `node` is either a child or grand-child of the given `type`, ++ * or `state.inside[type]` is a non-empty array. ++ * ++ * ```js ++ * var state = { inside: {}}; ++ * var node = new Node({type: 'brace'}); ++ * var open = new Node({type: 'brace.open'}); ++ * console.log(utils.isInside(state, open, 'brace')); //=> false ++ * utils.pushNode(node, open); ++ * console.log(utils.isInside(state, open, 'brace')); //=> true ++ * ``` ++ * @param {Object} `state` Either the `compiler.state` object, if it exists, or a user-supplied state object. ++ * @param {Object} `node` Instance of [snapdragon-node][] ++ * @param {String} `type` The `node.type` to check for. ++ * @return {Boolean} ++ * @api public ++ */ ++ ++utils.isInside = function(state, node, type) { ++ assert(utils.isNode(node), 'expected node to be an instance of Node'); ++ assert(isObject(state), 'expected state to be an object'); ++ ++ if (Array.isArray(type)) { ++ for (var i = 0; i < type.length; i++) { ++ if (utils.isInside(state, node, type[i])) { ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ var parent = node.parent; ++ if (typeof type === 'string') { ++ return (parent && parent.type === type) || utils.isInsideType(state, type); ++ } ++ ++ if (typeOf(type) === 'regexp') { ++ if (parent && parent.type && type.test(parent.type)) { ++ return true; ++ } ++ ++ var keys = Object.keys(state.inside); ++ var len = keys.length; ++ var idx = -1; ++ while (++idx < len) { ++ var key = keys[idx]; ++ var val = state.inside[key]; ++ ++ if (Array.isArray(val) && val.length !== 0 && type.test(key)) { ++ return true; ++ } ++ } ++ } ++ return false; ++}; ++ ++/** ++ * Get the last `n` element from the given `array`. Used for getting ++ * a node from `node.nodes.` ++ * ++ * @param {Array} `array` ++ * @param {Number} `n` ++ * @return {undefined} ++ * @api public ++ */ ++ ++utils.last = function(arr, n) { ++ return arr[arr.length - (n || 1)]; ++}; ++ ++/** ++ * Cast the given `val` to an array. ++ * ++ * ```js ++ * console.log(utils.arrayify('')); ++ * //=> [] ++ * console.log(utils.arrayify('foo')); ++ * //=> ['foo'] ++ * console.log(utils.arrayify(['foo'])); ++ * //=> ['foo'] ++ * ``` ++ * @param {any} `val` ++ * @return {Array} ++ * @api public ++ */ ++ ++utils.arrayify = function(val) { ++ if (typeof val === 'string' && val !== '') { ++ return [val]; ++ } ++ if (!Array.isArray(val)) { ++ return []; ++ } ++ return val; ++}; ++ ++/** ++ * Convert the given `val` to a string by joining with `,`. Useful ++ * for creating a cheerio/CSS/DOM-style selector from a list of strings. ++ * ++ * @param {any} `val` ++ * @return {Array} ++ * @api public ++ */ ++ ++utils.stringify = function(val) { ++ return utils.arrayify(val).join(','); ++}; ++ ++/** ++ * Ensure that the given value is a string and call `.trim()` on it, ++ * or return an empty string. ++ * ++ * @param {String} `str` ++ * @return {String} ++ * @api public ++ */ ++ ++utils.trim = function(str) { ++ return typeof str === 'string' ? str.trim() : ''; ++}; ++ ++/** ++ * Return true if val is an object ++ */ ++ ++function isObject(val) { ++ return typeOf(val) === 'object'; ++} ++ ++/** ++ * Return true if val is a string ++ */ ++ ++function isString(val) { ++ return typeof val === 'string'; ++} ++ ++/** ++ * Return true if val is a function ++ */ ++ ++function isFunction(val) { ++ return typeof val === 'function'; ++} ++ ++/** ++ * Return true if val is an array ++ */ ++ ++function isArray(val) { ++ return Array.isArray(val); ++} ++ ++/** ++ * Shim to ensure the `.append` methods work with any version of snapdragon ++ */ ++ ++function append(compiler, val, node) { ++ if (typeof compiler.append !== 'function') { ++ return compiler.emit(val, node); ++ } ++ return compiler.append(val, node); ++} ++ ++/** ++ * Simplified assertion. Throws an error is `val` is falsey. ++ */ ++ ++function assert(val, message) { ++ if (!val) throw new Error(message); ++} ++ ++}, ++"ztBDHUrYSDQagMo6GwEMX7XTLO1UL1aXCffA61fv3KU=": ++function (require, module, exports, __dirname, __filename) { ++'use strict'; ++var Uint8ArrayReader = require('./Uint8ArrayReader'); ++var utils = require('../utils'); ++ ++function NodeBufferReader(data) { ++ Uint8ArrayReader.call(this, data); ++} ++utils.inherits(NodeBufferReader, Uint8ArrayReader); ++ ++/** ++ * @see DataReader.readData ++ */ ++NodeBufferReader.prototype.readData = function(size) { ++ this.checkOffset(size); ++ var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); ++ this.index += size; ++ return result; ++}; ++module.exports = NodeBufferReader; ++ ++}, ++"zz4ZiiUHYM80TgtXXbqtfYtHDLVuJc4hUq29+C+j5eg=": ++function (require, module, exports, __dirname, __filename) { ++const SemVer = require('../classes/semver') ++const compare = (a, b, loose) => ++ new SemVer(a, loose).compare(new SemVer(b, loose)) ++ ++module.exports = compare ++ ++}, ++ ++} ++, ++{ ++ "../../package.json": [ ++ "jZZWTXXYbMieF5HKIg2k6L1jkET8Gj6PHq/SEYO0+yU=", ++ {} ++ ], ++ "constants.js": [ ++ "4hHZpR55JX3kj446JXr99F63UQ57PIjAh2rb88Kfal0=", ++ {} ++ ], ++ "index.js": [ ++ "RiauUfI47LMUij9TNjSRGdRo01cDwpn1kZCIhsWfcbk=", ++ { ++ "../../package.json": "../../package.json", ++ "./constants": "constants.js", ++ "./server": "server.js", ++ "./status": "status.js", ++ "./upgrade-manager/utils": "upgrade-manager/utils.js", ++ "@bugsnag/js": "node_modules/@bugsnag/js/node/notifier.js", ++ "debug": "node_modules/debug/src/index.js", ++ "semver/functions/prerelease": "node_modules/semver/functions/prerelease.js" ++ } ++ ], ++ "node_modules/@bugsnag/js/node/notifier.js": [ ++ "TyW4D70wvv8SQgk/jEsSUFmgpCK8Spd4hkI2SM5GQ1s=", ++ { ++ "@bugsnag/node": "node_modules/@bugsnag/node/dist/bugsnag.js" ++ } ++ ], ++ "node_modules/@bugsnag/node/dist/bugsnag.js": [ ++ "mloSlhrnJP7Da0Lyl4LiTkv2ySQM3I7+xdpv99peedM=", ++ { ++ "byline": "node_modules/byline/lib/byline.js", ++ "error-stack-parser": "node_modules/error-stack-parser/error-stack-parser.js", ++ "iserror": "node_modules/iserror/index.js", ++ "pump": "node_modules/pump/index.js", ++ "stack-generator": "node_modules/stack-generator/stack-generator.js" ++ } ++ ], ++ "node_modules/@digidem/atomic-fs-blob-store/index.js": [ ++ "HMdRqqY4MwbmATKqh8MmRCObZmGBqmIx1QFEFQA90E4=", ++ { ++ "@digidem/fs-write-stream-atomic": "node_modules/@digidem/fs-write-stream-atomic/index.js", ++ "duplexify": "node_modules/@digidem/atomic-fs-blob-store/node_modules/duplexify/index.js", ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "lru-cache": "node_modules/lru-cache/lib/lru-cache.js", ++ "mkdirp": "node_modules/@digidem/atomic-fs-blob-store/node_modules/mkdirp/index.js" ++ } ++ ], ++ "node_modules/@digidem/atomic-fs-blob-store/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/@digidem/atomic-fs-blob-store/node_modules/mkdirp/index.js": [ ++ "xwNbRxsZe6bUh5toA7bKJzoXr2yKI4Lcul6zunCkOsI=", ++ {} ++ ], ++ "node_modules/@digidem/fs-write-stream-atomic/index.js": [ ++ "fvSjGsk+ze03zULFMTOkIq9/baCLSvWOwwYP2ICRxGo=", ++ { ++ "graceful-fs": "node_modules/graceful-fs/graceful-fs.js", ++ "iferr": "node_modules/iferr/index.js", ++ "imurmurhash": "node_modules/imurmurhash/imurmurhash.js", ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/@fastify/forwarded/index.js": [ ++ "nXUeu87eQHwpAZQHPD2Y++NIFF0KmFP/QkNHboogyMQ=", ++ {} ++ ], ++ "node_modules/@fastify/proxy-addr/index.js": [ ++ "bmOcsj6IeGi6Y4Hk/jzIbFSu76nz4fC85zY3D04zZTc=", ++ { ++ "@fastify/forwarded": "node_modules/@fastify/forwarded/index.js", ++ "ipaddr.js": "node_modules/ipaddr.js/lib/ipaddr.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/index.js": [ ++ "nq8u/kdbKPZCde0NveWv+YFXRNNbCxq1FPYgcd5GiZc=", ++ { ++ "concat-stream": "node_modules/@gmaclennan/zip-fs/node_modules/concat-stream/index.js", ++ "duplexify": "node_modules/duplexify/index.js", ++ "once": "node_modules/once/once.js", ++ "yauzl": "node_modules/yauzl/index.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/concat-stream/index.js": [ ++ "4iLeG61xXUnT5QQh4KBmmfT+lEHeX0dvkC2SmZwcHbU=", ++ { ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/readable.js", ++ "typedarray": "node_modules/typedarray/index.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/@gmaclennan/zip-fs/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/@mapeo/core/errors/errors.json": [ ++ "+2tZtTmq5cnFbAG6Ww/EbBPYXJzLaAdrxBU3CnB7SlY=", ++ {} ++ ], ++ "node_modules/@mapeo/core/errors/index.js": [ ++ "FuDM0eMKJidFeBZ8VjAGRjBPBV0c20bLmv5m7i8X37g=", ++ { ++ "./errors.json": "node_modules/@mapeo/core/errors/errors.json", ++ "inherits": "node_modules/inherits/inherits.js", ++ "statuses": "node_modules/statuses/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/index.js": [ ++ "AT1fb8qqgTAt2UuMGeWxqNbh3UQJ3OHTLzs6jLKdS5A=", ++ { ++ "./errors": "node_modules/@mapeo/core/errors/index.js", ++ "./lib/export-geojson": "node_modules/@mapeo/core/lib/export-geojson.js", ++ "./lib/importer": "node_modules/@mapeo/core/lib/importer.js", ++ "./sync": "node_modules/@mapeo/core/sync.js", ++ "concat-stream": "node_modules/@mapeo/core/node_modules/concat-stream/index.js", ++ "duplexify": "node_modules/duplexify/index.js", ++ "mapeo-entity-filter": "node_modules/mapeo-entity-filter/index.js", ++ "pump": "node_modules/pump/index.js", ++ "pumpify": "node_modules/pumpify/index.js", ++ "randombytes": "node_modules/randombytes/index.js", ++ "run-parallel": "node_modules/run-parallel/index.js", ++ "shp-write": "node_modules/shp-write/index.js", ++ "through2": "node_modules/@mapeo/core/node_modules/through2/through2.js", ++ "through2-filter": "node_modules/through2-filter/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/lib/db-sync-progress.js": [ ++ "Ff3kT0iVd9qfdG47cLGjMbBe8T3O+qbGd7n++CpCUOI=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/lib/export-geojson.js": [ ++ "9fml02JTwCzWZyfsrgPLKqOF7EK7d5hYYNf4O1P/3Ec=", ++ { ++ "./polygon-feature": "node_modules/@mapeo/core/lib/polygon-feature.js", ++ "./preset-matcher": "node_modules/@mapeo/core/lib/preset-matcher.js", ++ "osm-p2p-geojson": "node_modules/osm-p2p-geojson/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/lib/importer.js": [ ++ "t2VEjLlbQiksD/dobrAwNdTTwdk2Aud6LBZqBmtahWQ=", ++ { ++ "concat-stream": "node_modules/@mapeo/core/node_modules/concat-stream/index.js", ++ "gtran-shapefile": "node_modules/gtran-shapefile/src/script.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "osm-p2p-geojson": "node_modules/osm-p2p-geojson/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/lib/polygon-feature.js": [ ++ "tK1aVeObpsYa7onCPbHKYxjAiZPf3MDIZOt3FIYIhzc=", ++ {} ++ ], ++ "node_modules/@mapeo/core/lib/preset-matcher.js": [ ++ "KaliM9oR4kalpZIj40EaccNKMgRy73PWDJL6+9Iyjus=", ++ {} ++ ], ++ "node_modules/@mapeo/core/lib/sync-stream.js": [ ++ "XYp/YaVcRqvjAI6/SM3+4pSjM4SdMwhJRuMXqOJ7kAE=", ++ { ++ "./db-sync-progress": "node_modules/@mapeo/core/lib/db-sync-progress.js", ++ "blob-store-replication-stream": "node_modules/blob-store-replication-stream/index.js", ++ "handshake-stream": "node_modules/handshake-stream/index.js", ++ "multiplex": "node_modules/multiplex/index.js", ++ "pump": "node_modules/pump/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/concat-stream/index.js": [ ++ "4iLeG61xXUnT5QQh4KBmmfT+lEHeX0dvkC2SmZwcHbU=", ++ { ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/@mapeo/core/node_modules/readable-stream/readable.js", ++ "typedarray": "node_modules/typedarray/index.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/@mapeo/core/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/@mapeo/core/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/@mapeo/core/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/@mapeo/core/node_modules/through2/through2.js": [ ++ "PW9lQW+wokyvd2osX+9AJZ5flGN4Lso7ncoXpgbmgO0=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/@mapeo/core/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/@mapeo/core/sync.js": [ ++ "bLl1nNb1HnA+zlJBYVESKTpXdPAy0gEvZVe2EajETr4=", ++ { ++ "./lib/db-sync-progress": "node_modules/@mapeo/core/lib/db-sync-progress.js", ++ "./lib/sync-stream": "node_modules/@mapeo/core/lib/sync-stream.js", ++ "blob-store-replication-stream": "node_modules/blob-store-replication-stream/index.js", ++ "dat-swarm-defaults": "node_modules/dat-swarm-defaults/index.js", ++ "debug": "node_modules/debug/src/index.js", ++ "discovery-swarm": "node_modules/discovery-swarm/index.js", ++ "hypercore-crypto": "node_modules/hypercore-crypto/index.js", ++ "osm-p2p-syncfile": "node_modules/osm-p2p-syncfile/index.js", ++ "pump": "node_modules/pump/index.js", ++ "randombytes": "node_modules/randombytes/index.js", ++ "websocket-stream": "node_modules/websocket-stream/index.js" ++ } ++ ], ++ "node_modules/@sinclair/typebox/typebox.js": [ ++ "ta/G9fNlB+F6/t/TQ/LlNykqYSNLvll+ERQGOMjSuOI=", ++ {} ++ ], ++ "node_modules/@sindresorhus/is/dist/index.js": [ ++ "z8Kne0cMDrjIYDxVJXaLO6k7ACLH6Pj/KF5xJo0AimE=", ++ {} ++ ], ++ "node_modules/@szmarczak/http-timer/dist/source/index.js": [ ++ "Zoaxrd7DLMGpk81s24a+SW4yvD8ShTWRK6bYrqtv3vM=", ++ { ++ "defer-to-connect": "node_modules/defer-to-connect/dist/source/index.js" ++ } ++ ], ++ "node_modules/@turf/meta/index.js": [ ++ "rKuZDv6I+S5WlNKAi3Nv9epVP+712jO0V910T9J6G9Q=", ++ {} ++ ], ++ "node_modules/JSONStream/index.js": [ ++ "e1lX6uqIsbtnCXZ1Q/cHJpN3SgTKu/bLDf7oxDbzvuM=", ++ { ++ "jsonparse": "node_modules/jsonparse/jsonparse.js", ++ "through": "node_modules/through/index.js" ++ } ++ ], ++ "node_modules/abstract-leveldown/abstract-chained-batch.js": [ ++ "Z8EKDfGEpOQukRahaYVq29rf5GC4NqI89BA8V8zLEjM=", ++ { ++ "./next-tick": "node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/abstract-leveldown/abstract-iterator.js": [ ++ "zFwENznp0VlKGOUYw0UZkxqAiBy3wg7PWi8lMBIuBBE=", ++ { ++ "./next-tick": "node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/abstract-leveldown/abstract-leveldown.js": [ ++ "x0iMaqNlst14z89o06Dn5qILdB4SVT1ZLCwHt7tYY3s=", ++ { ++ "./abstract-chained-batch": "node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/abstract-leveldown/abstract-iterator.js", ++ "./next-tick": "node_modules/abstract-leveldown/next-tick.js", ++ "level-supports": "node_modules/level-supports/index.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/abstract-leveldown/index.js": [ ++ "TZhD82oHTYdXvS5L6p4PGz8scF9rlqoYYWIXtimi4GY=", ++ { ++ "./abstract-chained-batch": "node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/abstract-leveldown/abstract-iterator.js", ++ "./abstract-leveldown": "node_modules/abstract-leveldown/abstract-leveldown.js" ++ } ++ ], ++ "node_modules/abstract-leveldown/next-tick.js": [ ++ "JczFU1xaSOlfDIj/bfki3cAkCh3PBIunWfLagGh0jBk=", ++ {} ++ ], ++ "node_modules/abstract-logging/index.js": [ ++ "8ohhEiNrWrrdudvVxJYvA3+5qYebb80HZRWOzbcYjfo=", ++ {} ++ ], ++ "node_modules/agentkeepalive/index.js": [ ++ "pe6A6BGp+kh4kRwbOiEkMty7d0WxQpLpK6bURN+Vdy8=", ++ { ++ "./lib/agent": "node_modules/agentkeepalive/lib/agent.js", ++ "./lib/constants": "node_modules/agentkeepalive/lib/constants.js", ++ "./lib/https_agent": "node_modules/agentkeepalive/lib/https_agent.js" ++ } ++ ], ++ "node_modules/agentkeepalive/lib/agent.js": [ ++ "+Vj3u4AGUaeSiJwFFm8yruEFc4XfTEf/f9LtK4hOLfM=", ++ { ++ "./constants": "node_modules/agentkeepalive/lib/constants.js", ++ "debug": "node_modules/debug/src/index.js", ++ "depd": "node_modules/depd/index.js", ++ "humanize-ms": "node_modules/humanize-ms/index.js" ++ } ++ ], ++ "node_modules/agentkeepalive/lib/constants.js": [ ++ "TxLjIcxzSvPLUziYYSRbKxlgzc21cHBASJBcnriLsNM=", ++ {} ++ ], ++ "node_modules/agentkeepalive/lib/https_agent.js": [ ++ "+WftLrHhqglv7DAMCAaUf6gxI4xztJ3f1iye6Plg9Yw=", ++ { ++ "./agent": "node_modules/agentkeepalive/lib/agent.js", ++ "./constants": "node_modules/agentkeepalive/lib/constants.js" ++ } ++ ], ++ "node_modules/ajv-formats/dist/formats.js": [ ++ "C+ivEWFI0w2zK8qtVhRef6rcmNeyvM/6G81gnHLLgj8=", ++ {} ++ ], ++ "node_modules/ajv-formats/dist/index.js": [ ++ "Ja4pA42g/RAhpiPeDbUE8u/y0uH+2DLzpBt5WDMYLd4=", ++ { ++ "./formats": "node_modules/ajv-formats/dist/formats.js", ++ "./limit": "node_modules/ajv-formats/dist/limit.js", ++ "ajv/dist/compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv-formats/dist/limit.js": [ ++ "jtQ6SAlS2Koa+i2jxBRQyt+aOZlb58Tg5UzXWpw3OUQ=", ++ { ++ "ajv": "node_modules/ajv/dist/ajv.js", ++ "ajv/dist/compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/ajv.js": [ ++ "lOHQWR0AvV3F9WlsoSLL4laKvil6T7THDCRPnSmNkbY=", ++ { ++ "./compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "./compile/validate": "node_modules/ajv/dist/compile/validate/index.js", ++ "./core": "node_modules/ajv/dist/core.js", ++ "./refs/json-schema-draft-07.json": "node_modules/ajv/dist/refs/json-schema-draft-07.json", ++ "./vocabularies/discriminator": "node_modules/ajv/dist/vocabularies/discriminator/index.js", ++ "./vocabularies/draft7": "node_modules/ajv/dist/vocabularies/draft7.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/codegen/code.js": [ ++ "E5VBs8KrRC33g46DA20UGA1Qmh1ABHYE2eG1aYph79A=", ++ {} ++ ], ++ "node_modules/ajv/dist/compile/codegen/index.js": [ ++ "+QSAaWxhs2XpWS00oq8nXeRWPzIKSusR+NknzqmbEa8=", ++ { ++ "./code": "node_modules/ajv/dist/compile/codegen/code.js", ++ "./scope": "node_modules/ajv/dist/compile/codegen/scope.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/codegen/scope.js": [ ++ "wciDz4KPqtivLLn4mHW71x6Y6XEAydFH2ERlwxQlfUM=", ++ { ++ "./code": "node_modules/ajv/dist/compile/codegen/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/errors.js": [ ++ "c5599YQGxEPGMJF/sxQJBXJ8TXI+PsAn5G5lOaNf22M=", ++ { ++ "./codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "./names": "node_modules/ajv/dist/compile/names.js", ++ "./util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/index.js": [ ++ "RhbyAS1FcMdTcfpDRA0OC/j0DD/KYYfI7MpESYQYi4A=", ++ { ++ "../runtime/validation_error": "node_modules/ajv/dist/runtime/validation_error.js", ++ "./codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "./names": "node_modules/ajv/dist/compile/names.js", ++ "./resolve": "node_modules/ajv/dist/compile/resolve.js", ++ "./util": "node_modules/ajv/dist/compile/util.js", ++ "./validate": "node_modules/ajv/dist/compile/validate/index.js", ++ "uri-js": "node_modules/uri-js/dist/es5/uri.all.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/names.js": [ ++ "OnajVlvHJ/AKi9W9F4IV9J2ug53+YFO0uol4jQgrXsY=", ++ { ++ "./codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/ref_error.js": [ ++ "9VvHEyeWOS4VzqJnlf2SkzEz64yDqlWdepZOgPXA0uQ=", ++ { ++ "./resolve": "node_modules/ajv/dist/compile/resolve.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/resolve.js": [ ++ "kDb2MefNRttOqpvLEor4EUJUssAqjeYptVpObC/Glt4=", ++ { ++ "./util": "node_modules/ajv/dist/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "json-schema-traverse": "node_modules/json-schema-traverse/index.js", ++ "uri-js": "node_modules/uri-js/dist/es5/uri.all.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/rules.js": [ ++ "7B2GUA9JeqjiD58MFpWVEVnZqQlmnQCiYc4bsis88Kk=", ++ {} ++ ], ++ "node_modules/ajv/dist/compile/util.js": [ ++ "xkQFJQcxwb8xnn+mdgVdWf3SQU+rE7SU+kypcEJ7Tnk=", ++ { ++ "./codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "./codegen/code": "node_modules/ajv/dist/compile/codegen/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/applicability.js": [ ++ "UMXLpYlKf7mHSzQyNVtG7HG3PJNo2vsTI97YVnzKj8A=", ++ {} ++ ], ++ "node_modules/ajv/dist/compile/validate/boolSchema.js": [ ++ "V7LSBWOl/TsHHD8IU72mtTFCwE2PbQY1DWUbAE6zm2s=", ++ { ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../errors": "node_modules/ajv/dist/compile/errors.js", ++ "../names": "node_modules/ajv/dist/compile/names.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/dataType.js": [ ++ "wvyth804TQ+xl66bjWSR/vXfYfkjeb4J0piqD77QQGw=", ++ { ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../errors": "node_modules/ajv/dist/compile/errors.js", ++ "../rules": "node_modules/ajv/dist/compile/rules.js", ++ "../util": "node_modules/ajv/dist/compile/util.js", ++ "./applicability": "node_modules/ajv/dist/compile/validate/applicability.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/defaults.js": [ ++ "mHwPoseUsIvY6fAXvxrcD53+cxHAU606m1zupejhv2A=", ++ { ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/index.js": [ ++ "svVURaokj6Eqn9vBr3+gO8hEzZoiPbVBojtzC2NiF9Q=", ++ { ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../errors": "node_modules/ajv/dist/compile/errors.js", ++ "../names": "node_modules/ajv/dist/compile/names.js", ++ "../resolve": "node_modules/ajv/dist/compile/resolve.js", ++ "../util": "node_modules/ajv/dist/compile/util.js", ++ "./applicability": "node_modules/ajv/dist/compile/validate/applicability.js", ++ "./boolSchema": "node_modules/ajv/dist/compile/validate/boolSchema.js", ++ "./dataType": "node_modules/ajv/dist/compile/validate/dataType.js", ++ "./defaults": "node_modules/ajv/dist/compile/validate/defaults.js", ++ "./keyword": "node_modules/ajv/dist/compile/validate/keyword.js", ++ "./subschema": "node_modules/ajv/dist/compile/validate/subschema.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/keyword.js": [ ++ "q9bIunUZxR8FI9g8s4786vbRNoZxktiVfP0jrI3/+/4=", ++ { ++ "../../vocabularies/code": "node_modules/ajv/dist/vocabularies/code.js", ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../errors": "node_modules/ajv/dist/compile/errors.js", ++ "../names": "node_modules/ajv/dist/compile/names.js" ++ } ++ ], ++ "node_modules/ajv/dist/compile/validate/subschema.js": [ ++ "LGh0nhiDzv4JeL92baGLcAMandNE4YV8RDqC0ZJfdTc=", ++ { ++ "../codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/core.js": [ ++ "UYDaFwhrjRKFTNddPSzDE91softwdSd/X1ruLVB+pV4=", ++ { ++ "./compile": "node_modules/ajv/dist/compile/index.js", ++ "./compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "./compile/ref_error": "node_modules/ajv/dist/compile/ref_error.js", ++ "./compile/resolve": "node_modules/ajv/dist/compile/resolve.js", ++ "./compile/rules": "node_modules/ajv/dist/compile/rules.js", ++ "./compile/util": "node_modules/ajv/dist/compile/util.js", ++ "./compile/validate": "node_modules/ajv/dist/compile/validate/index.js", ++ "./compile/validate/dataType": "node_modules/ajv/dist/compile/validate/dataType.js", ++ "./refs/data.json": "node_modules/ajv/dist/refs/data.json", ++ "./runtime/validation_error": "node_modules/ajv/dist/runtime/validation_error.js" ++ } ++ ], ++ "node_modules/ajv/dist/refs/data.json": [ ++ "+q4ZYhYLORHfBEwjn43pPTeNBwMjKu4+bjTq7AZvYlI=", ++ {} ++ ], ++ "node_modules/ajv/dist/refs/json-schema-draft-07.json": [ ++ "DBUDS3ZKmSk3HiG7trq4FNpEEWVX+G/UCwst0yDxDjM=", ++ {} ++ ], ++ "node_modules/ajv/dist/runtime/equal.js": [ ++ "yURn2gnulOXRlEg6erghubs78cBDlycPKrU96p3lknQ=", ++ { ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/runtime/ucs2length.js": [ ++ "HfAS3T0j/O0HJVpyBHmABFCWh8sfQxrgq5dttDa72JA=", ++ {} ++ ], ++ "node_modules/ajv/dist/runtime/validation_error.js": [ ++ "Eb9bSv/IEU5efN9luTAGwtmXq2CtoRUsIuE2+bgouBU=", ++ {} ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js": [ ++ "Rt3TB0kX+7YqvZnq8DshWuV17SXpSSq9LZepkIgiV3Q=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js": [ ++ "9XB/oOmtwNa96LdB+Dcpz50rT8G22XrBL0ESA4B7Zs4=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/names": "node_modules/ajv/dist/compile/names.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/allOf.js": [ ++ "7J4OJY8CDUN5uSSVoTeQQ59yhjcu3LfgJGUVOONU1fY=", ++ { ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/anyOf.js": [ ++ "jXNo1K660FFLcTGRuTSZO08L9XDhurk7B9xpcS2yzsU=", ++ { ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/contains.js": [ ++ "mz9QlhU7/laANiXzSJxWlStMAdt6zCxC0EfGiXZVPHk=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/dependencies.js": [ ++ "SA/6FB5ZbGjxPoKIjv3VEVg4Ctz/E+yVkrcCpXjf/tI=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/if.js": [ ++ "+OWCloOOIvXM8kxG33UMvIQdIEKiWffUs/8JNyVgey8=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/index.js": [ ++ "WmGXj22Bu6v6i5zLcdfegW7W3R/X3lxyZXQ5p2wqfLM=", ++ { ++ "./additionalItems": "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js", ++ "./additionalProperties": "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js", ++ "./allOf": "node_modules/ajv/dist/vocabularies/applicator/allOf.js", ++ "./anyOf": "node_modules/ajv/dist/vocabularies/applicator/anyOf.js", ++ "./contains": "node_modules/ajv/dist/vocabularies/applicator/contains.js", ++ "./dependencies": "node_modules/ajv/dist/vocabularies/applicator/dependencies.js", ++ "./if": "node_modules/ajv/dist/vocabularies/applicator/if.js", ++ "./items": "node_modules/ajv/dist/vocabularies/applicator/items.js", ++ "./items2020": "node_modules/ajv/dist/vocabularies/applicator/items2020.js", ++ "./not": "node_modules/ajv/dist/vocabularies/applicator/not.js", ++ "./oneOf": "node_modules/ajv/dist/vocabularies/applicator/oneOf.js", ++ "./patternProperties": "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js", ++ "./prefixItems": "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js", ++ "./properties": "node_modules/ajv/dist/vocabularies/applicator/properties.js", ++ "./propertyNames": "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js", ++ "./thenElse": "node_modules/ajv/dist/vocabularies/applicator/thenElse.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/items.js": [ ++ "h7RuLkai5OFF5ws4fiXrxob2jLCP0nNvShhigEZDcuQ=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/items2020.js": [ ++ "Ez65je5uhPDR0gaDDIqaj1J1BRPdOK26Jv9gBlcGehU=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js", ++ "./additionalItems": "node_modules/ajv/dist/vocabularies/applicator/additionalItems.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/not.js": [ ++ "+d5dkll+tS6ZyPthsKKREH0kPSfONRPWB61BVu02/VI=", ++ { ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/oneOf.js": [ ++ "XbwOZxFNrjreHEjOVv4v5JRhkESWOVf9jrbNI53EOEA=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/patternProperties.js": [ ++ "ygOScCldDCHPllTEdRxcLOrk/3GVXO1TfF0MpVmh0to=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/prefixItems.js": [ ++ "ZTZREyuY7CLb0plxYAKAnqnoZ2cq6as9+Mys3Lpjnkc=", ++ { ++ "./items": "node_modules/ajv/dist/vocabularies/applicator/items.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/properties.js": [ ++ "WHaCP8TsfxUisFyzseBWFkccrBztrJmnLsqIQH2QJz0=", ++ { ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../../compile/validate": "node_modules/ajv/dist/compile/validate/index.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js", ++ "./additionalProperties": "node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/propertyNames.js": [ ++ "BaV3TdSi2TnKCPgwCFNxAy43v0c3uMIKC7vpQ6CviZs=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/applicator/thenElse.js": [ ++ "QW34aEquWgLlm3s9GLV3Gn6cnJj6gUBtu+l1LSIsuFU=", ++ { ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/code.js": [ ++ "/RSo9gBmNA3yvCnDHGaK911lJBbkQhXecLG2ELKywBM=", ++ { ++ "../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../compile/names": "node_modules/ajv/dist/compile/names.js", ++ "../compile/util": "node_modules/ajv/dist/compile/util.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/core/id.js": [ ++ "Scjv9pTOQ3FFDB+Zhuk0/L9L0UMxHK71MyET8pF1vBE=", ++ {} ++ ], ++ "node_modules/ajv/dist/vocabularies/core/index.js": [ ++ "9CDhARuV4ntUxYMjp+1P+9CojNtElvdxu2eCwqoi0j4=", ++ { ++ "./id": "node_modules/ajv/dist/vocabularies/core/id.js", ++ "./ref": "node_modules/ajv/dist/vocabularies/core/ref.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/core/ref.js": [ ++ "FuMchaeW5YTwO5CPJYLr5FRZlk3jRW83eR+gmHhniEo=", ++ { ++ "../../compile": "node_modules/ajv/dist/compile/index.js", ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/names": "node_modules/ajv/dist/compile/names.js", ++ "../../compile/ref_error": "node_modules/ajv/dist/compile/ref_error.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/discriminator/index.js": [ ++ "NH8oqpw7sKTp+r2AcvNuPwL7GGkuGYJCrHMKgsV9XNI=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../discriminator/types": "node_modules/ajv/dist/vocabularies/discriminator/types.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/discriminator/types.js": [ ++ "U/0q0Dcq6VH3qWVBBgYdQqBRNE7T568NOQVcojWcJ84=", ++ {} ++ ], ++ "node_modules/ajv/dist/vocabularies/draft7.js": [ ++ "DiQdSMDiqAZCbhHbeO1QMcF85yeEZuMST+y0PI+uWeM=", ++ { ++ "./applicator": "node_modules/ajv/dist/vocabularies/applicator/index.js", ++ "./core": "node_modules/ajv/dist/vocabularies/core/index.js", ++ "./format": "node_modules/ajv/dist/vocabularies/format/index.js", ++ "./metadata": "node_modules/ajv/dist/vocabularies/metadata.js", ++ "./validation": "node_modules/ajv/dist/vocabularies/validation/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/format/format.js": [ ++ "mMEACtfhu6qLv+n2VrUyxam/4a6DyeSxl5x1KhuF71U=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/format/index.js": [ ++ "1drV+VycX0j4ypVs27knqvx7Vrqr/KjAsEA9ksXr62c=", ++ { ++ "./format": "node_modules/ajv/dist/vocabularies/format/format.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/metadata.js": [ ++ "RcF4dEp+xX4gyFzurqjZ82tWY2Nqt+SV6iw8G/Slhgk=", ++ {} ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/const.js": [ ++ "WlKg4v5JQwqe5vStv6awfXAJwhM8fEeeYl90D+Lgcvk=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../../runtime/equal": "node_modules/ajv/dist/runtime/equal.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/enum.js": [ ++ "emECtNKcpexnBSRCxyPUqOmymPqV3d3HhGy9xzASYrc=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../../runtime/equal": "node_modules/ajv/dist/runtime/equal.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/index.js": [ ++ "Shg5gy3l8Q/0I8HAxssjK1tuGzSYCiiGLPVrJ2MTbeQ=", ++ { ++ "./const": "node_modules/ajv/dist/vocabularies/validation/const.js", ++ "./enum": "node_modules/ajv/dist/vocabularies/validation/enum.js", ++ "./limitItems": "node_modules/ajv/dist/vocabularies/validation/limitItems.js", ++ "./limitLength": "node_modules/ajv/dist/vocabularies/validation/limitLength.js", ++ "./limitNumber": "node_modules/ajv/dist/vocabularies/validation/limitNumber.js", ++ "./limitProperties": "node_modules/ajv/dist/vocabularies/validation/limitProperties.js", ++ "./multipleOf": "node_modules/ajv/dist/vocabularies/validation/multipleOf.js", ++ "./pattern": "node_modules/ajv/dist/vocabularies/validation/pattern.js", ++ "./required": "node_modules/ajv/dist/vocabularies/validation/required.js", ++ "./uniqueItems": "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/limitItems.js": [ ++ "KYPPA0gkobBPRsuTr/EpT6INt1cLuwbLqOKXqs4uRy8=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/limitLength.js": [ ++ "TWTV5teeLYegmcjStmzug+F+ZEElWXTopGOrYA12qD8=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../../runtime/ucs2length": "node_modules/ajv/dist/runtime/ucs2length.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/limitNumber.js": [ ++ "3pvqpQtcAXribMC+IuVicf3nqi+95/rbIhgOOVmH+v0=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/limitProperties.js": [ ++ "HqJZ0IUTKDDo4pjM1fOX4Qd5nrqZANT3wQPfuGoYlYI=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/multipleOf.js": [ ++ "KHApFPejLC6DEOfLZhzs7PXVo+sbhhfBDawqD8i8pRA=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/pattern.js": [ ++ "naFeZsf51skQboiBbPCgv8I8T7eOADGvtByN6ivYomE=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/required.js": [ ++ "0+b9uyfdh9Ue1zb0o7R73IJnMRlJRXA0zud6oCFoUeA=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../code": "node_modules/ajv/dist/vocabularies/code.js" ++ } ++ ], ++ "node_modules/ajv/dist/vocabularies/validation/uniqueItems.js": [ ++ "+oGUwhy/swafbVPSLcMb5CqWaGmb4UnykDw9R4tfMII=", ++ { ++ "../../compile/codegen": "node_modules/ajv/dist/compile/codegen/index.js", ++ "../../compile/util": "node_modules/ajv/dist/compile/util.js", ++ "../../compile/validate/dataType": "node_modules/ajv/dist/compile/validate/dataType.js", ++ "../../runtime/equal": "node_modules/ajv/dist/runtime/equal.js" ++ } ++ ], ++ "node_modules/app-info-parser/src/apk.js": [ ++ "DXXfKbAphgprnGucwAObDiWVGdiiOJVxCWatmtMl3qE=", ++ { ++ "./resource-finder": "node_modules/app-info-parser/src/resource-finder.js", ++ "./utils": "node_modules/app-info-parser/src/utils.js", ++ "./xml-parser/manifest": "node_modules/app-info-parser/src/xml-parser/manifest.js", ++ "./zip": "node_modules/app-info-parser/src/zip.js" ++ } ++ ], ++ "node_modules/app-info-parser/src/resource-finder.js": [ ++ "gdAVWRBE7A2yuPOU786+Cipadq9PCn+1RHmyV7x8oJQ=", ++ { ++ "bytebuffer": "node_modules/bytebuffer/dist/bytebuffer-node.js" ++ } ++ ], ++ "node_modules/app-info-parser/src/utils.js": [ ++ "BcY8RqC7QtsLRjh1Q+555lGNdyvdmEtrJMGltjbgJyc=", ++ {} ++ ], ++ "node_modules/app-info-parser/src/xml-parser/binary.js": [ ++ "95vWSqg5NrICvrzCNi4gaau6urQmwa2TANHb8YMcxws=", ++ {} ++ ], ++ "node_modules/app-info-parser/src/xml-parser/manifest.js": [ ++ "NbZCt+LckRGvspwR8foUFzLk+ycPO5lR8kyXg08gnDQ=", ++ { ++ "./binary": "node_modules/app-info-parser/src/xml-parser/binary.js" ++ } ++ ], ++ "node_modules/app-info-parser/src/zip.js": [ ++ "j35iji72t9Jef4kCwrLqs4SaA6C4VYAsUjnP6qyr+ps=", ++ { ++ "./utils": "node_modules/app-info-parser/src/utils.js", ++ "isomorphic-unzip": "node_modules/isomorphic-unzip/zip-node.js" ++ } ++ ], ++ "node_modules/archy/index.js": [ ++ "fiYUYHMM4VCyid9RLr/GjubarjqNiGmNB4Ei6NhcjRA=", ++ {} ++ ], ++ "node_modules/arr-diff/index.js": [ ++ "kAqwblargnzWTll4U5scaYW5FMkZ6HOWLJfccAbBnqg=", ++ {} ++ ], ++ "node_modules/arr-flatten/index.js": [ ++ "adV2OtWc5sq6clVjmORGjJDeCc+uGbBQCIBAFIIIGfE=", ++ {} ++ ], ++ "node_modules/arr-union/index.js": [ ++ "dFdA9svPOVGWzlRnWq5cKCg57tqjT3eFtLocFibIQi4=", ++ {} ++ ], ++ "node_modules/array-lru/crc16.js": [ ++ "7dKxmgPr8UWm0DkEu5zyi/1JHGyCmy5gyhcIwDmcfCE=", ++ {} ++ ], ++ "node_modules/array-lru/index.js": [ ++ "1zNI1a8LFE8FiVsSJ+6dpTLUoUXzBdtc0fQ0mnn9r6Q=", ++ { ++ "./crc16": "node_modules/array-lru/crc16.js" ++ } ++ ], ++ "node_modules/array-source/dist/array-source.js": [ ++ "cGlF4EPdNN1MlD3IaPLWxeKacMGjeFh/YADP6CXTD2Y=", ++ {} ++ ], ++ "node_modules/array-unique/index.js": [ ++ "1BDKStMFOGkNgRRPK2fwuS25BILTrqKik0RsVZUXzrI=", ++ {} ++ ], ++ "node_modules/asar/lib/asar.js": [ ++ "qKDVbZpwCfWF84aF/E/k5YTqRDiCtaeKYhz94wajSH4=", ++ { ++ "./crawlfs": "node_modules/asar/lib/crawlfs.js", ++ "./disk": "node_modules/asar/lib/disk.js", ++ "./filesystem": "node_modules/asar/lib/filesystem.js", ++ "./wrapped-fs": "node_modules/asar/lib/wrapped-fs.js", ++ "minimatch": "node_modules/minimatch/minimatch.js" ++ } ++ ], ++ "node_modules/asar/lib/crawlfs.js": [ ++ "C6uP99ixlryq58E5aBhWw20TPsKCsJjl+gojkHuDlXA=", ++ { ++ "./wrapped-fs": "node_modules/asar/lib/wrapped-fs.js", ++ "glob": "node_modules/glob/glob.js" ++ } ++ ], ++ "node_modules/asar/lib/disk.js": [ ++ "JJZmUmZ4SZuz+vg605u1mV1bwsU5Xur64EScGrI8YE8=", ++ { ++ "./filesystem": "node_modules/asar/lib/filesystem.js", ++ "./wrapped-fs": "node_modules/asar/lib/wrapped-fs.js", ++ "chromium-pickle-js": "node_modules/chromium-pickle-js/lib/exports.js" ++ } ++ ], ++ "node_modules/asar/lib/filesystem.js": [ ++ "883xJseXyl11PHXIlEpgTB7NkK60wF+UopQEHmLTjZk=", ++ { ++ "./wrapped-fs": "node_modules/asar/lib/wrapped-fs.js", ++ "cuint": "node_modules/cuint/index.js", ++ "tmp-promise": "node_modules/asar/node_modules/tmp-promise/index.js" ++ } ++ ], ++ "node_modules/asar/lib/wrapped-fs.js": [ ++ "2mBLY1MRf7VMWX2wG0y4xUxwvsOC1h9SHxQORgS6ogg=", ++ { ++ "mkdirp": "node_modules/asar/node_modules/mkdirp/index.js" ++ } ++ ], ++ "node_modules/asar/node_modules/mkdirp/index.js": [ ++ "xwNbRxsZe6bUh5toA7bKJzoXr2yKI4Lcul6zunCkOsI=", ++ {} ++ ], ++ "node_modules/asar/node_modules/rimraf/rimraf.js": [ ++ "ObijCKnT/swbgPsChLHJV0zC2amgKxjwlh4yPR1ctyw=", ++ { ++ "glob": "node_modules/glob/glob.js" ++ } ++ ], ++ "node_modules/asar/node_modules/tmp-promise/index.js": [ ++ "Yn3FFtvKeowuMkpiBm/bAiShwDCuBHlgr00bGhVaqGw=", ++ { ++ "bluebird": "node_modules/bluebird/js/release/bluebird.js", ++ "tmp": "node_modules/asar/node_modules/tmp/lib/tmp.js" ++ } ++ ], ++ "node_modules/asar/node_modules/tmp/lib/tmp.js": [ ++ "w5+qRzW62ls4RguIOMlaOUnoyOaoGQExr5JFHcDDZ5o=", ++ { ++ "rimraf": "node_modules/asar/node_modules/rimraf/rimraf.js" ++ } ++ ], ++ "node_modules/assign-symbols/index.js": [ ++ "qnQ9jLqCkMCIE2b2BSC3orzGEE9z1Om1lsInuXghMZM=", ++ {} ++ ], ++ "node_modules/async-limiter/index.js": [ ++ "0dLDmxAguWSs3HiWORKl3dlYM7Q//05QpdeSN4GvKUE=", ++ {} ++ ], ++ "node_modules/atob/node-atob.js": [ ++ "WIbCh+Wzll0adcq/W7dYsGKV/h4nY9xPWMvDCKeZXS4=", ++ {} ++ ], ++ "node_modules/atomic-batcher/index.js": [ ++ "WM7RHrzocusqHqGJ48xLm9O5eophb2j4h/Z6jgf3eZE=", ++ {} ++ ], ++ "node_modules/atomic-sleep/index.js": [ ++ "Q42BVQCi3AxQcUrWCnFAfk8vzxa+igkOEGrE6eost5I=", ++ {} ++ ], ++ "node_modules/avvio/boot.js": [ ++ "cW21vTuFpiy7QeBk8nZyzfaSX/pTTqs9h8U7TLEsb38=", ++ { ++ "./plugin": "node_modules/avvio/plugin.js", ++ "./time-tree": "node_modules/avvio/time-tree.js", ++ "debug": "node_modules/debug/src/index.js", ++ "fastq": "node_modules/fastq/queue.js" ++ } ++ ], ++ "node_modules/avvio/plugin.js": [ ++ "0Yj8sD+WJFevwfAFo1MEGGmvbPszkQKQYS1VzS+gUmU=", ++ { ++ "debug": "node_modules/debug/src/index.js", ++ "fastq": "node_modules/fastq/queue.js", ++ "queue-microtask": "node_modules/queue-microtask/index.js" ++ } ++ ], ++ "node_modules/avvio/time-tree.js": [ ++ "a7ACDHo+RLQ0qX1oKk/iYYbiPiWjaRvh1YJfjdNPbAw=", ++ { ++ "archy": "node_modules/archy/index.js" ++ } ++ ], ++ "node_modules/balanced-match/index.js": [ ++ "XDQV/oeWHP/FA+mh10/izUwMLsV7fqT+8KS2Y/U+UrQ=", ++ {} ++ ], ++ "node_modules/base/index.js": [ ++ "eEbO0eEBrUV9EqqQNPeqDs97RBspMcJxweA2G52hfKE=", ++ { ++ "cache-base": "node_modules/cache-base/index.js", ++ "class-utils": "node_modules/class-utils/index.js", ++ "component-emitter": "node_modules/component-emitter/index.js", ++ "define-property": "node_modules/base/node_modules/define-property/index.js", ++ "isobject": "node_modules/isobject/index.js", ++ "mixin-deep": "node_modules/mixin-deep/index.js", ++ "pascalcase": "node_modules/pascalcase/index.js" ++ } ++ ], ++ "node_modules/base/node_modules/define-property/index.js": [ ++ "jKcYzrcOopXC/fcrMwXI+/Zhs9uruQOaejiqciZzENM=", ++ { ++ "is-descriptor": "node_modules/base/node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/base/node_modules/is-accessor-descriptor/index.js": [ ++ "uWcSP5eXqxOfD2T43fElUt/DO/DebNoNF2+rKQVzbj8=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/base/node_modules/is-data-descriptor/index.js": [ ++ "17T6fQV8jDz84CBgZM5yZjYbaNQAA5Hlzs92BrGADSk=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/base/node_modules/is-descriptor/index.js": [ ++ "XG9C4tfIrgGz+gJ8BuKTD60xwz2Uaf5bdKVY1p6PzLM=", ++ { ++ "is-accessor-descriptor": "node_modules/base/node_modules/is-accessor-descriptor/index.js", ++ "is-data-descriptor": "node_modules/base/node_modules/is-data-descriptor/index.js", ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/bencode/lib/decode.js": [ ++ "s9sXzyNjVD8URHeSexpx3S00Bz2aGprSV0+UAJSmXM0=", ++ {} ++ ], ++ "node_modules/bencode/lib/encode.js": [ ++ "luqhJNiMoOmbgCdpe9hfjeGYO+eCsrLQv7UlhilL9lo=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/bencode/lib/index.js": [ ++ "yZejfjSsnSGf+ZBjgm2xhfUoUqD3LLk/QL8txumIzXg=", ++ { ++ "./decode": "node_modules/bencode/lib/decode.js", ++ "./encode": "node_modules/bencode/lib/encode.js" ++ } ++ ], ++ "node_modules/bitfield-rle/index.js": [ ++ "u9jpLnYv/ewmqhFYEmUGN6u7LsoL9enhryYZx0AiHTc=", ++ { ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "varint": "node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/client.js": [ ++ "eQwjj3jpP0Yj56Kw3SOzPmJJWL6fG4LFaIj+vfMkRkU=", ++ { ++ "./peer-store": "node_modules/bittorrent-dht/peer-store.js", ++ "bencode": "node_modules/bencode/lib/index.js", ++ "buffer-equals": "node_modules/buffer-equals/index.js", ++ "debug": "node_modules/bittorrent-dht/node_modules/debug/src/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "k-bucket": "node_modules/k-bucket/index.js", ++ "k-rpc": "node_modules/k-rpc/index.js", ++ "lru": "node_modules/bittorrent-dht/node_modules/lru/index.js", ++ "randombytes": "node_modules/randombytes/index.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js", ++ "simple-sha1": "node_modules/simple-sha1/index.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/index.js": [ ++ "RPQ3r4GoPPX+AYxtrJC8OWWv78/UR3D0cKDv3h/RZfM=", ++ { ++ "./client": "node_modules/bittorrent-dht/client.js", ++ "./server": "node_modules/bittorrent-dht/server.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/node_modules/debug/src/browser.js": [ ++ "cQOSHOoVjhdA7ShGNAa3f9WgUoVpDM26SAvV+5wWK7g=", ++ { ++ "./common": "node_modules/bittorrent-dht/node_modules/debug/src/common.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/node_modules/debug/src/common.js": [ ++ "YxmDwjelz0B6mFJjMPTNySuI/FV8NPhqm47mMoWzRro=", ++ { ++ "ms": "node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/node_modules/debug/src/index.js": [ ++ "ScJCb1AykCgnxReB277fpdd8CTTXheMSXv3lO1I46qo=", ++ { ++ "./browser.js": "node_modules/bittorrent-dht/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/bittorrent-dht/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/node_modules/debug/src/node.js": [ ++ "bDYMN+ncHRT0HjXv3Ga3B6VvBp4kQUMHx250x71QVwI=", ++ { ++ "./common": "node_modules/bittorrent-dht/node_modules/debug/src/common.js", ++ "supports-color": "node_modules/supports-color/index.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/node_modules/lru/index.js": [ ++ "tc6QgXAu+uYzIA2ULV3yxBOMAkhli8QuLrqPLDym4ao=", ++ { ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/peer-store.js": [ ++ "ZLZC2A+WERyUcmuN3uN5udYgKmABHZHG0R6lE08qBuE=", ++ { ++ "lru": "node_modules/bittorrent-dht/node_modules/lru/index.js" ++ } ++ ], ++ "node_modules/bittorrent-dht/server.js": [ ++ "Nwy5/PKyHTWRPamuw60Y05s5TMzIEN2MVzDy2p4u4ww=", ++ { ++ "./client": "node_modules/bittorrent-dht/client.js" ++ } ++ ], ++ "node_modules/bkd-tree/index.js": [ ++ "LB93CtrawnZVAi0vsREcRWvSxnH3ZYMlLRKwNippsf8=", ++ { ++ "./lib/build.js": "node_modules/bkd-tree/lib/build.js", ++ "./lib/calc-index.js": "node_modules/bkd-tree/lib/calc-index.js", ++ "./lib/types.js": "node_modules/bkd-tree/lib/types.js", ++ "bounding-box-overlap-test": "node_modules/bounding-box-overlap-test/index.js", ++ "once": "node_modules/once/once.js", ++ "pull-stream/pull.js": "node_modules/pull-stream/pull.js", ++ "pull-stream/sinks/collect.js": "node_modules/pull-stream/sinks/collect.js" ++ } ++ ], ++ "node_modules/bkd-tree/lib/build.js": [ ++ "9+wce2G4P9tVRIRBhw7hYB3xV1zzl0E6/LLP1g4+Tis=", ++ { ++ "./calc-index.js": "node_modules/bkd-tree/lib/calc-index.js" ++ } ++ ], ++ "node_modules/bkd-tree/lib/calc-index.js": [ ++ "JQUWqPrxzybLootNzf7fwZU1DfeC7elK7n/pnBLUmRo=", ++ {} ++ ], ++ "node_modules/bkd-tree/lib/types.js": [ ++ "SPcTD/CZbKkYTl6Os2x1JCfRfIXeknTuV7DAcO5SQ9w=", ++ {} ++ ], ++ "node_modules/bl/bl.js": [ ++ "ECQUXDQyTxgBRBn83Ak3ad/kNiRM9F6XXVOQB0f00pg=", ++ { ++ "readable-stream/duplex": "node_modules/readable-stream/duplex.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/blake2b-wasm/blake2b.js": [ ++ "dCHqlr/JB6QOxRsHgMFdn5LPLDnrglHrMTL77t73fgU=", ++ {} ++ ], ++ "node_modules/blake2b-wasm/index.js": [ ++ "haWLaXG1DsBrZHbq4zSJ5dZ0BITdUzA3gIg7GhosQ14=", ++ { ++ "./blake2b": "node_modules/blake2b-wasm/blake2b.js", ++ "nanoassert": "node_modules/nanoassert/index.js" ++ } ++ ], ++ "node_modules/blake2b/index.js": [ ++ "aGujbDnX9GdP7vNdje1A+f1Iv6BZ8YL+W2BFjNanDxQ=", ++ { ++ "blake2b-wasm": "node_modules/blake2b-wasm/index.js", ++ "nanoassert": "node_modules/nanoassert/index.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/index.js": [ ++ "BpMh+N1PkrmJMP0OfHDTCe0lbSzegoExypmxx5qixxk=", ++ { ++ "./missing": "node_modules/blob-store-replication-stream/missing.js", ++ "collect-stream": "node_modules/collect-stream/build.js", ++ "debug": "node_modules/blob-store-replication-stream/node_modules/debug/src/index.js", ++ "duplexify": "node_modules/blob-store-replication-stream/node_modules/duplexify/index.js", ++ "length-prefixed-stream": "node_modules/length-prefixed-stream/index.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/missing.js": [ ++ "mGieaVG2w79t1yJYa2hgk3yqPO8mOpaQ4DBLsX7YU3o=", ++ {} ++ ], ++ "node_modules/blob-store-replication-stream/node_modules/debug/src/browser.js": [ ++ "cQOSHOoVjhdA7ShGNAa3f9WgUoVpDM26SAvV+5wWK7g=", ++ { ++ "./common": "node_modules/blob-store-replication-stream/node_modules/debug/src/common.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/node_modules/debug/src/common.js": [ ++ "YxmDwjelz0B6mFJjMPTNySuI/FV8NPhqm47mMoWzRro=", ++ { ++ "ms": "node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/node_modules/debug/src/index.js": [ ++ "ScJCb1AykCgnxReB277fpdd8CTTXheMSXv3lO1I46qo=", ++ { ++ "./browser.js": "node_modules/blob-store-replication-stream/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/blob-store-replication-stream/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/node_modules/debug/src/node.js": [ ++ "bDYMN+ncHRT0HjXv3Ga3B6VvBp4kQUMHx250x71QVwI=", ++ { ++ "./common": "node_modules/blob-store-replication-stream/node_modules/debug/src/common.js", ++ "supports-color": "node_modules/supports-color/index.js" ++ } ++ ], ++ "node_modules/blob-store-replication-stream/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/any.js": [ ++ "u/6I8aaDUTAtoim/Zn++6LJkwP0DSsSZBQfUSC5xMWE=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/async.js": [ ++ "K9bIiuwxGNGAPoXS35neWnIYqWoB8JTVLJiCZUIvz08=", ++ { ++ "./queue": "node_modules/bluebird/js/release/queue.js", ++ "./schedule": "node_modules/bluebird/js/release/schedule.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/bind.js": [ ++ "Anrdh9HABlNWxjQqLROxY3n+3HLIpsQYaBvjpqi0Zjg=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/bluebird.js": [ ++ "8b0JyzScWazlEmpJl7NdTmd4XPNYhv5qcRKscULlJsQ=", ++ { ++ "./promise": "node_modules/bluebird/js/release/promise.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/call_get.js": [ ++ "QjX59wJQP68ykD0voNRUJ5qwHCdJfk10aXIOM99pkKk=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/cancel.js": [ ++ "7AVYMrleJOJUEThqeJpMD5PnYjoRjkUeMNHuWEPGibI=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/catch_filter.js": [ ++ "EdphBXnCKJqgteWf13KsizDSTXSKAJKiB1PbbXA7ueA=", ++ { ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/context.js": [ ++ "XY1rxZQRU6B1b2GoB+hLHd9g6yudVyJyY9EvvKG3Cl4=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/debuggability.js": [ ++ "RwLKhEO3mJrsaX4QTHyL5KNjiNRDUF4z4krVGZuaQDw=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/direct_resolve.js": [ ++ "fdAwJa1VgClPW48GL3FBymD9hIF/+lg2fdylOq0YWvs=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/each.js": [ ++ "5am/Y8+emoFSXuKuAVvtjWbggcT87Otg0Xkf3POKGxQ=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/errors.js": [ ++ "8VN/G0FnOnWgucYKBkfGKFYertTy+uPYGIuySr8zPtw=", ++ { ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/es5.js": [ ++ "xRDY2rTel8H0YNVOp5AUwoOEFiUUjcUAc5gTAABd1C0=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/filter.js": [ ++ "W1LR8uQCq8qOHiA2h6MVf0ssKi7Rqb7mm2xRwbROSZI=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/finally.js": [ ++ "Dk/JEn5osLnZQr72dKA1L3Pwh0xvZvNALQWnoR22e5g=", ++ { ++ "./catch_filter": "node_modules/bluebird/js/release/catch_filter.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/generators.js": [ ++ "7GhWNb2UIDGerDlZuPRGV/ZlRfs1DRvkAsSMlVpXAy8=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/join.js": [ ++ "QFLM1+5B1WWzqJRPX5Xw9HPIZuZJqYGATBy38wVbSYA=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/map.js": [ ++ "njMmc6zJyB2C51FHuML5ATTJ5Zs9xNG7U4JJdRwIfqU=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/method.js": [ ++ "8RXnTqxlRTiDjrf7lxvznSVIsorpDiW3WMZ/FkUEhPY=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/nodeback.js": [ ++ "SIjk/h/X0eHut1UuUVi+wPe37FOBgHgJQSiaVaoRcrU=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/nodeify.js": [ ++ "BFCHEl/beRx0OFD3F6L2QJFXfN1ljPidFpkhxl/LH4I=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/promise.js": [ ++ "ImQfq5qkx/KWLyGqZStoXe2KnsiLDwkVtSSUi/pkRBU=", ++ { ++ "./any.js": "node_modules/bluebird/js/release/any.js", ++ "./async": "node_modules/bluebird/js/release/async.js", ++ "./bind": "node_modules/bluebird/js/release/bind.js", ++ "./call_get.js": "node_modules/bluebird/js/release/call_get.js", ++ "./cancel": "node_modules/bluebird/js/release/cancel.js", ++ "./catch_filter": "node_modules/bluebird/js/release/catch_filter.js", ++ "./context": "node_modules/bluebird/js/release/context.js", ++ "./debuggability": "node_modules/bluebird/js/release/debuggability.js", ++ "./direct_resolve": "node_modules/bluebird/js/release/direct_resolve.js", ++ "./each.js": "node_modules/bluebird/js/release/each.js", ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./filter.js": "node_modules/bluebird/js/release/filter.js", ++ "./finally": "node_modules/bluebird/js/release/finally.js", ++ "./generators.js": "node_modules/bluebird/js/release/generators.js", ++ "./join": "node_modules/bluebird/js/release/join.js", ++ "./map.js": "node_modules/bluebird/js/release/map.js", ++ "./method": "node_modules/bluebird/js/release/method.js", ++ "./nodeback": "node_modules/bluebird/js/release/nodeback.js", ++ "./nodeify.js": "node_modules/bluebird/js/release/nodeify.js", ++ "./promise_array": "node_modules/bluebird/js/release/promise_array.js", ++ "./promisify.js": "node_modules/bluebird/js/release/promisify.js", ++ "./props.js": "node_modules/bluebird/js/release/props.js", ++ "./race.js": "node_modules/bluebird/js/release/race.js", ++ "./reduce.js": "node_modules/bluebird/js/release/reduce.js", ++ "./settle.js": "node_modules/bluebird/js/release/settle.js", ++ "./some.js": "node_modules/bluebird/js/release/some.js", ++ "./synchronous_inspection": "node_modules/bluebird/js/release/synchronous_inspection.js", ++ "./thenables": "node_modules/bluebird/js/release/thenables.js", ++ "./timers.js": "node_modules/bluebird/js/release/timers.js", ++ "./using.js": "node_modules/bluebird/js/release/using.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/promise_array.js": [ ++ "50QJROxG+y786p/gp9fhHR/BYS5W1Raa6+jVqm532Fg=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/promisify.js": [ ++ "JuUdgutBqqr+9UyjSzUL0ApOK9ZkhBc3E4bnvAYUiV4=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./nodeback": "node_modules/bluebird/js/release/nodeback.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/props.js": [ ++ "BB9wtupHk2ZiQMPhlD5pgoCuFL9O5BRZKfQmiX4qoeU=", ++ { ++ "./es5": "node_modules/bluebird/js/release/es5.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/queue.js": [ ++ "aDqrIDdBTgabKl9I05+07l4auAjJeyshjsEsJSCxDII=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/race.js": [ ++ "UkrETtji9/dn16sZcpbbuZ6ZwEl+mbIqKW426IFWMWg=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/reduce.js": [ ++ "6nhv7wY2oi2JNr3eSRvvsrztxhwjPKXFzedlpEM24k4=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/schedule.js": [ ++ "o+s2I8WFmifM8kcGtSEMEQfcZaq1cqICUTu6mh6+yQY=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/settle.js": [ ++ "3UF5VNcF22nqwwRfbftV4mrwcdjb5TkqfzbO6G8kBNk=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/some.js": [ ++ "sJjPXlLwNR2uHJn2CkDGAd7p4ov941avG1RU4fLDbH0=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/synchronous_inspection.js": [ ++ "smph4d/nTSEY29IwBx/NeHe2P5h2OeANrqQ8il/fxQo=", ++ {} ++ ], ++ "node_modules/bluebird/js/release/thenables.js": [ ++ "2+HH0HMeRVluIGhKDgqwMJw8sp9XCJFp86N1B5r/2m0=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/timers.js": [ ++ "1155+ipL54hxeO4hRio3vGCe5AEFqyFQ9IQ27OTC2K8=", ++ { ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/using.js": [ ++ "82g5zvC5/VbZoaKQi0dVEcTIIeM//3k3q1cEqD8mMus=", ++ { ++ "./errors": "node_modules/bluebird/js/release/errors.js", ++ "./util": "node_modules/bluebird/js/release/util.js" ++ } ++ ], ++ "node_modules/bluebird/js/release/util.js": [ ++ "39ACJbCXsnMdkJF0m+N8GMQY4tpZBF5U4R1N+As8yuU=", ++ { ++ "./es5": "node_modules/bluebird/js/release/es5.js" ++ } ++ ], ++ "node_modules/body/index.js": [ ++ "Q5Vl8tsM6eW6ADzoqHAXgU/VRrufkQHULZXj6ZzHRsw=", ++ { ++ "./parse-arguments.js": "node_modules/body/parse-arguments.js", ++ "continuable-cache": "node_modules/continuable-cache/index.js", ++ "raw-body": "node_modules/raw-body/index.js" ++ } ++ ], ++ "node_modules/body/json.js": [ ++ "Wv3MUvIw0neOookXniZxj+1SntMa1sezrU0/pvVn5Pw=", ++ { ++ "./index.js": "node_modules/body/index.js", ++ "./parse-arguments.js": "node_modules/body/parse-arguments.js", ++ "safe-json-parse": "node_modules/safe-json-parse/index.js" ++ } ++ ], ++ "node_modules/body/parse-arguments.js": [ ++ "Wa6CnPqYP7SvaIVHTaJY/vInTn4fzDA00/RFCca6GcQ=", ++ {} ++ ], ++ "node_modules/bounding-box-overlap-test/index.js": [ ++ "SJzIyCJRvPHggc5TezNdSt5ySobFcGvPC883KtE1TTU=", ++ {} ++ ], ++ "node_modules/brace-expansion/index.js": [ ++ "a/nu45IpqmisPmpxF3w4fIMh7/H4MkKjXz58Ncue7Bs=", ++ { ++ "balanced-match": "node_modules/balanced-match/index.js", ++ "concat-map": "node_modules/concat-map/index.js" ++ } ++ ], ++ "node_modules/braces/index.js": [ ++ "Ktm+CbplwNwTw7eIa4wHfkB5Ryl9OPnujbZWxitiJYM=", ++ { ++ "./lib/braces": "node_modules/braces/lib/braces.js", ++ "./lib/compilers": "node_modules/braces/lib/compilers.js", ++ "./lib/parsers": "node_modules/braces/lib/parsers.js", ++ "./lib/utils": "node_modules/braces/lib/utils.js", ++ "array-unique": "node_modules/array-unique/index.js", ++ "extend-shallow": "node_modules/braces/node_modules/extend-shallow/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/braces/lib/braces.js": [ ++ "7vD6ei2JVzjA9FgEBUaItlSFjxO6IsfafCatpVRdnzk=", ++ { ++ "./compilers": "node_modules/braces/lib/compilers.js", ++ "./parsers": "node_modules/braces/lib/parsers.js", ++ "./utils": "node_modules/braces/lib/utils.js", ++ "extend-shallow": "node_modules/braces/node_modules/extend-shallow/index.js", ++ "snapdragon": "node_modules/snapdragon/index.js" ++ } ++ ], ++ "node_modules/braces/lib/compilers.js": [ ++ "ivek4nS45vZ47Q8LfVmVrqjJhPTgZUtqdfCQyYe0jKs=", ++ { ++ "./utils": "node_modules/braces/lib/utils.js" ++ } ++ ], ++ "node_modules/braces/lib/parsers.js": [ ++ "6NRbw8g9XPr8ZXkNq9wv1MLtc1jh5E8r+VniRcESXEg=", ++ { ++ "./utils": "node_modules/braces/lib/utils.js", ++ "snapdragon-node": "node_modules/snapdragon-node/index.js" ++ } ++ ], ++ "node_modules/braces/lib/utils.js": [ ++ "3Inq13BpMjkKklX7xFnV42ADfNkc/MeG4U9OMaTYf7c=", ++ { ++ "arr-flatten": "node_modules/arr-flatten/index.js", ++ "array-unique": "node_modules/array-unique/index.js", ++ "extend-shallow": "node_modules/braces/node_modules/extend-shallow/index.js", ++ "fill-range": "node_modules/fill-range/index.js", ++ "isobject": "node_modules/isobject/index.js", ++ "repeat-element": "node_modules/repeat-element/index.js", ++ "split-string": "node_modules/split-string/index.js" ++ } ++ ], ++ "node_modules/braces/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/buffer-alloc-unsafe/index.js": [ ++ "W3QowJRYr8s4scO5qdkotDsXgq/IgnPwmJ+aEwY3WmM=", ++ {} ++ ], ++ "node_modules/buffer-alloc/index.js": [ ++ "Nq++Ay3bBfkA0yz2Xpty2tKNWgOqGuyo2yV3CHhh8uE=", ++ { ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "buffer-fill": "node_modules/buffer-fill/index.js" ++ } ++ ], ++ "node_modules/buffer-crc32/index.js": [ ++ "9nOtlymYR2mZaEkDDe8csLjach1JKjub7t/jbbxr4Rc=", ++ {} ++ ], ++ "node_modules/buffer-equals/index.js": [ ++ "43EWdmH9qtf5kqMgczVzw7PIPsa6nAaQVsPFYfO9RxE=", ++ {} ++ ], ++ "node_modules/buffer-fill/index.js": [ ++ "upsqoqqkUfGlHrXHavp0b4DzMJy0VWXEcajSm2FpGc8=", ++ {} ++ ], ++ "node_modules/buffer-from/index.js": [ ++ "eJ+7RKEDB70sDJWMpLxYBjIR8OXa6N2U/0plqGrnDJo=", ++ {} ++ ], ++ "node_modules/bulk-write-stream/index.js": [ ++ "kC27xLYRhHbSMsmHoxPTuWSfMeLvNu9NB8pCp/+P1b0=", ++ { ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/byline/lib/byline.js": [ ++ "5UaMptuIsNrtPY1ylecCYvWil1CJV0frMvQ4SOcr+I8=", ++ {} ++ ], ++ "node_modules/bytebuffer/dist/bytebuffer-node.js": [ ++ "i6Le+8qA5G7Wqm/TrWJ0AXnJaD/F7pvWDprDrEtKb10=", ++ { ++ "long": "node_modules/long/dist/long.js" ++ } ++ ], ++ "node_modules/bytes/index.js": [ ++ "uOgJOFRTQ6aHK0WA4gw1C3wmVvpshOd0Mm6afjlCvJ8=", ++ {} ++ ], ++ "node_modules/cache-base/index.js": [ ++ "Y3q/O2QN2Ld5yJdoa8Nw72zvG2resxVsXu6GMY37UIQ=", ++ { ++ "collection-visit": "node_modules/collection-visit/index.js", ++ "component-emitter": "node_modules/component-emitter/index.js", ++ "get-value": "node_modules/get-value/index.js", ++ "has-value": "node_modules/has-value/index.js", ++ "isobject": "node_modules/isobject/index.js", ++ "set-value": "node_modules/set-value/index.js", ++ "to-object-path": "node_modules/to-object-path/index.js", ++ "union-value": "node_modules/union-value/index.js", ++ "unset-value": "node_modules/unset-value/index.js" ++ } ++ ], ++ "node_modules/cacheable-lookup/source/index.js": [ ++ "DP1FhVZSQp2/snEvCP3omVFy7boN/fdmQWlH4RPN66k=", ++ {} ++ ], ++ "node_modules/cacheable-request/node_modules/get-stream/buffer-stream.js": [ ++ "dFAjcvPkV65NBVRsR7T9iMjfbtjrYWa2/ri+wXmOxtw=", ++ {} ++ ], ++ "node_modules/cacheable-request/node_modules/get-stream/index.js": [ ++ "gGJjhulAF+iVCrdXkdoljBFlhn5JGH6/jJ93s+HaRHg=", ++ { ++ "./buffer-stream": "node_modules/cacheable-request/node_modules/get-stream/buffer-stream.js", ++ "pump": "node_modules/pump/index.js" ++ } ++ ], ++ "node_modules/cacheable-request/src/index.js": [ ++ "POBaw1MfYVKSEL9jkPGNXnCewRDjfe4ir35ytAZcpic=", ++ { ++ "clone-response": "node_modules/clone-response/src/index.js", ++ "get-stream": "node_modules/cacheable-request/node_modules/get-stream/index.js", ++ "http-cache-semantics": "node_modules/http-cache-semantics/index.js", ++ "keyv": "node_modules/keyv/src/index.js", ++ "lowercase-keys": "node_modules/lowercase-keys/index.js", ++ "normalize-url": "node_modules/normalize-url/index.js", ++ "responselike": "node_modules/responselike/src/index.js" ++ } ++ ], ++ "node_modules/charset/index.js": [ ++ "RvSwJgWIMFW1PE02IbptBsbwbA8thC2nnzg1ZSlXW1Q=", ++ {} ++ ], ++ "node_modules/chownr/chownr.js": [ ++ "UpsoVwPSm4qzHq1kvR9kFGusEhR8wJzrSyXw24ehLJY=", ++ {} ++ ], ++ "node_modules/chromium-pickle-js/lib/exports.js": [ ++ "nd5V8xQkfjQpBTm0xR7QlrEw/FuO8XFiCSkVx7j5dI0=", ++ { ++ "./pickle": "node_modules/chromium-pickle-js/lib/pickle.js" ++ } ++ ], ++ "node_modules/chromium-pickle-js/lib/pickle.js": [ ++ "inpRcENZ76kCBNOzB1LdBcLloReU9ZiFBbF1NkcrEEk=", ++ {} ++ ], ++ "node_modules/class-utils/index.js": [ ++ "Z+sgjhaAC2tTv4/4HC6bwaXKY/s37vO0EnM9YSbET+c=", ++ { ++ "arr-union": "node_modules/arr-union/index.js", ++ "define-property": "node_modules/class-utils/node_modules/define-property/index.js", ++ "isobject": "node_modules/isobject/index.js", ++ "static-extend": "node_modules/static-extend/index.js" ++ } ++ ], ++ "node_modules/class-utils/node_modules/define-property/index.js": [ ++ "dOYahXtE2Wzrnj/t8+Uh2PE6tfo9G5HhZTk7Mpw5fAw=", ++ { ++ "is-descriptor": "node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/clone-response/src/index.js": [ ++ "TmCG3KvkHKekjePAU+DZfrf2e5K+5WZTRBe2S7x1ZJk=", ++ { ++ "mimic-response": "node_modules/mimic-response/index.js" ++ } ++ ], ++ "node_modules/clone/clone.js": [ ++ "Q4v28UUOFVVWWc1n5qY8JfBFOe9zzcqY9zanNj7AF+c=", ++ {} ++ ], ++ "node_modules/codecs/index.js": [ ++ "Ld/LAozfxnT4nEo775mN7t9GUIeiEnSGTPKOj5CUmZA=", ++ {} ++ ], ++ "node_modules/collect-stream/build.js": [ ++ "EGnWC+KsgR1w7dZqahpsBCTqUDb6eYGVlf0k21aYCkk=", ++ { ++ "concat-stream": "node_modules/collect-stream/node_modules/concat-stream/index.js", ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/collect-stream/node_modules/concat-stream/index.js": [ ++ "4iLeG61xXUnT5QQh4KBmmfT+lEHeX0dvkC2SmZwcHbU=", ++ { ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "typedarray": "node_modules/typedarray/index.js" ++ } ++ ], ++ "node_modules/collection-visit/index.js": [ ++ "5vZTNz8xL4VEfuROz0Q8p8V7FwRy3C7eoKVjKPZBp2s=", ++ { ++ "map-visit": "node_modules/map-visit/index.js", ++ "object-visit": "node_modules/object-visit/index.js" ++ } ++ ], ++ "node_modules/component-emitter/index.js": [ ++ "oLWiY+kDZrd/QTdwkzLDnUthT8gccusG7Fihyaiu1nU=", ++ {} ++ ], ++ "node_modules/concat-map/index.js": [ ++ "CRtl13gzdZnQFAs11TwDhgPRcy0nwzv+OeA4calpJrI=", ++ {} ++ ], ++ "node_modules/connections/index.js": [ ++ "ePvfjuZUMfM/dqZbFLo5r5fc7DPXYUzpXE/rP1NsEEc=", ++ {} ++ ], ++ "node_modules/const-max-uint32/lib/index.js": [ ++ "Le+RISzbtAR2CHZtt9N3+fJ8MPLK3FHUbvhpbknoTsc=", ++ {} ++ ], ++ "node_modules/const-pinf-float64/lib/index.js": [ ++ "A7hX6nalepxuZf8m+zgrsBTGVxKyGhzlgKfVS24FZUs=", ++ {} ++ ], ++ "node_modules/continuable-cache/index.js": [ ++ "aBZVGnAU/fRPGNIVzaK7WTaUhC404b0YzRx4wOge24Y=", ++ {} ++ ], ++ "node_modules/cookie/index.js": [ ++ "fP0Aj+E0iIMK3+aVPfaRam5TUKzb0DJ1kBu/MCr/2Oo=", ++ {} ++ ], ++ "node_modules/copy-descriptor/index.js": [ ++ "99rBK2oIF5CIIeGzE4sRQLOOWb/A6R/x1b80rDokoxw=", ++ {} ++ ], ++ "node_modules/core-js/library/fn/set-immediate.js": [ ++ "G3+SoQoynzxCkHob1xmttPpWu2Q7s/V/m8O+6H+J2jw=", ++ { ++ "../modules/_core": "node_modules/core-js/library/modules/_core.js", ++ "../modules/web.immediate": "node_modules/core-js/library/modules/web.immediate.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_a-function.js": [ ++ "vI7NBVNoKizw/T7ablYtwI3LpO0i3o35fx5BICdyws8=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_an-object.js": [ ++ "FD1Pe34jvTZR5fMuRia3hM8zEUS9H3ODoGsrrLJuzro=", ++ { ++ "./_is-object": "node_modules/core-js/library/modules/_is-object.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_cof.js": [ ++ "FY6tg0ymdCS/rEwpAa7RJK6QAQTww3QA6evZ/5sQHZ0=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_core.js": [ ++ "m+ms/8Jzx6mKfw2tHQOx6i1fbmYbVSDISWVmKzkCjGc=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_ctx.js": [ ++ "7XSoqXnnvuQNnLab8whJS7OLaKwNSmPU1wxLyDNEdAM=", ++ { ++ "./_a-function": "node_modules/core-js/library/modules/_a-function.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_descriptors.js": [ ++ "McUDhb4rP+oATCLvDuyPhYMkjIN4OyrPGm8t9NBWWMk=", ++ { ++ "./_fails": "node_modules/core-js/library/modules/_fails.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_dom-create.js": [ ++ "24Me2VaLtFW+4kZ/bwu+gy+1oB+bvpAPS+1OsfPMn2o=", ++ { ++ "./_global": "node_modules/core-js/library/modules/_global.js", ++ "./_is-object": "node_modules/core-js/library/modules/_is-object.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_export.js": [ ++ "fGTKYkdyS7XTV6bj77hAk0iAZ43Yq+vMqhW3ux4kxq4=", ++ { ++ "./_core": "node_modules/core-js/library/modules/_core.js", ++ "./_ctx": "node_modules/core-js/library/modules/_ctx.js", ++ "./_global": "node_modules/core-js/library/modules/_global.js", ++ "./_hide": "node_modules/core-js/library/modules/_hide.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_fails.js": [ ++ "6G4+YXaRghTGQQnkm/qpK+b2DBUKrknXrtL2J8J7FU0=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_global.js": [ ++ "t7QKkyeVEU+gGSy/l5Cc2bOHeSPc/UfcLwmUVaZQLHk=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_hide.js": [ ++ "5JdwMpfbd5b8F4itNMekPm1WdsbWT+W5dU5qAUjyNng=", ++ { ++ "./_descriptors": "node_modules/core-js/library/modules/_descriptors.js", ++ "./_object-dp": "node_modules/core-js/library/modules/_object-dp.js", ++ "./_property-desc": "node_modules/core-js/library/modules/_property-desc.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_html.js": [ ++ "J5YJ2iM2hDG8yPvNuD5NSwktQ1quiYIXLL9PqToAEqQ=", ++ { ++ "./_global": "node_modules/core-js/library/modules/_global.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_ie8-dom-define.js": [ ++ "txBbsHMC53UVDcVkHwf9Ubd5iLv2Fk1ASuxpaIVwBrk=", ++ { ++ "./_descriptors": "node_modules/core-js/library/modules/_descriptors.js", ++ "./_dom-create": "node_modules/core-js/library/modules/_dom-create.js", ++ "./_fails": "node_modules/core-js/library/modules/_fails.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_invoke.js": [ ++ "E5oEmI/tJ4B9e5skV6bKancuRVGg0twNUW9ZKHBGZII=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_is-object.js": [ ++ "FkaOOMIm0uw4T/qUEXedGAomXG5xzPsXM1T8CCkfyF4=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_object-dp.js": [ ++ "USI9OT8U6SpHfWvn9r5gObNmwkTqgyUbnLHq3Q0jixw=", ++ { ++ "./_an-object": "node_modules/core-js/library/modules/_an-object.js", ++ "./_descriptors": "node_modules/core-js/library/modules/_descriptors.js", ++ "./_ie8-dom-define": "node_modules/core-js/library/modules/_ie8-dom-define.js", ++ "./_to-primitive": "node_modules/core-js/library/modules/_to-primitive.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_property-desc.js": [ ++ "iSs9jpAw1JT2ZWWLScSH9iky4nGwCJYPaIt289WicOA=", ++ {} ++ ], ++ "node_modules/core-js/library/modules/_task.js": [ ++ "52hNBPccP2gbXrzud6fGVbxRSmLOBU4AO/VhwPBvGEk=", ++ { ++ "./_cof": "node_modules/core-js/library/modules/_cof.js", ++ "./_ctx": "node_modules/core-js/library/modules/_ctx.js", ++ "./_dom-create": "node_modules/core-js/library/modules/_dom-create.js", ++ "./_global": "node_modules/core-js/library/modules/_global.js", ++ "./_html": "node_modules/core-js/library/modules/_html.js", ++ "./_invoke": "node_modules/core-js/library/modules/_invoke.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/_to-primitive.js": [ ++ "a1Cfbzo6Ix2Qb6hwaVeRtZepI45Bqy+gGA8S/P3GeFw=", ++ { ++ "./_is-object": "node_modules/core-js/library/modules/_is-object.js" ++ } ++ ], ++ "node_modules/core-js/library/modules/web.immediate.js": [ ++ "mRSPY6SJXHNdX6+8vVly/DP4WlaDseuSfG70DZXMa6s=", ++ { ++ "./_export": "node_modules/core-js/library/modules/_export.js", ++ "./_task": "node_modules/core-js/library/modules/_task.js" ++ } ++ ], ++ "node_modules/core-util-is/lib/util.js": [ ++ "aRb/yDtQKWPdj2Gc5FenMcwXMOKqr3f6P4vLtgNFyp0=", ++ {} ++ ], ++ "node_modules/count-trailing-zeros/ctz.js": [ ++ "LCWnQdmOSN/bMMYcH9X1qzKjnRRcrHRfeSDAko/jm88=", ++ {} ++ ], ++ "node_modules/cuint/index.js": [ ++ "GcBIC04wuj/eoeu+b2uDD8l8f8WagY82fMvedHXeORU=", ++ { ++ "./lib/uint32": "node_modules/cuint/lib/uint32.js", ++ "./lib/uint64": "node_modules/cuint/lib/uint64.js" ++ } ++ ], ++ "node_modules/cuint/lib/uint32.js": [ ++ "AbO5usk7t+EYAGGH6x/LrK8a24b7wQ8FSAe62n5TYTE=", ++ {} ++ ], ++ "node_modules/cuint/lib/uint64.js": [ ++ "JvCBFxJrWkfOj+TRNuGmYzKdV4sCdpVSxE0yeUDpFeo=", ++ {} ++ ], ++ "node_modules/custom-error-class/index.js": [ ++ "9n4VvtedWSJrSjZRsmpwDji1FTqXm4ZehCUMAUl92mI=", ++ {} ++ ], ++ "node_modules/d64/index.js": [ ++ "HRkeYVMc1mKWfG98ms7TlcZ9/A/G7AwM/RPMr4bTQ3A=", ++ {} ++ ], ++ "node_modules/dat-swarm-defaults/index.js": [ ++ "gKrdDRhBDZAltH4/tborcwBoAWkvkkpkVEFwD82+qrQ=", ++ {} ++ ], ++ "node_modules/dbf/index.js": [ ++ "e4n64oVzFTDyAwaggr0A9DZI++R1zLrDY9vktqGsDSA=", ++ { ++ "./src/structure": "node_modules/dbf/src/structure.js" ++ } ++ ], ++ "node_modules/dbf/src/fields.js": [ ++ "ANo+DrPod25nfW0D2uQk6tKaO8IAiq2+WH+ZFBg3pxw=", ++ { ++ "./fieldsize": "node_modules/dbf/src/fieldsize.js" ++ } ++ ], ++ "node_modules/dbf/src/fieldsize.js": [ ++ "k4g6K88uAhFiksLv5a20XB4XEnLAiA917KUhiVlU2CA=", ++ {} ++ ], ++ "node_modules/dbf/src/lib.js": [ ++ "9JFUXTkqYTto+p8jULlnZAnTI9gBN/nO7TBijDd7ves=", ++ {} ++ ], ++ "node_modules/dbf/src/structure.js": [ ++ "fVVaHNu5pMx8xPL6CXzwJQ5oEOEmmuTaOK+T49vhIOI=", ++ { ++ "./fields": "node_modules/dbf/src/fields.js", ++ "./fieldsize": "node_modules/dbf/src/fieldsize.js", ++ "./lib": "node_modules/dbf/src/lib.js" ++ } ++ ], ++ "node_modules/debounce/index.js": [ ++ "maJeaZLjrGXv7cYCW4FvhhHVxCS0ajoMVi3YPPXBHFA=", ++ {} ++ ], ++ "node_modules/debug/src/browser.js": [ ++ "Tj3G0OHbWKDXQga0Q/NVgtO3F75WoPbQMMNK9sKtn2I=", ++ { ++ "./common": "node_modules/debug/src/common.js" ++ } ++ ], ++ "node_modules/debug/src/common.js": [ ++ "rmhV6fXvZoeqj3bmndGFTxuZmFFGQ02v8xAVAIPP3gI=", ++ { ++ "ms": "node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/debug/src/index.js": [ ++ "qhJ/8XUrfZx0FcXHu2mU2apyK4G8vKtL1IMWsBPSO/M=", ++ { ++ "./browser.js": "node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/debug/src/node.js": [ ++ "8jety1KEnefBKPV+BGi1I1PFKabINBgQR3wOcUQ1lVk=", ++ { ++ "./common": "node_modules/debug/src/common.js", ++ "supports-color": "node_modules/supports-color/index.js" ++ } ++ ], ++ "node_modules/decode-uri-component/index.js": [ ++ "vFWqrHa0YEh+TAVYP/JEvCroWtmdoABZzYcnc8SOqQI=", ++ {} ++ ], ++ "node_modules/decompress-response/index.js": [ ++ "aC4IEqn09+TO5WipTztRug2eWuw/sOwwQtnVREz4ks8=", ++ { ++ "mimic-response": "node_modules/decompress-response/node_modules/mimic-response/index.js" ++ } ++ ], ++ "node_modules/decompress-response/node_modules/mimic-response/index.js": [ ++ "X+Iei3pR6o9r3dwZjsYrUjAzwSxgwvlf72RGd5IA2vA=", ++ {} ++ ], ++ "node_modules/deepmerge/dist/cjs.js": [ ++ "AubryZDMuoHEN1rgQM947c+/6H/Ds6DlbKl7Qbhhy3I=", ++ {} ++ ], ++ "node_modules/defer-to-connect/dist/source/index.js": [ ++ "HlB7Z5AfDVxlAN5+CisP/UXlaWGbjTHUKLkAVf9+PSE=", ++ {} ++ ], ++ "node_modules/deferred-leveldown/deferred-iterator.js": [ ++ "n4CGggNJyMn+JKT8JsASRAWx0CF5ZzurUGes9wLMyTM=", ++ { ++ "abstract-leveldown": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/index.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/deferred-leveldown.js": [ ++ "umkKKpEGau7k61gQBI0wq42O3weWyfCzB1xBb1fTMqY=", ++ { ++ "./deferred-iterator": "node_modules/deferred-leveldown/deferred-iterator.js", ++ "abstract-leveldown": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/index.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js": [ ++ "Z8EKDfGEpOQukRahaYVq29rf5GC4NqI89BA8V8zLEjM=", ++ { ++ "./next-tick": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-iterator.js": [ ++ "zFwENznp0VlKGOUYw0UZkxqAiBy3wg7PWi8lMBIuBBE=", ++ { ++ "./next-tick": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-leveldown.js": [ ++ "x0iMaqNlst14z89o06Dn5qILdB4SVT1ZLCwHt7tYY3s=", ++ { ++ "./abstract-chained-batch": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-iterator.js", ++ "./next-tick": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/next-tick.js", ++ "level-supports": "node_modules/level-supports/index.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/node_modules/abstract-leveldown/index.js": [ ++ "TZhD82oHTYdXvS5L6p4PGz8scF9rlqoYYWIXtimi4GY=", ++ { ++ "./abstract-chained-batch": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-iterator.js", ++ "./abstract-leveldown": "node_modules/deferred-leveldown/node_modules/abstract-leveldown/abstract-leveldown.js" ++ } ++ ], ++ "node_modules/deferred-leveldown/node_modules/abstract-leveldown/next-tick.js": [ ++ "JczFU1xaSOlfDIj/bfki3cAkCh3PBIunWfLagGh0jBk=", ++ {} ++ ], ++ "node_modules/define-property/index.js": [ ++ "mXDGmQdidNmehd+YIT5ITJGfT2ZTTwrs3NDqOaRKENE=", ++ { ++ "is-descriptor": "node_modules/define-property/node_modules/is-descriptor/index.js", ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/define-property/node_modules/is-accessor-descriptor/index.js": [ ++ "uWcSP5eXqxOfD2T43fElUt/DO/DebNoNF2+rKQVzbj8=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/define-property/node_modules/is-data-descriptor/index.js": [ ++ "17T6fQV8jDz84CBgZM5yZjYbaNQAA5Hlzs92BrGADSk=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/define-property/node_modules/is-descriptor/index.js": [ ++ "XG9C4tfIrgGz+gJ8BuKTD60xwz2Uaf5bdKVY1p6PzLM=", ++ { ++ "is-accessor-descriptor": "node_modules/define-property/node_modules/is-accessor-descriptor/index.js", ++ "is-data-descriptor": "node_modules/define-property/node_modules/is-data-descriptor/index.js", ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/defined/index.js": [ ++ "Vb6mMU0vc4x3R8riil6ujf6QXdnLhd83zDfmivCKls8=", ++ {} ++ ], ++ "node_modules/depd/index.js": [ ++ "JE27yhS4qpyba+BJEig6twS5LxHcubI76yuoFAL+zJk=", ++ { ++ "./lib/compat": "node_modules/depd/lib/compat/index.js" ++ } ++ ], ++ "node_modules/depd/lib/compat/callsite-tostring.js": [ ++ "cCqwLcdnvTUfyl+fqmWTJ/IvTP0mhOCjOyNEeDj1dzs=", ++ {} ++ ], ++ "node_modules/depd/lib/compat/event-listener-count.js": [ ++ "Xci+9tdkEVjM1IX+zn/PRlZv6VtC5ApI3tfqQzZvCWg=", ++ {} ++ ], ++ "node_modules/depd/lib/compat/index.js": [ ++ "drr4MxesgQRc77n8yOwNjkfdDPy63VkvSANJQS4WGGE=", ++ { ++ "./callsite-tostring": "node_modules/depd/lib/compat/callsite-tostring.js", ++ "./event-listener-count": "node_modules/depd/lib/compat/event-listener-count.js" ++ } ++ ], ++ "node_modules/discovery-channel/index.js": [ ++ "JAV3eoDjvKXTlFPb8ig3dkrUvAHNtR6/AvakT9OvAMo=", ++ { ++ "bittorrent-dht": "node_modules/bittorrent-dht/index.js", ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "debug": "node_modules/discovery-channel/node_modules/debug/src/index.js", ++ "dns-discovery": "node_modules/dns-discovery/index.js", ++ "pretty-hash": "node_modules/pretty-hash/index.js", ++ "thunky": "node_modules/discovery-channel/node_modules/thunky/index.js" ++ } ++ ], ++ "node_modules/discovery-channel/node_modules/debug/src/browser.js": [ ++ "AUSralK5MwxWfeEaXDpK6jXNrEekwQZIKqJK6AVM3G8=", ++ { ++ "./debug": "node_modules/discovery-channel/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/discovery-channel/node_modules/debug/src/debug.js": [ ++ "2NHB1sOHq2fD8o14/Qsgub7NaUQtudPv4RDKRktQnIo=", ++ { ++ "ms": "node_modules/discovery-channel/node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/discovery-channel/node_modules/debug/src/index.js": [ ++ "mjT+3rLSacRu2U5vEwOesNFthm3UYOxm+jrNeBIvqf4=", ++ { ++ "./browser.js": "node_modules/discovery-channel/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/discovery-channel/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/discovery-channel/node_modules/debug/src/node.js": [ ++ "o+g1lKTOiJl+Lk/Ga8lCsXudc2KQrWJWDH8J1tCYmtA=", ++ { ++ "./debug": "node_modules/discovery-channel/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/discovery-channel/node_modules/ms/index.js": [ ++ "S9kiCcudrPPjdz5yWst6rsQ+qeeFQDJOTQ9z5c6a3vc=", ++ {} ++ ], ++ "node_modules/discovery-channel/node_modules/thunky/index.js": [ ++ "xpSM2LHgz5JWp8S4pR4S9hZUZVor167wqBCLKia3NR0=", ++ {} ++ ], ++ "node_modules/discovery-swarm/index.js": [ ++ "I5mpIaPzbahgy7vfBsTxX3ov1BEfBO50vjcRhRo+bcs=", ++ { ++ "connections": "node_modules/connections/index.js", ++ "debug": "node_modules/debug/src/index.js", ++ "discovery-channel": "node_modules/discovery-channel/index.js", ++ "length-prefixed-message": "node_modules/length-prefixed-message/index.js", ++ "pump": "node_modules/pump/index.js", ++ "to-buffer": "node_modules/to-buffer/index.js", ++ "utp-native": "node_modules/utp-native/index.js" ++ } ++ ], ++ "node_modules/dns-discovery/index.js": [ ++ "Z9um3rWR3ZmQ4MtIFElic5KS6aJdLiJQWkLiRkbzpxw=", ++ { ++ "./store": "node_modules/dns-discovery/store.js", ++ "debug": "node_modules/dns-discovery/node_modules/debug/src/index.js", ++ "dns-socket": "node_modules/dns-socket/index.js", ++ "multicast-dns": "node_modules/multicast-dns/index.js", ++ "network-address": "node_modules/network-address/index.js" ++ } ++ ], ++ "node_modules/dns-discovery/node_modules/debug/src/browser.js": [ ++ "AUSralK5MwxWfeEaXDpK6jXNrEekwQZIKqJK6AVM3G8=", ++ { ++ "./debug": "node_modules/dns-discovery/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/dns-discovery/node_modules/debug/src/debug.js": [ ++ "2NHB1sOHq2fD8o14/Qsgub7NaUQtudPv4RDKRktQnIo=", ++ { ++ "ms": "node_modules/dns-discovery/node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/dns-discovery/node_modules/debug/src/index.js": [ ++ "mjT+3rLSacRu2U5vEwOesNFthm3UYOxm+jrNeBIvqf4=", ++ { ++ "./browser.js": "node_modules/dns-discovery/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/dns-discovery/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/dns-discovery/node_modules/debug/src/node.js": [ ++ "o+g1lKTOiJl+Lk/Ga8lCsXudc2KQrWJWDH8J1tCYmtA=", ++ { ++ "./debug": "node_modules/dns-discovery/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/dns-discovery/node_modules/ms/index.js": [ ++ "S9kiCcudrPPjdz5yWst6rsQ+qeeFQDJOTQ9z5c6a3vc=", ++ {} ++ ], ++ "node_modules/dns-discovery/store.js": [ ++ "sdTWOnXiTZ4SF1GkfxUAGWXNb15lQaHPnpwD+FArYu4=", ++ { ++ "lru": "node_modules/lru/index.js", ++ "unordered-set": "node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/dns-packet/classes.js": [ ++ "rcO6lqbQMClPk1bwPMIV4sU94T7W3ulP2lTuDU9fAO8=", ++ {} ++ ], ++ "node_modules/dns-packet/index.js": [ ++ "3Yfz6/UrnqBi380Wh0o4y+RJY6kcSzIQ1SnWZTbr20U=", ++ { ++ "./classes": "node_modules/dns-packet/classes.js", ++ "./opcodes": "node_modules/dns-packet/opcodes.js", ++ "./rcodes": "node_modules/dns-packet/rcodes.js", ++ "./types": "node_modules/dns-packet/types.js", ++ "ip": "node_modules/ip/lib/ip.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/dns-packet/opcodes.js": [ ++ "LFriGAnBMRlKf47mnJbutbNHtlW4XIMzE4AeLRZ0uOs=", ++ {} ++ ], ++ "node_modules/dns-packet/rcodes.js": [ ++ "c9AZp9LNXY8sgwAYLr1FRnX4VvgW/v0CldZfiaLetbQ=", ++ {} ++ ], ++ "node_modules/dns-packet/types.js": [ ++ "ZcNaMim1o4HNBVHsBLb+7I4tFsip7QC5bFkhBcvEv/o=", ++ {} ++ ], ++ "node_modules/dns-socket/index.js": [ ++ "NiZuC0vboTZqjCLbgO89LaQ9tUIDnNLDVHiGP+3yJ+c=", ++ { ++ "dns-packet": "node_modules/dns-packet/index.js" ++ } ++ ], ++ "node_modules/duplexify/index.js": [ ++ "qUWCgTEy9l4A4CYOx6wzn+XnMHMWmWGuQVnzSDw4Omo=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/duplexify/node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/duplexify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/duplexify/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/duplexify/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic.js": [ ++ "XRrduq/tg+osr8SrCLpct3cPxpGT/RjXuGxtHtPi2mI=", ++ { ++ "../package.json": "node_modules/ecstatic/package.json", ++ "./ecstatic/etag": "node_modules/ecstatic/lib/ecstatic/etag.js", ++ "./ecstatic/mime": "node_modules/ecstatic/lib/ecstatic/mime.js", ++ "./ecstatic/opts": "node_modules/ecstatic/lib/ecstatic/opts.js", ++ "./ecstatic/show-dir": "node_modules/ecstatic/lib/ecstatic/show-dir/index.js", ++ "./ecstatic/status-handlers": "node_modules/ecstatic/lib/ecstatic/status-handlers.js", ++ "on-finished": "node_modules/on-finished/index.js", ++ "url-join": "node_modules/url-join/lib/url-join.js" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic/aliases.json": [ ++ "yaphZhXIkWCXJDD0TVLV17SRY62G8z3E98aHMsHxhsM=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/defaults.json": [ ++ "DJfebftuHYnyn54z6f0cGUYtD/cEnMgc2n65/43XO/Q=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/etag.js": [ ++ "kYrW3Sf+0xAMN0G5wAm+jm1/wcM2WVs+M+/3X9OnIKc=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/mime.js": [ ++ "v8VTn89e4ngZFwsNL7zODeRGqKJIVPjVAwMKaDmsw74=", ++ { ++ "charset": "node_modules/charset/index.js", ++ "mime": "node_modules/mime/index.js" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic/opts.js": [ ++ "6mKNNA1g6NQevy3pcZEvRX+XuLrBLd20s4q87rRBaNA=", ++ { ++ "./aliases.json": "node_modules/ecstatic/lib/ecstatic/aliases.json", ++ "./defaults.json": "node_modules/ecstatic/lib/ecstatic/defaults.json" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/icons.json": [ ++ "kagWvGLBLJvfAuxhyVLhtTa7UEQf1zI9WovGT6Vrx9U=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/index.js": [ ++ "uVbgiWhzeAj4jgHkzgxdKXbRzrtyAjpTZlG55J040Y4=", ++ { ++ "../etag": "node_modules/ecstatic/lib/ecstatic/etag.js", ++ "../status-handlers": "node_modules/ecstatic/lib/ecstatic/status-handlers.js", ++ "./perms-to-string": "node_modules/ecstatic/lib/ecstatic/show-dir/perms-to-string.js", ++ "./size-to-string": "node_modules/ecstatic/lib/ecstatic/show-dir/size-to-string.js", ++ "./sort-files": "node_modules/ecstatic/lib/ecstatic/show-dir/sort-files.js", ++ "./styles": "node_modules/ecstatic/lib/ecstatic/show-dir/styles.js", ++ "he": "node_modules/he/he.js" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/perms-to-string.js": [ ++ "E6vaSa8eQDzBUrBkaXkwjadtVN8ldAOD611FizMFh5g=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/size-to-string.js": [ ++ "JEcJDDMCvGmN8JDLt0/dMktUko26YKIqTUWK+HkvYsY=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/sort-files.js": [ ++ "WhIxlFxQA4dDxkvgiD2rtL82/ldeUe6Ovj4p8FCMhVk=", ++ {} ++ ], ++ "node_modules/ecstatic/lib/ecstatic/show-dir/styles.js": [ ++ "zErBTBV+JkmyX8pqQiK3q6GllbjOE03RQ6dT78q1nKg=", ++ { ++ "./icons.json": "node_modules/ecstatic/lib/ecstatic/show-dir/icons.json" ++ } ++ ], ++ "node_modules/ecstatic/lib/ecstatic/status-handlers.js": [ ++ "PMJlzhTD3q3g4F8aGYLEJv//iCffnaRfcatBcqG8BPQ=", ++ { ++ "he": "node_modules/he/he.js" ++ } ++ ], ++ "node_modules/ecstatic/package.json": [ ++ "f7jn9BDjbLs9zKQ7SelKTj5vZi2cB6uizfIok8a/9bE=", ++ {} ++ ], ++ "node_modules/ee-first/index.js": [ ++ "KdPMzdxxSPSHFb/JTrb3ufkTKl7LcEudS3E96H52A90=", ++ {} ++ ], ++ "node_modules/encoding-down/index.js": [ ++ "K1cNFqtlGOBiwNIxcnqMaT1oKNvJUTxlHDxw61tnn6I=", ++ { ++ "abstract-leveldown": "node_modules/abstract-leveldown/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "level-codec": "node_modules/level-codec/index.js", ++ "level-errors": "node_modules/level-errors/errors.js" ++ } ++ ], ++ "node_modules/end-of-stream/index.js": [ ++ "PpEt8ibukO4+3F/2nNPoMT+h2hN5XhD7Cw8Fcnvau1g=", ++ { ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/errno/custom.js": [ ++ "LQrn+beMz9sSTqtT7mL/SXunAGHjhGQnZY0eip5XI+o=", ++ { ++ "prr": "node_modules/prr/prr.js" ++ } ++ ], ++ "node_modules/errno/errno.js": [ ++ "Hk6T3FVpUObSr+tQzzuU3LOQ2HC4cqsuS+qI19rk5aI=", ++ { ++ "./custom": "node_modules/errno/custom.js" ++ } ++ ], ++ "node_modules/error-stack-parser/error-stack-parser.js": [ ++ "gegFF1TLzRGpct4J5Fk5mE1YG7Z5KJqaV+/h6lW8NIk=", ++ { ++ "stackframe": "node_modules/stackframe/stackframe.js" ++ } ++ ], ++ "node_modules/expand-brackets/index.js": [ ++ "f0EQYwrD8kla3DfjwtIgIvgzVhNt4wPIKg7S+6y/vKg=", ++ { ++ "./lib/compilers": "node_modules/expand-brackets/lib/compilers.js", ++ "./lib/parsers": "node_modules/expand-brackets/lib/parsers.js", ++ "debug": "node_modules/expand-brackets/node_modules/debug/src/index.js", ++ "extend-shallow": "node_modules/expand-brackets/node_modules/extend-shallow/index.js", ++ "snapdragon": "node_modules/snapdragon/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/lib/compilers.js": [ ++ "Uaob7GX6jobtVSJD4xumDo9inqO21DH1RmoAcBzdfEo=", ++ { ++ "posix-character-classes": "node_modules/posix-character-classes/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/lib/parsers.js": [ ++ "8BslEdcMlpAWDotZKd337wadtnUwv/HNEuho6lorL+k=", ++ { ++ "./utils": "node_modules/expand-brackets/lib/utils.js", ++ "define-property": "node_modules/expand-brackets/node_modules/define-property/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/lib/utils.js": [ ++ "CfHlq1apDxyvxNN9jsnAkBsqxAABdbD2jXKJ9fQuDWU=", ++ { ++ "regex-not": "node_modules/regex-not/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/debug/src/browser.js": [ ++ "AUSralK5MwxWfeEaXDpK6jXNrEekwQZIKqJK6AVM3G8=", ++ { ++ "./debug": "node_modules/expand-brackets/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/debug/src/debug.js": [ ++ "2NHB1sOHq2fD8o14/Qsgub7NaUQtudPv4RDKRktQnIo=", ++ { ++ "ms": "node_modules/expand-brackets/node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/debug/src/index.js": [ ++ "mjT+3rLSacRu2U5vEwOesNFthm3UYOxm+jrNeBIvqf4=", ++ { ++ "./browser.js": "node_modules/expand-brackets/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/expand-brackets/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/debug/src/node.js": [ ++ "o+g1lKTOiJl+Lk/Ga8lCsXudc2KQrWJWDH8J1tCYmtA=", ++ { ++ "./debug": "node_modules/expand-brackets/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/define-property/index.js": [ ++ "dOYahXtE2Wzrnj/t8+Uh2PE6tfo9G5HhZTk7Mpw5fAw=", ++ { ++ "is-descriptor": "node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/expand-brackets/node_modules/ms/index.js": [ ++ "S9kiCcudrPPjdz5yWst6rsQ+qeeFQDJOTQ9z5c6a3vc=", ++ {} ++ ], ++ "node_modules/extend-shallow/index.js": [ ++ "R5lDQjxn8aj97DZsANs5noZrUM27ErgCdVvafKyubf0=", ++ { ++ "assign-symbols": "node_modules/assign-symbols/index.js", ++ "is-extendable": "node_modules/extend-shallow/node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/extend-shallow/node_modules/is-extendable/index.js": [ ++ "/nyiuJgTewek/Ln+ppwqXUe71vvc6ZQfjcL3k8BpGIA=", ++ { ++ "is-plain-object": "node_modules/is-plain-object/index.js" ++ } ++ ], ++ "node_modules/extglob/index.js": [ ++ "4MQDzD+zwIb4xXzxUuESEiZkHkw80F5tDNWOZzM7fpg=", ++ { ++ "./lib/compilers": "node_modules/extglob/lib/compilers.js", ++ "./lib/extglob": "node_modules/extglob/lib/extglob.js", ++ "./lib/parsers": "node_modules/extglob/lib/parsers.js", ++ "./lib/utils": "node_modules/extglob/lib/utils.js", ++ "array-unique": "node_modules/array-unique/index.js", ++ "extend-shallow": "node_modules/extglob/node_modules/extend-shallow/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/extglob/lib/compilers.js": [ ++ "9hjAc+owUz/h1Siot9sQiSE4j2MtQ31lHCYIGwo9o6A=", ++ { ++ "expand-brackets": "node_modules/expand-brackets/index.js" ++ } ++ ], ++ "node_modules/extglob/lib/extglob.js": [ ++ "oPQlQENLD6gsEddc/B2r9dlSIeyq7goplqXEjZY8Hgc=", ++ { ++ "./compilers": "node_modules/extglob/lib/compilers.js", ++ "./parsers": "node_modules/extglob/lib/parsers.js", ++ "define-property": "node_modules/extglob/node_modules/define-property/index.js", ++ "extend-shallow": "node_modules/extglob/node_modules/extend-shallow/index.js", ++ "snapdragon": "node_modules/snapdragon/index.js" ++ } ++ ], ++ "node_modules/extglob/lib/parsers.js": [ ++ "W1l0DjtnphFSlzh7m3xTywZ6Z5I59lsZa0WboCe3sQ0=", ++ { ++ "./utils": "node_modules/extglob/lib/utils.js", ++ "define-property": "node_modules/extglob/node_modules/define-property/index.js", ++ "expand-brackets": "node_modules/expand-brackets/index.js" ++ } ++ ], ++ "node_modules/extglob/lib/utils.js": [ ++ "hGcTPZa1eExZ5KBBuPVS0X+7IhjjCM4S2R9h0pVi8GE=", ++ { ++ "fragment-cache": "node_modules/fragment-cache/index.js", ++ "regex-not": "node_modules/regex-not/index.js" ++ } ++ ], ++ "node_modules/extglob/node_modules/define-property/index.js": [ ++ "jKcYzrcOopXC/fcrMwXI+/Zhs9uruQOaejiqciZzENM=", ++ { ++ "is-descriptor": "node_modules/extglob/node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/extglob/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/extglob/node_modules/is-accessor-descriptor/index.js": [ ++ "uWcSP5eXqxOfD2T43fElUt/DO/DebNoNF2+rKQVzbj8=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/extglob/node_modules/is-data-descriptor/index.js": [ ++ "17T6fQV8jDz84CBgZM5yZjYbaNQAA5Hlzs92BrGADSk=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/extglob/node_modules/is-descriptor/index.js": [ ++ "XG9C4tfIrgGz+gJ8BuKTD60xwz2Uaf5bdKVY1p6PzLM=", ++ { ++ "is-accessor-descriptor": "node_modules/extglob/node_modules/is-accessor-descriptor/index.js", ++ "is-data-descriptor": "node_modules/extglob/node_modules/is-data-descriptor/index.js", ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/fast-bitfield/index.js": [ ++ "Gskh3Vli1jBsZEmoztpW6ZBO26tTZK3JjV83Ji+K6F4=", ++ { ++ "count-trailing-zeros": "node_modules/count-trailing-zeros/ctz.js" ++ } ++ ], ++ "node_modules/fast-decode-uri-component/index.js": [ ++ "1J0swLA60ltmkf6zko8jG/eN+xGHoOzW+aUkbmEJc+Y=", ++ {} ++ ], ++ "node_modules/fast-deep-equal/index.js": [ ++ "60aeIGKAMho4ePIzXsmKohBKFVB52O2DojApCY3M0hU=", ++ {} ++ ], ++ "node_modules/fast-json-stable-stringify/index.js": [ ++ "i/VJXhajY2BqIfSQPwIT8XXbrfq3PrmDgr78eojxOVs=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/index.js": [ ++ "bcTTpkAG2dMzot1makbO8O0JHHTm+F/MSbqEgjEtaPs=", ++ { ++ "./schema-validator": "node_modules/fast-json-stringify/schema-validator.js", ++ "ajv": "node_modules/fast-json-stringify/node_modules/ajv/lib/ajv.js", ++ "deepmerge": "node_modules/deepmerge/dist/cjs.js", ++ "long": "node_modules/long/dist/long.js", ++ "rfdc": "node_modules/rfdc/index.js", ++ "string-similarity": "node_modules/string-similarity/src/index.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/ajv.js": [ ++ "zDCJmjyCMuEYPW9NJqVDliE/aPdHbDSS94PQjiVAECM=", ++ { ++ "./cache": "node_modules/fast-json-stringify/node_modules/ajv/lib/cache.js", ++ "./compile": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/index.js", ++ "./compile/async": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/async.js", ++ "./compile/error_classes": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/error_classes.js", ++ "./compile/formats": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/formats.js", ++ "./compile/resolve": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/resolve.js", ++ "./compile/rules": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/rules.js", ++ "./compile/schema_obj": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/schema_obj.js", ++ "./compile/util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js", ++ "./data": "node_modules/fast-json-stringify/node_modules/ajv/lib/data.js", ++ "./keyword": "node_modules/fast-json-stringify/node_modules/ajv/lib/keyword.js", ++ "./refs/data.json": "node_modules/fast-json-stringify/node_modules/ajv/lib/refs/data.json", ++ "./refs/json-schema-draft-07.json": "node_modules/fast-json-stringify/node_modules/ajv/lib/refs/json-schema-draft-07.json", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/cache.js": [ ++ "5G3MEcboRPZEyjMb99XK6zrRNXylQCFdqWaPbFjGqok=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/async.js": [ ++ "S/qGZKY38xgY+aiLUVHtfo/ZhrwGZLZ0ZUthDV5MgNI=", ++ { ++ "./error_classes": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/error_classes.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/equal.js": [ ++ "oy8P0Ph5TtFXgEFpx6MqyaieLldi1Ce7K0JKcLor52M=", ++ { ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/error_classes.js": [ ++ "3R3sbFEM0H55bGuht0bPHvxO7VfHnveQQX1QSX7prwI=", ++ { ++ "./resolve": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/resolve.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/formats.js": [ ++ "ugzenaMHgsENI3304+ktMtqcO8LSeNibQ1XkpvVAzPc=", ++ { ++ "./util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/index.js": [ ++ "WvsAv4x++WRGvyrhHNtWvGLepGaN6yGqBUmQfLF3PtM=", ++ { ++ "../dotjs/validate": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/validate.js", ++ "./error_classes": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/error_classes.js", ++ "./resolve": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/resolve.js", ++ "./util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/resolve.js": [ ++ "YXNeVZrE/3PTtahdD359JIv1PqpH+f2Ay5UPWamsqAw=", ++ { ++ "./schema_obj": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/schema_obj.js", ++ "./util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "json-schema-traverse": "node_modules/fast-json-stringify/node_modules/json-schema-traverse/index.js", ++ "uri-js": "node_modules/uri-js/dist/es5/uri.all.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/rules.js": [ ++ "7h1yDs5bhWNHYmcmUssdr0B0qzU12izIuMAC603VNro=", ++ { ++ "../dotjs": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/index.js", ++ "./util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/schema_obj.js": [ ++ "QuOJL/bUcMn7YB3Hu95CxpCfzwDA2G/burDer5w3tZg=", ++ { ++ "./util": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/ucs2length.js": [ ++ "tg764kldk86Ntut5xpBEgDgmnnINibhGuuL8H3rnZMw=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/util.js": [ ++ "Mpqn8LQ1o3CW8aHE3I8G9WEQ1o1pGJrV1ICd6GQi9lE=", ++ { ++ "./ucs2length": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/ucs2length.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/data.js": [ ++ "yFQLBuyAunq5B404xIGLggl6KCFZmB83f6KDGGzGRJI=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/definition_schema.js": [ ++ "0FDUmC5Vy/ljQlv4pCqxudNl4qU+HMAyCKbSswvfzN8=", ++ { ++ "./refs/json-schema-draft-07.json": "node_modules/fast-json-stringify/node_modules/ajv/lib/refs/json-schema-draft-07.json" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limit.js": [ ++ "HPYX8JB38VMWgTdlGlOrwgiNgFkdXVd+J20bcCNSO6E=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitItems.js": [ ++ "ogEozpWkJnvAJvctpjPY+B8j1dbWZKVQNSknmx/phXQ=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitLength.js": [ ++ "q8kCYvMfVI9lk4VegsvqGgpdcZmlEcQ+dmNXrzmvk8w=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitProperties.js": [ ++ "Nsi2USzFP+cwmQyc3A2dovu/sQuaYNlqw7Ndde9mUDs=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/allOf.js": [ ++ "j3PH1CQnk6O0hdzl4aRoYcy2rxk187dWXNfxxxx59w0=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/anyOf.js": [ ++ "xv0xyeZs6j8WAXxc++bI6yXqgki4UgAm4F/0xYAsvpk=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/comment.js": [ ++ "f5b0TAi1LptGWNQP1lOC3InPTnMRZHnGIRWCFHxLAEg=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/const.js": [ ++ "G8s3ZCRZXDsr5ocRi8eirOByzIfzE2OyiJLGsow7Fg4=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/contains.js": [ ++ "yxgrTU4etUDxqw4hYWW2VP0RaSrSFAX8bRoT3RQUMhM=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/custom.js": [ ++ "PkK8KFVorw+ol3zi/RS1kv+LhxaSGGikbhjU3E4hqBs=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/dependencies.js": [ ++ "bsNzyxaOa/5tz1tOSSrGcRTkoXaqquZD0S+AToYwZSM=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/enum.js": [ ++ "ftD5g6XZjCv4mAsEzEnYCkpMVDuZ60wClub86EB17Jw=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/format.js": [ ++ "ZSofuBDLTLexmQfljaNDMzYZf3yLKNtFj851tHPNUcs=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/if.js": [ ++ "JHnYdIYK5YV5dNIMDVkIUyxDUyenC92YLyp0esEp7sw=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/index.js": [ ++ "U3DWophZ+eyn6Ymqu0o3e8AwrzSneWCv83NHijDCbB4=", ++ { ++ "./_limit": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limit.js", ++ "./_limitItems": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitItems.js", ++ "./_limitLength": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitLength.js", ++ "./_limitProperties": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/_limitProperties.js", ++ "./allOf": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/allOf.js", ++ "./anyOf": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/anyOf.js", ++ "./comment": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/comment.js", ++ "./const": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/const.js", ++ "./contains": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/contains.js", ++ "./dependencies": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/dependencies.js", ++ "./enum": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/enum.js", ++ "./format": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/format.js", ++ "./if": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/if.js", ++ "./items": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/items.js", ++ "./multipleOf": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/multipleOf.js", ++ "./not": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/not.js", ++ "./oneOf": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/oneOf.js", ++ "./pattern": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/pattern.js", ++ "./properties": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/properties.js", ++ "./propertyNames": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/propertyNames.js", ++ "./ref": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/ref.js", ++ "./required": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/required.js", ++ "./uniqueItems": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/uniqueItems.js", ++ "./validate": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/validate.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/items.js": [ ++ "Wr4APZ/jl6xgFAyL2kiQrAumBZ6NKYdmmf78fgUtvRM=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/multipleOf.js": [ ++ "pzMegJpsP5aPK4qlB61qbMqR7v9pPhQWILi5FwqDv08=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/not.js": [ ++ "ZoWXP8vFqMQnGrHFmhGoClmcjMkZ54w/PImbdK3O5js=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/oneOf.js": [ ++ "7y1jYS/fheFuuK+P6e7VFRvd85TYIdYhnJiu2CKyPG0=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/pattern.js": [ ++ "05F8fnyKe2zAUZAYEyJUHzef5fXNaEt6NGnM9c6dcpc=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/properties.js": [ ++ "3t3qrBF4sD7Q70WB9eU45XvjmstMrNPil2J+LtckuPM=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/propertyNames.js": [ ++ "Vf+CUX4b84I6Q2ElQcdebfdPtAS+uTTYUScIWV9ogTo=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/ref.js": [ ++ "799fJN0kCpqmzZzXV7gue3yz0tnCFzBzRRYiP8tBYCE=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/required.js": [ ++ "cUEbxMScCpvx7n6GdYtACVUBU0aAHL487B0uLuDblOA=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/uniqueItems.js": [ ++ "XFpN6Z1Doq/FMO81b5fZ1kQg2tJ2x8IwJ2OhIt9KSL0=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/validate.js": [ ++ "8Ph2jPDVcHo1sVJCWUg9FGql+KtVyPDkOwbcluIYV20=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/keyword.js": [ ++ "KLVwZ1S0M1bv2DBGW7K0sPaOlMxWywaAIMepaypDLj0=", ++ { ++ "./definition_schema": "node_modules/fast-json-stringify/node_modules/ajv/lib/definition_schema.js", ++ "./dotjs/custom": "node_modules/fast-json-stringify/node_modules/ajv/lib/dotjs/custom.js" ++ } ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/refs/data.json": [ ++ "5eI6SrKMfjT6RfXCZQusCaHzl5avmmT1XzCIlG0/N0w=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/ajv/lib/refs/json-schema-draft-07.json": [ ++ "4YNPfQgY9jFsKvAi8NIKYeik5oNruY9HvDhzvgOYRCU=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/node_modules/json-schema-traverse/index.js": [ ++ "gQnAQpI9MDPsKnMEy17e/D02uw0D4ym4kvobG6VIjiw=", ++ {} ++ ], ++ "node_modules/fast-json-stringify/schema-validator.js": [ ++ "iFo78CboxX40t9DRilyOEWnsJcSWJNJGo67gjAwzBzo=", ++ { ++ "ajv/lib/compile/equal": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/equal.js", ++ "ajv/lib/compile/formats": "node_modules/fast-json-stringify/node_modules/ajv/lib/compile/formats.js" ++ } ++ ], ++ "node_modules/fast-redact/index.js": [ ++ "xgj39jflA7o09CneEK3OJP/Pl+qOj5a/Azf32B0iw/o=", ++ { ++ "./lib/modifiers": "node_modules/fast-redact/lib/modifiers.js", ++ "./lib/parse": "node_modules/fast-redact/lib/parse.js", ++ "./lib/redactor": "node_modules/fast-redact/lib/redactor.js", ++ "./lib/restorer": "node_modules/fast-redact/lib/restorer.js", ++ "./lib/rx": "node_modules/fast-redact/lib/rx.js", ++ "./lib/state": "node_modules/fast-redact/lib/state.js", ++ "./lib/validator": "node_modules/fast-redact/lib/validator.js" ++ } ++ ], ++ "node_modules/fast-redact/lib/modifiers.js": [ ++ "8VrVIKD+VnyLseL/33xA42gvU3gTt+ahOS8VazFynjw=", ++ {} ++ ], ++ "node_modules/fast-redact/lib/parse.js": [ ++ "R7Wz5ZAdsiluKqY+L3BKQn4ssn6hiOiQwrnC48vaFbg=", ++ { ++ "./rx": "node_modules/fast-redact/lib/rx.js" ++ } ++ ], ++ "node_modules/fast-redact/lib/redactor.js": [ ++ "qKjIgzIZTkDcwunPQgH+TiyivM5aqcO685eFa5lH3vc=", ++ { ++ "./rx": "node_modules/fast-redact/lib/rx.js" ++ } ++ ], ++ "node_modules/fast-redact/lib/restorer.js": [ ++ "kzcFrkOeJWMDrEFARQkudD5uQrzGBDiQscsUfTv9ziE=", ++ { ++ "./modifiers": "node_modules/fast-redact/lib/modifiers.js" ++ } ++ ], ++ "node_modules/fast-redact/lib/rx.js": [ ++ "M1OLFVsF5qiGbjnq9rNdvbFnyXUEHU1UB2Vp6Cl6qso=", ++ {} ++ ], ++ "node_modules/fast-redact/lib/state.js": [ ++ "SEqUiu4lwQdthO1ZdD2xBfSTpq2VrOHDmpodsoZ6lW4=", ++ {} ++ ], ++ "node_modules/fast-redact/lib/validator.js": [ ++ "k++/rhJLz/E0ICSPUj31bF2mhDnmsw7av8C0FGgCI58=", ++ {} ++ ], ++ "node_modules/fast-safe-stringify/index.js": [ ++ "dWfKPaGORfLvHcTMyZ4QEUnmSH18H84Ybw2plY3INH4=", ++ {} ++ ], ++ "node_modules/fastify-error/index.js": [ ++ "8FyTKAVbuin4WIiyKaG/r1dp0nyehRD0OV1TGdIavAI=", ++ {} ++ ], ++ "node_modules/fastify-warning/index.js": [ ++ "UWOGF+Qw0Vu2v1LCxPSCGo6aRRONDHSrQOO3aMA+yvU=", ++ {} ++ ], ++ "node_modules/fastify/fastify.js": [ ++ "bo36oEBFF1YkAYp2PX4qhMM+uyDq4lawUTtVKdBc7P4=", ++ { ++ "./lib/contentTypeParser": "node_modules/fastify/lib/contentTypeParser.js", ++ "./lib/decorate": "node_modules/fastify/lib/decorate.js", ++ "./lib/errors": "node_modules/fastify/lib/errors.js", ++ "./lib/fourOhFour": "node_modules/fastify/lib/fourOhFour.js", ++ "./lib/hooks": "node_modules/fastify/lib/hooks.js", ++ "./lib/initialConfigValidation": "node_modules/fastify/lib/initialConfigValidation.js", ++ "./lib/logger": "node_modules/fastify/lib/logger.js", ++ "./lib/pluginOverride": "node_modules/fastify/lib/pluginOverride.js", ++ "./lib/pluginUtils": "node_modules/fastify/lib/pluginUtils.js", ++ "./lib/reply": "node_modules/fastify/lib/reply.js", ++ "./lib/reqIdGenFactory": "node_modules/fastify/lib/reqIdGenFactory.js", ++ "./lib/request": "node_modules/fastify/lib/request.js", ++ "./lib/route": "node_modules/fastify/lib/route.js", ++ "./lib/schema-controller": "node_modules/fastify/lib/schema-controller.js", ++ "./lib/server": "node_modules/fastify/lib/server.js", ++ "./lib/symbols.js": "node_modules/fastify/lib/symbols.js", ++ "./lib/warnings": "node_modules/fastify/lib/warnings.js", ++ "avvio": "node_modules/avvio/boot.js", ++ "light-my-request": "node_modules/light-my-request/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/configValidator.js": [ ++ "dlOBo9SLwnheCQi1V0Ft8XgQoi6AJH09quw1kKq/9VM=", ++ {} ++ ], ++ "node_modules/fastify/lib/contentTypeParser.js": [ ++ "7Uz9WKGE9bv7fIUgHv+NwSUMjtRnfQcB0AvpNWTrnc8=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols": "node_modules/fastify/lib/symbols.js", ++ "./warnings": "node_modules/fastify/lib/warnings.js", ++ "secure-json-parse": "node_modules/secure-json-parse/index.js", ++ "tiny-lru": "node_modules/tiny-lru/lib/tiny-lru.cjs.js" ++ } ++ ], ++ "node_modules/fastify/lib/context.js": [ ++ "n+DbN43qQAkk/oOnUJp3D9BE7tuRgEMnpaXnHx7EKJw=", ++ { ++ "./symbols.js": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/lib/decorate.js": [ ++ "nTYt7OZlTVMg0AcTEA3OfPpZPLBi8G9GLQggwvyAF/U=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js", ++ "./warnings": "node_modules/fastify/lib/warnings.js" ++ } ++ ], ++ "node_modules/fastify/lib/errors.js": [ ++ "VDuNP/zJU2kSN+K/lR4Vkm5/UKyZr8nPDNQg7x/Ssw0=", ++ { ++ "fastify-error": "node_modules/fastify-error/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/fourOhFour.js": [ ++ "vwPewjageNJiz8CU6BcT2wNKVMv3ZOvwnUwDLF54I9A=", ++ { ++ "./context": "node_modules/fastify/lib/context.js", ++ "./hooks": "node_modules/fastify/lib/hooks.js", ++ "./reply": "node_modules/fastify/lib/reply.js", ++ "./request": "node_modules/fastify/lib/request.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js", ++ "find-my-way": "node_modules/find-my-way/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/handleRequest.js": [ ++ "5V9XXXKdX0eLrjQpmlKrZJjaYfIvv76DKRFrZH20cfA=", ++ { ++ "./hooks": "node_modules/fastify/lib/hooks.js", ++ "./validation": "node_modules/fastify/lib/validation.js", ++ "./wrapThenable": "node_modules/fastify/lib/wrapThenable.js" ++ } ++ ], ++ "node_modules/fastify/lib/headRoute.js": [ ++ "WC/05eh+BsSUZoQHmTRFbCNyzWiNeDVoi9MDzn9AScg=", ++ {} ++ ], ++ "node_modules/fastify/lib/hooks.js": [ ++ "A0GcZrmsHGM60Y4BxMUQ63Kgc/d5iuzJt+4OdsFrKps=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/lib/initialConfigValidation.js": [ ++ "zNp7r6YGDm7+hyPZFZi9J/sKDQOTs1xyU0Ru72SvG3M=", ++ { ++ "./configValidator": "node_modules/fastify/lib/configValidator.js", ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "rfdc": "node_modules/rfdc/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/logger.js": [ ++ "+6zgrAJw0M2/GBCHmTxjq2aXEq4RcLnHB/U2Lr30AAY=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "abstract-logging": "node_modules/abstract-logging/index.js", ++ "pino": "node_modules/pino/pino.js" ++ } ++ ], ++ "node_modules/fastify/lib/pluginOverride.js": [ ++ "BwIfJmM3vlPZDBNXUiC5MKpTHceW1VImYLyC5Oy9nKY=", ++ { ++ "./contentTypeParser": "node_modules/fastify/lib/contentTypeParser.js", ++ "./hooks": "node_modules/fastify/lib/hooks.js", ++ "./pluginUtils": "node_modules/fastify/lib/pluginUtils.js", ++ "./reply": "node_modules/fastify/lib/reply.js", ++ "./request": "node_modules/fastify/lib/request.js", ++ "./schema-controller": "node_modules/fastify/lib/schema-controller.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/lib/pluginUtils.js": [ ++ "s6LpN2yMhGuYC97ZiWhntuecbbS1sss6Y8O0+9ntxdk=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js", ++ "semver": "node_modules/semver/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/reply.js": [ ++ "2BJMw4gFcSBkjoRuwDyVSGS9emjZzZXDXZzuxCbZVC4=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./handleRequest": "node_modules/fastify/lib/handleRequest.js", ++ "./hooks": "node_modules/fastify/lib/hooks.js", ++ "./logger": "node_modules/fastify/lib/logger.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js", ++ "./warnings": "node_modules/fastify/lib/warnings.js", ++ "./wrapThenable": "node_modules/fastify/lib/wrapThenable.js", ++ "fast-json-stringify": "node_modules/fast-json-stringify/index.js", ++ "flatstr": "node_modules/flatstr/index.js", ++ "readable-stream": "node_modules/fastify/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/fastify/lib/reqIdGenFactory.js": [ ++ "i7XFm5fCDtXSCt872gNsiaccfAFFKN9zJv4wMcatHWQ=", ++ {} ++ ], ++ "node_modules/fastify/lib/request.js": [ ++ "N0fSO5/SWweTC51IqFXx8/N4aGNde2KVa8rMW7AzRcs=", ++ { ++ "./warnings": "node_modules/fastify/lib/warnings.js", ++ "@fastify/proxy-addr": "node_modules/@fastify/proxy-addr/index.js", ++ "semver": "node_modules/semver/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/route.js": [ ++ "9H0dv8YiSEtnkngyDtosoNnHICkLlvRRQ91zJarqpGk=", ++ { ++ "./context": "node_modules/fastify/lib/context.js", ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./handleRequest": "node_modules/fastify/lib/handleRequest.js", ++ "./headRoute": "node_modules/fastify/lib/headRoute.js", ++ "./hooks": "node_modules/fastify/lib/hooks.js", ++ "./schemas": "node_modules/fastify/lib/schemas.js", ++ "./symbols.js": "node_modules/fastify/lib/symbols.js", ++ "./validation": "node_modules/fastify/lib/validation.js", ++ "./warnings": "node_modules/fastify/lib/warnings.js", ++ "find-my-way": "node_modules/find-my-way/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/schema-compilers.js": [ ++ "iGjdn+CaveoK7W9GTGGewhV3WtM3WoSbYyOWezCJFyo=", ++ { ++ "ajv": "node_modules/fastify/node_modules/ajv/lib/ajv.js", ++ "fast-json-stringify": "node_modules/fast-json-stringify/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/schema-controller.js": [ ++ "ZyVtA4N137wF9fR4nPlGjWUewXpBqQD/+D1jLa+0Uo4=", ++ { ++ "./schema-compilers": "node_modules/fastify/lib/schema-compilers.js", ++ "./schemas": "node_modules/fastify/lib/schemas.js" ++ } ++ ], ++ "node_modules/fastify/lib/schemas.js": [ ++ "3DQYWedo3Q5qAZkFtzfd+wyPCCeG77IQ7r+0Yackl5Q=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols": "node_modules/fastify/lib/symbols.js", ++ "rfdc": "node_modules/rfdc/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/server.js": [ ++ "kLd+8qPuLeURTDrmR62m9A6DbYwV8mDKJTO+LvDFhFE=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/lib/symbols.js": [ ++ "2SKxAhtyBwlMzQ5nPu7+GbcF8B9k3XQ36cXUikhq5gs=", ++ {} ++ ], ++ "node_modules/fastify/lib/validation.js": [ ++ "gQnCi2LDsUGaY1HGJBrurfW1StU7e8/3Zoz17OuZuos=", ++ { ++ "./symbols": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/lib/warnings.js": [ ++ "u1nQ+JgRCsyXqQHLyqaNNk/2qyG5rfVr4l6jpah/1Y0=", ++ { ++ "fastify-warning": "node_modules/fastify-warning/index.js" ++ } ++ ], ++ "node_modules/fastify/lib/wrapThenable.js": [ ++ "i3/35bEjbUhse1qLBOs1YMmx9XFgGFJrsA7d5gnIcRk=", ++ { ++ "./errors": "node_modules/fastify/lib/errors.js", ++ "./symbols": "node_modules/fastify/lib/symbols.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/ajv.js": [ ++ "zDCJmjyCMuEYPW9NJqVDliE/aPdHbDSS94PQjiVAECM=", ++ { ++ "./cache": "node_modules/fastify/node_modules/ajv/lib/cache.js", ++ "./compile": "node_modules/fastify/node_modules/ajv/lib/compile/index.js", ++ "./compile/async": "node_modules/fastify/node_modules/ajv/lib/compile/async.js", ++ "./compile/error_classes": "node_modules/fastify/node_modules/ajv/lib/compile/error_classes.js", ++ "./compile/formats": "node_modules/fastify/node_modules/ajv/lib/compile/formats.js", ++ "./compile/resolve": "node_modules/fastify/node_modules/ajv/lib/compile/resolve.js", ++ "./compile/rules": "node_modules/fastify/node_modules/ajv/lib/compile/rules.js", ++ "./compile/schema_obj": "node_modules/fastify/node_modules/ajv/lib/compile/schema_obj.js", ++ "./compile/util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js", ++ "./data": "node_modules/fastify/node_modules/ajv/lib/data.js", ++ "./keyword": "node_modules/fastify/node_modules/ajv/lib/keyword.js", ++ "./refs/data.json": "node_modules/fastify/node_modules/ajv/lib/refs/data.json", ++ "./refs/json-schema-draft-07.json": "node_modules/fastify/node_modules/ajv/lib/refs/json-schema-draft-07.json", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/cache.js": [ ++ "5G3MEcboRPZEyjMb99XK6zrRNXylQCFdqWaPbFjGqok=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/async.js": [ ++ "S/qGZKY38xgY+aiLUVHtfo/ZhrwGZLZ0ZUthDV5MgNI=", ++ { ++ "./error_classes": "node_modules/fastify/node_modules/ajv/lib/compile/error_classes.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/error_classes.js": [ ++ "3R3sbFEM0H55bGuht0bPHvxO7VfHnveQQX1QSX7prwI=", ++ { ++ "./resolve": "node_modules/fastify/node_modules/ajv/lib/compile/resolve.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/formats.js": [ ++ "ugzenaMHgsENI3304+ktMtqcO8LSeNibQ1XkpvVAzPc=", ++ { ++ "./util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/index.js": [ ++ "WvsAv4x++WRGvyrhHNtWvGLepGaN6yGqBUmQfLF3PtM=", ++ { ++ "../dotjs/validate": "node_modules/fastify/node_modules/ajv/lib/dotjs/validate.js", ++ "./error_classes": "node_modules/fastify/node_modules/ajv/lib/compile/error_classes.js", ++ "./resolve": "node_modules/fastify/node_modules/ajv/lib/compile/resolve.js", ++ "./util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/resolve.js": [ ++ "YXNeVZrE/3PTtahdD359JIv1PqpH+f2Ay5UPWamsqAw=", ++ { ++ "./schema_obj": "node_modules/fastify/node_modules/ajv/lib/compile/schema_obj.js", ++ "./util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "json-schema-traverse": "node_modules/fastify/node_modules/json-schema-traverse/index.js", ++ "uri-js": "node_modules/uri-js/dist/es5/uri.all.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/rules.js": [ ++ "7h1yDs5bhWNHYmcmUssdr0B0qzU12izIuMAC603VNro=", ++ { ++ "../dotjs": "node_modules/fastify/node_modules/ajv/lib/dotjs/index.js", ++ "./util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/schema_obj.js": [ ++ "QuOJL/bUcMn7YB3Hu95CxpCfzwDA2G/burDer5w3tZg=", ++ { ++ "./util": "node_modules/fastify/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/ucs2length.js": [ ++ "tg764kldk86Ntut5xpBEgDgmnnINibhGuuL8H3rnZMw=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/compile/util.js": [ ++ "Mpqn8LQ1o3CW8aHE3I8G9WEQ1o1pGJrV1ICd6GQi9lE=", ++ { ++ "./ucs2length": "node_modules/fastify/node_modules/ajv/lib/compile/ucs2length.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/data.js": [ ++ "yFQLBuyAunq5B404xIGLggl6KCFZmB83f6KDGGzGRJI=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/definition_schema.js": [ ++ "0FDUmC5Vy/ljQlv4pCqxudNl4qU+HMAyCKbSswvfzN8=", ++ { ++ "./refs/json-schema-draft-07.json": "node_modules/fastify/node_modules/ajv/lib/refs/json-schema-draft-07.json" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/_limit.js": [ ++ "HPYX8JB38VMWgTdlGlOrwgiNgFkdXVd+J20bcCNSO6E=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitItems.js": [ ++ "ogEozpWkJnvAJvctpjPY+B8j1dbWZKVQNSknmx/phXQ=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitLength.js": [ ++ "q8kCYvMfVI9lk4VegsvqGgpdcZmlEcQ+dmNXrzmvk8w=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitProperties.js": [ ++ "Nsi2USzFP+cwmQyc3A2dovu/sQuaYNlqw7Ndde9mUDs=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/allOf.js": [ ++ "j3PH1CQnk6O0hdzl4aRoYcy2rxk187dWXNfxxxx59w0=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/anyOf.js": [ ++ "xv0xyeZs6j8WAXxc++bI6yXqgki4UgAm4F/0xYAsvpk=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/comment.js": [ ++ "f5b0TAi1LptGWNQP1lOC3InPTnMRZHnGIRWCFHxLAEg=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/const.js": [ ++ "G8s3ZCRZXDsr5ocRi8eirOByzIfzE2OyiJLGsow7Fg4=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/contains.js": [ ++ "yxgrTU4etUDxqw4hYWW2VP0RaSrSFAX8bRoT3RQUMhM=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/custom.js": [ ++ "PkK8KFVorw+ol3zi/RS1kv+LhxaSGGikbhjU3E4hqBs=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/dependencies.js": [ ++ "bsNzyxaOa/5tz1tOSSrGcRTkoXaqquZD0S+AToYwZSM=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/enum.js": [ ++ "ftD5g6XZjCv4mAsEzEnYCkpMVDuZ60wClub86EB17Jw=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/format.js": [ ++ "ZSofuBDLTLexmQfljaNDMzYZf3yLKNtFj851tHPNUcs=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/if.js": [ ++ "JHnYdIYK5YV5dNIMDVkIUyxDUyenC92YLyp0esEp7sw=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/index.js": [ ++ "U3DWophZ+eyn6Ymqu0o3e8AwrzSneWCv83NHijDCbB4=", ++ { ++ "./_limit": "node_modules/fastify/node_modules/ajv/lib/dotjs/_limit.js", ++ "./_limitItems": "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitItems.js", ++ "./_limitLength": "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitLength.js", ++ "./_limitProperties": "node_modules/fastify/node_modules/ajv/lib/dotjs/_limitProperties.js", ++ "./allOf": "node_modules/fastify/node_modules/ajv/lib/dotjs/allOf.js", ++ "./anyOf": "node_modules/fastify/node_modules/ajv/lib/dotjs/anyOf.js", ++ "./comment": "node_modules/fastify/node_modules/ajv/lib/dotjs/comment.js", ++ "./const": "node_modules/fastify/node_modules/ajv/lib/dotjs/const.js", ++ "./contains": "node_modules/fastify/node_modules/ajv/lib/dotjs/contains.js", ++ "./dependencies": "node_modules/fastify/node_modules/ajv/lib/dotjs/dependencies.js", ++ "./enum": "node_modules/fastify/node_modules/ajv/lib/dotjs/enum.js", ++ "./format": "node_modules/fastify/node_modules/ajv/lib/dotjs/format.js", ++ "./if": "node_modules/fastify/node_modules/ajv/lib/dotjs/if.js", ++ "./items": "node_modules/fastify/node_modules/ajv/lib/dotjs/items.js", ++ "./multipleOf": "node_modules/fastify/node_modules/ajv/lib/dotjs/multipleOf.js", ++ "./not": "node_modules/fastify/node_modules/ajv/lib/dotjs/not.js", ++ "./oneOf": "node_modules/fastify/node_modules/ajv/lib/dotjs/oneOf.js", ++ "./pattern": "node_modules/fastify/node_modules/ajv/lib/dotjs/pattern.js", ++ "./properties": "node_modules/fastify/node_modules/ajv/lib/dotjs/properties.js", ++ "./propertyNames": "node_modules/fastify/node_modules/ajv/lib/dotjs/propertyNames.js", ++ "./ref": "node_modules/fastify/node_modules/ajv/lib/dotjs/ref.js", ++ "./required": "node_modules/fastify/node_modules/ajv/lib/dotjs/required.js", ++ "./uniqueItems": "node_modules/fastify/node_modules/ajv/lib/dotjs/uniqueItems.js", ++ "./validate": "node_modules/fastify/node_modules/ajv/lib/dotjs/validate.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/items.js": [ ++ "Wr4APZ/jl6xgFAyL2kiQrAumBZ6NKYdmmf78fgUtvRM=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/multipleOf.js": [ ++ "pzMegJpsP5aPK4qlB61qbMqR7v9pPhQWILi5FwqDv08=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/not.js": [ ++ "ZoWXP8vFqMQnGrHFmhGoClmcjMkZ54w/PImbdK3O5js=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/oneOf.js": [ ++ "7y1jYS/fheFuuK+P6e7VFRvd85TYIdYhnJiu2CKyPG0=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/pattern.js": [ ++ "05F8fnyKe2zAUZAYEyJUHzef5fXNaEt6NGnM9c6dcpc=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/properties.js": [ ++ "3t3qrBF4sD7Q70WB9eU45XvjmstMrNPil2J+LtckuPM=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/propertyNames.js": [ ++ "Vf+CUX4b84I6Q2ElQcdebfdPtAS+uTTYUScIWV9ogTo=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/ref.js": [ ++ "799fJN0kCpqmzZzXV7gue3yz0tnCFzBzRRYiP8tBYCE=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/required.js": [ ++ "cUEbxMScCpvx7n6GdYtACVUBU0aAHL487B0uLuDblOA=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/uniqueItems.js": [ ++ "XFpN6Z1Doq/FMO81b5fZ1kQg2tJ2x8IwJ2OhIt9KSL0=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/dotjs/validate.js": [ ++ "8Ph2jPDVcHo1sVJCWUg9FGql+KtVyPDkOwbcluIYV20=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/keyword.js": [ ++ "KLVwZ1S0M1bv2DBGW7K0sPaOlMxWywaAIMepaypDLj0=", ++ { ++ "./definition_schema": "node_modules/fastify/node_modules/ajv/lib/definition_schema.js", ++ "./dotjs/custom": "node_modules/fastify/node_modules/ajv/lib/dotjs/custom.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/refs/data.json": [ ++ "5eI6SrKMfjT6RfXCZQusCaHzl5avmmT1XzCIlG0/N0w=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/ajv/lib/refs/json-schema-draft-07.json": [ ++ "4YNPfQgY9jFsKvAi8NIKYeik5oNruY9HvDhzvgOYRCU=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/json-schema-traverse/index.js": [ ++ "gQnAQpI9MDPsKnMEy17e/D02uw0D4ym4kvobG6VIjiw=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/fastify/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/fastify/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/fastify/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/fastify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/fastify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/fastify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/fastify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/fastify/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/fastify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/fastify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/fastify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/fastify/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/fastify/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/fastify/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/fastify/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/fastify/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/fastify/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/fastify/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/fastify/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/fastify/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/fastq/queue.js": [ ++ "KkJqDBdZJzHQDTqd748YZX8PwIB7um/LUrqgObxEnPs=", ++ { ++ "reusify": "node_modules/reusify/reusify.js" ++ } ++ ], ++ "node_modules/fd-lock/index.js": [ ++ "B3gQk/LqPvfLTaHJb+SUs1YjE3oKuYVGyZfYSX92Bj4=", ++ { ++ "node-gyp-build": "node_modules/node-gyp-build/index.js" ++ } ++ ], ++ "node_modules/fd-slicer/index.js": [ ++ "BfAq/j4QX5evjFxsGyncOI1/9xyYAcFJWhPcNNvhFfA=", ++ { ++ "pend": "node_modules/pend/index.js" ++ } ++ ], ++ "node_modules/file-saver/dist/FileSaver.min.js": [ ++ "5Fv+LQlkb6dD3pAHzJb7FLI1iSqJE9GCza+HQtcI06k=", ++ {} ++ ], ++ "node_modules/file-source/index.js": [ ++ "7w1mBMb611UaIDwDE/kk4R2UMbkYwbzpIniaTVYQPW8=", ++ { ++ "stream-source": "node_modules/stream-source/index.node.js" ++ } ++ ], ++ "node_modules/fill-range/index.js": [ ++ "DlqYxWogbWfCUVvGxSSIutkDEzpgGBAnYSKmowZUeDo=", ++ { ++ "extend-shallow": "node_modules/fill-range/node_modules/extend-shallow/index.js", ++ "is-number": "node_modules/is-number/index.js", ++ "repeat-string": "node_modules/repeat-string/index.js", ++ "to-regex-range": "node_modules/to-regex-range/index.js" ++ } ++ ], ++ "node_modules/fill-range/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/find-my-way/index.js": [ ++ "h+E0EWTsL/9hTxdUepLsqizLhJpiPsMvBFI72455kGQ=", ++ { ++ "./lib/constrainer": "node_modules/find-my-way/lib/constrainer.js", ++ "./lib/pretty-print": "node_modules/find-my-way/lib/pretty-print.js", ++ "./node": "node_modules/find-my-way/node.js", ++ "fast-decode-uri-component": "node_modules/fast-decode-uri-component/index.js", ++ "safe-regex2": "node_modules/safe-regex2/index.js" ++ } ++ ], ++ "node_modules/find-my-way/lib/constrainer.js": [ ++ "qgJHSIPWjeASpZTx5Z/52xI6RbkAjw6qlxmQCxNOPwk=", ++ { ++ "./strategies/accept-host": "node_modules/find-my-way/lib/strategies/accept-host.js", ++ "./strategies/accept-version": "node_modules/find-my-way/lib/strategies/accept-version.js" ++ } ++ ], ++ "node_modules/find-my-way/lib/pretty-print.js": [ ++ "4Ig68JSB9TVoYZjneHnLeiswjUy8LXMqSmPcvZUnFEc=", ++ {} ++ ], ++ "node_modules/find-my-way/lib/strategies/accept-host.js": [ ++ "o6J6JceFhLjVuwb4zmkMBImLxENhYlKTcehmzH1F5Go=", ++ {} ++ ], ++ "node_modules/find-my-way/lib/strategies/accept-version.js": [ ++ "Mug6uzsd3+j2jgrmah6hovxqRlIIpWHfgt3WiAK9hak=", ++ { ++ "semver-store": "node_modules/semver-store/index.js" ++ } ++ ], ++ "node_modules/find-my-way/node.js": [ ++ "mD11dck3UCeOpjEq34KV4P8EngbtdXxztjSEUctCKC8=", ++ { ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/flat-tree/index.js": [ ++ "VyxY98P+kCdJMhot71QTEC9M1foj+XaPPnjBl/Z89dw=", ++ {} ++ ], ++ "node_modules/flatstr/index.js": [ ++ "fgxrNvtCvBK9HH9eD0mFbBckvnUO58XroG/oRuZ6GXE=", ++ {} ++ ], ++ "node_modules/folder-walker/index.js": [ ++ "ns5AbIQV7mwL8mjTv9cM/913ydUYoCFMvZMo0djjjwk=", ++ { ++ "from2": "node_modules/from2/index.js" ++ } ++ ], ++ "node_modules/for-in/index.js": [ ++ "fpFNt54x6JQ1vLnI7lfLHLQofzd+eStiL/0+OncI/g4=", ++ {} ++ ], ++ "node_modules/fragment-cache/index.js": [ ++ "m9u/s58pimQEyEHVY8HdApJrocLH9DuapvvhgvoGif4=", ++ { ++ "map-cache": "node_modules/map-cache/index.js" ++ } ++ ], ++ "node_modules/from2/index.js": [ ++ "o2czJhjj39cPhPQif9JS/lsVSHRTXZ19nEZTh24MezI=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/fs-constants/index.js": [ ++ "ABjESk9Fd+1+lLZtdo6rOoIryW/akTHPt+TeqZ6xubA=", ++ {} ++ ], ++ "node_modules/fs.realpath/index.js": [ ++ "LjNLpDzUhS96PtaBWQKRZ8Bdf6avU25u8XfrhozNG7g=", ++ { ++ "./old.js": "node_modules/fs.realpath/old.js" ++ } ++ ], ++ "node_modules/fs.realpath/old.js": [ ++ "ByRagnF/m/oqY7l4QoSht/xD/1/LSvKpS85fg2EdSi8=", ++ {} ++ ], ++ "node_modules/geojson-area/index.js": [ ++ "Qkn+vlh7ccH0U/4UyLuZIQd9bfXDZV90wfcwQdJQ8ZM=", ++ { ++ "wgs84": "node_modules/wgs84/index.js" ++ } ++ ], ++ "node_modules/geojson-dissolve/index.js": [ ++ "4jRq3GNZ3wMuPJN7rNF8nz/x0qbyjPxDRdsYzgRvL7s=", ++ { ++ "@turf/meta": "node_modules/@turf/meta/index.js", ++ "geojson-flatten": "node_modules/geojson-flatten/dist/index.js", ++ "geojson-linestring-dissolve": "node_modules/geojson-linestring-dissolve/index.js", ++ "topojson-client": "node_modules/topojson-client/dist/topojson-client.js", ++ "topojson-server": "node_modules/topojson-server/dist/topojson-server.js" ++ } ++ ], ++ "node_modules/geojson-flatten/dist/index.js": [ ++ "O+sd8WYYvIrSStcsggQm9JARs0vrSWbFjXJpcX88zco=", ++ {} ++ ], ++ "node_modules/geojson-linestring-dissolve/index.js": [ ++ "LagAHuiYbn3StHkpCwbrsoCgHdACEbWNxD2n+1sCewA=", ++ {} ++ ], ++ "node_modules/geojson-rewind/index.js": [ ++ "HIoybM+gwF11BoIlXCFu552jfD9L7XUtzXt9U6xbeq0=", ++ { ++ "geojson-area": "node_modules/geojson-area/index.js" ++ } ++ ], ++ "node_modules/geojson-validation/index.js": [ ++ "EziLNZnC8j5Ez8S++aTjkLXpj+QCi8lIzPu95DLFSWA=", ++ {} ++ ], ++ "node_modules/get-port/index.js": [ ++ "EhhG8bQBo14QThW+vmpjL7jg/CcvfN2TP9H++XZSOOw=", ++ {} ++ ], ++ "node_modules/get-value/index.js": [ ++ "HIMsh51rj1fOamCjw2YcYtzbeyrWdUmDMh4zQvLlrw0=", ++ {} ++ ], ++ "node_modules/glob/common.js": [ ++ "6aXzeHgmb0QQaVVupBGmDWWL37FqqZ07KbU/1jmlqjo=", ++ { ++ "minimatch": "node_modules/minimatch/minimatch.js", ++ "path-is-absolute": "node_modules/path-is-absolute/index.js" ++ } ++ ], ++ "node_modules/glob/glob.js": [ ++ "4/PR/VSqJBM6PVGK5+rybVy8G5SWOJ4Y3SS6Y+p2PtM=", ++ { ++ "./common.js": "node_modules/glob/common.js", ++ "./sync.js": "node_modules/glob/sync.js", ++ "fs.realpath": "node_modules/fs.realpath/index.js", ++ "inflight": "node_modules/inflight/inflight.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "minimatch": "node_modules/minimatch/minimatch.js", ++ "once": "node_modules/once/once.js", ++ "path-is-absolute": "node_modules/path-is-absolute/index.js" ++ } ++ ], ++ "node_modules/glob/sync.js": [ ++ "8EwE6eQOoa2peh5BStJthx+qB3jjsfsNX8Zuxqy8JD8=", ++ { ++ "./common.js": "node_modules/glob/common.js", ++ "./glob.js": "node_modules/glob/glob.js", ++ "fs.realpath": "node_modules/fs.realpath/index.js", ++ "minimatch": "node_modules/minimatch/minimatch.js", ++ "path-is-absolute": "node_modules/path-is-absolute/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/as-promise/create-rejection.js": [ ++ "q/iQD70r+NVu3knYtHdRrDQHn/LsnWpT5fUWVDRG9Wg=", ++ { ++ "./types": "node_modules/got/dist/source/as-promise/types.js" ++ } ++ ], ++ "node_modules/got/dist/source/as-promise/index.js": [ ++ "A/56fOCbmGMCOVCBPB3y6Zv1J7ByECbXSJrSPkhM8ac=", ++ { ++ "../core": "node_modules/got/dist/source/core/index.js", ++ "../core/utils/get-buffer": "node_modules/got/dist/source/core/utils/get-buffer.js", ++ "../core/utils/is-response-ok": "node_modules/got/dist/source/core/utils/is-response-ok.js", ++ "../core/utils/proxy-events": "node_modules/got/dist/source/core/utils/proxy-events.js", ++ "./parse-body": "node_modules/got/dist/source/as-promise/parse-body.js", ++ "./types": "node_modules/got/dist/source/as-promise/types.js", ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js", ++ "p-cancelable": "node_modules/p-cancelable/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/as-promise/normalize-arguments.js": [ ++ "E0WkkBYEIE6flSFFkUIE8xwXGblU4cZjCllfFALIfQE=", ++ { ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/as-promise/parse-body.js": [ ++ "huDDEMOkPWzyRXXmOTNyoWQfaAUyTAJboZJn8EPlWu0=", ++ { ++ "./types": "node_modules/got/dist/source/as-promise/types.js" ++ } ++ ], ++ "node_modules/got/dist/source/as-promise/types.js": [ ++ "4N88g2JgXjt0WRHjT+ErzOW+C5RaHW6mL7MPeYdKrH0=", ++ { ++ "../core": "node_modules/got/dist/source/core/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/calculate-retry-delay.js": [ ++ "+KodWd2iZy8K/3s2UvEhKZgo+eewQoIY0ww1n0YFJyA=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/index.js": [ ++ "NZyfdyKNWP8Cq1WAs54dohkSMPwXm+RR4G1vpc6tEl8=", ++ { ++ "../as-promise/normalize-arguments": "node_modules/got/dist/source/as-promise/normalize-arguments.js", ++ "../utils/deprecation-warning": "node_modules/got/dist/source/utils/deprecation-warning.js", ++ "./calculate-retry-delay": "node_modules/got/dist/source/core/calculate-retry-delay.js", ++ "./utils/dns-ip-version": "node_modules/got/dist/source/core/utils/dns-ip-version.js", ++ "./utils/get-body-size": "node_modules/got/dist/source/core/utils/get-body-size.js", ++ "./utils/get-buffer": "node_modules/got/dist/source/core/utils/get-buffer.js", ++ "./utils/is-form-data": "node_modules/got/dist/source/core/utils/is-form-data.js", ++ "./utils/is-response-ok": "node_modules/got/dist/source/core/utils/is-response-ok.js", ++ "./utils/options-to-url": "node_modules/got/dist/source/core/utils/options-to-url.js", ++ "./utils/proxy-events": "node_modules/got/dist/source/core/utils/proxy-events.js", ++ "./utils/timed-out": "node_modules/got/dist/source/core/utils/timed-out.js", ++ "./utils/url-to-options": "node_modules/got/dist/source/core/utils/url-to-options.js", ++ "./utils/weakable-map": "node_modules/got/dist/source/core/utils/weakable-map.js", ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js", ++ "@szmarczak/http-timer": "node_modules/@szmarczak/http-timer/dist/source/index.js", ++ "cacheable-lookup": "node_modules/cacheable-lookup/source/index.js", ++ "cacheable-request": "node_modules/cacheable-request/src/index.js", ++ "decompress-response": "node_modules/decompress-response/index.js", ++ "http2-wrapper": "node_modules/http2-wrapper/source/index.js", ++ "lowercase-keys": "node_modules/lowercase-keys/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/utils/dns-ip-version.js": [ ++ "d7XaXG16gl7NamsTh8xNCXMNFBgDSMK18Rrw7eYO5oE=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/get-body-size.js": [ ++ "fJCZhDm+4ZOKxIJlB2IFPdkMnkktXQy+uU7+O6ShpeQ=", ++ { ++ "./is-form-data": "node_modules/got/dist/source/core/utils/is-form-data.js", ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/utils/get-buffer.js": [ ++ "RKgfS1pBQkJmLqNQlwigucFXfitnGkXQFJGcEIKTRCY=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/is-form-data.js": [ ++ "iRwxpaY4D6zTagb/YV5SnsGUNRtMwABrA76Lb3Ro4oI=", ++ { ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/utils/is-response-ok.js": [ ++ "+gTRLFOmM3YZLqHDXoAXFf4cRvYgMA8u1DK94N/6bEQ=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/options-to-url.js": [ ++ "1Vpk+cwIn8CvDZPBgZSEXpP05jqnHCtUA2uIPujfnJM=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/proxy-events.js": [ ++ "aZSQt1WN90XmJJYX5W4uphKlAmdnDs0uF9g8LYhPZGY=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/timed-out.js": [ ++ "+19grhHIhNb+zrYmnmZJvIarZtNvOtgfE10mekqytdw=", ++ { ++ "./unhandle": "node_modules/got/dist/source/core/utils/unhandle.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/utils/unhandle.js": [ ++ "IiWBl/sgwZ1S20iO5dQgffnpMBKvZPMdzbcdVBvE0xM=", ++ {} ++ ], ++ "node_modules/got/dist/source/core/utils/url-to-options.js": [ ++ "JJX/Rco5w2nJbfJel2qBEbTYJ6mNtiHz2Al8Ab6ZQXM=", ++ { ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/core/utils/weakable-map.js": [ ++ "vwMevFPNV2f6MqVJ4w0GKzDf1e6gsSK2T4aOaFVgJks=", ++ {} ++ ], ++ "node_modules/got/dist/source/create.js": [ ++ "u8Szn/WY3qmKw1OwsNXagUtmjXy7SeVBDuSmyw9arNg=", ++ { ++ "./as-promise": "node_modules/got/dist/source/as-promise/index.js", ++ "./as-promise/create-rejection": "node_modules/got/dist/source/as-promise/create-rejection.js", ++ "./core": "node_modules/got/dist/source/core/index.js", ++ "./types": "node_modules/got/dist/source/types.js", ++ "./utils/deep-freeze": "node_modules/got/dist/source/utils/deep-freeze.js", ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/index.js": [ ++ "vQE+osHigJqVHWyVubkwkYDV9fvcnBlS1F4mQ+JKlVs=", ++ { ++ "./as-promise": "node_modules/got/dist/source/as-promise/index.js", ++ "./create": "node_modules/got/dist/source/create.js" ++ } ++ ], ++ "node_modules/got/dist/source/types.js": [ ++ "1DqoH1vIn6o1ng+XyBS6JRVVkf8Hj7ub/UD4x8loMjA=", ++ {} ++ ], ++ "node_modules/got/dist/source/utils/deep-freeze.js": [ ++ "OEOvY3upBe8QVgwVqh8sBUmyCI2NYvpGTPdRpzx8tCw=", ++ { ++ "@sindresorhus/is": "node_modules/@sindresorhus/is/dist/index.js" ++ } ++ ], ++ "node_modules/got/dist/source/utils/deprecation-warning.js": [ ++ "IsSNRoccvgmY0uGM4CV8480M5egmOIdH9LZysDarHPM=", ++ {} ++ ], ++ "node_modules/graceful-fs/clone.js": [ ++ "cljspS5l1phFdZUD+f3WbCUvQOXq+3bbXUgRcuMaye0=", ++ {} ++ ], ++ "node_modules/graceful-fs/graceful-fs.js": [ ++ "dseydtn+GQwi/Q5fj2i/d+4d1KYDzObJpEH0ll+e4hk=", ++ { ++ "./clone.js": "node_modules/graceful-fs/clone.js", ++ "./legacy-streams.js": "node_modules/graceful-fs/legacy-streams.js", ++ "./polyfills.js": "node_modules/graceful-fs/polyfills.js" ++ } ++ ], ++ "node_modules/graceful-fs/legacy-streams.js": [ ++ "YKan7PfD5Vo/+q4TQzts/ziLcgW7ptrzk8hj93qUnjY=", ++ {} ++ ], ++ "node_modules/graceful-fs/polyfills.js": [ ++ "sg4m4H/xNopFCb8xKqajf4LrRO0bPy0o61soS6gnVZc=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/base64.js": [ ++ "/Gq+Qw+Fmydm/jmQ/rZCdqCgB3d1emb2EsP+ZnmE87E=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/compressedObject.js": [ ++ "iXV0g1fBbpaz+vhbKQEO9JmQwpfGXII371DHN/CYNgA=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/compressions.js": [ ++ "w3TpuoEbfPzO062zkw92oG91Sw9Fkuto1bf3gP3WK3M=", ++ { ++ "./flate": "node_modules/gtran-shapefile/node_modules/jszip/lib/flate.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/crc32.js": [ ++ "RO191eaW+WkgfcDd7sVi26V9wWZKgxRLrtOLV0cXgG8=", ++ { ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/dataReader.js": [ ++ "nJo9clnXzlMehf+WXM2NoxbIN7o9TuDO18YxaMpM694=", ++ { ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/defaults.js": [ ++ "ioUVSZuC6YCB3u4lOUBnK+n8gH+tchxx+3mHbSl1jCU=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/deprecatedPublicUtils.js": [ ++ "LCMer6mDbJ1qIQ9ttYj9dRt6uRNnSv24MMgQMm1m0Vc=", ++ { ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/flate.js": [ ++ "aJZcARzYs0+LNEfne8T7wnPSKyQGB81XU71KPJ0CYNE=", ++ { ++ "pako": "node_modules/gtran-shapefile/node_modules/pako/index.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/index.js": [ ++ "SkDudBUHHb/stGrSYtw+vhYza0w2Grt4jOIdxNUpcCo=", ++ { ++ "./base64": "node_modules/gtran-shapefile/node_modules/jszip/lib/base64.js", ++ "./compressions": "node_modules/gtran-shapefile/node_modules/jszip/lib/compressions.js", ++ "./defaults": "node_modules/gtran-shapefile/node_modules/jszip/lib/defaults.js", ++ "./deprecatedPublicUtils": "node_modules/gtran-shapefile/node_modules/jszip/lib/deprecatedPublicUtils.js", ++ "./load": "node_modules/gtran-shapefile/node_modules/jszip/lib/load.js", ++ "./object": "node_modules/gtran-shapefile/node_modules/jszip/lib/object.js", ++ "./support": "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/load.js": [ ++ "MOPIdYg2HWK2HgbFHswWjSbCCJWzmNex3S2rilFvVtQ=", ++ { ++ "./base64": "node_modules/gtran-shapefile/node_modules/jszip/lib/base64.js", ++ "./zipEntries": "node_modules/gtran-shapefile/node_modules/jszip/lib/zipEntries.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBuffer.js": [ ++ "SU4JfaIRuHHgOu1ONmR/qRFXV5j+QQKt+qs+2Nc71YQ=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBufferReader.js": [ ++ "8huOHw3YpnUEc1jFrINmH4jp6rW0mevIIW9iBROyNio=", ++ { ++ "./uint8ArrayReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/uint8ArrayReader.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/object.js": [ ++ "c+r2uA5TbEon91YVRigh9i08l1Ft8aweXLxaFf4ZYc4=", ++ { ++ "./base64": "node_modules/gtran-shapefile/node_modules/jszip/lib/base64.js", ++ "./compressedObject": "node_modules/gtran-shapefile/node_modules/jszip/lib/compressedObject.js", ++ "./compressions": "node_modules/gtran-shapefile/node_modules/jszip/lib/compressions.js", ++ "./crc32": "node_modules/gtran-shapefile/node_modules/jszip/lib/crc32.js", ++ "./defaults": "node_modules/gtran-shapefile/node_modules/jszip/lib/defaults.js", ++ "./nodeBuffer": "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBuffer.js", ++ "./signature": "node_modules/gtran-shapefile/node_modules/jszip/lib/signature.js", ++ "./stringWriter": "node_modules/gtran-shapefile/node_modules/jszip/lib/stringWriter.js", ++ "./support": "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js", ++ "./uint8ArrayWriter": "node_modules/gtran-shapefile/node_modules/jszip/lib/uint8ArrayWriter.js", ++ "./utf8": "node_modules/gtran-shapefile/node_modules/jszip/lib/utf8.js", ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/signature.js": [ ++ "ZHSqJSCbx1CqMBEI5pm6b6ZjfhRXLhVgBQKCGQJZLNE=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/stringReader.js": [ ++ "KbdiEUC+0zNpYXKjw+aWiVwMYsbJz059rfIV7vuKZro=", ++ { ++ "./dataReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/dataReader.js", ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/stringWriter.js": [ ++ "6i6Txq9sCCkZXKIF7SjCw6Ea2eLFhFTcRK5dXPdger0=", ++ { ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js": [ ++ "bD04FP1KMewhumd/7OVTkgJd0b5TNMjzsAK3bG/6tr0=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/uint8ArrayReader.js": [ ++ "7IjHK2+Esz7jD16dkLDXih10KSz6/HLoKuBCZmzxQUE=", ++ { ++ "./dataReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/dataReader.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/uint8ArrayWriter.js": [ ++ "CjfLPLw5pKYJjFwwfnK1LqD40bHODIKANt92dhqs7VY=", ++ { ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/utf8.js": [ ++ "VvxoBhb6CaGa5lp3inU6KxQwFYIH9juSvgV3H1dqPbE=", ++ { ++ "./nodeBuffer": "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBuffer.js", ++ "./support": "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js", ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js": [ ++ "5gV6T8GVNipG8y0afdCR8YkabdHSzg4g25tkjKfQL0w=", ++ { ++ "./compressions": "node_modules/gtran-shapefile/node_modules/jszip/lib/compressions.js", ++ "./nodeBuffer": "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBuffer.js", ++ "./support": "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/zipEntries.js": [ ++ "4e6hlDpgBYx49STpqQtL7l7JiEuZeA3njpZlkrugwuU=", ++ { ++ "./nodeBufferReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/nodeBufferReader.js", ++ "./object": "node_modules/gtran-shapefile/node_modules/jszip/lib/object.js", ++ "./signature": "node_modules/gtran-shapefile/node_modules/jszip/lib/signature.js", ++ "./stringReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/stringReader.js", ++ "./support": "node_modules/gtran-shapefile/node_modules/jszip/lib/support.js", ++ "./uint8ArrayReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/uint8ArrayReader.js", ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js", ++ "./zipEntry": "node_modules/gtran-shapefile/node_modules/jszip/lib/zipEntry.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/jszip/lib/zipEntry.js": [ ++ "1+2UmCFCKTtST4IBDL6fIO3Q60UUi0cOCyv4IJzI3Hw=", ++ { ++ "./compressedObject": "node_modules/gtran-shapefile/node_modules/jszip/lib/compressedObject.js", ++ "./object": "node_modules/gtran-shapefile/node_modules/jszip/lib/object.js", ++ "./stringReader": "node_modules/gtran-shapefile/node_modules/jszip/lib/stringReader.js", ++ "./utils": "node_modules/gtran-shapefile/node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/index.js": [ ++ "5+xONdlNAaLk7l3KYrj7CKx0EVlu21SzmGUfTrVjVh0=", ++ { ++ "./lib/deflate": "node_modules/gtran-shapefile/node_modules/pako/lib/deflate.js", ++ "./lib/inflate": "node_modules/gtran-shapefile/node_modules/pako/lib/inflate.js", ++ "./lib/utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js", ++ "./lib/zlib/constants": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/constants.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/deflate.js": [ ++ "9VJwpbefVqUYz7c0A71Appnwv3SpHvlIuhDhpXA3uSU=", ++ { ++ "./utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js", ++ "./utils/strings": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/strings.js", ++ "./zlib/deflate": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/deflate.js", ++ "./zlib/messages": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/messages.js", ++ "./zlib/zstream": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/zstream.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/inflate.js": [ ++ "9cXBddZ221H6N8hzUh2IvCB9+MzjbrHxGgpNzl0Rr6g=", ++ { ++ "./utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js", ++ "./utils/strings": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/strings.js", ++ "./zlib/constants": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/constants.js", ++ "./zlib/gzheader": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/gzheader.js", ++ "./zlib/inflate": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inflate.js", ++ "./zlib/messages": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/messages.js", ++ "./zlib/zstream": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/zstream.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js": [ ++ "UrxoQf1cySTHVBlSuFl+LR9hSGr68w3IRmVd7bIDrtA=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/utils/strings.js": [ ++ "OFQfQrqkvprsIEIMeBmbGFWNOgGYzd/k13SVtFPdpNA=", ++ { ++ "./common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/adler32.js": [ ++ "C8FdP19Zsn0pm38Knbyd72QMv9ExoWSToDO+MDyJops=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/constants.js": [ ++ "TLdARoOFWN1sr5DhAIzEy1TQZcODXX6J8RpRcwzuUrY=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/crc32.js": [ ++ "rYRpJdq0FvjM+SwjE2GwnwXRG1666keHS8lql8/93Q4=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/deflate.js": [ ++ "DlXRibkONkSDfky+AJljhptkbmtxZwH/lYNONuomzdY=", ++ { ++ "../utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js", ++ "./adler32": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/adler32.js", ++ "./crc32": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/crc32.js", ++ "./messages": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/messages.js", ++ "./trees": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/trees.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/gzheader.js": [ ++ "WPbD7P4dNsQDi+gMasdlRrcSTc9ceF7ygLP6HbtMfOY=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inffast.js": [ ++ "aJJ7E2BKs3hayaccZSxnPdib+a1lwvbLiN8r3rWPokQ=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inflate.js": [ ++ "JObyxJOqKu4sZjUhRI4fFx/e20whAia7ckTgOMhrzQ8=", ++ { ++ "../utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js", ++ "./adler32": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/adler32.js", ++ "./crc32": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/crc32.js", ++ "./inffast": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inffast.js", ++ "./inftrees": "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inftrees.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/inftrees.js": [ ++ "68n5voRgLRLI40Qvj1Xe/BrgERgtO7WX94txdjGIq3g=", ++ { ++ "../utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/messages.js": [ ++ "w+yTwoRdPBilTObVR0DQqmiTQu3TSAr9KyUMv5A45PQ=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/trees.js": [ ++ "yuDKxxEbN73GJptcJKODz8UIJ/1c8t/2vQLq2F1NkCo=", ++ { ++ "../utils/common": "node_modules/gtran-shapefile/node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/pako/lib/zlib/zstream.js": [ ++ "ghoxyKEw5E/UwWMG63iL9K7hzZil0qqB1ILZfCoYs0U=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/index.js": [ ++ "mfro9Xcod48wZklXCiBkvjR9MKBeLrOe/xue5H2cJ1s=", ++ { ++ "./src/download": "node_modules/gtran-shapefile/node_modules/shp-write/src/download.js", ++ "./src/write": "node_modules/gtran-shapefile/node_modules/shp-write/src/write.js", ++ "./src/zip": "node_modules/gtran-shapefile/node_modules/shp-write/src/zip.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/download.js": [ ++ "gx519r+S2tWkVNKf4iyaSk09VNiLRCMKWAeWlytBRHg=", ++ { ++ "./zip": "node_modules/gtran-shapefile/node_modules/shp-write/src/zip.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/extent.js": [ ++ "4iJ3sVoVwJ97QyC5yyqSHvgNbloOdXK3W0FVzoTiOdM=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/fields.js": [ ++ "uK/fxz4K9N+CSmEN4ve8dtP3xk1Jz7GvGLq4BP47Qdo=", ++ { ++ "./types": "node_modules/gtran-shapefile/node_modules/shp-write/src/types.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/geojson.js": [ ++ "4Tgc/iGKVY8PAoHavByULFmgc26MnOslg//c9PqqWrA=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/points.js": [ ++ "W7oPlZcKH7kc//88qrFT0Zlrpwn+4FV5NwrIBaX0EqE=", ++ { ++ "./extent": "node_modules/gtran-shapefile/node_modules/shp-write/src/extent.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/poly.js": [ ++ "ESNvNrdTGpqOoBzwLPu/elsO6uVhRhakJgegJMPy4L4=", ++ { ++ "./extent": "node_modules/gtran-shapefile/node_modules/shp-write/src/extent.js", ++ "./types": "node_modules/gtran-shapefile/node_modules/shp-write/src/types.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/prj.js": [ ++ "9VcNilZ3nIjr3EdqAiIYybaxXotfah2udZQFj7zGi/I=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/types.js": [ ++ "lmnBZKJyVfNCjZGN7WqZBdo8OIulKh/xjEMgqih7OoM=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/write.js": [ ++ "6H8g21XbayVeFrOMPa/8A1gAFXQbyGlXGbcE2R6PZ2I=", ++ { ++ "./extent": "node_modules/gtran-shapefile/node_modules/shp-write/src/extent.js", ++ "./fields": "node_modules/gtran-shapefile/node_modules/shp-write/src/fields.js", ++ "./points": "node_modules/gtran-shapefile/node_modules/shp-write/src/points.js", ++ "./poly": "node_modules/gtran-shapefile/node_modules/shp-write/src/poly.js", ++ "./prj": "node_modules/gtran-shapefile/node_modules/shp-write/src/prj.js", ++ "./types": "node_modules/gtran-shapefile/node_modules/shp-write/src/types.js", ++ "dbf": "node_modules/dbf/index.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/node_modules/shp-write/src/zip.js": [ ++ "3Eb1bM1CgAVqNEk3FRTIdxKO921DxPG14SYRONjgQr8=", ++ { ++ "./geojson": "node_modules/gtran-shapefile/node_modules/shp-write/src/geojson.js", ++ "./prj": "node_modules/gtran-shapefile/node_modules/shp-write/src/prj.js", ++ "./write": "node_modules/gtran-shapefile/node_modules/shp-write/src/write.js", ++ "jszip": "node_modules/gtran-shapefile/node_modules/jszip/lib/index.js" ++ } ++ ], ++ "node_modules/gtran-shapefile/src/promise.js": [ ++ "5s24T9hbJkRf1bRKxmrxbfRLR8hpv+XTnGr+V0z/hvA=", ++ {} ++ ], ++ "node_modules/gtran-shapefile/src/script.js": [ ++ "3B6hTddWaKHRbGFK4NGt38tInwAsMjruQp0MDBhLmtQ=", ++ { ++ "./promise.js": "node_modules/gtran-shapefile/src/promise.js", ++ "shapefile": "node_modules/shapefile/dist/shapefile.node.js", ++ "shp-write": "node_modules/gtran-shapefile/node_modules/shp-write/index.js" ++ } ++ ], ++ "node_modules/handshake-stream/decoder.js": [ ++ "WFKjuX7VNz2F9X2uiKSjivSaqNRBmsUOjnefeO4/KlE=", ++ {} ++ ], ++ "node_modules/handshake-stream/index.js": [ ++ "e1nZo8j7gBGKexqa+Ew13w7V/gBR7FaIsgL96qlHaXQ=", ++ { ++ "./decoder": "node_modules/handshake-stream/decoder.js", ++ "debug": "node_modules/debug/src/index.js", ++ "duplexify": "node_modules/handshake-stream/node_modules/duplexify/index.js" ++ } ++ ], ++ "node_modules/handshake-stream/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/has-flag/index.js": [ ++ "3A+JvbE2d5+ewGLgopY6PsifRXMe7J6AKJB66fnpA00=", ++ {} ++ ], ++ "node_modules/has-value/index.js": [ ++ "20EZXmp2uXaAoitHS9knLXpULcsg6FZYNZ0SOm8jTXo=", ++ { ++ "get-value": "node_modules/get-value/index.js", ++ "has-values": "node_modules/has-values/index.js", ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/has-values/index.js": [ ++ "MNwiBIDnWdG5qen3sCEmv7BQHesl6f0PpURw7fEnJ50=", ++ { ++ "is-number": "node_modules/is-number/index.js", ++ "kind-of": "node_modules/has-values/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/has-values/node_modules/kind-of/index.js": [ ++ "eugPi2dE37KT2jupQw8nkIjAcE2gL+gpqz0T5XEnCps=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/hasha/index.js": [ ++ "JFrNiZOECot8qP65ahzAEZT8j8qjtJ4+qEjWTzFBY2s=", ++ { ++ "is-stream": "node_modules/is-stream/index.js" ++ } ++ ], ++ "node_modules/he/he.js": [ ++ "dsVU1bv9Ay/mIFlQdqUKvqUSS5y9Tp/+aslKT4Va7Os=", ++ {} ++ ], ++ "node_modules/http-cache-semantics/index.js": [ ++ "59FndCoQfQHvBrHTkvdZp6ZVNFYIxdn7Df/9kMWQq7g=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/agent.js": [ ++ "9YOJgFw4qG5w2jTWwMeXsjiAPoXYSL7UdPQ/FU0OQCs=", ++ { ++ "quick-lru": "node_modules/quick-lru/index.js" ++ } ++ ], ++ "node_modules/http2-wrapper/source/auto.js": [ ++ "Gmtw1+DERyFlMXQBEBLsBq2YP2cCXR6YMqMCyQP1TO4=", ++ { ++ "./client-request": "node_modules/http2-wrapper/source/client-request.js", ++ "./utils/calculate-server-name": "node_modules/http2-wrapper/source/utils/calculate-server-name.js", ++ "./utils/url-to-options": "node_modules/http2-wrapper/source/utils/url-to-options.js", ++ "quick-lru": "node_modules/quick-lru/index.js", ++ "resolve-alpn": "node_modules/resolve-alpn/index.js" ++ } ++ ], ++ "node_modules/http2-wrapper/source/client-request.js": [ ++ "1BYzukJqzKDkmkcd613wWuNJAwjKFaJT7mL3yu6o3vA=", ++ { ++ "./agent": "node_modules/http2-wrapper/source/agent.js", ++ "./incoming-message": "node_modules/http2-wrapper/source/incoming-message.js", ++ "./utils/errors": "node_modules/http2-wrapper/source/utils/errors.js", ++ "./utils/is-request-pseudo-header": "node_modules/http2-wrapper/source/utils/is-request-pseudo-header.js", ++ "./utils/proxy-events": "node_modules/http2-wrapper/source/utils/proxy-events.js", ++ "./utils/url-to-options": "node_modules/http2-wrapper/source/utils/url-to-options.js" ++ } ++ ], ++ "node_modules/http2-wrapper/source/incoming-message.js": [ ++ "P/3z5ZWAS/X6TcBlOlYEQgpGd2aA5V0QKQpW1NOVfKE=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/index.js": [ ++ "PCYAJVPP3sWxuabmAnxuMHIAb+RG4VQ6ARkEsIFK4UE=", ++ { ++ "./agent": "node_modules/http2-wrapper/source/agent.js", ++ "./auto": "node_modules/http2-wrapper/source/auto.js", ++ "./client-request": "node_modules/http2-wrapper/source/client-request.js", ++ "./incoming-message": "node_modules/http2-wrapper/source/incoming-message.js" ++ } ++ ], ++ "node_modules/http2-wrapper/source/utils/calculate-server-name.js": [ ++ "FMlwOoqx+XmdjosFl4UN9Ai3yFD3Acfc3iQ0If6Toi4=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/utils/errors.js": [ ++ "pjWuMi8frbePXQY0X7yENs5OuI/OX2/begtKO6PXOck=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/utils/is-request-pseudo-header.js": [ ++ "sRcD4LVnJQHvIuOq9FkJE3qOshgnE+28LUlJCE9EAAc=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/utils/proxy-events.js": [ ++ "ofqBz3f6hJOuaXTWpZOM+rBDCdNnOEVXxVSDSB4R5sg=", ++ {} ++ ], ++ "node_modules/http2-wrapper/source/utils/url-to-options.js": [ ++ "XE1m9bHthXQ1zSgMKBAHYDHI/U7y0o5Z1wOCiWgsJ3o=", ++ {} ++ ], ++ "node_modules/humanize-ms/index.js": [ ++ "a9QeyOZwkcyldT7U7ezI2iGcKOAGhXVE9imhhhImAG0=", ++ { ++ "ms": "node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/hypercore-crypto/index.js": [ ++ "nZ+Di1f2VVnhAHhXCPNZ54+Anh+70AzsEWzR3yJxXK0=", ++ { ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "sodium-universal": "node_modules/sodium-universal/index.js", ++ "uint64be": "node_modules/uint64be/index.js" ++ } ++ ], ++ "node_modules/hypercore-protocol/feed.js": [ ++ "MfnPp2EcT5EIkR5DpUPBOOFbMAeEzLjsYlR00WRI1dA=", ++ { ++ "./messages": "node_modules/hypercore-protocol/messages.js", ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "varint": "node_modules/hypercore-protocol/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/hypercore-protocol/index.js": [ ++ "C6JMNaWD81lu+bcpgprszO1qTPKfAMpdaGYfCbFn1N0=", ++ { ++ "./feed": "node_modules/hypercore-protocol/feed.js", ++ "./messages": "node_modules/hypercore-protocol/messages.js", ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "sodium-universal": "node_modules/sodium-universal/index.js", ++ "sorted-indexof": "node_modules/sorted-indexof/index.js", ++ "varint": "node_modules/hypercore-protocol/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/hypercore-protocol/messages.js": [ ++ "DNUSOl791pLPnEtBHaGIRrTQqCSXGNiPkBssEhpFTXA=", ++ { ++ "protocol-buffers-encodings": "node_modules/protocol-buffers-encodings/index.js" ++ } ++ ], ++ "node_modules/hypercore-protocol/node_modules/varint/decode.js": [ ++ "fsejwzyU5jrjbqFHK+d/77RRRc4UHfP3BFH1DLMLkM8=", ++ {} ++ ], ++ "node_modules/hypercore-protocol/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/hypercore-protocol/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/hypercore-protocol/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/hypercore-protocol/node_modules/varint/encode.js", ++ "./length.js": "node_modules/hypercore-protocol/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/hypercore-protocol/node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/hypercore/index.js": [ ++ "gQb55S283k8rbCcWzytPHCeS0UaVmghBX0B+FGjHvvs=", ++ { ++ "./lib/bitfield": "node_modules/hypercore/lib/bitfield.js", ++ "./lib/replicate": "node_modules/hypercore/lib/replicate.js", ++ "./lib/safe-buffer-equals": "node_modules/hypercore/lib/safe-buffer-equals.js", ++ "./lib/storage": "node_modules/hypercore/lib/storage.js", ++ "./lib/tree-index": "node_modules/hypercore/lib/tree-index.js", ++ "atomic-batcher": "node_modules/atomic-batcher/index.js", ++ "bulk-write-stream": "node_modules/bulk-write-stream/index.js", ++ "codecs": "node_modules/codecs/index.js", ++ "fd-lock": "node_modules/fd-lock/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "from2": "node_modules/from2/index.js", ++ "hypercore-crypto": "node_modules/hypercore-crypto/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "inspect-custom-symbol": "node_modules/inspect-custom-symbol/index.js", ++ "last-one-wins": "node_modules/last-one-wins/index.js", ++ "merkle-tree-stream/generator": "node_modules/merkle-tree-stream/generator.js", ++ "nanoguard": "node_modules/nanoguard/index.js", ++ "pretty-hash": "node_modules/pretty-hash/index.js", ++ "random-access-file": "node_modules/random-access-file/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js", ++ "thunky": "node_modules/thunky/index.js", ++ "unordered-array-remove": "node_modules/unordered-array-remove/index.js", ++ "unordered-set": "node_modules/hypercore/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/hypercore/lib/bitfield.js": [ ++ "30ojQMbw1gZ3W37GleClaVyag0uIOsu9gsvk98y5IWs=", ++ { ++ "bitfield-rle": "node_modules/bitfield-rle/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "memory-pager": "node_modules/memory-pager/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js" ++ } ++ ], ++ "node_modules/hypercore/lib/replicate.js": [ ++ "5SnC/HCJfoAxZJRlvDc/7PPvJ76+QYSe799ihS+skL4=", ++ { ++ "./safe-buffer-equals": "node_modules/hypercore/lib/safe-buffer-equals.js", ++ "./tree-index": "node_modules/hypercore/lib/tree-index.js", ++ "bitfield-rle": "node_modules/bitfield-rle/index.js", ++ "fast-bitfield": "node_modules/fast-bitfield/index.js", ++ "hypercore-protocol": "node_modules/hypercore-protocol/index.js", ++ "unordered-set": "node_modules/hypercore/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/hypercore/lib/safe-buffer-equals.js": [ ++ "HbKuwy90hPGFiuZPELU2sFElqJwtweIj4hJtpiJYxlc=", ++ {} ++ ], ++ "node_modules/hypercore/lib/storage.js": [ ++ "dYIV4OqzSTPWAVjisHB/kdS2WvWUnXtAErbyww4NGXo=", ++ { ++ "array-lru": "node_modules/array-lru/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "uint64be": "node_modules/uint64be/index.js" ++ } ++ ], ++ "node_modules/hypercore/lib/tree-index.js": [ ++ "xFF+R8b+MP+Rm1ZL733UushOGL/LNh7c2l4FkopkydU=", ++ { ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js" ++ } ++ ], ++ "node_modules/hypercore/node_modules/unordered-set/index.js": [ ++ "9WIkMme+D8oq5P1vgQwPW/j0Ow9ITQKqD+oP5K4UjFA=", ++ {} ++ ], ++ "node_modules/iferr/index.js": [ ++ "Zw0KzcyDMNNHHrGsSXyJ6gAISLENYM7dGYuQGPRZgr0=", ++ {} ++ ], ++ "node_modules/imurmurhash/imurmurhash.js": [ ++ "RTaL/hEIDEUEt4BGAgFdk4czA8WxPVcQr2xC6avDW0o=", ++ {} ++ ], ++ "node_modules/indexed-tarball-blob-store/index.js": [ ++ "3a8vGjFoUVp119KzT+sCFborse+HxcK36DkXwi4uHhQ=", ++ { ++ "indexed-tarball": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/index.js" ++ } ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/index.js": [ ++ "BiEY9atjIUdHNqNOhcB34cANf7aWZ37epnB3FdFZCYk=", ++ { ++ "./multi": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/multi.js", ++ "./single": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/single.js" ++ } ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/cached-value.js": [ ++ "s6hWbZCaiK7L0Qf+9xfB4k4WWNXpLNHB8A9HonNRYdA=", ++ { ++ "rwlock": "node_modules/rwlock/lib/lock.js" ++ } ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/tar.js": [ ++ "dHnA/s8aiGUvUXvlbAh/lL4BRh0+8vO0ajK3uF6wnmc=", ++ {} ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/util.js": [ ++ "vfbFX/IxQxrXQwdZm/Tjzz6vfYOsdJ8jSDDoO57ShaU=", ++ {} ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/multi.js": [ ++ "9xMxN1iFUZO5rprWUlfUWn0gor/GjPxqXi4eovLWH3o=", ++ { ++ "./single": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/single.js", ++ "pump": "node_modules/pump/index.js", ++ "read-only-stream": "node_modules/read-only-stream/index.js", ++ "rwlock": "node_modules/rwlock/lib/lock.js", ++ "through2": "node_modules/indexed-tarball-blob-store/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/single.js": [ ++ "FXXMBS3lStR3u7jHETcGSan6vXEBikSVhFrlbjnJhaI=", ++ { ++ "./lib/cached-value": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/cached-value.js", ++ "./lib/tar": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/tar.js", ++ "./lib/util": "node_modules/indexed-tarball-blob-store/node_modules/indexed-tarball/lib/util.js", ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "pump": "node_modules/pump/index.js", ++ "read-only-stream": "node_modules/read-only-stream/index.js", ++ "rwlock": "node_modules/rwlock/lib/lock.js", ++ "tar-stream": "node_modules/tar-stream/index.js", ++ "tar-stream/headers": "node_modules/tar-stream/headers.js", ++ "through2": "node_modules/indexed-tarball-blob-store/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/indexed-tarball-blob-store/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/indexed-tarball/index.js": [ ++ "XDtf+4v7V7iGZEkrNZ5Tjm7ayWlTOcfAzhMH0IE7WI4=", ++ { ++ "./multi": "node_modules/indexed-tarball/multi.js", ++ "./single": "node_modules/indexed-tarball/single.js" ++ } ++ ], ++ "node_modules/indexed-tarball/lib/cached-value.js": [ ++ "s6hWbZCaiK7L0Qf+9xfB4k4WWNXpLNHB8A9HonNRYdA=", ++ { ++ "rwlock": "node_modules/rwlock/lib/lock.js" ++ } ++ ], ++ "node_modules/indexed-tarball/lib/integrity.js": [ ++ "LC1NtG+V6n5pDdU8Loe7p/5OUhPUkqYSJdvRcz79XIY=", ++ { ++ "./tar": "node_modules/indexed-tarball/lib/tar.js", ++ "tar-stream/headers": "node_modules/tar-stream/headers.js" ++ } ++ ], ++ "node_modules/indexed-tarball/lib/tar.js": [ ++ "a9CVoYONWnBsoziE8wtE6/itBm2Syh2vUj/AxHkAHI4=", ++ { ++ "custom-error-class": "node_modules/custom-error-class/index.js" ++ } ++ ], ++ "node_modules/indexed-tarball/lib/util.js": [ ++ "vfbFX/IxQxrXQwdZm/Tjzz6vfYOsdJ8jSDDoO57ShaU=", ++ {} ++ ], ++ "node_modules/indexed-tarball/multi.js": [ ++ "3CJAKWNcBhhsLsCwfSmNsdkk5QA9sp7JSoIAazPbQRE=", ++ { ++ "./single": "node_modules/indexed-tarball/single.js", ++ "pump": "node_modules/pump/index.js", ++ "read-only-stream": "node_modules/read-only-stream/index.js", ++ "rwlock": "node_modules/rwlock/lib/lock.js", ++ "through2": "node_modules/indexed-tarball/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/indexed-tarball/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/indexed-tarball/single.js": [ ++ "/eothdz3ShVm8kZPnPQ0MDnobMCY+jfj4wUHhl4PkXg=", ++ { ++ "./lib/cached-value": "node_modules/indexed-tarball/lib/cached-value.js", ++ "./lib/tar": "node_modules/indexed-tarball/lib/tar.js", ++ "./lib/util": "node_modules/indexed-tarball/lib/util.js", ++ "pump": "node_modules/pump/index.js", ++ "read-only-stream": "node_modules/read-only-stream/index.js", ++ "rwlock": "node_modules/rwlock/lib/lock.js", ++ "tar-stream/headers": "node_modules/tar-stream/headers.js", ++ "through2": "node_modules/indexed-tarball/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/inflight/inflight.js": [ ++ "4z6gmKkdLEG+iG+7zsrLl5n+GD2KRG8TikeGyz2AmAI=", ++ { ++ "once": "node_modules/once/once.js", ++ "wrappy": "node_modules/wrappy/wrappy.js" ++ } ++ ], ++ "node_modules/inherits/inherits.js": [ ++ "uzgPMr71/rGGePD0X4gHP+1degBpowkTLLIIDNVT1cc=", ++ { ++ "./inherits_browser.js": "node_modules/inherits/inherits_browser.js" ++ } ++ ], ++ "node_modules/inherits/inherits_browser.js": [ ++ "rTIqex3sYPPS69ogkYFkae+1W1Z9JBzzzw+kxaSv5QA=", ++ {} ++ ], ++ "node_modules/inspect-custom-symbol/index.js": [ ++ "naWeKUJ753qVGQaHhzclMhxRg3QyPPxQuQirFLHE6wo=", ++ {} ++ ], ++ "node_modules/ip/lib/ip.js": [ ++ "5g9p49oc/65drSUpDWPyOm4FClhynavE9ZzCRG2W63U=", ++ {} ++ ], ++ "node_modules/ipaddr.js/lib/ipaddr.js": [ ++ "aJcot1DU3Yxhiztwl2DzKYO8pmzae+SkKJKGmefmly4=", ++ {} ++ ], ++ "node_modules/is-accessor-descriptor/index.js": [ ++ "wTJvQs1y90XgwlPsAgkOxa1tdXOLvlDc48ymH9y0zXo=", ++ { ++ "kind-of": "node_modules/is-accessor-descriptor/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/is-accessor-descriptor/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/is-buffer/index.js": [ ++ "FYaz57hzoH2gJjC00XPRMcB5iZXYX8w3GZUHrT705gM=", ++ {} ++ ], ++ "node_modules/is-data-descriptor/index.js": [ ++ "8wF+4EyFx3/wyXwCOpAJhOUDfJuk0j5h8qQvvDaldZ0=", ++ { ++ "kind-of": "node_modules/is-data-descriptor/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/is-data-descriptor/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/is-descriptor/index.js": [ ++ "XG9C4tfIrgGz+gJ8BuKTD60xwz2Uaf5bdKVY1p6PzLM=", ++ { ++ "is-accessor-descriptor": "node_modules/is-accessor-descriptor/index.js", ++ "is-data-descriptor": "node_modules/is-data-descriptor/index.js", ++ "kind-of": "node_modules/is-descriptor/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/is-descriptor/node_modules/kind-of/index.js": [ ++ "BtLdblp1noWLYXR8QEAXlwfcCmB7m/PeMT7bAg18gJc=", ++ {} ++ ], ++ "node_modules/is-extendable/index.js": [ ++ "hR/HrGd+LONwuGSErs9hm0UP2K9mtszzoDpTkohLS1c=", ++ {} ++ ], ++ "node_modules/is-number/index.js": [ ++ "v1OwOo9/rCWjc5XjHGlHsLX/BbgqJOXs638jI3c4IEI=", ++ { ++ "kind-of": "node_modules/is-number/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/is-number/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/is-options/index.js": [ ++ "oQbri7LjOdxr91wGeOpUWJSyt8l9kJHyGje7LArg8iU=", ++ {} ++ ], ++ "node_modules/is-plain-object/index.js": [ ++ "0DDu4kinfW3N6+5ySYA1CLcfwwr66gHbmxPD5lHud7E=", ++ { ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/is-stream/index.js": [ ++ "3dLpQt28s+uWVddZNi4c3eE4KmJSA+VkZXjWGFNy6fg=", ++ {} ++ ], ++ "node_modules/is-windows/index.js": [ ++ "/YDzo0MZh7TG1rkXc1sEaO4Vt49BSDDFAYd5y7qvyu0=", ++ {} ++ ], ++ "node_modules/isarray/index.js": [ ++ "m4xpE3KALaeIycX04covHtC4irhyIXbCrqFeOOyG0kk=", ++ {} ++ ], ++ "node_modules/iserror/index.js": [ ++ "QPEuAclzcrqvvJ6Et1Aj9zw89DNWPX9csrfXlRn6ilw=", ++ {} ++ ], ++ "node_modules/isobject/index.js": [ ++ "cxkCsGDfhWJYKqPtg50oBG2mT5wE8tWAJ+685cjuWxw=", ++ {} ++ ], ++ "node_modules/isomorphic-unzip/lib/utils.js": [ ++ "i9lnv3gvcFgL21bmybNaFvcqZ9euDcVREZL+EhZEMYo=", ++ {} ++ ], ++ "node_modules/isomorphic-unzip/zip-node.js": [ ++ "/Av7ACj1rPOd21OGvjSgpHujR4NhnaRV3fUU4BQYuTE=", ++ { ++ "./lib/utils": "node_modules/isomorphic-unzip/lib/utils.js", ++ "yauzl": "node_modules/yauzl/index.js" ++ } ++ ], ++ "node_modules/json-buffer/index.js": [ ++ "11luD3yAjygAqm+p36cjxVR6uWSrp9zZAUzr8pL2Z9E=", ++ {} ++ ], ++ "node_modules/json-schema-traverse/index.js": [ ++ "AkGRt0evrAGyj/EddE6fgnILutX3FhY7pcli62KqI1A=", ++ {} ++ ], ++ "node_modules/jsonparse/jsonparse.js": [ ++ "j+4NqJbIAszHPY8Nt0BiWtDda0A6e8XIb0r90XuolB4=", ++ {} ++ ], ++ "node_modules/jszip/lib/base64.js": [ ++ "9+IcLWVqFSRy5obtvEuiq+NqI8D8gFXjV8w/UyL12ng=", ++ { ++ "./support": "node_modules/jszip/lib/support.js", ++ "./utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/compressedObject.js": [ ++ "FDY3q3uZahKKAFdE4mMk+hcLsoaaPZZFe96GIgvjLnY=", ++ { ++ "./external": "node_modules/jszip/lib/external.js", ++ "./stream/Crc32Probe": "node_modules/jszip/lib/stream/Crc32Probe.js", ++ "./stream/DataLengthProbe": "node_modules/jszip/lib/stream/DataLengthProbe.js", ++ "./stream/DataWorker": "node_modules/jszip/lib/stream/DataWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/compressions.js": [ ++ "9pTOMaqm5VECp2WIZYwZPBsz54VN+G//yf5+gfasueE=", ++ { ++ "./flate": "node_modules/jszip/lib/flate.js", ++ "./stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/crc32.js": [ ++ "jcxLoxL1yGg8Cu/OHYweSIuxLNm7zkCVj0pPodTqjvg=", ++ { ++ "./utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/defaults.js": [ ++ "crqHc0Pf/69ZPI+bbVc0claBJGRO9g1dwYTNRedrLf8=", ++ {} ++ ], ++ "node_modules/jszip/lib/external.js": [ ++ "gxPxL50RFH6wrz5x4VYgeeUJ5vQ+WrirUtpuq95LCB0=", ++ { ++ "lie": "node_modules/lie/lib/index.js" ++ } ++ ], ++ "node_modules/jszip/lib/flate.js": [ ++ "a8hi15irWMOtnTZ1sGS5o7vfbZx2TZH1/cT2+4HeTWA=", ++ { ++ "./stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "./utils": "node_modules/jszip/lib/utils.js", ++ "pako": "node_modules/pako/index.js" ++ } ++ ], ++ "node_modules/jszip/lib/generate/ZipFileWorker.js": [ ++ "MMwN2D/uZ95UkxwyflQUAvJZo2S1/hrkhjfwtPe+sBc=", ++ { ++ "../crc32": "node_modules/jszip/lib/crc32.js", ++ "../signature": "node_modules/jszip/lib/signature.js", ++ "../stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "../utf8": "node_modules/jszip/lib/utf8.js", ++ "../utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/generate/index.js": [ ++ "NieWTOD9IDJffrBFFGFztbIdKpIRyxY73mkYUnMktnc=", ++ { ++ "../compressions": "node_modules/jszip/lib/compressions.js", ++ "./ZipFileWorker": "node_modules/jszip/lib/generate/ZipFileWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/index.js": [ ++ "El0Tch4+pRgaLntwb5sELyRISVRCMgP1AzlC2u0/3D4=", ++ { ++ "./defaults": "node_modules/jszip/lib/defaults.js", ++ "./external": "node_modules/jszip/lib/external.js", ++ "./load": "node_modules/jszip/lib/load.js", ++ "./object": "node_modules/jszip/lib/object.js", ++ "./support": "node_modules/jszip/lib/support.js" ++ } ++ ], ++ "node_modules/jszip/lib/load.js": [ ++ "aJNU0ua6GozoTeX5w5eGRCIJ7qwtkq2StUIXfZo8uWg=", ++ { ++ "./external": "node_modules/jszip/lib/external.js", ++ "./nodejsUtils": "node_modules/jszip/lib/nodejsUtils.js", ++ "./stream/Crc32Probe": "node_modules/jszip/lib/stream/Crc32Probe.js", ++ "./utf8": "node_modules/jszip/lib/utf8.js", ++ "./utils": "node_modules/jszip/lib/utils.js", ++ "./zipEntries": "node_modules/jszip/lib/zipEntries.js" ++ } ++ ], ++ "node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js": [ ++ "lYEZfIHxxE+iZn/lqfN86DBiwsQOnGwXTNYSGgb4xyQ=", ++ { ++ "../stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "../utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js": [ ++ "v9gdZSUPsYgK0FCkuD/o9+NAg1xAY2M2r4CL+QzUELY=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "readable-stream": "node_modules/jszip/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/jszip/lib/nodejsUtils.js": [ ++ "0PAzSsP/a644/wKEep3l2jlXvQZRMgpprlTt2cFAkW4=", ++ {} ++ ], ++ "node_modules/jszip/lib/object.js": [ ++ "+52LEKEE8WlMhXMKNyz64Rl3TlQHWN0cAdN24CarrI8=", ++ { ++ "./compressedObject": "node_modules/jszip/lib/compressedObject.js", ++ "./defaults": "node_modules/jszip/lib/defaults.js", ++ "./generate": "node_modules/jszip/lib/generate/index.js", ++ "./nodejs/NodejsStreamInputAdapter": "node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js", ++ "./nodejsUtils": "node_modules/jszip/lib/nodejsUtils.js", ++ "./stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "./stream/StreamHelper": "node_modules/jszip/lib/stream/StreamHelper.js", ++ "./utf8": "node_modules/jszip/lib/utf8.js", ++ "./utils": "node_modules/jszip/lib/utils.js", ++ "./zipObject": "node_modules/jszip/lib/zipObject.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/ArrayReader.js": [ ++ "7Drxy6SHv2NZtZ9rgOxJtk4YRj1jatr72u55ItxO7OI=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./DataReader": "node_modules/jszip/lib/reader/DataReader.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/DataReader.js": [ ++ "VyEqsRAoLyx/ru9LagT9pYNqY7FDXvKLq2Z84uCvOiU=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/NodeBufferReader.js": [ ++ "ztBDHUrYSDQagMo6GwEMX7XTLO1UL1aXCffA61fv3KU=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./Uint8ArrayReader": "node_modules/jszip/lib/reader/Uint8ArrayReader.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/StringReader.js": [ ++ "7jOAa/xBkIwk+CMQwrYlvWc/5G9mIYwto1SaTTXUWjw=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./DataReader": "node_modules/jszip/lib/reader/DataReader.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/Uint8ArrayReader.js": [ ++ "49ahoYVARwf6SSQ86St1YyLde6EIsArJwwIO6+zAlu8=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./ArrayReader": "node_modules/jszip/lib/reader/ArrayReader.js" ++ } ++ ], ++ "node_modules/jszip/lib/reader/readerFor.js": [ ++ "O5Ru7JXf/WXw2WyEpRV7VM1s/DM1O9MZC0/zg2X4PG0=", ++ { ++ "../support": "node_modules/jszip/lib/support.js", ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./ArrayReader": "node_modules/jszip/lib/reader/ArrayReader.js", ++ "./NodeBufferReader": "node_modules/jszip/lib/reader/NodeBufferReader.js", ++ "./StringReader": "node_modules/jszip/lib/reader/StringReader.js", ++ "./Uint8ArrayReader": "node_modules/jszip/lib/reader/Uint8ArrayReader.js" ++ } ++ ], ++ "node_modules/jszip/lib/signature.js": [ ++ "ZHSqJSCbx1CqMBEI5pm6b6ZjfhRXLhVgBQKCGQJZLNE=", ++ {} ++ ], ++ "node_modules/jszip/lib/stream/ConvertWorker.js": [ ++ "nFf9a+elXffpMfMBFNBUSXID5Wnk8Z6s8uSXgqSPXUY=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/stream/Crc32Probe.js": [ ++ "SzeJzGfqBK8vOvX9wYoyOwSKMk06n+1cCiJz5nKsxyU=", ++ { ++ "../crc32": "node_modules/jszip/lib/crc32.js", ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/stream/DataLengthProbe.js": [ ++ "lvfEUrGD3PRRDPU/zB4TF7KuP0XLJUxm+qJu7QNFO+s=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/stream/DataWorker.js": [ ++ "Uif5AcQeyjf3VZ0csvcm6I00uDkdg+VqlUKhXsaqd9k=", ++ { ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/stream/GenericWorker.js": [ ++ "gEwIYZz3a7sAaVRQYnXe1LSPaHMY9a9kzxLy3osZ4oc=", ++ {} ++ ], ++ "node_modules/jszip/lib/stream/StreamHelper.js": [ ++ "qLgoBSFtR7/oIgAZKvplthpvym7I8dAFmcZ6Itn+nkk=", ++ { ++ "../base64": "node_modules/jszip/lib/base64.js", ++ "../external": "node_modules/jszip/lib/external.js", ++ "../nodejs/NodejsStreamOutputAdapter": "node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js", ++ "../support": "node_modules/jszip/lib/support.js", ++ "../utils": "node_modules/jszip/lib/utils.js", ++ "./ConvertWorker": "node_modules/jszip/lib/stream/ConvertWorker.js", ++ "./GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js" ++ } ++ ], ++ "node_modules/jszip/lib/support.js": [ ++ "i2HwDIi9xRmheycuY3JbsOyXSukLGkCuNSQaKK4PdWs=", ++ { ++ "readable-stream": "node_modules/jszip/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/jszip/lib/utf8.js": [ ++ "aS2jHmNWycwmwSkBcK/cb/pQJo/mdA5B83fK6k9Y2Pw=", ++ { ++ "./nodejsUtils": "node_modules/jszip/lib/nodejsUtils.js", ++ "./stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "./support": "node_modules/jszip/lib/support.js", ++ "./utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/utils.js": [ ++ "DmsrtAH1Am5WIIw6snJDbSF/BQh/RWsLpTp9Mv8MyRA=", ++ { ++ "./base64": "node_modules/jszip/lib/base64.js", ++ "./external": "node_modules/jszip/lib/external.js", ++ "./nodejsUtils": "node_modules/jszip/lib/nodejsUtils.js", ++ "./support": "node_modules/jszip/lib/support.js", ++ "core-js/library/fn/set-immediate": "node_modules/core-js/library/fn/set-immediate.js" ++ } ++ ], ++ "node_modules/jszip/lib/zipEntries.js": [ ++ "7CiLe3m195cjy6st0bW29M9HaYDswOHH9XjtgO5Aq7Q=", ++ { ++ "./reader/readerFor": "node_modules/jszip/lib/reader/readerFor.js", ++ "./signature": "node_modules/jszip/lib/signature.js", ++ "./support": "node_modules/jszip/lib/support.js", ++ "./utf8": "node_modules/jszip/lib/utf8.js", ++ "./utils": "node_modules/jszip/lib/utils.js", ++ "./zipEntry": "node_modules/jszip/lib/zipEntry.js" ++ } ++ ], ++ "node_modules/jszip/lib/zipEntry.js": [ ++ "QTAvrrBoH0kaGJNiYuerKHK9d9B33bFytAiJNskUm6c=", ++ { ++ "./compressedObject": "node_modules/jszip/lib/compressedObject.js", ++ "./compressions": "node_modules/jszip/lib/compressions.js", ++ "./crc32": "node_modules/jszip/lib/crc32.js", ++ "./reader/readerFor": "node_modules/jszip/lib/reader/readerFor.js", ++ "./support": "node_modules/jszip/lib/support.js", ++ "./utf8": "node_modules/jszip/lib/utf8.js", ++ "./utils": "node_modules/jszip/lib/utils.js" ++ } ++ ], ++ "node_modules/jszip/lib/zipObject.js": [ ++ "2n/DcO5BwCralPcxSst+P9cpN/OEYHxA/Qy0W/ofLMk=", ++ { ++ "./compressedObject": "node_modules/jszip/lib/compressedObject.js", ++ "./stream/DataWorker": "node_modules/jszip/lib/stream/DataWorker.js", ++ "./stream/GenericWorker": "node_modules/jszip/lib/stream/GenericWorker.js", ++ "./stream/StreamHelper": "node_modules/jszip/lib/stream/StreamHelper.js", ++ "./utf8": "node_modules/jszip/lib/utf8.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/process-nextick-args/index.js": [ ++ "zGXnAXfWuvrefX3JSZ8ZJWDc5ZIYoN1/vnjoJ3sIp7w=", ++ {} ++ ], ++ "node_modules/jszip/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "EQUOWX7Pu1S73njemTStK3KnASkdpJLaqk1t4SZNbwk=", ++ { ++ "./_stream_readable": "node_modules/jszip/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/jszip/node_modules/readable-stream/lib/_stream_writable.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "process-nextick-args": "node_modules/jszip/node_modules/process-nextick-args/index.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "5r0xl+xXJmy6nxI0bMQf+fjFAayutAvY/uzjEHajBL0=", ++ { ++ "./_stream_transform": "node_modules/jszip/node_modules/readable-stream/lib/_stream_transform.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "m6AS/RrVbNagk0yZ7VYepMxyzuqC7CquDGee4lQfXkc=", ++ { ++ "./_stream_duplex": "node_modules/jszip/node_modules/readable-stream/lib/_stream_duplex.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "isarray": "node_modules/isarray/index.js", ++ "process-nextick-args": "node_modules/jszip/node_modules/process-nextick-args/index.js", ++ "string_decoder/": "node_modules/jszip/node_modules/string_decoder/index.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "rsnUP43djXy8bUsQiEA8ULWyqYacVKoJmhFdDm+JgzY=", ++ { ++ "./_stream_duplex": "node_modules/jszip/node_modules/readable-stream/lib/_stream_duplex.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "VfDYCpgyAb8hjK+9Wv3YewTxwdW+yg71eiJ23r6jgi4=", ++ { ++ "./_stream_duplex": "node_modules/jszip/node_modules/readable-stream/lib/_stream_duplex.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "process-nextick-args": "node_modules/jszip/node_modules/process-nextick-args/index.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/readable-stream/readable.js": [ ++ "TGglQH4cyDVyeO0k5MXqaOrbt6DqDD/ENo6Esbr9VL4=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/jszip/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/jszip/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/jszip/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/jszip/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/jszip/node_modules/readable-stream/lib/_stream_writable.js" ++ } ++ ], ++ "node_modules/jszip/node_modules/string_decoder/index.js": [ ++ "gKIYnJimHqSYfOZjXfjIaFBUqidMZy30uxz/AjsG+3Q=", ++ {} ++ ], ++ "node_modules/k-bucket/index.js": [ ++ "GAttlvdDMOJ97N6WGJ1Q43ZCBeWDFwY6myjvH8seBTw=", ++ { ++ "buffer-equals": "node_modules/buffer-equals/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "randombytes": "node_modules/randombytes/index.js" ++ } ++ ], ++ "node_modules/k-rpc-socket/index.js": [ ++ "vMvUl2GCcHlq150WIx8dO+j/kbxWVyyfipz6wBdpmRw=", ++ { ++ "bencode": "node_modules/k-rpc-socket/node_modules/bencode/lib/index.js" ++ } ++ ], ++ "node_modules/k-rpc-socket/node_modules/bencode/lib/decode.js": [ ++ "jojFF0GE25pCRXlBU6yQLAXPgRowwxmMtMtblQNZpz0=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/k-rpc-socket/node_modules/bencode/lib/encode.js": [ ++ "iaWCOwPu1axlEc1GA37iFeQyy4o9H/+PFthS6NTF/fo=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/k-rpc-socket/node_modules/bencode/lib/index.js": [ ++ "yZejfjSsnSGf+ZBjgm2xhfUoUqD3LLk/QL8txumIzXg=", ++ { ++ "./decode": "node_modules/k-rpc-socket/node_modules/bencode/lib/decode.js", ++ "./encode": "node_modules/k-rpc-socket/node_modules/bencode/lib/encode.js" ++ } ++ ], ++ "node_modules/k-rpc/index.js": [ ++ "7gU7nzx91h7haI9aqL9pLJC7vUTjToEs4HCpJxZCPa4=", ++ { ++ "buffer-equals": "node_modules/buffer-equals/index.js", ++ "k-bucket": "node_modules/k-rpc/node_modules/k-bucket/index.js", ++ "k-rpc-socket": "node_modules/k-rpc-socket/index.js", ++ "randombytes": "node_modules/randombytes/index.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/k-rpc/node_modules/k-bucket/index.js": [ ++ "WYTDFBDvo0psmuWNBIkLWzya1PyMigGYAHnJBChYvgQ=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "randombytes": "node_modules/randombytes/index.js" ++ } ++ ], ++ "node_modules/kappa-core/index.js": [ ++ "1rbat6F0EGVgLwMJpUJ/p5uYk8AWHuHwzPpi2Y9gK6s=", ++ { ++ "hypercore": "node_modules/hypercore/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "multifeed": "node_modules/multifeed/index.js", ++ "multifeed-index": "node_modules/multifeed-index/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/index.js": [ ++ "1pOIV8+KlUFClrag3fUK2wDQMI478ANWhW3DdsEIwLI=", ++ { ++ "./lib/bkd-index.js": "node_modules/kappa-osm/lib/bkd-index.js", ++ "./lib/changeset-index.js": "node_modules/kappa-osm/lib/changeset-index.js", ++ "./lib/check-element": "node_modules/kappa-osm/lib/check-element.js", ++ "./lib/history-index.js": "node_modules/kappa-osm/lib/history-index.js", ++ "./lib/kv-index.js": "node_modules/kappa-osm/lib/kv-index.js", ++ "./lib/refs-index.js": "node_modules/kappa-osm/lib/refs-index.js", ++ "./lib/types-index.js": "node_modules/kappa-osm/lib/types-index.js", ++ "./lib/utils": "node_modules/kappa-osm/lib/utils.js", ++ "once": "node_modules/once/once.js", ++ "pumpify": "node_modules/pumpify/index.js", ++ "subleveldown": "node_modules/subleveldown/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js", ++ "uniq": "node_modules/uniq/uniq.js", ++ "unordered-materialized-kv": "node_modules/unordered-materialized-kv/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/bkd-index.js": [ ++ "MbYV9Nb2oi85PBBRtK7smcE9OQVfTXvn+44LQZ5U7wE=", ++ { ++ "collect-stream": "node_modules/collect-stream/build.js", ++ "duplexify": "node_modules/duplexify/index.js", ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "once": "node_modules/once/once.js", ++ "pull-stream-to-stream": "node_modules/pull-stream-to-stream/index.js", ++ "pump": "node_modules/pump/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js", ++ "unordered-materialized-bkd": "node_modules/unordered-materialized-bkd/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/changeset-index.js": [ ++ "yFmgYoVIkk6RSymQB8QBoUDJXr3570Ki0IRcR3vMxow=", ++ { ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js", ++ "unordered-materialized-backrefs": "node_modules/unordered-materialized-backrefs/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/check-element.js": [ ++ "KjJmlEObyBnLcueDqrMKd+of9vONTQTZCP0c9wA4idU=", ++ {} ++ ], ++ "node_modules/kappa-osm/lib/history-index.js": [ ++ "bgtzcoKHDn3HMjgi8g0kGOE4g5vG71TKyVLTvzJEV+Y=", ++ { ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "read-only-stream": "node_modules/read-only-stream/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/kv-index.js": [ ++ "LtxqaBHQPblDITZwv1zixB0H6A3rWixkMsFYYCWTZTQ=", ++ { ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/refs-index.js": [ ++ "hdWQWy2KBOCaSYFFdNTJLEZcYT0QyO6IAuRhAkcYwCY=", ++ { ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js", ++ "unordered-materialized-backrefs": "node_modules/unordered-materialized-backrefs/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/types-index.js": [ ++ "adga35CexCAKwgFxaCAyER3++TzSjaVX46GpT2IJz5A=", ++ { ++ "kappa-view": "node_modules/kappa-view/index.js", ++ "through2": "node_modules/kappa-osm/node_modules/through2/through2.js", ++ "unordered-materialized-kv": "node_modules/unordered-materialized-kv/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/lib/utils.js": [ ++ "v4JUyXmCgvNb4iS6tBNaR71ire2ayWOXpdSNcLA5mxY=", ++ { ++ "d64": "node_modules/d64/index.js", ++ "randombytes": "node_modules/randombytes/index.js", ++ "to-buffer": "node_modules/to-buffer/index.js", ++ "varint": "node_modules/kappa-osm/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/kappa-osm/node_modules/through2/through2.js": [ ++ "PW9lQW+wokyvd2osX+9AJZ5flGN4Lso7ncoXpgbmgO0=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/kappa-osm/node_modules/varint/decode.js": [ ++ "fsejwzyU5jrjbqFHK+d/77RRRc4UHfP3BFH1DLMLkM8=", ++ {} ++ ], ++ "node_modules/kappa-osm/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/kappa-osm/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/kappa-osm/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/kappa-osm/node_modules/varint/encode.js", ++ "./length.js": "node_modules/kappa-osm/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/kappa-osm/node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/kappa-view/index.js": [ ++ "tyLSQpCIFggDF3dAef6OX15bSIo4Mua6sHFt6+r7BBg=", ++ { ++ "pump": "node_modules/pump/index.js", ++ "readable-stream": "node_modules/kappa-view/node_modules/readable-stream/readable.js", ++ "subleveldown": "node_modules/subleveldown/index.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/kappa-view/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/kappa-view/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/kappa-view/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/kappa-view/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/keyv/src/index.js": [ ++ "Myvs03mWnijQ0ETbqHSwp5h2vf/3wUn3msuTyDkNvjY=", ++ { ++ "json-buffer": "node_modules/json-buffer/index.js" ++ } ++ ], ++ "node_modules/kind-of/index.js": [ ++ "B5dhZy7XwU+hkkgsCHl4BA/8fXcpVQOgLFlGQtQPspk=", ++ {} ++ ], ++ "node_modules/last-one-wins/index.js": [ ++ "xSdr936z5i/OFskqSwZqEOrVlRDoJLkBX8Ln3eRHJhY=", ++ {} ++ ], ++ "node_modules/length-prefixed-message/index.js": [ ++ "5qoKZcZtvr+CkDw3NE+0xZ2G0Zjcnq48+Iupk2Wkllc=", ++ { ++ "varint": "node_modules/length-prefixed-message/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/length-prefixed-message/node_modules/varint/decode.js": [ ++ "PMvrTvba+722cYHVsdXrVXIXB7odAsvFEJ6+RkDOIHk=", ++ {} ++ ], ++ "node_modules/length-prefixed-message/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/length-prefixed-message/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/length-prefixed-message/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/length-prefixed-message/node_modules/varint/encode.js", ++ "./length.js": "node_modules/length-prefixed-message/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/length-prefixed-message/node_modules/varint/length.js": [ ++ "Ar6sQ6CG6m2QQQK1yCxY7SzZq7r3gePFVK0611dC0fM=", ++ {} ++ ], ++ "node_modules/length-prefixed-stream/decode.js": [ ++ "BRK5UfrAX9OlSPGIElImT3fuH3XdYBZ00epEe+2xB84=", ++ { ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "varint": "node_modules/length-prefixed-stream/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/length-prefixed-stream/encode.js": [ ++ "4p5si9F++Yw9QhonRk9sPXGFJFowRz0MQN72J/R+r60=", ++ { ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "varint": "node_modules/length-prefixed-stream/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/length-prefixed-stream/index.js": [ ++ "XCtey4Sjs7w7nJTc+JHhjsH1VI7GNgxX9NUhtUWxBu0=", ++ { ++ "./decode": "node_modules/length-prefixed-stream/decode.js", ++ "./encode": "node_modules/length-prefixed-stream/encode.js" ++ } ++ ], ++ "node_modules/length-prefixed-stream/node_modules/varint/decode.js": [ ++ "fsejwzyU5jrjbqFHK+d/77RRRc4UHfP3BFH1DLMLkM8=", ++ {} ++ ], ++ "node_modules/length-prefixed-stream/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/length-prefixed-stream/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/length-prefixed-stream/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/length-prefixed-stream/node_modules/varint/encode.js", ++ "./length.js": "node_modules/length-prefixed-stream/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/length-prefixed-stream/node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/level-codec/index.js": [ ++ "KeOe/kUQLqH0ZVsn667GMT/xNkS+X3KXhqwXVeL+564=", ++ { ++ "./lib/encodings": "node_modules/level-codec/lib/encodings.js" ++ } ++ ], ++ "node_modules/level-codec/lib/encodings.js": [ ++ "ZKFfBH8Bf9Oof9cEuVd6bgdILtilMIjs4TK3LNLl0aY=", ++ {} ++ ], ++ "node_modules/level-errors/errors.js": [ ++ "a6mujEb8qBzOC6yEE+qyF1FCbTGyqLm4GMFAFsaMsxM=", ++ { ++ "errno": "node_modules/errno/errno.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/index.js": [ ++ "9fd1k5ZkeTwPk3R00CrHjPFwfqfnoN2YXmDjJiyUzgE=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/level-iterator-stream/node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/level-iterator-stream/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/level-iterator-stream/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/level-iterator-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/level-option-wrap/index.js": [ ++ "Fe5eaqsPliwvw5LylrO8ogRT0TEdgDFRDRJiVmj/oxw=", ++ { ++ "defined": "node_modules/defined/index.js" ++ } ++ ], ++ "node_modules/level-packager/level-packager.js": [ ++ "d0TtirgBvf3UcVRMDZWucNtL5cixueBZ6tNutLDnxsE=", ++ { ++ "encoding-down": "node_modules/encoding-down/index.js", ++ "levelup": "node_modules/levelup/lib/levelup.js" ++ } ++ ], ++ "node_modules/level-supports/index.js": [ ++ "wDldIgTWkq3WWCNiCxvD5kG+5npYBS8nTJk+tkylzvU=", ++ { ++ "xtend": "node_modules/xtend/immutable.js", ++ "xtend/mutable": "node_modules/xtend/mutable.js" ++ } ++ ], ++ "node_modules/level/level.js": [ ++ "wCjG5RX/lhZqNW+n+TXsJsVIyG5nX7hngZgg5ESu9Go=", ++ { ++ "level-packager": "node_modules/level-packager/level-packager.js", ++ "leveldown": "node_modules/leveldown/leveldown.js" ++ } ++ ], ++ "node_modules/leveldown/binding.js": [ ++ "TgL96PnGH+9vxC1kdEsVDeKaV43XtjQ9ncJlTGjWGEM=", ++ { ++ "node-gyp-build": "node_modules/leveldown/node_modules/node-gyp-build/index.js" ++ } ++ ], ++ "node_modules/leveldown/chained-batch.js": [ ++ "vbdI62o94a9x5thTSnOwtqgzR/r+J89nsb8aKGRU/zw=", ++ { ++ "./binding": "node_modules/leveldown/binding.js", ++ "abstract-leveldown": "node_modules/leveldown/node_modules/abstract-leveldown/index.js" ++ } ++ ], ++ "node_modules/leveldown/iterator.js": [ ++ "v4J0FVF4WmGxbPDZEqMP0dXbZqcjBIrdbvjPDIZGVlg=", ++ { ++ "./binding": "node_modules/leveldown/binding.js", ++ "abstract-leveldown": "node_modules/leveldown/node_modules/abstract-leveldown/index.js" ++ } ++ ], ++ "node_modules/leveldown/leveldown.js": [ ++ "dV6WHoG7ZmVmFkGbVk+bl0e5LeFHSPGmlDOLWta/68s=", ++ { ++ "./binding": "node_modules/leveldown/binding.js", ++ "./chained-batch": "node_modules/leveldown/chained-batch.js", ++ "./iterator": "node_modules/leveldown/iterator.js", ++ "abstract-leveldown": "node_modules/leveldown/node_modules/abstract-leveldown/index.js" ++ } ++ ], ++ "node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js": [ ++ "Z8EKDfGEpOQukRahaYVq29rf5GC4NqI89BA8V8zLEjM=", ++ { ++ "./next-tick": "node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js": [ ++ "zFwENznp0VlKGOUYw0UZkxqAiBy3wg7PWi8lMBIuBBE=", ++ { ++ "./next-tick": "node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js" ++ } ++ ], ++ "node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js": [ ++ "x0iMaqNlst14z89o06Dn5qILdB4SVT1ZLCwHt7tYY3s=", ++ { ++ "./abstract-chained-batch": "node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js", ++ "./next-tick": "node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js", ++ "level-supports": "node_modules/level-supports/index.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/leveldown/node_modules/abstract-leveldown/index.js": [ ++ "TZhD82oHTYdXvS5L6p4PGz8scF9rlqoYYWIXtimi4GY=", ++ { ++ "./abstract-chained-batch": "node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js", ++ "./abstract-iterator": "node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js", ++ "./abstract-leveldown": "node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js" ++ } ++ ], ++ "node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js": [ ++ "JczFU1xaSOlfDIj/bfki3cAkCh3PBIunWfLagGh0jBk=", ++ {} ++ ], ++ "node_modules/leveldown/node_modules/node-gyp-build/index.js": [ ++ "mUEiZnXnU2TSNdssp/EifD2AfmEAY96bbe1p0Um84MA=", ++ {} ++ ], ++ "node_modules/levelup/lib/batch.js": [ ++ "6wjlMgmCb9E/v0dWOkSxeO7dnLftUJ1f1O3fPpL8vhI=", ++ { ++ "./common": "node_modules/levelup/lib/common.js", ++ "./promisify": "node_modules/levelup/lib/promisify.js", ++ "level-errors": "node_modules/level-errors/errors.js" ++ } ++ ], ++ "node_modules/levelup/lib/common.js": [ ++ "LOgJFiE4jDSnvlkw/xVoJGC16bPVePyumo/9xppTGXA=", ++ {} ++ ], ++ "node_modules/levelup/lib/levelup.js": [ ++ "5ZjD3xAHNQn+H09e2ZrAmPZ1341nHZB7BUQ9fTz7bTg=", ++ { ++ "./batch": "node_modules/levelup/lib/batch.js", ++ "./common": "node_modules/levelup/lib/common.js", ++ "./promisify": "node_modules/levelup/lib/promisify.js", ++ "deferred-leveldown": "node_modules/deferred-leveldown/deferred-leveldown.js", ++ "level-errors": "node_modules/level-errors/errors.js", ++ "level-iterator-stream": "node_modules/level-iterator-stream/index.js", ++ "level-supports": "node_modules/level-supports/index.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/levelup/lib/promisify.js": [ ++ "P4SmaY4k9IerC2UPiYhuHbO5MvGb9gN+MjKTVCtIdH4=", ++ {} ++ ], ++ "node_modules/lie/lib/index.js": [ ++ "3fBTbY6qA8B4ICZ+hM4PzMLC/2i3tndJYPK6wi8AHDU=", ++ { ++ "immediate": "node_modules/lie/node_modules/immediate/lib/index.js" ++ } ++ ], ++ "node_modules/lie/node_modules/immediate/lib/index.js": [ ++ "KFyeLKIy9dKYgWaA2fWinEVdqlY1buNWa1VuXa/rlCc=", ++ {} ++ ], ++ "node_modules/light-my-request/index.js": [ ++ "LmB5rDYKVvowurGZpVHBrH0M/WQCVj5n5+yYQuxRNJA=", ++ { ++ "./lib/request": "node_modules/light-my-request/lib/request.js", ++ "./lib/response": "node_modules/light-my-request/lib/response.js", ++ "ajv": "node_modules/light-my-request/node_modules/ajv/lib/ajv.js" ++ } ++ ], ++ "node_modules/light-my-request/lib/parseURL.js": [ ++ "b9bF12r/AdvOGr5iSU7s6OAEMs9rV6+pfv/uXmQkq9c=", ++ {} ++ ], ++ "node_modules/light-my-request/lib/request.js": [ ++ "6ughD7nb+SLP27ztYWfrZ68lGfyXlaKxfOZmaai5Pig=", ++ { ++ "./parseURL": "node_modules/light-my-request/lib/parseURL.js", ++ "cookie": "node_modules/cookie/index.js", ++ "fastify-warning": "node_modules/fastify-warning/index.js", ++ "readable-stream": "node_modules/light-my-request/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/light-my-request/lib/response.js": [ ++ "QiLoz8UWajiWQVIxCXDz9piAy+75KmEzuPbCwACq5V8=", ++ { ++ "readable-stream": "node_modules/light-my-request/node_modules/readable-stream/readable.js", ++ "set-cookie-parser": "node_modules/set-cookie-parser/lib/set-cookie.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/ajv.js": [ ++ "zDCJmjyCMuEYPW9NJqVDliE/aPdHbDSS94PQjiVAECM=", ++ { ++ "./cache": "node_modules/light-my-request/node_modules/ajv/lib/cache.js", ++ "./compile": "node_modules/light-my-request/node_modules/ajv/lib/compile/index.js", ++ "./compile/async": "node_modules/light-my-request/node_modules/ajv/lib/compile/async.js", ++ "./compile/error_classes": "node_modules/light-my-request/node_modules/ajv/lib/compile/error_classes.js", ++ "./compile/formats": "node_modules/light-my-request/node_modules/ajv/lib/compile/formats.js", ++ "./compile/resolve": "node_modules/light-my-request/node_modules/ajv/lib/compile/resolve.js", ++ "./compile/rules": "node_modules/light-my-request/node_modules/ajv/lib/compile/rules.js", ++ "./compile/schema_obj": "node_modules/light-my-request/node_modules/ajv/lib/compile/schema_obj.js", ++ "./compile/util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js", ++ "./data": "node_modules/light-my-request/node_modules/ajv/lib/data.js", ++ "./keyword": "node_modules/light-my-request/node_modules/ajv/lib/keyword.js", ++ "./refs/data.json": "node_modules/light-my-request/node_modules/ajv/lib/refs/data.json", ++ "./refs/json-schema-draft-07.json": "node_modules/light-my-request/node_modules/ajv/lib/refs/json-schema-draft-07.json", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/cache.js": [ ++ "5G3MEcboRPZEyjMb99XK6zrRNXylQCFdqWaPbFjGqok=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/async.js": [ ++ "S/qGZKY38xgY+aiLUVHtfo/ZhrwGZLZ0ZUthDV5MgNI=", ++ { ++ "./error_classes": "node_modules/light-my-request/node_modules/ajv/lib/compile/error_classes.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/error_classes.js": [ ++ "3R3sbFEM0H55bGuht0bPHvxO7VfHnveQQX1QSX7prwI=", ++ { ++ "./resolve": "node_modules/light-my-request/node_modules/ajv/lib/compile/resolve.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/formats.js": [ ++ "ugzenaMHgsENI3304+ktMtqcO8LSeNibQ1XkpvVAzPc=", ++ { ++ "./util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/index.js": [ ++ "WvsAv4x++WRGvyrhHNtWvGLepGaN6yGqBUmQfLF3PtM=", ++ { ++ "../dotjs/validate": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/validate.js", ++ "./error_classes": "node_modules/light-my-request/node_modules/ajv/lib/compile/error_classes.js", ++ "./resolve": "node_modules/light-my-request/node_modules/ajv/lib/compile/resolve.js", ++ "./util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "fast-json-stable-stringify": "node_modules/fast-json-stable-stringify/index.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/resolve.js": [ ++ "YXNeVZrE/3PTtahdD359JIv1PqpH+f2Ay5UPWamsqAw=", ++ { ++ "./schema_obj": "node_modules/light-my-request/node_modules/ajv/lib/compile/schema_obj.js", ++ "./util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js", ++ "json-schema-traverse": "node_modules/light-my-request/node_modules/json-schema-traverse/index.js", ++ "uri-js": "node_modules/uri-js/dist/es5/uri.all.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/rules.js": [ ++ "7h1yDs5bhWNHYmcmUssdr0B0qzU12izIuMAC603VNro=", ++ { ++ "../dotjs": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/index.js", ++ "./util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/schema_obj.js": [ ++ "QuOJL/bUcMn7YB3Hu95CxpCfzwDA2G/burDer5w3tZg=", ++ { ++ "./util": "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/ucs2length.js": [ ++ "tg764kldk86Ntut5xpBEgDgmnnINibhGuuL8H3rnZMw=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/compile/util.js": [ ++ "Mpqn8LQ1o3CW8aHE3I8G9WEQ1o1pGJrV1ICd6GQi9lE=", ++ { ++ "./ucs2length": "node_modules/light-my-request/node_modules/ajv/lib/compile/ucs2length.js", ++ "fast-deep-equal": "node_modules/fast-deep-equal/index.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/data.js": [ ++ "yFQLBuyAunq5B404xIGLggl6KCFZmB83f6KDGGzGRJI=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/definition_schema.js": [ ++ "0FDUmC5Vy/ljQlv4pCqxudNl4qU+HMAyCKbSswvfzN8=", ++ { ++ "./refs/json-schema-draft-07.json": "node_modules/light-my-request/node_modules/ajv/lib/refs/json-schema-draft-07.json" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limit.js": [ ++ "HPYX8JB38VMWgTdlGlOrwgiNgFkdXVd+J20bcCNSO6E=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitItems.js": [ ++ "ogEozpWkJnvAJvctpjPY+B8j1dbWZKVQNSknmx/phXQ=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitLength.js": [ ++ "q8kCYvMfVI9lk4VegsvqGgpdcZmlEcQ+dmNXrzmvk8w=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitProperties.js": [ ++ "Nsi2USzFP+cwmQyc3A2dovu/sQuaYNlqw7Ndde9mUDs=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/allOf.js": [ ++ "j3PH1CQnk6O0hdzl4aRoYcy2rxk187dWXNfxxxx59w0=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/anyOf.js": [ ++ "xv0xyeZs6j8WAXxc++bI6yXqgki4UgAm4F/0xYAsvpk=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/comment.js": [ ++ "f5b0TAi1LptGWNQP1lOC3InPTnMRZHnGIRWCFHxLAEg=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/const.js": [ ++ "G8s3ZCRZXDsr5ocRi8eirOByzIfzE2OyiJLGsow7Fg4=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/contains.js": [ ++ "yxgrTU4etUDxqw4hYWW2VP0RaSrSFAX8bRoT3RQUMhM=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/custom.js": [ ++ "PkK8KFVorw+ol3zi/RS1kv+LhxaSGGikbhjU3E4hqBs=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/dependencies.js": [ ++ "bsNzyxaOa/5tz1tOSSrGcRTkoXaqquZD0S+AToYwZSM=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/enum.js": [ ++ "ftD5g6XZjCv4mAsEzEnYCkpMVDuZ60wClub86EB17Jw=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/format.js": [ ++ "ZSofuBDLTLexmQfljaNDMzYZf3yLKNtFj851tHPNUcs=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/if.js": [ ++ "JHnYdIYK5YV5dNIMDVkIUyxDUyenC92YLyp0esEp7sw=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/index.js": [ ++ "U3DWophZ+eyn6Ymqu0o3e8AwrzSneWCv83NHijDCbB4=", ++ { ++ "./_limit": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limit.js", ++ "./_limitItems": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitItems.js", ++ "./_limitLength": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitLength.js", ++ "./_limitProperties": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/_limitProperties.js", ++ "./allOf": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/allOf.js", ++ "./anyOf": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/anyOf.js", ++ "./comment": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/comment.js", ++ "./const": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/const.js", ++ "./contains": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/contains.js", ++ "./dependencies": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/dependencies.js", ++ "./enum": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/enum.js", ++ "./format": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/format.js", ++ "./if": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/if.js", ++ "./items": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/items.js", ++ "./multipleOf": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/multipleOf.js", ++ "./not": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/not.js", ++ "./oneOf": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/oneOf.js", ++ "./pattern": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/pattern.js", ++ "./properties": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/properties.js", ++ "./propertyNames": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/propertyNames.js", ++ "./ref": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/ref.js", ++ "./required": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/required.js", ++ "./uniqueItems": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/uniqueItems.js", ++ "./validate": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/validate.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/items.js": [ ++ "Wr4APZ/jl6xgFAyL2kiQrAumBZ6NKYdmmf78fgUtvRM=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/multipleOf.js": [ ++ "pzMegJpsP5aPK4qlB61qbMqR7v9pPhQWILi5FwqDv08=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/not.js": [ ++ "ZoWXP8vFqMQnGrHFmhGoClmcjMkZ54w/PImbdK3O5js=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/oneOf.js": [ ++ "7y1jYS/fheFuuK+P6e7VFRvd85TYIdYhnJiu2CKyPG0=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/pattern.js": [ ++ "05F8fnyKe2zAUZAYEyJUHzef5fXNaEt6NGnM9c6dcpc=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/properties.js": [ ++ "3t3qrBF4sD7Q70WB9eU45XvjmstMrNPil2J+LtckuPM=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/propertyNames.js": [ ++ "Vf+CUX4b84I6Q2ElQcdebfdPtAS+uTTYUScIWV9ogTo=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/ref.js": [ ++ "799fJN0kCpqmzZzXV7gue3yz0tnCFzBzRRYiP8tBYCE=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/required.js": [ ++ "cUEbxMScCpvx7n6GdYtACVUBU0aAHL487B0uLuDblOA=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/uniqueItems.js": [ ++ "XFpN6Z1Doq/FMO81b5fZ1kQg2tJ2x8IwJ2OhIt9KSL0=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/dotjs/validate.js": [ ++ "8Ph2jPDVcHo1sVJCWUg9FGql+KtVyPDkOwbcluIYV20=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/keyword.js": [ ++ "KLVwZ1S0M1bv2DBGW7K0sPaOlMxWywaAIMepaypDLj0=", ++ { ++ "./definition_schema": "node_modules/light-my-request/node_modules/ajv/lib/definition_schema.js", ++ "./dotjs/custom": "node_modules/light-my-request/node_modules/ajv/lib/dotjs/custom.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/refs/data.json": [ ++ "5eI6SrKMfjT6RfXCZQusCaHzl5avmmT1XzCIlG0/N0w=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/ajv/lib/refs/json-schema-draft-07.json": [ ++ "4YNPfQgY9jFsKvAi8NIKYeik5oNruY9HvDhzvgOYRCU=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/json-schema-traverse/index.js": [ ++ "gQnAQpI9MDPsKnMEy17e/D02uw0D4ym4kvobG6VIjiw=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/light-my-request/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/light-my-request/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/light-my-request/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/light-my-request/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/lodash/_Symbol.js": [ ++ "I77NsH5p3PRVWpJOtN3+4c58ZO02l4T9vgHMid57VH4=", ++ { ++ "./_root": "node_modules/lodash/_root.js" ++ } ++ ], ++ "node_modules/lodash/_baseGetTag.js": [ ++ "ydPbt27q/TAHvOyjdq/HQzcKsMVIfXi1xuCXpLD23Zs=", ++ { ++ "./_Symbol": "node_modules/lodash/_Symbol.js", ++ "./_getRawTag": "node_modules/lodash/_getRawTag.js", ++ "./_objectToString": "node_modules/lodash/_objectToString.js" ++ } ++ ], ++ "node_modules/lodash/_baseTrim.js": [ ++ "iqM4CO0YjoJRJdj7Crr2OLXqzE4xLqBo4tBcw3MhtSs=", ++ { ++ "./_trimmedEndIndex": "node_modules/lodash/_trimmedEndIndex.js" ++ } ++ ], ++ "node_modules/lodash/_freeGlobal.js": [ ++ "eTG/QUGAvCDPVjN7WjPmdnUBtsf1N+m7nnnw9uJMpRU=", ++ {} ++ ], ++ "node_modules/lodash/_getRawTag.js": [ ++ "MUL9l/iYFvZaG1vReTH3DBL9lxTUVcKMrEuRSRkBxxM=", ++ { ++ "./_Symbol": "node_modules/lodash/_Symbol.js" ++ } ++ ], ++ "node_modules/lodash/_objectToString.js": [ ++ "gcC0LTB2iC1gNln4H3WIP7XM2plfMj4kI+z/hkjW4jE=", ++ {} ++ ], ++ "node_modules/lodash/_root.js": [ ++ "MupxTyUFdnn90wmcJpPLa+Q3JS547qOlp4gqEoIHg0g=", ++ { ++ "./_freeGlobal": "node_modules/lodash/_freeGlobal.js" ++ } ++ ], ++ "node_modules/lodash/_trimmedEndIndex.js": [ ++ "7diMfpXVo9KqqhZW/H4jFYMQjqNYaF6xEyOdlaTkdDM=", ++ {} ++ ], ++ "node_modules/lodash/debounce.js": [ ++ "ZbeXS3jVIK1e+lA1SJM2+SwzBNgvHGiujdtNqSKVAPw=", ++ { ++ "./isObject": "node_modules/lodash/isObject.js", ++ "./now": "node_modules/lodash/now.js", ++ "./toNumber": "node_modules/lodash/toNumber.js" ++ } ++ ], ++ "node_modules/lodash/isObject.js": [ ++ "H0M3JlacAn8wi5b/SH6JBgaO94uWtOVFiE5uNGitjYw=", ++ {} ++ ], ++ "node_modules/lodash/isObjectLike.js": [ ++ "qRO1rf+QsMbu/mjKbljZxz4xjhKYYplge7EpuJjX5vE=", ++ {} ++ ], ++ "node_modules/lodash/isSymbol.js": [ ++ "uIIRbxfQUXadoioCe5+NAT7SISRJeT3MiPM/PxiiBK0=", ++ { ++ "./_baseGetTag": "node_modules/lodash/_baseGetTag.js", ++ "./isObjectLike": "node_modules/lodash/isObjectLike.js" ++ } ++ ], ++ "node_modules/lodash/now.js": [ ++ "D6fTq+TIdHVTLplTZkCKNz6um4K0lZCgpvPYfb3Ah1k=", ++ { ++ "./_root": "node_modules/lodash/_root.js" ++ } ++ ], ++ "node_modules/lodash/throttle.js": [ ++ "jn3qjmTWBxHb4CzNW2g23dqb79WLbFr+jngarRqcmZ8=", ++ { ++ "./debounce": "node_modules/lodash/debounce.js", ++ "./isObject": "node_modules/lodash/isObject.js" ++ } ++ ], ++ "node_modules/lodash/toNumber.js": [ ++ "Hc6x2k+HBmKZvlEIUqkQa3MkDfFCWDhbKuEyVdI8Zlo=", ++ { ++ "./_baseTrim": "node_modules/lodash/_baseTrim.js", ++ "./isObject": "node_modules/lodash/isObject.js", ++ "./isSymbol": "node_modules/lodash/isSymbol.js" ++ } ++ ], ++ "node_modules/long/dist/long.js": [ ++ "kWjBNLe8x2cL1RHOdWn/s2TAiL8WAviPugeSyN1yia4=", ++ {} ++ ], ++ "node_modules/lowercase-keys/index.js": [ ++ "p7QPRiFtBsvisYPjWmZuiTJ1jXzXDGaqQD5I3Qt1Duc=", ++ {} ++ ], ++ "node_modules/lru-cache/lib/lru-cache.js": [ ++ "L7rRQzR4LmOtFLuE8WRCVbY52sMC2xjXmtz/2E7H6ro=", ++ {} ++ ], ++ "node_modules/lru/index.js": [ ++ "Z09C+S0en0QqrAYDUjc4maWfTwayYlxZOPSCsni2gzc=", ++ { ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/map-cache/index.js": [ ++ "Bd7Im6+rABM1V5XDCYwqwCMnqaaUuuyWswxMLHlLyYc=", ++ {} ++ ], ++ "node_modules/map-limit/index.js": [ ++ "+Ax63u49K4WzK/sdNW+7iGcLUgEU0NC4TdPM7Kpqur0=", ++ { ++ "once": "node_modules/map-limit/node_modules/once/once.js" ++ } ++ ], ++ "node_modules/map-limit/node_modules/once/once.js": [ ++ "eGzPlApArJ01UO391c8/heE+XpGnA7Ik6hxyUc/BT0k=", ++ { ++ "wrappy": "node_modules/wrappy/wrappy.js" ++ } ++ ], ++ "node_modules/map-visit/index.js": [ ++ "30nRmN2uRYkBE6W3HOnLYZOXaMdbu1NgSEZTkGRmU3I=", ++ { ++ "object-visit": "node_modules/object-visit/index.js" ++ } ++ ], ++ "node_modules/mapeo-entity-filter/index.js": [ ++ "ZimoAUx3j5BNw0AIP7EzN1+TqQxN90lk+Uz+FTaFNsg=", ++ {} ++ ], ++ "node_modules/mapeo-server/api.js": [ ++ "lPoN4GUJ7oSMZlca0otplp5u2ONzdG4d9GQELjqzmg0=", ++ { ++ "@mapeo/core": "node_modules/@mapeo/core/index.js", ++ "asar": "node_modules/asar/lib/asar.js", ++ "body/json": "node_modules/body/json.js", ++ "debounce": "node_modules/debounce/index.js", ++ "debug": "node_modules/debug/src/index.js", ++ "ecstatic": "node_modules/ecstatic/lib/ecstatic.js", ++ "mime": "node_modules/mime/index.js", ++ "randombytes": "node_modules/randombytes/index.js" ++ } ++ ], ++ "node_modules/mapeo-server/index.js": [ ++ "BAOEpFL9RyVGNJOb7AWBj7iHCHl0m53WRSTkB1Tdj0E=", ++ { ++ "./api": "node_modules/mapeo-server/api.js", ++ "routes": "node_modules/routes/dist/routes.js" ++ } ++ ], ++ "node_modules/memory-pager/index.js": [ ++ "RFoV7Py1kE+0ZOuRYq6DImCRuQEbuNsCSZO62VOL4tE=", ++ {} ++ ], ++ "node_modules/merkle-tree-stream/generator.js": [ ++ "NmxdIPruaBMVE/gM2W8aNBGFA3ox9U28xGFNAegNQ7g=", ++ { ++ "flat-tree": "node_modules/flat-tree/index.js" ++ } ++ ], ++ "node_modules/micromatch/index.js": [ ++ "O+fqcKi04BM0ENQfwJZ1fcKYSVlsXokd3QfH2R3mBPA=", ++ { ++ "./lib/cache": "node_modules/micromatch/lib/cache.js", ++ "./lib/compilers": "node_modules/micromatch/lib/compilers.js", ++ "./lib/parsers": "node_modules/micromatch/lib/parsers.js", ++ "./lib/utils": "node_modules/micromatch/lib/utils.js", ++ "braces": "node_modules/braces/index.js", ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/micromatch/lib/cache.js": [ ++ "0TcdOX1os7G/h5TxrQn4wtdmt4zFwk+ZFVQZ7GpQKQY=", ++ { ++ "fragment-cache": "node_modules/fragment-cache/index.js" ++ } ++ ], ++ "node_modules/micromatch/lib/compilers.js": [ ++ "rSYXpzYpToVESaROIwPd9q0FTDQOm/C2suJpV31zmh8=", ++ { ++ "extglob": "node_modules/extglob/index.js", ++ "nanomatch": "node_modules/nanomatch/index.js" ++ } ++ ], ++ "node_modules/micromatch/lib/parsers.js": [ ++ "pYlhGWwybm2ju9Uo0BkDwgTG69OAWIJAf6fVK/aVzSw=", ++ { ++ "extglob": "node_modules/extglob/index.js", ++ "nanomatch": "node_modules/nanomatch/index.js", ++ "regex-not": "node_modules/regex-not/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/micromatch/lib/utils.js": [ ++ "cgOCPhpGIXtXMzHW/Q2JMAmTA/rufdPWM6jhClKSjn4=", ++ { ++ "arr-diff": "node_modules/arr-diff/index.js", ++ "array-unique": "node_modules/array-unique/index.js", ++ "define-property": "node_modules/define-property/index.js", ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "kind-of": "node_modules/kind-of/index.js", ++ "object.pick": "node_modules/object.pick/index.js", ++ "snapdragon": "node_modules/snapdragon/index.js" ++ } ++ ], ++ "node_modules/mime/Mime.js": [ ++ "lIJBGiflbmnp/1rgd7JfZMOHaK4misB6t0qYlrWCtqk=", ++ {} ++ ], ++ "node_modules/mime/index.js": [ ++ "ezXms7mBtJi2KGC5kGORZ3KnoZkSWGbUWT25UrocFLk=", ++ { ++ "./Mime": "node_modules/mime/Mime.js", ++ "./types/other": "node_modules/mime/types/other.js", ++ "./types/standard": "node_modules/mime/types/standard.js" ++ } ++ ], ++ "node_modules/mime/types/other.js": [ ++ "k/wtA9ehT4XOTv75Mg4qz2G93/ZTajB1pQNHx2Z0FY0=", ++ {} ++ ], ++ "node_modules/mime/types/standard.js": [ ++ "ViXOWARyAEEPpDuDdMntUpBrgm5+UoY1MmSoO4/P0Ts=", ++ {} ++ ], ++ "node_modules/mimic-response/index.js": [ ++ "8/IutGIDGwgyZvmBCmbfxsnZoYb9XBCj98AWsGzVNf8=", ++ {} ++ ], ++ "node_modules/minimatch/minimatch.js": [ ++ "wOsU2J+v8D5povtXnv2iaAG82fiQsfmMwudy5EjJN1w=", ++ { ++ "brace-expansion": "node_modules/brace-expansion/index.js" ++ } ++ ], ++ "node_modules/mixin-deep/index.js": [ ++ "9hgaXGLLIl4qLJFZGO0K4/+TaPQIRXY9CpKYAn6E7V4=", ++ { ++ "for-in": "node_modules/for-in/index.js", ++ "is-extendable": "node_modules/mixin-deep/node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/mixin-deep/node_modules/is-extendable/index.js": [ ++ "/nyiuJgTewek/Ln+ppwqXUe71vvc6ZQfjcL3k8BpGIA=", ++ { ++ "is-plain-object": "node_modules/is-plain-object/index.js" ++ } ++ ], ++ "node_modules/mkdirp-classic/index.js": [ ++ "bk9dbSa68ZTPS7tNghEARu1iFSBbQSxXp7UJfcFiPqw=", ++ {} ++ ], ++ "node_modules/mkdirp/index.js": [ ++ "/XjQhkiFHi2xsZ4ScakK1VtkDQtq4rIK0RyUruyEezM=", ++ { ++ "./lib/mkdirp-manual.js": "node_modules/mkdirp/lib/mkdirp-manual.js", ++ "./lib/mkdirp-native.js": "node_modules/mkdirp/lib/mkdirp-native.js", ++ "./lib/opts-arg.js": "node_modules/mkdirp/lib/opts-arg.js", ++ "./lib/path-arg.js": "node_modules/mkdirp/lib/path-arg.js", ++ "./lib/use-native.js": "node_modules/mkdirp/lib/use-native.js" ++ } ++ ], ++ "node_modules/mkdirp/lib/find-made.js": [ ++ "dDt/2P1ewR3WpxgAZQplB59b0/CMurtcjfrfBtE411U=", ++ {} ++ ], ++ "node_modules/mkdirp/lib/mkdirp-manual.js": [ ++ "SSvtzZkQFGlYA6N4j2xSDfnJtG/DFckjfev9txPXWq8=", ++ {} ++ ], ++ "node_modules/mkdirp/lib/mkdirp-native.js": [ ++ "uwGJS8pFXXzEfElXaHKT7w+nQPxQ6a8TUVF+etZn0Ao=", ++ { ++ "./find-made.js": "node_modules/mkdirp/lib/find-made.js", ++ "./mkdirp-manual.js": "node_modules/mkdirp/lib/mkdirp-manual.js" ++ } ++ ], ++ "node_modules/mkdirp/lib/opts-arg.js": [ ++ "qaPk8XACAcHssdXrsz1tpp7PPbI1RsTQd8cwrkKgpqk=", ++ {} ++ ], ++ "node_modules/mkdirp/lib/path-arg.js": [ ++ "k6uvt6ifD+AMZizY9BAPSu731bCgaLipr4GzjwPSEyU=", ++ {} ++ ], ++ "node_modules/mkdirp/lib/use-native.js": [ ++ "/tHhT006ZQSTZmaXiJ5367O+bMtgVOn1UZdWbRzw7qg=", ++ {} ++ ], ++ "node_modules/ms/index.js": [ ++ "VZhpcvXzyURvh2xXbhzTD9TwTNJlJ++7Wtg0Y3x0Dkw=", ++ {} ++ ], ++ "node_modules/multicast-dns/index.js": [ ++ "TtWgoj1krpElJP+u0/VCpYXfcZhN3T4NQT8kDtp4a3I=", ++ { ++ "dns-packet": "node_modules/multicast-dns/node_modules/dns-packet/index.js", ++ "thunky": "node_modules/thunky/index.js" ++ } ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/classes.js": [ ++ "rcO6lqbQMClPk1bwPMIV4sU94T7W3ulP2lTuDU9fAO8=", ++ {} ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/index.js": [ ++ "VL+LSzReSs++OjvVjJ2ofGHnTTED0NuIHAoPpvCuAkY=", ++ { ++ "./classes": "node_modules/multicast-dns/node_modules/dns-packet/classes.js", ++ "./opcodes": "node_modules/multicast-dns/node_modules/dns-packet/opcodes.js", ++ "./optioncodes": "node_modules/multicast-dns/node_modules/dns-packet/optioncodes.js", ++ "./rcodes": "node_modules/multicast-dns/node_modules/dns-packet/rcodes.js", ++ "./types": "node_modules/multicast-dns/node_modules/dns-packet/types.js", ++ "ip": "node_modules/ip/lib/ip.js" ++ } ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/opcodes.js": [ ++ "LFriGAnBMRlKf47mnJbutbNHtlW4XIMzE4AeLRZ0uOs=", ++ {} ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/optioncodes.js": [ ++ "3pZajqqEknGKQXSKPJk4Bsp8re3icYWBXwgEUWYgccg=", ++ {} ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/rcodes.js": [ ++ "c9AZp9LNXY8sgwAYLr1FRnX4VvgW/v0CldZfiaLetbQ=", ++ {} ++ ], ++ "node_modules/multicast-dns/node_modules/dns-packet/types.js": [ ++ "OJ2QhwPPPeGpTY4/CJgrNQqAmpOr7GrDRdVTidJKXco=", ++ {} ++ ], ++ "node_modules/multifeed-index/index.js": [ ++ "8eJvMSKQiuqd806j82V6H/oF5fWJq8Hm4glAWUly/40=", ++ { ++ "./lib/state": "node_modules/multifeed-index/lib/state.js", ++ "clone": "node_modules/clone/clone.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/multifeed-index/lib/state.js": [ ++ "fypCVN7MUMlEB8zSb4gYjx9mvNYhmmk81tfw+kGh+sY=", ++ {} ++ ], ++ "node_modules/multifeed/index.js": [ ++ "Ww2hcbd3pIIb4+QVpSHVWHy17+Tc8hzSqDcQ/gMlCmA=", ++ { ++ "./mux": "node_modules/multifeed/mux.js", ++ "./package.json": "node_modules/multifeed/package.json", ++ "./ready": "node_modules/multifeed/ready.js", ++ "debug": "node_modules/debug/src/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "mutexify": "node_modules/mutexify/index.js", ++ "random-access-file": "node_modules/random-access-file/index.js", ++ "random-access-memory": "node_modules/random-access-memory/index.js", ++ "through2": "node_modules/multifeed/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/multifeed/mux.js": [ ++ "my/EhvkBBsJslC39AD+zwzBYsyq/MaBXAeZZrMDDZyM=", ++ { ++ "./ready": "node_modules/multifeed/ready.js", ++ "debug": "node_modules/debug/src/index.js", ++ "hypercore-protocol": "node_modules/hypercore-protocol/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/multifeed/node_modules/through2/through2.js": [ ++ "PW9lQW+wokyvd2osX+9AJZ5flGN4Lso7ncoXpgbmgO0=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/multifeed/package.json": [ ++ "CvsbdS7lgmvzdIlOkRHnAFfQJ9PUw0DTeIfF7QvGYGA=", ++ {} ++ ], ++ "node_modules/multifeed/ready.js": [ ++ "3PxLalQ0UFykDCZUS9pghU3kMOxN11j9aO3fb/J23ig=", ++ {} ++ ], ++ "node_modules/multiplex/index.js": [ ++ "YGid7AMwE/7MaQnrtmzaxM1Zsx1sRpSvuba0AUz3Tlk=", ++ { ++ "duplexify": "node_modules/multiplex/node_modules/duplexify/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "varint": "node_modules/varint/index.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/multiplex/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/mutexify/index.js": [ ++ "bys7gyuw7IkQA/zIhbOomEwqgmjqI0BfEI8jDozx2ao=", ++ {} ++ ], ++ "node_modules/nanoassert/index.js": [ ++ "H4Z5GsL83tC9KWiUGOU1lKqMb3qgNCW//XHE7sjqJKk=", ++ {} ++ ], ++ "node_modules/nanoguard/index.js": [ ++ "Gj/Aw3ZmLq/jxngFIuA1Kx6DQBpm1ddjGzvt9qmDaws=", ++ {} ++ ], ++ "node_modules/nanomatch/index.js": [ ++ "8iQAAf3DoioB+OWyEg2oSEmYq2CPfD4N2nWCRo1BnUo=", ++ { ++ "./lib/cache": "node_modules/nanomatch/lib/cache.js", ++ "./lib/compilers": "node_modules/nanomatch/lib/compilers.js", ++ "./lib/parsers": "node_modules/nanomatch/lib/parsers.js", ++ "./lib/utils": "node_modules/nanomatch/lib/utils.js", ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/nanomatch/lib/cache.js": [ ++ "0TcdOX1os7G/h5TxrQn4wtdmt4zFwk+ZFVQZ7GpQKQY=", ++ { ++ "fragment-cache": "node_modules/fragment-cache/index.js" ++ } ++ ], ++ "node_modules/nanomatch/lib/compilers.js": [ ++ "6DCjGskhjGnja4MVlhr/PuDiXECi/KHCLjbXdp+OGGk=", ++ {} ++ ], ++ "node_modules/nanomatch/lib/parsers.js": [ ++ "0GdO4BTpX0bylYkIQ2YWVD4KwJnF3LWtLmY8gsa5LV0=", ++ { ++ "regex-not": "node_modules/regex-not/index.js", ++ "to-regex": "node_modules/to-regex/index.js" ++ } ++ ], ++ "node_modules/nanomatch/lib/utils.js": [ ++ "i/QdPe/1xqS8w+KJ4mLKaFT9f88S+g+lyiBB+W2H1xA=", ++ { ++ "arr-diff": "node_modules/arr-diff/index.js", ++ "array-unique": "node_modules/array-unique/index.js", ++ "define-property": "node_modules/define-property/index.js", ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "is-windows": "node_modules/is-windows/index.js", ++ "kind-of": "node_modules/kind-of/index.js", ++ "object.pick": "node_modules/object.pick/index.js", ++ "snapdragon": "node_modules/snapdragon/index.js" ++ } ++ ], ++ "node_modules/network-address/index.js": [ ++ "UXJ2dwLWX9OJ67AHVmL1c/kHA7pxn3WBRH9UsOQrqdQ=", ++ {} ++ ], ++ "node_modules/node-gyp-build/index.js": [ ++ "EU7/pseXD1RxsBcrhbk1pLQRO+h3uuPD82Y/0pj65a8=", ++ {} ++ ], ++ "node_modules/normalize-url/index.js": [ ++ "WburN5kbRBB9o2tgZD6mlq5ToZbv9WkUhhDdmELYCJM=", ++ {} ++ ], ++ "node_modules/object-copy/index.js": [ ++ "tKYwDFBrFNFicgRuHqHIjeF0uv+Sr/6TkhK/kbvQ31Q=", ++ { ++ "copy-descriptor": "node_modules/copy-descriptor/index.js", ++ "define-property": "node_modules/object-copy/node_modules/define-property/index.js", ++ "kind-of": "node_modules/object-copy/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/object-copy/node_modules/define-property/index.js": [ ++ "dOYahXtE2Wzrnj/t8+Uh2PE6tfo9G5HhZTk7Mpw5fAw=", ++ { ++ "is-descriptor": "node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/object-copy/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/object-keys/implementation.js": [ ++ "TdQ7+GuIb2rcFqo0svDTonuS7PZa3LhyJOVM05TSAkw=", ++ { ++ "./isArguments": "node_modules/object-keys/isArguments.js" ++ } ++ ], ++ "node_modules/object-keys/index.js": [ ++ "QARYiqejdp2MNO+ag34WMiN0h+U+1XyuxRv8xmaPLCk=", ++ { ++ "./implementation": "node_modules/object-keys/implementation.js", ++ "./isArguments": "node_modules/object-keys/isArguments.js" ++ } ++ ], ++ "node_modules/object-keys/isArguments.js": [ ++ "MfNt7SeEFQt0gPVspC5/2m4RnUNF1YhKTV9V4T/mrDA=", ++ {} ++ ], ++ "node_modules/object-visit/index.js": [ ++ "ngIGawdfMQQScdNoVwahawLwCu9XwaVPLWJQPObs03U=", ++ { ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/object.pick/index.js": [ ++ "w1oqbztfx7eMyI2R3JaRHM6LbBmRzAELr+yv7fer9hw=", ++ { ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/on-finished/index.js": [ ++ "sDFEMuCR7MH3CVrF9JxnBdX7VZsMP9IuLXUO9Z52+iQ=", ++ { ++ "ee-first": "node_modules/ee-first/index.js" ++ } ++ ], ++ "node_modules/once/once.js": [ ++ "Pbc+NH7L26/fjQ24UUXId+Ez9TcudnNg75DAn3CsUQM=", ++ { ++ "wrappy": "node_modules/wrappy/wrappy.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/index.js": [ ++ "tgHhHuGWekyxe9GEDzNUtegH0DANCpbW+ozW/Jy5tT8=", ++ { ++ "./lib/geojson_fc_stream": "node_modules/osm-p2p-geojson/lib/geojson_fc_stream.js", ++ "./lib/has_interesting_tags": "node_modules/osm-p2p-geojson/lib/has_interesting_tags.js", ++ "./lib/importer.js": "node_modules/osm-p2p-geojson/lib/importer.js", ++ "./lib/is_polygon_feature": "node_modules/osm-p2p-geojson/lib/is_polygon_feature.js", ++ "collect-stream": "node_modules/collect-stream/build.js", ++ "from2": "node_modules/from2/index.js", ++ "geojson-dissolve": "node_modules/geojson-dissolve/index.js", ++ "geojson-rewind": "node_modules/geojson-rewind/index.js", ++ "geojson-validation": "node_modules/geojson-validation/index.js", ++ "map-limit": "node_modules/map-limit/index.js", ++ "once": "node_modules/once/once.js", ++ "pumpify": "node_modules/osm-p2p-geojson/node_modules/pumpify/index.js", ++ "through2": "node_modules/osm-p2p-geojson/node_modules/through2/through2.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/lib/geojson_fc_stream.js": [ ++ "1rJuQc9xcGdeTEPExYn91mCOp1zP+s0C3xnnjVOnq+Y=", ++ { ++ "JSONStream": "node_modules/JSONStream/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/lib/has_interesting_tags.js": [ ++ "bDT09w5HyhYxsvcLeyz5YFGS44AxKh0Bjua0E9+oO18=", ++ { ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/lib/importer.js": [ ++ "AUfqIGHaeqgHZVO+TXnsIBexaNXL2zdXjxT+RHd3rUA=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "randombytes": "node_modules/randombytes/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/lib/is_polygon_feature.js": [ ++ "IzQ67YWyJi6B1fpujTJvtwMkjmU09vd0Ztk5vj2l8x0=", ++ { ++ "osm-polygon-features": "node_modules/osm-polygon-features/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/node_modules/pumpify/index.js": [ ++ "KqvEozaMwfz16BgANcOFrm4/SlyxNAuokQbTvOVuDAg=", ++ { ++ "duplexify": "node_modules/osm-p2p-geojson/node_modules/duplexify/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "pump": "node_modules/osm-p2p-geojson/node_modules/pumpify/node_modules/pump/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/node_modules/pumpify/node_modules/pump/index.js": [ ++ "7dx9QiONoZJ8rDmG8r75kUe4/dD5NToKHwDumkkACWM=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/osm-p2p-geojson/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/index.js": [ ++ "SUDW7jMIFX/dVTPZzcEr5GVx2+XDY5g2U2GllGcVJag=", ++ { ++ "./lib/readyify": "node_modules/osm-p2p-syncfile/lib/readyify.js", ++ "blob-store-replication-stream": "node_modules/blob-store-replication-stream/index.js", ++ "debug": "node_modules/osm-p2p-syncfile/node_modules/debug/src/index.js", ++ "hypercore": "node_modules/osm-p2p-syncfile/node_modules/hypercore/index.js", ++ "indexed-tarball": "node_modules/indexed-tarball/index.js", ++ "indexed-tarball-blob-store": "node_modules/indexed-tarball-blob-store/index.js", ++ "indexed-tarball/lib/integrity": "node_modules/indexed-tarball/lib/integrity.js", ++ "mkdirp": "node_modules/osm-p2p-syncfile/node_modules/mkdirp/index.js", ++ "multifeed": "node_modules/multifeed/index.js", ++ "once": "node_modules/once/once.js", ++ "pump": "node_modules/pump/index.js", ++ "readdirp": "node_modules/readdirp/readdirp.js", ++ "rimraf": "node_modules/osm-p2p-syncfile/node_modules/rimraf/rimraf.js", ++ "tar-stream": "node_modules/tar-stream/index.js", ++ "through2": "node_modules/osm-p2p-syncfile/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/lib/readyify.js": [ ++ "IZG9fn1Cajf63xqO7bQGvcgiQoiRCqZSuRZrJevUfCE=", ++ {} ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/codecs/index.js": [ ++ "I6w2AXpa7m8QinJ3xYjuiJjjx028HfI5jKpI5Dj3a3c=", ++ {} ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/debug/src/browser.js": [ ++ "cQOSHOoVjhdA7ShGNAa3f9WgUoVpDM26SAvV+5wWK7g=", ++ { ++ "./common": "node_modules/osm-p2p-syncfile/node_modules/debug/src/common.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/debug/src/common.js": [ ++ "YxmDwjelz0B6mFJjMPTNySuI/FV8NPhqm47mMoWzRro=", ++ { ++ "ms": "node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/debug/src/index.js": [ ++ "ScJCb1AykCgnxReB277fpdd8CTTXheMSXv3lO1I46qo=", ++ { ++ "./browser.js": "node_modules/osm-p2p-syncfile/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/osm-p2p-syncfile/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/debug/src/node.js": [ ++ "bDYMN+ncHRT0HjXv3Ga3B6VvBp4kQUMHx250x71QVwI=", ++ { ++ "./common": "node_modules/osm-p2p-syncfile/node_modules/debug/src/common.js", ++ "supports-color": "node_modules/supports-color/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/index.js": [ ++ "JsgUSsnrUZTs7OHJIqeo08hj/vZIumrPaXex+tY/WtI=", ++ { ++ "./lib/bitfield": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/bitfield.js", ++ "./lib/replicate": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/replicate.js", ++ "./lib/safe-buffer-equals": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/safe-buffer-equals.js", ++ "./lib/storage": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/storage.js", ++ "./lib/tree-index": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/tree-index.js", ++ "atomic-batcher": "node_modules/atomic-batcher/index.js", ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "buffer-from": "node_modules/buffer-from/index.js", ++ "bulk-write-stream": "node_modules/bulk-write-stream/index.js", ++ "codecs": "node_modules/osm-p2p-syncfile/node_modules/codecs/index.js", ++ "fd-lock": "node_modules/fd-lock/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "from2": "node_modules/from2/index.js", ++ "hypercore-crypto": "node_modules/hypercore-crypto/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "inspect-custom-symbol": "node_modules/inspect-custom-symbol/index.js", ++ "last-one-wins": "node_modules/last-one-wins/index.js", ++ "merkle-tree-stream/generator": "node_modules/merkle-tree-stream/generator.js", ++ "pretty-hash": "node_modules/pretty-hash/index.js", ++ "process-nextick-args": "node_modules/osm-p2p-syncfile/node_modules/process-nextick-args/index.js", ++ "random-access-file": "node_modules/random-access-file/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js", ++ "thunky": "node_modules/thunky/index.js", ++ "unordered-array-remove": "node_modules/unordered-array-remove/index.js", ++ "unordered-set": "node_modules/osm-p2p-syncfile/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/bitfield.js": [ ++ "dPJo/0JO/pjBKRYdpwauY3hkdXykwDDoc7UPQBtScvY=", ++ { ++ "bitfield-rle": "node_modules/bitfield-rle/index.js", ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "memory-pager": "node_modules/memory-pager/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/replicate.js": [ ++ "WURbxRIxGK0ZDJEAou50H8z5+dix7/oKhp+WlpDyvAM=", ++ { ++ "./safe-buffer-equals": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/safe-buffer-equals.js", ++ "./tree-index": "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/tree-index.js", ++ "bitfield-rle": "node_modules/bitfield-rle/index.js", ++ "fast-bitfield": "node_modules/fast-bitfield/index.js", ++ "hypercore-protocol": "node_modules/hypercore-protocol/index.js", ++ "unordered-set": "node_modules/osm-p2p-syncfile/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/safe-buffer-equals.js": [ ++ "HbKuwy90hPGFiuZPELU2sFElqJwtweIj4hJtpiJYxlc=", ++ {} ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/storage.js": [ ++ "xceavwV0ID6njdGtXmYY/8GIPVCMhk0B97D4W0D+2OA=", ++ { ++ "array-lru": "node_modules/array-lru/index.js", ++ "buffer-alloc": "node_modules/buffer-alloc/index.js", ++ "buffer-alloc-unsafe": "node_modules/buffer-alloc-unsafe/index.js", ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "uint64be": "node_modules/uint64be/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/hypercore/lib/tree-index.js": [ ++ "xFF+R8b+MP+Rm1ZL733UushOGL/LNh7c2l4FkopkydU=", ++ { ++ "flat-tree": "node_modules/flat-tree/index.js", ++ "sparse-bitfield": "node_modules/sparse-bitfield/index.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/mkdirp/index.js": [ ++ "xwNbRxsZe6bUh5toA7bKJzoXr2yKI4Lcul6zunCkOsI=", ++ {} ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/process-nextick-args/index.js": [ ++ "zGXnAXfWuvrefX3JSZ8ZJWDc5ZIYoN1/vnjoJ3sIp7w=", ++ {} ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/rimraf/rimraf.js": [ ++ "ObijCKnT/swbgPsChLHJV0zC2amgKxjwlh4yPR1ctyw=", ++ { ++ "glob": "node_modules/glob/glob.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/osm-p2p-syncfile/node_modules/unordered-set/index.js": [ ++ "9WIkMme+D8oq5P1vgQwPW/j0Ow9ITQKqD+oP5K4UjFA=", ++ {} ++ ], ++ "node_modules/osm-polygon-features/index.js": [ ++ "HprxmUdYwEt0AvoClDkYkCiDB+HHudNcP/LvFbb5BdM=", ++ { ++ "./polygon-features.json": "node_modules/osm-polygon-features/polygon-features.json" ++ } ++ ], ++ "node_modules/osm-polygon-features/polygon-features.json": [ ++ "Id9eKK8us8sDs2xqEBARJRrAggMhocKQXFDRvs7Yfuo=", ++ {} ++ ], ++ "node_modules/p-cancelable/index.js": [ ++ "P+ligZuewhUzybGD0XaW2SahDjy/Vw8FGsJX0q6OTuE=", ++ {} ++ ], ++ "node_modules/p-defer/index.js": [ ++ "DR0vy+NgqrmJOPJkI6Hw4SLB8ox2DZOJ9T1ygtpAMNw=", ++ {} ++ ], ++ "node_modules/pako/index.js": [ ++ "5+xONdlNAaLk7l3KYrj7CKx0EVlu21SzmGUfTrVjVh0=", ++ { ++ "./lib/deflate": "node_modules/pako/lib/deflate.js", ++ "./lib/inflate": "node_modules/pako/lib/inflate.js", ++ "./lib/utils/common": "node_modules/pako/lib/utils/common.js", ++ "./lib/zlib/constants": "node_modules/pako/lib/zlib/constants.js" ++ } ++ ], ++ "node_modules/pako/lib/deflate.js": [ ++ "oZpd7lrBOlvsVMFWKbzTRJoKfxVBDQq1gsHvx5egG7A=", ++ { ++ "./utils/common": "node_modules/pako/lib/utils/common.js", ++ "./utils/strings": "node_modules/pako/lib/utils/strings.js", ++ "./zlib/deflate": "node_modules/pako/lib/zlib/deflate.js", ++ "./zlib/messages": "node_modules/pako/lib/zlib/messages.js", ++ "./zlib/zstream": "node_modules/pako/lib/zlib/zstream.js" ++ } ++ ], ++ "node_modules/pako/lib/inflate.js": [ ++ "GLfdOwEqEQXzKAc3EHpabzKpfHA2hJ26e9Hx5Uzan1M=", ++ { ++ "./utils/common": "node_modules/pako/lib/utils/common.js", ++ "./utils/strings": "node_modules/pako/lib/utils/strings.js", ++ "./zlib/constants": "node_modules/pako/lib/zlib/constants.js", ++ "./zlib/gzheader": "node_modules/pako/lib/zlib/gzheader.js", ++ "./zlib/inflate": "node_modules/pako/lib/zlib/inflate.js", ++ "./zlib/messages": "node_modules/pako/lib/zlib/messages.js", ++ "./zlib/zstream": "node_modules/pako/lib/zlib/zstream.js" ++ } ++ ], ++ "node_modules/pako/lib/utils/common.js": [ ++ "bnh4J09+D0Lnz7N5kztEffMEW5E5UB95ftKa3xr/3hQ=", ++ {} ++ ], ++ "node_modules/pako/lib/utils/strings.js": [ ++ "v4J93VLC6ZgZattkCuEZL33EnOXm5ZJuhhmP7rlFQqg=", ++ { ++ "./common": "node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/pako/lib/zlib/adler32.js": [ ++ "mWGOtoqWhYFI4t1W9HiqfkMhxDT18u5sV/WcDFaPBZY=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/constants.js": [ ++ "4MQUjtJnon8Dq6n5o0y6S63iCQwPEpBZB1OeOMhCq7w=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/crc32.js": [ ++ "IT+F6LLlLiz292NIlxl0APfdrtWHJ08WAEXwtUjsIdo=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/deflate.js": [ ++ "S5txrn9C5Qb+H7E08cIblE7yt+95Znuh/lnrljw1PSI=", ++ { ++ "../utils/common": "node_modules/pako/lib/utils/common.js", ++ "./adler32": "node_modules/pako/lib/zlib/adler32.js", ++ "./crc32": "node_modules/pako/lib/zlib/crc32.js", ++ "./messages": "node_modules/pako/lib/zlib/messages.js", ++ "./trees": "node_modules/pako/lib/zlib/trees.js" ++ } ++ ], ++ "node_modules/pako/lib/zlib/gzheader.js": [ ++ "j6C0mVzqR3vpa4eDp9bHz1/slnZcIQjDvVLncQS/29M=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/inffast.js": [ ++ "sb6ztVJw6DOPI/w5cTLReZQtWGYVPKTpviZCALAMDUQ=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/inflate.js": [ ++ "0xeZoj8q6H8MUtISQckieLQdI7tTZbRS8nBtQbAMQkU=", ++ { ++ "../utils/common": "node_modules/pako/lib/utils/common.js", ++ "./adler32": "node_modules/pako/lib/zlib/adler32.js", ++ "./crc32": "node_modules/pako/lib/zlib/crc32.js", ++ "./inffast": "node_modules/pako/lib/zlib/inffast.js", ++ "./inftrees": "node_modules/pako/lib/zlib/inftrees.js" ++ } ++ ], ++ "node_modules/pako/lib/zlib/inftrees.js": [ ++ "dfddiuSnvthvkKSjj3DF2V6AdRXpMmgB+aBzp/K/i8c=", ++ { ++ "../utils/common": "node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/pako/lib/zlib/messages.js": [ ++ "7sX11rgSCtqc1Io8oKJTxkd3kG6DVHewkOBTQ004z2w=", ++ {} ++ ], ++ "node_modules/pako/lib/zlib/trees.js": [ ++ "cYrbv2j0NDvxfWHt/9nQeIqWqT5OGR2FdFnZUlfmFM8=", ++ { ++ "../utils/common": "node_modules/pako/lib/utils/common.js" ++ } ++ ], ++ "node_modules/pako/lib/zlib/zstream.js": [ ++ "X6EMelnKmRE8+S0SYOVsvWKC4Vr6hdyKDrjo1tIyEpg=", ++ {} ++ ], ++ "node_modules/pascalcase/index.js": [ ++ "1C4WLBh91IcDbCZPsKptIq+jdRVwRu1ab83vV39Vn98=", ++ {} ++ ], ++ "node_modules/path-is-absolute/index.js": [ ++ "TrERnD7szE2OiEG3fQYquvRXKzMoAfWxYXW8MxG12PE=", ++ {} ++ ], ++ "node_modules/path-source/index.node.js": [ ++ "rE1x/P1b5sbeS4aNG3ePicaidY1eZVVyl/EONeiJsw4=", ++ { ++ "file-source": "node_modules/file-source/index.js" ++ } ++ ], ++ "node_modules/pend/index.js": [ ++ "S5kSkGgNkCfdeGSTxugWkANVlW2Ir7auTZe1rFo+4PU=", ++ {} ++ ], ++ "node_modules/pino-std-serializers/index.js": [ ++ "pWrn6Yod5s2R5UcMK5eX0Fv9ke+Z+PvBPOA/cC6hmpI=", ++ { ++ "./lib/err": "node_modules/pino-std-serializers/lib/err.js", ++ "./lib/req": "node_modules/pino-std-serializers/lib/req.js", ++ "./lib/res": "node_modules/pino-std-serializers/lib/res.js" ++ } ++ ], ++ "node_modules/pino-std-serializers/lib/err.js": [ ++ "uDqjMehUbO3ZGDfA9fmi9S01BQtChcJqcjQ3pZRssSo=", ++ {} ++ ], ++ "node_modules/pino-std-serializers/lib/req.js": [ ++ "VmdgUIcz1SihD/uGPqo1bSEw4oFMoVhp/eejEXWao3g=", ++ {} ++ ], ++ "node_modules/pino-std-serializers/lib/res.js": [ ++ "ObGnUY7C0wPSXhOol4yE9CeCSXnB/KSZfWjQ1X58yEM=", ++ {} ++ ], ++ "node_modules/pino/lib/levels.js": [ ++ "IywZ7iKrcbJIdFePXDP6KbXVsJelEfgyaovzTKBKKpw=", ++ { ++ "./symbols": "node_modules/pino/lib/symbols.js", ++ "./tools": "node_modules/pino/lib/tools.js", ++ "flatstr": "node_modules/flatstr/index.js" ++ } ++ ], ++ "node_modules/pino/lib/meta.js": [ ++ "4IVB8OTDJVzCpLVB+ANFWCR8ERle6adXQP3e+vHjH5s=", ++ { ++ "../package.json": "node_modules/pino/package.json" ++ } ++ ], ++ "node_modules/pino/lib/proto.js": [ ++ "FZVsLhkJz+792aejmZJsi6OaEZmPy2U3/1+WuYoqdBY=", ++ { ++ "./levels": "node_modules/pino/lib/levels.js", ++ "./meta": "node_modules/pino/lib/meta.js", ++ "./symbols": "node_modules/pino/lib/symbols.js", ++ "./tools": "node_modules/pino/lib/tools.js", ++ "flatstr": "node_modules/flatstr/index.js", ++ "sonic-boom": "node_modules/sonic-boom/index.js" ++ } ++ ], ++ "node_modules/pino/lib/redaction.js": [ ++ "NRJkBjIMmFVM5pw1CFigGgYcmjfbNjzXtXFWu/cwWCE=", ++ { ++ "./symbols": "node_modules/pino/lib/symbols.js", ++ "fast-redact": "node_modules/fast-redact/index.js" ++ } ++ ], ++ "node_modules/pino/lib/symbols.js": [ ++ "HF+TmggsQI2hgXx2VCYXh3nUO4YXRNavzBud1/Pz6W8=", ++ {} ++ ], ++ "node_modules/pino/lib/time.js": [ ++ "TjuDxWDuedZbpVPdLkMtOItiW5pmavEmGJnhWgRkVr8=", ++ {} ++ ], ++ "node_modules/pino/lib/tools.js": [ ++ "kLo53zBxbWOGeF4JgmiEX/O1W/IQUpyh/6o0ACKtsoc=", ++ { ++ "./symbols": "node_modules/pino/lib/symbols.js", ++ "fast-safe-stringify": "node_modules/fast-safe-stringify/index.js", ++ "pino-std-serializers": "node_modules/pino-std-serializers/index.js", ++ "quick-format-unescaped": "node_modules/quick-format-unescaped/index.js", ++ "sonic-boom": "node_modules/sonic-boom/index.js" ++ } ++ ], ++ "node_modules/pino/package.json": [ ++ "GPfIdzPbGKx8YYCTAWYB0GkbItuUcnJXoSLDtQh/PZk=", ++ {} ++ ], ++ "node_modules/pino/pino.js": [ ++ "7QgvyFaO8KaVwfaIfo3utL1ocVbrFVtJvKPgnmEpfuw=", ++ { ++ "./lib/levels": "node_modules/pino/lib/levels.js", ++ "./lib/meta": "node_modules/pino/lib/meta.js", ++ "./lib/proto": "node_modules/pino/lib/proto.js", ++ "./lib/redaction": "node_modules/pino/lib/redaction.js", ++ "./lib/symbols": "node_modules/pino/lib/symbols.js", ++ "./lib/time": "node_modules/pino/lib/time.js", ++ "./lib/tools": "node_modules/pino/lib/tools.js", ++ "pino-std-serializers": "node_modules/pino-std-serializers/index.js" ++ } ++ ], ++ "node_modules/posix-character-classes/index.js": [ ++ "+knOC9dQMP/hwr8qJLri76IS7Ejw++bj5s/81aSSYlQ=", ++ {} ++ ], ++ "node_modules/pretty-hash/index.js": [ ++ "orf7qgeV07XDsPAbYoBhwzMVkC2gGIBvjB8GgfG8ymc=", ++ {} ++ ], ++ "node_modules/process-nextick-args/index.js": [ ++ "kLpSSFH3Ieis7XmHDW1qczzTk5spOoPi0EQXgSqLozA=", ++ {} ++ ], ++ "node_modules/progress-stream/index.js": [ ++ "sLrMimVL85UCc2hpmbs0/SvJPiNOgeMkfbFSRo0+nWU=", ++ { ++ "speedometer": "node_modules/progress-stream/node_modules/speedometer/index.js", ++ "through2": "node_modules/progress-stream/node_modules/through2/through2.js" ++ } ++ ], ++ "node_modules/progress-stream/node_modules/speedometer/index.js": [ ++ "1k3xkOg/715JdFq+Dfmb4XzQFspieRMhUT3D2b/uPQw=", ++ {} ++ ], ++ "node_modules/progress-stream/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/protocol-buffers-encodings/index.js": [ ++ "N3v0F6aG52zga6zaJS08EQvEhfje7VqdpS/ruWjZSdE=", ++ { ++ "signed-varint": "node_modules/signed-varint/index.js", ++ "varint": "node_modules/protocol-buffers-encodings/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/protocol-buffers-encodings/node_modules/varint/decode.js": [ ++ "fsejwzyU5jrjbqFHK+d/77RRRc4UHfP3BFH1DLMLkM8=", ++ {} ++ ], ++ "node_modules/protocol-buffers-encodings/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/protocol-buffers-encodings/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/protocol-buffers-encodings/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/protocol-buffers-encodings/node_modules/varint/encode.js", ++ "./length.js": "node_modules/protocol-buffers-encodings/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/protocol-buffers-encodings/node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/prr/prr.js": [ ++ "M2waEw6vcov0DK2BRKoWlCliMH8ZJJjGMyHW/1nZqqw=", ++ {} ++ ], ++ "node_modules/pull-stream-to-stream/index.js": [ ++ "qOCi1zU8HEphn2mzy7O257igoYBv5dhDTR/8CQ8dUGE=", ++ {} ++ ], ++ "node_modules/pull-stream/pull.js": [ ++ "IcQfpQxyzQfjpUrE5UZsOmUXrjCPM4b2yiXwbu5wUOI=", ++ {} ++ ], ++ "node_modules/pull-stream/sinks/collect.js": [ ++ "gMHYP8b6vKRO61YoCyxW+3f1wgj+w4hadEXqdTRhitI=", ++ { ++ "./reduce": "node_modules/pull-stream/sinks/reduce.js" ++ } ++ ], ++ "node_modules/pull-stream/sinks/drain.js": [ ++ "MFvgRymxsxnD2IUCoCxMftlhI2mmRvOjePIYa43LPIc=", ++ {} ++ ], ++ "node_modules/pull-stream/sinks/reduce.js": [ ++ "l2IwU6xsFEXan/x2xPS/h8CMhbIgsTxAXNU6urAAsCQ=", ++ { ++ "./drain": "node_modules/pull-stream/sinks/drain.js" ++ } ++ ], ++ "node_modules/pump/index.js": [ ++ "YK4BclIZxp4Ibgz+am2h+Uqbr8+/UoRgtuBLe22YMWU=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/pumpify/index.js": [ ++ "KqvEozaMwfz16BgANcOFrm4/SlyxNAuokQbTvOVuDAg=", ++ { ++ "duplexify": "node_modules/duplexify/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "pump": "node_modules/pump/index.js" ++ } ++ ], ++ "node_modules/queue-microtask/index.js": [ ++ "hTRJ0uhAohwpXKOOXj47JGizdOPUdw5Gib6Vxsx2gyI=", ++ {} ++ ], ++ "node_modules/quick-format-unescaped/index.js": [ ++ "xQjahSzoz5R/vvL/rYa08HUZSv8hBEAKNYzUgT30m5w=", ++ {} ++ ], ++ "node_modules/quick-lru/index.js": [ ++ "QYVHwXlvLi8jBqmYkZvO9FhCN3leYnAiTCW5JAbiExU=", ++ {} ++ ], ++ "node_modules/random-access-file/index.js": [ ++ "EUH7zvLqGosHERWgLex5kpTbHk9kTkuhtXV2/XwWKuw=", ++ { ++ "mkdirp-classic": "node_modules/mkdirp-classic/index.js", ++ "random-access-storage": "node_modules/random-access-storage/index.js" ++ } ++ ], ++ "node_modules/random-access-memory/index.js": [ ++ "0bI0Og/ifiB5geeLZMVX5jRQGJsKmMCYD2b9JCGm+2c=", ++ { ++ "inherits": "node_modules/inherits/inherits.js", ++ "is-options": "node_modules/is-options/index.js", ++ "random-access-storage": "node_modules/random-access-storage/index.js" ++ } ++ ], ++ "node_modules/random-access-storage/index.js": [ ++ "Trwq+KqeWzxsbUet+Omb+wC9uH2QMBcZNBUiXOCqCv4=", ++ { ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/randombytes/index.js": [ ++ "7Xs21mvB3jBFa6LdigPzqD5mo3en4/fpZ7gtqwY3GZQ=", ++ {} ++ ], ++ "node_modules/raw-body/index.js": [ ++ "4cyAegQ54StVUOH50QrcIFu/qDCxesfO/+YCcNfxY/U=", ++ { ++ "bytes": "node_modules/bytes/index.js", ++ "string_decoder/": "node_modules/raw-body/node_modules/string_decoder/index.js" ++ } ++ ], ++ "node_modules/raw-body/node_modules/string_decoder/index.js": [ ++ "gKIYnJimHqSYfOZjXfjIaFBUqidMZy30uxz/AjsG+3Q=", ++ {} ++ ], ++ "node_modules/reachdown/index.js": [ ++ "W/SbvkPF9gHARrIcktVTNa4LPF8YMVwrM+m/1ZqlBwM=", ++ {} ++ ], ++ "node_modules/read-only-stream/index.js": [ ++ "Xz37zg6LLSD/q2TmaCLVrblyJCsrQ7+T1JiBHKXXGvU=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/readable-stream/duplex.js": [ ++ "FkdQNRQ5l+kk3D9Br2/WV89VxYQ/QV8AsVXCCJHails=", ++ { ++ "./readable": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "/RfWqS3ZugBMhfjjZLJ3GvENASqDdmQ3RH265jh5+ms=", ++ { ++ "./_stream_readable": "node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/readable-stream/lib/_stream_writable.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "process-nextick-args": "node_modules/process-nextick-args/index.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "v2FFCx/1+U/qnUZmXpMRGWQgNMkD5jzCJLTJZHLu1NQ=", ++ { ++ "./_stream_transform": "node_modules/readable-stream/lib/_stream_transform.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/_stream_readable.js": [ ++ "8ONFYfiyE4wPFW1U9VJlj01HQAr6TNXEhpI94umHjHE=", ++ { ++ "./_stream_duplex": "node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/BufferList": "node_modules/readable-stream/lib/internal/streams/BufferList.js", ++ "./internal/streams/destroy": "node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/stream": "node_modules/readable-stream/lib/internal/streams/stream.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "isarray": "node_modules/isarray/index.js", ++ "process-nextick-args": "node_modules/process-nextick-args/index.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/_stream_transform.js": [ ++ "ViINndWLl28XOb/IWUiyZ9eXcrojZy/0AtE7az/PTkA=", ++ { ++ "./_stream_duplex": "node_modules/readable-stream/lib/_stream_duplex.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/_stream_writable.js": [ ++ "O+oV5gFBA4FiYptAn9IfJnXnk9qUfjr60Ptmom1Ccpk=", ++ { ++ "./_stream_duplex": "node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/stream": "node_modules/readable-stream/lib/internal/streams/stream.js", ++ "core-util-is": "node_modules/core-util-is/lib/util.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "process-nextick-args": "node_modules/process-nextick-args/index.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/internal/streams/BufferList.js": [ ++ "izrTpjdhpR6WaPiBmLIYN5KUAZx309g0Sy4vjYmj4LM=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "cvqfYP9IEpFD3i4cH2JM7w1/Qa1Vx9YNlNEBRjUplgc=", ++ { ++ "process-nextick-args": "node_modules/process-nextick-args/index.js" ++ } ++ ], ++ "node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/readable-stream/readable.js": [ ++ "oe+j+gY5Ov9lLzUp6hsbwyE01J63lLIycvsLoT0hRVA=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/readable-stream/lib/_stream_writable.js" ++ } ++ ], ++ "node_modules/readdirp/readdirp.js": [ ++ "qahx0KA1GdpiNVVR2jni85QVpoOiPDm0yFCyUW1lVtk=", ++ { ++ "./stream-api": "node_modules/readdirp/stream-api.js", ++ "graceful-fs": "node_modules/graceful-fs/graceful-fs.js", ++ "micromatch": "node_modules/micromatch/index.js" ++ } ++ ], ++ "node_modules/readdirp/stream-api.js": [ ++ "m98ywZhletlLjEnxz5nYVV7NmpoZ6KJKBwxN9dvbrlM=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/regex-not/index.js": [ ++ "sCS68i8IFcDYMsnjK2WGqdNQuiRgV+Zb0B0shKoJ1io=", ++ { ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "safe-regex": "node_modules/safe-regex/index.js" ++ } ++ ], ++ "node_modules/regex-regex/lib/index.js": [ ++ "qQrar3g0n+DxQLWkYJgH84z9H+chEgxgRvu8e6eQpJQ=", ++ {} ++ ], ++ "node_modules/repeat-element/index.js": [ ++ "EUYJhlcre0axAN4gBRKHQImjK6UnCbnRJvNSKC7yHos=", ++ {} ++ ], ++ "node_modules/repeat-string/index.js": [ ++ "UJohjIujzONidmZI7cwvGNk/q5X5YCFUEDAs639hA/o=", ++ {} ++ ], ++ "node_modules/resolve-alpn/index.js": [ ++ "aWW9AndHkCQ+WCs2cU9UX3kUtG8hM0OOck5I9HXUNcg=", ++ {} ++ ], ++ "node_modules/responselike/src/index.js": [ ++ "oVTKl2k00MNQD39w19b1/Vzyju6CzrgCb5wCBkgWtcw=", ++ { ++ "lowercase-keys": "node_modules/lowercase-keys/index.js" ++ } ++ ], ++ "node_modules/ret/lib/index.js": [ ++ "f05DqDfbOqVehYFFCEDnUApiBdWMiRiqvMgYImYErEU=", ++ { ++ "./positions": "node_modules/ret/lib/positions.js", ++ "./sets": "node_modules/ret/lib/sets.js", ++ "./types": "node_modules/ret/lib/types.js", ++ "./util": "node_modules/ret/lib/util.js" ++ } ++ ], ++ "node_modules/ret/lib/positions.js": [ ++ "cAxZXGeuTxkao2703y9beGUn46q0gHVVM79vxyQo8EA=", ++ { ++ "./types": "node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/ret/lib/sets.js": [ ++ "V3mEtS3Z5cyxGk8Duuv7Q8p4yVEsYIGHkH5rg4hBGHs=", ++ { ++ "./types": "node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/ret/lib/types.js": [ ++ "iSjKXVAItcKhihh5KDKmoBel18KYFxl7CaWQId1DmG4=", ++ {} ++ ], ++ "node_modules/ret/lib/util.js": [ ++ "PUYbY5PP/I6Bu5YF3nvhLUJGjiuHe+WNBtLu1vxw0Nw=", ++ { ++ "./sets": "node_modules/ret/lib/sets.js", ++ "./types": "node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/reusify/reusify.js": [ ++ "AIlKPdcBbjdRVgVpzHkcFcLgYHw1qRvTOY2rZ1Am/PM=", ++ {} ++ ], ++ "node_modules/rfdc/index.js": [ ++ "mz6AUEAWOQd1+Tt+pod0SpqbpOGZiaGE6Rue0xJHNMw=", ++ {} ++ ], ++ "node_modules/rimraf/rimraf.js": [ ++ "yds//vKsQ82TtChBR83Uv7Jk7sCtGj5pEJvANxsSjuc=", ++ { ++ "glob": "node_modules/glob/glob.js" ++ } ++ ], ++ "node_modules/routes/dist/routes.js": [ ++ "8VrBuJYFr1CCWsoXDJHGVBF4bUc/5mIG5GaZz1yTwN0=", ++ {} ++ ], ++ "node_modules/run-parallel/index.js": [ ++ "rLyaFoCUZ9qPBnV9RgC+ZGayC/SgXlXBV/oEgw+xhrc=", ++ { ++ "queue-microtask": "node_modules/queue-microtask/index.js" ++ } ++ ], ++ "node_modules/rwlock/lib/lock.js": [ ++ "HVnKb+KWE30tj/D3xqwlFsBi5qsM5FfmM7BPj3BBBYI=", ++ {} ++ ], ++ "node_modules/safe-buffer/index.js": [ ++ "1YryHLBRiGTQxQV0LRr3HlteHxQvTA8nNTqg9DGmFtQ=", ++ {} ++ ], ++ "node_modules/safe-fs-blob-store/index.js": [ ++ "REWaJf9K4P9ani1jncIpUXL6m6yvtFCNzz6cdFbAKw0=", ++ { ++ "@digidem/atomic-fs-blob-store": "node_modules/@digidem/atomic-fs-blob-store/index.js", ++ "folder-walker": "node_modules/folder-walker/index.js", ++ "imurmurhash": "node_modules/imurmurhash/imurmurhash.js" ++ } ++ ], ++ "node_modules/safe-json-parse/index.js": [ ++ "pKIacEb5U0t4ERmScrjX6Z8Xx3i1C367etxje8KXQWc=", ++ {} ++ ], ++ "node_modules/safe-regex/index.js": [ ++ "wXBboLka1DXM60zfySYMwfUtjeTA2Q0R8bwkJZiYX6U=", ++ { ++ "ret": "node_modules/ret/lib/index.js" ++ } ++ ], ++ "node_modules/safe-regex2/index.js": [ ++ "ma82uZHVcjAHeHjvvAhe8+3GpOd6Ye4jTJV4Hlc8Rgo=", ++ { ++ "ret": "node_modules/safe-regex2/node_modules/ret/lib/index.js" ++ } ++ ], ++ "node_modules/safe-regex2/node_modules/ret/lib/index.js": [ ++ "6pBWJtMqqUvDRg/1LzGHJ8gn2vQf6ow4iWN61/28HoE=", ++ { ++ "./positions": "node_modules/safe-regex2/node_modules/ret/lib/positions.js", ++ "./sets": "node_modules/safe-regex2/node_modules/ret/lib/sets.js", ++ "./types": "node_modules/safe-regex2/node_modules/ret/lib/types.js", ++ "./util": "node_modules/safe-regex2/node_modules/ret/lib/util.js" ++ } ++ ], ++ "node_modules/safe-regex2/node_modules/ret/lib/positions.js": [ ++ "cEA3v5gB6/dCrLgimuiAgJCth6WbmG8dumu3xj8Usug=", ++ { ++ "./types": "node_modules/safe-regex2/node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/safe-regex2/node_modules/ret/lib/sets.js": [ ++ "mXfJa2ZYfX4+QGL785MvNnjFGOY7gBJLlZhMd1Be/Zs=", ++ { ++ "./types": "node_modules/safe-regex2/node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/safe-regex2/node_modules/ret/lib/types.js": [ ++ "iSjKXVAItcKhihh5KDKmoBel18KYFxl7CaWQId1DmG4=", ++ {} ++ ], ++ "node_modules/safe-regex2/node_modules/ret/lib/util.js": [ ++ "3Jv8J0AgvrgK3FFpZhlgvr6Gi/1+rjmPdkFMpvtNmWE=", ++ { ++ "./sets": "node_modules/safe-regex2/node_modules/ret/lib/sets.js", ++ "./types": "node_modules/safe-regex2/node_modules/ret/lib/types.js" ++ } ++ ], ++ "node_modules/secure-json-parse/index.js": [ ++ "bEMv7oR2QMS1E5JhoZ8Qfkrol2qjFKZHYAr1m51/5wU=", ++ {} ++ ], ++ "node_modules/semver-store/index.js": [ ++ "jIzoNSj3HSqLfm/j6OHQVbU1LU/5I7m5koljrOrBmD0=", ++ {} ++ ], ++ "node_modules/semver/classes/comparator.js": [ ++ "c4aV56rG5K7Ybad6ccVoTsIW53DdYdNKdNfF1jxYCc4=", ++ { ++ "../functions/cmp": "node_modules/semver/functions/cmp.js", ++ "../internal/debug": "node_modules/semver/internal/debug.js", ++ "../internal/parse-options": "node_modules/semver/internal/parse-options.js", ++ "../internal/re": "node_modules/semver/internal/re.js", ++ "./range": "node_modules/semver/classes/range.js", ++ "./semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/classes/range.js": [ ++ "AXD+pBrtRt1e65STKEzBbMbcJ8ufZQKc4zt2voL/pf4=", ++ { ++ "../internal/debug": "node_modules/semver/internal/debug.js", ++ "../internal/parse-options": "node_modules/semver/internal/parse-options.js", ++ "../internal/re": "node_modules/semver/internal/re.js", ++ "./comparator": "node_modules/semver/classes/comparator.js", ++ "./semver": "node_modules/semver/classes/semver.js", ++ "lru-cache": "node_modules/semver/node_modules/lru-cache/index.js" ++ } ++ ], ++ "node_modules/semver/classes/semver.js": [ ++ "pmQzJemnf/hP75p+d7w2CY9ISPE92evBNcXlE0VE7zc=", ++ { ++ "../internal/constants": "node_modules/semver/internal/constants.js", ++ "../internal/debug": "node_modules/semver/internal/debug.js", ++ "../internal/identifiers": "node_modules/semver/internal/identifiers.js", ++ "../internal/parse-options": "node_modules/semver/internal/parse-options.js", ++ "../internal/re": "node_modules/semver/internal/re.js" ++ } ++ ], ++ "node_modules/semver/functions/clean.js": [ ++ "9TngD91nTlfOwWrHqowNEEg7Mb8BwcPx9LsgIBSygMo=", ++ { ++ "./parse": "node_modules/semver/functions/parse.js" ++ } ++ ], ++ "node_modules/semver/functions/cmp.js": [ ++ "TI51/RRBbC2KRhaCpdZxV+/gxjeWnd2K61Y3M6g2ti8=", ++ { ++ "./eq": "node_modules/semver/functions/eq.js", ++ "./gt": "node_modules/semver/functions/gt.js", ++ "./gte": "node_modules/semver/functions/gte.js", ++ "./lt": "node_modules/semver/functions/lt.js", ++ "./lte": "node_modules/semver/functions/lte.js", ++ "./neq": "node_modules/semver/functions/neq.js" ++ } ++ ], ++ "node_modules/semver/functions/coerce.js": [ ++ "i9RrTJogWPqkFE8p/+/u1O4yyv1te1NHqRxJnqUok/M=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js", ++ "../internal/re": "node_modules/semver/internal/re.js", ++ "./parse": "node_modules/semver/functions/parse.js" ++ } ++ ], ++ "node_modules/semver/functions/compare-build.js": [ ++ "VhkfoO0nYzoz/tnJnWV+MFz1RSseZ33ThhCUigUBRuA=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/compare-loose.js": [ ++ "m3WuzkWNBeE6KZr910XeauYGkoeGLh1bxxj6yyTadpI=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/compare.js": [ ++ "zz4ZiiUHYM80TgtXXbqtfYtHDLVuJc4hUq29+C+j5eg=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/diff.js": [ ++ "Qx6CkC92BHVbqCb5IoZupj0kWYYTasUg+jy4gqjDT90=", ++ { ++ "./eq": "node_modules/semver/functions/eq.js", ++ "./parse": "node_modules/semver/functions/parse.js" ++ } ++ ], ++ "node_modules/semver/functions/eq.js": [ ++ "7l3FC0pLNSGeAWcwqoYxsl0SJEfdffVuxEfdIC/XmtQ=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/gt.js": [ ++ "B3bspx8oDzaaIPbtvQPBkrFyLf5qBoHEDWN5i7gaZFk=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/gte.js": [ ++ "Z/J72HWGpJjCKVT9QfRZccB5rqNM7H1jVjvs1i3gyBA=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/inc.js": [ ++ "R3II0/5phygnuNf3yX4+qex4an3R4k1sQqODmynuPro=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/lt.js": [ ++ "Ek8gOcVH0qT+g7mlbmw7kR04MonUcjj09VjqQGHENI4=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/lte.js": [ ++ "WtHOGGAHnM8lp/5iIRNh/mzSrAap/EYWooj6O7b/pkg=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/major.js": [ ++ "x+A/u5vBUo6haBwkM61z0kGwI8YgCnsT+mPsCDuB4Bc=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/minor.js": [ ++ "ob1bU0cerz1VHDv7S2EfZIMqC+edgrwKLV7g/4tokuQ=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/neq.js": [ ++ "4azff7tM1A43KjdEPS7yUE/hUk4PIUMXkSQY7VoKJG4=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/parse.js": [ ++ "q//3WlyMa0OSGV5oHpOmSraVtPEB+0uQokeq2Ha/S8Q=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js", ++ "../internal/constants": "node_modules/semver/internal/constants.js", ++ "../internal/parse-options": "node_modules/semver/internal/parse-options.js", ++ "../internal/re": "node_modules/semver/internal/re.js" ++ } ++ ], ++ "node_modules/semver/functions/patch.js": [ ++ "a8CVaJ5i6yqkAQM7CQhw0kNzqk6ZIInCJWdzEzyZSWk=", ++ { ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/functions/prerelease.js": [ ++ "aD4Ca3Tw0YN0FhwUxLNn/whI5Wjan7i/sxlryYXCbZU=", ++ { ++ "./parse": "node_modules/semver/functions/parse.js" ++ } ++ ], ++ "node_modules/semver/functions/rcompare.js": [ ++ "XJX/L6L4UzBBV580g14rT1aA6p9NjQj/H01TfP2feJY=", ++ { ++ "./compare": "node_modules/semver/functions/compare.js" ++ } ++ ], ++ "node_modules/semver/functions/rsort.js": [ ++ "idvbFUI0PLVJ7NEs2Mea4B5hESFUReprCR8zf63dbr4=", ++ { ++ "./compare-build": "node_modules/semver/functions/compare-build.js" ++ } ++ ], ++ "node_modules/semver/functions/satisfies.js": [ ++ "2sOgr1u9Xr0um4SGWC7WHd7GlKn8nWr7NDsYWh+z5Z8=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js" ++ } ++ ], ++ "node_modules/semver/functions/sort.js": [ ++ "Xj4wmRcz2Ml3r7XO9WSoVcK8zZbAgNg+VCLjh2zVEv0=", ++ { ++ "./compare-build": "node_modules/semver/functions/compare-build.js" ++ } ++ ], ++ "node_modules/semver/functions/valid.js": [ ++ "1gtpeU4glLKu81q77V0XueFLQaT+8q1aONpOIXHRxJ8=", ++ { ++ "./parse": "node_modules/semver/functions/parse.js" ++ } ++ ], ++ "node_modules/semver/index.js": [ ++ "V8ObdK+3RrAoBR5YPkYHnr+uEQsumiS1YHAYXhTDgbY=", ++ { ++ "./classes/comparator": "node_modules/semver/classes/comparator.js", ++ "./classes/range": "node_modules/semver/classes/range.js", ++ "./classes/semver": "node_modules/semver/classes/semver.js", ++ "./functions/clean": "node_modules/semver/functions/clean.js", ++ "./functions/cmp": "node_modules/semver/functions/cmp.js", ++ "./functions/coerce": "node_modules/semver/functions/coerce.js", ++ "./functions/compare": "node_modules/semver/functions/compare.js", ++ "./functions/compare-build": "node_modules/semver/functions/compare-build.js", ++ "./functions/compare-loose": "node_modules/semver/functions/compare-loose.js", ++ "./functions/diff": "node_modules/semver/functions/diff.js", ++ "./functions/eq": "node_modules/semver/functions/eq.js", ++ "./functions/gt": "node_modules/semver/functions/gt.js", ++ "./functions/gte": "node_modules/semver/functions/gte.js", ++ "./functions/inc": "node_modules/semver/functions/inc.js", ++ "./functions/lt": "node_modules/semver/functions/lt.js", ++ "./functions/lte": "node_modules/semver/functions/lte.js", ++ "./functions/major": "node_modules/semver/functions/major.js", ++ "./functions/minor": "node_modules/semver/functions/minor.js", ++ "./functions/neq": "node_modules/semver/functions/neq.js", ++ "./functions/parse": "node_modules/semver/functions/parse.js", ++ "./functions/patch": "node_modules/semver/functions/patch.js", ++ "./functions/prerelease": "node_modules/semver/functions/prerelease.js", ++ "./functions/rcompare": "node_modules/semver/functions/rcompare.js", ++ "./functions/rsort": "node_modules/semver/functions/rsort.js", ++ "./functions/satisfies": "node_modules/semver/functions/satisfies.js", ++ "./functions/sort": "node_modules/semver/functions/sort.js", ++ "./functions/valid": "node_modules/semver/functions/valid.js", ++ "./internal/constants": "node_modules/semver/internal/constants.js", ++ "./internal/identifiers": "node_modules/semver/internal/identifiers.js", ++ "./internal/re": "node_modules/semver/internal/re.js", ++ "./ranges/gtr": "node_modules/semver/ranges/gtr.js", ++ "./ranges/intersects": "node_modules/semver/ranges/intersects.js", ++ "./ranges/ltr": "node_modules/semver/ranges/ltr.js", ++ "./ranges/max-satisfying": "node_modules/semver/ranges/max-satisfying.js", ++ "./ranges/min-satisfying": "node_modules/semver/ranges/min-satisfying.js", ++ "./ranges/min-version": "node_modules/semver/ranges/min-version.js", ++ "./ranges/outside": "node_modules/semver/ranges/outside.js", ++ "./ranges/simplify": "node_modules/semver/ranges/simplify.js", ++ "./ranges/subset": "node_modules/semver/ranges/subset.js", ++ "./ranges/to-comparators": "node_modules/semver/ranges/to-comparators.js", ++ "./ranges/valid": "node_modules/semver/ranges/valid.js" ++ } ++ ], ++ "node_modules/semver/internal/constants.js": [ ++ "ICRnAF5SKzXOhVqUjmFcVak0Xb5ihCQOiWHO0A7XBgQ=", ++ {} ++ ], ++ "node_modules/semver/internal/debug.js": [ ++ "lVf5Bez242+XZThB4I/TAHS6N61SkHCgkLo1KYbeT6I=", ++ {} ++ ], ++ "node_modules/semver/internal/identifiers.js": [ ++ "SJCigWNTrsArQnWYZSGy78YoHhb2j2Vokm0tU67BRzg=", ++ {} ++ ], ++ "node_modules/semver/internal/parse-options.js": [ ++ "52MxkulUVdUecmF9AaAJdNw1nin/jyI5/ihjmq/HtvI=", ++ {} ++ ], ++ "node_modules/semver/internal/re.js": [ ++ "hMnf5ksZA0KEQRiAibOETfahdBsaKjXLoPJkS0HvloM=", ++ { ++ "./constants": "node_modules/semver/internal/constants.js", ++ "./debug": "node_modules/semver/internal/debug.js" ++ } ++ ], ++ "node_modules/semver/node_modules/lru-cache/index.js": [ ++ "9SfSOGpiZrm/Z9JkGUlIz3QbEtqhn+oZ41N0FO4x+ac=", ++ { ++ "yallist": "node_modules/yallist/yallist.js" ++ } ++ ], ++ "node_modules/semver/ranges/gtr.js": [ ++ "NYShw590griiczzEYwd3pogcYnzy+xBl57M4cTSuCJk=", ++ { ++ "./outside": "node_modules/semver/ranges/outside.js" ++ } ++ ], ++ "node_modules/semver/ranges/intersects.js": [ ++ "odcLXrQc6irzIc8iQNJXfiag5118BMrVJ+XXGkVRA0E=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js" ++ } ++ ], ++ "node_modules/semver/ranges/ltr.js": [ ++ "myuMrSJzF4OafkfFuDWn9F4+hhJwyj4zXCu2k8G9Qlo=", ++ { ++ "./outside": "node_modules/semver/ranges/outside.js" ++ } ++ ], ++ "node_modules/semver/ranges/max-satisfying.js": [ ++ "y8VgBIwG+xo8dUEmOL+J3bl4Lzc6dE/8TY8qoLjRHDw=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js", ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/ranges/min-satisfying.js": [ ++ "nqgeswAZtY/WIY/0D1Za9g6eUldKwcyILmhB/HWz6L0=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js", ++ "../classes/semver": "node_modules/semver/classes/semver.js" ++ } ++ ], ++ "node_modules/semver/ranges/min-version.js": [ ++ "WcBAHN2TJMrmS9QRoKeFZ5r3R/BOa36HFCX2RUgLwL4=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js", ++ "../classes/semver": "node_modules/semver/classes/semver.js", ++ "../functions/gt": "node_modules/semver/functions/gt.js" ++ } ++ ], ++ "node_modules/semver/ranges/outside.js": [ ++ "AoUfgenbuYEvhFaWh6+NHAtcAEs3J06TwfcQcLa6swM=", ++ { ++ "../classes/comparator": "node_modules/semver/classes/comparator.js", ++ "../classes/range": "node_modules/semver/classes/range.js", ++ "../classes/semver": "node_modules/semver/classes/semver.js", ++ "../functions/gt": "node_modules/semver/functions/gt.js", ++ "../functions/gte": "node_modules/semver/functions/gte.js", ++ "../functions/lt": "node_modules/semver/functions/lt.js", ++ "../functions/lte": "node_modules/semver/functions/lte.js", ++ "../functions/satisfies": "node_modules/semver/functions/satisfies.js" ++ } ++ ], ++ "node_modules/semver/ranges/simplify.js": [ ++ "WPj0WL5Iktx7FdryHi2x598HzRRwvpglsW+t2uH0T2E=", ++ { ++ "../functions/compare.js": "node_modules/semver/functions/compare.js", ++ "../functions/satisfies.js": "node_modules/semver/functions/satisfies.js" ++ } ++ ], ++ "node_modules/semver/ranges/subset.js": [ ++ "g8SaDorP6Glfo5cJ21DMXQqVRkt8Qp90NRuXAqHfo6A=", ++ { ++ "../classes/comparator.js": "node_modules/semver/classes/comparator.js", ++ "../classes/range.js": "node_modules/semver/classes/range.js", ++ "../functions/compare.js": "node_modules/semver/functions/compare.js", ++ "../functions/satisfies.js": "node_modules/semver/functions/satisfies.js" ++ } ++ ], ++ "node_modules/semver/ranges/to-comparators.js": [ ++ "yAnvLCey6eR86meB0bYekq2rzLE5q/rACd8lPPxPb9M=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js" ++ } ++ ], ++ "node_modules/semver/ranges/valid.js": [ ++ "T2tOsNBf2g6XdOyxt0ZNb8JcdfHZ3zQjrOTLsuxGb8Q=", ++ { ++ "../classes/range": "node_modules/semver/classes/range.js" ++ } ++ ], ++ "node_modules/serialize-error/index.js": [ ++ "auoO0hCINnYNmUUDSacaZkWt5dqeVS9AlhsPkMPzd38=", ++ {} ++ ], ++ "node_modules/set-cookie-parser/lib/set-cookie.js": [ ++ "dEkmy/uuwy0/lMgU3FHdmB3V02muEl5ekubedbK4MEk=", ++ {} ++ ], ++ "node_modules/set-value/index.js": [ ++ "hb9sSUofkXIqDkcm/H4VUjOej4hCnk+5mbJmk8Ix5ms=", ++ { ++ "extend-shallow": "node_modules/set-value/node_modules/extend-shallow/index.js", ++ "is-extendable": "node_modules/is-extendable/index.js", ++ "is-plain-object": "node_modules/is-plain-object/index.js", ++ "split-string": "node_modules/split-string/index.js" ++ } ++ ], ++ "node_modules/set-value/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/shapefile/dist/shapefile.node.js": [ ++ "HT5cYhV7G78xYclHEIaaw1lVIfdHiEd4iRQdtsFDBqI=", ++ { ++ "array-source": "node_modules/array-source/dist/array-source.js", ++ "path-source": "node_modules/path-source/index.node.js", ++ "slice-source": "node_modules/slice-source/dist/slice-source.js", ++ "stream-source": "node_modules/stream-source/index.node.js", ++ "text-encoding": "node_modules/text-encoding/index.js" ++ } ++ ], ++ "node_modules/shp-write/index.js": [ ++ "dajlc6O/1zm/E0K7PmgJjPVlnffAGFwf6g2JMuOV91w=", ++ { ++ "./src/download": "node_modules/shp-write/src/download.js", ++ "./src/write": "node_modules/shp-write/src/write.js", ++ "./src/zip": "node_modules/shp-write/src/zip.js", ++ "./src/zipStream": "node_modules/shp-write/src/zipStream.js" ++ } ++ ], ++ "node_modules/shp-write/src/download.js": [ ++ "d4W17+7roqMGXFheWL4A7Ac8losoA7jXJQpsCcZktmU=", ++ { ++ "./zip": "node_modules/shp-write/src/zip.js", ++ "file-saver": "node_modules/file-saver/dist/FileSaver.min.js" ++ } ++ ], ++ "node_modules/shp-write/src/extent.js": [ ++ "ONB5LWVrxZ2XkU4eLD9fr11pmwSxrTCc/KntMzbu+Dk=", ++ {} ++ ], ++ "node_modules/shp-write/src/geojson.js": [ ++ "uTp6fybsY7fa3HQq1qOpc0SX9eOP9fePm9qoZmPQE3w=", ++ {} ++ ], ++ "node_modules/shp-write/src/points.js": [ ++ "qLi+4T13r2E2LEFW26sWe1rxqkgPIvmtiYTHQIfU1VQ=", ++ { ++ "./extent": "node_modules/shp-write/src/extent.js" ++ } ++ ], ++ "node_modules/shp-write/src/poly.js": [ ++ "0k7C1caIh8dGQlZ2RNQZ7F0+jncZQyDrwIRgNVVa/Ts=", ++ { ++ "./extent": "node_modules/shp-write/src/extent.js", ++ "./types": "node_modules/shp-write/src/types.js" ++ } ++ ], ++ "node_modules/shp-write/src/prj.js": [ ++ "9VcNilZ3nIjr3EdqAiIYybaxXotfah2udZQFj7zGi/I=", ++ {} ++ ], ++ "node_modules/shp-write/src/types.js": [ ++ "hm+N/3zORUtBGjOJKAL8j/LtieKn9ZEoDbyA/6WmVkI=", ++ {} ++ ], ++ "node_modules/shp-write/src/write.js": [ ++ "gX0BDjYL8rjny28DhhmdfAhgvNdcSUZo33V02L78AFc=", ++ { ++ "./points": "node_modules/shp-write/src/points.js", ++ "./poly": "node_modules/shp-write/src/poly.js", ++ "./prj": "node_modules/shp-write/src/prj.js", ++ "./types": "node_modules/shp-write/src/types.js", ++ "dbf": "node_modules/dbf/index.js" ++ } ++ ], ++ "node_modules/shp-write/src/zip.js": [ ++ "rmP8OFiMFDC7bc2gq/9MWuOFuMRGuZeg9++3aKDTuiY=", ++ { ++ "./geojson": "node_modules/shp-write/src/geojson.js", ++ "./prj": "node_modules/shp-write/src/prj.js", ++ "./write": "node_modules/shp-write/src/write.js", ++ "jszip": "node_modules/jszip/lib/index.js" ++ } ++ ], ++ "node_modules/shp-write/src/zipStream.js": [ ++ "5Z06inBjYSz+O8+XS6IjuA2lbeKXjdbmh5PpRRJZSIA=", ++ { ++ "./geojson": "node_modules/shp-write/src/geojson.js", ++ "./prj": "node_modules/shp-write/src/prj.js", ++ "./write": "node_modules/shp-write/src/write.js", ++ "jszip": "node_modules/jszip/lib/index.js" ++ } ++ ], ++ "node_modules/signed-varint/index.js": [ ++ "AFAXLTUHDGLY0hd2+mPHE0zwwTUqWIWbvWwlmZacYx0=", ++ { ++ "varint": "node_modules/signed-varint/node_modules/varint/index.js" ++ } ++ ], ++ "node_modules/signed-varint/node_modules/varint/decode.js": [ ++ "fsejwzyU5jrjbqFHK+d/77RRRc4UHfP3BFH1DLMLkM8=", ++ {} ++ ], ++ "node_modules/signed-varint/node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/signed-varint/node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/signed-varint/node_modules/varint/decode.js", ++ "./encode.js": "node_modules/signed-varint/node_modules/varint/encode.js", ++ "./length.js": "node_modules/signed-varint/node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/signed-varint/node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/simple-sha1/index.js": [ ++ "ajdp0bp9uMu/ZcO6NxySAgNeOiLbPj+MrK/6LaY9QNE=", ++ {} ++ ], ++ "node_modules/siphash24/fallback.js": [ ++ "qNAbTr9pR8tWvnBnxOthxTYC75zXATWDoDCffEcKwgY=", ++ {} ++ ], ++ "node_modules/siphash24/index.js": [ ++ "lw8kEvAPhqOKejqAHQTQ372oDVcUgLY9n0JwXULwKqw=", ++ { ++ "./fallback": "node_modules/siphash24/fallback.js", ++ "./siphash24": "node_modules/siphash24/siphash24.js", ++ "nanoassert": "node_modules/nanoassert/index.js" ++ } ++ ], ++ "node_modules/siphash24/siphash24.js": [ ++ "QHoYum+Ywv6MOfntE0ZUXlFya7jlNtSPADl2H8D1g/E=", ++ {} ++ ], ++ "node_modules/slice-source/dist/slice-source.js": [ ++ "XP8ZXLX2SbQK5PW8KWvh9p7kYuWRa/59qjYqdJPd3sU=", ++ {} ++ ], ++ "node_modules/snapdragon-node/index.js": [ ++ "B7QKFhqLlbvKNkhpHo/DgX3/ohCGlBuLmwBQfMetapE=", ++ { ++ "define-property": "node_modules/snapdragon-node/node_modules/define-property/index.js", ++ "isobject": "node_modules/isobject/index.js", ++ "snapdragon-util": "node_modules/snapdragon-util/index.js" ++ } ++ ], ++ "node_modules/snapdragon-node/node_modules/define-property/index.js": [ ++ "jKcYzrcOopXC/fcrMwXI+/Zhs9uruQOaejiqciZzENM=", ++ { ++ "is-descriptor": "node_modules/snapdragon-node/node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/snapdragon-node/node_modules/is-accessor-descriptor/index.js": [ ++ "uWcSP5eXqxOfD2T43fElUt/DO/DebNoNF2+rKQVzbj8=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/snapdragon-node/node_modules/is-data-descriptor/index.js": [ ++ "17T6fQV8jDz84CBgZM5yZjYbaNQAA5Hlzs92BrGADSk=", ++ { ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/snapdragon-node/node_modules/is-descriptor/index.js": [ ++ "XG9C4tfIrgGz+gJ8BuKTD60xwz2Uaf5bdKVY1p6PzLM=", ++ { ++ "is-accessor-descriptor": "node_modules/snapdragon-node/node_modules/is-accessor-descriptor/index.js", ++ "is-data-descriptor": "node_modules/snapdragon-node/node_modules/is-data-descriptor/index.js", ++ "kind-of": "node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/snapdragon-util/index.js": [ ++ "zjM2J1J1cw8NT5Xz7KaYvZ2U0nQN6/yRf9IoKwg4Qsc=", ++ { ++ "kind-of": "node_modules/snapdragon-util/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/snapdragon-util/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/snapdragon/index.js": [ ++ "PjVDF3V8f9dBHgYG4eGf1BolNctRlIAerkLvBLSPbTA=", ++ { ++ "./lib/compiler": "node_modules/snapdragon/lib/compiler.js", ++ "./lib/parser": "node_modules/snapdragon/lib/parser.js", ++ "./lib/utils": "node_modules/snapdragon/lib/utils.js", ++ "base": "node_modules/base/index.js", ++ "define-property": "node_modules/snapdragon/node_modules/define-property/index.js" ++ } ++ ], ++ "node_modules/snapdragon/lib/compiler.js": [ ++ "tbvLcvY2Q+VeORkmwEK3zvyzw0744JR8xRQ/h8yk2HI=", ++ { ++ "./source-maps": "node_modules/snapdragon/lib/source-maps.js", ++ "./utils": "node_modules/snapdragon/lib/utils.js", ++ "debug": "node_modules/snapdragon/node_modules/debug/src/index.js", ++ "define-property": "node_modules/snapdragon/node_modules/define-property/index.js", ++ "use": "node_modules/use/index.js" ++ } ++ ], ++ "node_modules/snapdragon/lib/parser.js": [ ++ "Lp5rtNKR2is52lRCnSD0IknqEL95F8dYhmEdtVa52Z4=", ++ { ++ "./position": "node_modules/snapdragon/lib/position.js", ++ "./utils": "node_modules/snapdragon/lib/utils.js", ++ "debug": "node_modules/snapdragon/node_modules/debug/src/index.js", ++ "define-property": "node_modules/snapdragon/node_modules/define-property/index.js", ++ "map-cache": "node_modules/map-cache/index.js", ++ "use": "node_modules/use/index.js" ++ } ++ ], ++ "node_modules/snapdragon/lib/position.js": [ ++ "4Jm/BmI9GHTxVGga/SqbCjcOi/3p5pZVXbFKcn4++mw=", ++ { ++ "define-property": "node_modules/snapdragon/node_modules/define-property/index.js" ++ } ++ ], ++ "node_modules/snapdragon/lib/source-maps.js": [ ++ "gNa1mN8NcUCszi6xwcvTecrrHxsWKhuKCJ4MOMNVf1U=", ++ { ++ "./utils": "node_modules/snapdragon/lib/utils.js", ++ "define-property": "node_modules/snapdragon/node_modules/define-property/index.js" ++ } ++ ], ++ "node_modules/snapdragon/lib/utils.js": [ ++ "s2J+4pprgzD5zFerpkeaTxiw7lsmzhcMz0SIpp3lSIw=", ++ { ++ "extend-shallow": "node_modules/snapdragon/node_modules/extend-shallow/index.js", ++ "source-map": "node_modules/source-map/source-map.js", ++ "source-map-resolve": "node_modules/source-map-resolve/lib/source-map-resolve-node.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/debug/src/browser.js": [ ++ "AUSralK5MwxWfeEaXDpK6jXNrEekwQZIKqJK6AVM3G8=", ++ { ++ "./debug": "node_modules/snapdragon/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/debug/src/debug.js": [ ++ "2NHB1sOHq2fD8o14/Qsgub7NaUQtudPv4RDKRktQnIo=", ++ { ++ "ms": "node_modules/snapdragon/node_modules/ms/index.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/debug/src/index.js": [ ++ "mjT+3rLSacRu2U5vEwOesNFthm3UYOxm+jrNeBIvqf4=", ++ { ++ "./browser.js": "node_modules/snapdragon/node_modules/debug/src/browser.js", ++ "./node.js": "node_modules/snapdragon/node_modules/debug/src/node.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/debug/src/node.js": [ ++ "o+g1lKTOiJl+Lk/Ga8lCsXudc2KQrWJWDH8J1tCYmtA=", ++ { ++ "./debug": "node_modules/snapdragon/node_modules/debug/src/debug.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/define-property/index.js": [ ++ "dOYahXtE2Wzrnj/t8+Uh2PE6tfo9G5HhZTk7Mpw5fAw=", ++ { ++ "is-descriptor": "node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/extend-shallow/index.js": [ ++ "yBK78T/iNjYN52LfnzAB6xatUSx7JH9PIcl2k78MKvU=", ++ { ++ "is-extendable": "node_modules/is-extendable/index.js" ++ } ++ ], ++ "node_modules/snapdragon/node_modules/ms/index.js": [ ++ "S9kiCcudrPPjdz5yWst6rsQ+qeeFQDJOTQ9z5c6a3vc=", ++ {} ++ ], ++ "node_modules/sodium-javascript/crypto_generichash.js": [ ++ "BdTvMgHcJRZ69G9/6UvUNV6uD3+ZsL1ur8akbETaLTk=", ++ { ++ "blake2b": "node_modules/blake2b/index.js" ++ } ++ ], ++ "node_modules/sodium-javascript/crypto_kdf.js": [ ++ "bZ8TKLybIqm3g5yFsGbhUwsM/xjz2dOEIqA95ctOMJQ=", ++ { ++ "./randombytes": "node_modules/sodium-javascript/randombytes.js", ++ "blake2b": "node_modules/blake2b/index.js", ++ "nanoassert": "node_modules/nanoassert/index.js" ++ } ++ ], ++ "node_modules/sodium-javascript/crypto_shorthash.js": [ ++ "XnpTttsJMxsEoxfKHVaUuqn2gAT7V0UDYoAu56lO3Bk=", ++ { ++ "siphash24": "node_modules/siphash24/index.js" ++ } ++ ], ++ "node_modules/sodium-javascript/crypto_stream.js": [ ++ "+G44vGXv7fkp0I07mqjzELc8awvdCU6DKNafdbaxhAs=", ++ { ++ "xsalsa20": "node_modules/xsalsa20/index.js" ++ } ++ ], ++ "node_modules/sodium-javascript/index.js": [ ++ "a5mJaOTsoYeAKpfjrNw7+MSD1fSI1j5xhtOjK2fBxEs=", ++ { ++ "./crypto_generichash": "node_modules/sodium-javascript/crypto_generichash.js", ++ "./crypto_kdf": "node_modules/sodium-javascript/crypto_kdf.js", ++ "./crypto_shorthash": "node_modules/sodium-javascript/crypto_shorthash.js", ++ "./crypto_stream": "node_modules/sodium-javascript/crypto_stream.js", ++ "./randombytes": "node_modules/sodium-javascript/randombytes.js", ++ "xsalsa20": "node_modules/xsalsa20/index.js" ++ } ++ ], ++ "node_modules/sodium-javascript/randombytes.js": [ ++ "RHdOMelxVHHzs1/M7zh/tgMI4DvJbrNb/wC4yo+pbuk=", ++ { ++ "nanoassert": "node_modules/nanoassert/index.js" ++ } ++ ], ++ "node_modules/sodium-native/index.js": [ ++ "rWn21Gq7gIXmOUm3yi+3GNMQBlq/zL8O8ZprGGxk1Bk=", ++ { ++ "node-gyp-build": "node_modules/node-gyp-build/index.js" ++ } ++ ], ++ "node_modules/sodium-universal/index.js": [ ++ "BNbJjedNKbypQdsKiYVo9dA5+b6VNm1eKjckIWfdUak=", ++ { ++ "sodium-javascript": "node_modules/sodium-javascript/index.js", ++ "sodium-native": "node_modules/sodium-native/index.js" ++ } ++ ], ++ "node_modules/sonic-boom/index.js": [ ++ "LTWwdBiTN3lVUS5n8U/9uhAWJumTcn0hX1Ix0M0BYL4=", ++ { ++ "atomic-sleep": "node_modules/atomic-sleep/index.js", ++ "flatstr": "node_modules/flatstr/index.js" ++ } ++ ], ++ "node_modules/sorted-indexof/index.js": [ ++ "0OdBMKjwsH3Zisu/oKivdw+YtApmRuQ8L35UNegi0Fo=", ++ {} ++ ], ++ "node_modules/source-map-resolve/lib/decode-uri-component.js": [ ++ "9cwM4EYty0lt2bjplT9byR/1F6uA8iWGUJn+RXoiEYM=", ++ { ++ "decode-uri-component": "node_modules/decode-uri-component/index.js" ++ } ++ ], ++ "node_modules/source-map-resolve/lib/resolve-url.js": [ ++ "qEux/05tlN6ncOrRJsLvPQbAdtQIKVxa3vFrtM7yQFk=", ++ {} ++ ], ++ "node_modules/source-map-resolve/lib/source-map-resolve-node.js": [ ++ "7arMZrpqMck7f/dDQpwcJRw2rPLOnlbAwa6D4tpOuWI=", ++ { ++ "./decode-uri-component": "node_modules/source-map-resolve/lib/decode-uri-component.js", ++ "./resolve-url": "node_modules/source-map-resolve/lib/resolve-url.js", ++ "atob": "node_modules/atob/node-atob.js", ++ "source-map-url": "node_modules/source-map-url/source-map-url.js", ++ "urix": "node_modules/urix/index.js" ++ } ++ ], ++ "node_modules/source-map-url/source-map-url.js": [ ++ "a8bkqWHi1q4OrhkkDM1VfA+3u0fnluGOEx5yb33RBeU=", ++ {} ++ ], ++ "node_modules/source-map/lib/array-set.js": [ ++ "FjuzBVqupxQBZ3QANqgxYf2RLDRLFPmSdUuA8hR311Q=", ++ { ++ "./util": "node_modules/source-map/lib/util.js" ++ } ++ ], ++ "node_modules/source-map/lib/base64-vlq.js": [ ++ "80B+Uo9U7AeHvQpx7qwMmf/9mERZFvy+EW3GnKO+kos=", ++ { ++ "./base64": "node_modules/source-map/lib/base64.js" ++ } ++ ], ++ "node_modules/source-map/lib/base64.js": [ ++ "ZRv0M88F6eyM7guUY5SDI2pgXUgnnoPT1cXegcIdZZk=", ++ {} ++ ], ++ "node_modules/source-map/lib/binary-search.js": [ ++ "x/SkehJa8L2GBEPf1x0vQS0al9y1OrcDgYnWO5HcMr0=", ++ {} ++ ], ++ "node_modules/source-map/lib/mapping-list.js": [ ++ "Nd24KGHxGnCrhMtH1iD8so1/iEu0RGROBr3oFbg2754=", ++ { ++ "./util": "node_modules/source-map/lib/util.js" ++ } ++ ], ++ "node_modules/source-map/lib/quick-sort.js": [ ++ "AO1UdbCLSiOYNrxdZnv680P08kEs12FtKq83vd2FgsI=", ++ {} ++ ], ++ "node_modules/source-map/lib/source-map-consumer.js": [ ++ "YC7VSKy4jyUP3A57FXPeVzfQEIXtRn0J2UlFdCGGucw=", ++ { ++ "./array-set": "node_modules/source-map/lib/array-set.js", ++ "./base64-vlq": "node_modules/source-map/lib/base64-vlq.js", ++ "./binary-search": "node_modules/source-map/lib/binary-search.js", ++ "./quick-sort": "node_modules/source-map/lib/quick-sort.js", ++ "./util": "node_modules/source-map/lib/util.js" ++ } ++ ], ++ "node_modules/source-map/lib/source-map-generator.js": [ ++ "LqAYOKSWnINKH51AbIyCiRlaFciZOP8VNsO90pM9zqg=", ++ { ++ "./array-set": "node_modules/source-map/lib/array-set.js", ++ "./base64-vlq": "node_modules/source-map/lib/base64-vlq.js", ++ "./mapping-list": "node_modules/source-map/lib/mapping-list.js", ++ "./util": "node_modules/source-map/lib/util.js" ++ } ++ ], ++ "node_modules/source-map/lib/source-node.js": [ ++ "cCEIOIW1ArHDSZXhq80MLnNOWh8n6vTFZqoXlJfhKus=", ++ { ++ "./source-map-generator": "node_modules/source-map/lib/source-map-generator.js", ++ "./util": "node_modules/source-map/lib/util.js" ++ } ++ ], ++ "node_modules/source-map/lib/util.js": [ ++ "z0Z6Sjt9EnghODz2IkC0JVHIGvdqmmUsKFwBWKxtAKo=", ++ {} ++ ], ++ "node_modules/source-map/source-map.js": [ ++ "3AmEVsLZq5CkwKF8ypvhZmW5gT3yCQZVOpiwCIoVe+c=", ++ { ++ "./lib/source-map-consumer": "node_modules/source-map/lib/source-map-consumer.js", ++ "./lib/source-map-generator": "node_modules/source-map/lib/source-map-generator.js", ++ "./lib/source-node": "node_modules/source-map/lib/source-node.js" ++ } ++ ], ++ "node_modules/sparse-bitfield/index.js": [ ++ "Vzv/1EDnBN1Pu/t5QhQ1wQamlX3+CAsdZ4NSQY8S/ys=", ++ { ++ "memory-pager": "node_modules/memory-pager/index.js" ++ } ++ ], ++ "node_modules/split-string/index.js": [ ++ "eNOfxU2DQjroBNPVKg6J1kJPO9g8Zv01niXii1rCY8g=", ++ { ++ "extend-shallow": "node_modules/extend-shallow/index.js" ++ } ++ ], ++ "node_modules/stack-generator/stack-generator.js": [ ++ "VdXMziLAP9fmmkbwSXEiIDKEwmg0Cs2x/Shszl9L8GU=", ++ { ++ "stackframe": "node_modules/stackframe/stackframe.js" ++ } ++ ], ++ "node_modules/stackframe/stackframe.js": [ ++ "AXuXDJlk7cyvAuh6ZWwRlZ4BSaoaVPhzqGRC3EJXrrk=", ++ {} ++ ], ++ "node_modules/static-extend/index.js": [ ++ "NwXcCPzBHB4AYZslHTbKkTpSc9R2S++CEMU8Yy06Z8k=", ++ { ++ "define-property": "node_modules/static-extend/node_modules/define-property/index.js", ++ "object-copy": "node_modules/object-copy/index.js" ++ } ++ ], ++ "node_modules/static-extend/node_modules/define-property/index.js": [ ++ "dOYahXtE2Wzrnj/t8+Uh2PE6tfo9G5HhZTk7Mpw5fAw=", ++ { ++ "is-descriptor": "node_modules/is-descriptor/index.js" ++ } ++ ], ++ "node_modules/statuses/codes.json": [ ++ "Nddnw2XTPnwHvEWxBYZZlc18IV8rQ9qne8cX8UpUV2s=", ++ {} ++ ], ++ "node_modules/statuses/index.js": [ ++ "T4sOjp6c/3c7pUDa+KBl2bGbLuHRCKzAFyYU+BsR7ws=", ++ { ++ "./codes.json": "node_modules/statuses/codes.json" ++ } ++ ], ++ "node_modules/stream-shift/index.js": [ ++ "hxirWe6CD1OXrI9Olrs/QaYW9ab9RO8q96sKjNjX+zQ=", ++ {} ++ ], ++ "node_modules/stream-source/cancel.js": [ ++ "Sc+cYgk7dBzaxab4KuctyDDmaPZyIHHaDusUVudoxeM=", ++ {} ++ ], ++ "node_modules/stream-source/index.node.js": [ ++ "6EFNCSsJ2lafI2G2ve/J1baBfqvghATNeB1ZA+C/vs8=", ++ { ++ "./cancel": "node_modules/stream-source/cancel.js", ++ "./read": "node_modules/stream-source/read.js", ++ "./slice": "node_modules/stream-source/slice.js" ++ } ++ ], ++ "node_modules/stream-source/read.js": [ ++ "/RvBI9DZx8QHjCEy1YDCvWqeELWxbzLVQgP0l/8zj9E=", ++ {} ++ ], ++ "node_modules/stream-source/slice.js": [ ++ "5Ks4lLQHNq7c0ASHjapz6nvJcGS54Wym8dlg7p8Bkts=", ++ {} ++ ], ++ "node_modules/string-similarity/src/index.js": [ ++ "s7ZQX3hHVe0M9cJeJwXRHCaWRo48WMcLIreV7KFutn8=", ++ {} ++ ], ++ "node_modules/string_decoder/lib/string_decoder.js": [ ++ "8dNtR7LFeQYzksGmiWNGfy1PUaBprwnrBo2XTGPuOzc=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/subleveldown/index.js": [ ++ "Q82FQgC+vtOo3CFkAguEMbRHpC3wJG4w+gfVV9lVTfs=", ++ { ++ "./leveldown": "node_modules/subleveldown/leveldown.js", ++ "encoding-down": "node_modules/encoding-down/index.js", ++ "levelup": "node_modules/levelup/lib/levelup.js" ++ } ++ ], ++ "node_modules/subleveldown/leveldown.js": [ ++ "1ezvgupqhEwRalMylP1e8AmrEQVsTYOzIMt6JCnFH2k=", ++ { ++ "./matchdown": "node_modules/subleveldown/matchdown.js", ++ "abstract-leveldown": "node_modules/abstract-leveldown/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "level-option-wrap": "node_modules/level-option-wrap/index.js", ++ "reachdown": "node_modules/reachdown/index.js" ++ } ++ ], ++ "node_modules/subleveldown/matchdown.js": [ ++ "QKeslLF+flmmN055uJT+PgPEs85PqFZ2IAyRPmRTlmg=", ++ {} ++ ], ++ "node_modules/supports-color/index.js": [ ++ "JiaquaE9xkWxdG1v8ckZt9J63uYHKYJUBPJOcNmCrLM=", ++ { ++ "has-flag": "node_modules/has-flag/index.js" ++ } ++ ], ++ "node_modules/tar-fs/index.js": [ ++ "WT6Q/ClSW/uAXWBJSpSkPMYxynVgkvo3j0GM3nCcQPM=", ++ { ++ "chownr": "node_modules/chownr/chownr.js", ++ "mkdirp-classic": "node_modules/mkdirp-classic/index.js", ++ "pump": "node_modules/pump/index.js", ++ "tar-stream": "node_modules/tar-fs/node_modules/tar-stream/index.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/bl/BufferList.js": [ ++ "yyGtXS3SVeIZVGDs1aC91lz/Ct7iqf1shglRwiyf1Lg=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/bl/bl.js": [ ++ "ceWa7tSvEK1CaLs15MUf6JxkDqmj8anLWXWUsCN24kk=", ++ { ++ "./BufferList": "node_modules/tar-fs/node_modules/bl/BufferList.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/tar-fs/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/tar-fs/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/tar-fs/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/tar-stream/extract.js": [ ++ "a17dBy7ogMHCPFQNkgidEF6jQvncusvwT9qTTAkLig0=", ++ { ++ "./headers": "node_modules/tar-fs/node_modules/tar-stream/headers.js", ++ "bl": "node_modules/tar-fs/node_modules/bl/bl.js", ++ "readable-stream": "node_modules/tar-fs/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/tar-stream/headers.js": [ ++ "O81h6VIDjJNcLqF6iR8iOyGLOgjezHXE6l3skSOuOKk=", ++ {} ++ ], ++ "node_modules/tar-fs/node_modules/tar-stream/index.js": [ ++ "Dbns7vUiTbw0wiTDmLUO70uZ+TfIDIH2YJKGFaJI7U8=", ++ { ++ "./extract": "node_modules/tar-fs/node_modules/tar-stream/extract.js", ++ "./pack": "node_modules/tar-fs/node_modules/tar-stream/pack.js" ++ } ++ ], ++ "node_modules/tar-fs/node_modules/tar-stream/pack.js": [ ++ "36mjBujt88iwRF1cx3LmoKdDgt/L8Z69O+BujzH7+U4=", ++ { ++ "./headers": "node_modules/tar-fs/node_modules/tar-stream/headers.js", ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "fs-constants": "node_modules/fs-constants/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/tar-fs/node_modules/readable-stream/readable.js" ++ } ++ ], ++ "node_modules/tar-stream/extract.js": [ ++ "qOkYQuR1TrFLKBi+Ms86Oc7ti78kewBhTmw38CIXtYc=", ++ { ++ "./headers": "node_modules/tar-stream/headers.js", ++ "bl": "node_modules/bl/bl.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/tar-stream/headers.js": [ ++ "7X6Qyu6MWTpPQr7lyFFKZnmuH2uuxamsfFUM332M8zc=", ++ { ++ "buffer-alloc": "node_modules/buffer-alloc/index.js", ++ "to-buffer": "node_modules/to-buffer/index.js" ++ } ++ ], ++ "node_modules/tar-stream/index.js": [ ++ "Dbns7vUiTbw0wiTDmLUO70uZ+TfIDIH2YJKGFaJI7U8=", ++ { ++ "./extract": "node_modules/tar-stream/extract.js", ++ "./pack": "node_modules/tar-stream/pack.js" ++ } ++ ], ++ "node_modules/tar-stream/pack.js": [ ++ "kzTgNMQlwk+anqHr4+kELpIT87EXRqfJ4wUQhd8ZCls=", ++ { ++ "./headers": "node_modules/tar-stream/headers.js", ++ "buffer-alloc": "node_modules/buffer-alloc/index.js", ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "fs-constants": "node_modules/fs-constants/index.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "to-buffer": "node_modules/to-buffer/index.js" ++ } ++ ], ++ "node_modules/text-encoding/index.js": [ ++ "+ATc0OeJj+wyS8eYPHgDv1Utpeu7H2bKLyiKY06stnA=", ++ { ++ "./lib/encoding.js": "node_modules/text-encoding/lib/encoding.js" ++ } ++ ], ++ "node_modules/text-encoding/lib/encoding-indexes.js": [ ++ "0P1P7TKtsEVwY070xQ4v2Ss8fyQLaORAPbHPXfYJZj8=", ++ {} ++ ], ++ "node_modules/text-encoding/lib/encoding.js": [ ++ "E9b12NeEmrVSXHs978RmbR1TsqL7+Xd+tHA5lWzi0Mc=", ++ { ++ "./encoding-indexes.js": "node_modules/text-encoding/lib/encoding-indexes.js" ++ } ++ ], ++ "node_modules/through/index.js": [ ++ "xT9nq7mah+p1AVEl5xBCcx5MtfZjL98MVaTnPNdbyz8=", ++ {} ++ ], ++ "node_modules/through2-filter/index.js": [ ++ "yoGIqzcoRqcSC6y5U7Ams/9QZr2yimu/URgetuNzRRg=", ++ { ++ "through2": "node_modules/through2-filter/node_modules/through2/through2.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/through2-filter/node_modules/through2/through2.js": [ ++ "DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=", ++ { ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "xtend": "node_modules/xtend/immutable.js" ++ } ++ ], ++ "node_modules/thunky/index.js": [ ++ "U7tCQXk/kJWI3+QMrqqLt7R4wQq0W48ccm8UBVdIhSk=", ++ {} ++ ], ++ "node_modules/timeout-refresh/browser.js": [ ++ "Hp3gLjMN5COt94Rc1C9YoYquTtxVDvshe6eZlOvCz74=", ++ {} ++ ], ++ "node_modules/timeout-refresh/index.js": [ ++ "p3tEl2R2xY6Cbswv2diM7GYz2zhBPw4JEfqelY+6W8I=", ++ { ++ "./browser": "node_modules/timeout-refresh/browser.js", ++ "./refresh": "node_modules/timeout-refresh/refresh.js", ++ "./timers": "node_modules/timeout-refresh/timers.js" ++ } ++ ], ++ "node_modules/timeout-refresh/refresh.js": [ ++ "gqLhHmqDPFvZhX5suoQdCc7L0lr/+xw/DHvBRGkVKGA=", ++ {} ++ ], ++ "node_modules/timeout-refresh/timers.js": [ ++ "bQmKdfirtY7WTsJu07IPyg31WFLkqkaVMLzCInd9YqU=", ++ {} ++ ], ++ "node_modules/tiny-lru/lib/tiny-lru.cjs.js": [ ++ "8/okJx1F67QhLST20QDLwQamFSpFx/aQBwxbUqyClRM=", ++ {} ++ ], ++ "node_modules/tiny-typed-emitter/lib/index.js": [ ++ "FAH92hBe1n82W9d1OXrtsvX55DrOAxKI8PaGj5qwQb4=", ++ {} ++ ], ++ "node_modules/to-buffer/index.js": [ ++ "Si9yKY8wYt01ocyOJdEdxZ/hYMpjKDRgEMmL7jIA53A=", ++ {} ++ ], ++ "node_modules/to-object-path/index.js": [ ++ "6cjiHPjAJPqgnQ7msmDmFm/tAsQb9frpJ44xexK9Ino=", ++ { ++ "kind-of": "node_modules/to-object-path/node_modules/kind-of/index.js" ++ } ++ ], ++ "node_modules/to-object-path/node_modules/kind-of/index.js": [ ++ "7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=", ++ { ++ "is-buffer": "node_modules/is-buffer/index.js" ++ } ++ ], ++ "node_modules/to-regex-range/index.js": [ ++ "+ij3xbmBZEYasGXMSNmPbyBHAia/Z5LvyYRwRi9fJJk=", ++ { ++ "is-number": "node_modules/is-number/index.js", ++ "repeat-string": "node_modules/repeat-string/index.js" ++ } ++ ], ++ "node_modules/to-regex/index.js": [ ++ "4HnDszALSP6XmfpvCP2hkurZktoNaurAvx3QXurzcp8=", ++ { ++ "define-property": "node_modules/define-property/index.js", ++ "extend-shallow": "node_modules/extend-shallow/index.js", ++ "regex-not": "node_modules/regex-not/index.js", ++ "safe-regex": "node_modules/safe-regex/index.js" ++ } ++ ], ++ "node_modules/topojson-client/dist/topojson-client.js": [ ++ "nckWHBOLQQLws80gDCnFHFmDdCvPR4So9HBLOLBOsmQ=", ++ {} ++ ], ++ "node_modules/topojson-server/dist/topojson-server.js": [ ++ "vKwBiwziEY5xgv7FtmRX88z+ZLGD6rfEbFuh2YJM2Lg=", ++ {} ++ ], ++ "node_modules/type-name/index.js": [ ++ "C+Fa4D4KwtHhB4UUQDZrG8Os9ZjqHiO/Tj8pHVY55Qk=", ++ {} ++ ], ++ "node_modules/typedarray/index.js": [ ++ "M3/O2aM3DeRBQXCqCkstYcpjSsLYLDWHmK+vKioE4Qc=", ++ {} ++ ], ++ "node_modules/uint64be/index.js": [ ++ "5qpGJH3uH5dJcnqdmzHmV2W4sREagc1KWdxpor8ZrAs=", ++ { ++ "buffer-alloc": "node_modules/buffer-alloc/index.js" ++ } ++ ], ++ "node_modules/ultron/index.js": [ ++ "D38Wco2QbCUAglhUEqY6Vg2myEa3IBAtFpI/iym3dbk=", ++ {} ++ ], ++ "node_modules/union-value/index.js": [ ++ "mkviS1/HjcbtvE0rDc3o4TSwACCwadA3jaFoCNIcEzY=", ++ { ++ "arr-union": "node_modules/arr-union/index.js", ++ "get-value": "node_modules/get-value/index.js", ++ "is-extendable": "node_modules/is-extendable/index.js", ++ "set-value": "node_modules/set-value/index.js" ++ } ++ ], ++ "node_modules/uniq/uniq.js": [ ++ "//0q47ESfZSFMpCZIPwjhEYUVW2Z/kBQHV+93aaTm6o=", ++ {} ++ ], ++ "node_modules/unordered-array-remove/index.js": [ ++ "fNrhFHBHnJGn7UNtBw9ROQNtQ7VRIyc4WZPr6+Vw3uU=", ++ {} ++ ], ++ "node_modules/unordered-materialized-backrefs/index.js": [ ++ "Zkb8n6UajD/Ixv8CA0KT8NikHzuTMnXxQfpW9Obl9Qw=", ++ {} ++ ], ++ "node_modules/unordered-materialized-bkd/index.js": [ ++ "wXAitLtm/BlHHvcAzRNP8diRd9fZ2mnI+c8EYk2ZjFQ=", ++ { ++ "bkd-tree": "node_modules/bkd-tree/index.js", ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/unordered-materialized-kv/index.js": [ ++ "gnkrr2dKfeCfMkWRugheDGYaJ4xAnBOqu8GYrUrqxT0=", ++ { ++ "once": "node_modules/once/once.js" ++ } ++ ], ++ "node_modules/unordered-set/index.js": [ ++ "O1zj2w3wtvhQmk+hQUJD6+8KkcNjsQh4pYXNZHdMRfc=", ++ {} ++ ], ++ "node_modules/unset-value/index.js": [ ++ "udZGnuv7ue91kOch3Wcw6ChfoYv1xu5uJPEhxq0BKBM=", ++ { ++ "has-value": "node_modules/unset-value/node_modules/has-value/index.js", ++ "isobject": "node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/unset-value/node_modules/has-value/index.js": [ ++ "3H4svKrPegvFEYv535qRaD66Ur8QWZS2XqHevmn45Fc=", ++ { ++ "get-value": "node_modules/get-value/index.js", ++ "has-values": "node_modules/unset-value/node_modules/has-values/index.js", ++ "isobject": "node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js" ++ } ++ ], ++ "node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js": [ ++ "Fn2K6drpeItuKLgFxIHK2rlZYOTj6cpyiu0S6m8UMG8=", ++ { ++ "isarray": "node_modules/isarray/index.js" ++ } ++ ], ++ "node_modules/unset-value/node_modules/has-values/index.js": [ ++ "Iw8W/NTOcztUUWA+PTwKY8BDYt6FgLlxC+5YD6s1VwY=", ++ {} ++ ], ++ "node_modules/uri-js/dist/es5/uri.all.js": [ ++ "oPzGEQ8RVP0ZeozgVuIAjbx9F1D43TunfDkQr5KO06E=", ++ {} ++ ], ++ "node_modules/urix/index.js": [ ++ "XP40+NwNOkvFIgk526qJBAcG20Vn6XY0obpGB37Y8N8=", ++ {} ++ ], ++ "node_modules/url-join/lib/url-join.js": [ ++ "ZMikOSIPafrstr5DYLGTV5c/NVG41Sd0NdDdlwXxnto=", ++ {} ++ ], ++ "node_modules/use/index.js": [ ++ "pj+CMQ8o96Gu2QgkeCbr2+ud+SxJ/S7qpP39EXQX10E=", ++ {} ++ ], ++ "node_modules/util-deprecate/node.js": [ ++ "moain6NKmbhh5wc0X7HR4uVabCPtuPmSvtV8xgf0LY4=", ++ {} ++ ], ++ "node_modules/utils-copy-error/lib/copy.js": [ ++ "24R104ashdwp9Ot/n4n3XreXgqd7XYxM8wEOAuJ7/Vw=", ++ { ++ "object-keys": "node_modules/object-keys/index.js", ++ "utils-copy": "node_modules/utils-copy/lib/index.js" ++ } ++ ], ++ "node_modules/utils-copy-error/lib/index.js": [ ++ "vw2FitHggz8pcRdBfiiTapLSaKzcfIedwVuab+Q3fr0=", ++ { ++ "./copy.js": "node_modules/utils-copy-error/lib/copy.js" ++ } ++ ], ++ "node_modules/utils-copy/lib/deepcopy.js": [ ++ "6MSqJed9MCw4Repw1euoEf9i4Tyc0VbpjzL9N/9Nfck=", ++ { ++ "./typedarrays.js": "node_modules/utils-copy/lib/typedarrays.js", ++ "object-keys": "node_modules/object-keys/index.js", ++ "type-name": "node_modules/type-name/index.js", ++ "utils-copy-error": "node_modules/utils-copy-error/lib/index.js", ++ "utils-indexof": "node_modules/utils-indexof/lib/index.js", ++ "utils-regex-from-string": "node_modules/utils-regex-from-string/lib/index.js", ++ "validate.io-array": "node_modules/validate.io-array/lib/index.js", ++ "validate.io-buffer": "node_modules/validate.io-buffer/lib/index.js" ++ } ++ ], ++ "node_modules/utils-copy/lib/index.js": [ ++ "rPx5+UzIPTBfV96A7sgETQ8v7NNzbFalfSkQcnit2M0=", ++ { ++ "./deepcopy.js": "node_modules/utils-copy/lib/deepcopy.js", ++ "const-pinf-float64": "node_modules/const-pinf-float64/lib/index.js", ++ "validate.io-array": "node_modules/validate.io-array/lib/index.js", ++ "validate.io-nonnegative-integer": "node_modules/validate.io-nonnegative-integer/lib/index.js" ++ } ++ ], ++ "node_modules/utils-copy/lib/typedarrays.js": [ ++ "gNjDx3X2Di7a3ZOH2O0LooOJZ/+HTgNuPVuFl4+MxfA=", ++ { ++ "object-keys": "node_modules/object-keys/index.js" ++ } ++ ], ++ "node_modules/utils-indexof/lib/index.js": [ ++ "m6s8M7wkDDk41prd1B9/UR9rYCIrb8RTUn9H2LpNS0A=", ++ { ++ "validate.io-array-like": "node_modules/validate.io-array-like/lib/index.js", ++ "validate.io-integer-primitive": "node_modules/validate.io-integer-primitive/lib/index.js" ++ } ++ ], ++ "node_modules/utils-regex-from-string/lib/index.js": [ ++ "morbp9uwFYyhrcLud/H2nRfVbJsLgY5zLqylQDynbK4=", ++ { ++ "regex-regex": "node_modules/regex-regex/lib/index.js", ++ "validate.io-string-primitive": "node_modules/validate.io-string-primitive/lib/index.js" ++ } ++ ], ++ "node_modules/utp-native/index.js": [ ++ "I1Bi4+TzdafYd76MMLzewEvICO5kdXjDnHP+bvx3sFU=", ++ { ++ "./lib/binding": "node_modules/utp-native/lib/binding.js", ++ "./lib/connection": "node_modules/utp-native/lib/connection.js", ++ "unordered-set": "node_modules/utp-native/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/utp-native/lib/binding.js": [ ++ "WzKNre0njLjUfksdvgU2CBM5ApO/vI2PRxIeNU0x+sU=", ++ { ++ "node-gyp-build": "node_modules/node-gyp-build/index.js" ++ } ++ ], ++ "node_modules/utp-native/lib/connection.js": [ ++ "AyWoKlH1O5F3CdmphTgpgk+vTNNc3gzQvdGnxgOE5fc=", ++ { ++ "./binding": "node_modules/utp-native/lib/binding.js", ++ "readable-stream": "node_modules/utp-native/node_modules/readable-stream/readable.js", ++ "timeout-refresh": "node_modules/timeout-refresh/index.js", ++ "unordered-set": "node_modules/utp-native/node_modules/unordered-set/index.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/errors.js": [ ++ "cCjMqVsvEkNFvVuBbg2BhOe30gj+Cqdus430PoZE/QM=", ++ {} ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/_stream_duplex.js": [ ++ "w9l2Bit3C0qIyR0kRVe76agotV3C3h+ayFwtXpCTicQ=", ++ { ++ "./_stream_readable": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_readable.js", ++ "./_stream_writable": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_writable.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/_stream_passthrough.js": [ ++ "FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=", ++ { ++ "./_stream_transform": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_transform.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/_stream_readable.js": [ ++ "yNAQ2FGGIJmXpgs88bZTp3qISQo+EeAVwrXrLVbDD+c=", ++ { ++ "../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/async_iterator": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/async_iterator.js", ++ "./internal/streams/buffer_list": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/buffer_list.js", ++ "./internal/streams/destroy": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/from": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/from.js", ++ "./internal/streams/state": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "string_decoder/": "node_modules/string_decoder/lib/string_decoder.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/_stream_transform.js": [ ++ "2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=", ++ { ++ "../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_duplex.js", ++ "inherits": "node_modules/inherits/inherits.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/_stream_writable.js": [ ++ "6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=", ++ { ++ "../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js", ++ "./_stream_duplex": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./internal/streams/destroy": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/destroy.js", ++ "./internal/streams/state": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/state.js", ++ "./internal/streams/stream": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/stream.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "util-deprecate": "node_modules/util-deprecate/node.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/async_iterator.js": [ ++ "OnUvL8sN41MmXy1JKBJhg7WgjZyetqpPq3SAgobmmEQ=", ++ { ++ "./end-of-stream": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/buffer_list.js": [ ++ "EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=", ++ {} ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/destroy.js": [ ++ "VMe5yDGbrv+oOECuVZtZEPUwvcpTApLZvhkCNvIZp7M=", ++ {} ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/end-of-stream.js": [ ++ "ddprWwY0ASAXpiUsbhMDNd53deWgLxCBfQKvR6+ou40=", ++ { ++ "../../../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/from.js": [ ++ "nGfjLk83G3LIMmWgd8fjF4ZhcBNP+NykzCQxPFA3Qms=", ++ { ++ "../../../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/pipeline.js": [ ++ "FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=", ++ { ++ "../../../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js", ++ "./end-of-stream": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/end-of-stream.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/state.js": [ ++ "zb7ZljS1I75lUiXfFUfNACleMEHLAoSMZS3a1eZ4fkk=", ++ { ++ "../../../errors": "node_modules/utp-native/node_modules/readable-stream/errors.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/stream.js": [ ++ "HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=", ++ {} ++ ], ++ "node_modules/utp-native/node_modules/readable-stream/readable.js": [ ++ "KUTx08jF1cXgfnww1svvX8N0QLfHPeR66zf6hCTwS/E=", ++ { ++ "./lib/_stream_duplex.js": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_duplex.js", ++ "./lib/_stream_passthrough.js": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_passthrough.js", ++ "./lib/_stream_readable.js": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_readable.js", ++ "./lib/_stream_transform.js": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_transform.js", ++ "./lib/_stream_writable.js": "node_modules/utp-native/node_modules/readable-stream/lib/_stream_writable.js", ++ "./lib/internal/streams/end-of-stream.js": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/end-of-stream.js", ++ "./lib/internal/streams/pipeline.js": "node_modules/utp-native/node_modules/readable-stream/lib/internal/streams/pipeline.js" ++ } ++ ], ++ "node_modules/utp-native/node_modules/unordered-set/index.js": [ ++ "9WIkMme+D8oq5P1vgQwPW/j0Ow9ITQKqD+oP5K4UjFA=", ++ {} ++ ], ++ "node_modules/validate.io-array-like/lib/index.js": [ ++ "jFfKNvWyCRopZ47zY3QNO8Uu1p/dM8pK2ugAemCvO74=", ++ { ++ "const-max-uint32": "node_modules/const-max-uint32/lib/index.js", ++ "validate.io-integer-primitive": "node_modules/validate.io-integer-primitive/lib/index.js" ++ } ++ ], ++ "node_modules/validate.io-array/lib/index.js": [ ++ "nOF+sBpGj2DFggoik4Nvu3/baBRMph5lkYBRSKOtTEo=", ++ {} ++ ], ++ "node_modules/validate.io-buffer/lib/index.js": [ ++ "zcqPpD5cwTJU+/xzZ/7kDBanT6MeWnT6Neydqn1iArQ=", ++ {} ++ ], ++ "node_modules/validate.io-integer-primitive/lib/index.js": [ ++ "EHx7x7baWhz1MjyG4uQbRxUba1yNguN8IjkoYXWXG1w=", ++ { ++ "validate.io-number-primitive": "node_modules/validate.io-number-primitive/lib/index.js" ++ } ++ ], ++ "node_modules/validate.io-integer/lib/index.js": [ ++ "nEkTenreKRiDYqYqSB47OJI1HETmOfndQ0LIwVDdGQQ=", ++ { ++ "validate.io-number": "node_modules/validate.io-number/lib/index.js" ++ } ++ ], ++ "node_modules/validate.io-nonnegative-integer/lib/index.js": [ ++ "Gkkgd6s18fHFANTg7jEgWNiB/ymcq2jvIZcVgXSm3Ls=", ++ { ++ "validate.io-integer": "node_modules/validate.io-integer/lib/index.js" ++ } ++ ], ++ "node_modules/validate.io-number-primitive/lib/index.js": [ ++ "nTV18Uckia4atRZ6wq4WWgPlKT3EBnJTXYtUHKhsRIY=", ++ {} ++ ], ++ "node_modules/validate.io-number/lib/index.js": [ ++ "cicoV1KprXPIMMviRyR193FGdBReZXnEivcbzCUHr7w=", ++ {} ++ ], ++ "node_modules/validate.io-string-primitive/lib/index.js": [ ++ "arDKx3jkkFEL9fr7+EPj34fuET2++/nq5lwQiovuYio=", ++ {} ++ ], ++ "node_modules/varint/decode.js": [ ++ "mZpZKFOLB8IYlcS4wUMqNYUVdi3TossOYeQUgVf58Ek=", ++ {} ++ ], ++ "node_modules/varint/encode.js": [ ++ "MOaFSzZeJ/pFf1bOYLzmtaAS2kSjjg2M11K5mzCm/hc=", ++ {} ++ ], ++ "node_modules/varint/index.js": [ ++ "VVUHV3nLLb95odzcH12MZg9hHpE4e0UwHt9yLqgzvok=", ++ { ++ "./decode.js": "node_modules/varint/decode.js", ++ "./encode.js": "node_modules/varint/encode.js", ++ "./length.js": "node_modules/varint/length.js" ++ } ++ ], ++ "node_modules/varint/length.js": [ ++ "0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=", ++ {} ++ ], ++ "node_modules/websocket-stream/index.js": [ ++ "/LhrfcjHmG4b2F+SWYFQjXHP1y0iylFh0eC6ggtv7I0=", ++ { ++ "./server.js": "node_modules/websocket-stream/server.js", ++ "./stream.js": "node_modules/websocket-stream/stream.js" ++ } ++ ], ++ "node_modules/websocket-stream/node_modules/duplexify/index.js": [ ++ "URH1i1nSOoq06A1p5dBljs+gli/7GugC1KkdSmyE/pc=", ++ { ++ "end-of-stream": "node_modules/end-of-stream/index.js", ++ "inherits": "node_modules/inherits/inherits.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "stream-shift": "node_modules/stream-shift/index.js" ++ } ++ ], ++ "node_modules/websocket-stream/server.js": [ ++ "szWeYsoZmMwEK9OXIuAyYuZEjlTEF6K2JjCkTRarrmc=", ++ { ++ "./stream": "node_modules/websocket-stream/stream.js", ++ "ws": "node_modules/ws/index.js" ++ } ++ ], ++ "node_modules/websocket-stream/stream.js": [ ++ "lwtLgiYum/slPdRmJzziODevFvyNUmAMnxMoO4zn9no=", ++ { ++ "duplexify": "node_modules/websocket-stream/node_modules/duplexify/index.js", ++ "readable-stream": "node_modules/readable-stream/readable.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js", ++ "ws": "node_modules/ws/index.js" ++ } ++ ], ++ "node_modules/wgs84/index.js": [ ++ "CXa3ejjhV13sEyge5Yy2d22OqTWgqxWsESN/F7349n4=", ++ {} ++ ], ++ "node_modules/wrappy/wrappy.js": [ ++ "FTRTxNhKPC8TWJw3BVp9r/YdSEddzOVU9+7a0V/Hs+U=", ++ {} ++ ], ++ "node_modules/ws/index.js": [ ++ "7ONk1h9UbeLlNt8JEDNjsRDzMBqEshHq+FwPCxwSOtw=", ++ { ++ "./lib/Receiver": "node_modules/ws/lib/Receiver.js", ++ "./lib/Sender": "node_modules/ws/lib/Sender.js", ++ "./lib/WebSocket": "node_modules/ws/lib/WebSocket.js", ++ "./lib/WebSocketServer": "node_modules/ws/lib/WebSocketServer.js" ++ } ++ ], ++ "node_modules/ws/lib/BufferUtil.js": [ ++ "YDUsoEwDaRhmEO/U+p7WsqrfGZwsqu2c/fh9ngE60j0=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/ws/lib/Constants.js": [ ++ "nUKBOhw/XKefgL3fKbYme7pe3Glzq5XbeOuOpSMtWHE=", ++ { ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/ws/lib/ErrorCodes.js": [ ++ "ElljIjoS0lc6Vz61FjPAe+Ems8fiUooA2Bywyh8PgQY=", ++ {} ++ ], ++ "node_modules/ws/lib/EventTarget.js": [ ++ "wVceO0zBSDLugck3/TH7J6XyvjkC8ahW6AYxIcOjA3o=", ++ {} ++ ], ++ "node_modules/ws/lib/Extensions.js": [ ++ "v6/R+UHs/jH+jydduQdJXQYynBbNGhgeNdbojls7K6U=", ++ {} ++ ], ++ "node_modules/ws/lib/PerMessageDeflate.js": [ ++ "JXw1D7La1gdPEJXH8inkV/9Ekvf3JPYiuxoCiiVbpYE=", ++ { ++ "./BufferUtil": "node_modules/ws/lib/BufferUtil.js", ++ "async-limiter": "node_modules/async-limiter/index.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/ws/lib/Receiver.js": [ ++ "p3EH1xZ7T6GFCWzz71MaoLThmFaa93MgCxn778WViwI=", ++ { ++ "./BufferUtil": "node_modules/ws/lib/BufferUtil.js", ++ "./Constants": "node_modules/ws/lib/Constants.js", ++ "./ErrorCodes": "node_modules/ws/lib/ErrorCodes.js", ++ "./PerMessageDeflate": "node_modules/ws/lib/PerMessageDeflate.js", ++ "./Validation": "node_modules/ws/lib/Validation.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/ws/lib/Sender.js": [ ++ "WbeuQO62GQLjRZ+8w1n7liKRl9kPF/B13OsPxN4YZa0=", ++ { ++ "./BufferUtil": "node_modules/ws/lib/BufferUtil.js", ++ "./Constants": "node_modules/ws/lib/Constants.js", ++ "./ErrorCodes": "node_modules/ws/lib/ErrorCodes.js", ++ "./PerMessageDeflate": "node_modules/ws/lib/PerMessageDeflate.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js" ++ } ++ ], ++ "node_modules/ws/lib/Validation.js": [ ++ "4/8uLHmK7Sv3z9Zo/iFxgX3UaWCA3nzh/TtcF2m+z2s=", ++ {} ++ ], ++ "node_modules/ws/lib/WebSocket.js": [ ++ "4GRDy1YX7zT/UIqqC38MBvLEX0CoGgrUGLsl5/ecYGE=", ++ { ++ "./Constants": "node_modules/ws/lib/Constants.js", ++ "./EventTarget": "node_modules/ws/lib/EventTarget.js", ++ "./Extensions": "node_modules/ws/lib/Extensions.js", ++ "./PerMessageDeflate": "node_modules/ws/lib/PerMessageDeflate.js", ++ "./Receiver": "node_modules/ws/lib/Receiver.js", ++ "./Sender": "node_modules/ws/lib/Sender.js", ++ "ultron": "node_modules/ultron/index.js" ++ } ++ ], ++ "node_modules/ws/lib/WebSocketServer.js": [ ++ "avDRcFUXNqmtM9IFpc4L5+bww4GGWHXzdYD+f+pt1fk=", ++ { ++ "./Constants": "node_modules/ws/lib/Constants.js", ++ "./Extensions": "node_modules/ws/lib/Extensions.js", ++ "./PerMessageDeflate": "node_modules/ws/lib/PerMessageDeflate.js", ++ "./WebSocket": "node_modules/ws/lib/WebSocket.js", ++ "safe-buffer": "node_modules/safe-buffer/index.js", ++ "ultron": "node_modules/ultron/index.js" ++ } ++ ], ++ "node_modules/xsalsa20/index.js": [ ++ "WyOzUvyBhyVytYF6CTDOhCD8akwTptJD1Czkip2kd/A=", ++ { ++ "./xsalsa20": "node_modules/xsalsa20/xsalsa20.js" ++ } ++ ], ++ "node_modules/xsalsa20/xsalsa20.js": [ ++ "EgXGufdeMZr4ZeIWQFt9k/8/COAIrh2Khp4pHtpeBPM=", ++ {} ++ ], ++ "node_modules/xtend/immutable.js": [ ++ "BJhvFouPFvTyUjfQYIzfV7bKFPEA/tYsApW9olWasks=", ++ {} ++ ], ++ "node_modules/xtend/mutable.js": [ ++ "caOGScd0CCF0g/gfVdruHWZG1sZw49A0pEgss0U4huk=", ++ {} ++ ], ++ "node_modules/yallist/iterator.js": [ ++ "0CRR+jlt5/nsk8xvs7B6qnvmN6yzQJqd3r0cLeknnBo=", ++ {} ++ ], ++ "node_modules/yallist/yallist.js": [ ++ "aaEPcm0m+NgEo96urInwEG3foD1XbROXEAL//I8OilY=", ++ { ++ "./iterator.js": "node_modules/yallist/iterator.js" ++ } ++ ], ++ "node_modules/yauzl/index.js": [ ++ "WDxFVHGMuu5RidDijb10gKB2bnhTBOO80qytgLLLZJc=", ++ { ++ "buffer-crc32": "node_modules/buffer-crc32/index.js", ++ "fd-slicer": "node_modules/fd-slicer/index.js" ++ } ++ ], ++ "server.js": [ ++ "m6tylphWr6WZK7r6Sf9xL6Nc3NRaFscQrz1xwzAQDMU=", ++ { ++ "./index": "index.js", ++ "./upgrade-manager": "upgrade-manager/index.js", ++ "debug": "node_modules/debug/src/index.js", ++ "kappa-core": "node_modules/kappa-core/index.js", ++ "kappa-osm": "node_modules/kappa-osm/index.js", ++ "level": "node_modules/level/level.js", ++ "lodash/throttle": "node_modules/lodash/throttle.js", ++ "mapeo-server": "node_modules/mapeo-server/index.js", ++ "mkdirp": "node_modules/mkdirp/index.js", ++ "pump": "node_modules/pump/index.js", ++ "random-access-file": "node_modules/random-access-file/index.js", ++ "rimraf": "node_modules/rimraf/rimraf.js", ++ "safe-fs-blob-store": "node_modules/safe-fs-blob-store/index.js", ++ "semver/functions/coerce": "node_modules/semver/functions/coerce.js", ++ "serialize-error": "node_modules/serialize-error/index.js", ++ "tar-fs": "node_modules/tar-fs/index.js" ++ } ++ ], ++ "status.js": [ ++ "w61Ht0qGD0v9dg+p6HjQzwYL4OBnW5KYmWu3Ko45bss=", ++ { ++ "./constants": "constants.js", ++ "./index": "index.js", ++ "debug": "node_modules/debug/src/index.js" ++ } ++ ], ++ "upgrade-manager/async-service.js": [ ++ "j2sXiLdmrgBYsLtIOPcfN5fhUhLzjJuQ3gEvbjJwKe0=", ++ { ++ "tiny-typed-emitter": "node_modules/tiny-typed-emitter/lib/index.js" ++ } ++ ], ++ "upgrade-manager/index.js": [ ++ "oKkJptvQ67JrmQ8jfag/ZNvUjns+35BjDh/guAVGGE0=", ++ { ++ "./async-service": "upgrade-manager/async-service.js", ++ "./upgrade-discovery": "upgrade-manager/upgrade-discovery.js", ++ "./upgrade-server": "upgrade-manager/upgrade-server.js", ++ "./upgrade-storage": "upgrade-manager/upgrade-storage.js", ++ "./utils": "upgrade-manager/utils.js", ++ "debug": "node_modules/debug/src/index.js", ++ "get-port": "node_modules/get-port/index.js", ++ "progress-stream": "node_modules/progress-stream/index.js" ++ } ++ ], ++ "upgrade-manager/schema.js": [ ++ "pZzYM/oU76emDAK7uaLQXgsKkFfH1dJPYMa57iLhiIo=", ++ { ++ "@sinclair/typebox": "node_modules/@sinclair/typebox/typebox.js", ++ "ajv": "node_modules/ajv/dist/ajv.js", ++ "ajv-formats": "node_modules/ajv-formats/dist/index.js" ++ } ++ ], ++ "upgrade-manager/upgrade-discovery.js": [ ++ "DoBz2lxzVwMiEx3jjP/YgY8ZlLeWjnUL5IC3U2yHj3I=", ++ { ++ "./async-service": "upgrade-manager/async-service.js", ++ "./schema": "upgrade-manager/schema.js", ++ "./utils": "upgrade-manager/utils.js", ++ "agentkeepalive": "node_modules/agentkeepalive/index.js", ++ "debug": "node_modules/debug/src/index.js", ++ "dns-discovery": "node_modules/dns-discovery/index.js", ++ "got": "node_modules/got/dist/source/index.js", ++ "lodash/throttle": "node_modules/lodash/throttle.js", ++ "network-address": "node_modules/network-address/index.js", ++ "secure-json-parse": "node_modules/secure-json-parse/index.js" ++ } ++ ], ++ "upgrade-manager/upgrade-server.js": [ ++ "UTpZj7B6K1o+SFKpv9a/O27Dz0d/hjzitVgLjm6knAA=", ++ { ++ "./async-service": "upgrade-manager/async-service.js", ++ "./schema": "upgrade-manager/schema.js", ++ "./utils": "upgrade-manager/utils.js", ++ "debug": "node_modules/debug/src/index.js", ++ "fastify": "node_modules/fastify/fastify.js", ++ "lodash/throttle": "node_modules/lodash/throttle.js", ++ "progress-stream": "node_modules/progress-stream/index.js", ++ "pump": "node_modules/pump/index.js" ++ } ++ ], ++ "upgrade-manager/upgrade-storage.js": [ ++ "TZagrrHc7m7Ou4iD1rspEIVDFcLNS7n/hiiJLMCSe9g=", ++ { ++ "./async-service": "upgrade-manager/async-service.js", ++ "./utils": "upgrade-manager/utils.js", ++ "debug": "node_modules/debug/src/index.js", ++ "duplexify": "node_modules/duplexify/index.js", ++ "mkdirp": "node_modules/mkdirp/index.js", ++ "rimraf": "node_modules/rimraf/rimraf.js" ++ } ++ ], ++ "upgrade-manager/utils.js": [ ++ "IZuq0cAyUe3PB3D/nmFS4m2xj4grfXmt5tNY/LZkLCw=", ++ { ++ "@gmaclennan/zip-fs": "node_modules/@gmaclennan/zip-fs/index.js", ++ "app-info-parser/src/apk": "node_modules/app-info-parser/src/apk.js", ++ "debug": "node_modules/debug/src/index.js", ++ "hasha": "node_modules/hasha/index.js", ++ "p-defer": "node_modules/p-defer/index.js", ++ "semver": "node_modules/semver/index.js", ++ "utils-copy-error": "node_modules/utils-copy-error/lib/index.js" ++ } ++ ] ++}, ++"index.js") +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/loader.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/loader.js +new file mode 100644 +index 0000000..bf5b955 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/loader.js +@@ -0,0 +1,10 @@ ++const os = require("os"); ++const path = require("path"); ++const rnBridge = require("rn-bridge"); ++ ++const nodejsProjectDir = path.resolve(rnBridge.app.datadir(), "nodejs-project"); ++os.homedir = () => nodejsProjectDir; ++process.cwd = () => nodejsProjectDir; ++process.env = process.env || {}; ++process.env.CHLORIDE_JS = "yes"; // Use WebAssembly libsodium ++require("./index"); +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/hasha/thread.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/hasha/thread.js +new file mode 100644 +index 0000000..3d4510c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/hasha/thread.js +@@ -0,0 +1,57 @@ ++'use strict'; ++const fs = require('fs'); ++const crypto = require('crypto'); ++const {parentPort} = require('worker_threads'); ++ ++const handlers = { ++ hashFile: (algorithm, filePath) => new Promise((resolve, reject) => { ++ const hasher = crypto.createHash(algorithm); ++ fs.createReadStream(filePath) ++ // TODO: Use `Stream.pipeline` when targeting Node.js 12. ++ .on('error', reject) ++ .pipe(hasher) ++ .on('error', reject) ++ .on('finish', () => { ++ const {buffer} = new Uint8Array(hasher.read()); ++ resolve({value: buffer, transferList: [buffer]}); ++ }); ++ }), ++ hash: async (algorithm, input) => { ++ const hasher = crypto.createHash(algorithm); ++ ++ if (Array.isArray(input)) { ++ for (const part of input) { ++ hasher.update(part); ++ } ++ } else { ++ hasher.update(input); ++ } ++ ++ const {buffer} = new Uint8Array(hasher.digest()); ++ return {value: buffer, transferList: [buffer]}; ++ } ++}; ++ ++parentPort.on('message', async message => { ++ try { ++ const {method, args} = message; ++ const handler = handlers[method]; ++ ++ if (handler === undefined) { ++ throw new Error(`Unknown method '${method}'`); ++ } ++ ++ const {value, transferList} = await handler(...args); ++ parentPort.postMessage({id: message.id, value}, transferList); ++ } catch (error) { ++ const newError = {message: error.message, stack: error.stack}; ++ ++ for (const [key, value] of Object.entries(error)) { ++ if (typeof value !== 'object') { ++ newError[key] = value; ++ } ++ } ++ ++ parentPort.postMessage({id: message.id, error: newError}); ++ } ++}); +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CHANGELOG.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CHANGELOG.md +new file mode 100644 +index 0000000..ddd2e54 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CHANGELOG.md +@@ -0,0 +1,1274 @@ ++# Changelog ++ ++_**If you are upgrading:** please see [`UPGRADING.md`](UPGRADING.md)._ ++ ++## [5.6.0] - 2020-03-27 ++ ++### Changed ++ ++- Upgrade `nyc` devDependency from `^14.0.0` to `^15.0.0` ([#696](https://github.com/Level/leveldown/issues/696)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `electron` devDependency from `^7.0.1` to `^8.0.0` ([#700](https://github.com/Level/leveldown/issues/700)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Restore Windows 32-bit prebuild ([#711](https://github.com/Level/leveldown/issues/711)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.5.1] - 2020-02-24 ++ ++### Fixed ++ ++- Fix android arm64 prebuild by disabling exceptions ([#706](https://github.com/Level/leveldown/issues/706)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.5.0] - 2020-02-19 ++ ++### Changed ++ ++- Refactor initial seek ([#689](https://github.com/Level/leveldown/issues/689)) ([**@vweevers**](https://github.com/vweevers)) ++- Refactor: move `CheckEndCallback` to `Iterator` ([#690](https://github.com/Level/leveldown/issues/690)) ([**@vweevers**](https://github.com/vweevers)) ++- Use `prebuildify-cross` ([#694](https://github.com/Level/leveldown/issues/694)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `electron` devDependency from `^6.0.12` to `^7.0.1` ([`d092e6b`](https://github.com/Level/leveldown/commit/d092e6b)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add ARMv6 prebuild ([#704](https://github.com/Level/leveldown/issues/704)) ([**@christianbundy**](https://github.com/christianbundy)) ++ ++## [5.4.1] - 2019-10-26 ++ ++### Fixed ++ ++- Hide symbols on mac with `-fvisibility=hidden` ([#688](https://github.com/Level/leveldown/issues/688)) ([**@vweevers**](https://github.com/vweevers)) ++- Fix `test-gc` npm script ([#691](https://github.com/Level/leveldown/issues/691)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.4.0] - 2019-10-19 ++ ++### Changed ++ ++- Refactor initialization of range options ([#681](https://github.com/Level/leveldown/issues/681)) ([**@vweevers**](https://github.com/vweevers)) ++- Make iterator seek target a local variable ([#683](https://github.com/Level/leveldown/issues/683)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `node-gyp` devDependency from `^5.0.0` to `^6.0.0` ([#677](https://github.com/Level/leveldown/issues/677)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `dependency-check` devDependency from `^3.3.0` to `^4.1.0` ([`8965e58`](https://github.com/Level/leveldown/commit/8965e58)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add manifest ([Level/community#83](https://github.com/Level/community/issues/83)) ([#685](https://github.com/Level/leveldown/issues/685)) ([**@vweevers**](https://github.com/vweevers)) ++- Add Cirrus CI for FreeBSD tests :sparkles: ([#678](https://github.com/Level/leveldown/issues/678), [`55f30a3`](https://github.com/Level/leveldown/commit/55f30a3)) ([**@vweevers**](https://github.com/vweevers)) ++- Test that empty range options are ignored ([#684](https://github.com/Level/leveldown/issues/684)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.3.0] - 2019-10-04 ++ ++### Changed ++ ++- Replace Ubuntu 16.04 with CentOS 7 for prebuilds ([#674](https://github.com/Level/leveldown/issues/674)) ([**@rvagg**](https://github.com/rvagg)). This makes the prebuilt binary for linux compatible with Debian 8, Ubuntu 14.04, RHEL 7, CentOS 7 and other flavors with an old glibc. ++ ++### Added ++ ++- Add platform-specific notes ([#672](https://github.com/Level/leveldown/issues/672), [`e359e7a`](https://github.com/Level/leveldown/commit/e359e7a)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.3.0-0] - 2019-10-04 ++ ++**Historical Note** This was a prerelease of 5.3.0 for testing purposes. Changes listed above. ++ ++## [5.2.1] - 2019-09-20 ++ ++### Added ++ ++- Document minimum version for node 12 ([`9748454`](https://github.com/Level/leveldown/commit/9748454)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Close db in `stack-blower` test ([#668](https://github.com/Level/leveldown/issues/668)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.2.0] - 2019-09-06 ++ ++### Changed ++ ++- Upgrade `abstract-leveldown` from `~6.0.3` to `~6.1.1` ([#660](https://github.com/Level/leveldown/issues/660)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `napi-macros` from `~1.8.1` to `~2.0.0` ([#657](https://github.com/Level/leveldown/issues/657)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `hallmark` devDependency from `^0.1.0` to `^2.0.0` ([#654](https://github.com/Level/leveldown/issues/654), [#663](https://github.com/Level/leveldown/issues/663)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `standard` devDependency from `^12.0.0` to `^14.0.0` ([#653](https://github.com/Level/leveldown/issues/653), [#661](https://github.com/Level/leveldown/issues/661)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `rimraf` devDependency from `^2.6.1` to `^3.0.0` ([#658](https://github.com/Level/leveldown/issues/658)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `electron` devDependency from `^5.0.0` to `^6.0.0` ([#656](https://github.com/Level/leveldown/issues/656)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add [`db.clear()`](https://github.com/Level/abstract-leveldown#dbclearoptions-callback) method (courtesy of `abstract-leveldown`) ([#660](https://github.com/Level/leveldown/issues/660)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.1.1] - 2019-06-28 ++ ++### Changed ++ ++- Remove `fast-future` in favor of native cache limit ([#638](https://github.com/Level/leveldown/issues/638)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `delayed` devDependency from `^1.0.1` to `^2.0.0` ([#650](https://github.com/Level/leveldown/issues/650)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `readfiletree` devDependency from `~0.0.1` to `^1.0.0` ([#648](https://github.com/Level/leveldown/issues/648)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `du` devDependency from `~0.1.0` to `^1.0.0` ([#649](https://github.com/Level/leveldown/issues/649)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `mkfiletree` devDependency from `^1.0.1` to `^2.0.0` ([#647](https://github.com/Level/leveldown/issues/647)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `node-gyp` devDependency from `^4.0.0` to `^5.0.0` ([#642](https://github.com/Level/leveldown/issues/642)) ([**@vweevers**](https://github.com/vweevers)) ++- Replace `async` devDependency with `async-each` ([#637](https://github.com/Level/leveldown/issues/637)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove benchmarks (moved to `level-bench`) ([#635](https://github.com/Level/leveldown/issues/635)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Fix batch compression test to actually compress ([#651](https://github.com/Level/leveldown/issues/651)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.1.0] - 2019-05-18 ++ ++### Changed ++ ++- Upgrade `node-gyp-build` from `~3.8.0` to `~4.1.0` ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `prebuildify` devDependency from `prebuild/prebuildify#override-platform` to `^3.0.0` ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `electron` devDependency from `^4.1.2` to `^5.0.0` ([#616](https://github.com/Level/leveldown/issues/616)) ([**@vweevers**](https://github.com/vweevers)) ++- CI optimization: skip initial compilation in Travis `arm` job ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++- CI optimization: skip redundant `npm install` in `arm` containers ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add Alpine (musl) prebuild ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++- Add `test-prebuild` npm script ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++- Document behavior of pending operations on close ([`687a6a1`](https://github.com/Level/leveldown/commit/687a6a1)) ([**@vweevers**](https://github.com/vweevers)) ++- Update `Supported Platforms` in `README.md` ([`4f5c9cc`](https://github.com/Level/leveldown/commit/4f5c9cc)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Add `armv` tag to ARM prebuilds (to ensure ARM version matches) ([#625](https://github.com/Level/leveldown/issues/625)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.0.3] - 2019-04-26 ++ ++### Changed ++ ++- Upgrade `node-gyp` from `^3.8.0` to `^4.0.0` ([#614](https://github.com/Level/leveldown/issues/614)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Refactor worker cleanup into `BaseWorker::DoFinally()` ([#617](https://github.com/Level/leveldown/issues/617)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Clarify expected behavior in `iterator-test` ([`31b66cf`](https://github.com/Level/leveldown/commit/31b66cf)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Prevent segfault: create reference to chained batch object ([#621](https://github.com/Level/leveldown/issues/621)) ([**@vweevers**](https://github.com/vweevers)) ++- Skip writing empty (chained) batch and make callbacks asynchronous ([#619](https://github.com/Level/leveldown/issues/619)) ([**@vweevers**](https://github.com/vweevers)) ++- Throw error in `iterator_seek` if iterator has ended ([#618](https://github.com/Level/leveldown/issues/618)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.0.2] - 2019-04-23 ++ ++### Changed ++ ++- Upgrade `nyc` devDependency from `^13.2.0` to `^14.0.0` ([#610](https://github.com/Level/leveldown/issues/610)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `tempy` devDependency from `^0.2.1` to `^0.3.0` ([#611](https://github.com/Level/leveldown/issues/611)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Prevent segfaults: defer closing until all operations are done ([#612](https://github.com/Level/leveldown/issues/612)) ([**@vweevers**](https://github.com/vweevers)) ++- Fix level badge ([`0ce45db`](https://github.com/Level/leveldown/commit/0ce45db)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove link to dead website ([`091f784`](https://github.com/Level/leveldown/commit/091f784)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.0.1] - 2019-04-07 ++ ++### Added ++ ++- Test Electron in Travis and AppVeyor ([#607](https://github.com/Level/leveldown/issues/607)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove `slump` devDependency ([`38ff274`](https://github.com/Level/leveldown/commit/38ff274)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove Electron prebuilds in favor of runtime-agnostic prebuilds ([#608](https://github.com/Level/leveldown/issues/608)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Temporarily skip `hallmark` test because it breaks CITGM ([#606](https://github.com/Level/leveldown/issues/606)) ([**@vweevers**](https://github.com/vweevers)) ++ ++**Historical Note** Although CITGM landed support for git repositories in response to v5.0.0 which fixes our use of git submodules and `hallmark`, we're keeping `hallmark` disabled because it is still experimental and technically out of scope for CITGM. ++ ++## [5.0.0] - 2019-03-29 ++ ++### Changed ++ ++- Rewrite as N-API addon ([#540](https://github.com/Level/leveldown/issues/540), [#559](https://github.com/Level/leveldown/issues/559)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `prebuildify` instead of `prebuild` ([#549](https://github.com/Level/leveldown/issues/549), [#562](https://github.com/Level/leveldown/issues/562), [#571](https://github.com/Level/leveldown/issues/571)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update minimum node version required ([#552](https://github.com/Level/leveldown/issues/552)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade Snappy from `1.1.4` to `1.1.7` as a git submodule ([#522](https://github.com/Level/leveldown/issues/522), [#535](https://github.com/Level/leveldown/issues/535)) ([**@filoozom**](https://github.com/filoozom)) ++- Upgrade `abstract-leveldown` from `~5.0.0` to `~6.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ([#511](https://github.com/Level/leveldown/issues/511)) ++- Implement abstract `_serializeKey()` and `_serializeValue()` ([#506](https://github.com/Level/leveldown/issues/506)) ([**@vweevers**](https://github.com/vweevers)) ++- Implement abstract `_seek()` instead of `seek()` ([#506](https://github.com/Level/leveldown/issues/506)) ([**@vweevers**](https://github.com/vweevers)) ++- Invoke abstract tests from single function ([#495](https://github.com/Level/leveldown/issues/495)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `suite.common()` in `test/common.js` ([`7b0f6d9`](https://github.com/Level/leveldown/commit/7b0f6d9)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Handle `location` in `LevelDOWN` constructor, as `location` was removed from `abstract-leveldown` ([#494](https://github.com/Level/leveldown/issues/494)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Pass a factory function to abstract tests ([#494](https://github.com/Level/leveldown/issues/494)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `tempy` in tests, removing need for cleanup ([#494](https://github.com/Level/leveldown/issues/494)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `level-concat-iterator` in tests ([#494](https://github.com/Level/leveldown/issues/494)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Make callback of `makeTest` an error-first callback ([#518](https://github.com/Level/leveldown/issues/518)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `standard` devDependency from `^11.0.1` to `^12.0.0` ([#503](https://github.com/Level/leveldown/issues/503)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade `slump` devDependency from `~2.0.0` to `~3.0.0` ([#504](https://github.com/Level/leveldown/issues/504)) ([**@vweevers**](https://github.com/vweevers)) ++- Normalize gyp files (indentation and double quotes) ([#539](https://github.com/Level/leveldown/issues/539)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Tweak benchmarks ([#545](https://github.com/Level/leveldown/issues/545), [#546](https://github.com/Level/leveldown/issues/546)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Tweak changelog ([#483](https://github.com/Level/leveldown/issues/483)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Tweak copyright years for less maintenance ([`98cbb4f`](https://github.com/Level/leveldown/commit/98cbb4f)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Document new platform support and prebuilt binaries ([#558](https://github.com/Level/leveldown/issues/558), [#563](https://github.com/Level/leveldown/issues/563)) ([**@vweevers**](https://github.com/vweevers)) ++- Replace `remark-cli` with `hallmark` ([#548](https://github.com/Level/leveldown/issues/548)) ([**@vweevers**](https://github.com/vweevers)) ++- Update `.npmignore` ([**@vweevers**](https://github.com/vweevers)) ++- Apply common project tweaks ([#580](https://github.com/Level/leveldown/issues/580), [#582](https://github.com/Level/leveldown/issues/582), [`1c90e8f`](https://github.com/Level/leveldown/commit/1c90e8f)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Introduce `override` and `final` keywords following C++ Core Guidelines ([#600](https://github.com/Level/leveldown/issues/600)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add `linux-armv7`, `linux-arm64`, `android-armv7` and `android-arm64` prebuilds ([#584](https://github.com/Level/leveldown/issues/584), [#585](https://github.com/Level/leveldown/issues/585), [#587](https://github.com/Level/leveldown/issues/587)) ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ++- Add segfault tests ([#514](https://github.com/Level/leveldown/issues/514)) ([**@vweevers**](https://github.com/vweevers)) ++- Add `nyc` and `coveralls` for code coverage ([#497](https://github.com/Level/leveldown/issues/497), [#591](https://github.com/Level/leveldown/issues/591)) ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ++- Copy type checks of `approximateSize()` to `compactRange()` ([#517](https://github.com/Level/leveldown/issues/517)) ([**@vweevers**](https://github.com/vweevers)) ++- Document that value may not be `null` or `undefined` ([#511](https://github.com/Level/leveldown/issues/511)) ([**@vweevers**](https://github.com/vweevers)) ++- Document `batch()` (array and chained form), `sync` option and `db` references ([#556](https://github.com/Level/leveldown/issues/556)) ([**@vweevers**](https://github.com/vweevers)) ++- Add publish instructions and `download-prebuilds` npm script ([#564](https://github.com/Level/leveldown/issues/564)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove node 6 and 9 from Travis ([`0f5f554`](https://github.com/Level/leveldown/commit/0f5f554), [#562](https://github.com/Level/leveldown/issues/562)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove 32 bits from AppVeyor ([#560](https://github.com/Level/leveldown/issues/560)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove unused `.jshintrc` ([`1d122b0`](https://github.com/Level/leveldown/commit/1d122b0)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove copyright headers from code ([`508027d`](https://github.com/Level/leveldown/commit/508027d)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove contributors from `package.json` ([`8a29ecc`](https://github.com/Level/leveldown/commit/8a29ecc)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove `g++-4.8` apt package from Travis ([#489](https://github.com/Level/leveldown/issues/489)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove unused `key` argument from `ChainedBatch#_clear` ([#519](https://github.com/Level/leveldown/issues/519)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove redundant `db.close()` from `test/approximate-size-test.js` ([`d04f233`](https://github.com/Level/leveldown/commit/d04f233)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Moved seek tests to `abstract-leveldown` ([#508](https://github.com/Level/leveldown/issues/508)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove unused `iota-array` and `lexicographic-integer` devDependencies ([#508](https://github.com/Level/leveldown/issues/508)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove `xcacheSize` and `xmaxOpenFiles` from leak tests ([#569](https://github.com/Level/leveldown/issues/569)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove legacy `bindings` dependency ([#583](https://github.com/Level/leveldown/issues/583)) ([**@peakji**](https://github.com/peakji)) ++ ++### Fixed ++ ++- Serialize `compactRange()` arguments ([#517](https://github.com/Level/leveldown/issues/517)) ([**@vweevers**](https://github.com/vweevers)) ++- Prevent segfault: when calling `iterator()` on non-open db ([#514](https://github.com/Level/leveldown/issues/514)) ([**@vweevers**](https://github.com/vweevers)) ++- Prevent segfault: add `PriorityWorker` to defer closing until `put` is done ([#597](https://github.com/Level/leveldown/issues/597)) ([**@vweevers**](https://github.com/vweevers)) ++- Prevent segfault: keep persistent references to iterators until they are ended ([#597](https://github.com/Level/leveldown/issues/597)) ([**@vweevers**](https://github.com/vweevers)) ++- Gitignore Debug builds of LevelDB and Snappy ([#597](https://github.com/Level/leveldown/issues/597)) ([**@vweevers**](https://github.com/vweevers)) ++- Fix subtests by adding `t.plan()` ([#594](https://github.com/Level/leveldown/issues/594)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [4.0.2] - 2019-03-02 ++ ++### Changed ++ ++- Upgrade `nan` from `~2.10.0` to `~2.12.1` ([#596](https://github.com/Level/leveldown/pull/596)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `prebuild-install` from `^4.0.0` to `~5.2.4` ([#596](https://github.com/Level/leveldown/pull/596)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `prebuild` devDependency from `^7.0.0` to `^8.1.2` ([#596](https://github.com/Level/leveldown/pull/596)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add Node.js 11 to Travis and AppVeyor ([#596](https://github.com/Level/leveldown/pull/596)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [4.0.1] - 2018-05-22 ++ ++### Changed ++ ++- Upgrade to `abstract-leveldown@~5.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove old AppVeyor hack ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [4.0.0] - 2018-05-16 ++ ++### Added ++ ++- Import and fix gc test from `levelup` ([**@vweevers**](https://github.com/vweevers)) ++- Add `standard` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add a note on upgrading to 2.0.1/3.0.1 ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Upgrade to `verify-travis-appveyor@^3.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Change deprecated `node-uuid` to `uuid` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update `README` format ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Fix docs for `approximateSize()` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove node 4 from Travis and AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove TypeScript typings ([**@meirionhughes**](https://github.com/meirionhughes)) ++ ++## [3.0.2] - 2018-05-05 ++ ++### Changed ++ ++- Support compilation on iOS ([**@agentilela**](https://github.com/agentilela)) ++- Support compilation on Android x86 ([**@luandro**](https://github.com/luandro)) ++- Upgrade to `prebuild-install@^4.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [3.0.1] - 2018-04-26 ++ ++### Added ++ ++- Run `verify-travis-appveyor` as part of tests to ensure they are in sync ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Test that `destroy()` doesn't inadvertently create the directory ([**@vweevers**](https://github.com/vweevers)) ++- Add node 10 to Travis and AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Configure Greenkeeper to ignore updates to `@types/node` to reduce spam ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade to `nan@2.10` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use resource names in all `AsyncWorker` classes ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Handle all errors in destroy tests ([**@vweevers**](https://github.com/vweevers)) ++- Fix deprecation warnings related to `Buffer()` ([**@peakji**](https://github.com/peakji)) ++- Fix deprecation warnings related to `nan` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove node 5 and 7 from AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove `console.log()` from `approximate-size-test.js` ([**@vweevers**](https://github.com/vweevers)) ++ ++## [3.0.0] - 2018-01-30 ++ ++### Changed ++ ++- Upgrade to `abstract-leveldown@4` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade to `prebuild@7` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Rewrite changelog ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove node 5 and 7 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Make sure `destroy()` deletes `LevelDB`-only dir ([**@joyeecheung**](https://github.com/joyeecheung)) ++ ++## [2.1.1] - 2017-12-02 ++ ++### Fixed ++ ++- Omit docs from `LevelDB` and test files from `Snappy` ([**@peakji**](https://github.com/peakji)) ++ ++## [2.1.0] - 2017-11-24 ++ ++### Fixed ++ ++- Fix `Android` compilation ([**@staltz**](https://github.com/staltz)) ++ ++## [2.0.2] - 2017-11-23 ++ ++### Added ++ ++- Add node 9 to Travis and AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Upgrade to `nan@2.8` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.0.1] - 2017-11-11 ++ ++### Changed ++ ++- Major `README` overhaul ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ++- Upgrade to `abstract-leveldown@3.0.0` ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Tweak typings ([**@sandersn**](https://github.com/sandersn)) ++ ++## [2.0.0] - 2017-10-02 ++ ++### Changed ++ ++- Update `TypeScript` typings ([**@meirionhughes**](https://github.com/meirionhughes)) ++ ++### Removed ++ ++- Remove support for node 0.12 ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.9.0] - 2017-09-28 ++ ++### Added ++ ++- Add default export of `LevelDOWN` ([**@zixia**](https://github.com/zixia)) ++ ++## [1.8.0] - 2017-09-14 ++ ++### Added ++ ++- Add node version badge ([**@vweevers**](https://github.com/vweevers)) ++- Add Greenkeeper badge ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add `-mfloat-abi=hard` compiler flag for `arm` ([**@maihde**](https://github.com/maihde)) ++- Add initial `TypeScript` typings ([**@meirionhughes**](https://github.com/meirionhughes)) ++- Add [**@meirionhughes**](https://github.com/meirionhughes) to contributors ([**@meirionhughes**](https://github.com/meirionhughes)) ++ ++### Changed ++ ++- Bump dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Simplify AppVeyor ([**@vweevers**](https://github.com/vweevers)) ++- Install latest `npm` on AppVeyor for `node@5` ([**@vweevers**](https://github.com/vweevers)) ++ ++## [1.7.2] - 2017-06-08 ++ ++### Changed ++ ++- `iterator.next()` calls back with error if called after `iterator.end()` ([**@peakji**](https://github.com/peakji)) ++ ++### Fixed ++ ++- Closing db with open iterator should not crash ([**@peakji**](https://github.com/peakji)) ++ ++## [1.7.1] - 2017-06-01 ++ ++### Added ++ ++- Add node 8 to Travis and AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Skip installing latest `npm` on AppVeyor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.7.0] - 2017-05-17 ++ ++### Changed ++ ++- Bump version ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.7.0-0] - 2017-04-12 ++ ++### Added ++ ++- Add support for `OpenBSD` ([**@qbit**](https://github.com/qbit)) ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.20` ([**@peakji**](https://github.com/peakji)) ++- Upgrade to `Snappy@1.1.4` ([**@peakji**](https://github.com/peakji)) ++- Bump dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.6.0] - 2017-02-02 ++ ++### Added ++ ++- Add `db.compactRange(start, end, cb)` ([**@bookchin**](https://github.com/bookchin)) ++- Add [**@bookchin**](https://github.com/bookchin) to contributors ([**@bookchin**](https://github.com/bookchin)) ++ ++### Changed ++ ++- Update `prebuild`, `prebuild-install` and `prebuild-ci` ([**@juliangruber**](https://github.com/juliangruber)) ++- Update `nan` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.5.3] - 2016-12-30 ++ ++### Added ++ ++- Restore node 5 to AppVeyor ([**@vweevers**](https://github.com/vweevers)) ++ ++## [1.5.2] - 2016-12-29 ++ ++### Added ++ ++- Restore node 5 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.5.1] - 2016-12-27 ++ ++### Added ++ ++- Add node 7 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add AppVeyor so we can build on Windows ([**@vweevers**](https://github.com/vweevers)) ++- Add OSX to Travis ([**@juliangruber**](https://github.com/juliangruber)) ++- Add `prebuild-ci` so we can automatically make prebuilt binaries ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Changed ++ ++- Enable `iterator.seek()` with buffers ([**@peakji**](https://github.com/peakji)) ++ ++### Removed ++ ++- Remove node 0.10 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove node 5 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.5.0] - 2016-09-27 ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.19` ([**@juliangruber**](https://github.com/juliangruber)) ++- Bump dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade to `nan@2.4.0`, remove `Function::NewInstance()` deprecation warnings ([**@rvagg**](https://github.com/rvagg)) ++ ++### Removed ++ ++- Remove deleted file from `leveldb.gyp` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [1.4.6] - 2016-04-29 ++ ++### Added ++ ++- Add node 6 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Upgrade to `nan@2.3.0` to remove deprecated calls ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.4.5] - 2016-04-18 ++ ++### Added ++ ++- Add [**@chjj**](https://github.com/chjj)'s script for checking memory consumption ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Bump dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Ignore Release folder for Windows ([**@vweevers**](https://github.com/vweevers)) ++- Update copyright year 2015 -> 2016 ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Optimize iterators by avoiding handles ([**@chjj**](https://github.com/chjj)) ++ ++### Removed ++ ++- Remove unsupported versions from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Fix delete calls not using `[]` ([**@chjj**](https://github.com/chjj)) ++- Free start slices on conflicting options ([**@chjj**](https://github.com/chjj)) ++- Dispose of unused slices ([**@chjj**](https://github.com/chjj)) ++- Release iterator snapshots ([**@chjj**](https://github.com/chjj)) ++- Fix iterator leak ([**@chjj**](https://github.com/chjj)) ++- Add handlescopes to fix potential memory leaks ([**@chjj**](https://github.com/chjj)) ++- Fix repair-test for multilang windows ([**@vweevers**](https://github.com/vweevers)) ++- Repair error is different on windows ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.4.4] - 2016-01-25 ++ ++### Changed ++ ++- Update dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `prebuild --install` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- `README` fixes ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Fix build problems on windows ([#247](https://github.com/Level/leveldown/issues/247)) ([**@obastemur**](https://github.com/obastemur)) ++ ++## [1.4.3] - 2015-12-14 ++ ++### Added ++ ++- Add node 5 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add dependency badge ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Bump dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Bump `prebuild` for `--all` functionality ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add node 5 to prebuild config (abi 47) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Fix build problems on windows ([#196](https://github.com/Level/leveldown/issues/196)) ([**@obastemur**](https://github.com/obastemur)) ++ ++## [1.4.2] - 2015-10-21 ++ ++### Added ++ ++- Add node 4 to prebuild config (abi 46) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add node 4 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Test on latest node versions ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Document `prebuild` and explain different compile steps ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update prebuild for --debug and --strip support ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Require `fast-future` at start, not later ([**@timkuijsten**](https://github.com/timkuijsten)) ++- Add [**@kkoopa**](https://github.com/kkoopa)'s Travis fix ([**@mafintosh**](https://github.com/mafintosh)) ++ ++## [1.4.1] - 2015-08-15 ++ ++### Added ++ ++- Add abi 45 to `prebuild` ([**@mafintosh**](https://github.com/mafintosh)) ++- Add io.js 3.0 to Travis ([**@mafintosh**](https://github.com/mafintosh)) ++ ++### Changed ++ ++- Update `prebuild` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Replace missing `Handle<>` with `Local<>` ([**@mafintosh**](https://github.com/mafintosh)) ++- Upgrade to `nan@2` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [1.4.0] - 2015-07-28 ++ ++### Added ++ ++- Add `.prebuildrc` update Travis and prebuild, add prebuild npm script ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add rebuild npm script ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Switch from `node-pre-gyp` to `prebuild` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- No longer need `node-gyp` directly ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.3.1-0] - 2015-07-20 ++ ++### Changed ++ ++- `node-pre-gyp` should build binaries on Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove `hash_test.cc` source ([**@michaelnisi**](https://github.com/michaelnisi)) ++ ++## [1.3.0] - 2015-06-16 ++ ++### Added ++ ++- Add io.js 1.0 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.18.0` (Braydon Fuller) ++ ++### Removed ++ ++- Remove io.js 2.0 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove io.js 2.1 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Add `LEVELDB_PLATFORM_UV` to `LevelDB` `port.h` to fix test (Braydon Fuller) ++ ++## [1.2.2] - 2015-06-02 ++ ++### Fixed ++ ++- Ignore `build-pre-gyp/` folder when publishing to npm ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.2.1] - 2015-06-01 ++ ++### Changed ++ ++- Use `remote_path` with `node-pre-gyp` to dodge preparing `package.json` every time ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add more io.js versions ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `node-gyp-install` to make sure correct `node-gyp` headers are downloaded ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.2.0] - 2015-06-01 ++ ++### Added ++ ++- Add `iterator.seek()` ([**@mafintosh**](https://github.com/mafintosh)) ++ ++## [1.1.0] - 2015-05-28 ++ ++### Changed ++ ++- Upgrade `abstract-leveldown`, mainly for `.status` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [1.0.7] - 2015-05-27 ++ ++### Added ++ ++- Add compression test suite ([**@juliangruber**](https://github.com/juliangruber)) ++- Add link to `level/community` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Use const reference instead of by value in `Database` constructor ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Refactor `NanNew()` on strings into option value functions ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Refactor `BooleanOptionValue` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- `NanUInt32OptionValue` -> `UInt32OptionValue` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- `NanBooleanOptionValue` -> `BooleanOptionValue` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Simplify location logic, let `Database` take care of allocation ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update `abstract-leveldown` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update `.travis.yml`, nvm works on Travis now ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.0.6] - 2015-05-05 ++ ++### Changed ++ ++- Bump version ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.0.5] - 2015-05-05 ++ ++### Fixed ++ ++- Pass db to `AbstractIterator` so gc keeps it ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [1.0.4] - 2015-05-05 ++ ++### Changed ++ ++- Update `nan` for iojs 2.0.0 ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.0.3] - 2015-05-02 ++ ++### Changed ++ ++- `tap` -> `tape` + `faucet` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Fix `write-random.js`, use `leveldown` instead of `lmdb` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Fix `bench/db-bench.js` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.0.2] - 2015-04-26 ++ ++### Added ++ ++- Add documentation about snapshots ([**@maxogden**](https://github.com/maxogden)) ++ ++### Changed ++ ++- Update logo and copyright ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- s/rvagg\\/node-/level\\// ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `n` instead of `nvm` for working `io.js` support ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update to `abstract-leveldown@2.1.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [1.0.1] - 2015-01-16 ++ ++### Changed ++ ++- Upgrade to `nan@1.5` for `io.js` support ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix `LevelDB` builds for modern gcc versions ([**@sharvil**](https://github.com/sharvil)) ++ ++## [1.0.0] - 2014-08-26 ++ ++### Changed ++ ++- Upgrade to `nan@1.3` for Node 0.11.13+ support ([**@rvagg**](https://github.com/rvagg)) ++- Upgrade to `LevelDB@1.17.0` ([**@kesla**](https://github.com/kesla)) ++- Allow writing empty values: null, undefined, '', \[] and Buffer(0). Entries come out as '' or Buffer(0) ([**@ggreer**](https://github.com/ggreer), [**@juliangruber**](https://github.com/juliangruber), [**@rvagg**](https://github.com/rvagg)) ++- Massive speed up of iterators by chunking reads ([**@kesla**](https://github.com/kesla)) ++- Wrap in abstract-leveldown for consistent type-checking across \*DOWNs ([**@kesla**](https://github.com/kesla)) ++- Switch to plain MIT license ([**@andrewrk**](https://github.com/andrewrk)) ++ ++### Removed ++ ++- Remove compile option that borked EL5 compiles ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix clang build ([**@thlorenz**](https://github.com/thlorenz)) ++- Fix minor memory leaks in options attributes ([**@ggreer**](https://github.com/ggreer)) ++ ++## [0.10.6] - 2016-01-07 ++ ++### Added ++ ++- Add iojs, node 4 and 5 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Changed ++ ++- Upgrade to `nan@2.1.x` for `node@4` and `node@5` support ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove `node@0.8` from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [0.10.5] - 2015-05-05 ++ ++### Changed ++ ++- Upgrade to `nan@1.8.x` for `iojs` support ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [0.10.4] - 2015-02-07 ++ ++### Changed ++ ++- Bump version ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.10.3] - 2015-02-07 ++ ++### Changed ++ ++- Upgrade to `nan@1.5` ([**@mcollina**](https://github.com/mcollina)) ++ ++## [0.10.2] - 2013-11-30 ++ ++### Fixed ++ ++- Apply fix by [**@rescrv**](https://github.com/rescrv) for long-standing [OSX corruption bug](https://groups.google.com/forum/#!topic/leveldb/GXhx8YvFiig) ([**@rvagg**](https://github.com/rvagg) / [**@rescrv**](https://github.com/rescrv)) ++ ++## [0.10.1] - 2013-11-21 ++ ++### Changed ++ ++- Upgrade to `nan@0.6` for Node@0.11.6 support, `v8::Local::New(val)` rewritten to `NanNewLocal(val)` ([**@rvagg**](https://github.com/rvagg)) ++ ++**Historical Note** From this release and onward, tags in git start with the prefix `v`, i.e. this release corresponds to the tag `v0.10.1`. ++ ++## [0.10.0] - 2013-11-18 ++ ++### Added ++ ++- Add new simple batch() leak tester ([**@rvagg**](https://github.com/rvagg)) ++ ++### Changed ++ ++- Upgrade to `Snappy@1.1.1` ([**@rvagg**](https://github.com/rvagg) and [**@No9**](https://github.com/No9)) ++- Upgrade to `nan@0.5.x` ([**@rvagg**](https://github.com/rvagg)) ++- Upgrade to `abstract-leveldown@0.11.x` for testing ([**@rvagg**](https://github.com/rvagg)) ++- Switch all `callback->Call()`s to `node::MakeCallback()` to properly support Node.js domains ([**@rvagg**](https://github.com/rvagg)) ++- Enable LevelDB's BloomFilter ([**@Kyotoweb**](https://github.com/Kyotoweb)) ++- Properly enable compression by default ([**@Kyotoweb**](https://github.com/Kyotoweb)) ++ ++### Removed ++ ++- Remove `Persistent` references for all `batch()` operations as `WriteBatch` takes an explicit copy of the data ([**@mcollina**](https://github.com/mcollina) and [**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix array-batch memory leak ([level/levelup#171](https://github.com/Level/levelup/issues/171)) ([**@rvagg**](https://github.com/rvagg)) ++- Fix chained-batch `write()` segfaults (details in [#73](https://github.com/Level/leveldown/issues/73)), ([**@rvagg**](https://github.com/rvagg) and [**@mcollina**](https://github.com/mcollina)) ++ ++## [0.9.2] - 2013-11-02 ++ ++### Fixed ++ ++- Minor fixes to support `Node@0.11.8` and new Linux gcc (warnings) ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.9.1] - 2013-10-03 ++ ++### Fixed ++ ++- Include `port_uv.h` for Windows compile, added test to suite to make sure this happens every time `LevelDB` is upgraded ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.9.0] - 2013-10-01 ++ ++### Changed ++ ++- Upgrade to `LevelDB@0.14.0`, includes change from .sst to .ldb file extension for SST files ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.8.3] - 2013-09-18 ++ ++### Changed ++ ++- Upgrade to `nan@0.4.0`, better support for latest Node master & support for installing within directory structures containing spaces in directory names ([**@rvagg**](https://github.com/rvagg)) ++ ++**Historical Note** The diff between this version and the previous shows `0.8.4` in the commit message. This is incorrect, since that version was never released. ++ ++## [0.8.2] - 2013-09-01 ++ ++### Added ++ ++- Add support for `FreeBSD` ([**@rvagg**](https://github.com/rvagg), [**@kelexel**](https://github.com/kelexel)) ++ ++## [0.8.1] - 2013-09-01 ++ ++### Added ++ ++- Add [**@substack**](https://github.com/substack) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix minor V8-level leaks ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.8.0] - 2013-08-26 ++ ++### Added ++ ++- Add `gt`, `lt`, `gte`, `lte` for iterators ([**@dominictarr**](https://github.com/dominictarr)) ++ ++### Changed ++ ++- Switch to `nan` as an npm dependency ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.7.0] - 2013-08-11 ++ ++### Added ++ ++- Add [**@pgte**](https://github.com/pgte) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++### Changed ++ ++- Use [nan](https://github.com/rvagg/nan) for Node 0.8->0.11 compatibility ([**@rvagg**](https://github.com/rvagg)) ++- Minor perf improvements in C++ ([**@mscdex**](https://github.com/mscdex)) ++ ++**Historical Note** We started using `nan` in the form of a local `src/nan.h` header file. ++ ++## [0.6.2] - 2013-07-07 ++ ++### Changed ++ ++- Compatibility for `Node@0.11.3`, breaks compatibility with 0.11.2 ++ ++## [0.6.1] - 2013-06-15 ++ ++### Fixed ++ ++- Fix broken Windows compile, apply port-uv patch to `LevelDB`'s port.h ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.6.0] - 2013-06-14 ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.11.0`, some [important bugfixes](https://groups.google.com/forum/#!topic/leveldb/vS1JvmGlp4E) ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.5.0] - 2013-05-21 ++ ++### Changed ++ ++- Bump major version for `db.getProperty()` addition (should have been done in 0.4.4) ([**@rvagg**](https://github.com/rvagg)) ++- Disallow `batch()` operations after a `write()` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.4] - 2013-05-18 ++ ++### Added ++ ++- Add `db.getProperty()`, see README for details ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- More work on memory management, including late-creation of Persistent handles ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.3] - 2013-05-18 ++ ++### Fixed ++ ++- Better memory leak fix ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.2] - 2013-05-17 ++ ++### Fixed ++ ++- Same memory leak fixes as 0.4.1, properly applied to batch() operations too ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.1] - 2013-05-17 ++ ++### Fixed ++ ++- Fix memory leak caused when passing String objects in as keys and values, conversion to Slice created `new char[]` but wasn't being disposed. Buffers are automatically disposed (reported by [**@kylegetson**](https://github.com/kylegetson) levelup/[#140](https://github.com/Level/leveldown/issues/140)) ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.0] - 2013-05-15 ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.10.0`, fairly minor changes, mostly bugfixes see for more info ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.3.1] - 2013-05-14 ++ ++### Fixed ++ ++- Don't allow empty batch() operations through to LevelDB, on chained of array forms ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.3.0] - 2013-05-14 ++ ++### Added ++ ++- Add [**@No9**](https://github.com/No9) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++### Changed ++ ++- Pull API tests up into `AbstractLevelDOWN`, require it to run the tests. `AbstractLevelDOWN` can now be used to test `LevelDOWN`-compliant API's ([**@maxogden**](https://github.com/maxogden)) ++- Change iterator methods to return errors on the callbacks rather than throw ([**@mcollina**](https://github.com/mcollina) & [**@rvagg**](https://github.com/rvagg)) ++- Update documentation for `.get()` ([**@deanlandolt**](https://github.com/deanlandolt)) ++ ++### Removed ++ ++- Remove browserify shim ([**@rvagg**](https://github.com/rvagg)) ++ ++**Historical Note** In the early days minor versions were looked upon as major versions. Semver practices we use today was not adopted fully at this time. This is why the history might look a bit confusing. ++ ++ ++ ++## [0.2.3] - 2013-05-17 ++ ++### Fixed ++ ++- Backport memory leak fixes ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.2.2] - 2013-05-14 ++ ++### Added ++ ++- Add node 0.10 to Travis ([**@rvagg**](https://github.com/rvagg)) ++- Add [**@mcollina**](https://github.com/mcollina) to contributors ([**@rvagg**](https://github.com/rvagg)) ++- Add browserify shim so `levelup` can run in the browser ([**@No9**](https://github.com/No9)) ++ ++### Changed ++ ++- Extract basic test code to `abstract-leveldown` ([**@maxogden**](https://github.com/maxogden)) ++ ++## [0.2.1] - 2013-04-08 ++ ++### Changed ++ ++- Ignore empty string/buffer start/end options on iterators ([**@kesla**](https://github.com/kesla)) ++- Macro cleanup, replace some with static inline functions ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix iterator to start on correct value when `reverse=true`, also handle end-of-store case ([#27](https://github.com/Level/leveldown/issues/27)) ([**@kesla**](https://github.com/kesla)) ++ ++## [0.2.0] - 2013-03-30 ++ ++### Added ++ ++- Add windows support, using a combination of libuv and Windows-specific code. See README for details about what's required ([**@rvagg**](https://github.com/rvagg)) ++- Add `leveldown.destroy(location, cb)` to delete an existing `LevelDB` store, exposes `LevelDB.DestroyDB()` ([**@rvagg**](https://github.com/rvagg)) ++- Add `leveldown.repair(location, cb)` to repair an existing `LevelDB` store, exposes `LevelDB.RepairDB()` ([**@rvagg**](https://github.com/rvagg)) ++- Add advanced options: `writeBufferSize`, `blockSize`, `maxOpenFiles`, `blockRestartInterval`, exposes `LevelDB` options ([**@rvagg**](https://github.com/rvagg)) ++- Add chained batch operations. Argument-less `db.batch()` will return a new `Batch` object that can `.put()` and `.del()` and then `.write()`. API in flux so not documented yet. ([**@juliangruber**](https://github.com/juliangruber) / [**@rvagg**](https://github.com/rvagg)) ++ ++### Changed ++ ++- Auto-cleanup iterators that are left open when you close a database; any iterators left open when you close a database instance will kill your process so we now keep track of iterators and auto-close them before a db.close completes ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.1.4] - 2013-03-11 ++ ++### Changed ++ ++- Return error when batch ops contain `null` or `undefined` ([**@rvagg**](https://github.com/rvagg) / [**@ralphtheninja**](https://github.com/ralphtheninja) / [**@dominictarr**](https://github.com/dominictarr)) ++ ++## [0.1.3] - 2013-03-09 ++ ++### Fixed ++ ++- `SmartOS` build problems ([**@wolfeidau**](https://github.com/wolfeidau)) ++ ++## [0.1.2] - 2013-02-24 ++ ++### Changed ++ ++- Upgrade to `LevelDB@1.9.0`, fairly minor changes since 1.7.0 ([**@rvagg**](https://github.com/rvagg)) ++- Upgrade to `Snappy@1.1.0`, changes block size to improve compression ~3%, slight decrease in speed ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.1.1] - 2013-02-24 ++ ++### Fixed ++ ++- Compile error on Mac OS ([**@kesla**](https://github.com/kesla) / [**@rvagg**](https://github.com/rvagg)) ++ ++## [0.1.0] - 2013-02-24 ++ ++### Added ++ ++- Add complete, independent test suite ([**@rvagg**](https://github.com/rvagg)) ++ ++### Changed ++ ++- Change API to export single function `levelup()` ([**@rvagg**](https://github.com/rvagg)) ++- Move `createIterator()` to `levelup#iterator()` ([**@rvagg**](https://github.com/rvagg)) ++- Make all `options` arguments optional ([**@rvagg**](https://github.com/rvagg)) ++- Argument number & type checking on all methods ([**@rvagg**](https://github.com/rvagg)) ++- Stricter checking on key & value types, `String`/`Object.toString()`/`Buffer`, non-zero-length ([**@rvagg**](https://github.com/rvagg)) ++ ++### Removed ++ ++- Remove `use namespace` and add `namespace leveldown` everywhere ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix race condition in Iterator `end()`/`next()`, merged from `LevelUP` ([**@ralphtheninja**](https://github.com/ralphtheninja) / [**@rvagg**](https://github.com/rvagg)) ++ ++## [0.0.2] - 2013-01-20 ++ ++### Changed ++ ++- Finalize rename of internal components to `LevelDOWN`, removing `LevelUP` references ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.0.1] - 2013-01-20 ++ ++### Added ++ ++- Complete documentation of current API ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Callback is not optional for `.close()` ([**@rvagg**](https://github.com/rvagg)) ++ ++## 0.0.0 - 2013-01-06 ++ ++:seedling: First release. Extracted from `levelup` as a stand-alone package ([**@rvagg**](https://github.com/rvagg)) ++ ++[5.6.0]: https://github.com/Level/leveldown/compare/v5.5.1...v5.6.0 ++ ++[5.5.1]: https://github.com/Level/leveldown/compare/v5.5.0...v5.5.1 ++ ++[5.5.0]: https://github.com/Level/leveldown/compare/v5.4.1...v5.5.0 ++ ++[5.4.1]: https://github.com/Level/leveldown/compare/v5.4.0...v5.4.1 ++ ++[5.4.0]: https://github.com/Level/leveldown/compare/v5.3.0...v5.4.0 ++ ++[5.3.0]: https://github.com/Level/leveldown/compare/v5.3.0-0...v5.3.0 ++ ++[5.3.0-0]: https://github.com/Level/leveldown/compare/v5.2.1...v5.3.0-0 ++ ++[5.2.1]: https://github.com/Level/leveldown/compare/v5.2.0...v5.2.1 ++ ++[5.2.0]: https://github.com/Level/leveldown/compare/v5.1.1...v5.2.0 ++ ++[5.1.1]: https://github.com/Level/leveldown/compare/v5.1.0...v5.1.1 ++ ++[5.1.0]: https://github.com/Level/leveldown/compare/v5.0.3...v5.1.0 ++ ++[5.0.3]: https://github.com/Level/leveldown/compare/v5.0.2...v5.0.3 ++ ++[5.0.2]: https://github.com/Level/leveldown/compare/v5.0.1...v5.0.2 ++ ++[5.0.1]: https://github.com/Level/leveldown/compare/v5.0.0...v5.0.1 ++ ++[5.0.0]: https://github.com/Level/leveldown/compare/v4.0.2...v5.0.0 ++ ++[4.0.2]: https://github.com/Level/leveldown/compare/v4.0.1...v4.0.2 ++ ++[4.0.1]: https://github.com/Level/leveldown/compare/v4.0.0...v4.0.1 ++ ++[4.0.0]: https://github.com/Level/leveldown/compare/v3.0.2...v4.0.0 ++ ++[3.0.2]: https://github.com/Level/leveldown/compare/v3.0.1...v3.0.2 ++ ++[3.0.1]: https://github.com/Level/leveldown/compare/v3.0.0...v3.0.1 ++ ++[3.0.0]: https://github.com/Level/leveldown/compare/v2.1.1...v3.0.0 ++ ++[2.1.1]: https://github.com/Level/leveldown/compare/v2.1.0...v2.1.1 ++ ++[2.1.0]: https://github.com/Level/leveldown/compare/v2.0.2...v2.1.0 ++ ++[2.0.2]: https://github.com/Level/leveldown/compare/v2.0.1...v2.0.2 ++ ++[2.0.1]: https://github.com/Level/leveldown/compare/v2.0.0...v2.0.1 ++ ++[2.0.0]: https://github.com/Level/leveldown/compare/v1.9.0...v2.0.0 ++ ++[1.9.0]: https://github.com/Level/leveldown/compare/v1.8.0...v1.9.0 ++ ++[1.8.0]: https://github.com/Level/leveldown/compare/v1.7.2...v1.8.0 ++ ++[1.7.2]: https://github.com/Level/leveldown/compare/v1.7.1...v1.7.2 ++ ++[1.7.1]: https://github.com/Level/leveldown/compare/v1.7.0...v1.7.1 ++ ++[1.7.0]: https://github.com/Level/leveldown/compare/v1.7.0-0...v1.7.0 ++ ++[1.7.0-0]: https://github.com/Level/leveldown/compare/v1.6.0...v1.7.0-0 ++ ++[1.6.0]: https://github.com/Level/leveldown/compare/v1.5.3...v1.6.0 ++ ++[1.5.3]: https://github.com/Level/leveldown/compare/v1.5.2...v1.5.3 ++ ++[1.5.2]: https://github.com/Level/leveldown/compare/v1.5.1...v1.5.2 ++ ++[1.5.1]: https://github.com/Level/leveldown/compare/v1.5.0...v1.5.1 ++ ++[1.5.0]: https://github.com/Level/leveldown/compare/v1.4.6...v1.5.0 ++ ++[1.4.6]: https://github.com/Level/leveldown/compare/v1.4.5...v1.4.6 ++ ++[1.4.5]: https://github.com/Level/leveldown/compare/v1.4.4...v1.4.5 ++ ++[1.4.4]: https://github.com/Level/leveldown/compare/v1.4.3...v1.4.4 ++ ++[1.4.3]: https://github.com/Level/leveldown/compare/v1.4.2...v1.4.3 ++ ++[1.4.2]: https://github.com/Level/leveldown/compare/v1.4.1...v1.4.2 ++ ++[1.4.1]: https://github.com/Level/leveldown/compare/v1.4.0...v1.4.1 ++ ++[1.4.0]: https://github.com/Level/leveldown/compare/v1.3.1-0...v1.4.0 ++ ++[1.3.1-0]: https://github.com/Level/leveldown/compare/v1.3.0...v1.3.1-0 ++ ++[1.3.0]: https://github.com/Level/leveldown/compare/v1.2.2...v1.3.0 ++ ++[1.2.2]: https://github.com/Level/leveldown/compare/v1.2.1...v1.2.2 ++ ++[1.2.1]: https://github.com/Level/leveldown/compare/v1.2.0...v1.2.1 ++ ++[1.2.0]: https://github.com/Level/leveldown/compare/v1.1.0...v1.2.0 ++ ++[1.1.0]: https://github.com/Level/leveldown/compare/v1.0.7...v1.1.0 ++ ++[1.0.7]: https://github.com/Level/leveldown/compare/v1.0.6...v1.0.7 ++ ++[1.0.6]: https://github.com/Level/leveldown/compare/v1.0.5...v1.0.6 ++ ++[1.0.5]: https://github.com/Level/leveldown/compare/v1.0.4...v1.0.5 ++ ++[1.0.4]: https://github.com/Level/leveldown/compare/v1.0.3...v1.0.4 ++ ++[1.0.3]: https://github.com/Level/leveldown/compare/v1.0.2...v1.0.3 ++ ++[1.0.2]: https://github.com/Level/leveldown/compare/v1.0.1...v1.0.2 ++ ++[1.0.1]: https://github.com/Level/leveldown/compare/v1.0.0...v1.0.1 ++ ++[1.0.0]: https://github.com/Level/leveldown/compare/v0.10.6...v1.0.0 ++ ++[0.10.6]: https://github.com/Level/leveldown/compare/v0.10.5...v0.10.6 ++ ++[0.10.5]: https://github.com/Level/leveldown/compare/v0.10.4...v0.10.5 ++ ++[0.10.4]: https://github.com/Level/leveldown/compare/v0.10.3...v0.10.4 ++ ++[0.10.3]: https://github.com/Level/leveldown/compare/v0.10.2...v0.10.3 ++ ++[0.10.2]: https://github.com/Level/leveldown/compare/v0.10.1...v0.10.2 ++ ++[0.10.1]: https://github.com/Level/leveldown/compare/0.10.0...v0.10.1 ++ ++[0.10.0]: https://github.com/Level/leveldown/compare/0.9.2...0.10.0 ++ ++[0.9.2]: https://github.com/Level/leveldown/compare/0.9.1...0.9.2 ++ ++[0.9.1]: https://github.com/Level/leveldown/compare/0.9.0...0.9.1 ++ ++[0.9.0]: https://github.com/Level/leveldown/compare/0.8.3...0.9.0 ++ ++[0.8.3]: https://github.com/Level/leveldown/compare/0.8.2...0.8.3 ++ ++[0.8.2]: https://github.com/Level/leveldown/compare/0.8.1...0.8.2 ++ ++[0.8.1]: https://github.com/Level/leveldown/compare/0.8.0...0.8.1 ++ ++[0.8.0]: https://github.com/Level/leveldown/compare/0.7.0...0.8.0 ++ ++[0.7.0]: https://github.com/Level/leveldown/compare/0.6.2...0.7.0 ++ ++[0.6.2]: https://github.com/Level/leveldown/compare/0.6.1...0.6.2 ++ ++[0.6.1]: https://github.com/Level/leveldown/compare/0.6.0...0.6.1 ++ ++[0.6.0]: https://github.com/Level/leveldown/compare/0.5.0...0.6.0 ++ ++[0.5.0]: https://github.com/Level/leveldown/compare/0.4.4...0.5.0 ++ ++[0.4.4]: https://github.com/Level/leveldown/compare/0.4.3...0.4.4 ++ ++[0.4.3]: https://github.com/Level/leveldown/compare/0.4.2...0.4.3 ++ ++[0.4.2]: https://github.com/Level/leveldown/compare/0.4.1...0.4.2 ++ ++[0.4.1]: https://github.com/Level/leveldown/compare/0.4.0...0.4.1 ++ ++[0.4.0]: https://github.com/Level/leveldown/compare/0.3.1...0.4.0 ++ ++[0.3.1]: https://github.com/Level/leveldown/compare/0.3.0...0.3.1 ++ ++[0.3.0]: https://github.com/Level/leveldown/compare/0.2.3...0.3.0 ++ ++[0.2.3]: https://github.com/Level/leveldown/compare/0.2.2...0.2.3 ++ ++[0.2.2]: https://github.com/Level/leveldown/compare/0.2.1...0.2.2 ++ ++[0.2.1]: https://github.com/Level/leveldown/compare/0.2.0...0.2.1 ++ ++[0.2.0]: https://github.com/Level/leveldown/compare/0.1.4...0.2.0 ++ ++[0.1.4]: https://github.com/Level/leveldown/compare/0.1.3...0.1.4 ++ ++[0.1.3]: https://github.com/Level/leveldown/compare/0.1.2...0.1.3 ++ ++[0.1.2]: https://github.com/Level/leveldown/compare/0.1.1...0.1.2 ++ ++[0.1.1]: https://github.com/Level/leveldown/compare/0.1.0...0.1.1 ++ ++[0.1.0]: https://github.com/Level/leveldown/compare/0.0.2...0.1.0 ++ ++[0.0.2]: https://github.com/Level/leveldown/compare/0.0.1...0.0.2 ++ ++[0.0.1]: https://github.com/Level/leveldown/compare/0.0.0...0.0.1 +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CONTRIBUTORS.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CONTRIBUTORS.md +new file mode 100644 +index 0000000..3984e56 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/CONTRIBUTORS.md +@@ -0,0 +1,46 @@ ++# Contributors ++ ++| Name | GitHub | Social | ++| :------------------------- | :----------------------------------------------------- | :----------------------------------------------------------------------- | ++| **Rod Vagg** | [**@rvagg**](https://github.com/rvagg) | [**@rvagg@twitter**](https://twitter.com/rvagg) | ++| **Lars-Magnus Skog** | [**@ralphtheninja**](https://github.com/ralphtheninja) | [**@ralph@social.weho.st**](https://social.weho.st/@ralph) | ++| **Vincent Weevers** | [**@vweevers**](https://github.com/vweevers) | [**@vweevers@twitter**](https://twitter.com/vweevers) | ++| **David Björklund** | [**@kesla**](https://github.com/kesla) | [**@david_bjorklund@twitter**](https://twitter.com/david_bjorklund) | ++| **Julian Gruber** | [**@juliangruber**](https://github.com/juliangruber) | [**@juliangruber@twitter**](https://twitter.com/juliangruber) | ++| **Yichao 'Peak' Ji** | [**@peakji**](https://github.com/peakji) | | ++| **Mathias Buus** | [**@mafintosh**](https://github.com/mafintosh) | [**@mafintosh@twitter**](https://twitter.com/mafintosh) | ++| **Dominic Tarr** | [**@dominictarr**](https://github.com/dominictarr) | [**@dominictarr@twitter**](https://twitter.com/dominictarr) | ++| **Christopher Jeffrey** | | | ++| **Philippe Schommers** | | | ++| **Raynos** | | | ++| **Gordon Hall** | [**@bookchin**](https://github.com/bookchin) | | ++| **Max Ogden** | [**@maxogden**](https://github.com/maxogden) | [**@maxogden@twitter**](https://twitter.com/maxogden) | ++| **Geoff Greer** | [**@ggreer**](https://github.com/ggreer) | | ++| **Matteo Collina** | [**@mcollina**](https://github.com/mcollina) | [**@matteocollina@twitter**](https://twitter.com/matteocollina) | ++| **Meirion Hughes** | [**@MeirionHughes**](https://github.com/MeirionHughes) | | ++| **Amine Mouafik** | [**@kytwb**](https://github.com/kytwb) | | ++| **Braydon Fuller** | [**@braydonf**](https://github.com/braydonf) | | ++| **duralog** | | | ++| **James Butler** | [**@sandfox**](https://github.com/sandfox) | | ++| **Oguz Bastemur** | [**@obastemur**](https://github.com/obastemur) | [**@obastemur@twitter**](https://twitter.com/obastemur) | ++| **Aaron Bieber** | [**@qbit**](https://github.com/qbit) | | ++| **Adam Bliss** | [**@abliss**](https://github.com/abliss) | | ++| **Alex Gentile** | [**@agentilela**](https://github.com/agentilela) | | ++| **Andre Staltz** | | | ++| **Andrew Kelley** | [**@andrewrk**](https://github.com/andrewrk) | | ++| **Christian Bundy** | | | ++| **Dean Landolt** | [**@deanlandolt**](https://github.com/deanlandolt) | | ++| **flames of love** | | | ++| **Huan LI** | [**@zixia**](https://github.com/zixia) | [**@zixia@twitter**](https://twitter.com/zixia) | ++| **Joyee Cheung** | [**@joyeecheung**](https://github.com/joyeecheung) | [**@joyeecheung@twitter**](https://twitter.com/joyeecheung) | ++| **Luandro** | [**@luandro**](https://github.com/luandro) | | ++| **Mark Wolfe** | [**@wolfeidau**](https://github.com/wolfeidau) | | ++| **Michael Ihde** | | | ++| **Michael Nisi** | [**@michaelnisi**](https://github.com/michaelnisi) | | ++| **mscdex** | [**@mscdex**](https://github.com/mscdex) | | ++| **Nathan Shively-Sanders** | [**@sandersn**](https://github.com/sandersn) | | ++| **No9** | | | ++| **Sharvil Nanavati** | [**@sharvil**](https://github.com/sharvil) | | ++| **Super-User** | | | ++| **Thorsten Lorenz** | [**@thlorenz**](https://github.com/thlorenz) | | ++| **Tim Kuijsten** | [**@timkuijsten**](https://github.com/timkuijsten) | [**@timkuijsten@mastodon.social**](https://mastodon.social/@timkuijsten) | +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/LICENSE.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/LICENSE.md +new file mode 100644 +index 0000000..d9f5e37 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/LICENSE.md +@@ -0,0 +1,21 @@ ++# The MIT License (MIT) ++ ++**Copyright © 2012-present Rod Vagg and [Contributors](CONTRIBUTORS.md).** ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in all ++copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++SOFTWARE. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/README.md +new file mode 100644 +index 0000000..fe36029 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/README.md +@@ -0,0 +1,481 @@ ++# leveldown ++ ++[![level badge][level-badge]](https://github.com/Level/awesome) ++[![npm](https://img.shields.io/npm/v/leveldown.svg?label=&logo=npm)](https://www.npmjs.com/package/leveldown) ++[![Node version](https://img.shields.io/node/v/leveldown.svg)](https://www.npmjs.com/package/leveldown) ++[![Travis](https://img.shields.io/travis/com/Level/leveldown.svg?logo=travis&label=)](https://travis-ci.com/Level/leveldown) ++[![AppVeyor](https://img.shields.io/appveyor/ci/Level/leveldown.svg?logo=appveyor&label=)](https://ci.appveyor.com/project/Level/leveldown) ++[![Cirrus CI](https://img.shields.io/cirrus/github/Level/leveldown?logo=cirrus-ci&label=)](https://cirrus-ci.com/github/Level/leveldown) ++[![npm](https://img.shields.io/npm/dm/leveldown.svg?label=dl)](https://www.npmjs.com/package/leveldown) ++[![Coverage Status](https://coveralls.io/repos/github/Level/leveldown/badge.svg)](https://coveralls.io/github/Level/leveldown) ++[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) ++[![Backers on Open Collective](https://opencollective.com/level/backers/badge.svg?color=orange)](#backers) ++[![Sponsors on Open Collective](https://opencollective.com/level/sponsors/badge.svg?color=orange)](#sponsors) ++ ++## Table of Contents ++ ++
Click to expand ++ ++- [Introduction](#introduction) ++- [Supported Platforms](#supported-platforms) ++- [API](#api) ++- [Safety](#safety) ++- [Snapshots](#snapshots) ++- [Getting Support](#getting-support) ++- [Contributing](#contributing) ++- [Donate](#donate) ++- [License](#license) ++ ++
++ ++## Introduction ++ ++This module was originally part of [`levelup`](https://github.com/Level/levelup) but was later extracted and now serves as a stand-alone binding for LevelDB. ++ ++It is **strongly recommended** that you use `levelup` in preference to `leveldown` unless you have measurable performance reasons to do so. `levelup` is optimised for usability and safety. Although we are working to improve the safety of the `leveldown` interface it is still easy to crash your Node process if you don't do things in just the right way. ++ ++See the section on safety below for details of known unsafe operations with `leveldown`. ++ ++## Supported Platforms ++ ++We aim to support _at least_ Active LTS and Current Node.js releases, Electron 4.0.0, as well as any future Node.js and Electron releases thanks to [N-API](https://nodejs.org/api/n-api.html). The minimum node version for `leveldown` is `8.6.0`. Conversely, for node >= 12, the minimum `leveldown` version is `5.0.0`. ++ ++The `leveldown` npm package ships with prebuilt binaries for popular 64-bit platforms as well as ARM, Android and Alpine (musl) and is known to work on: ++ ++- **Linux** (including ARM platforms such as Raspberry Pi and Kindle) ++- **Mac OS** ++- **Solaris** (SmartOS & Nodejitsu) ++- **FreeBSD** ++- **Windows** ++ ++When installing `leveldown`, [`node-gyp-build`](https://github.com/prebuild/node-gyp-build) will check if a compatible binary exists and fallback to a compile step if it doesn't. In that case you'll need a [valid `node-gyp` installation](https://github.com/nodejs/node-gyp#installation). ++ ++If you don't want to use the prebuilt binary for the platform you are installing on, specify the `--build-from-source` flag when you install. One of: ++ ++``` ++npm install --build-from-source ++npm install leveldown --build-from-source ++``` ++ ++If you are working on `leveldown` itself and want to re-compile the C++ code, run `npm run rebuild`. ++ ++### Notes ++ ++- If you get compilation errors on Node.js 12, please ensure you have `leveldown` >= 5. This can be checked by running `npm ls leveldown`. ++- On Linux flavors with an old glibc (Debian 8, Ubuntu 14.04, RHEL 7, CentOS 7) you must either update `leveldown` to >= 5.3.0 or use `--build-from-source`. ++- On Alpine 3 it was previously necessary to use `--build-from-source`. This is no longer the case. ++- The Android prebuilds are made for and built against Node.js core rather than the [`nodejs-mobile`](https://github.com/JaneaSystems/nodejs-mobile) fork. ++ ++## API ++ ++**If you are upgrading:** please see [`UPGRADING.md`](UPGRADING.md). ++ ++- leveldown() ++- db.open() ++- db.close() ++- db.put() ++- db.get() ++- db.del() ++- db.batch() _(array form)_ ++- db.batch() _(chained form)_ ++- db.approximateSize() ++- db.compactRange() ++- db.getProperty() ++- db.iterator() ++- db.clear() ++- chainedBatch ++ - chainedBatch.put() ++ - chainedBatch.del() ++ - chainedBatch.clear() ++ - chainedBatch.write() ++ - chainedBatch.db ++- iterator ++ - iterator.next() ++ - iterator.seek() ++ - iterator.end() ++ - iterator.db ++- leveldown.destroy() ++- leveldown.repair() ++ ++ ++ ++### `db = leveldown(location)` ++ ++leveldown() returns a new `leveldown` instance. `location` is a String pointing to the LevelDB location to be opened. ++ ++ ++ ++### `db.open([options, ]callback)` ++ ++open() is an instance method on an existing database object. ++ ++The `callback` function will be called with no arguments when the database has been successfully opened, or with a single `error` argument if the open operation failed for any reason. ++ ++#### `options` ++ ++The optional `options` argument may contain: ++ ++- `createIfMissing` (boolean, default: `true`): If `true`, will initialise an empty database at the specified location if one doesn't already exist. If `false` and a database doesn't exist you will receive an error in your `open()` callback and your database won't open. ++ ++- `errorIfExists` (boolean, default: `false`): If `true`, you will receive an error in your `open()` callback if the database exists at the specified location. ++ ++- `compression` (boolean, default: `true`): If `true`, all _compressible_ data will be run through the Snappy compression algorithm before being stored. Snappy is very fast and shouldn't gain much speed by disabling so leave this on unless you have good reason to turn it off. ++ ++- `cacheSize` (number, default: `8 * 1024 * 1024` = 8MB): The size (in bytes) of the in-memory [LRU](http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used) cache with frequently used uncompressed block contents. ++ ++**Advanced options** ++ ++The following options are for advanced performance tuning. Modify them only if you can prove actual benefit for your particular application. ++ ++- `writeBufferSize` (number, default: `4 * 1024 * 1024` = 4MB): The maximum size (in bytes) of the log (in memory and stored in the .log file on disk). Beyond this size, LevelDB will convert the log data to the first level of sorted table files. From the LevelDB documentation: ++ ++> Larger values increase performance, especially during bulk loads. Up to two write buffers may be held in memory at the same time, so you may wish to adjust this parameter to control memory usage. Also, a larger write buffer will result in a longer recovery time the next time the database is opened. ++ ++- `blockSize` (number, default `4096` = 4K): The _approximate_ size of the blocks that make up the table files. The size related to uncompressed data (hence "approximate"). Blocks are indexed in the table file and entry-lookups involve reading an entire block and parsing to discover the required entry. ++ ++- `maxOpenFiles` (number, default: `1000`): The maximum number of files that LevelDB is allowed to have open at a time. If your data store is likely to have a large working set, you may increase this value to prevent file descriptor churn. To calculate the number of files required for your working set, divide your total data by `'maxFileSize'`. ++ ++- `blockRestartInterval` (number, default: `16`): The number of entries before restarting the "delta encoding" of keys within blocks. Each "restart" point stores the full key for the entry, between restarts, the common prefix of the keys for those entries is omitted. Restarts are similar to the concept of keyframes in video encoding and are used to minimise the amount of space required to store keys. This is particularly helpful when using deep namespacing / prefixing in your keys. ++ ++- `maxFileSize` (number, default: `2* 1024 * 1024` = 2MB): The maximum amount of bytes to write to a file before switching to a new one. From the LevelDB documentation: ++ ++> ... if your filesystem is more efficient with larger files, you could consider increasing the value. The downside will be longer compactions and hence longer latency/performance hiccups. Another reason to increase this parameter might be when you are initially populating a large database. ++ ++ ++ ++### `db.close(callback)` ++ ++close() is an instance method on an existing database object. The underlying LevelDB database will be closed and the `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if the operation failed for any reason. ++ ++`leveldown` waits for any pending operations to finish before closing. For example: ++ ++```js ++db.put('key', 'value', function (err) { ++ // This happens first ++}) ++ ++db.close(function (err) { ++ // This happens second ++}) ++``` ++ ++ ++ ++### `db.put(key, value[, options], callback)` ++ ++put() is an instance method on an existing database object, used to store new entries, or overwrite existing entries in the LevelDB store. ++ ++The `key` and `value` objects may either be strings or Buffers. Other object types are converted to strings with the `toString()` method. Keys may not be `null` or `undefined` and objects converted with `toString()` should not result in an empty-string. Values may not be `null` or `undefined`. Values of `''`, `[]` and `Buffer.alloc(0)` (and any object resulting in a `toString()` of one of these) will be stored as a zero-length character array and will therefore be retrieved as either `''` or `Buffer.alloc(0)` depending on the type requested. ++ ++A richer set of data-types is catered for in `levelup`. ++ ++#### `options` ++ ++The only property currently available on the `options` object is `sync` _(boolean, default: `false`)_. If you provide a `sync` value of `true` in your `options` object, LevelDB will perform a synchronous write of the data; although the operation will be asynchronous as far as Node is concerned. Normally, LevelDB passes the data to the operating system for writing and returns immediately, however a synchronous write will use `fsync()` or equivalent so your callback won't be triggered until the data is actually on disk. Synchronous filesystem writes are **significantly** slower than asynchronous writes but if you want to be absolutely sure that the data is flushed then you can use `{ sync: true }`. ++ ++The `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if the operation failed for any reason. ++ ++ ++ ++### `db.get(key[, options], callback)` ++ ++get() is an instance method on an existing database object, used to fetch individual entries from the LevelDB store. ++ ++The `key` object may either be a string or a Buffer and cannot be `undefined` or `null`. Other object types are converted to strings with the `toString()` method and the resulting string _may not_ be a zero-length. A richer set of data-types is catered for in `levelup`. ++ ++Values fetched via `get()` that are stored as zero-length character arrays (`null`, `undefined`, `''`, `[]`, `Buffer.alloc(0)`) will return as empty-`String` (`''`) or `Buffer.alloc(0)` when fetched with `asBuffer: true` (see below). ++ ++#### `options` ++ ++The optional `options` object may contain: ++ ++- `fillCache` (boolean, default: `true`): LevelDB will by default fill the in-memory LRU Cache with data from a call to get. Disabling this is done by setting `fillCache` to `false`. ++ ++- `asBuffer` (boolean, default: `true`): Used to determine whether to return the `value` of the entry as a string or a Buffer. Note that converting from a Buffer to a string incurs a cost so if you need a string (and the `value` can legitimately become a UTF8 string) then you should fetch it as one with `{ asBuffer: false }` and you'll avoid this conversion cost. ++ ++The `callback` function will be called with a single `error` if the operation failed for any reason. If successful the first argument will be `null` and the second argument will be the `value` as a string or Buffer depending on the `asBuffer` option. ++ ++ ++ ++### `db.del(key[, options], callback)` ++ ++del() is an instance method on an existing database object, used to delete entries from the LevelDB store. ++ ++The `key` object may either be a string or a Buffer and cannot be `undefined` or `null`. Other object types are converted to strings with the `toString()` method and the resulting string _may not_ be a zero-length. A richer set of data-types is catered for in `levelup`. ++ ++#### `options` ++ ++The only property currently available on the `options` object is `sync` _(boolean, default: `false`)_. See leveldown#put() for details about this option. ++ ++The `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if the operation failed for any reason. ++ ++ ++ ++### `db.batch(operations[, options], callback)` _(array form)_ ++ ++Perform multiple _put_ and/or _del_ operations in bulk. The `operations` argument must be an `Array` containing a list of operations to be executed sequentially, although as a whole they are performed as an atomic operation. ++ ++Each operation is contained in an object having the following properties: `type`, `key`, `value`, where the `type` is either `'put'` or `'del'`. In the case of `'del'` the `value` property is ignored. ++ ++Any entries where the `key` or `value` (in the case of `'put'`) is `null` or `undefined` will cause an error to be returned on the `callback`. Any entries where the `type` is `'put'` that have a `value` of `[]`, `''` or `Buffer.alloc(0)` will be stored as a zero-length character array and therefore be fetched during reads as either `''` or `Buffer.alloc(0)` depending on how they are requested. See [`levelup`](https://github.com/Level/levelup#batch) for full documentation on how this works in practice. ++ ++The optional `options` argument may contain: ++ ++- `sync` (boolean, default: `false`). See db.put() for details about this option. ++ ++The `callback` function will be called with no arguments if the batch is successful or with an `Error` if the batch failed for any reason. ++ ++ ++ ++### `db.batch()` _(chained form)_ ++ ++Returns a new [`chainedBatch`](#chainedbatch) instance. ++ ++ ++ ++### `db.approximateSize(start, end, callback)` ++ ++approximateSize() is an instance method on an existing database object. Used to get the approximate number of bytes of file system space used by the range `[start..end)`. The result may not include recently written data. ++ ++The `start` and `end` parameters may be strings or Buffers representing keys in the LevelDB store. ++ ++The `callback` function will be called with a single `error` if the operation failed for any reason. If successful the first argument will be `null` and the second argument will be the approximate size as a Number. ++ ++ ++ ++### `db.compactRange(start, end, callback)` ++ ++compactRange() is an instance method on an existing database object. Used to manually trigger a database compaction in the range `[start..end)`. ++ ++The `start` and `end` parameters may be strings or Buffers representing keys in the LevelDB store. ++ ++The `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if the operation failed for any reason. ++ ++ ++ ++### `db.getProperty(property)` ++ ++getProperty can be used to get internal details from LevelDB. When issued with a valid property string, a readable string will be returned (this method is synchronous). ++ ++Currently, the only valid properties are: ++ ++- 'leveldb.num-files-at-levelN': return the number of files at level _N_, where N is an integer representing a valid level (e.g. "0"). ++ ++- 'leveldb.stats': returns a multi-line string describing statistics about LevelDB's internal operation. ++ ++- 'leveldb.sstables': returns a multi-line string describing all of the _sstables_ that make up contents of the current database. ++ ++ ++ ++### `db.iterator([options])` ++ ++Returns a new [`iterator`](#iterator) instance. The optional `options` object may contain: ++ ++- `gt` (greater than), `gte` (greater than or equal) define the lower bound of the values to be fetched and will determine the starting point where `reverse` is _not_ `true`. Only records where the key is greater than (or equal to) this option will be included in the range. When `reverse` is `true` the order will be reversed, but the records returned will be the same. ++ ++- `lt` (less than), `lte` (less than or equal) define the higher bound of the range to be fetched and will determine the starting point where `reverse` is _not_ `true`. Only records where the key is less than (or equal to) this option will be included in the range. When `reverse` is `true` the order will be reversed, but the records returned will be the same. ++ ++- `start, end` legacy ranges - instead use `gte, lte` ++ ++- `reverse` _(boolean, default: `false`)_: a boolean, set to `true` if you want the stream to go in reverse order. Beware that due to the way LevelDB works, a reverse seek will be slower than a forward seek. ++ ++- `keys` (boolean, default: `true`): whether the callback to the `next()` method should receive a non-null `key`. There is a small efficiency gain if you ultimately don't care what the keys are as they don't need to be converted and copied into JavaScript. ++ ++- `values` (boolean, default: `true`): whether the callback to the `next()` method should receive a non-null `value`. There is a small efficiency gain if you ultimately don't care what the values are as they don't need to be converted and copied into JavaScript. ++ ++- `limit` (number, default: `-1`): limit the number of results collected by this iterator. This number represents a _maximum_ number of results and may not be reached if you get to the end of the store or your `end` value first. A value of `-1` means there is no limit. ++ ++- `fillCache` (boolean, default: `false`): whether LevelDB's LRU-cache should be filled with data read. ++ ++- `keyAsBuffer` (boolean, default: `true`): Used to determine whether to return the `key` of each entry as a string or a Buffer. Note that converting from a Buffer to a string incurs a cost so if you need a string (and the `value` can legitimately become a UTF8 string) then you should fetch it as one. ++ ++- `valueAsBuffer` (boolean, default: `true`): Used to determine whether to return the `value` of each entry as a string or a Buffer. ++ ++ ++ ++### `db.clear([options, ]callback)` ++ ++Delete all entries or a range. Not guaranteed to be atomic. Accepts the following range options (with the same rules as on iterators): ++ ++- `gt` (greater than), `gte` (greater than or equal) define the lower bound of the range to be deleted. Only entries where the key is greater than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries deleted will be the same. ++- `lt` (less than), `lte` (less than or equal) define the higher bound of the range to be deleted. Only entries where the key is less than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries deleted will be the same. ++- `reverse` _(boolean, default: `false`)_: delete entries in reverse order. Only effective in combination with `limit`, to remove the last N records. ++- `limit` _(number, default: `-1`)_: limit the number of entries to be deleted. This number represents a _maximum_ number of entries and may not be reached if you get to the end of the range first. A value of `-1` means there is no limit. When `reverse=true` the entries with the highest keys will be deleted instead of the lowest keys. ++ ++If no options are provided, all entries will be deleted. The `callback` function will be called with no arguments if the operation was successful or with an `Error` if it failed for any reason. ++ ++ ++ ++### `chainedBatch` ++ ++ ++ ++#### `chainedBatch.put(key, value)` ++ ++Queue a `put` operation on this batch. This may throw if `key` or `value` is invalid, following the same rules as the array form of db.batch(). ++ ++ ++ ++#### `chainedBatch.del(key)` ++ ++Queue a `del` operation on this batch. This may throw if `key` is invalid. ++ ++ ++ ++#### `chainedBatch.clear()` ++ ++Clear all queued operations on this batch. ++ ++ ++ ++#### `chainedBatch.write([options, ]callback)` ++ ++Commit the queued operations for this batch. All operations will be written atomically, that is, they will either all succeed or fail with no partial commits. ++ ++The optional `options` argument may contain: ++ ++- `sync` (boolean, default: `false`). See db.put() for details about this option. ++ ++The `callback` function will be called with no arguments if the batch is successful or with an `Error` if the batch failed for any reason. After `write` has been called, no further operations are allowed. ++ ++ ++ ++#### `chainedBatch.db` ++ ++A reference to the `db` that created this chained batch. ++ ++### `iterator` ++ ++ ++ ++#### `iterator.next(callback)` ++ ++next() is an instance method on an existing iterator object, used to increment the underlying LevelDB iterator and return the entry at that location. ++ ++the `callback` function will be called with no arguments in any of the following situations: ++ ++- the iterator comes to the end of the store ++- the `end` key has been reached; or ++- the `limit` has been reached; or ++- the last `seek()` was out of range ++ ++Otherwise, the `callback` function will be called with the following 3 arguments: ++ ++- `error` - any error that occurs while incrementing the iterator. ++- `key` - either a string or a Buffer depending on the `keyAsBuffer` argument when the `iterator()` was called. ++- `value` - either a string or a Buffer depending on the `valueAsBuffer` argument when the `iterator()` was called. ++ ++ ++ ++#### `iterator.seek(key)` ++ ++seek() is an instance method on an existing iterator object, used to seek the underlying LevelDB iterator to a given key. ++ ++By calling seek(key), subsequent calls to next(cb) will return key/values larger or smaller than `key`, based on your reverse setting in the iterator constructor. ++ ++ ++ ++#### `iterator.end(callback)` ++ ++end() is an instance method on an existing iterator object. The underlying LevelDB iterator will be deleted and the `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if the operation failed for any reason. ++ ++ ++ ++#### `iterator.db` ++ ++A reference to the `db` that created this iterator. ++ ++ ++ ++### `leveldown.destroy(location, callback)` ++ ++destroy() is used to completely remove an existing LevelDB database directory. You can use this function in place of a full directory _rm_ if you want to be sure to only remove LevelDB-related files. If the directory only contains LevelDB files, the directory itself will be removed as well. If there are additional, non-LevelDB files in the directory, those files, and the directory, will be left alone. ++ ++The callback will be called when the destroy operation is complete, with a possible `error` argument. ++ ++ ++ ++### `leveldown.repair(location, callback)` ++ ++repair() can be used to attempt a restoration of a damaged LevelDB store. From the LevelDB documentation: ++ ++> If a DB cannot be opened, you may attempt to call this method to resurrect as much of the contents of the database as possible. Some data may be lost, so be careful when calling this function on a database that contains important information. ++ ++You will find information on the _repair_ operation in the _LOG_ file inside the store directory. ++ ++A `repair()` can also be used to perform a compaction of the LevelDB log into table files. ++ ++The callback will be called when the repair operation is complete, with a possible `error` argument. ++ ++## Safety ++ ++### Database State ++ ++Currently `leveldown` does not track the state of the underlying LevelDB instance. This means that calling `open()` on an already open database may result in an error. Likewise, calling any other operation on a non-open database may result in an error. ++ ++`levelup` currently tracks and manages state and will prevent out-of-state operations from being send to `leveldown`. If you use `leveldown` directly then you must track and manage state for yourself. ++ ++## Snapshots ++ ++`leveldown` exposes a feature of LevelDB called [snapshots](https://github.com/google/leveldb/blob/master/doc/index.md#snapshots). This means that when you do e.g. `createReadStream` and `createWriteStream` at the same time, any data modified by the write stream will not affect data emitted from the read stream. In other words, a LevelDB Snapshot captures the latest state at the time the snapshot was created, enabling the snapshot to iterate or read the data without seeing any subsequent writes. Any read not performed on a snapshot will implicitly use the latest state. ++ ++## Getting Support ++ ++There are multiple ways you can find help in using LevelDB in Node.js: ++ ++- **IRC:** you'll find an active group of `levelup` users in the **##leveldb** channel on Freenode, including most of the contributors to this project. ++- **Mailing list:** there is an active [Node.js LevelDB](https://groups.google.com/forum/#!forum/node-levelup) Google Group. ++- **GitHub:** you're welcome to open an issue here on this GitHub repository if you have a question. ++ ++## Contributing ++ ++[`Level/leveldown`](https://github.com/Level/leveldown) is an **OPEN Open Source Project**. This means that: ++ ++> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. ++ ++See the [Contribution Guide](https://github.com/Level/community/blob/master/CONTRIBUTING.md) for more details. ++ ++### Git Submodules ++ ++This project uses Git Submodules. This means that you should clone it recursively if you're planning on working on it: ++ ++```bash ++$ git clone --recurse-submodules https://github.com/Level/leveldown.git ++``` ++ ++Alternatively, you can initialize submodules inside the cloned folder: ++ ++```bash ++$ git submodule update --init --recursive ++``` ++ ++### Publishing ++ ++1. Increment the version: `npm version ..` ++2. Push to GitHub: `git push --follow-tags` ++3. Wait for Travis and AppVeyor builds to complete ++4. Download prebuilds into `./prebuilds`: `npm run download-prebuilds` ++5. Optionally verify loading a prebuild: `npm run test-prebuild` ++6. Optionally verify which files npm will include: `irish-pub` ++7. Add changelog to the GitHub release ++8. Finally: `npm publish` ++ ++## Donate ++ ++To sustain [`Level`](https://github.com/Level) and its activities, become a backer or sponsor on [Open Collective](https://opencollective.com/level). Your logo or avatar will be displayed on our 28+ [GitHub repositories](https://github.com/Level) and [npm](https://www.npmjs.com/) packages. 💖 ++ ++### Backers ++ ++[![Open Collective backers](https://opencollective.com/level/backers.svg?width=890)](https://opencollective.com/level) ++ ++### Sponsors ++ ++[![Open Collective sponsors](https://opencollective.com/level/sponsors.svg?width=890)](https://opencollective.com/level) ++ ++## License ++ ++[MIT](LICENSE.md) © 2012-present Rod Vagg and [Contributors](CONTRIBUTORS.md). ++ ++_`leveldown` builds on the excellent work of the LevelDB and Snappy teams from Google and additional contributors. LevelDB and Snappy are both issued under the [New BSD License](http://opensource.org/licenses/BSD-3-Clause). A large portion of `leveldown` Windows support comes from the [Windows LevelDB port](http://code.google.com/r/kkowalczyk-leveldb/) (archived) by [Krzysztof Kowalczyk](http://blog.kowalczyk.info/) ([`@kjk`](https://twitter.com/kjk)). If you're using `leveldown` on Windows, you should give him your thanks!_ ++ ++[level-badge]: https://leveljs.org/img/badge.svg +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/UPGRADING.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/UPGRADING.md +new file mode 100644 +index 0000000..cce973f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/UPGRADING.md +@@ -0,0 +1,75 @@ ++# Upgrade Guide ++ ++This document describes breaking changes and how to upgrade. For a complete list of changes including minor and patch releases, please refer to the [changelog](CHANGELOG.md). ++ ++## v5 ++ ++This is a rewrite to N-API - which is a huge milestone, achieved without an impact on write performance - and an upgrade to `abstract-leveldown` v6, which solves long-standing issues around serialization and type support. ++ ++### N-API rewrite ++ ++N-API is the latest interface for native addons in Node.js. Main benefit is that `leveldown` became independent of the V8 version, which means it will be compatible with future versions of Node.js. As long as the native code doesn't change, it doesn't need to be recompiled as new versions of Node.js are released. This helps greatly with both maintenance and when delivering code to consumers. ++ ++Because N-API has an experimental status in node 6 and early 8.x releases, support of node 6 has been dropped and the minimum node version for `leveldown` is now 8.6.0. Conversely, for node >= 12, `leveldown@5` is the minimum version. ++ ++### Prebuilt binaries are now shipped in npm package ++ ++Previously, they were downloaded from GitHub by an npm `postinstall` script. In addition, `leveldown` now includes prebuilt binaries for Linux ARMv7, Linux ARM64, Android ARMv7 and Android ARM64. The latter target node core (rather than the formerly needed [`nodejs-mobile`](https://github.com/janeasystems/nodejs-mobile) fork). ++ ++### Range options are now serialized ++ ++Previously, range options like `lt` were passed through as-is by `abstract-leveldown`, unlike keys. For `leveldown` it means that range option types other than a string or Buffer will be stringified. ++ ++### The rules for range options have been relaxed ++ ++Because `null`, `undefined`, zero-length strings and zero-length buffers are significant types in encodings like `bytewise` and `charwise`, they became valid as range options in `abstract-leveldown`. This means `db.iterator({ gt: undefined })` is not the same as `db.iterator({})`. ++ ++In the case of `leveldown`, when used by itself, the aforementioned change means that `db.iterator({ gt: undefined })` is now effectively the same as `db.iterator({ gt: 'undefined' })`, making it explicit that `leveldown` only supports strings and buffers. ++ ++### Seeking became part of official `abstract-leveldown` API ++ ++As a result of this, the `target` argument in `iterator.seek(target)` is now serialized. Meaning any type other than a string or Buffer will be stringified. Like before, if the result is a zero-length string or Buffer, an error will be thrown. ++ ++### Nullish values are rejected ++ ++In addition to rejecting `null` and `undefined` as _keys_, `abstract-leveldown` now also rejects these types as _values_, due to preexisting significance in streams and iterators. ++ ++### Zero-length array keys are rejected ++ ++Though this was already the case, `abstract-leveldown` has replaced the behavior with an explicit `Array.isArray()` check and a new error message. ++ ++### The `sync` option of `chainedBatch` has moved ++ ++The `sync` option has moved to `chainedBatch.write(options)`. Previously, `sync` was half-documented and half-implemented. ++ ++### Various segmentation faults have been fixed ++ ++It is now safe to call `db.close()` before `db.put()` completes, to call `db.iterator()` on a non-open db and to call `db.close()` having created many iterators regardless of their state (idle, nexting, ending or ended). To achieve this, `leveldown` waits for pending operations before closing: ++ ++```js ++db.put('key', 'value', function (err) { ++ console.log('this happens first') ++}) ++ ++db.close(function (err) { ++ console.log('this happens second') ++}) ++``` ++ ++A future release will do the same for other operations like `get` and `batch`. ++ ++## v4 ++ ++Dropped support for node 4. No other breaking changes. ++ ++## v3.0.1 ++ ++If you're using node v10 you'll need at least `leveldown@2.0.1` to successfully compile. In addition, if you want prebuilt binaries you'll need at least `leveldown@3.0.1`. ++ ++## v3 ++ ++#### `.batch(array)` enforces objects ++ ++This major release contains an upgrade to `abstract-leveldown` with a [breaking change](https://github.com/Level/abstract-leveldown/commit/a2621ad70571f6ade9d2be42632ece042e068805) for the array version of `.batch()`. This change ensures all elements in the batch array are objects. ++ ++If you previously passed arrays to `.batch()` that contained `undefined` or `null`, they would be silently ignored. Now this will produce an error. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.cc +new file mode 100644 +index 0000000..e938a40 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.cc +@@ -0,0 +1,1753 @@ ++#define NAPI_VERSION 3 ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++/** ++ * Forward declarations. ++ */ ++struct Database; ++struct Iterator; ++static void iterator_end_do (napi_env env, Iterator* iterator, napi_value cb); ++ ++/** ++ * Macros. ++ */ ++ ++#define NAPI_DB_CONTEXT() \ ++ Database* database = NULL; \ ++ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&database)); ++ ++#define NAPI_ITERATOR_CONTEXT() \ ++ Iterator* iterator = NULL; \ ++ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&iterator)); ++ ++#define NAPI_BATCH_CONTEXT() \ ++ Batch* batch = NULL; \ ++ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&batch)); ++ ++#define NAPI_RETURN_UNDEFINED() \ ++ return 0; ++ ++#define NAPI_UTF8_NEW(name, val) \ ++ size_t name##_size = 0; \ ++ NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, val, NULL, 0, &name##_size)) \ ++ char* name = new char[name##_size + 1]; \ ++ NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, val, name, name##_size + 1, &name##_size)) \ ++ name[name##_size] = '\0'; ++ ++#define NAPI_ARGV_UTF8_NEW(name, i) \ ++ NAPI_UTF8_NEW(name, argv[i]) ++ ++#define LD_STRING_OR_BUFFER_TO_COPY(env, from, to) \ ++ char* to##Ch_ = 0; \ ++ size_t to##Sz_ = 0; \ ++ if (IsString(env, from)) { \ ++ napi_get_value_string_utf8(env, from, NULL, 0, &to##Sz_); \ ++ to##Ch_ = new char[to##Sz_ + 1]; \ ++ napi_get_value_string_utf8(env, from, to##Ch_, to##Sz_ + 1, &to##Sz_); \ ++ to##Ch_[to##Sz_] = '\0'; \ ++ } else if (IsBuffer(env, from)) { \ ++ char* buf = 0; \ ++ napi_get_buffer_info(env, from, (void **)&buf, &to##Sz_); \ ++ to##Ch_ = new char[to##Sz_]; \ ++ memcpy(to##Ch_, buf, to##Sz_); \ ++ } ++ ++/********************************************************************* ++ * Helpers. ++ ********************************************************************/ ++ ++/** ++ * Returns true if 'value' is a string. ++ */ ++static bool IsString (napi_env env, napi_value value) { ++ napi_valuetype type; ++ napi_typeof(env, value, &type); ++ return type == napi_string; ++} ++ ++/** ++ * Returns true if 'value' is a buffer. ++ */ ++static bool IsBuffer (napi_env env, napi_value value) { ++ bool isBuffer; ++ napi_is_buffer(env, value, &isBuffer); ++ return isBuffer; ++} ++ ++/** ++ * Returns true if 'value' is an object. ++ */ ++static bool IsObject (napi_env env, napi_value value) { ++ napi_valuetype type; ++ napi_typeof(env, value, &type); ++ return type == napi_object; ++} ++ ++/** ++ * Create an error object. ++ */ ++static napi_value CreateError (napi_env env, const char* str) { ++ napi_value msg; ++ napi_create_string_utf8(env, str, strlen(str), &msg); ++ napi_value error; ++ napi_create_error(env, NULL, msg, &error); ++ return error; ++} ++ ++/** ++ * Returns true if 'obj' has a property 'key'. ++ */ ++static bool HasProperty (napi_env env, napi_value obj, const char* key) { ++ bool has = false; ++ napi_has_named_property(env, obj, key, &has); ++ return has; ++} ++ ++/** ++ * Returns a property in napi_value form. ++ */ ++static napi_value GetProperty (napi_env env, napi_value obj, const char* key) { ++ napi_value value; ++ napi_get_named_property(env, obj, key, &value); ++ return value; ++} ++ ++/** ++ * Returns a boolean property 'key' from 'obj'. ++ * Returns 'DEFAULT' if the property doesn't exist. ++ */ ++static bool BooleanProperty (napi_env env, napi_value obj, const char* key, ++ bool DEFAULT) { ++ if (HasProperty(env, obj, key)) { ++ napi_value value = GetProperty(env, obj, key); ++ bool result; ++ napi_get_value_bool(env, value, &result); ++ return result; ++ } ++ ++ return DEFAULT; ++} ++ ++/** ++ * Returns a uint32 property 'key' from 'obj'. ++ * Returns 'DEFAULT' if the property doesn't exist. ++ */ ++static uint32_t Uint32Property (napi_env env, napi_value obj, const char* key, ++ uint32_t DEFAULT) { ++ if (HasProperty(env, obj, key)) { ++ napi_value value = GetProperty(env, obj, key); ++ uint32_t result; ++ napi_get_value_uint32(env, value, &result); ++ return result; ++ } ++ ++ return DEFAULT; ++} ++ ++/** ++ * Returns a uint32 property 'key' from 'obj'. ++ * Returns 'DEFAULT' if the property doesn't exist. ++ */ ++static int Int32Property (napi_env env, napi_value obj, const char* key, ++ int DEFAULT) { ++ if (HasProperty(env, obj, key)) { ++ napi_value value = GetProperty(env, obj, key); ++ int result; ++ napi_get_value_int32(env, value, &result); ++ return result; ++ } ++ ++ return DEFAULT; ++} ++ ++/** ++ * Returns a string property 'key' from 'obj'. ++ * Returns empty string if the property doesn't exist. ++ */ ++static std::string StringProperty (napi_env env, napi_value obj, const char* key) { ++ if (HasProperty(env, obj, key)) { ++ napi_value value = GetProperty(env, obj, key); ++ if (IsString(env, value)) { ++ size_t size = 0; ++ napi_get_value_string_utf8(env, value, NULL, 0, &size); ++ ++ char* buf = new char[size + 1]; ++ napi_get_value_string_utf8(env, value, buf, size + 1, &size); ++ buf[size] = '\0'; ++ ++ std::string result = buf; ++ delete [] buf; ++ return result; ++ } ++ } ++ ++ return ""; ++} ++ ++static void DisposeSliceBuffer (leveldb::Slice slice) { ++ if (!slice.empty()) delete [] slice.data(); ++} ++ ++/** ++ * Convert a napi_value to a leveldb::Slice. ++ */ ++static leveldb::Slice ToSlice (napi_env env, napi_value from) { ++ LD_STRING_OR_BUFFER_TO_COPY(env, from, to); ++ return leveldb::Slice(toCh_, toSz_); ++} ++ ++/** ++ * Returns length of string or buffer ++ */ ++static size_t StringOrBufferLength (napi_env env, napi_value value) { ++ size_t size = 0; ++ ++ if (IsString(env, value)) { ++ napi_get_value_string_utf8(env, value, NULL, 0, &size); ++ } else if (IsBuffer(env, value)) { ++ char* buf; ++ napi_get_buffer_info(env, value, (void **)&buf, &size); ++ } ++ ++ return size; ++} ++ ++/** ++ * Takes a Buffer or string property 'name' from 'opts'. ++ * Returns null if the property does not exist or is zero-length. ++ */ ++static std::string* RangeOption (napi_env env, napi_value opts, const char* name) { ++ if (HasProperty(env, opts, name)) { ++ napi_value value = GetProperty(env, opts, name); ++ ++ if (StringOrBufferLength(env, value) > 0) { ++ LD_STRING_OR_BUFFER_TO_COPY(env, value, to); ++ std::string* result = new std::string(toCh_, toSz_); ++ delete [] toCh_; ++ return result; ++ } ++ } ++ ++ return NULL; ++} ++ ++/** ++ * Calls a function. ++ */ ++static napi_status CallFunction (napi_env env, ++ napi_value callback, ++ const int argc, ++ napi_value* argv) { ++ napi_value global; ++ napi_get_global(env, &global); ++ return napi_call_function(env, global, callback, argc, argv, NULL); ++} ++ ++/** ++ * Base worker class. Handles the async work. Derived classes can override the ++ * following virtual methods (listed in the order in which they're called): ++ * ++ * - DoExecute (abstract, worker pool thread): main work ++ * - HandleOKCallback (main thread): call JS callback on success ++ * - DoFinally (main thread): do cleanup regardless of success ++ */ ++struct BaseWorker { ++ BaseWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ const char* resourceName) ++ : env_(env), database_(database), errMsg_(NULL) { ++ NAPI_STATUS_THROWS_VOID(napi_create_reference(env_, callback, 1, &callbackRef_)); ++ napi_value asyncResourceName; ++ NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env_, resourceName, ++ NAPI_AUTO_LENGTH, ++ &asyncResourceName)); ++ NAPI_STATUS_THROWS_VOID(napi_create_async_work(env_, callback, ++ asyncResourceName, ++ BaseWorker::Execute, ++ BaseWorker::Complete, ++ this, &asyncWork_)); ++ } ++ ++ virtual ~BaseWorker () { ++ delete [] errMsg_; ++ napi_delete_reference(env_, callbackRef_); ++ napi_delete_async_work(env_, asyncWork_); ++ } ++ ++ static void Execute (napi_env env, void* data) { ++ BaseWorker* self = (BaseWorker*)data; ++ self->DoExecute(); ++ } ++ ++ void SetStatus (leveldb::Status status) { ++ status_ = status; ++ if (!status.ok()) { ++ SetErrorMessage(status.ToString().c_str()); ++ } ++ } ++ ++ void SetErrorMessage(const char *msg) { ++ delete [] errMsg_; ++ size_t size = strlen(msg) + 1; ++ errMsg_ = new char[size]; ++ memcpy(errMsg_, msg, size); ++ } ++ ++ virtual void DoExecute () = 0; ++ virtual void DoFinally () {}; ++ ++ static void Complete (napi_env env, napi_status status, void* data) { ++ BaseWorker* self = (BaseWorker*)data; ++ self->DoComplete(); ++ self->DoFinally(); ++ delete self; ++ } ++ ++ void DoComplete () { ++ if (status_.ok()) { ++ return HandleOKCallback(); ++ } ++ ++ napi_value argv = CreateError(env_, errMsg_); ++ napi_value callback; ++ napi_get_reference_value(env_, callbackRef_, &callback); ++ CallFunction(env_, callback, 1, &argv); ++ } ++ ++ virtual void HandleOKCallback () { ++ napi_value argv; ++ napi_get_null(env_, &argv); ++ napi_value callback; ++ napi_get_reference_value(env_, callbackRef_, &callback); ++ CallFunction(env_, callback, 1, &argv); ++ } ++ ++ void Queue () { ++ napi_queue_async_work(env_, asyncWork_); ++ } ++ ++ napi_env env_; ++ napi_ref callbackRef_; ++ napi_async_work asyncWork_; ++ Database* database_; ++ ++private: ++ leveldb::Status status_; ++ char *errMsg_; ++}; ++ ++/** ++ * Owns the LevelDB storage, cache, filter policy and iterators. ++ */ ++struct Database { ++ Database (napi_env env) ++ : env_(env), ++ db_(NULL), ++ blockCache_(NULL), ++ filterPolicy_(leveldb::NewBloomFilterPolicy(10)), ++ currentIteratorId_(0), ++ pendingCloseWorker_(NULL), ++ priorityWork_(0) {} ++ ++ ~Database () { ++ if (db_ != NULL) { ++ delete db_; ++ db_ = NULL; ++ } ++ } ++ ++ leveldb::Status Open (const leveldb::Options& options, ++ const char* location) { ++ return leveldb::DB::Open(options, location, &db_); ++ } ++ ++ void CloseDatabase () { ++ delete db_; ++ db_ = NULL; ++ if (blockCache_) { ++ delete blockCache_; ++ blockCache_ = NULL; ++ } ++ } ++ ++ leveldb::Status Put (const leveldb::WriteOptions& options, ++ leveldb::Slice key, ++ leveldb::Slice value) { ++ return db_->Put(options, key, value); ++ } ++ ++ leveldb::Status Get (const leveldb::ReadOptions& options, ++ leveldb::Slice key, ++ std::string& value) { ++ return db_->Get(options, key, &value); ++ } ++ ++ leveldb::Status Del (const leveldb::WriteOptions& options, ++ leveldb::Slice key) { ++ return db_->Delete(options, key); ++ } ++ ++ leveldb::Status WriteBatch (const leveldb::WriteOptions& options, ++ leveldb::WriteBatch* batch) { ++ return db_->Write(options, batch); ++ } ++ ++ uint64_t ApproximateSize (const leveldb::Range* range) { ++ uint64_t size = 0; ++ db_->GetApproximateSizes(range, 1, &size); ++ return size; ++ } ++ ++ void CompactRange (const leveldb::Slice* start, ++ const leveldb::Slice* end) { ++ db_->CompactRange(start, end); ++ } ++ ++ void GetProperty (const leveldb::Slice& property, std::string* value) { ++ db_->GetProperty(property, value); ++ } ++ ++ const leveldb::Snapshot* NewSnapshot () { ++ return db_->GetSnapshot(); ++ } ++ ++ leveldb::Iterator* NewIterator (leveldb::ReadOptions* options) { ++ return db_->NewIterator(*options); ++ } ++ ++ void ReleaseSnapshot (const leveldb::Snapshot* snapshot) { ++ return db_->ReleaseSnapshot(snapshot); ++ } ++ ++ void AttachIterator (uint32_t id, Iterator* iterator) { ++ iterators_[id] = iterator; ++ IncrementPriorityWork(); ++ } ++ ++ void DetachIterator (uint32_t id) { ++ iterators_.erase(id); ++ DecrementPriorityWork(); ++ } ++ ++ void IncrementPriorityWork () { ++ ++priorityWork_; ++ } ++ ++ void DecrementPriorityWork () { ++ if (--priorityWork_ == 0 && pendingCloseWorker_ != NULL) { ++ pendingCloseWorker_->Queue(); ++ pendingCloseWorker_ = NULL; ++ } ++ } ++ ++ bool HasPriorityWork () { ++ return priorityWork_ > 0; ++ } ++ ++ napi_env env_; ++ leveldb::DB* db_; ++ leveldb::Cache* blockCache_; ++ const leveldb::FilterPolicy* filterPolicy_; ++ uint32_t currentIteratorId_; ++ BaseWorker *pendingCloseWorker_; ++ std::map< uint32_t, Iterator * > iterators_; ++ ++private: ++ uint32_t priorityWork_; ++}; ++ ++/** ++ * Runs when a Database is garbage collected. ++ */ ++static void FinalizeDatabase (napi_env env, void* data, void* hint) { ++ if (data) { ++ delete (Database*)data; ++ } ++} ++ ++/** ++ * Base worker class for doing async work that defers closing the database. ++ */ ++struct PriorityWorker : public BaseWorker { ++ PriorityWorker (napi_env env, Database* database, napi_value callback, const char* resourceName) ++ : BaseWorker(env, database, callback, resourceName) { ++ database_->IncrementPriorityWork(); ++ } ++ ++ ~PriorityWorker () {} ++ ++ void DoFinally () override { ++ database_->DecrementPriorityWork(); ++ } ++}; ++ ++/** ++ * Owns a leveldb iterator. ++ */ ++struct Iterator { ++ Iterator (Database* database, ++ uint32_t id, ++ std::string* start, ++ std::string* end, ++ bool reverse, ++ bool keys, ++ bool values, ++ int limit, ++ std::string* lt, ++ std::string* lte, ++ std::string* gt, ++ std::string* gte, ++ bool fillCache, ++ bool keyAsBuffer, ++ bool valueAsBuffer, ++ uint32_t highWaterMark) ++ : database_(database), ++ id_(id), ++ start_(start), ++ end_(end), ++ reverse_(reverse), ++ keys_(keys), ++ values_(values), ++ limit_(limit), ++ lt_(lt), ++ lte_(lte), ++ gt_(gt), ++ gte_(gte), ++ keyAsBuffer_(keyAsBuffer), ++ valueAsBuffer_(valueAsBuffer), ++ highWaterMark_(highWaterMark), ++ dbIterator_(NULL), ++ count_(0), ++ seeking_(false), ++ landed_(false), ++ nexting_(false), ++ ended_(false), ++ endWorker_(NULL), ++ ref_(NULL) { ++ options_ = new leveldb::ReadOptions(); ++ options_->fill_cache = fillCache; ++ options_->snapshot = database->NewSnapshot(); ++ } ++ ++ ~Iterator () { ++ assert(ended_); ++ ++ if (start_ != NULL) delete start_; ++ if (end_ != NULL) delete end_; ++ if (lt_ != NULL) delete lt_; ++ if (gt_ != NULL) delete gt_; ++ if (lte_ != NULL) delete lte_; ++ if (gte_ != NULL) delete gte_; ++ ++ delete options_; ++ } ++ ++ void Attach (napi_ref ref) { ++ ref_ = ref; ++ database_->AttachIterator(id_, this); ++ } ++ ++ napi_ref Detach () { ++ database_->DetachIterator(id_); ++ return ref_; ++ } ++ ++ leveldb::Status IteratorStatus () { ++ return dbIterator_->status(); ++ } ++ ++ void IteratorEnd () { ++ delete dbIterator_; ++ dbIterator_ = NULL; ++ database_->ReleaseSnapshot(options_->snapshot); ++ } ++ ++ void CheckEndCallback () { ++ nexting_ = false; ++ ++ if (endWorker_ != NULL) { ++ endWorker_->Queue(); ++ endWorker_ = NULL; ++ } ++ } ++ ++ bool GetIterator () { ++ if (dbIterator_ != NULL) return false; ++ ++ dbIterator_ = database_->NewIterator(options_); ++ ++ if (start_ != NULL) { ++ dbIterator_->Seek(*start_); ++ ++ if (reverse_) { ++ if (!dbIterator_->Valid()) { ++ dbIterator_->SeekToLast(); ++ } else { ++ leveldb::Slice key = dbIterator_->key(); ++ ++ if ((lt_ != NULL && key.compare(*lt_) >= 0) || ++ (lte_ != NULL && key.compare(*lte_) > 0) || ++ (start_ != NULL && key.compare(*start_) > 0)) { ++ dbIterator_->Prev(); ++ } ++ } ++ ++ // TODO: this looks like dead code. Remove it in a ++ // next major release together with Level/community#86. ++ if (dbIterator_->Valid() && lt_ != NULL) { ++ if (dbIterator_->key().compare(*lt_) >= 0) ++ dbIterator_->Prev(); ++ } ++ } else { ++ if (dbIterator_->Valid() && gt_ != NULL ++ && dbIterator_->key().compare(*gt_) == 0) ++ dbIterator_->Next(); ++ } ++ } else if (reverse_) { ++ dbIterator_->SeekToLast(); ++ } else { ++ dbIterator_->SeekToFirst(); ++ } ++ ++ return true; ++ } ++ ++ bool Read (std::string& key, std::string& value) { ++ if (!GetIterator() && !seeking_) { ++ if (reverse_) { ++ dbIterator_->Prev(); ++ } ++ else { ++ dbIterator_->Next(); ++ } ++ } ++ ++ seeking_ = false; ++ ++ if (dbIterator_->Valid()) { ++ std::string keyStr = dbIterator_->key().ToString(); ++ const int isEnd = end_ == NULL ? 1 : end_->compare(keyStr); ++ ++ if ((limit_ < 0 || ++count_ <= limit_) ++ && (end_ == NULL ++ || (reverse_ && (isEnd <= 0)) ++ || (!reverse_ && (isEnd >= 0))) ++ && ( lt_ != NULL ? (lt_->compare(keyStr) > 0) ++ : lte_ != NULL ? (lte_->compare(keyStr) >= 0) ++ : true ) ++ && ( gt_ != NULL ? (gt_->compare(keyStr) < 0) ++ : gte_ != NULL ? (gte_->compare(keyStr) <= 0) ++ : true ) ++ ) { ++ if (keys_) { ++ key.assign(dbIterator_->key().data(), dbIterator_->key().size()); ++ } ++ if (values_) { ++ value.assign(dbIterator_->value().data(), dbIterator_->value().size()); ++ } ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ ++ bool OutOfRange (leveldb::Slice& target) { ++ if ((lt_ != NULL && target.compare(*lt_) >= 0) || ++ (lte_ != NULL && target.compare(*lte_) > 0) || ++ (start_ != NULL && reverse_ && target.compare(*start_) > 0)) { ++ return true; ++ } ++ ++ if (end_ != NULL) { ++ int d = target.compare(*end_); ++ if (reverse_ ? d < 0 : d > 0) return true; ++ } ++ ++ return ((gt_ != NULL && target.compare(*gt_) <= 0) || ++ (gte_ != NULL && target.compare(*gte_) < 0) || ++ (start_ != NULL && !reverse_ && target.compare(*start_) < 0)); ++ } ++ ++ bool IteratorNext (std::vector >& result) { ++ size_t size = 0; ++ uint32_t cacheSize = 0; ++ ++ while (true) { ++ std::string key, value; ++ bool ok = Read(key, value); ++ ++ if (ok) { ++ result.push_back(std::make_pair(key, value)); ++ ++ if (!landed_) { ++ landed_ = true; ++ return true; ++ } ++ ++ size = size + key.size() + value.size(); ++ if (size > highWaterMark_) return true; ++ ++ // Limit the size of the cache to prevent starving the event loop ++ // in JS-land while we're recursively calling process.nextTick(). ++ if (++cacheSize >= 1000) return true; ++ } else { ++ return false; ++ } ++ } ++ } ++ ++ Database* database_; ++ uint32_t id_; ++ std::string* start_; ++ std::string* end_; ++ bool reverse_; ++ bool keys_; ++ bool values_; ++ int limit_; ++ std::string* lt_; ++ std::string* lte_; ++ std::string* gt_; ++ std::string* gte_; ++ bool keyAsBuffer_; ++ bool valueAsBuffer_; ++ uint32_t highWaterMark_; ++ leveldb::Iterator* dbIterator_; ++ int count_; ++ bool seeking_; ++ bool landed_; ++ bool nexting_; ++ bool ended_; ++ ++ leveldb::ReadOptions* options_; ++ BaseWorker* endWorker_; ++ ++private: ++ napi_ref ref_; ++}; ++ ++/** ++ * Returns a context object for a database. ++ */ ++NAPI_METHOD(db_init) { ++ Database* database = new Database(env); ++ ++ napi_value result; ++ NAPI_STATUS_THROWS(napi_create_external(env, database, ++ FinalizeDatabase, ++ NULL, &result)); ++ return result; ++} ++ ++/** ++ * Worker class for opening a database. ++ */ ++struct OpenWorker final : public BaseWorker { ++ OpenWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ const std::string& location, ++ bool createIfMissing, ++ bool errorIfExists, ++ bool compression, ++ uint32_t writeBufferSize, ++ uint32_t blockSize, ++ uint32_t maxOpenFiles, ++ uint32_t blockRestartInterval, ++ uint32_t maxFileSize) ++ : BaseWorker(env, database, callback, "leveldown.db.open"), ++ location_(location) { ++ options_.block_cache = database->blockCache_; ++ options_.filter_policy = database->filterPolicy_; ++ options_.create_if_missing = createIfMissing; ++ options_.error_if_exists = errorIfExists; ++ options_.compression = compression ++ ? leveldb::kSnappyCompression ++ : leveldb::kNoCompression; ++ options_.write_buffer_size = writeBufferSize; ++ options_.block_size = blockSize; ++ options_.max_open_files = maxOpenFiles; ++ options_.block_restart_interval = blockRestartInterval; ++ options_.max_file_size = maxFileSize; ++ } ++ ++ ~OpenWorker () {} ++ ++ void DoExecute () override { ++ SetStatus(database_->Open(options_, location_.c_str())); ++ } ++ ++ leveldb::Options options_; ++ std::string location_; ++}; ++ ++/** ++ * Open a database. ++ */ ++NAPI_METHOD(db_open) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ NAPI_ARGV_UTF8_NEW(location, 1); ++ ++ napi_value options = argv[2]; ++ bool createIfMissing = BooleanProperty(env, options, "createIfMissing", true); ++ bool errorIfExists = BooleanProperty(env, options, "errorIfExists", false); ++ bool compression = BooleanProperty(env, options, "compression", true); ++ ++ uint32_t cacheSize = Uint32Property(env, options, "cacheSize", 8 << 20); ++ uint32_t writeBufferSize = Uint32Property(env, options , "writeBufferSize" , 4 << 20); ++ uint32_t blockSize = Uint32Property(env, options, "blockSize", 4096); ++ uint32_t maxOpenFiles = Uint32Property(env, options, "maxOpenFiles", 1000); ++ uint32_t blockRestartInterval = Uint32Property(env, options, ++ "blockRestartInterval", 16); ++ uint32_t maxFileSize = Uint32Property(env, options, "maxFileSize", 2 << 20); ++ ++ database->blockCache_ = leveldb::NewLRUCache(cacheSize); ++ ++ napi_value callback = argv[3]; ++ OpenWorker* worker = new OpenWorker(env, database, callback, location, ++ createIfMissing, errorIfExists, ++ compression, writeBufferSize, blockSize, ++ maxOpenFiles, blockRestartInterval, ++ maxFileSize); ++ worker->Queue(); ++ delete [] location; ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for closing a database ++ */ ++struct CloseWorker final : public BaseWorker { ++ CloseWorker (napi_env env, ++ Database* database, ++ napi_value callback) ++ : BaseWorker(env, database, callback, "leveldown.db.close") {} ++ ++ ~CloseWorker () {} ++ ++ void DoExecute () override { ++ database_->CloseDatabase(); ++ } ++}; ++ ++napi_value noop_callback (napi_env env, napi_callback_info info) { ++ return 0; ++} ++ ++/** ++ * Close a database. ++ */ ++NAPI_METHOD(db_close) { ++ NAPI_ARGV(2); ++ NAPI_DB_CONTEXT(); ++ ++ napi_value callback = argv[1]; ++ CloseWorker* worker = new CloseWorker(env, database, callback); ++ ++ if (!database->HasPriorityWork()) { ++ worker->Queue(); ++ NAPI_RETURN_UNDEFINED(); ++ } ++ ++ database->pendingCloseWorker_ = worker; ++ ++ napi_value noop; ++ napi_create_function(env, NULL, 0, noop_callback, NULL, &noop); ++ ++ std::map iterators = database->iterators_; ++ std::map::iterator it; ++ ++ for (it = iterators.begin(); it != iterators.end(); ++it) { ++ iterator_end_do(env, it->second, noop); ++ } ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for putting key/value to the database ++ */ ++struct PutWorker final : public PriorityWorker { ++ PutWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::Slice key, ++ leveldb::Slice value, ++ bool sync) ++ : PriorityWorker(env, database, callback, "leveldown.db.put"), ++ key_(key), value_(value) { ++ options_.sync = sync; ++ } ++ ++ ~PutWorker () { ++ DisposeSliceBuffer(key_); ++ DisposeSliceBuffer(value_); ++ } ++ ++ void DoExecute () override { ++ SetStatus(database_->Put(options_, key_, value_)); ++ } ++ ++ leveldb::WriteOptions options_; ++ leveldb::Slice key_; ++ leveldb::Slice value_; ++}; ++ ++/** ++ * Puts a key and a value to a database. ++ */ ++NAPI_METHOD(db_put) { ++ NAPI_ARGV(5); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice key = ToSlice(env, argv[1]); ++ leveldb::Slice value = ToSlice(env, argv[2]); ++ bool sync = BooleanProperty(env, argv[3], "sync", false); ++ napi_value callback = argv[4]; ++ ++ PutWorker* worker = new PutWorker(env, database, callback, key, value, sync); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for getting a value from a database. ++ */ ++struct GetWorker final : public PriorityWorker { ++ GetWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::Slice key, ++ bool asBuffer, ++ bool fillCache) ++ : PriorityWorker(env, database, callback, "leveldown.db.get"), ++ key_(key), ++ asBuffer_(asBuffer) { ++ options_.fill_cache = fillCache; ++ } ++ ++ ~GetWorker () { ++ DisposeSliceBuffer(key_); ++ } ++ ++ void DoExecute () override { ++ SetStatus(database_->Get(options_, key_, value_)); ++ } ++ ++ void HandleOKCallback () override { ++ napi_value argv[2]; ++ napi_get_null(env_, &argv[0]); ++ ++ if (asBuffer_) { ++ napi_create_buffer_copy(env_, value_.size(), value_.data(), NULL, &argv[1]); ++ } else { ++ napi_create_string_utf8(env_, value_.data(), value_.size(), &argv[1]); ++ } ++ ++ napi_value callback; ++ napi_get_reference_value(env_, callbackRef_, &callback); ++ CallFunction(env_, callback, 2, argv); ++ } ++ ++ leveldb::ReadOptions options_; ++ leveldb::Slice key_; ++ std::string value_; ++ bool asBuffer_; ++}; ++ ++/** ++ * Gets a value from a database. ++ */ ++NAPI_METHOD(db_get) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice key = ToSlice(env, argv[1]); ++ napi_value options = argv[2]; ++ bool asBuffer = BooleanProperty(env, options, "asBuffer", true); ++ bool fillCache = BooleanProperty(env, options, "fillCache", true); ++ napi_value callback = argv[3]; ++ ++ GetWorker* worker = new GetWorker(env, database, callback, key, asBuffer, ++ fillCache); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for deleting a value from a database. ++ */ ++struct DelWorker final : public PriorityWorker { ++ DelWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::Slice key, ++ bool sync) ++ : PriorityWorker(env, database, callback, "leveldown.db.del"), ++ key_(key) { ++ options_.sync = sync; ++ } ++ ++ ~DelWorker () { ++ DisposeSliceBuffer(key_); ++ } ++ ++ void DoExecute () override { ++ SetStatus(database_->Del(options_, key_)); ++ } ++ ++ leveldb::WriteOptions options_; ++ leveldb::Slice key_; ++}; ++ ++/** ++ * Delete a value from a database. ++ */ ++NAPI_METHOD(db_del) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice key = ToSlice(env, argv[1]); ++ bool sync = BooleanProperty(env, argv[2], "sync", false); ++ napi_value callback = argv[3]; ++ ++ DelWorker* worker = new DelWorker(env, database, callback, key, sync); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for calculating the size of a range. ++ */ ++struct ApproximateSizeWorker final : public PriorityWorker { ++ ApproximateSizeWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::Slice start, ++ leveldb::Slice end) ++ : PriorityWorker(env, database, callback, "leveldown.db.approximate_size"), ++ start_(start), end_(end) {} ++ ++ ~ApproximateSizeWorker () { ++ DisposeSliceBuffer(start_); ++ DisposeSliceBuffer(end_); ++ } ++ ++ void DoExecute () override { ++ leveldb::Range range(start_, end_); ++ size_ = database_->ApproximateSize(&range); ++ } ++ ++ void HandleOKCallback () override { ++ napi_value argv[2]; ++ napi_get_null(env_, &argv[0]); ++ napi_create_uint32(env_, (uint32_t)size_, &argv[1]); ++ napi_value callback; ++ napi_get_reference_value(env_, callbackRef_, &callback); ++ CallFunction(env_, callback, 2, argv); ++ } ++ ++ leveldb::Slice start_; ++ leveldb::Slice end_; ++ uint64_t size_; ++}; ++ ++/** ++ * Calculates the approximate size of a range in a database. ++ */ ++NAPI_METHOD(db_approximate_size) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice start = ToSlice(env, argv[1]); ++ leveldb::Slice end = ToSlice(env, argv[2]); ++ ++ napi_value callback = argv[3]; ++ ++ ApproximateSizeWorker* worker = new ApproximateSizeWorker(env, database, ++ callback, start, ++ end); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for compacting a range in a database. ++ */ ++struct CompactRangeWorker final : public PriorityWorker { ++ CompactRangeWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::Slice start, ++ leveldb::Slice end) ++ : PriorityWorker(env, database, callback, "leveldown.db.compact_range"), ++ start_(start), end_(end) {} ++ ++ ~CompactRangeWorker () { ++ DisposeSliceBuffer(start_); ++ DisposeSliceBuffer(end_); ++ } ++ ++ void DoExecute () override { ++ database_->CompactRange(&start_, &end_); ++ } ++ ++ leveldb::Slice start_; ++ leveldb::Slice end_; ++}; ++ ++/** ++ * Compacts a range in a database. ++ */ ++NAPI_METHOD(db_compact_range) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice start = ToSlice(env, argv[1]); ++ leveldb::Slice end = ToSlice(env, argv[2]); ++ napi_value callback = argv[3]; ++ ++ CompactRangeWorker* worker = new CompactRangeWorker(env, database, callback, ++ start, end); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Get a property from a database. ++ */ ++NAPI_METHOD(db_get_property) { ++ NAPI_ARGV(2); ++ NAPI_DB_CONTEXT(); ++ ++ leveldb::Slice property = ToSlice(env, argv[1]); ++ ++ std::string value; ++ database->GetProperty(property, &value); ++ ++ napi_value result; ++ napi_create_string_utf8(env, value.data(), value.size(), &result); ++ ++ DisposeSliceBuffer(property); ++ ++ return result; ++} ++ ++/** ++ * Worker class for destroying a database. ++ */ ++struct DestroyWorker final : public BaseWorker { ++ DestroyWorker (napi_env env, ++ const std::string& location, ++ napi_value callback) ++ : BaseWorker(env, NULL, callback, "leveldown.destroy_db"), ++ location_(location) {} ++ ++ ~DestroyWorker () {} ++ ++ void DoExecute () override { ++ leveldb::Options options; ++ SetStatus(leveldb::DestroyDB(location_, options)); ++ } ++ ++ std::string location_; ++}; ++ ++/** ++ * Destroys a database. ++ */ ++NAPI_METHOD(destroy_db) { ++ NAPI_ARGV(2); ++ NAPI_ARGV_UTF8_NEW(location, 0); ++ napi_value callback = argv[1]; ++ ++ DestroyWorker* worker = new DestroyWorker(env, location, callback); ++ worker->Queue(); ++ ++ delete [] location; ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for repairing a database. ++ */ ++struct RepairWorker final : public BaseWorker { ++ RepairWorker (napi_env env, ++ const std::string& location, ++ napi_value callback) ++ : BaseWorker(env, NULL, callback, "leveldown.repair_db"), ++ location_(location) {} ++ ++ ~RepairWorker () {} ++ ++ void DoExecute () override { ++ leveldb::Options options; ++ SetStatus(leveldb::RepairDB(location_, options)); ++ } ++ ++ std::string location_; ++}; ++ ++/** ++ * Repairs a database. ++ */ ++NAPI_METHOD(repair_db) { ++ NAPI_ARGV(2); ++ NAPI_ARGV_UTF8_NEW(location, 0); ++ napi_value callback = argv[1]; ++ ++ RepairWorker* worker = new RepairWorker(env, location, callback); ++ worker->Queue(); ++ ++ delete [] location; ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Runs when an Iterator is garbage collected. ++ */ ++static void FinalizeIterator (napi_env env, void* data, void* hint) { ++ if (data) { ++ delete (Iterator*)data; ++ } ++} ++ ++/** ++ * Create an iterator. ++ */ ++NAPI_METHOD(iterator_init) { ++ NAPI_ARGV(2); ++ NAPI_DB_CONTEXT(); ++ ++ napi_value options = argv[1]; ++ bool reverse = BooleanProperty(env, options, "reverse", false); ++ bool keys = BooleanProperty(env, options, "keys", true); ++ bool values = BooleanProperty(env, options, "values", true); ++ bool fillCache = BooleanProperty(env, options, "fillCache", false); ++ bool keyAsBuffer = BooleanProperty(env, options, "keyAsBuffer", true); ++ bool valueAsBuffer = BooleanProperty(env, options, "valueAsBuffer", true); ++ int limit = Int32Property(env, options, "limit", -1); ++ uint32_t highWaterMark = Uint32Property(env, options, "highWaterMark", ++ 16 * 1024); ++ ++ std::string* start = NULL; ++ std::string* end = RangeOption(env, options, "end"); ++ std::string* lt = RangeOption(env, options, "lt"); ++ std::string* lte = RangeOption(env, options, "lte"); ++ std::string* gt = RangeOption(env, options, "gt"); ++ std::string* gte = RangeOption(env, options, "gte"); ++ ++ if (!reverse && gte != NULL) start = new std::string(*gte); ++ else if (!reverse && gt != NULL) start = new std::string(*gt); ++ else if (reverse && lte != NULL) start = new std::string(*lte); ++ else if (reverse && lt != NULL) start = new std::string(*lt); ++ else start = RangeOption(env, options, "start"); ++ ++ uint32_t id = database->currentIteratorId_++; ++ Iterator* iterator = new Iterator(database, id, start, end, reverse, keys, ++ values, limit, lt, lte, gt, gte, fillCache, ++ keyAsBuffer, valueAsBuffer, highWaterMark); ++ napi_value result; ++ napi_ref ref; ++ ++ NAPI_STATUS_THROWS(napi_create_external(env, iterator, ++ FinalizeIterator, ++ NULL, &result)); ++ ++ // Prevent GC of JS object before the iterator is ended (explicitly or on ++ // db close) and keep track of non-ended iterators to end them on db close. ++ NAPI_STATUS_THROWS(napi_create_reference(env, result, 1, &ref)); ++ iterator->Attach(ref); ++ ++ return result; ++} ++ ++/** ++ * Seeks an iterator. ++ */ ++NAPI_METHOD(iterator_seek) { ++ NAPI_ARGV(2); ++ NAPI_ITERATOR_CONTEXT(); ++ ++ if (iterator->ended_) { ++ napi_throw_error(env, NULL, "iterator has ended"); ++ } ++ ++ leveldb::Slice target = ToSlice(env, argv[1]); ++ iterator->GetIterator(); ++ ++ leveldb::Iterator* dbIterator = iterator->dbIterator_; ++ dbIterator->Seek(target); ++ ++ iterator->seeking_ = true; ++ iterator->landed_ = false; ++ ++ if (iterator->OutOfRange(target)) { ++ if (iterator->reverse_) { ++ dbIterator->SeekToFirst(); ++ dbIterator->Prev(); ++ } else { ++ dbIterator->SeekToLast(); ++ dbIterator->Next(); ++ } ++ } else if (dbIterator->Valid()) { ++ int cmp = dbIterator->key().compare(target); ++ if (cmp > 0 && iterator->reverse_) { ++ dbIterator->Prev(); ++ } else if (cmp < 0 && !iterator->reverse_) { ++ dbIterator->Next(); ++ } ++ } else { ++ if (iterator->reverse_) { ++ dbIterator->SeekToLast(); ++ } else { ++ dbIterator->SeekToFirst(); ++ } ++ if (dbIterator->Valid()) { ++ int cmp = dbIterator->key().compare(target); ++ if (cmp > 0 && iterator->reverse_) { ++ dbIterator->SeekToFirst(); ++ dbIterator->Prev(); ++ } else if (cmp < 0 && !iterator->reverse_) { ++ dbIterator->SeekToLast(); ++ dbIterator->Next(); ++ } ++ } ++ } ++ ++ DisposeSliceBuffer(target); ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for ending an iterator ++ */ ++struct EndWorker final : public BaseWorker { ++ EndWorker (napi_env env, ++ Iterator* iterator, ++ napi_value callback) ++ : BaseWorker(env, iterator->database_, callback, "leveldown.iterator.end"), ++ iterator_(iterator) {} ++ ++ ~EndWorker () {} ++ ++ void DoExecute () override { ++ iterator_->IteratorEnd(); ++ } ++ ++ void HandleOKCallback () override { ++ napi_delete_reference(env_, iterator_->Detach()); ++ BaseWorker::HandleOKCallback(); ++ } ++ ++ Iterator* iterator_; ++}; ++ ++/** ++ * Called by NAPI_METHOD(iterator_end) and also when closing ++ * open iterators during NAPI_METHOD(db_close). ++ */ ++static void iterator_end_do (napi_env env, Iterator* iterator, napi_value cb) { ++ if (!iterator->ended_) { ++ EndWorker* worker = new EndWorker(env, iterator, cb); ++ iterator->ended_ = true; ++ ++ if (iterator->nexting_) { ++ iterator->endWorker_ = worker; ++ } else { ++ worker->Queue(); ++ } ++ } ++} ++ ++/** ++ * Ends an iterator. ++ */ ++NAPI_METHOD(iterator_end) { ++ NAPI_ARGV(2); ++ NAPI_ITERATOR_CONTEXT(); ++ ++ iterator_end_do(env, iterator, argv[1]); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for nexting an iterator. ++ */ ++struct NextWorker final : public BaseWorker { ++ NextWorker (napi_env env, ++ Iterator* iterator, ++ napi_value callback) ++ : BaseWorker(env, iterator->database_, callback, ++ "leveldown.iterator.next"), ++ iterator_(iterator) {} ++ ++ ~NextWorker () {} ++ ++ void DoExecute () override { ++ ok_ = iterator_->IteratorNext(result_); ++ if (!ok_) { ++ SetStatus(iterator_->IteratorStatus()); ++ } ++ } ++ ++ void HandleOKCallback () override { ++ size_t arraySize = result_.size() * 2; ++ napi_value jsArray; ++ napi_create_array_with_length(env_, arraySize, &jsArray); ++ ++ for (size_t idx = 0; idx < result_.size(); ++idx) { ++ std::pair row = result_[idx]; ++ std::string key = row.first; ++ std::string value = row.second; ++ ++ napi_value returnKey; ++ if (iterator_->keyAsBuffer_) { ++ napi_create_buffer_copy(env_, key.size(), key.data(), NULL, &returnKey); ++ } else { ++ napi_create_string_utf8(env_, key.data(), key.size(), &returnKey); ++ } ++ ++ napi_value returnValue; ++ if (iterator_->valueAsBuffer_) { ++ napi_create_buffer_copy(env_, value.size(), value.data(), NULL, &returnValue); ++ } else { ++ napi_create_string_utf8(env_, value.data(), value.size(), &returnValue); ++ } ++ ++ // put the key & value in a descending order, so that they can be .pop:ed in javascript-land ++ napi_set_element(env_, jsArray, static_cast(arraySize - idx * 2 - 1), returnKey); ++ napi_set_element(env_, jsArray, static_cast(arraySize - idx * 2 - 2), returnValue); ++ } ++ ++ // clean up & handle the next/end state ++ iterator_->CheckEndCallback(); ++ ++ napi_value argv[3]; ++ napi_get_null(env_, &argv[0]); ++ argv[1] = jsArray; ++ napi_get_boolean(env_, !ok_, &argv[2]); ++ napi_value callback; ++ napi_get_reference_value(env_, callbackRef_, &callback); ++ CallFunction(env_, callback, 3, argv); ++ } ++ ++ Iterator* iterator_; ++ std::vector > result_; ++ bool ok_; ++}; ++ ++/** ++ * Moves an iterator to next element. ++ */ ++NAPI_METHOD(iterator_next) { ++ NAPI_ARGV(2); ++ NAPI_ITERATOR_CONTEXT(); ++ ++ napi_value callback = argv[1]; ++ ++ if (iterator->ended_) { ++ napi_value argv = CreateError(env, "iterator has ended"); ++ CallFunction(env, callback, 1, &argv); ++ ++ NAPI_RETURN_UNDEFINED(); ++ } ++ ++ NextWorker* worker = new NextWorker(env, iterator, callback); ++ iterator->nexting_ = true; ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for batch write operation. ++ */ ++struct BatchWorker final : public PriorityWorker { ++ BatchWorker (napi_env env, ++ Database* database, ++ napi_value callback, ++ leveldb::WriteBatch* batch, ++ bool sync, ++ bool hasData) ++ : PriorityWorker(env, database, callback, "leveldown.batch.do"), ++ batch_(batch), hasData_(hasData) { ++ options_.sync = sync; ++ } ++ ++ ~BatchWorker () { ++ delete batch_; ++ } ++ ++ void DoExecute () override { ++ if (hasData_) { ++ SetStatus(database_->WriteBatch(options_, batch_)); ++ } ++ } ++ ++ leveldb::WriteOptions options_; ++ leveldb::WriteBatch* batch_; ++ bool hasData_; ++}; ++ ++/** ++ * Does a batch write operation on a database. ++ */ ++NAPI_METHOD(batch_do) { ++ NAPI_ARGV(4); ++ NAPI_DB_CONTEXT(); ++ ++ napi_value array = argv[1]; ++ bool sync = BooleanProperty(env, argv[2], "sync", false); ++ napi_value callback = argv[3]; ++ ++ uint32_t length; ++ napi_get_array_length(env, array, &length); ++ ++ leveldb::WriteBatch* batch = new leveldb::WriteBatch(); ++ bool hasData = false; ++ ++ for (uint32_t i = 0; i < length; i++) { ++ napi_value element; ++ napi_get_element(env, array, i, &element); ++ ++ if (!IsObject(env, element)) continue; ++ ++ std::string type = StringProperty(env, element, "type"); ++ ++ if (type == "del") { ++ if (!HasProperty(env, element, "key")) continue; ++ leveldb::Slice key = ToSlice(env, GetProperty(env, element, "key")); ++ ++ batch->Delete(key); ++ if (!hasData) hasData = true; ++ ++ DisposeSliceBuffer(key); ++ } else if (type == "put") { ++ if (!HasProperty(env, element, "key")) continue; ++ if (!HasProperty(env, element, "value")) continue; ++ ++ leveldb::Slice key = ToSlice(env, GetProperty(env, element, "key")); ++ leveldb::Slice value = ToSlice(env, GetProperty(env, element, "value")); ++ ++ batch->Put(key, value); ++ if (!hasData) hasData = true; ++ ++ DisposeSliceBuffer(key); ++ DisposeSliceBuffer(value); ++ } ++ } ++ ++ BatchWorker* worker = new BatchWorker(env, database, callback, batch, sync, hasData); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Owns a WriteBatch. ++ */ ++struct Batch { ++ Batch (Database* database) ++ : database_(database), ++ batch_(new leveldb::WriteBatch()), ++ hasData_(false) {} ++ ++ ~Batch () { ++ delete batch_; ++ } ++ ++ void Put (leveldb::Slice key, leveldb::Slice value) { ++ batch_->Put(key, value); ++ hasData_ = true; ++ } ++ ++ void Del (leveldb::Slice key) { ++ batch_->Delete(key); ++ hasData_ = true; ++ } ++ ++ void Clear () { ++ batch_->Clear(); ++ hasData_ = false; ++ } ++ ++ leveldb::Status Write (bool sync) { ++ leveldb::WriteOptions options; ++ options.sync = sync; ++ return database_->WriteBatch(options, batch_); ++ } ++ ++ Database* database_; ++ leveldb::WriteBatch* batch_; ++ bool hasData_; ++}; ++ ++/** ++ * Runs when a Batch is garbage collected. ++ */ ++static void FinalizeBatch (napi_env env, void* data, void* hint) { ++ if (data) { ++ delete (Batch*)data; ++ } ++} ++ ++/** ++ * Return a batch object. ++ */ ++NAPI_METHOD(batch_init) { ++ NAPI_ARGV(1); ++ NAPI_DB_CONTEXT(); ++ ++ Batch* batch = new Batch(database); ++ ++ napi_value result; ++ NAPI_STATUS_THROWS(napi_create_external(env, batch, ++ FinalizeBatch, ++ NULL, &result)); ++ return result; ++} ++ ++/** ++ * Adds a put instruction to a batch object. ++ */ ++NAPI_METHOD(batch_put) { ++ NAPI_ARGV(3); ++ NAPI_BATCH_CONTEXT(); ++ ++ leveldb::Slice key = ToSlice(env, argv[1]); ++ leveldb::Slice value = ToSlice(env, argv[2]); ++ batch->Put(key, value); ++ DisposeSliceBuffer(key); ++ DisposeSliceBuffer(value); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Adds a delete instruction to a batch object. ++ */ ++NAPI_METHOD(batch_del) { ++ NAPI_ARGV(2); ++ NAPI_BATCH_CONTEXT(); ++ ++ leveldb::Slice key = ToSlice(env, argv[1]); ++ batch->Del(key); ++ DisposeSliceBuffer(key); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Clears a batch object. ++ */ ++NAPI_METHOD(batch_clear) { ++ NAPI_ARGV(1); ++ NAPI_BATCH_CONTEXT(); ++ ++ batch->Clear(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * Worker class for batch write operation. ++ */ ++struct BatchWriteWorker final : public PriorityWorker { ++ BatchWriteWorker (napi_env env, ++ napi_value context, ++ Batch* batch, ++ napi_value callback, ++ bool sync) ++ : PriorityWorker(env, batch->database_, callback, "leveldown.batch.write"), ++ batch_(batch), ++ sync_(sync) { ++ // Prevent GC of batch object before we execute ++ NAPI_STATUS_THROWS_VOID(napi_create_reference(env_, context, 1, &contextRef_)); ++ } ++ ++ ~BatchWriteWorker () { ++ napi_delete_reference(env_, contextRef_); ++ } ++ ++ void DoExecute () override { ++ if (batch_->hasData_) { ++ SetStatus(batch_->Write(sync_)); ++ } ++ } ++ ++ Batch* batch_; ++ bool sync_; ++ ++private: ++ napi_ref contextRef_; ++}; ++ ++/** ++ * Writes a batch object. ++ */ ++NAPI_METHOD(batch_write) { ++ NAPI_ARGV(3); ++ NAPI_BATCH_CONTEXT(); ++ ++ napi_value options = argv[1]; ++ bool sync = BooleanProperty(env, options, "sync", false); ++ napi_value callback = argv[2]; ++ ++ BatchWriteWorker* worker = new BatchWriteWorker(env, argv[0], batch, callback, sync); ++ worker->Queue(); ++ ++ NAPI_RETURN_UNDEFINED(); ++} ++ ++/** ++ * All exported functions. ++ */ ++NAPI_INIT() { ++ NAPI_EXPORT_FUNCTION(db_init); ++ NAPI_EXPORT_FUNCTION(db_open); ++ NAPI_EXPORT_FUNCTION(db_close); ++ NAPI_EXPORT_FUNCTION(db_put); ++ NAPI_EXPORT_FUNCTION(db_get); ++ NAPI_EXPORT_FUNCTION(db_del); ++ NAPI_EXPORT_FUNCTION(db_approximate_size); ++ NAPI_EXPORT_FUNCTION(db_compact_range); ++ NAPI_EXPORT_FUNCTION(db_get_property); ++ ++ NAPI_EXPORT_FUNCTION(destroy_db); ++ NAPI_EXPORT_FUNCTION(repair_db); ++ ++ NAPI_EXPORT_FUNCTION(iterator_init); ++ NAPI_EXPORT_FUNCTION(iterator_seek); ++ NAPI_EXPORT_FUNCTION(iterator_end); ++ NAPI_EXPORT_FUNCTION(iterator_next); ++ ++ NAPI_EXPORT_FUNCTION(batch_do); ++ NAPI_EXPORT_FUNCTION(batch_init); ++ NAPI_EXPORT_FUNCTION(batch_put); ++ NAPI_EXPORT_FUNCTION(batch_del); ++ NAPI_EXPORT_FUNCTION(batch_clear); ++ NAPI_EXPORT_FUNCTION(batch_write); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.gyp b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.gyp +new file mode 100644 +index 0000000..ab1b717 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/binding.gyp +@@ -0,0 +1,52 @@ ++{ ++ "targets": [{ ++ "target_name": "leveldown", ++ "conditions": [ ++ ["OS == 'win'", { ++ "defines": [ ++ "_HAS_EXCEPTIONS=0" ++ ], ++ "msvs_settings": { ++ "VCCLCompilerTool": { ++ "RuntimeTypeInfo": "false", ++ "EnableFunctionLevelLinking": "true", ++ "ExceptionHandling": "2", ++ "DisableSpecificWarnings": [ "4355", "4530" ,"4267", "4244", "4506" ] ++ } ++ } ++ }], ++ ["OS == 'linux'", { ++ "cflags": [], ++ "cflags!": [ "-fno-tree-vrp"] ++ }], ++ ["OS == 'mac'", { ++ "cflags+": ["-fvisibility=hidden"], ++ "xcode_settings": { ++ "GCC_SYMBOLS_PRIVATE_EXTERN": "YES" # -fvisibility=hidden ++ } ++ }], ++ ["OS == 'android'", { ++ "cflags": [ "-fPIC" ], ++ "ldflags": [ "-fPIC" ], ++ "cflags!": [ ++ "-fno-tree-vrp", ++ "-mfloat-abi=hard", ++ "-fPIE" ++ ], ++ "ldflags!": [ "-fPIE" ] ++ }], ++ ["target_arch == 'arm'", { ++ "cflags": [ "-mfloat-abi=hard" ] ++ }] ++ ], ++ "dependencies": [ ++ "<(module_root_dir)/deps/leveldb/leveldb.gyp:leveldb" ++ ], ++ "include_dirs" : [ ++ " is present ++# -DLEVELDB_PLATFORM_POSIX for Posix-based platforms ++# -DSNAPPY if the Snappy library is present ++# ++ ++OUTPUT=$1 ++PREFIX=$2 ++if test -z "$OUTPUT" || test -z "$PREFIX"; then ++ echo "usage: $0 " >&2 ++ exit 1 ++fi ++ ++# Delete existing output, if it exists ++rm -f $OUTPUT ++touch $OUTPUT ++ ++if test -z "$CC"; then ++ CC=cc ++fi ++ ++if test -z "$CXX"; then ++ CXX=g++ ++fi ++ ++if test -z "$TMPDIR"; then ++ TMPDIR=/tmp ++fi ++ ++# Detect OS ++if test -z "$TARGET_OS"; then ++ TARGET_OS=`uname -s` ++fi ++ ++COMMON_FLAGS= ++CROSS_COMPILE= ++PLATFORM_CCFLAGS= ++PLATFORM_CXXFLAGS= ++PLATFORM_LDFLAGS= ++PLATFORM_LIBS= ++PLATFORM_SHARED_EXT="so" ++PLATFORM_SHARED_LDFLAGS="-shared -Wl,-soname -Wl," ++PLATFORM_SHARED_CFLAGS="-fPIC" ++PLATFORM_SHARED_VERSIONED=true ++PLATFORM_SSEFLAGS= ++ ++MEMCMP_FLAG= ++if [ "$CXX" = "g++" ]; then ++ # Use libc's memcmp instead of GCC's memcmp. This results in ~40% ++ # performance improvement on readrandom under gcc 4.4.3 on Linux/x86. ++ MEMCMP_FLAG="-fno-builtin-memcmp" ++fi ++ ++case "$TARGET_OS" in ++ CYGWIN_*) ++ PLATFORM=OS_LINUX ++ COMMON_FLAGS="$MEMCMP_FLAG -lpthread -DOS_LINUX -DCYGWIN" ++ PLATFORM_LDFLAGS="-lpthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ Darwin) ++ PLATFORM=OS_MACOSX ++ COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" ++ PLATFORM_SHARED_EXT=dylib ++ [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` ++ PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name $INSTALL_PATH/" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ Linux) ++ PLATFORM=OS_LINUX ++ COMMON_FLAGS="$MEMCMP_FLAG -pthread -DOS_LINUX" ++ PLATFORM_LDFLAGS="-pthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ SunOS) ++ PLATFORM=OS_SOLARIS ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_SOLARIS" ++ PLATFORM_LIBS="-lpthread -lrt" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ FreeBSD) ++ PLATFORM=OS_FREEBSD ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_FREEBSD" ++ PLATFORM_LIBS="-lpthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ NetBSD) ++ PLATFORM=OS_NETBSD ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_NETBSD" ++ PLATFORM_LIBS="-lpthread -lgcc_s" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ OpenBSD) ++ PLATFORM=OS_OPENBSD ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_OPENBSD" ++ PLATFORM_LDFLAGS="-pthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ DragonFly) ++ PLATFORM=OS_DRAGONFLYBSD ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_DRAGONFLYBSD" ++ PLATFORM_LIBS="-lpthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ ;; ++ OS_ANDROID_CROSSCOMPILE) ++ PLATFORM=OS_ANDROID ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_ANDROID -DLEVELDB_PLATFORM_POSIX" ++ PLATFORM_LDFLAGS="" # All pthread features are in the Android C library ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ CROSS_COMPILE=true ++ ;; ++ HP-UX) ++ PLATFORM=OS_HPUX ++ COMMON_FLAGS="$MEMCMP_FLAG -D_REENTRANT -DOS_HPUX" ++ PLATFORM_LDFLAGS="-pthread" ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ # man ld: +h internal_name ++ PLATFORM_SHARED_LDFLAGS="-shared -Wl,+h -Wl," ++ ;; ++ IOS) ++ PLATFORM=IOS ++ COMMON_FLAGS="$MEMCMP_FLAG -DOS_MACOSX" ++ [ -z "$INSTALL_PATH" ] && INSTALL_PATH=`pwd` ++ PORT_FILE=port/port_posix.cc ++ PORT_SSE_FILE=port/port_posix_sse.cc ++ PLATFORM_SHARED_EXT= ++ PLATFORM_SHARED_LDFLAGS= ++ PLATFORM_SHARED_CFLAGS= ++ PLATFORM_SHARED_VERSIONED= ++ ;; ++ *) ++ echo "Unknown platform!" >&2 ++ exit 1 ++esac ++ ++# We want to make a list of all cc files within util, db, table, and helpers ++# except for the test and benchmark files. By default, find will output a list ++# of all files matching either rule, so we need to append -print to make the ++# prune take effect. ++DIRS="$PREFIX/db $PREFIX/util $PREFIX/table" ++ ++set -f # temporarily disable globbing so that our patterns aren't expanded ++PRUNE_TEST="-name *test*.cc -prune" ++PRUNE_BENCH="-name *_bench.cc -prune" ++PRUNE_TOOL="-name leveldbutil.cc -prune" ++PORTABLE_FILES=`find $DIRS $PRUNE_TEST -o $PRUNE_BENCH -o $PRUNE_TOOL -o -name '*.cc' -print | sort | sed "s,^$PREFIX/,," | tr "\n" " "` ++ ++set +f # re-enable globbing ++ ++# The sources consist of the portable files, plus the platform-specific port ++# file. ++echo "SOURCES=$PORTABLE_FILES $PORT_FILE $PORT_SSE_FILE" >> $OUTPUT ++echo "MEMENV_SOURCES=helpers/memenv/memenv.cc" >> $OUTPUT ++ ++if [ "$CROSS_COMPILE" = "true" ]; then ++ # Cross-compiling; do not try any compilation tests. ++ true ++else ++ CXXOUTPUT="${TMPDIR}/leveldb_build_detect_platform-cxx.$$" ++ ++ # If -std=c++0x works, use as fallback for when memory barriers ++ # are not available. ++ $CXX $CXXFLAGS -std=c++0x -x c++ - -o $CXXOUTPUT 2>/dev/null < ++ int main() {} ++EOF ++ if [ "$?" = 0 ]; then ++ COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT" ++ PLATFORM_CXXFLAGS="-std=c++0x" ++ else ++ COMMON_FLAGS="$COMMON_FLAGS -DLEVELDB_PLATFORM_POSIX" ++ fi ++ ++ # Test whether Snappy library is installed ++ # http://code.google.com/p/snappy/ ++ $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT 2>/dev/null < ++ int main() {} ++EOF ++ if [ "$?" = 0 ]; then ++ COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY" ++ PLATFORM_LIBS="$PLATFORM_LIBS -lsnappy" ++ fi ++ ++ # Test whether tcmalloc is available ++ $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -ltcmalloc 2>/dev/null </dev/null ++ ++ # Test if gcc SSE 4.2 is supported ++ $CXX $CXXFLAGS -x c++ - -o $CXXOUTPUT -msse4.2 2>/dev/null </dev/null ++fi ++ ++# Use the SSE 4.2 CRC32C intrinsics iff runtime checks indicate compiler supports them. ++if [ -n "$PLATFORM_SSEFLAGS" ]; then ++ PLATFORM_SSEFLAGS="$PLATFORM_SSEFLAGS -DLEVELDB_PLATFORM_POSIX_SSE" ++fi ++ ++PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS" ++PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS" ++ ++echo "CC=$CC" >> $OUTPUT ++echo "CXX=$CXX" >> $OUTPUT ++echo "PLATFORM=$PLATFORM" >> $OUTPUT ++echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> $OUTPUT ++echo "PLATFORM_LIBS=$PLATFORM_LIBS" >> $OUTPUT ++echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> $OUTPUT ++echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> $OUTPUT ++echo "PLATFORM_SSEFLAGS=$PLATFORM_SSEFLAGS" >> $OUTPUT ++echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> $OUTPUT ++echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> $OUTPUT ++echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> $OUTPUT ++echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> $OUTPUT +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/autocompact_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/autocompact_test.cc +new file mode 100644 +index 0000000..d20a236 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/autocompact_test.cc +@@ -0,0 +1,118 @@ ++// Copyright (c) 2013 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/db.h" ++#include "db/db_impl.h" ++#include "leveldb/cache.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++class AutoCompactTest { ++ public: ++ std::string dbname_; ++ Cache* tiny_cache_; ++ Options options_; ++ DB* db_; ++ ++ AutoCompactTest() { ++ dbname_ = test::TmpDir() + "/autocompact_test"; ++ tiny_cache_ = NewLRUCache(100); ++ options_.block_cache = tiny_cache_; ++ DestroyDB(dbname_, options_); ++ options_.create_if_missing = true; ++ options_.compression = kNoCompression; ++ ASSERT_OK(DB::Open(options_, dbname_, &db_)); ++ } ++ ++ ~AutoCompactTest() { ++ delete db_; ++ DestroyDB(dbname_, Options()); ++ delete tiny_cache_; ++ } ++ ++ std::string Key(int i) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "key%06d", i); ++ return std::string(buf); ++ } ++ ++ uint64_t Size(const Slice& start, const Slice& limit) { ++ Range r(start, limit); ++ uint64_t size; ++ db_->GetApproximateSizes(&r, 1, &size); ++ return size; ++ } ++ ++ void DoReads(int n); ++}; ++ ++static const int kValueSize = 200 * 1024; ++static const int kTotalSize = 100 * 1024 * 1024; ++static const int kCount = kTotalSize / kValueSize; ++ ++// Read through the first n keys repeatedly and check that they get ++// compacted (verified by checking the size of the key space). ++void AutoCompactTest::DoReads(int n) { ++ std::string value(kValueSize, 'x'); ++ DBImpl* dbi = reinterpret_cast(db_); ++ ++ // Fill database ++ for (int i = 0; i < kCount; i++) { ++ ASSERT_OK(db_->Put(WriteOptions(), Key(i), value)); ++ } ++ ASSERT_OK(dbi->TEST_CompactMemTable()); ++ ++ // Delete everything ++ for (int i = 0; i < kCount; i++) { ++ ASSERT_OK(db_->Delete(WriteOptions(), Key(i))); ++ } ++ ASSERT_OK(dbi->TEST_CompactMemTable()); ++ ++ // Get initial measurement of the space we will be reading. ++ const int64_t initial_size = Size(Key(0), Key(n)); ++ const int64_t initial_other_size = Size(Key(n), Key(kCount)); ++ ++ // Read until size drops significantly. ++ std::string limit_key = Key(n); ++ for (int read = 0; true; read++) { ++ ASSERT_LT(read, 100) << "Taking too long to compact"; ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ for (iter->SeekToFirst(); ++ iter->Valid() && iter->key().ToString() < limit_key; ++ iter->Next()) { ++ // Drop data ++ } ++ delete iter; ++ // Wait a little bit to allow any triggered compactions to complete. ++ Env::Default()->SleepForMicroseconds(1000000); ++ uint64_t size = Size(Key(0), Key(n)); ++ fprintf(stderr, "iter %3d => %7.3f MB [other %7.3f MB]\n", ++ read+1, size/1048576.0, Size(Key(n), Key(kCount))/1048576.0); ++ if (size <= initial_size/10) { ++ break; ++ } ++ } ++ ++ // Verify that the size of the key space not touched by the reads ++ // is pretty much unchanged. ++ const int64_t final_other_size = Size(Key(n), Key(kCount)); ++ ASSERT_LE(final_other_size, initial_other_size + 1048576); ++ ASSERT_GE(final_other_size, initial_other_size/5 - 1048576); ++} ++ ++TEST(AutoCompactTest, ReadAll) { ++ DoReads(kCount); ++} ++ ++TEST(AutoCompactTest, ReadHalf) { ++ DoReads(kCount/2); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.cc +new file mode 100644 +index 0000000..f419882 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.cc +@@ -0,0 +1,88 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/builder.h" ++ ++#include "db/filename.h" ++#include "db/dbformat.h" ++#include "db/table_cache.h" ++#include "db/version_edit.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/iterator.h" ++ ++namespace leveldb { ++ ++Status BuildTable(const std::string& dbname, ++ Env* env, ++ const Options& options, ++ TableCache* table_cache, ++ Iterator* iter, ++ FileMetaData* meta) { ++ Status s; ++ meta->file_size = 0; ++ iter->SeekToFirst(); ++ ++ std::string fname = TableFileName(dbname, meta->number); ++ if (iter->Valid()) { ++ WritableFile* file; ++ s = env->NewWritableFile(fname, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ ++ TableBuilder* builder = new TableBuilder(options, file); ++ meta->smallest.DecodeFrom(iter->key()); ++ for (; iter->Valid(); iter->Next()) { ++ Slice key = iter->key(); ++ meta->largest.DecodeFrom(key); ++ builder->Add(key, iter->value()); ++ } ++ ++ // Finish and check for builder errors ++ if (s.ok()) { ++ s = builder->Finish(); ++ if (s.ok()) { ++ meta->file_size = builder->FileSize(); ++ assert(meta->file_size > 0); ++ } ++ } else { ++ builder->Abandon(); ++ } ++ delete builder; ++ ++ // Finish and check for file errors ++ if (s.ok()) { ++ s = file->Sync(); ++ } ++ if (s.ok()) { ++ s = file->Close(); ++ } ++ delete file; ++ file = NULL; ++ ++ if (s.ok()) { ++ // Verify that the table is usable ++ Iterator* it = table_cache->NewIterator(ReadOptions(), ++ meta->number, ++ meta->file_size); ++ s = it->status(); ++ delete it; ++ } ++ } ++ ++ // Check for input iterator errors ++ if (!iter->status().ok()) { ++ s = iter->status(); ++ } ++ ++ if (s.ok() && meta->file_size > 0) { ++ // Keep it ++ } else { ++ env->DeleteFile(fname); ++ } ++ return s; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.h +new file mode 100644 +index 0000000..62431fc +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.h +@@ -0,0 +1,34 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_BUILDER_H_ ++#define STORAGE_LEVELDB_DB_BUILDER_H_ ++ ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++struct Options; ++struct FileMetaData; ++ ++class Env; ++class Iterator; ++class TableCache; ++class VersionEdit; ++ ++// Build a Table file from the contents of *iter. The generated file ++// will be named according to meta->number. On success, the rest of ++// *meta will be filled with metadata about the generated table. ++// If no data is present in *iter, meta->file_size will be set to ++// zero, and no Table file will be produced. ++extern Status BuildTable(const std::string& dbname, ++ Env* env, ++ const Options& options, ++ TableCache* table_cache, ++ Iterator* iter, ++ FileMetaData* meta); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_BUILDER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c.cc +new file mode 100644 +index 0000000..08ff0ad +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c.cc +@@ -0,0 +1,595 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/c.h" ++ ++#include ++#include ++#include "leveldb/cache.h" ++#include "leveldb/comparator.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/filter_policy.h" ++#include "leveldb/iterator.h" ++#include "leveldb/options.h" ++#include "leveldb/status.h" ++#include "leveldb/write_batch.h" ++ ++using leveldb::Cache; ++using leveldb::Comparator; ++using leveldb::CompressionType; ++using leveldb::DB; ++using leveldb::Env; ++using leveldb::FileLock; ++using leveldb::FilterPolicy; ++using leveldb::Iterator; ++using leveldb::kMajorVersion; ++using leveldb::kMinorVersion; ++using leveldb::Logger; ++using leveldb::NewBloomFilterPolicy; ++using leveldb::NewLRUCache; ++using leveldb::Options; ++using leveldb::RandomAccessFile; ++using leveldb::Range; ++using leveldb::ReadOptions; ++using leveldb::SequentialFile; ++using leveldb::Slice; ++using leveldb::Snapshot; ++using leveldb::Status; ++using leveldb::WritableFile; ++using leveldb::WriteBatch; ++using leveldb::WriteOptions; ++ ++extern "C" { ++ ++struct leveldb_t { DB* rep; }; ++struct leveldb_iterator_t { Iterator* rep; }; ++struct leveldb_writebatch_t { WriteBatch rep; }; ++struct leveldb_snapshot_t { const Snapshot* rep; }; ++struct leveldb_readoptions_t { ReadOptions rep; }; ++struct leveldb_writeoptions_t { WriteOptions rep; }; ++struct leveldb_options_t { Options rep; }; ++struct leveldb_cache_t { Cache* rep; }; ++struct leveldb_seqfile_t { SequentialFile* rep; }; ++struct leveldb_randomfile_t { RandomAccessFile* rep; }; ++struct leveldb_writablefile_t { WritableFile* rep; }; ++struct leveldb_logger_t { Logger* rep; }; ++struct leveldb_filelock_t { FileLock* rep; }; ++ ++struct leveldb_comparator_t : public Comparator { ++ void* state_; ++ void (*destructor_)(void*); ++ int (*compare_)( ++ void*, ++ const char* a, size_t alen, ++ const char* b, size_t blen); ++ const char* (*name_)(void*); ++ ++ virtual ~leveldb_comparator_t() { ++ (*destructor_)(state_); ++ } ++ ++ virtual int Compare(const Slice& a, const Slice& b) const { ++ return (*compare_)(state_, a.data(), a.size(), b.data(), b.size()); ++ } ++ ++ virtual const char* Name() const { ++ return (*name_)(state_); ++ } ++ ++ // No-ops since the C binding does not support key shortening methods. ++ virtual void FindShortestSeparator(std::string*, const Slice&) const { } ++ virtual void FindShortSuccessor(std::string* key) const { } ++}; ++ ++struct leveldb_filterpolicy_t : public FilterPolicy { ++ void* state_; ++ void (*destructor_)(void*); ++ const char* (*name_)(void*); ++ char* (*create_)( ++ void*, ++ const char* const* key_array, const size_t* key_length_array, ++ int num_keys, ++ size_t* filter_length); ++ unsigned char (*key_match_)( ++ void*, ++ const char* key, size_t length, ++ const char* filter, size_t filter_length); ++ ++ virtual ~leveldb_filterpolicy_t() { ++ (*destructor_)(state_); ++ } ++ ++ virtual const char* Name() const { ++ return (*name_)(state_); ++ } ++ ++ virtual void CreateFilter(const Slice* keys, int n, std::string* dst) const { ++ std::vector key_pointers(n); ++ std::vector key_sizes(n); ++ for (int i = 0; i < n; i++) { ++ key_pointers[i] = keys[i].data(); ++ key_sizes[i] = keys[i].size(); ++ } ++ size_t len; ++ char* filter = (*create_)(state_, &key_pointers[0], &key_sizes[0], n, &len); ++ dst->append(filter, len); ++ free(filter); ++ } ++ ++ virtual bool KeyMayMatch(const Slice& key, const Slice& filter) const { ++ return (*key_match_)(state_, key.data(), key.size(), ++ filter.data(), filter.size()); ++ } ++}; ++ ++struct leveldb_env_t { ++ Env* rep; ++ bool is_default; ++}; ++ ++static bool SaveError(char** errptr, const Status& s) { ++ assert(errptr != NULL); ++ if (s.ok()) { ++ return false; ++ } else if (*errptr == NULL) { ++ *errptr = strdup(s.ToString().c_str()); ++ } else { ++ // TODO(sanjay): Merge with existing error? ++ free(*errptr); ++ *errptr = strdup(s.ToString().c_str()); ++ } ++ return true; ++} ++ ++static char* CopyString(const std::string& str) { ++ char* result = reinterpret_cast(malloc(sizeof(char) * str.size())); ++ memcpy(result, str.data(), sizeof(char) * str.size()); ++ return result; ++} ++ ++leveldb_t* leveldb_open( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr) { ++ DB* db; ++ if (SaveError(errptr, DB::Open(options->rep, std::string(name), &db))) { ++ return NULL; ++ } ++ leveldb_t* result = new leveldb_t; ++ result->rep = db; ++ return result; ++} ++ ++void leveldb_close(leveldb_t* db) { ++ delete db->rep; ++ delete db; ++} ++ ++void leveldb_put( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ const char* key, size_t keylen, ++ const char* val, size_t vallen, ++ char** errptr) { ++ SaveError(errptr, ++ db->rep->Put(options->rep, Slice(key, keylen), Slice(val, vallen))); ++} ++ ++void leveldb_delete( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ const char* key, size_t keylen, ++ char** errptr) { ++ SaveError(errptr, db->rep->Delete(options->rep, Slice(key, keylen))); ++} ++ ++ ++void leveldb_write( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ leveldb_writebatch_t* batch, ++ char** errptr) { ++ SaveError(errptr, db->rep->Write(options->rep, &batch->rep)); ++} ++ ++char* leveldb_get( ++ leveldb_t* db, ++ const leveldb_readoptions_t* options, ++ const char* key, size_t keylen, ++ size_t* vallen, ++ char** errptr) { ++ char* result = NULL; ++ std::string tmp; ++ Status s = db->rep->Get(options->rep, Slice(key, keylen), &tmp); ++ if (s.ok()) { ++ *vallen = tmp.size(); ++ result = CopyString(tmp); ++ } else { ++ *vallen = 0; ++ if (!s.IsNotFound()) { ++ SaveError(errptr, s); ++ } ++ } ++ return result; ++} ++ ++leveldb_iterator_t* leveldb_create_iterator( ++ leveldb_t* db, ++ const leveldb_readoptions_t* options) { ++ leveldb_iterator_t* result = new leveldb_iterator_t; ++ result->rep = db->rep->NewIterator(options->rep); ++ return result; ++} ++ ++const leveldb_snapshot_t* leveldb_create_snapshot( ++ leveldb_t* db) { ++ leveldb_snapshot_t* result = new leveldb_snapshot_t; ++ result->rep = db->rep->GetSnapshot(); ++ return result; ++} ++ ++void leveldb_release_snapshot( ++ leveldb_t* db, ++ const leveldb_snapshot_t* snapshot) { ++ db->rep->ReleaseSnapshot(snapshot->rep); ++ delete snapshot; ++} ++ ++char* leveldb_property_value( ++ leveldb_t* db, ++ const char* propname) { ++ std::string tmp; ++ if (db->rep->GetProperty(Slice(propname), &tmp)) { ++ // We use strdup() since we expect human readable output. ++ return strdup(tmp.c_str()); ++ } else { ++ return NULL; ++ } ++} ++ ++void leveldb_approximate_sizes( ++ leveldb_t* db, ++ int num_ranges, ++ const char* const* range_start_key, const size_t* range_start_key_len, ++ const char* const* range_limit_key, const size_t* range_limit_key_len, ++ uint64_t* sizes) { ++ Range* ranges = new Range[num_ranges]; ++ for (int i = 0; i < num_ranges; i++) { ++ ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]); ++ ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]); ++ } ++ db->rep->GetApproximateSizes(ranges, num_ranges, sizes); ++ delete[] ranges; ++} ++ ++void leveldb_compact_range( ++ leveldb_t* db, ++ const char* start_key, size_t start_key_len, ++ const char* limit_key, size_t limit_key_len) { ++ Slice a, b; ++ db->rep->CompactRange( ++ // Pass NULL Slice if corresponding "const char*" is NULL ++ (start_key ? (a = Slice(start_key, start_key_len), &a) : NULL), ++ (limit_key ? (b = Slice(limit_key, limit_key_len), &b) : NULL)); ++} ++ ++void leveldb_destroy_db( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr) { ++ SaveError(errptr, DestroyDB(name, options->rep)); ++} ++ ++void leveldb_repair_db( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr) { ++ SaveError(errptr, RepairDB(name, options->rep)); ++} ++ ++void leveldb_iter_destroy(leveldb_iterator_t* iter) { ++ delete iter->rep; ++ delete iter; ++} ++ ++unsigned char leveldb_iter_valid(const leveldb_iterator_t* iter) { ++ return iter->rep->Valid(); ++} ++ ++void leveldb_iter_seek_to_first(leveldb_iterator_t* iter) { ++ iter->rep->SeekToFirst(); ++} ++ ++void leveldb_iter_seek_to_last(leveldb_iterator_t* iter) { ++ iter->rep->SeekToLast(); ++} ++ ++void leveldb_iter_seek(leveldb_iterator_t* iter, const char* k, size_t klen) { ++ iter->rep->Seek(Slice(k, klen)); ++} ++ ++void leveldb_iter_next(leveldb_iterator_t* iter) { ++ iter->rep->Next(); ++} ++ ++void leveldb_iter_prev(leveldb_iterator_t* iter) { ++ iter->rep->Prev(); ++} ++ ++const char* leveldb_iter_key(const leveldb_iterator_t* iter, size_t* klen) { ++ Slice s = iter->rep->key(); ++ *klen = s.size(); ++ return s.data(); ++} ++ ++const char* leveldb_iter_value(const leveldb_iterator_t* iter, size_t* vlen) { ++ Slice s = iter->rep->value(); ++ *vlen = s.size(); ++ return s.data(); ++} ++ ++void leveldb_iter_get_error(const leveldb_iterator_t* iter, char** errptr) { ++ SaveError(errptr, iter->rep->status()); ++} ++ ++leveldb_writebatch_t* leveldb_writebatch_create() { ++ return new leveldb_writebatch_t; ++} ++ ++void leveldb_writebatch_destroy(leveldb_writebatch_t* b) { ++ delete b; ++} ++ ++void leveldb_writebatch_clear(leveldb_writebatch_t* b) { ++ b->rep.Clear(); ++} ++ ++void leveldb_writebatch_put( ++ leveldb_writebatch_t* b, ++ const char* key, size_t klen, ++ const char* val, size_t vlen) { ++ b->rep.Put(Slice(key, klen), Slice(val, vlen)); ++} ++ ++void leveldb_writebatch_delete( ++ leveldb_writebatch_t* b, ++ const char* key, size_t klen) { ++ b->rep.Delete(Slice(key, klen)); ++} ++ ++void leveldb_writebatch_iterate( ++ leveldb_writebatch_t* b, ++ void* state, ++ void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen), ++ void (*deleted)(void*, const char* k, size_t klen)) { ++ class H : public WriteBatch::Handler { ++ public: ++ void* state_; ++ void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen); ++ void (*deleted_)(void*, const char* k, size_t klen); ++ virtual void Put(const Slice& key, const Slice& value) { ++ (*put_)(state_, key.data(), key.size(), value.data(), value.size()); ++ } ++ virtual void Delete(const Slice& key) { ++ (*deleted_)(state_, key.data(), key.size()); ++ } ++ }; ++ H handler; ++ handler.state_ = state; ++ handler.put_ = put; ++ handler.deleted_ = deleted; ++ b->rep.Iterate(&handler); ++} ++ ++leveldb_options_t* leveldb_options_create() { ++ return new leveldb_options_t; ++} ++ ++void leveldb_options_destroy(leveldb_options_t* options) { ++ delete options; ++} ++ ++void leveldb_options_set_comparator( ++ leveldb_options_t* opt, ++ leveldb_comparator_t* cmp) { ++ opt->rep.comparator = cmp; ++} ++ ++void leveldb_options_set_filter_policy( ++ leveldb_options_t* opt, ++ leveldb_filterpolicy_t* policy) { ++ opt->rep.filter_policy = policy; ++} ++ ++void leveldb_options_set_create_if_missing( ++ leveldb_options_t* opt, unsigned char v) { ++ opt->rep.create_if_missing = v; ++} ++ ++void leveldb_options_set_error_if_exists( ++ leveldb_options_t* opt, unsigned char v) { ++ opt->rep.error_if_exists = v; ++} ++ ++void leveldb_options_set_paranoid_checks( ++ leveldb_options_t* opt, unsigned char v) { ++ opt->rep.paranoid_checks = v; ++} ++ ++void leveldb_options_set_env(leveldb_options_t* opt, leveldb_env_t* env) { ++ opt->rep.env = (env ? env->rep : NULL); ++} ++ ++void leveldb_options_set_info_log(leveldb_options_t* opt, leveldb_logger_t* l) { ++ opt->rep.info_log = (l ? l->rep : NULL); ++} ++ ++void leveldb_options_set_write_buffer_size(leveldb_options_t* opt, size_t s) { ++ opt->rep.write_buffer_size = s; ++} ++ ++void leveldb_options_set_max_open_files(leveldb_options_t* opt, int n) { ++ opt->rep.max_open_files = n; ++} ++ ++void leveldb_options_set_cache(leveldb_options_t* opt, leveldb_cache_t* c) { ++ opt->rep.block_cache = c->rep; ++} ++ ++void leveldb_options_set_block_size(leveldb_options_t* opt, size_t s) { ++ opt->rep.block_size = s; ++} ++ ++void leveldb_options_set_block_restart_interval(leveldb_options_t* opt, int n) { ++ opt->rep.block_restart_interval = n; ++} ++ ++void leveldb_options_set_compression(leveldb_options_t* opt, int t) { ++ opt->rep.compression = static_cast(t); ++} ++ ++leveldb_comparator_t* leveldb_comparator_create( ++ void* state, ++ void (*destructor)(void*), ++ int (*compare)( ++ void*, ++ const char* a, size_t alen, ++ const char* b, size_t blen), ++ const char* (*name)(void*)) { ++ leveldb_comparator_t* result = new leveldb_comparator_t; ++ result->state_ = state; ++ result->destructor_ = destructor; ++ result->compare_ = compare; ++ result->name_ = name; ++ return result; ++} ++ ++void leveldb_comparator_destroy(leveldb_comparator_t* cmp) { ++ delete cmp; ++} ++ ++leveldb_filterpolicy_t* leveldb_filterpolicy_create( ++ void* state, ++ void (*destructor)(void*), ++ char* (*create_filter)( ++ void*, ++ const char* const* key_array, const size_t* key_length_array, ++ int num_keys, ++ size_t* filter_length), ++ unsigned char (*key_may_match)( ++ void*, ++ const char* key, size_t length, ++ const char* filter, size_t filter_length), ++ const char* (*name)(void*)) { ++ leveldb_filterpolicy_t* result = new leveldb_filterpolicy_t; ++ result->state_ = state; ++ result->destructor_ = destructor; ++ result->create_ = create_filter; ++ result->key_match_ = key_may_match; ++ result->name_ = name; ++ return result; ++} ++ ++void leveldb_filterpolicy_destroy(leveldb_filterpolicy_t* filter) { ++ delete filter; ++} ++ ++leveldb_filterpolicy_t* leveldb_filterpolicy_create_bloom(int bits_per_key) { ++ // Make a leveldb_filterpolicy_t, but override all of its methods so ++ // they delegate to a NewBloomFilterPolicy() instead of user ++ // supplied C functions. ++ struct Wrapper : public leveldb_filterpolicy_t { ++ const FilterPolicy* rep_; ++ ~Wrapper() { delete rep_; } ++ const char* Name() const { return rep_->Name(); } ++ void CreateFilter(const Slice* keys, int n, std::string* dst) const { ++ return rep_->CreateFilter(keys, n, dst); ++ } ++ bool KeyMayMatch(const Slice& key, const Slice& filter) const { ++ return rep_->KeyMayMatch(key, filter); ++ } ++ static void DoNothing(void*) { } ++ }; ++ Wrapper* wrapper = new Wrapper; ++ wrapper->rep_ = NewBloomFilterPolicy(bits_per_key); ++ wrapper->state_ = NULL; ++ wrapper->destructor_ = &Wrapper::DoNothing; ++ return wrapper; ++} ++ ++leveldb_readoptions_t* leveldb_readoptions_create() { ++ return new leveldb_readoptions_t; ++} ++ ++void leveldb_readoptions_destroy(leveldb_readoptions_t* opt) { ++ delete opt; ++} ++ ++void leveldb_readoptions_set_verify_checksums( ++ leveldb_readoptions_t* opt, ++ unsigned char v) { ++ opt->rep.verify_checksums = v; ++} ++ ++void leveldb_readoptions_set_fill_cache( ++ leveldb_readoptions_t* opt, unsigned char v) { ++ opt->rep.fill_cache = v; ++} ++ ++void leveldb_readoptions_set_snapshot( ++ leveldb_readoptions_t* opt, ++ const leveldb_snapshot_t* snap) { ++ opt->rep.snapshot = (snap ? snap->rep : NULL); ++} ++ ++leveldb_writeoptions_t* leveldb_writeoptions_create() { ++ return new leveldb_writeoptions_t; ++} ++ ++void leveldb_writeoptions_destroy(leveldb_writeoptions_t* opt) { ++ delete opt; ++} ++ ++void leveldb_writeoptions_set_sync( ++ leveldb_writeoptions_t* opt, unsigned char v) { ++ opt->rep.sync = v; ++} ++ ++leveldb_cache_t* leveldb_cache_create_lru(size_t capacity) { ++ leveldb_cache_t* c = new leveldb_cache_t; ++ c->rep = NewLRUCache(capacity); ++ return c; ++} ++ ++void leveldb_cache_destroy(leveldb_cache_t* cache) { ++ delete cache->rep; ++ delete cache; ++} ++ ++leveldb_env_t* leveldb_create_default_env() { ++ leveldb_env_t* result = new leveldb_env_t; ++ result->rep = Env::Default(); ++ result->is_default = true; ++ return result; ++} ++ ++void leveldb_env_destroy(leveldb_env_t* env) { ++ if (!env->is_default) delete env->rep; ++ delete env; ++} ++ ++void leveldb_free(void* ptr) { ++ free(ptr); ++} ++ ++int leveldb_major_version() { ++ return kMajorVersion; ++} ++ ++int leveldb_minor_version() { ++ return kMinorVersion; ++} ++ ++} // end extern "C" +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c_test.c b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c_test.c +new file mode 100644 +index 0000000..7cd5ee0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c_test.c +@@ -0,0 +1,390 @@ ++/* Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++ Use of this source code is governed by a BSD-style license that can be ++ found in the LICENSE file. See the AUTHORS file for names of contributors. */ ++ ++#include "leveldb/c.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++const char* phase = ""; ++static char dbname[200]; ++ ++static void StartPhase(const char* name) { ++ fprintf(stderr, "=== Test %s\n", name); ++ phase = name; ++} ++ ++static const char* GetTempDir(void) { ++ const char* ret = getenv("TEST_TMPDIR"); ++ if (ret == NULL || ret[0] == '\0') ++ ret = "/tmp"; ++ return ret; ++} ++ ++#define CheckNoError(err) \ ++ if ((err) != NULL) { \ ++ fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, (err)); \ ++ abort(); \ ++ } ++ ++#define CheckCondition(cond) \ ++ if (!(cond)) { \ ++ fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__, phase, #cond); \ ++ abort(); \ ++ } ++ ++static void CheckEqual(const char* expected, const char* v, size_t n) { ++ if (expected == NULL && v == NULL) { ++ // ok ++ } else if (expected != NULL && v != NULL && n == strlen(expected) && ++ memcmp(expected, v, n) == 0) { ++ // ok ++ return; ++ } else { ++ fprintf(stderr, "%s: expected '%s', got '%s'\n", ++ phase, ++ (expected ? expected : "(null)"), ++ (v ? v : "(null")); ++ abort(); ++ } ++} ++ ++static void Free(char** ptr) { ++ if (*ptr) { ++ free(*ptr); ++ *ptr = NULL; ++ } ++} ++ ++static void CheckGet( ++ leveldb_t* db, ++ const leveldb_readoptions_t* options, ++ const char* key, ++ const char* expected) { ++ char* err = NULL; ++ size_t val_len; ++ char* val; ++ val = leveldb_get(db, options, key, strlen(key), &val_len, &err); ++ CheckNoError(err); ++ CheckEqual(expected, val, val_len); ++ Free(&val); ++} ++ ++static void CheckIter(leveldb_iterator_t* iter, ++ const char* key, const char* val) { ++ size_t len; ++ const char* str; ++ str = leveldb_iter_key(iter, &len); ++ CheckEqual(key, str, len); ++ str = leveldb_iter_value(iter, &len); ++ CheckEqual(val, str, len); ++} ++ ++// Callback from leveldb_writebatch_iterate() ++static void CheckPut(void* ptr, ++ const char* k, size_t klen, ++ const char* v, size_t vlen) { ++ int* state = (int*) ptr; ++ CheckCondition(*state < 2); ++ switch (*state) { ++ case 0: ++ CheckEqual("bar", k, klen); ++ CheckEqual("b", v, vlen); ++ break; ++ case 1: ++ CheckEqual("box", k, klen); ++ CheckEqual("c", v, vlen); ++ break; ++ } ++ (*state)++; ++} ++ ++// Callback from leveldb_writebatch_iterate() ++static void CheckDel(void* ptr, const char* k, size_t klen) { ++ int* state = (int*) ptr; ++ CheckCondition(*state == 2); ++ CheckEqual("bar", k, klen); ++ (*state)++; ++} ++ ++static void CmpDestroy(void* arg) { } ++ ++static int CmpCompare(void* arg, const char* a, size_t alen, ++ const char* b, size_t blen) { ++ int n = (alen < blen) ? alen : blen; ++ int r = memcmp(a, b, n); ++ if (r == 0) { ++ if (alen < blen) r = -1; ++ else if (alen > blen) r = +1; ++ } ++ return r; ++} ++ ++static const char* CmpName(void* arg) { ++ return "foo"; ++} ++ ++// Custom filter policy ++static unsigned char fake_filter_result = 1; ++static void FilterDestroy(void* arg) { } ++static const char* FilterName(void* arg) { ++ return "TestFilter"; ++} ++static char* FilterCreate( ++ void* arg, ++ const char* const* key_array, const size_t* key_length_array, ++ int num_keys, ++ size_t* filter_length) { ++ *filter_length = 4; ++ char* result = malloc(4); ++ memcpy(result, "fake", 4); ++ return result; ++} ++unsigned char FilterKeyMatch( ++ void* arg, ++ const char* key, size_t length, ++ const char* filter, size_t filter_length) { ++ CheckCondition(filter_length == 4); ++ CheckCondition(memcmp(filter, "fake", 4) == 0); ++ return fake_filter_result; ++} ++ ++int main(int argc, char** argv) { ++ leveldb_t* db; ++ leveldb_comparator_t* cmp; ++ leveldb_cache_t* cache; ++ leveldb_env_t* env; ++ leveldb_options_t* options; ++ leveldb_readoptions_t* roptions; ++ leveldb_writeoptions_t* woptions; ++ char* err = NULL; ++ int run = -1; ++ ++ CheckCondition(leveldb_major_version() >= 1); ++ CheckCondition(leveldb_minor_version() >= 1); ++ ++ snprintf(dbname, sizeof(dbname), ++ "%s/leveldb_c_test-%d", ++ GetTempDir(), ++ ((int) geteuid())); ++ ++ StartPhase("create_objects"); ++ cmp = leveldb_comparator_create(NULL, CmpDestroy, CmpCompare, CmpName); ++ env = leveldb_create_default_env(); ++ cache = leveldb_cache_create_lru(100000); ++ ++ options = leveldb_options_create(); ++ leveldb_options_set_comparator(options, cmp); ++ leveldb_options_set_error_if_exists(options, 1); ++ leveldb_options_set_cache(options, cache); ++ leveldb_options_set_env(options, env); ++ leveldb_options_set_info_log(options, NULL); ++ leveldb_options_set_write_buffer_size(options, 100000); ++ leveldb_options_set_paranoid_checks(options, 1); ++ leveldb_options_set_max_open_files(options, 10); ++ leveldb_options_set_block_size(options, 1024); ++ leveldb_options_set_block_restart_interval(options, 8); ++ leveldb_options_set_compression(options, leveldb_no_compression); ++ ++ roptions = leveldb_readoptions_create(); ++ leveldb_readoptions_set_verify_checksums(roptions, 1); ++ leveldb_readoptions_set_fill_cache(roptions, 0); ++ ++ woptions = leveldb_writeoptions_create(); ++ leveldb_writeoptions_set_sync(woptions, 1); ++ ++ StartPhase("destroy"); ++ leveldb_destroy_db(options, dbname, &err); ++ Free(&err); ++ ++ StartPhase("open_error"); ++ db = leveldb_open(options, dbname, &err); ++ CheckCondition(err != NULL); ++ Free(&err); ++ ++ StartPhase("leveldb_free"); ++ db = leveldb_open(options, dbname, &err); ++ CheckCondition(err != NULL); ++ leveldb_free(err); ++ err = NULL; ++ ++ StartPhase("open"); ++ leveldb_options_set_create_if_missing(options, 1); ++ db = leveldb_open(options, dbname, &err); ++ CheckNoError(err); ++ CheckGet(db, roptions, "foo", NULL); ++ ++ StartPhase("put"); ++ leveldb_put(db, woptions, "foo", 3, "hello", 5, &err); ++ CheckNoError(err); ++ CheckGet(db, roptions, "foo", "hello"); ++ ++ StartPhase("compactall"); ++ leveldb_compact_range(db, NULL, 0, NULL, 0); ++ CheckGet(db, roptions, "foo", "hello"); ++ ++ StartPhase("compactrange"); ++ leveldb_compact_range(db, "a", 1, "z", 1); ++ CheckGet(db, roptions, "foo", "hello"); ++ ++ StartPhase("writebatch"); ++ { ++ leveldb_writebatch_t* wb = leveldb_writebatch_create(); ++ leveldb_writebatch_put(wb, "foo", 3, "a", 1); ++ leveldb_writebatch_clear(wb); ++ leveldb_writebatch_put(wb, "bar", 3, "b", 1); ++ leveldb_writebatch_put(wb, "box", 3, "c", 1); ++ leveldb_writebatch_delete(wb, "bar", 3); ++ leveldb_write(db, woptions, wb, &err); ++ CheckNoError(err); ++ CheckGet(db, roptions, "foo", "hello"); ++ CheckGet(db, roptions, "bar", NULL); ++ CheckGet(db, roptions, "box", "c"); ++ int pos = 0; ++ leveldb_writebatch_iterate(wb, &pos, CheckPut, CheckDel); ++ CheckCondition(pos == 3); ++ leveldb_writebatch_destroy(wb); ++ } ++ ++ StartPhase("iter"); ++ { ++ leveldb_iterator_t* iter = leveldb_create_iterator(db, roptions); ++ CheckCondition(!leveldb_iter_valid(iter)); ++ leveldb_iter_seek_to_first(iter); ++ CheckCondition(leveldb_iter_valid(iter)); ++ CheckIter(iter, "box", "c"); ++ leveldb_iter_next(iter); ++ CheckIter(iter, "foo", "hello"); ++ leveldb_iter_prev(iter); ++ CheckIter(iter, "box", "c"); ++ leveldb_iter_prev(iter); ++ CheckCondition(!leveldb_iter_valid(iter)); ++ leveldb_iter_seek_to_last(iter); ++ CheckIter(iter, "foo", "hello"); ++ leveldb_iter_seek(iter, "b", 1); ++ CheckIter(iter, "box", "c"); ++ leveldb_iter_get_error(iter, &err); ++ CheckNoError(err); ++ leveldb_iter_destroy(iter); ++ } ++ ++ StartPhase("approximate_sizes"); ++ { ++ int i; ++ int n = 20000; ++ char keybuf[100]; ++ char valbuf[100]; ++ uint64_t sizes[2]; ++ const char* start[2] = { "a", "k00000000000000010000" }; ++ size_t start_len[2] = { 1, 21 }; ++ const char* limit[2] = { "k00000000000000010000", "z" }; ++ size_t limit_len[2] = { 21, 1 }; ++ leveldb_writeoptions_set_sync(woptions, 0); ++ for (i = 0; i < n; i++) { ++ snprintf(keybuf, sizeof(keybuf), "k%020d", i); ++ snprintf(valbuf, sizeof(valbuf), "v%020d", i); ++ leveldb_put(db, woptions, keybuf, strlen(keybuf), valbuf, strlen(valbuf), ++ &err); ++ CheckNoError(err); ++ } ++ leveldb_approximate_sizes(db, 2, start, start_len, limit, limit_len, sizes); ++ CheckCondition(sizes[0] > 0); ++ CheckCondition(sizes[1] > 0); ++ } ++ ++ StartPhase("property"); ++ { ++ char* prop = leveldb_property_value(db, "nosuchprop"); ++ CheckCondition(prop == NULL); ++ prop = leveldb_property_value(db, "leveldb.stats"); ++ CheckCondition(prop != NULL); ++ Free(&prop); ++ } ++ ++ StartPhase("snapshot"); ++ { ++ const leveldb_snapshot_t* snap; ++ snap = leveldb_create_snapshot(db); ++ leveldb_delete(db, woptions, "foo", 3, &err); ++ CheckNoError(err); ++ leveldb_readoptions_set_snapshot(roptions, snap); ++ CheckGet(db, roptions, "foo", "hello"); ++ leveldb_readoptions_set_snapshot(roptions, NULL); ++ CheckGet(db, roptions, "foo", NULL); ++ leveldb_release_snapshot(db, snap); ++ } ++ ++ StartPhase("repair"); ++ { ++ leveldb_close(db); ++ leveldb_options_set_create_if_missing(options, 0); ++ leveldb_options_set_error_if_exists(options, 0); ++ leveldb_repair_db(options, dbname, &err); ++ CheckNoError(err); ++ db = leveldb_open(options, dbname, &err); ++ CheckNoError(err); ++ CheckGet(db, roptions, "foo", NULL); ++ CheckGet(db, roptions, "bar", NULL); ++ CheckGet(db, roptions, "box", "c"); ++ leveldb_options_set_create_if_missing(options, 1); ++ leveldb_options_set_error_if_exists(options, 1); ++ } ++ ++ StartPhase("filter"); ++ for (run = 0; run < 2; run++) { ++ // First run uses custom filter, second run uses bloom filter ++ CheckNoError(err); ++ leveldb_filterpolicy_t* policy; ++ if (run == 0) { ++ policy = leveldb_filterpolicy_create( ++ NULL, FilterDestroy, FilterCreate, FilterKeyMatch, FilterName); ++ } else { ++ policy = leveldb_filterpolicy_create_bloom(10); ++ } ++ ++ // Create new database ++ leveldb_close(db); ++ leveldb_destroy_db(options, dbname, &err); ++ leveldb_options_set_filter_policy(options, policy); ++ db = leveldb_open(options, dbname, &err); ++ CheckNoError(err); ++ leveldb_put(db, woptions, "foo", 3, "foovalue", 8, &err); ++ CheckNoError(err); ++ leveldb_put(db, woptions, "bar", 3, "barvalue", 8, &err); ++ CheckNoError(err); ++ leveldb_compact_range(db, NULL, 0, NULL, 0); ++ ++ fake_filter_result = 1; ++ CheckGet(db, roptions, "foo", "foovalue"); ++ CheckGet(db, roptions, "bar", "barvalue"); ++ if (phase == 0) { ++ // Must not find value when custom filter returns false ++ fake_filter_result = 0; ++ CheckGet(db, roptions, "foo", NULL); ++ CheckGet(db, roptions, "bar", NULL); ++ fake_filter_result = 1; ++ ++ CheckGet(db, roptions, "foo", "foovalue"); ++ CheckGet(db, roptions, "bar", "barvalue"); ++ } ++ leveldb_options_set_filter_policy(options, NULL); ++ leveldb_filterpolicy_destroy(policy); ++ } ++ ++ StartPhase("cleanup"); ++ leveldb_close(db); ++ leveldb_options_destroy(options); ++ leveldb_readoptions_destroy(roptions); ++ leveldb_writeoptions_destroy(woptions); ++ leveldb_cache_destroy(cache); ++ leveldb_comparator_destroy(cmp); ++ leveldb_env_destroy(env); ++ ++ fprintf(stderr, "PASS\n"); ++ return 0; ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/corruption_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/corruption_test.cc +new file mode 100644 +index 0000000..37a484d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/corruption_test.cc +@@ -0,0 +1,374 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/db.h" ++ ++#include ++#include ++#include ++#include ++#include "leveldb/cache.h" ++#include "leveldb/env.h" ++#include "leveldb/table.h" ++#include "leveldb/write_batch.h" ++#include "db/db_impl.h" ++#include "db/filename.h" ++#include "db/log_format.h" ++#include "db/version_set.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++static const int kValueSize = 1000; ++ ++class CorruptionTest { ++ public: ++ test::ErrorEnv env_; ++ std::string dbname_; ++ Cache* tiny_cache_; ++ Options options_; ++ DB* db_; ++ ++ CorruptionTest() { ++ tiny_cache_ = NewLRUCache(100); ++ options_.env = &env_; ++ options_.block_cache = tiny_cache_; ++ dbname_ = test::TmpDir() + "/corruption_test"; ++ DestroyDB(dbname_, options_); ++ ++ db_ = NULL; ++ options_.create_if_missing = true; ++ Reopen(); ++ options_.create_if_missing = false; ++ } ++ ++ ~CorruptionTest() { ++ delete db_; ++ DestroyDB(dbname_, Options()); ++ delete tiny_cache_; ++ } ++ ++ Status TryReopen() { ++ delete db_; ++ db_ = NULL; ++ return DB::Open(options_, dbname_, &db_); ++ } ++ ++ void Reopen() { ++ ASSERT_OK(TryReopen()); ++ } ++ ++ void RepairDB() { ++ delete db_; ++ db_ = NULL; ++ ASSERT_OK(::leveldb::RepairDB(dbname_, options_)); ++ } ++ ++ void Build(int n) { ++ std::string key_space, value_space; ++ WriteBatch batch; ++ for (int i = 0; i < n; i++) { ++ //if ((i % 100) == 0) fprintf(stderr, "@ %d of %d\n", i, n); ++ Slice key = Key(i, &key_space); ++ batch.Clear(); ++ batch.Put(key, Value(i, &value_space)); ++ WriteOptions options; ++ // Corrupt() doesn't work without this sync on windows; stat reports 0 for ++ // the file size. ++ if (i == n - 1) { ++ options.sync = true; ++ } ++ ASSERT_OK(db_->Write(options, &batch)); ++ } ++ } ++ ++ void Check(int min_expected, int max_expected) { ++ int next_expected = 0; ++ int missed = 0; ++ int bad_keys = 0; ++ int bad_values = 0; ++ int correct = 0; ++ std::string value_space; ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ uint64_t key; ++ Slice in(iter->key()); ++ if (in == "" || in == "~") { ++ // Ignore boundary keys. ++ continue; ++ } ++ if (!ConsumeDecimalNumber(&in, &key) || ++ !in.empty() || ++ key < next_expected) { ++ bad_keys++; ++ continue; ++ } ++ missed += (key - next_expected); ++ next_expected = key + 1; ++ if (iter->value() != Value(key, &value_space)) { ++ bad_values++; ++ } else { ++ correct++; ++ } ++ } ++ delete iter; ++ ++ fprintf(stderr, ++ "expected=%d..%d; got=%d; bad_keys=%d; bad_values=%d; missed=%d\n", ++ min_expected, max_expected, correct, bad_keys, bad_values, missed); ++ ASSERT_LE(min_expected, correct); ++ ASSERT_GE(max_expected, correct); ++ } ++ ++ void Corrupt(FileType filetype, int offset, int bytes_to_corrupt) { ++ // Pick file to corrupt ++ std::vector filenames; ++ ASSERT_OK(env_.GetChildren(dbname_, &filenames)); ++ uint64_t number; ++ FileType type; ++ std::string fname; ++ int picked_number = -1; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type) && ++ type == filetype && ++ int(number) > picked_number) { // Pick latest file ++ fname = dbname_ + "/" + filenames[i]; ++ picked_number = number; ++ } ++ } ++ ASSERT_TRUE(!fname.empty()) << filetype; ++ ++ struct stat sbuf; ++ if (stat(fname.c_str(), &sbuf) != 0) { ++ const char* msg = strerror(errno); ++ ASSERT_TRUE(false) << fname << ": " << msg; ++ } ++ ++ if (offset < 0) { ++ // Relative to end of file; make it absolute ++ if (-offset > sbuf.st_size) { ++ offset = 0; ++ } else { ++ offset = sbuf.st_size + offset; ++ } ++ } ++ if (offset > sbuf.st_size) { ++ offset = sbuf.st_size; ++ } ++ if (offset + bytes_to_corrupt > sbuf.st_size) { ++ bytes_to_corrupt = sbuf.st_size - offset; ++ } ++ ++ // Do it ++ std::string contents; ++ Status s = ReadFileToString(Env::Default(), fname, &contents); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ for (int i = 0; i < bytes_to_corrupt; i++) { ++ contents[i + offset] ^= 0x80; ++ } ++ s = WriteStringToFile(Env::Default(), contents, fname); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ } ++ ++ int Property(const std::string& name) { ++ std::string property; ++ int result; ++ if (db_->GetProperty(name, &property) && ++ sscanf(property.c_str(), "%d", &result) == 1) { ++ return result; ++ } else { ++ return -1; ++ } ++ } ++ ++ // Return the ith key ++ Slice Key(int i, std::string* storage) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%016d", i); ++ storage->assign(buf, strlen(buf)); ++ return Slice(*storage); ++ } ++ ++ // Return the value to associate with the specified key ++ Slice Value(int k, std::string* storage) { ++ Random r(k); ++ return test::RandomString(&r, kValueSize, storage); ++ } ++}; ++ ++TEST(CorruptionTest, Recovery) { ++ Build(100); ++ Check(100, 100); ++ Corrupt(kLogFile, 19, 1); // WriteBatch tag for first record ++ Corrupt(kLogFile, log::kBlockSize + 1000, 1); // Somewhere in second block ++ Reopen(); ++ ++ // The 64 records in the first two log blocks are completely lost. ++ Check(36, 36); ++} ++ ++TEST(CorruptionTest, RecoverWriteError) { ++ env_.writable_file_error_ = true; ++ Status s = TryReopen(); ++ ASSERT_TRUE(!s.ok()); ++} ++ ++TEST(CorruptionTest, NewFileErrorDuringWrite) { ++ // Do enough writing to force minor compaction ++ env_.writable_file_error_ = true; ++ const int num = 3 + (Options().write_buffer_size / kValueSize); ++ std::string value_storage; ++ Status s; ++ for (int i = 0; s.ok() && i < num; i++) { ++ WriteBatch batch; ++ batch.Put("a", Value(100, &value_storage)); ++ s = db_->Write(WriteOptions(), &batch); ++ } ++ ASSERT_TRUE(!s.ok()); ++ ASSERT_GE(env_.num_writable_file_errors_, 1); ++ env_.writable_file_error_ = false; ++ Reopen(); ++} ++ ++TEST(CorruptionTest, TableFile) { ++ Build(100); ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ dbi->TEST_CompactRange(0, NULL, NULL); ++ dbi->TEST_CompactRange(1, NULL, NULL); ++ ++ Corrupt(kTableFile, 100, 1); ++ Check(90, 99); ++} ++ ++TEST(CorruptionTest, TableFileRepair) { ++ options_.block_size = 2 * kValueSize; // Limit scope of corruption ++ options_.paranoid_checks = true; ++ Reopen(); ++ Build(100); ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ dbi->TEST_CompactRange(0, NULL, NULL); ++ dbi->TEST_CompactRange(1, NULL, NULL); ++ ++ Corrupt(kTableFile, 100, 1); ++ RepairDB(); ++ Reopen(); ++ Check(95, 99); ++} ++ ++TEST(CorruptionTest, TableFileIndexData) { ++ Build(10000); // Enough to build multiple Tables ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ ++ Corrupt(kTableFile, -2000, 500); ++ Reopen(); ++ Check(5000, 9999); ++} ++ ++TEST(CorruptionTest, MissingDescriptor) { ++ Build(1000); ++ RepairDB(); ++ Reopen(); ++ Check(1000, 1000); ++} ++ ++TEST(CorruptionTest, SequenceNumberRecovery) { ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v1")); ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v2")); ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v3")); ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v4")); ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v5")); ++ RepairDB(); ++ Reopen(); ++ std::string v; ++ ASSERT_OK(db_->Get(ReadOptions(), "foo", &v)); ++ ASSERT_EQ("v5", v); ++ // Write something. If sequence number was not recovered properly, ++ // it will be hidden by an earlier write. ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v6")); ++ ASSERT_OK(db_->Get(ReadOptions(), "foo", &v)); ++ ASSERT_EQ("v6", v); ++ Reopen(); ++ ASSERT_OK(db_->Get(ReadOptions(), "foo", &v)); ++ ASSERT_EQ("v6", v); ++} ++ ++TEST(CorruptionTest, CorruptedDescriptor) { ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "hello")); ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ dbi->TEST_CompactRange(0, NULL, NULL); ++ ++ Corrupt(kDescriptorFile, 0, 1000); ++ Status s = TryReopen(); ++ ASSERT_TRUE(!s.ok()); ++ ++ RepairDB(); ++ Reopen(); ++ std::string v; ++ ASSERT_OK(db_->Get(ReadOptions(), "foo", &v)); ++ ASSERT_EQ("hello", v); ++} ++ ++TEST(CorruptionTest, CompactionInputError) { ++ Build(10); ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ const int last = config::kMaxMemCompactLevel; ++ ASSERT_EQ(1, Property("leveldb.num-files-at-level" + NumberToString(last))); ++ ++ Corrupt(kTableFile, 100, 1); ++ Check(5, 9); ++ ++ // Force compactions by writing lots of values ++ Build(10000); ++ Check(10000, 10000); ++} ++ ++TEST(CorruptionTest, CompactionInputErrorParanoid) { ++ options_.paranoid_checks = true; ++ options_.write_buffer_size = 512 << 10; ++ Reopen(); ++ DBImpl* dbi = reinterpret_cast(db_); ++ ++ // Make multiple inputs so we need to compact. ++ for (int i = 0; i < 2; i++) { ++ Build(10); ++ dbi->TEST_CompactMemTable(); ++ Corrupt(kTableFile, 100, 1); ++ env_.SleepForMicroseconds(100000); ++ } ++ dbi->CompactRange(NULL, NULL); ++ ++ // Write must fail because of corrupted table ++ std::string tmp1, tmp2; ++ Status s = db_->Put(WriteOptions(), Key(5, &tmp1), Value(5, &tmp2)); ++ ASSERT_TRUE(!s.ok()) << "write did not fail in corrupted paranoid db"; ++} ++ ++TEST(CorruptionTest, UnrelatedKeys) { ++ Build(10); ++ DBImpl* dbi = reinterpret_cast(db_); ++ dbi->TEST_CompactMemTable(); ++ Corrupt(kTableFile, 100, 1); ++ ++ std::string tmp1, tmp2; ++ ASSERT_OK(db_->Put(WriteOptions(), Key(1000, &tmp1), Value(1000, &tmp2))); ++ std::string v; ++ ASSERT_OK(db_->Get(ReadOptions(), Key(1000, &tmp1), &v)); ++ ASSERT_EQ(Value(1000, &tmp2).ToString(), v); ++ dbi->TEST_CompactMemTable(); ++ ASSERT_OK(db_->Get(ReadOptions(), Key(1000, &tmp1), &v)); ++ ASSERT_EQ(Value(1000, &tmp2).ToString(), v); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_bench.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_bench.cc +new file mode 100644 +index 0000000..3ad19a5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_bench.cc +@@ -0,0 +1,1020 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include ++#include "db/db_impl.h" ++#include "db/version_set.h" ++#include "leveldb/cache.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/write_batch.h" ++#include "port/port.h" ++#include "util/crc32c.h" ++#include "util/histogram.h" ++#include "util/mutexlock.h" ++#include "util/random.h" ++#include "util/testutil.h" ++ ++// Comma-separated list of operations to run in the specified order ++// Actual benchmarks: ++// fillseq -- write N values in sequential key order in async mode ++// fillrandom -- write N values in random key order in async mode ++// overwrite -- overwrite N values in random key order in async mode ++// fillsync -- write N/100 values in random key order in sync mode ++// fill100K -- write N/1000 100K values in random order in async mode ++// deleteseq -- delete N keys in sequential order ++// deleterandom -- delete N keys in random order ++// readseq -- read N times sequentially ++// readreverse -- read N times in reverse order ++// readrandom -- read N times in random order ++// readmissing -- read N missing keys in random order ++// readhot -- read N times in random order from 1% section of DB ++// seekrandom -- N random seeks ++// open -- cost of opening a DB ++// crc32c -- repeated crc32c of 4K of data ++// acquireload -- load N*1000 times ++// Meta operations: ++// compact -- Compact the entire DB ++// stats -- Print DB stats ++// sstables -- Print sstable info ++// heapprofile -- Dump a heap profile (if supported by this port) ++static const char* FLAGS_benchmarks = ++ "fillseq," ++ "fillsync," ++ "fillrandom," ++ "overwrite," ++ "readrandom," ++ "readrandom," // Extra run to allow previous compactions to quiesce ++ "readseq," ++ "readreverse," ++ "compact," ++ "readrandom," ++ "readseq," ++ "readreverse," ++ "fill100K," ++ "crc32c," ++ "snappycomp," ++ "snappyuncomp," ++ "acquireload," ++ ; ++ ++// Number of key/values to place in database ++static int FLAGS_num = 1000000; ++ ++// Number of read operations to do. If negative, do FLAGS_num reads. ++static int FLAGS_reads = -1; ++ ++// Number of concurrent threads to run. ++static int FLAGS_threads = 1; ++ ++// Size of each value ++static int FLAGS_value_size = 100; ++ ++// Arrange to generate values that shrink to this fraction of ++// their original size after compression ++static double FLAGS_compression_ratio = 0.5; ++ ++// Print histogram of operation timings ++static bool FLAGS_histogram = false; ++ ++// Number of bytes to buffer in memtable before compacting ++// (initialized to default value by "main") ++static int FLAGS_write_buffer_size = 0; ++ ++// Number of bytes written to each file. ++// (initialized to default value by "main") ++static int FLAGS_max_file_size = 0; ++ ++// Approximate size of user data packed per block (before compression. ++// (initialized to default value by "main") ++static int FLAGS_block_size = 0; ++ ++// Number of bytes to use as a cache of uncompressed data. ++// Negative means use default settings. ++static int FLAGS_cache_size = -1; ++ ++// Maximum number of files to keep open at the same time (use default if == 0) ++static int FLAGS_open_files = 0; ++ ++// Bloom filter bits per key. ++// Negative means use default settings. ++static int FLAGS_bloom_bits = -1; ++ ++// If true, do not destroy the existing database. If you set this ++// flag and also specify a benchmark that wants a fresh database, that ++// benchmark will fail. ++static bool FLAGS_use_existing_db = false; ++ ++// If true, reuse existing log/MANIFEST files when re-opening a database. ++static bool FLAGS_reuse_logs = false; ++ ++// Use the db with the following name. ++static const char* FLAGS_db = NULL; ++ ++namespace leveldb { ++ ++namespace { ++leveldb::Env* g_env = NULL; ++ ++// Helper for quickly generating random data. ++class RandomGenerator { ++ private: ++ std::string data_; ++ int pos_; ++ ++ public: ++ RandomGenerator() { ++ // We use a limited amount of data over and over again and ensure ++ // that it is larger than the compression window (32KB), and also ++ // large enough to serve all typical value sizes we want to write. ++ Random rnd(301); ++ std::string piece; ++ while (data_.size() < 1048576) { ++ // Add a short fragment that is as compressible as specified ++ // by FLAGS_compression_ratio. ++ test::CompressibleString(&rnd, FLAGS_compression_ratio, 100, &piece); ++ data_.append(piece); ++ } ++ pos_ = 0; ++ } ++ ++ Slice Generate(size_t len) { ++ if (pos_ + len > data_.size()) { ++ pos_ = 0; ++ assert(len < data_.size()); ++ } ++ pos_ += len; ++ return Slice(data_.data() + pos_ - len, len); ++ } ++}; ++ ++#if defined(__linux) ++static Slice TrimSpace(Slice s) { ++ size_t start = 0; ++ while (start < s.size() && isspace(s[start])) { ++ start++; ++ } ++ size_t limit = s.size(); ++ while (limit > start && isspace(s[limit-1])) { ++ limit--; ++ } ++ return Slice(s.data() + start, limit - start); ++} ++#endif ++ ++static void AppendWithSpace(std::string* str, Slice msg) { ++ if (msg.empty()) return; ++ if (!str->empty()) { ++ str->push_back(' '); ++ } ++ str->append(msg.data(), msg.size()); ++} ++ ++class Stats { ++ private: ++ double start_; ++ double finish_; ++ double seconds_; ++ int done_; ++ int next_report_; ++ int64_t bytes_; ++ double last_op_finish_; ++ Histogram hist_; ++ std::string message_; ++ ++ public: ++ Stats() { Start(); } ++ ++ void Start() { ++ next_report_ = 100; ++ last_op_finish_ = start_; ++ hist_.Clear(); ++ done_ = 0; ++ bytes_ = 0; ++ seconds_ = 0; ++ start_ = g_env->NowMicros(); ++ finish_ = start_; ++ message_.clear(); ++ } ++ ++ void Merge(const Stats& other) { ++ hist_.Merge(other.hist_); ++ done_ += other.done_; ++ bytes_ += other.bytes_; ++ seconds_ += other.seconds_; ++ if (other.start_ < start_) start_ = other.start_; ++ if (other.finish_ > finish_) finish_ = other.finish_; ++ ++ // Just keep the messages from one thread ++ if (message_.empty()) message_ = other.message_; ++ } ++ ++ void Stop() { ++ finish_ = g_env->NowMicros(); ++ seconds_ = (finish_ - start_) * 1e-6; ++ } ++ ++ void AddMessage(Slice msg) { ++ AppendWithSpace(&message_, msg); ++ } ++ ++ void FinishedSingleOp() { ++ if (FLAGS_histogram) { ++ double now = g_env->NowMicros(); ++ double micros = now - last_op_finish_; ++ hist_.Add(micros); ++ if (micros > 20000) { ++ fprintf(stderr, "long op: %.1f micros%30s\r", micros, ""); ++ fflush(stderr); ++ } ++ last_op_finish_ = now; ++ } ++ ++ done_++; ++ if (done_ >= next_report_) { ++ if (next_report_ < 1000) next_report_ += 100; ++ else if (next_report_ < 5000) next_report_ += 500; ++ else if (next_report_ < 10000) next_report_ += 1000; ++ else if (next_report_ < 50000) next_report_ += 5000; ++ else if (next_report_ < 100000) next_report_ += 10000; ++ else if (next_report_ < 500000) next_report_ += 50000; ++ else next_report_ += 100000; ++ fprintf(stderr, "... finished %d ops%30s\r", done_, ""); ++ fflush(stderr); ++ } ++ } ++ ++ void AddBytes(int64_t n) { ++ bytes_ += n; ++ } ++ ++ void Report(const Slice& name) { ++ // Pretend at least one op was done in case we are running a benchmark ++ // that does not call FinishedSingleOp(). ++ if (done_ < 1) done_ = 1; ++ ++ std::string extra; ++ if (bytes_ > 0) { ++ // Rate is computed on actual elapsed time, not the sum of per-thread ++ // elapsed times. ++ double elapsed = (finish_ - start_) * 1e-6; ++ char rate[100]; ++ snprintf(rate, sizeof(rate), "%6.1f MB/s", ++ (bytes_ / 1048576.0) / elapsed); ++ extra = rate; ++ } ++ AppendWithSpace(&extra, message_); ++ ++ fprintf(stdout, "%-12s : %11.3f micros/op;%s%s\n", ++ name.ToString().c_str(), ++ seconds_ * 1e6 / done_, ++ (extra.empty() ? "" : " "), ++ extra.c_str()); ++ if (FLAGS_histogram) { ++ fprintf(stdout, "Microseconds per op:\n%s\n", hist_.ToString().c_str()); ++ } ++ fflush(stdout); ++ } ++}; ++ ++// State shared by all concurrent executions of the same benchmark. ++struct SharedState { ++ port::Mutex mu; ++ port::CondVar cv; ++ int total; ++ ++ // Each thread goes through the following states: ++ // (1) initializing ++ // (2) waiting for others to be initialized ++ // (3) running ++ // (4) done ++ ++ int num_initialized; ++ int num_done; ++ bool start; ++ ++ SharedState() : cv(&mu) { } ++}; ++ ++// Per-thread state for concurrent executions of the same benchmark. ++struct ThreadState { ++ int tid; // 0..n-1 when running in n threads ++ Random rand; // Has different seeds for different threads ++ Stats stats; ++ SharedState* shared; ++ ++ ThreadState(int index) ++ : tid(index), ++ rand(1000 + index) { ++ } ++}; ++ ++} // namespace ++ ++class Benchmark { ++ private: ++ Cache* cache_; ++ const FilterPolicy* filter_policy_; ++ DB* db_; ++ int num_; ++ int value_size_; ++ int entries_per_batch_; ++ WriteOptions write_options_; ++ int reads_; ++ int heap_counter_; ++ ++ void PrintHeader() { ++ const int kKeySize = 16; ++ PrintEnvironment(); ++ fprintf(stdout, "Keys: %d bytes each\n", kKeySize); ++ fprintf(stdout, "Values: %d bytes each (%d bytes after compression)\n", ++ FLAGS_value_size, ++ static_cast(FLAGS_value_size * FLAGS_compression_ratio + 0.5)); ++ fprintf(stdout, "Entries: %d\n", num_); ++ fprintf(stdout, "RawSize: %.1f MB (estimated)\n", ++ ((static_cast(kKeySize + FLAGS_value_size) * num_) ++ / 1048576.0)); ++ fprintf(stdout, "FileSize: %.1f MB (estimated)\n", ++ (((kKeySize + FLAGS_value_size * FLAGS_compression_ratio) * num_) ++ / 1048576.0)); ++ PrintWarnings(); ++ fprintf(stdout, "------------------------------------------------\n"); ++ } ++ ++ void PrintWarnings() { ++#if defined(__GNUC__) && !defined(__OPTIMIZE__) ++ fprintf(stdout, ++ "WARNING: Optimization is disabled: benchmarks unnecessarily slow\n" ++ ); ++#endif ++#ifndef NDEBUG ++ fprintf(stdout, ++ "WARNING: Assertions are enabled; benchmarks unnecessarily slow\n"); ++#endif ++ ++ // See if snappy is working by attempting to compress a compressible string ++ const char text[] = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; ++ std::string compressed; ++ if (!port::Snappy_Compress(text, sizeof(text), &compressed)) { ++ fprintf(stdout, "WARNING: Snappy compression is not enabled\n"); ++ } else if (compressed.size() >= sizeof(text)) { ++ fprintf(stdout, "WARNING: Snappy compression is not effective\n"); ++ } ++ } ++ ++ void PrintEnvironment() { ++ fprintf(stderr, "LevelDB: version %d.%d\n", ++ kMajorVersion, kMinorVersion); ++ ++#if defined(__linux) ++ time_t now = time(NULL); ++ fprintf(stderr, "Date: %s", ctime(&now)); // ctime() adds newline ++ ++ FILE* cpuinfo = fopen("/proc/cpuinfo", "r"); ++ if (cpuinfo != NULL) { ++ char line[1000]; ++ int num_cpus = 0; ++ std::string cpu_type; ++ std::string cache_size; ++ while (fgets(line, sizeof(line), cpuinfo) != NULL) { ++ const char* sep = strchr(line, ':'); ++ if (sep == NULL) { ++ continue; ++ } ++ Slice key = TrimSpace(Slice(line, sep - 1 - line)); ++ Slice val = TrimSpace(Slice(sep + 1)); ++ if (key == "model name") { ++ ++num_cpus; ++ cpu_type = val.ToString(); ++ } else if (key == "cache size") { ++ cache_size = val.ToString(); ++ } ++ } ++ fclose(cpuinfo); ++ fprintf(stderr, "CPU: %d * %s\n", num_cpus, cpu_type.c_str()); ++ fprintf(stderr, "CPUCache: %s\n", cache_size.c_str()); ++ } ++#endif ++ } ++ ++ public: ++ Benchmark() ++ : cache_(FLAGS_cache_size >= 0 ? NewLRUCache(FLAGS_cache_size) : NULL), ++ filter_policy_(FLAGS_bloom_bits >= 0 ++ ? NewBloomFilterPolicy(FLAGS_bloom_bits) ++ : NULL), ++ db_(NULL), ++ num_(FLAGS_num), ++ value_size_(FLAGS_value_size), ++ entries_per_batch_(1), ++ reads_(FLAGS_reads < 0 ? FLAGS_num : FLAGS_reads), ++ heap_counter_(0) { ++ std::vector files; ++ g_env->GetChildren(FLAGS_db, &files); ++ for (size_t i = 0; i < files.size(); i++) { ++ if (Slice(files[i]).starts_with("heap-")) { ++ g_env->DeleteFile(std::string(FLAGS_db) + "/" + files[i]); ++ } ++ } ++ if (!FLAGS_use_existing_db) { ++ DestroyDB(FLAGS_db, Options()); ++ } ++ } ++ ++ ~Benchmark() { ++ delete db_; ++ delete cache_; ++ delete filter_policy_; ++ } ++ ++ void Run() { ++ PrintHeader(); ++ Open(); ++ ++ const char* benchmarks = FLAGS_benchmarks; ++ while (benchmarks != NULL) { ++ const char* sep = strchr(benchmarks, ','); ++ Slice name; ++ if (sep == NULL) { ++ name = benchmarks; ++ benchmarks = NULL; ++ } else { ++ name = Slice(benchmarks, sep - benchmarks); ++ benchmarks = sep + 1; ++ } ++ ++ // Reset parameters that may be overridden below ++ num_ = FLAGS_num; ++ reads_ = (FLAGS_reads < 0 ? FLAGS_num : FLAGS_reads); ++ value_size_ = FLAGS_value_size; ++ entries_per_batch_ = 1; ++ write_options_ = WriteOptions(); ++ ++ void (Benchmark::*method)(ThreadState*) = NULL; ++ bool fresh_db = false; ++ int num_threads = FLAGS_threads; ++ ++ if (name == Slice("open")) { ++ method = &Benchmark::OpenBench; ++ num_ /= 10000; ++ if (num_ < 1) num_ = 1; ++ } else if (name == Slice("fillseq")) { ++ fresh_db = true; ++ method = &Benchmark::WriteSeq; ++ } else if (name == Slice("fillbatch")) { ++ fresh_db = true; ++ entries_per_batch_ = 1000; ++ method = &Benchmark::WriteSeq; ++ } else if (name == Slice("fillrandom")) { ++ fresh_db = true; ++ method = &Benchmark::WriteRandom; ++ } else if (name == Slice("overwrite")) { ++ fresh_db = false; ++ method = &Benchmark::WriteRandom; ++ } else if (name == Slice("fillsync")) { ++ fresh_db = true; ++ num_ /= 1000; ++ write_options_.sync = true; ++ method = &Benchmark::WriteRandom; ++ } else if (name == Slice("fill100K")) { ++ fresh_db = true; ++ num_ /= 1000; ++ value_size_ = 100 * 1000; ++ method = &Benchmark::WriteRandom; ++ } else if (name == Slice("readseq")) { ++ method = &Benchmark::ReadSequential; ++ } else if (name == Slice("readreverse")) { ++ method = &Benchmark::ReadReverse; ++ } else if (name == Slice("readrandom")) { ++ method = &Benchmark::ReadRandom; ++ } else if (name == Slice("readmissing")) { ++ method = &Benchmark::ReadMissing; ++ } else if (name == Slice("seekrandom")) { ++ method = &Benchmark::SeekRandom; ++ } else if (name == Slice("readhot")) { ++ method = &Benchmark::ReadHot; ++ } else if (name == Slice("readrandomsmall")) { ++ reads_ /= 1000; ++ method = &Benchmark::ReadRandom; ++ } else if (name == Slice("deleteseq")) { ++ method = &Benchmark::DeleteSeq; ++ } else if (name == Slice("deleterandom")) { ++ method = &Benchmark::DeleteRandom; ++ } else if (name == Slice("readwhilewriting")) { ++ num_threads++; // Add extra thread for writing ++ method = &Benchmark::ReadWhileWriting; ++ } else if (name == Slice("compact")) { ++ method = &Benchmark::Compact; ++ } else if (name == Slice("crc32c")) { ++ method = &Benchmark::Crc32c; ++ } else if (name == Slice("acquireload")) { ++ method = &Benchmark::AcquireLoad; ++ } else if (name == Slice("snappycomp")) { ++ method = &Benchmark::SnappyCompress; ++ } else if (name == Slice("snappyuncomp")) { ++ method = &Benchmark::SnappyUncompress; ++ } else if (name == Slice("heapprofile")) { ++ HeapProfile(); ++ } else if (name == Slice("stats")) { ++ PrintStats("leveldb.stats"); ++ } else if (name == Slice("sstables")) { ++ PrintStats("leveldb.sstables"); ++ } else { ++ if (name != Slice()) { // No error message for empty name ++ fprintf(stderr, "unknown benchmark '%s'\n", name.ToString().c_str()); ++ } ++ } ++ ++ if (fresh_db) { ++ if (FLAGS_use_existing_db) { ++ fprintf(stdout, "%-12s : skipped (--use_existing_db is true)\n", ++ name.ToString().c_str()); ++ method = NULL; ++ } else { ++ delete db_; ++ db_ = NULL; ++ DestroyDB(FLAGS_db, Options()); ++ Open(); ++ } ++ } ++ ++ if (method != NULL) { ++ RunBenchmark(num_threads, name, method); ++ } ++ } ++ } ++ ++ private: ++ struct ThreadArg { ++ Benchmark* bm; ++ SharedState* shared; ++ ThreadState* thread; ++ void (Benchmark::*method)(ThreadState*); ++ }; ++ ++ static void ThreadBody(void* v) { ++ ThreadArg* arg = reinterpret_cast(v); ++ SharedState* shared = arg->shared; ++ ThreadState* thread = arg->thread; ++ { ++ MutexLock l(&shared->mu); ++ shared->num_initialized++; ++ if (shared->num_initialized >= shared->total) { ++ shared->cv.SignalAll(); ++ } ++ while (!shared->start) { ++ shared->cv.Wait(); ++ } ++ } ++ ++ thread->stats.Start(); ++ (arg->bm->*(arg->method))(thread); ++ thread->stats.Stop(); ++ ++ { ++ MutexLock l(&shared->mu); ++ shared->num_done++; ++ if (shared->num_done >= shared->total) { ++ shared->cv.SignalAll(); ++ } ++ } ++ } ++ ++ void RunBenchmark(int n, Slice name, ++ void (Benchmark::*method)(ThreadState*)) { ++ SharedState shared; ++ shared.total = n; ++ shared.num_initialized = 0; ++ shared.num_done = 0; ++ shared.start = false; ++ ++ ThreadArg* arg = new ThreadArg[n]; ++ for (int i = 0; i < n; i++) { ++ arg[i].bm = this; ++ arg[i].method = method; ++ arg[i].shared = &shared; ++ arg[i].thread = new ThreadState(i); ++ arg[i].thread->shared = &shared; ++ g_env->StartThread(ThreadBody, &arg[i]); ++ } ++ ++ shared.mu.Lock(); ++ while (shared.num_initialized < n) { ++ shared.cv.Wait(); ++ } ++ ++ shared.start = true; ++ shared.cv.SignalAll(); ++ while (shared.num_done < n) { ++ shared.cv.Wait(); ++ } ++ shared.mu.Unlock(); ++ ++ for (int i = 1; i < n; i++) { ++ arg[0].thread->stats.Merge(arg[i].thread->stats); ++ } ++ arg[0].thread->stats.Report(name); ++ ++ for (int i = 0; i < n; i++) { ++ delete arg[i].thread; ++ } ++ delete[] arg; ++ } ++ ++ void Crc32c(ThreadState* thread) { ++ // Checksum about 500MB of data total ++ const int size = 4096; ++ const char* label = "(4K per op)"; ++ std::string data(size, 'x'); ++ int64_t bytes = 0; ++ uint32_t crc = 0; ++ while (bytes < 500 * 1048576) { ++ crc = crc32c::Value(data.data(), size); ++ thread->stats.FinishedSingleOp(); ++ bytes += size; ++ } ++ // Print so result is not dead ++ fprintf(stderr, "... crc=0x%x\r", static_cast(crc)); ++ ++ thread->stats.AddBytes(bytes); ++ thread->stats.AddMessage(label); ++ } ++ ++ void AcquireLoad(ThreadState* thread) { ++ int dummy; ++ port::AtomicPointer ap(&dummy); ++ int count = 0; ++ void *ptr = NULL; ++ thread->stats.AddMessage("(each op is 1000 loads)"); ++ while (count < 100000) { ++ for (int i = 0; i < 1000; i++) { ++ ptr = ap.Acquire_Load(); ++ } ++ count++; ++ thread->stats.FinishedSingleOp(); ++ } ++ if (ptr == NULL) exit(1); // Disable unused variable warning. ++ } ++ ++ void SnappyCompress(ThreadState* thread) { ++ RandomGenerator gen; ++ Slice input = gen.Generate(Options().block_size); ++ int64_t bytes = 0; ++ int64_t produced = 0; ++ bool ok = true; ++ std::string compressed; ++ while (ok && bytes < 1024 * 1048576) { // Compress 1G ++ ok = port::Snappy_Compress(input.data(), input.size(), &compressed); ++ produced += compressed.size(); ++ bytes += input.size(); ++ thread->stats.FinishedSingleOp(); ++ } ++ ++ if (!ok) { ++ thread->stats.AddMessage("(snappy failure)"); ++ } else { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "(output: %.1f%%)", ++ (produced * 100.0) / bytes); ++ thread->stats.AddMessage(buf); ++ thread->stats.AddBytes(bytes); ++ } ++ } ++ ++ void SnappyUncompress(ThreadState* thread) { ++ RandomGenerator gen; ++ Slice input = gen.Generate(Options().block_size); ++ std::string compressed; ++ bool ok = port::Snappy_Compress(input.data(), input.size(), &compressed); ++ int64_t bytes = 0; ++ char* uncompressed = new char[input.size()]; ++ while (ok && bytes < 1024 * 1048576) { // Compress 1G ++ ok = port::Snappy_Uncompress(compressed.data(), compressed.size(), ++ uncompressed); ++ bytes += input.size(); ++ thread->stats.FinishedSingleOp(); ++ } ++ delete[] uncompressed; ++ ++ if (!ok) { ++ thread->stats.AddMessage("(snappy failure)"); ++ } else { ++ thread->stats.AddBytes(bytes); ++ } ++ } ++ ++ void Open() { ++ assert(db_ == NULL); ++ Options options; ++ options.env = g_env; ++ options.create_if_missing = !FLAGS_use_existing_db; ++ options.block_cache = cache_; ++ options.write_buffer_size = FLAGS_write_buffer_size; ++ options.max_file_size = FLAGS_max_file_size; ++ options.block_size = FLAGS_block_size; ++ options.max_open_files = FLAGS_open_files; ++ options.filter_policy = filter_policy_; ++ options.reuse_logs = FLAGS_reuse_logs; ++ Status s = DB::Open(options, FLAGS_db, &db_); ++ if (!s.ok()) { ++ fprintf(stderr, "open error: %s\n", s.ToString().c_str()); ++ exit(1); ++ } ++ } ++ ++ void OpenBench(ThreadState* thread) { ++ for (int i = 0; i < num_; i++) { ++ delete db_; ++ Open(); ++ thread->stats.FinishedSingleOp(); ++ } ++ } ++ ++ void WriteSeq(ThreadState* thread) { ++ DoWrite(thread, true); ++ } ++ ++ void WriteRandom(ThreadState* thread) { ++ DoWrite(thread, false); ++ } ++ ++ void DoWrite(ThreadState* thread, bool seq) { ++ if (num_ != FLAGS_num) { ++ char msg[100]; ++ snprintf(msg, sizeof(msg), "(%d ops)", num_); ++ thread->stats.AddMessage(msg); ++ } ++ ++ RandomGenerator gen; ++ WriteBatch batch; ++ Status s; ++ int64_t bytes = 0; ++ for (int i = 0; i < num_; i += entries_per_batch_) { ++ batch.Clear(); ++ for (int j = 0; j < entries_per_batch_; j++) { ++ const int k = seq ? i+j : (thread->rand.Next() % FLAGS_num); ++ char key[100]; ++ snprintf(key, sizeof(key), "%016d", k); ++ batch.Put(key, gen.Generate(value_size_)); ++ bytes += value_size_ + strlen(key); ++ thread->stats.FinishedSingleOp(); ++ } ++ s = db_->Write(write_options_, &batch); ++ if (!s.ok()) { ++ fprintf(stderr, "put error: %s\n", s.ToString().c_str()); ++ exit(1); ++ } ++ } ++ thread->stats.AddBytes(bytes); ++ } ++ ++ void ReadSequential(ThreadState* thread) { ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ int i = 0; ++ int64_t bytes = 0; ++ for (iter->SeekToFirst(); i < reads_ && iter->Valid(); iter->Next()) { ++ bytes += iter->key().size() + iter->value().size(); ++ thread->stats.FinishedSingleOp(); ++ ++i; ++ } ++ delete iter; ++ thread->stats.AddBytes(bytes); ++ } ++ ++ void ReadReverse(ThreadState* thread) { ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ int i = 0; ++ int64_t bytes = 0; ++ for (iter->SeekToLast(); i < reads_ && iter->Valid(); iter->Prev()) { ++ bytes += iter->key().size() + iter->value().size(); ++ thread->stats.FinishedSingleOp(); ++ ++i; ++ } ++ delete iter; ++ thread->stats.AddBytes(bytes); ++ } ++ ++ void ReadRandom(ThreadState* thread) { ++ ReadOptions options; ++ std::string value; ++ int found = 0; ++ for (int i = 0; i < reads_; i++) { ++ char key[100]; ++ const int k = thread->rand.Next() % FLAGS_num; ++ snprintf(key, sizeof(key), "%016d", k); ++ if (db_->Get(options, key, &value).ok()) { ++ found++; ++ } ++ thread->stats.FinishedSingleOp(); ++ } ++ char msg[100]; ++ snprintf(msg, sizeof(msg), "(%d of %d found)", found, num_); ++ thread->stats.AddMessage(msg); ++ } ++ ++ void ReadMissing(ThreadState* thread) { ++ ReadOptions options; ++ std::string value; ++ for (int i = 0; i < reads_; i++) { ++ char key[100]; ++ const int k = thread->rand.Next() % FLAGS_num; ++ snprintf(key, sizeof(key), "%016d.", k); ++ db_->Get(options, key, &value); ++ thread->stats.FinishedSingleOp(); ++ } ++ } ++ ++ void ReadHot(ThreadState* thread) { ++ ReadOptions options; ++ std::string value; ++ const int range = (FLAGS_num + 99) / 100; ++ for (int i = 0; i < reads_; i++) { ++ char key[100]; ++ const int k = thread->rand.Next() % range; ++ snprintf(key, sizeof(key), "%016d", k); ++ db_->Get(options, key, &value); ++ thread->stats.FinishedSingleOp(); ++ } ++ } ++ ++ void SeekRandom(ThreadState* thread) { ++ ReadOptions options; ++ int found = 0; ++ for (int i = 0; i < reads_; i++) { ++ Iterator* iter = db_->NewIterator(options); ++ char key[100]; ++ const int k = thread->rand.Next() % FLAGS_num; ++ snprintf(key, sizeof(key), "%016d", k); ++ iter->Seek(key); ++ if (iter->Valid() && iter->key() == key) found++; ++ delete iter; ++ thread->stats.FinishedSingleOp(); ++ } ++ char msg[100]; ++ snprintf(msg, sizeof(msg), "(%d of %d found)", found, num_); ++ thread->stats.AddMessage(msg); ++ } ++ ++ void DoDelete(ThreadState* thread, bool seq) { ++ RandomGenerator gen; ++ WriteBatch batch; ++ Status s; ++ for (int i = 0; i < num_; i += entries_per_batch_) { ++ batch.Clear(); ++ for (int j = 0; j < entries_per_batch_; j++) { ++ const int k = seq ? i+j : (thread->rand.Next() % FLAGS_num); ++ char key[100]; ++ snprintf(key, sizeof(key), "%016d", k); ++ batch.Delete(key); ++ thread->stats.FinishedSingleOp(); ++ } ++ s = db_->Write(write_options_, &batch); ++ if (!s.ok()) { ++ fprintf(stderr, "del error: %s\n", s.ToString().c_str()); ++ exit(1); ++ } ++ } ++ } ++ ++ void DeleteSeq(ThreadState* thread) { ++ DoDelete(thread, true); ++ } ++ ++ void DeleteRandom(ThreadState* thread) { ++ DoDelete(thread, false); ++ } ++ ++ void ReadWhileWriting(ThreadState* thread) { ++ if (thread->tid > 0) { ++ ReadRandom(thread); ++ } else { ++ // Special thread that keeps writing until other threads are done. ++ RandomGenerator gen; ++ while (true) { ++ { ++ MutexLock l(&thread->shared->mu); ++ if (thread->shared->num_done + 1 >= thread->shared->num_initialized) { ++ // Other threads have finished ++ break; ++ } ++ } ++ ++ const int k = thread->rand.Next() % FLAGS_num; ++ char key[100]; ++ snprintf(key, sizeof(key), "%016d", k); ++ Status s = db_->Put(write_options_, key, gen.Generate(value_size_)); ++ if (!s.ok()) { ++ fprintf(stderr, "put error: %s\n", s.ToString().c_str()); ++ exit(1); ++ } ++ } ++ ++ // Do not count any of the preceding work/delay in stats. ++ thread->stats.Start(); ++ } ++ } ++ ++ void Compact(ThreadState* thread) { ++ db_->CompactRange(NULL, NULL); ++ } ++ ++ void PrintStats(const char* key) { ++ std::string stats; ++ if (!db_->GetProperty(key, &stats)) { ++ stats = "(failed)"; ++ } ++ fprintf(stdout, "\n%s\n", stats.c_str()); ++ } ++ ++ static void WriteToFile(void* arg, const char* buf, int n) { ++ reinterpret_cast(arg)->Append(Slice(buf, n)); ++ } ++ ++ void HeapProfile() { ++ char fname[100]; ++ snprintf(fname, sizeof(fname), "%s/heap-%04d", FLAGS_db, ++heap_counter_); ++ WritableFile* file; ++ Status s = g_env->NewWritableFile(fname, &file); ++ if (!s.ok()) { ++ fprintf(stderr, "%s\n", s.ToString().c_str()); ++ return; ++ } ++ bool ok = port::GetHeapProfile(WriteToFile, file); ++ delete file; ++ if (!ok) { ++ fprintf(stderr, "heap profiling not supported\n"); ++ g_env->DeleteFile(fname); ++ } ++ } ++}; ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ FLAGS_write_buffer_size = leveldb::Options().write_buffer_size; ++ FLAGS_max_file_size = leveldb::Options().max_file_size; ++ FLAGS_block_size = leveldb::Options().block_size; ++ FLAGS_open_files = leveldb::Options().max_open_files; ++ std::string default_db_path; ++ ++ for (int i = 1; i < argc; i++) { ++ double d; ++ int n; ++ char junk; ++ if (leveldb::Slice(argv[i]).starts_with("--benchmarks=")) { ++ FLAGS_benchmarks = argv[i] + strlen("--benchmarks="); ++ } else if (sscanf(argv[i], "--compression_ratio=%lf%c", &d, &junk) == 1) { ++ FLAGS_compression_ratio = d; ++ } else if (sscanf(argv[i], "--histogram=%d%c", &n, &junk) == 1 && ++ (n == 0 || n == 1)) { ++ FLAGS_histogram = n; ++ } else if (sscanf(argv[i], "--use_existing_db=%d%c", &n, &junk) == 1 && ++ (n == 0 || n == 1)) { ++ FLAGS_use_existing_db = n; ++ } else if (sscanf(argv[i], "--reuse_logs=%d%c", &n, &junk) == 1 && ++ (n == 0 || n == 1)) { ++ FLAGS_reuse_logs = n; ++ } else if (sscanf(argv[i], "--num=%d%c", &n, &junk) == 1) { ++ FLAGS_num = n; ++ } else if (sscanf(argv[i], "--reads=%d%c", &n, &junk) == 1) { ++ FLAGS_reads = n; ++ } else if (sscanf(argv[i], "--threads=%d%c", &n, &junk) == 1) { ++ FLAGS_threads = n; ++ } else if (sscanf(argv[i], "--value_size=%d%c", &n, &junk) == 1) { ++ FLAGS_value_size = n; ++ } else if (sscanf(argv[i], "--write_buffer_size=%d%c", &n, &junk) == 1) { ++ FLAGS_write_buffer_size = n; ++ } else if (sscanf(argv[i], "--max_file_size=%d%c", &n, &junk) == 1) { ++ FLAGS_max_file_size = n; ++ } else if (sscanf(argv[i], "--block_size=%d%c", &n, &junk) == 1) { ++ FLAGS_block_size = n; ++ } else if (sscanf(argv[i], "--cache_size=%d%c", &n, &junk) == 1) { ++ FLAGS_cache_size = n; ++ } else if (sscanf(argv[i], "--bloom_bits=%d%c", &n, &junk) == 1) { ++ FLAGS_bloom_bits = n; ++ } else if (sscanf(argv[i], "--open_files=%d%c", &n, &junk) == 1) { ++ FLAGS_open_files = n; ++ } else if (strncmp(argv[i], "--db=", 5) == 0) { ++ FLAGS_db = argv[i] + 5; ++ } else { ++ fprintf(stderr, "Invalid flag '%s'\n", argv[i]); ++ exit(1); ++ } ++ } ++ ++ leveldb::g_env = leveldb::Env::Default(); ++ ++ // Choose a location for the test database if none given with --db= ++ if (FLAGS_db == NULL) { ++ leveldb::g_env->GetTestDirectory(&default_db_path); ++ default_db_path += "/dbbench"; ++ FLAGS_db = default_db_path.c_str(); ++ } ++ ++ leveldb::Benchmark benchmark; ++ benchmark.Run(); ++ return 0; ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.cc +new file mode 100644 +index 0000000..f43ad76 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.cc +@@ -0,0 +1,1568 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/db_impl.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "db/builder.h" ++#include "db/db_iter.h" ++#include "db/dbformat.h" ++#include "db/filename.h" ++#include "db/log_reader.h" ++#include "db/log_writer.h" ++#include "db/memtable.h" ++#include "db/table_cache.h" ++#include "db/version_set.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/status.h" ++#include "leveldb/table.h" ++#include "leveldb/table_builder.h" ++#include "port/port.h" ++#include "table/block.h" ++#include "table/merger.h" ++#include "table/two_level_iterator.h" ++#include "util/coding.h" ++#include "util/logging.h" ++#include "util/mutexlock.h" ++ ++namespace leveldb { ++ ++const int kNumNonTableCacheFiles = 10; ++ ++// Information kept for every waiting writer ++struct DBImpl::Writer { ++ Status status; ++ WriteBatch* batch; ++ bool sync; ++ bool done; ++ port::CondVar cv; ++ ++ explicit Writer(port::Mutex* mu) : cv(mu) { } ++}; ++ ++struct DBImpl::CompactionState { ++ Compaction* const compaction; ++ ++ // Sequence numbers < smallest_snapshot are not significant since we ++ // will never have to service a snapshot below smallest_snapshot. ++ // Therefore if we have seen a sequence number S <= smallest_snapshot, ++ // we can drop all entries for the same key with sequence numbers < S. ++ SequenceNumber smallest_snapshot; ++ ++ // Files produced by compaction ++ struct Output { ++ uint64_t number; ++ uint64_t file_size; ++ InternalKey smallest, largest; ++ }; ++ std::vector outputs; ++ ++ // State kept for output being generated ++ WritableFile* outfile; ++ TableBuilder* builder; ++ ++ uint64_t total_bytes; ++ ++ Output* current_output() { return &outputs[outputs.size()-1]; } ++ ++ explicit CompactionState(Compaction* c) ++ : compaction(c), ++ outfile(NULL), ++ builder(NULL), ++ total_bytes(0) { ++ } ++}; ++ ++// Fix user-supplied options to be reasonable ++template ++static void ClipToRange(T* ptr, V minvalue, V maxvalue) { ++ if (static_cast(*ptr) > maxvalue) *ptr = maxvalue; ++ if (static_cast(*ptr) < minvalue) *ptr = minvalue; ++} ++Options SanitizeOptions(const std::string& dbname, ++ const InternalKeyComparator* icmp, ++ const InternalFilterPolicy* ipolicy, ++ const Options& src) { ++ Options result = src; ++ result.comparator = icmp; ++ result.filter_policy = (src.filter_policy != NULL) ? ipolicy : NULL; ++ ClipToRange(&result.max_open_files, 64 + kNumNonTableCacheFiles, 50000); ++ ClipToRange(&result.write_buffer_size, 64<<10, 1<<30); ++ ClipToRange(&result.max_file_size, 1<<20, 1<<30); ++ ClipToRange(&result.block_size, 1<<10, 4<<20); ++ if (result.info_log == NULL) { ++ // Open a log file in the same directory as the db ++ src.env->CreateDir(dbname); // In case it does not exist ++ src.env->RenameFile(InfoLogFileName(dbname), OldInfoLogFileName(dbname)); ++ Status s = src.env->NewLogger(InfoLogFileName(dbname), &result.info_log); ++ if (!s.ok()) { ++ // No place suitable for logging ++ result.info_log = NULL; ++ } ++ } ++ if (result.block_cache == NULL) { ++ result.block_cache = NewLRUCache(8 << 20); ++ } ++ return result; ++} ++ ++DBImpl::DBImpl(const Options& raw_options, const std::string& dbname) ++ : env_(raw_options.env), ++ internal_comparator_(raw_options.comparator), ++ internal_filter_policy_(raw_options.filter_policy), ++ options_(SanitizeOptions(dbname, &internal_comparator_, ++ &internal_filter_policy_, raw_options)), ++ owns_info_log_(options_.info_log != raw_options.info_log), ++ owns_cache_(options_.block_cache != raw_options.block_cache), ++ dbname_(dbname), ++ db_lock_(NULL), ++ shutting_down_(NULL), ++ bg_cv_(&mutex_), ++ mem_(NULL), ++ imm_(NULL), ++ logfile_(NULL), ++ logfile_number_(0), ++ log_(NULL), ++ seed_(0), ++ tmp_batch_(new WriteBatch), ++ bg_compaction_scheduled_(false), ++ manual_compaction_(NULL) { ++ has_imm_.Release_Store(NULL); ++ ++ // Reserve ten files or so for other uses and give the rest to TableCache. ++ const int table_cache_size = options_.max_open_files - kNumNonTableCacheFiles; ++ table_cache_ = new TableCache(dbname_, &options_, table_cache_size); ++ ++ versions_ = new VersionSet(dbname_, &options_, table_cache_, ++ &internal_comparator_); ++} ++ ++DBImpl::~DBImpl() { ++ // Wait for background work to finish ++ mutex_.Lock(); ++ shutting_down_.Release_Store(this); // Any non-NULL value is ok ++ while (bg_compaction_scheduled_) { ++ bg_cv_.Wait(); ++ } ++ mutex_.Unlock(); ++ ++ if (db_lock_ != NULL) { ++ env_->UnlockFile(db_lock_); ++ } ++ ++ delete versions_; ++ if (mem_ != NULL) mem_->Unref(); ++ if (imm_ != NULL) imm_->Unref(); ++ delete tmp_batch_; ++ delete log_; ++ delete logfile_; ++ delete table_cache_; ++ ++ if (owns_info_log_) { ++ delete options_.info_log; ++ } ++ if (owns_cache_) { ++ delete options_.block_cache; ++ } ++} ++ ++Status DBImpl::NewDB() { ++ VersionEdit new_db; ++ new_db.SetComparatorName(user_comparator()->Name()); ++ new_db.SetLogNumber(0); ++ new_db.SetNextFile(2); ++ new_db.SetLastSequence(0); ++ ++ const std::string manifest = DescriptorFileName(dbname_, 1); ++ WritableFile* file; ++ Status s = env_->NewWritableFile(manifest, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ { ++ log::Writer log(file); ++ std::string record; ++ new_db.EncodeTo(&record); ++ s = log.AddRecord(record); ++ if (s.ok()) { ++ s = file->Close(); ++ } ++ } ++ delete file; ++ if (s.ok()) { ++ // Make "CURRENT" file that points to the new manifest file. ++ s = SetCurrentFile(env_, dbname_, 1); ++ } else { ++ env_->DeleteFile(manifest); ++ } ++ return s; ++} ++ ++void DBImpl::MaybeIgnoreError(Status* s) const { ++ if (s->ok() || options_.paranoid_checks) { ++ // No change needed ++ } else { ++ Log(options_.info_log, "Ignoring error %s", s->ToString().c_str()); ++ *s = Status::OK(); ++ } ++} ++ ++void DBImpl::DeleteObsoleteFiles() { ++ if (!bg_error_.ok()) { ++ // After a background error, we don't know whether a new version may ++ // or may not have been committed, so we cannot safely garbage collect. ++ return; ++ } ++ ++ // Make a set of all of the live files ++ std::set live = pending_outputs_; ++ versions_->AddLiveFiles(&live); ++ ++ std::vector filenames; ++ env_->GetChildren(dbname_, &filenames); // Ignoring errors on purpose ++ uint64_t number; ++ FileType type; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type)) { ++ bool keep = true; ++ switch (type) { ++ case kLogFile: ++ keep = ((number >= versions_->LogNumber()) || ++ (number == versions_->PrevLogNumber())); ++ break; ++ case kDescriptorFile: ++ // Keep my manifest file, and any newer incarnations' ++ // (in case there is a race that allows other incarnations) ++ keep = (number >= versions_->ManifestFileNumber()); ++ break; ++ case kTableFile: ++ keep = (live.find(number) != live.end()); ++ break; ++ case kTempFile: ++ // Any temp files that are currently being written to must ++ // be recorded in pending_outputs_, which is inserted into "live" ++ keep = (live.find(number) != live.end()); ++ break; ++ case kCurrentFile: ++ case kDBLockFile: ++ case kInfoLogFile: ++ keep = true; ++ break; ++ } ++ ++ if (!keep) { ++ if (type == kTableFile) { ++ table_cache_->Evict(number); ++ } ++ Log(options_.info_log, "Delete type=%d #%lld\n", ++ int(type), ++ static_cast(number)); ++ env_->DeleteFile(dbname_ + "/" + filenames[i]); ++ } ++ } ++ } ++} ++ ++Status DBImpl::Recover(VersionEdit* edit, bool *save_manifest) { ++ mutex_.AssertHeld(); ++ ++ // Ignore error from CreateDir since the creation of the DB is ++ // committed only when the descriptor is created, and this directory ++ // may already exist from a previous failed creation attempt. ++ env_->CreateDir(dbname_); ++ assert(db_lock_ == NULL); ++ Status s = env_->LockFile(LockFileName(dbname_), &db_lock_); ++ if (!s.ok()) { ++ return s; ++ } ++ ++ if (!env_->FileExists(CurrentFileName(dbname_))) { ++ if (options_.create_if_missing) { ++ s = NewDB(); ++ if (!s.ok()) { ++ return s; ++ } ++ } else { ++ return Status::InvalidArgument( ++ dbname_, "does not exist (create_if_missing is false)"); ++ } ++ } else { ++ if (options_.error_if_exists) { ++ return Status::InvalidArgument( ++ dbname_, "exists (error_if_exists is true)"); ++ } ++ } ++ ++ s = versions_->Recover(save_manifest); ++ if (!s.ok()) { ++ return s; ++ } ++ SequenceNumber max_sequence(0); ++ ++ // Recover from all newer log files than the ones named in the ++ // descriptor (new log files may have been added by the previous ++ // incarnation without registering them in the descriptor). ++ // ++ // Note that PrevLogNumber() is no longer used, but we pay ++ // attention to it in case we are recovering a database ++ // produced by an older version of leveldb. ++ const uint64_t min_log = versions_->LogNumber(); ++ const uint64_t prev_log = versions_->PrevLogNumber(); ++ std::vector filenames; ++ s = env_->GetChildren(dbname_, &filenames); ++ if (!s.ok()) { ++ return s; ++ } ++ std::set expected; ++ versions_->AddLiveFiles(&expected); ++ uint64_t number; ++ FileType type; ++ std::vector logs; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type)) { ++ expected.erase(number); ++ if (type == kLogFile && ((number >= min_log) || (number == prev_log))) ++ logs.push_back(number); ++ } ++ } ++ if (!expected.empty()) { ++ char buf[50]; ++ snprintf(buf, sizeof(buf), "%d missing files; e.g.", ++ static_cast(expected.size())); ++ return Status::Corruption(buf, TableFileName(dbname_, *(expected.begin()))); ++ } ++ ++ // Recover in the order in which the logs were generated ++ std::sort(logs.begin(), logs.end()); ++ for (size_t i = 0; i < logs.size(); i++) { ++ s = RecoverLogFile(logs[i], (i == logs.size() - 1), save_manifest, edit, ++ &max_sequence); ++ if (!s.ok()) { ++ return s; ++ } ++ ++ // The previous incarnation may not have written any MANIFEST ++ // records after allocating this log number. So we manually ++ // update the file number allocation counter in VersionSet. ++ versions_->MarkFileNumberUsed(logs[i]); ++ } ++ ++ if (versions_->LastSequence() < max_sequence) { ++ versions_->SetLastSequence(max_sequence); ++ } ++ ++ return Status::OK(); ++} ++ ++Status DBImpl::RecoverLogFile(uint64_t log_number, bool last_log, ++ bool* save_manifest, VersionEdit* edit, ++ SequenceNumber* max_sequence) { ++ struct LogReporter : public log::Reader::Reporter { ++ Env* env; ++ Logger* info_log; ++ const char* fname; ++ Status* status; // NULL if options_.paranoid_checks==false ++ virtual void Corruption(size_t bytes, const Status& s) { ++ Log(info_log, "%s%s: dropping %d bytes; %s", ++ (this->status == NULL ? "(ignoring error) " : ""), ++ fname, static_cast(bytes), s.ToString().c_str()); ++ if (this->status != NULL && this->status->ok()) *this->status = s; ++ } ++ }; ++ ++ mutex_.AssertHeld(); ++ ++ // Open the log file ++ std::string fname = LogFileName(dbname_, log_number); ++ SequentialFile* file; ++ Status status = env_->NewSequentialFile(fname, &file); ++ if (!status.ok()) { ++ MaybeIgnoreError(&status); ++ return status; ++ } ++ ++ // Create the log reader. ++ LogReporter reporter; ++ reporter.env = env_; ++ reporter.info_log = options_.info_log; ++ reporter.fname = fname.c_str(); ++ reporter.status = (options_.paranoid_checks ? &status : NULL); ++ // We intentionally make log::Reader do checksumming even if ++ // paranoid_checks==false so that corruptions cause entire commits ++ // to be skipped instead of propagating bad information (like overly ++ // large sequence numbers). ++ log::Reader reader(file, &reporter, true/*checksum*/, ++ 0/*initial_offset*/); ++ Log(options_.info_log, "Recovering log #%llu", ++ (unsigned long long) log_number); ++ ++ // Read all the records and add to a memtable ++ std::string scratch; ++ Slice record; ++ WriteBatch batch; ++ int compactions = 0; ++ MemTable* mem = NULL; ++ while (reader.ReadRecord(&record, &scratch) && ++ status.ok()) { ++ if (record.size() < 12) { ++ reporter.Corruption( ++ record.size(), Status::Corruption("log record too small")); ++ continue; ++ } ++ WriteBatchInternal::SetContents(&batch, record); ++ ++ if (mem == NULL) { ++ mem = new MemTable(internal_comparator_); ++ mem->Ref(); ++ } ++ status = WriteBatchInternal::InsertInto(&batch, mem); ++ MaybeIgnoreError(&status); ++ if (!status.ok()) { ++ break; ++ } ++ const SequenceNumber last_seq = ++ WriteBatchInternal::Sequence(&batch) + ++ WriteBatchInternal::Count(&batch) - 1; ++ if (last_seq > *max_sequence) { ++ *max_sequence = last_seq; ++ } ++ ++ if (mem->ApproximateMemoryUsage() > options_.write_buffer_size) { ++ compactions++; ++ *save_manifest = true; ++ status = WriteLevel0Table(mem, edit, NULL); ++ mem->Unref(); ++ mem = NULL; ++ if (!status.ok()) { ++ // Reflect errors immediately so that conditions like full ++ // file-systems cause the DB::Open() to fail. ++ break; ++ } ++ } ++ } ++ ++ delete file; ++ ++ // See if we should keep reusing the last log file. ++ if (status.ok() && options_.reuse_logs && last_log && compactions == 0) { ++ assert(logfile_ == NULL); ++ assert(log_ == NULL); ++ assert(mem_ == NULL); ++ uint64_t lfile_size; ++ if (env_->GetFileSize(fname, &lfile_size).ok() && ++ env_->NewAppendableFile(fname, &logfile_).ok()) { ++ Log(options_.info_log, "Reusing old log %s \n", fname.c_str()); ++ log_ = new log::Writer(logfile_, lfile_size); ++ logfile_number_ = log_number; ++ if (mem != NULL) { ++ mem_ = mem; ++ mem = NULL; ++ } else { ++ // mem can be NULL if lognum exists but was empty. ++ mem_ = new MemTable(internal_comparator_); ++ mem_->Ref(); ++ } ++ } ++ } ++ ++ if (mem != NULL) { ++ // mem did not get reused; compact it. ++ if (status.ok()) { ++ *save_manifest = true; ++ status = WriteLevel0Table(mem, edit, NULL); ++ } ++ mem->Unref(); ++ } ++ ++ return status; ++} ++ ++Status DBImpl::WriteLevel0Table(MemTable* mem, VersionEdit* edit, ++ Version* base) { ++ mutex_.AssertHeld(); ++ const uint64_t start_micros = env_->NowMicros(); ++ FileMetaData meta; ++ meta.number = versions_->NewFileNumber(); ++ pending_outputs_.insert(meta.number); ++ Iterator* iter = mem->NewIterator(); ++ Log(options_.info_log, "Level-0 table #%llu: started", ++ (unsigned long long) meta.number); ++ ++ Status s; ++ { ++ mutex_.Unlock(); ++ s = BuildTable(dbname_, env_, options_, table_cache_, iter, &meta); ++ mutex_.Lock(); ++ } ++ ++ Log(options_.info_log, "Level-0 table #%llu: %lld bytes %s", ++ (unsigned long long) meta.number, ++ (unsigned long long) meta.file_size, ++ s.ToString().c_str()); ++ delete iter; ++ pending_outputs_.erase(meta.number); ++ ++ ++ // Note that if file_size is zero, the file has been deleted and ++ // should not be added to the manifest. ++ int level = 0; ++ if (s.ok() && meta.file_size > 0) { ++ const Slice min_user_key = meta.smallest.user_key(); ++ const Slice max_user_key = meta.largest.user_key(); ++ if (base != NULL) { ++ level = base->PickLevelForMemTableOutput(min_user_key, max_user_key); ++ } ++ edit->AddFile(level, meta.number, meta.file_size, ++ meta.smallest, meta.largest); ++ } ++ ++ CompactionStats stats; ++ stats.micros = env_->NowMicros() - start_micros; ++ stats.bytes_written = meta.file_size; ++ stats_[level].Add(stats); ++ return s; ++} ++ ++void DBImpl::CompactMemTable() { ++ mutex_.AssertHeld(); ++ assert(imm_ != NULL); ++ ++ // Save the contents of the memtable as a new Table ++ VersionEdit edit; ++ Version* base = versions_->current(); ++ base->Ref(); ++ Status s = WriteLevel0Table(imm_, &edit, base); ++ base->Unref(); ++ ++ if (s.ok() && shutting_down_.Acquire_Load()) { ++ s = Status::IOError("Deleting DB during memtable compaction"); ++ } ++ ++ // Replace immutable memtable with the generated Table ++ if (s.ok()) { ++ edit.SetPrevLogNumber(0); ++ edit.SetLogNumber(logfile_number_); // Earlier logs no longer needed ++ s = versions_->LogAndApply(&edit, &mutex_); ++ } ++ ++ if (s.ok()) { ++ // Commit to the new state ++ imm_->Unref(); ++ imm_ = NULL; ++ has_imm_.Release_Store(NULL); ++ DeleteObsoleteFiles(); ++ } else { ++ RecordBackgroundError(s); ++ } ++} ++ ++void DBImpl::CompactRange(const Slice* begin, const Slice* end) { ++ int max_level_with_files = 1; ++ { ++ MutexLock l(&mutex_); ++ Version* base = versions_->current(); ++ for (int level = 1; level < config::kNumLevels; level++) { ++ if (base->OverlapInLevel(level, begin, end)) { ++ max_level_with_files = level; ++ } ++ } ++ } ++ TEST_CompactMemTable(); // TODO(sanjay): Skip if memtable does not overlap ++ for (int level = 0; level < max_level_with_files; level++) { ++ TEST_CompactRange(level, begin, end); ++ } ++} ++ ++void DBImpl::TEST_CompactRange(int level, const Slice* begin,const Slice* end) { ++ assert(level >= 0); ++ assert(level + 1 < config::kNumLevels); ++ ++ InternalKey begin_storage, end_storage; ++ ++ ManualCompaction manual; ++ manual.level = level; ++ manual.done = false; ++ if (begin == NULL) { ++ manual.begin = NULL; ++ } else { ++ begin_storage = InternalKey(*begin, kMaxSequenceNumber, kValueTypeForSeek); ++ manual.begin = &begin_storage; ++ } ++ if (end == NULL) { ++ manual.end = NULL; ++ } else { ++ end_storage = InternalKey(*end, 0, static_cast(0)); ++ manual.end = &end_storage; ++ } ++ ++ MutexLock l(&mutex_); ++ while (!manual.done && !shutting_down_.Acquire_Load() && bg_error_.ok()) { ++ if (manual_compaction_ == NULL) { // Idle ++ manual_compaction_ = &manual; ++ MaybeScheduleCompaction(); ++ } else { // Running either my compaction or another compaction. ++ bg_cv_.Wait(); ++ } ++ } ++ if (manual_compaction_ == &manual) { ++ // Cancel my manual compaction since we aborted early for some reason. ++ manual_compaction_ = NULL; ++ } ++} ++ ++Status DBImpl::TEST_CompactMemTable() { ++ // NULL batch means just wait for earlier writes to be done ++ Status s = Write(WriteOptions(), NULL); ++ if (s.ok()) { ++ // Wait until the compaction completes ++ MutexLock l(&mutex_); ++ while (imm_ != NULL && bg_error_.ok()) { ++ bg_cv_.Wait(); ++ } ++ if (imm_ != NULL) { ++ s = bg_error_; ++ } ++ } ++ return s; ++} ++ ++void DBImpl::RecordBackgroundError(const Status& s) { ++ mutex_.AssertHeld(); ++ if (bg_error_.ok()) { ++ bg_error_ = s; ++ bg_cv_.SignalAll(); ++ } ++} ++ ++void DBImpl::MaybeScheduleCompaction() { ++ mutex_.AssertHeld(); ++ if (bg_compaction_scheduled_) { ++ // Already scheduled ++ } else if (shutting_down_.Acquire_Load()) { ++ // DB is being deleted; no more background compactions ++ } else if (!bg_error_.ok()) { ++ // Already got an error; no more changes ++ } else if (imm_ == NULL && ++ manual_compaction_ == NULL && ++ !versions_->NeedsCompaction()) { ++ // No work to be done ++ } else { ++ bg_compaction_scheduled_ = true; ++ env_->Schedule(&DBImpl::BGWork, this); ++ } ++} ++ ++void DBImpl::BGWork(void* db) { ++ reinterpret_cast(db)->BackgroundCall(); ++} ++ ++void DBImpl::BackgroundCall() { ++ MutexLock l(&mutex_); ++ assert(bg_compaction_scheduled_); ++ if (shutting_down_.Acquire_Load()) { ++ // No more background work when shutting down. ++ } else if (!bg_error_.ok()) { ++ // No more background work after a background error. ++ } else { ++ BackgroundCompaction(); ++ } ++ ++ bg_compaction_scheduled_ = false; ++ ++ // Previous compaction may have produced too many files in a level, ++ // so reschedule another compaction if needed. ++ MaybeScheduleCompaction(); ++ bg_cv_.SignalAll(); ++} ++ ++void DBImpl::BackgroundCompaction() { ++ mutex_.AssertHeld(); ++ ++ if (imm_ != NULL) { ++ CompactMemTable(); ++ return; ++ } ++ ++ Compaction* c; ++ bool is_manual = (manual_compaction_ != NULL); ++ InternalKey manual_end; ++ if (is_manual) { ++ ManualCompaction* m = manual_compaction_; ++ c = versions_->CompactRange(m->level, m->begin, m->end); ++ m->done = (c == NULL); ++ if (c != NULL) { ++ manual_end = c->input(0, c->num_input_files(0) - 1)->largest; ++ } ++ Log(options_.info_log, ++ "Manual compaction at level-%d from %s .. %s; will stop at %s\n", ++ m->level, ++ (m->begin ? m->begin->DebugString().c_str() : "(begin)"), ++ (m->end ? m->end->DebugString().c_str() : "(end)"), ++ (m->done ? "(end)" : manual_end.DebugString().c_str())); ++ } else { ++ c = versions_->PickCompaction(); ++ } ++ ++ Status status; ++ if (c == NULL) { ++ // Nothing to do ++ } else if (!is_manual && c->IsTrivialMove()) { ++ // Move file to next level ++ assert(c->num_input_files(0) == 1); ++ FileMetaData* f = c->input(0, 0); ++ c->edit()->DeleteFile(c->level(), f->number); ++ c->edit()->AddFile(c->level() + 1, f->number, f->file_size, ++ f->smallest, f->largest); ++ status = versions_->LogAndApply(c->edit(), &mutex_); ++ if (!status.ok()) { ++ RecordBackgroundError(status); ++ } ++ VersionSet::LevelSummaryStorage tmp; ++ Log(options_.info_log, "Moved #%lld to level-%d %lld bytes %s: %s\n", ++ static_cast(f->number), ++ c->level() + 1, ++ static_cast(f->file_size), ++ status.ToString().c_str(), ++ versions_->LevelSummary(&tmp)); ++ } else { ++ CompactionState* compact = new CompactionState(c); ++ status = DoCompactionWork(compact); ++ if (!status.ok()) { ++ RecordBackgroundError(status); ++ } ++ CleanupCompaction(compact); ++ c->ReleaseInputs(); ++ DeleteObsoleteFiles(); ++ } ++ delete c; ++ ++ if (status.ok()) { ++ // Done ++ } else if (shutting_down_.Acquire_Load()) { ++ // Ignore compaction errors found during shutting down ++ } else { ++ Log(options_.info_log, ++ "Compaction error: %s", status.ToString().c_str()); ++ } ++ ++ if (is_manual) { ++ ManualCompaction* m = manual_compaction_; ++ if (!status.ok()) { ++ m->done = true; ++ } ++ if (!m->done) { ++ // We only compacted part of the requested range. Update *m ++ // to the range that is left to be compacted. ++ m->tmp_storage = manual_end; ++ m->begin = &m->tmp_storage; ++ } ++ manual_compaction_ = NULL; ++ } ++} ++ ++void DBImpl::CleanupCompaction(CompactionState* compact) { ++ mutex_.AssertHeld(); ++ if (compact->builder != NULL) { ++ // May happen if we get a shutdown call in the middle of compaction ++ compact->builder->Abandon(); ++ delete compact->builder; ++ } else { ++ assert(compact->outfile == NULL); ++ } ++ delete compact->outfile; ++ for (size_t i = 0; i < compact->outputs.size(); i++) { ++ const CompactionState::Output& out = compact->outputs[i]; ++ pending_outputs_.erase(out.number); ++ } ++ delete compact; ++} ++ ++Status DBImpl::OpenCompactionOutputFile(CompactionState* compact) { ++ assert(compact != NULL); ++ assert(compact->builder == NULL); ++ uint64_t file_number; ++ { ++ mutex_.Lock(); ++ file_number = versions_->NewFileNumber(); ++ pending_outputs_.insert(file_number); ++ CompactionState::Output out; ++ out.number = file_number; ++ out.smallest.Clear(); ++ out.largest.Clear(); ++ compact->outputs.push_back(out); ++ mutex_.Unlock(); ++ } ++ ++ // Make the output file ++ std::string fname = TableFileName(dbname_, file_number); ++ Status s = env_->NewWritableFile(fname, &compact->outfile); ++ if (s.ok()) { ++ compact->builder = new TableBuilder(options_, compact->outfile); ++ } ++ return s; ++} ++ ++Status DBImpl::FinishCompactionOutputFile(CompactionState* compact, ++ Iterator* input) { ++ assert(compact != NULL); ++ assert(compact->outfile != NULL); ++ assert(compact->builder != NULL); ++ ++ const uint64_t output_number = compact->current_output()->number; ++ assert(output_number != 0); ++ ++ // Check for iterator errors ++ Status s = input->status(); ++ const uint64_t current_entries = compact->builder->NumEntries(); ++ if (s.ok()) { ++ s = compact->builder->Finish(); ++ } else { ++ compact->builder->Abandon(); ++ } ++ const uint64_t current_bytes = compact->builder->FileSize(); ++ compact->current_output()->file_size = current_bytes; ++ compact->total_bytes += current_bytes; ++ delete compact->builder; ++ compact->builder = NULL; ++ ++ // Finish and check for file errors ++ if (s.ok()) { ++ s = compact->outfile->Sync(); ++ } ++ if (s.ok()) { ++ s = compact->outfile->Close(); ++ } ++ delete compact->outfile; ++ compact->outfile = NULL; ++ ++ if (s.ok() && current_entries > 0) { ++ // Verify that the table is usable ++ Iterator* iter = table_cache_->NewIterator(ReadOptions(), ++ output_number, ++ current_bytes); ++ s = iter->status(); ++ delete iter; ++ if (s.ok()) { ++ Log(options_.info_log, ++ "Generated table #%llu@%d: %lld keys, %lld bytes", ++ (unsigned long long) output_number, ++ compact->compaction->level(), ++ (unsigned long long) current_entries, ++ (unsigned long long) current_bytes); ++ } ++ } ++ return s; ++} ++ ++ ++Status DBImpl::InstallCompactionResults(CompactionState* compact) { ++ mutex_.AssertHeld(); ++ Log(options_.info_log, "Compacted %d@%d + %d@%d files => %lld bytes", ++ compact->compaction->num_input_files(0), ++ compact->compaction->level(), ++ compact->compaction->num_input_files(1), ++ compact->compaction->level() + 1, ++ static_cast(compact->total_bytes)); ++ ++ // Add compaction outputs ++ compact->compaction->AddInputDeletions(compact->compaction->edit()); ++ const int level = compact->compaction->level(); ++ for (size_t i = 0; i < compact->outputs.size(); i++) { ++ const CompactionState::Output& out = compact->outputs[i]; ++ compact->compaction->edit()->AddFile( ++ level + 1, ++ out.number, out.file_size, out.smallest, out.largest); ++ } ++ return versions_->LogAndApply(compact->compaction->edit(), &mutex_); ++} ++ ++Status DBImpl::DoCompactionWork(CompactionState* compact) { ++ const uint64_t start_micros = env_->NowMicros(); ++ int64_t imm_micros = 0; // Micros spent doing imm_ compactions ++ ++ Log(options_.info_log, "Compacting %d@%d + %d@%d files", ++ compact->compaction->num_input_files(0), ++ compact->compaction->level(), ++ compact->compaction->num_input_files(1), ++ compact->compaction->level() + 1); ++ ++ assert(versions_->NumLevelFiles(compact->compaction->level()) > 0); ++ assert(compact->builder == NULL); ++ assert(compact->outfile == NULL); ++ if (snapshots_.empty()) { ++ compact->smallest_snapshot = versions_->LastSequence(); ++ } else { ++ compact->smallest_snapshot = snapshots_.oldest()->number_; ++ } ++ ++ // Release mutex while we're actually doing the compaction work ++ mutex_.Unlock(); ++ ++ Iterator* input = versions_->MakeInputIterator(compact->compaction); ++ input->SeekToFirst(); ++ Status status; ++ ParsedInternalKey ikey; ++ std::string current_user_key; ++ bool has_current_user_key = false; ++ SequenceNumber last_sequence_for_key = kMaxSequenceNumber; ++ for (; input->Valid() && !shutting_down_.Acquire_Load(); ) { ++ // Prioritize immutable compaction work ++ if (has_imm_.NoBarrier_Load() != NULL) { ++ const uint64_t imm_start = env_->NowMicros(); ++ mutex_.Lock(); ++ if (imm_ != NULL) { ++ CompactMemTable(); ++ bg_cv_.SignalAll(); // Wakeup MakeRoomForWrite() if necessary ++ } ++ mutex_.Unlock(); ++ imm_micros += (env_->NowMicros() - imm_start); ++ } ++ ++ Slice key = input->key(); ++ if (compact->compaction->ShouldStopBefore(key) && ++ compact->builder != NULL) { ++ status = FinishCompactionOutputFile(compact, input); ++ if (!status.ok()) { ++ break; ++ } ++ } ++ ++ // Handle key/value, add to state, etc. ++ bool drop = false; ++ if (!ParseInternalKey(key, &ikey)) { ++ // Do not hide error keys ++ current_user_key.clear(); ++ has_current_user_key = false; ++ last_sequence_for_key = kMaxSequenceNumber; ++ } else { ++ if (!has_current_user_key || ++ user_comparator()->Compare(ikey.user_key, ++ Slice(current_user_key)) != 0) { ++ // First occurrence of this user key ++ current_user_key.assign(ikey.user_key.data(), ikey.user_key.size()); ++ has_current_user_key = true; ++ last_sequence_for_key = kMaxSequenceNumber; ++ } ++ ++ if (last_sequence_for_key <= compact->smallest_snapshot) { ++ // Hidden by an newer entry for same user key ++ drop = true; // (A) ++ } else if (ikey.type == kTypeDeletion && ++ ikey.sequence <= compact->smallest_snapshot && ++ compact->compaction->IsBaseLevelForKey(ikey.user_key)) { ++ // For this user key: ++ // (1) there is no data in higher levels ++ // (2) data in lower levels will have larger sequence numbers ++ // (3) data in layers that are being compacted here and have ++ // smaller sequence numbers will be dropped in the next ++ // few iterations of this loop (by rule (A) above). ++ // Therefore this deletion marker is obsolete and can be dropped. ++ drop = true; ++ } ++ ++ last_sequence_for_key = ikey.sequence; ++ } ++#if 0 ++ Log(options_.info_log, ++ " Compact: %s, seq %d, type: %d %d, drop: %d, is_base: %d, " ++ "%d smallest_snapshot: %d", ++ ikey.user_key.ToString().c_str(), ++ (int)ikey.sequence, ikey.type, kTypeValue, drop, ++ compact->compaction->IsBaseLevelForKey(ikey.user_key), ++ (int)last_sequence_for_key, (int)compact->smallest_snapshot); ++#endif ++ ++ if (!drop) { ++ // Open output file if necessary ++ if (compact->builder == NULL) { ++ status = OpenCompactionOutputFile(compact); ++ if (!status.ok()) { ++ break; ++ } ++ } ++ if (compact->builder->NumEntries() == 0) { ++ compact->current_output()->smallest.DecodeFrom(key); ++ } ++ compact->current_output()->largest.DecodeFrom(key); ++ compact->builder->Add(key, input->value()); ++ ++ // Close output file if it is big enough ++ if (compact->builder->FileSize() >= ++ compact->compaction->MaxOutputFileSize()) { ++ status = FinishCompactionOutputFile(compact, input); ++ if (!status.ok()) { ++ break; ++ } ++ } ++ } ++ ++ input->Next(); ++ } ++ ++ if (status.ok() && shutting_down_.Acquire_Load()) { ++ status = Status::IOError("Deleting DB during compaction"); ++ } ++ if (status.ok() && compact->builder != NULL) { ++ status = FinishCompactionOutputFile(compact, input); ++ } ++ if (status.ok()) { ++ status = input->status(); ++ } ++ delete input; ++ input = NULL; ++ ++ CompactionStats stats; ++ stats.micros = env_->NowMicros() - start_micros - imm_micros; ++ for (int which = 0; which < 2; which++) { ++ for (int i = 0; i < compact->compaction->num_input_files(which); i++) { ++ stats.bytes_read += compact->compaction->input(which, i)->file_size; ++ } ++ } ++ for (size_t i = 0; i < compact->outputs.size(); i++) { ++ stats.bytes_written += compact->outputs[i].file_size; ++ } ++ ++ mutex_.Lock(); ++ stats_[compact->compaction->level() + 1].Add(stats); ++ ++ if (status.ok()) { ++ status = InstallCompactionResults(compact); ++ } ++ if (!status.ok()) { ++ RecordBackgroundError(status); ++ } ++ VersionSet::LevelSummaryStorage tmp; ++ Log(options_.info_log, ++ "compacted to: %s", versions_->LevelSummary(&tmp)); ++ return status; ++} ++ ++namespace { ++struct IterState { ++ port::Mutex* mu; ++ Version* version; ++ MemTable* mem; ++ MemTable* imm; ++}; ++ ++static void CleanupIteratorState(void* arg1, void* arg2) { ++ IterState* state = reinterpret_cast(arg1); ++ state->mu->Lock(); ++ state->mem->Unref(); ++ if (state->imm != NULL) state->imm->Unref(); ++ state->version->Unref(); ++ state->mu->Unlock(); ++ delete state; ++} ++} // namespace ++ ++Iterator* DBImpl::NewInternalIterator(const ReadOptions& options, ++ SequenceNumber* latest_snapshot, ++ uint32_t* seed) { ++ IterState* cleanup = new IterState; ++ mutex_.Lock(); ++ *latest_snapshot = versions_->LastSequence(); ++ ++ // Collect together all needed child iterators ++ std::vector list; ++ list.push_back(mem_->NewIterator()); ++ mem_->Ref(); ++ if (imm_ != NULL) { ++ list.push_back(imm_->NewIterator()); ++ imm_->Ref(); ++ } ++ versions_->current()->AddIterators(options, &list); ++ Iterator* internal_iter = ++ NewMergingIterator(&internal_comparator_, &list[0], list.size()); ++ versions_->current()->Ref(); ++ ++ cleanup->mu = &mutex_; ++ cleanup->mem = mem_; ++ cleanup->imm = imm_; ++ cleanup->version = versions_->current(); ++ internal_iter->RegisterCleanup(CleanupIteratorState, cleanup, NULL); ++ ++ *seed = ++seed_; ++ mutex_.Unlock(); ++ return internal_iter; ++} ++ ++Iterator* DBImpl::TEST_NewInternalIterator() { ++ SequenceNumber ignored; ++ uint32_t ignored_seed; ++ return NewInternalIterator(ReadOptions(), &ignored, &ignored_seed); ++} ++ ++int64_t DBImpl::TEST_MaxNextLevelOverlappingBytes() { ++ MutexLock l(&mutex_); ++ return versions_->MaxNextLevelOverlappingBytes(); ++} ++ ++Status DBImpl::Get(const ReadOptions& options, ++ const Slice& key, ++ std::string* value) { ++ Status s; ++ MutexLock l(&mutex_); ++ SequenceNumber snapshot; ++ if (options.snapshot != NULL) { ++ snapshot = reinterpret_cast(options.snapshot)->number_; ++ } else { ++ snapshot = versions_->LastSequence(); ++ } ++ ++ MemTable* mem = mem_; ++ MemTable* imm = imm_; ++ Version* current = versions_->current(); ++ mem->Ref(); ++ if (imm != NULL) imm->Ref(); ++ current->Ref(); ++ ++ bool have_stat_update = false; ++ Version::GetStats stats; ++ ++ // Unlock while reading from files and memtables ++ { ++ mutex_.Unlock(); ++ // First look in the memtable, then in the immutable memtable (if any). ++ LookupKey lkey(key, snapshot); ++ if (mem->Get(lkey, value, &s)) { ++ // Done ++ } else if (imm != NULL && imm->Get(lkey, value, &s)) { ++ // Done ++ } else { ++ s = current->Get(options, lkey, value, &stats); ++ have_stat_update = true; ++ } ++ mutex_.Lock(); ++ } ++ ++ if (have_stat_update && current->UpdateStats(stats)) { ++ MaybeScheduleCompaction(); ++ } ++ mem->Unref(); ++ if (imm != NULL) imm->Unref(); ++ current->Unref(); ++ return s; ++} ++ ++Iterator* DBImpl::NewIterator(const ReadOptions& options) { ++ SequenceNumber latest_snapshot; ++ uint32_t seed; ++ Iterator* iter = NewInternalIterator(options, &latest_snapshot, &seed); ++ return NewDBIterator( ++ this, user_comparator(), iter, ++ (options.snapshot != NULL ++ ? reinterpret_cast(options.snapshot)->number_ ++ : latest_snapshot), ++ seed); ++} ++ ++void DBImpl::RecordReadSample(Slice key) { ++ MutexLock l(&mutex_); ++ if (versions_->current()->RecordReadSample(key)) { ++ MaybeScheduleCompaction(); ++ } ++} ++ ++const Snapshot* DBImpl::GetSnapshot() { ++ MutexLock l(&mutex_); ++ return snapshots_.New(versions_->LastSequence()); ++} ++ ++void DBImpl::ReleaseSnapshot(const Snapshot* s) { ++ MutexLock l(&mutex_); ++ snapshots_.Delete(reinterpret_cast(s)); ++} ++ ++// Convenience methods ++Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { ++ return DB::Put(o, key, val); ++} ++ ++Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { ++ return DB::Delete(options, key); ++} ++ ++Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) { ++ Writer w(&mutex_); ++ w.batch = my_batch; ++ w.sync = options.sync; ++ w.done = false; ++ ++ MutexLock l(&mutex_); ++ writers_.push_back(&w); ++ while (!w.done && &w != writers_.front()) { ++ w.cv.Wait(); ++ } ++ if (w.done) { ++ return w.status; ++ } ++ ++ // May temporarily unlock and wait. ++ Status status = MakeRoomForWrite(my_batch == NULL); ++ uint64_t last_sequence = versions_->LastSequence(); ++ Writer* last_writer = &w; ++ if (status.ok() && my_batch != NULL) { // NULL batch is for compactions ++ WriteBatch* updates = BuildBatchGroup(&last_writer); ++ WriteBatchInternal::SetSequence(updates, last_sequence + 1); ++ last_sequence += WriteBatchInternal::Count(updates); ++ ++ // Add to log and apply to memtable. We can release the lock ++ // during this phase since &w is currently responsible for logging ++ // and protects against concurrent loggers and concurrent writes ++ // into mem_. ++ { ++ mutex_.Unlock(); ++ status = log_->AddRecord(WriteBatchInternal::Contents(updates)); ++ bool sync_error = false; ++ if (status.ok() && options.sync) { ++ status = logfile_->Sync(); ++ if (!status.ok()) { ++ sync_error = true; ++ } ++ } ++ if (status.ok()) { ++ status = WriteBatchInternal::InsertInto(updates, mem_); ++ } ++ mutex_.Lock(); ++ if (sync_error) { ++ // The state of the log file is indeterminate: the log record we ++ // just added may or may not show up when the DB is re-opened. ++ // So we force the DB into a mode where all future writes fail. ++ RecordBackgroundError(status); ++ } ++ } ++ if (updates == tmp_batch_) tmp_batch_->Clear(); ++ ++ versions_->SetLastSequence(last_sequence); ++ } ++ ++ while (true) { ++ Writer* ready = writers_.front(); ++ writers_.pop_front(); ++ if (ready != &w) { ++ ready->status = status; ++ ready->done = true; ++ ready->cv.Signal(); ++ } ++ if (ready == last_writer) break; ++ } ++ ++ // Notify new head of write queue ++ if (!writers_.empty()) { ++ writers_.front()->cv.Signal(); ++ } ++ ++ return status; ++} ++ ++// REQUIRES: Writer list must be non-empty ++// REQUIRES: First writer must have a non-NULL batch ++WriteBatch* DBImpl::BuildBatchGroup(Writer** last_writer) { ++ assert(!writers_.empty()); ++ Writer* first = writers_.front(); ++ WriteBatch* result = first->batch; ++ assert(result != NULL); ++ ++ size_t size = WriteBatchInternal::ByteSize(first->batch); ++ ++ // Allow the group to grow up to a maximum size, but if the ++ // original write is small, limit the growth so we do not slow ++ // down the small write too much. ++ size_t max_size = 1 << 20; ++ if (size <= (128<<10)) { ++ max_size = size + (128<<10); ++ } ++ ++ *last_writer = first; ++ std::deque::iterator iter = writers_.begin(); ++ ++iter; // Advance past "first" ++ for (; iter != writers_.end(); ++iter) { ++ Writer* w = *iter; ++ if (w->sync && !first->sync) { ++ // Do not include a sync write into a batch handled by a non-sync write. ++ break; ++ } ++ ++ if (w->batch != NULL) { ++ size += WriteBatchInternal::ByteSize(w->batch); ++ if (size > max_size) { ++ // Do not make batch too big ++ break; ++ } ++ ++ // Append to *result ++ if (result == first->batch) { ++ // Switch to temporary batch instead of disturbing caller's batch ++ result = tmp_batch_; ++ assert(WriteBatchInternal::Count(result) == 0); ++ WriteBatchInternal::Append(result, first->batch); ++ } ++ WriteBatchInternal::Append(result, w->batch); ++ } ++ *last_writer = w; ++ } ++ return result; ++} ++ ++// REQUIRES: mutex_ is held ++// REQUIRES: this thread is currently at the front of the writer queue ++Status DBImpl::MakeRoomForWrite(bool force) { ++ mutex_.AssertHeld(); ++ assert(!writers_.empty()); ++ bool allow_delay = !force; ++ Status s; ++ while (true) { ++ if (!bg_error_.ok()) { ++ // Yield previous error ++ s = bg_error_; ++ break; ++ } else if ( ++ allow_delay && ++ versions_->NumLevelFiles(0) >= config::kL0_SlowdownWritesTrigger) { ++ // We are getting close to hitting a hard limit on the number of ++ // L0 files. Rather than delaying a single write by several ++ // seconds when we hit the hard limit, start delaying each ++ // individual write by 1ms to reduce latency variance. Also, ++ // this delay hands over some CPU to the compaction thread in ++ // case it is sharing the same core as the writer. ++ mutex_.Unlock(); ++ env_->SleepForMicroseconds(1000); ++ allow_delay = false; // Do not delay a single write more than once ++ mutex_.Lock(); ++ } else if (!force && ++ (mem_->ApproximateMemoryUsage() <= options_.write_buffer_size)) { ++ // There is room in current memtable ++ break; ++ } else if (imm_ != NULL) { ++ // We have filled up the current memtable, but the previous ++ // one is still being compacted, so we wait. ++ Log(options_.info_log, "Current memtable full; waiting...\n"); ++ bg_cv_.Wait(); ++ } else if (versions_->NumLevelFiles(0) >= config::kL0_StopWritesTrigger) { ++ // There are too many level-0 files. ++ Log(options_.info_log, "Too many L0 files; waiting...\n"); ++ bg_cv_.Wait(); ++ } else { ++ // Attempt to switch to a new memtable and trigger compaction of old ++ assert(versions_->PrevLogNumber() == 0); ++ uint64_t new_log_number = versions_->NewFileNumber(); ++ WritableFile* lfile = NULL; ++ s = env_->NewWritableFile(LogFileName(dbname_, new_log_number), &lfile); ++ if (!s.ok()) { ++ // Avoid chewing through file number space in a tight loop. ++ versions_->ReuseFileNumber(new_log_number); ++ break; ++ } ++ delete log_; ++ delete logfile_; ++ logfile_ = lfile; ++ logfile_number_ = new_log_number; ++ log_ = new log::Writer(lfile); ++ imm_ = mem_; ++ has_imm_.Release_Store(imm_); ++ mem_ = new MemTable(internal_comparator_); ++ mem_->Ref(); ++ force = false; // Do not force another compaction if have room ++ MaybeScheduleCompaction(); ++ } ++ } ++ return s; ++} ++ ++bool DBImpl::GetProperty(const Slice& property, std::string* value) { ++ value->clear(); ++ ++ MutexLock l(&mutex_); ++ Slice in = property; ++ Slice prefix("leveldb."); ++ if (!in.starts_with(prefix)) return false; ++ in.remove_prefix(prefix.size()); ++ ++ if (in.starts_with("num-files-at-level")) { ++ in.remove_prefix(strlen("num-files-at-level")); ++ uint64_t level; ++ bool ok = ConsumeDecimalNumber(&in, &level) && in.empty(); ++ if (!ok || level >= config::kNumLevels) { ++ return false; ++ } else { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%d", ++ versions_->NumLevelFiles(static_cast(level))); ++ *value = buf; ++ return true; ++ } ++ } else if (in == "stats") { ++ char buf[200]; ++ snprintf(buf, sizeof(buf), ++ " Compactions\n" ++ "Level Files Size(MB) Time(sec) Read(MB) Write(MB)\n" ++ "--------------------------------------------------\n" ++ ); ++ value->append(buf); ++ for (int level = 0; level < config::kNumLevels; level++) { ++ int files = versions_->NumLevelFiles(level); ++ if (stats_[level].micros > 0 || files > 0) { ++ snprintf( ++ buf, sizeof(buf), ++ "%3d %8d %8.0f %9.0f %8.0f %9.0f\n", ++ level, ++ files, ++ versions_->NumLevelBytes(level) / 1048576.0, ++ stats_[level].micros / 1e6, ++ stats_[level].bytes_read / 1048576.0, ++ stats_[level].bytes_written / 1048576.0); ++ value->append(buf); ++ } ++ } ++ return true; ++ } else if (in == "sstables") { ++ *value = versions_->current()->DebugString(); ++ return true; ++ } else if (in == "approximate-memory-usage") { ++ size_t total_usage = options_.block_cache->TotalCharge(); ++ if (mem_) { ++ total_usage += mem_->ApproximateMemoryUsage(); ++ } ++ if (imm_) { ++ total_usage += imm_->ApproximateMemoryUsage(); ++ } ++ char buf[50]; ++ snprintf(buf, sizeof(buf), "%llu", ++ static_cast(total_usage)); ++ value->append(buf); ++ return true; ++ } ++ ++ return false; ++} ++ ++void DBImpl::GetApproximateSizes( ++ const Range* range, int n, ++ uint64_t* sizes) { ++ // TODO(opt): better implementation ++ Version* v; ++ { ++ MutexLock l(&mutex_); ++ versions_->current()->Ref(); ++ v = versions_->current(); ++ } ++ ++ for (int i = 0; i < n; i++) { ++ // Convert user_key into a corresponding internal key. ++ InternalKey k1(range[i].start, kMaxSequenceNumber, kValueTypeForSeek); ++ InternalKey k2(range[i].limit, kMaxSequenceNumber, kValueTypeForSeek); ++ uint64_t start = versions_->ApproximateOffsetOf(v, k1); ++ uint64_t limit = versions_->ApproximateOffsetOf(v, k2); ++ sizes[i] = (limit >= start ? limit - start : 0); ++ } ++ ++ { ++ MutexLock l(&mutex_); ++ v->Unref(); ++ } ++} ++ ++// Default implementations of convenience methods that subclasses of DB ++// can call if they wish ++Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { ++ WriteBatch batch; ++ batch.Put(key, value); ++ return Write(opt, &batch); ++} ++ ++Status DB::Delete(const WriteOptions& opt, const Slice& key) { ++ WriteBatch batch; ++ batch.Delete(key); ++ return Write(opt, &batch); ++} ++ ++DB::~DB() { } ++ ++Status DB::Open(const Options& options, const std::string& dbname, ++ DB** dbptr) { ++ *dbptr = NULL; ++ ++ DBImpl* impl = new DBImpl(options, dbname); ++ impl->mutex_.Lock(); ++ VersionEdit edit; ++ // Recover handles create_if_missing, error_if_exists ++ bool save_manifest = false; ++ Status s = impl->Recover(&edit, &save_manifest); ++ if (s.ok() && impl->mem_ == NULL) { ++ // Create new log and a corresponding memtable. ++ uint64_t new_log_number = impl->versions_->NewFileNumber(); ++ WritableFile* lfile; ++ s = options.env->NewWritableFile(LogFileName(dbname, new_log_number), ++ &lfile); ++ if (s.ok()) { ++ edit.SetLogNumber(new_log_number); ++ impl->logfile_ = lfile; ++ impl->logfile_number_ = new_log_number; ++ impl->log_ = new log::Writer(lfile); ++ impl->mem_ = new MemTable(impl->internal_comparator_); ++ impl->mem_->Ref(); ++ } ++ } ++ if (s.ok() && save_manifest) { ++ edit.SetPrevLogNumber(0); // No older logs needed after recovery. ++ edit.SetLogNumber(impl->logfile_number_); ++ s = impl->versions_->LogAndApply(&edit, &impl->mutex_); ++ } ++ if (s.ok()) { ++ impl->DeleteObsoleteFiles(); ++ impl->MaybeScheduleCompaction(); ++ } ++ impl->mutex_.Unlock(); ++ if (s.ok()) { ++ assert(impl->mem_ != NULL); ++ *dbptr = impl; ++ } else { ++ delete impl; ++ } ++ return s; ++} ++ ++Snapshot::~Snapshot() { ++} ++ ++Status DestroyDB(const std::string& dbname, const Options& options) { ++ Env* env = options.env; ++ std::vector filenames; ++ // Ignore error in case directory does not exist ++ env->GetChildren(dbname, &filenames); ++ if (filenames.empty()) { ++ return Status::OK(); ++ } ++ ++ FileLock* lock; ++ const std::string lockname = LockFileName(dbname); ++ Status result = env->LockFile(lockname, &lock); ++ if (result.ok()) { ++ uint64_t number; ++ FileType type; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type) && ++ type != kDBLockFile) { // Lock file will be deleted at end ++ Status del = env->DeleteFile(dbname + "/" + filenames[i]); ++ if (result.ok() && !del.ok()) { ++ result = del; ++ } ++ } ++ } ++ env->UnlockFile(lock); // Ignore error since state is already gone ++ env->DeleteFile(lockname); ++ env->DeleteDir(dbname); // Ignore error in case dir contains other files ++ } ++ return result; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.h +new file mode 100644 +index 0000000..8ff323e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.h +@@ -0,0 +1,211 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_DB_IMPL_H_ ++#define STORAGE_LEVELDB_DB_DB_IMPL_H_ ++ ++#include ++#include ++#include "db/dbformat.h" ++#include "db/log_writer.h" ++#include "db/snapshot.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "port/port.h" ++#include "port/thread_annotations.h" ++ ++namespace leveldb { ++ ++class MemTable; ++class TableCache; ++class Version; ++class VersionEdit; ++class VersionSet; ++ ++class DBImpl : public DB { ++ public: ++ DBImpl(const Options& options, const std::string& dbname); ++ virtual ~DBImpl(); ++ ++ // Implementations of the DB interface ++ virtual Status Put(const WriteOptions&, const Slice& key, const Slice& value); ++ virtual Status Delete(const WriteOptions&, const Slice& key); ++ virtual Status Write(const WriteOptions& options, WriteBatch* updates); ++ virtual Status Get(const ReadOptions& options, ++ const Slice& key, ++ std::string* value); ++ virtual Iterator* NewIterator(const ReadOptions&); ++ virtual const Snapshot* GetSnapshot(); ++ virtual void ReleaseSnapshot(const Snapshot* snapshot); ++ virtual bool GetProperty(const Slice& property, std::string* value); ++ virtual void GetApproximateSizes(const Range* range, int n, uint64_t* sizes); ++ virtual void CompactRange(const Slice* begin, const Slice* end); ++ ++ // Extra methods (for testing) that are not in the public DB interface ++ ++ // Compact any files in the named level that overlap [*begin,*end] ++ void TEST_CompactRange(int level, const Slice* begin, const Slice* end); ++ ++ // Force current memtable contents to be compacted. ++ Status TEST_CompactMemTable(); ++ ++ // Return an internal iterator over the current state of the database. ++ // The keys of this iterator are internal keys (see format.h). ++ // The returned iterator should be deleted when no longer needed. ++ Iterator* TEST_NewInternalIterator(); ++ ++ // Return the maximum overlapping data (in bytes) at next level for any ++ // file at a level >= 1. ++ int64_t TEST_MaxNextLevelOverlappingBytes(); ++ ++ // Record a sample of bytes read at the specified internal key. ++ // Samples are taken approximately once every config::kReadBytesPeriod ++ // bytes. ++ void RecordReadSample(Slice key); ++ ++ private: ++ friend class DB; ++ struct CompactionState; ++ struct Writer; ++ ++ Iterator* NewInternalIterator(const ReadOptions&, ++ SequenceNumber* latest_snapshot, ++ uint32_t* seed); ++ ++ Status NewDB(); ++ ++ // Recover the descriptor from persistent storage. May do a significant ++ // amount of work to recover recently logged updates. Any changes to ++ // be made to the descriptor are added to *edit. ++ Status Recover(VersionEdit* edit, bool* save_manifest) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ void MaybeIgnoreError(Status* s) const; ++ ++ // Delete any unneeded files and stale in-memory entries. ++ void DeleteObsoleteFiles(); ++ ++ // Compact the in-memory write buffer to disk. Switches to a new ++ // log-file/memtable and writes a new descriptor iff successful. ++ // Errors are recorded in bg_error_. ++ void CompactMemTable() EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ Status RecoverLogFile(uint64_t log_number, bool last_log, bool* save_manifest, ++ VersionEdit* edit, SequenceNumber* max_sequence) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ Status WriteLevel0Table(MemTable* mem, VersionEdit* edit, Version* base) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ Status MakeRoomForWrite(bool force /* compact even if there is room? */) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ WriteBatch* BuildBatchGroup(Writer** last_writer); ++ ++ void RecordBackgroundError(const Status& s); ++ ++ void MaybeScheduleCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ static void BGWork(void* db); ++ void BackgroundCall(); ++ void BackgroundCompaction() EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ void CleanupCompaction(CompactionState* compact) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ Status DoCompactionWork(CompactionState* compact) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ Status OpenCompactionOutputFile(CompactionState* compact); ++ Status FinishCompactionOutputFile(CompactionState* compact, Iterator* input); ++ Status InstallCompactionResults(CompactionState* compact) ++ EXCLUSIVE_LOCKS_REQUIRED(mutex_); ++ ++ // Constant after construction ++ Env* const env_; ++ const InternalKeyComparator internal_comparator_; ++ const InternalFilterPolicy internal_filter_policy_; ++ const Options options_; // options_.comparator == &internal_comparator_ ++ bool owns_info_log_; ++ bool owns_cache_; ++ const std::string dbname_; ++ ++ // table_cache_ provides its own synchronization ++ TableCache* table_cache_; ++ ++ // Lock over the persistent DB state. Non-NULL iff successfully acquired. ++ FileLock* db_lock_; ++ ++ // State below is protected by mutex_ ++ port::Mutex mutex_; ++ port::AtomicPointer shutting_down_; ++ port::CondVar bg_cv_; // Signalled when background work finishes ++ MemTable* mem_; ++ MemTable* imm_; // Memtable being compacted ++ port::AtomicPointer has_imm_; // So bg thread can detect non-NULL imm_ ++ WritableFile* logfile_; ++ uint64_t logfile_number_; ++ log::Writer* log_; ++ uint32_t seed_; // For sampling. ++ ++ // Queue of writers. ++ std::deque writers_; ++ WriteBatch* tmp_batch_; ++ ++ SnapshotList snapshots_; ++ ++ // Set of table files to protect from deletion because they are ++ // part of ongoing compactions. ++ std::set pending_outputs_; ++ ++ // Has a background compaction been scheduled or is running? ++ bool bg_compaction_scheduled_; ++ ++ // Information for a manual compaction ++ struct ManualCompaction { ++ int level; ++ bool done; ++ const InternalKey* begin; // NULL means beginning of key range ++ const InternalKey* end; // NULL means end of key range ++ InternalKey tmp_storage; // Used to keep track of compaction progress ++ }; ++ ManualCompaction* manual_compaction_; ++ ++ VersionSet* versions_; ++ ++ // Have we encountered a background error in paranoid mode? ++ Status bg_error_; ++ ++ // Per level compaction stats. stats_[level] stores the stats for ++ // compactions that produced data for the specified "level". ++ struct CompactionStats { ++ int64_t micros; ++ int64_t bytes_read; ++ int64_t bytes_written; ++ ++ CompactionStats() : micros(0), bytes_read(0), bytes_written(0) { } ++ ++ void Add(const CompactionStats& c) { ++ this->micros += c.micros; ++ this->bytes_read += c.bytes_read; ++ this->bytes_written += c.bytes_written; ++ } ++ }; ++ CompactionStats stats_[config::kNumLevels]; ++ ++ // No copying allowed ++ DBImpl(const DBImpl&); ++ void operator=(const DBImpl&); ++ ++ const Comparator* user_comparator() const { ++ return internal_comparator_.user_comparator(); ++ } ++}; ++ ++// Sanitize db options. The caller should delete result.info_log if ++// it is not equal to src.info_log. ++extern Options SanitizeOptions(const std::string& db, ++ const InternalKeyComparator* icmp, ++ const InternalFilterPolicy* ipolicy, ++ const Options& src); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_DB_IMPL_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.cc +new file mode 100644 +index 0000000..3b2035e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.cc +@@ -0,0 +1,317 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/db_iter.h" ++ ++#include "db/filename.h" ++#include "db/db_impl.h" ++#include "db/dbformat.h" ++#include "leveldb/env.h" ++#include "leveldb/iterator.h" ++#include "port/port.h" ++#include "util/logging.h" ++#include "util/mutexlock.h" ++#include "util/random.h" ++ ++namespace leveldb { ++ ++#if 0 ++static void DumpInternalIter(Iterator* iter) { ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ ParsedInternalKey k; ++ if (!ParseInternalKey(iter->key(), &k)) { ++ fprintf(stderr, "Corrupt '%s'\n", EscapeString(iter->key()).c_str()); ++ } else { ++ fprintf(stderr, "@ '%s'\n", k.DebugString().c_str()); ++ } ++ } ++} ++#endif ++ ++namespace { ++ ++// Memtables and sstables that make the DB representation contain ++// (userkey,seq,type) => uservalue entries. DBIter ++// combines multiple entries for the same userkey found in the DB ++// representation into a single entry while accounting for sequence ++// numbers, deletion markers, overwrites, etc. ++class DBIter: public Iterator { ++ public: ++ // Which direction is the iterator currently moving? ++ // (1) When moving forward, the internal iterator is positioned at ++ // the exact entry that yields this->key(), this->value() ++ // (2) When moving backwards, the internal iterator is positioned ++ // just before all entries whose user key == this->key(). ++ enum Direction { ++ kForward, ++ kReverse ++ }; ++ ++ DBIter(DBImpl* db, const Comparator* cmp, Iterator* iter, SequenceNumber s, ++ uint32_t seed) ++ : db_(db), ++ user_comparator_(cmp), ++ iter_(iter), ++ sequence_(s), ++ direction_(kForward), ++ valid_(false), ++ rnd_(seed), ++ bytes_counter_(RandomPeriod()) { ++ } ++ virtual ~DBIter() { ++ delete iter_; ++ } ++ virtual bool Valid() const { return valid_; } ++ virtual Slice key() const { ++ assert(valid_); ++ return (direction_ == kForward) ? ExtractUserKey(iter_->key()) : saved_key_; ++ } ++ virtual Slice value() const { ++ assert(valid_); ++ return (direction_ == kForward) ? iter_->value() : saved_value_; ++ } ++ virtual Status status() const { ++ if (status_.ok()) { ++ return iter_->status(); ++ } else { ++ return status_; ++ } ++ } ++ ++ virtual void Next(); ++ virtual void Prev(); ++ virtual void Seek(const Slice& target); ++ virtual void SeekToFirst(); ++ virtual void SeekToLast(); ++ ++ private: ++ void FindNextUserEntry(bool skipping, std::string* skip); ++ void FindPrevUserEntry(); ++ bool ParseKey(ParsedInternalKey* key); ++ ++ inline void SaveKey(const Slice& k, std::string* dst) { ++ dst->assign(k.data(), k.size()); ++ } ++ ++ inline void ClearSavedValue() { ++ if (saved_value_.capacity() > 1048576) { ++ std::string empty; ++ swap(empty, saved_value_); ++ } else { ++ saved_value_.clear(); ++ } ++ } ++ ++ // Pick next gap with average value of config::kReadBytesPeriod. ++ ssize_t RandomPeriod() { ++ return rnd_.Uniform(2*config::kReadBytesPeriod); ++ } ++ ++ DBImpl* db_; ++ const Comparator* const user_comparator_; ++ Iterator* const iter_; ++ SequenceNumber const sequence_; ++ ++ Status status_; ++ std::string saved_key_; // == current key when direction_==kReverse ++ std::string saved_value_; // == current raw value when direction_==kReverse ++ Direction direction_; ++ bool valid_; ++ ++ Random rnd_; ++ ssize_t bytes_counter_; ++ ++ // No copying allowed ++ DBIter(const DBIter&); ++ void operator=(const DBIter&); ++}; ++ ++inline bool DBIter::ParseKey(ParsedInternalKey* ikey) { ++ Slice k = iter_->key(); ++ ssize_t n = k.size() + iter_->value().size(); ++ bytes_counter_ -= n; ++ while (bytes_counter_ < 0) { ++ bytes_counter_ += RandomPeriod(); ++ db_->RecordReadSample(k); ++ } ++ if (!ParseInternalKey(k, ikey)) { ++ status_ = Status::Corruption("corrupted internal key in DBIter"); ++ return false; ++ } else { ++ return true; ++ } ++} ++ ++void DBIter::Next() { ++ assert(valid_); ++ ++ if (direction_ == kReverse) { // Switch directions? ++ direction_ = kForward; ++ // iter_ is pointing just before the entries for this->key(), ++ // so advance into the range of entries for this->key() and then ++ // use the normal skipping code below. ++ if (!iter_->Valid()) { ++ iter_->SeekToFirst(); ++ } else { ++ iter_->Next(); ++ } ++ if (!iter_->Valid()) { ++ valid_ = false; ++ saved_key_.clear(); ++ return; ++ } ++ // saved_key_ already contains the key to skip past. ++ } else { ++ // Store in saved_key_ the current key so we skip it below. ++ SaveKey(ExtractUserKey(iter_->key()), &saved_key_); ++ } ++ ++ FindNextUserEntry(true, &saved_key_); ++} ++ ++void DBIter::FindNextUserEntry(bool skipping, std::string* skip) { ++ // Loop until we hit an acceptable entry to yield ++ assert(iter_->Valid()); ++ assert(direction_ == kForward); ++ do { ++ ParsedInternalKey ikey; ++ if (ParseKey(&ikey) && ikey.sequence <= sequence_) { ++ switch (ikey.type) { ++ case kTypeDeletion: ++ // Arrange to skip all upcoming entries for this key since ++ // they are hidden by this deletion. ++ SaveKey(ikey.user_key, skip); ++ skipping = true; ++ break; ++ case kTypeValue: ++ if (skipping && ++ user_comparator_->Compare(ikey.user_key, *skip) <= 0) { ++ // Entry hidden ++ } else { ++ valid_ = true; ++ saved_key_.clear(); ++ return; ++ } ++ break; ++ } ++ } ++ iter_->Next(); ++ } while (iter_->Valid()); ++ saved_key_.clear(); ++ valid_ = false; ++} ++ ++void DBIter::Prev() { ++ assert(valid_); ++ ++ if (direction_ == kForward) { // Switch directions? ++ // iter_ is pointing at the current entry. Scan backwards until ++ // the key changes so we can use the normal reverse scanning code. ++ assert(iter_->Valid()); // Otherwise valid_ would have been false ++ SaveKey(ExtractUserKey(iter_->key()), &saved_key_); ++ while (true) { ++ iter_->Prev(); ++ if (!iter_->Valid()) { ++ valid_ = false; ++ saved_key_.clear(); ++ ClearSavedValue(); ++ return; ++ } ++ if (user_comparator_->Compare(ExtractUserKey(iter_->key()), ++ saved_key_) < 0) { ++ break; ++ } ++ } ++ direction_ = kReverse; ++ } ++ ++ FindPrevUserEntry(); ++} ++ ++void DBIter::FindPrevUserEntry() { ++ assert(direction_ == kReverse); ++ ++ ValueType value_type = kTypeDeletion; ++ if (iter_->Valid()) { ++ do { ++ ParsedInternalKey ikey; ++ if (ParseKey(&ikey) && ikey.sequence <= sequence_) { ++ if ((value_type != kTypeDeletion) && ++ user_comparator_->Compare(ikey.user_key, saved_key_) < 0) { ++ // We encountered a non-deleted value in entries for previous keys, ++ break; ++ } ++ value_type = ikey.type; ++ if (value_type == kTypeDeletion) { ++ saved_key_.clear(); ++ ClearSavedValue(); ++ } else { ++ Slice raw_value = iter_->value(); ++ if (saved_value_.capacity() > raw_value.size() + 1048576) { ++ std::string empty; ++ swap(empty, saved_value_); ++ } ++ SaveKey(ExtractUserKey(iter_->key()), &saved_key_); ++ saved_value_.assign(raw_value.data(), raw_value.size()); ++ } ++ } ++ iter_->Prev(); ++ } while (iter_->Valid()); ++ } ++ ++ if (value_type == kTypeDeletion) { ++ // End ++ valid_ = false; ++ saved_key_.clear(); ++ ClearSavedValue(); ++ direction_ = kForward; ++ } else { ++ valid_ = true; ++ } ++} ++ ++void DBIter::Seek(const Slice& target) { ++ direction_ = kForward; ++ ClearSavedValue(); ++ saved_key_.clear(); ++ AppendInternalKey( ++ &saved_key_, ParsedInternalKey(target, sequence_, kValueTypeForSeek)); ++ iter_->Seek(saved_key_); ++ if (iter_->Valid()) { ++ FindNextUserEntry(false, &saved_key_ /* temporary storage */); ++ } else { ++ valid_ = false; ++ } ++} ++ ++void DBIter::SeekToFirst() { ++ direction_ = kForward; ++ ClearSavedValue(); ++ iter_->SeekToFirst(); ++ if (iter_->Valid()) { ++ FindNextUserEntry(false, &saved_key_ /* temporary storage */); ++ } else { ++ valid_ = false; ++ } ++} ++ ++void DBIter::SeekToLast() { ++ direction_ = kReverse; ++ ClearSavedValue(); ++ iter_->SeekToLast(); ++ FindPrevUserEntry(); ++} ++ ++} // anonymous namespace ++ ++Iterator* NewDBIterator( ++ DBImpl* db, ++ const Comparator* user_key_comparator, ++ Iterator* internal_iter, ++ SequenceNumber sequence, ++ uint32_t seed) { ++ return new DBIter(db, user_key_comparator, internal_iter, sequence, seed); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.h +new file mode 100644 +index 0000000..04927e9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.h +@@ -0,0 +1,28 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_DB_ITER_H_ ++#define STORAGE_LEVELDB_DB_DB_ITER_H_ ++ ++#include ++#include "leveldb/db.h" ++#include "db/dbformat.h" ++ ++namespace leveldb { ++ ++class DBImpl; ++ ++// Return a new iterator that converts internal keys (yielded by ++// "*internal_iter") that were live at the specified "sequence" number ++// into appropriate user keys. ++extern Iterator* NewDBIterator( ++ DBImpl* db, ++ const Comparator* user_key_comparator, ++ Iterator* internal_iter, ++ SequenceNumber sequence, ++ uint32_t seed); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_DB_ITER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_test.cc +new file mode 100644 +index 0000000..a0b08bc +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_test.cc +@@ -0,0 +1,2158 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/db.h" ++#include "leveldb/filter_policy.h" ++#include "db/db_impl.h" ++#include "db/filename.h" ++#include "db/version_set.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/cache.h" ++#include "leveldb/env.h" ++#include "leveldb/table.h" ++#include "util/hash.h" ++#include "util/logging.h" ++#include "util/mutexlock.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++static std::string RandomString(Random* rnd, int len) { ++ std::string r; ++ test::RandomString(rnd, len, &r); ++ return r; ++} ++ ++namespace { ++class AtomicCounter { ++ private: ++ port::Mutex mu_; ++ int count_; ++ public: ++ AtomicCounter() : count_(0) { } ++ void Increment() { ++ IncrementBy(1); ++ } ++ void IncrementBy(int count) { ++ MutexLock l(&mu_); ++ count_ += count; ++ } ++ int Read() { ++ MutexLock l(&mu_); ++ return count_; ++ } ++ void Reset() { ++ MutexLock l(&mu_); ++ count_ = 0; ++ } ++}; ++ ++void DelayMilliseconds(int millis) { ++ Env::Default()->SleepForMicroseconds(millis * 1000); ++} ++} ++ ++// Special Env used to delay background operations ++class SpecialEnv : public EnvWrapper { ++ public: ++ // sstable/log Sync() calls are blocked while this pointer is non-NULL. ++ port::AtomicPointer delay_data_sync_; ++ ++ // sstable/log Sync() calls return an error. ++ port::AtomicPointer data_sync_error_; ++ ++ // Simulate no-space errors while this pointer is non-NULL. ++ port::AtomicPointer no_space_; ++ ++ // Simulate non-writable file system while this pointer is non-NULL ++ port::AtomicPointer non_writable_; ++ ++ // Force sync of manifest files to fail while this pointer is non-NULL ++ port::AtomicPointer manifest_sync_error_; ++ ++ // Force write to manifest files to fail while this pointer is non-NULL ++ port::AtomicPointer manifest_write_error_; ++ ++ bool count_random_reads_; ++ AtomicCounter random_read_counter_; ++ ++ explicit SpecialEnv(Env* base) : EnvWrapper(base) { ++ delay_data_sync_.Release_Store(NULL); ++ data_sync_error_.Release_Store(NULL); ++ no_space_.Release_Store(NULL); ++ non_writable_.Release_Store(NULL); ++ count_random_reads_ = false; ++ manifest_sync_error_.Release_Store(NULL); ++ manifest_write_error_.Release_Store(NULL); ++ } ++ ++ Status NewWritableFile(const std::string& f, WritableFile** r) { ++ class DataFile : public WritableFile { ++ private: ++ SpecialEnv* env_; ++ WritableFile* base_; ++ ++ public: ++ DataFile(SpecialEnv* env, WritableFile* base) ++ : env_(env), ++ base_(base) { ++ } ++ ~DataFile() { delete base_; } ++ Status Append(const Slice& data) { ++ if (env_->no_space_.Acquire_Load() != NULL) { ++ // Drop writes on the floor ++ return Status::OK(); ++ } else { ++ return base_->Append(data); ++ } ++ } ++ Status Close() { return base_->Close(); } ++ Status Flush() { return base_->Flush(); } ++ Status Sync() { ++ if (env_->data_sync_error_.Acquire_Load() != NULL) { ++ return Status::IOError("simulated data sync error"); ++ } ++ while (env_->delay_data_sync_.Acquire_Load() != NULL) { ++ DelayMilliseconds(100); ++ } ++ return base_->Sync(); ++ } ++ }; ++ class ManifestFile : public WritableFile { ++ private: ++ SpecialEnv* env_; ++ WritableFile* base_; ++ public: ++ ManifestFile(SpecialEnv* env, WritableFile* b) : env_(env), base_(b) { } ++ ~ManifestFile() { delete base_; } ++ Status Append(const Slice& data) { ++ if (env_->manifest_write_error_.Acquire_Load() != NULL) { ++ return Status::IOError("simulated writer error"); ++ } else { ++ return base_->Append(data); ++ } ++ } ++ Status Close() { return base_->Close(); } ++ Status Flush() { return base_->Flush(); } ++ Status Sync() { ++ if (env_->manifest_sync_error_.Acquire_Load() != NULL) { ++ return Status::IOError("simulated sync error"); ++ } else { ++ return base_->Sync(); ++ } ++ } ++ }; ++ ++ if (non_writable_.Acquire_Load() != NULL) { ++ return Status::IOError("simulated write error"); ++ } ++ ++ Status s = target()->NewWritableFile(f, r); ++ if (s.ok()) { ++ if (strstr(f.c_str(), ".ldb") != NULL || ++ strstr(f.c_str(), ".log") != NULL) { ++ *r = new DataFile(this, *r); ++ } else if (strstr(f.c_str(), "MANIFEST") != NULL) { ++ *r = new ManifestFile(this, *r); ++ } ++ } ++ return s; ++ } ++ ++ Status NewRandomAccessFile(const std::string& f, RandomAccessFile** r) { ++ class CountingFile : public RandomAccessFile { ++ private: ++ RandomAccessFile* target_; ++ AtomicCounter* counter_; ++ public: ++ CountingFile(RandomAccessFile* target, AtomicCounter* counter) ++ : target_(target), counter_(counter) { ++ } ++ virtual ~CountingFile() { delete target_; } ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ counter_->Increment(); ++ return target_->Read(offset, n, result, scratch); ++ } ++ }; ++ ++ Status s = target()->NewRandomAccessFile(f, r); ++ if (s.ok() && count_random_reads_) { ++ *r = new CountingFile(*r, &random_read_counter_); ++ } ++ return s; ++ } ++}; ++ ++class DBTest { ++ private: ++ const FilterPolicy* filter_policy_; ++ ++ // Sequence of option configurations to try ++ enum OptionConfig { ++ kDefault, ++ kReuse, ++ kFilter, ++ kUncompressed, ++ kEnd ++ }; ++ int option_config_; ++ ++ public: ++ std::string dbname_; ++ SpecialEnv* env_; ++ DB* db_; ++ ++ Options last_options_; ++ ++ DBTest() : option_config_(kDefault), ++ env_(new SpecialEnv(Env::Default())) { ++ filter_policy_ = NewBloomFilterPolicy(10); ++ dbname_ = test::TmpDir() + "/db_test"; ++ DestroyDB(dbname_, Options()); ++ db_ = NULL; ++ Reopen(); ++ } ++ ++ ~DBTest() { ++ delete db_; ++ DestroyDB(dbname_, Options()); ++ delete env_; ++ delete filter_policy_; ++ } ++ ++ // Switch to a fresh database with the next option configuration to ++ // test. Return false if there are no more configurations to test. ++ bool ChangeOptions() { ++ option_config_++; ++ if (option_config_ >= kEnd) { ++ return false; ++ } else { ++ DestroyAndReopen(); ++ return true; ++ } ++ } ++ ++ // Return the current option configuration. ++ Options CurrentOptions() { ++ Options options; ++ options.reuse_logs = false; ++ switch (option_config_) { ++ case kReuse: ++ options.reuse_logs = true; ++ break; ++ case kFilter: ++ options.filter_policy = filter_policy_; ++ break; ++ case kUncompressed: ++ options.compression = kNoCompression; ++ break; ++ default: ++ break; ++ } ++ return options; ++ } ++ ++ DBImpl* dbfull() { ++ return reinterpret_cast(db_); ++ } ++ ++ void Reopen(Options* options = NULL) { ++ ASSERT_OK(TryReopen(options)); ++ } ++ ++ void Close() { ++ delete db_; ++ db_ = NULL; ++ } ++ ++ void DestroyAndReopen(Options* options = NULL) { ++ delete db_; ++ db_ = NULL; ++ DestroyDB(dbname_, Options()); ++ ASSERT_OK(TryReopen(options)); ++ } ++ ++ Status TryReopen(Options* options) { ++ delete db_; ++ db_ = NULL; ++ Options opts; ++ if (options != NULL) { ++ opts = *options; ++ } else { ++ opts = CurrentOptions(); ++ opts.create_if_missing = true; ++ } ++ last_options_ = opts; ++ ++ return DB::Open(opts, dbname_, &db_); ++ } ++ ++ Status Put(const std::string& k, const std::string& v) { ++ return db_->Put(WriteOptions(), k, v); ++ } ++ ++ Status Delete(const std::string& k) { ++ return db_->Delete(WriteOptions(), k); ++ } ++ ++ std::string Get(const std::string& k, const Snapshot* snapshot = NULL) { ++ ReadOptions options; ++ options.snapshot = snapshot; ++ std::string result; ++ Status s = db_->Get(options, k, &result); ++ if (s.IsNotFound()) { ++ result = "NOT_FOUND"; ++ } else if (!s.ok()) { ++ result = s.ToString(); ++ } ++ return result; ++ } ++ ++ // Return a string that contains all key,value pairs in order, ++ // formatted like "(k1->v1)(k2->v2)". ++ std::string Contents() { ++ std::vector forward; ++ std::string result; ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ std::string s = IterStatus(iter); ++ result.push_back('('); ++ result.append(s); ++ result.push_back(')'); ++ forward.push_back(s); ++ } ++ ++ // Check reverse iteration results are the reverse of forward results ++ size_t matched = 0; ++ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) { ++ ASSERT_LT(matched, forward.size()); ++ ASSERT_EQ(IterStatus(iter), forward[forward.size() - matched - 1]); ++ matched++; ++ } ++ ASSERT_EQ(matched, forward.size()); ++ ++ delete iter; ++ return result; ++ } ++ ++ std::string AllEntriesFor(const Slice& user_key) { ++ Iterator* iter = dbfull()->TEST_NewInternalIterator(); ++ InternalKey target(user_key, kMaxSequenceNumber, kTypeValue); ++ iter->Seek(target.Encode()); ++ std::string result; ++ if (!iter->status().ok()) { ++ result = iter->status().ToString(); ++ } else { ++ result = "[ "; ++ bool first = true; ++ while (iter->Valid()) { ++ ParsedInternalKey ikey; ++ if (!ParseInternalKey(iter->key(), &ikey)) { ++ result += "CORRUPTED"; ++ } else { ++ if (last_options_.comparator->Compare(ikey.user_key, user_key) != 0) { ++ break; ++ } ++ if (!first) { ++ result += ", "; ++ } ++ first = false; ++ switch (ikey.type) { ++ case kTypeValue: ++ result += iter->value().ToString(); ++ break; ++ case kTypeDeletion: ++ result += "DEL"; ++ break; ++ } ++ } ++ iter->Next(); ++ } ++ if (!first) { ++ result += " "; ++ } ++ result += "]"; ++ } ++ delete iter; ++ return result; ++ } ++ ++ int NumTableFilesAtLevel(int level) { ++ std::string property; ++ ASSERT_TRUE( ++ db_->GetProperty("leveldb.num-files-at-level" + NumberToString(level), ++ &property)); ++ return atoi(property.c_str()); ++ } ++ ++ int TotalTableFiles() { ++ int result = 0; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ result += NumTableFilesAtLevel(level); ++ } ++ return result; ++ } ++ ++ // Return spread of files per level ++ std::string FilesPerLevel() { ++ std::string result; ++ int last_non_zero_offset = 0; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ int f = NumTableFilesAtLevel(level); ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%s%d", (level ? "," : ""), f); ++ result += buf; ++ if (f > 0) { ++ last_non_zero_offset = result.size(); ++ } ++ } ++ result.resize(last_non_zero_offset); ++ return result; ++ } ++ ++ int CountFiles() { ++ std::vector files; ++ env_->GetChildren(dbname_, &files); ++ return static_cast(files.size()); ++ } ++ ++ uint64_t Size(const Slice& start, const Slice& limit) { ++ Range r(start, limit); ++ uint64_t size; ++ db_->GetApproximateSizes(&r, 1, &size); ++ return size; ++ } ++ ++ void Compact(const Slice& start, const Slice& limit) { ++ db_->CompactRange(&start, &limit); ++ } ++ ++ // Do n memtable compactions, each of which produces an sstable ++ // covering the range [small,large]. ++ void MakeTables(int n, const std::string& small, const std::string& large) { ++ for (int i = 0; i < n; i++) { ++ Put(small, "begin"); ++ Put(large, "end"); ++ dbfull()->TEST_CompactMemTable(); ++ } ++ } ++ ++ // Prevent pushing of new sstables into deeper levels by adding ++ // tables that cover a specified range to all levels. ++ void FillLevels(const std::string& smallest, const std::string& largest) { ++ MakeTables(config::kNumLevels, smallest, largest); ++ } ++ ++ void DumpFileCounts(const char* label) { ++ fprintf(stderr, "---\n%s:\n", label); ++ fprintf(stderr, "maxoverlap: %lld\n", ++ static_cast( ++ dbfull()->TEST_MaxNextLevelOverlappingBytes())); ++ for (int level = 0; level < config::kNumLevels; level++) { ++ int num = NumTableFilesAtLevel(level); ++ if (num > 0) { ++ fprintf(stderr, " level %3d : %d files\n", level, num); ++ } ++ } ++ } ++ ++ std::string DumpSSTableList() { ++ std::string property; ++ db_->GetProperty("leveldb.sstables", &property); ++ return property; ++ } ++ ++ std::string IterStatus(Iterator* iter) { ++ std::string result; ++ if (iter->Valid()) { ++ result = iter->key().ToString() + "->" + iter->value().ToString(); ++ } else { ++ result = "(invalid)"; ++ } ++ return result; ++ } ++ ++ bool DeleteAnSSTFile() { ++ std::vector filenames; ++ ASSERT_OK(env_->GetChildren(dbname_, &filenames)); ++ uint64_t number; ++ FileType type; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type) && type == kTableFile) { ++ ASSERT_OK(env_->DeleteFile(TableFileName(dbname_, number))); ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ // Returns number of files renamed. ++ int RenameLDBToSST() { ++ std::vector filenames; ++ ASSERT_OK(env_->GetChildren(dbname_, &filenames)); ++ uint64_t number; ++ FileType type; ++ int files_renamed = 0; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type) && type == kTableFile) { ++ const std::string from = TableFileName(dbname_, number); ++ const std::string to = SSTTableFileName(dbname_, number); ++ ASSERT_OK(env_->RenameFile(from, to)); ++ files_renamed++; ++ } ++ } ++ return files_renamed; ++ } ++}; ++ ++TEST(DBTest, Empty) { ++ do { ++ ASSERT_TRUE(db_ != NULL); ++ ASSERT_EQ("NOT_FOUND", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, ReadWrite) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ ASSERT_EQ("v1", Get("foo")); ++ ASSERT_OK(Put("bar", "v2")); ++ ASSERT_OK(Put("foo", "v3")); ++ ASSERT_EQ("v3", Get("foo")); ++ ASSERT_EQ("v2", Get("bar")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, PutDeleteGet) { ++ do { ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v1")); ++ ASSERT_EQ("v1", Get("foo")); ++ ASSERT_OK(db_->Put(WriteOptions(), "foo", "v2")); ++ ASSERT_EQ("v2", Get("foo")); ++ ASSERT_OK(db_->Delete(WriteOptions(), "foo")); ++ ASSERT_EQ("NOT_FOUND", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetFromImmutableLayer) { ++ do { ++ Options options = CurrentOptions(); ++ options.env = env_; ++ options.write_buffer_size = 100000; // Small write buffer ++ Reopen(&options); ++ ++ ASSERT_OK(Put("foo", "v1")); ++ ASSERT_EQ("v1", Get("foo")); ++ ++ env_->delay_data_sync_.Release_Store(env_); // Block sync calls ++ Put("k1", std::string(100000, 'x')); // Fill memtable ++ Put("k2", std::string(100000, 'y')); // Trigger compaction ++ ASSERT_EQ("v1", Get("foo")); ++ env_->delay_data_sync_.Release_Store(NULL); // Release sync calls ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetFromVersions) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("v1", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetMemUsage) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ std::string val; ++ ASSERT_TRUE(db_->GetProperty("leveldb.approximate-memory-usage", &val)); ++ int mem_usage = atoi(val.c_str()); ++ ASSERT_GT(mem_usage, 0); ++ ASSERT_LT(mem_usage, 5*1024*1024); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetSnapshot) { ++ do { ++ // Try with both a short key and a long key ++ for (int i = 0; i < 2; i++) { ++ std::string key = (i == 0) ? std::string("foo") : std::string(200, 'x'); ++ ASSERT_OK(Put(key, "v1")); ++ const Snapshot* s1 = db_->GetSnapshot(); ++ ASSERT_OK(Put(key, "v2")); ++ ASSERT_EQ("v2", Get(key)); ++ ASSERT_EQ("v1", Get(key, s1)); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("v2", Get(key)); ++ ASSERT_EQ("v1", Get(key, s1)); ++ db_->ReleaseSnapshot(s1); ++ } ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetLevel0Ordering) { ++ do { ++ // Check that we process level-0 files in correct order. The code ++ // below generates two level-0 files where the earlier one comes ++ // before the later one in the level-0 file list since the earlier ++ // one has a smaller "smallest" key. ++ ASSERT_OK(Put("bar", "b")); ++ ASSERT_OK(Put("foo", "v1")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_OK(Put("foo", "v2")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("v2", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetOrderedByLevels) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ Compact("a", "z"); ++ ASSERT_EQ("v1", Get("foo")); ++ ASSERT_OK(Put("foo", "v2")); ++ ASSERT_EQ("v2", Get("foo")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("v2", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetPicksCorrectFile) { ++ do { ++ // Arrange to have multiple files in a non-level-0 level. ++ ASSERT_OK(Put("a", "va")); ++ Compact("a", "b"); ++ ASSERT_OK(Put("x", "vx")); ++ Compact("x", "y"); ++ ASSERT_OK(Put("f", "vf")); ++ Compact("f", "g"); ++ ASSERT_EQ("va", Get("a")); ++ ASSERT_EQ("vf", Get("f")); ++ ASSERT_EQ("vx", Get("x")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, GetEncountersEmptyLevel) { ++ do { ++ // Arrange for the following to happen: ++ // * sstable A in level 0 ++ // * nothing in level 1 ++ // * sstable B in level 2 ++ // Then do enough Get() calls to arrange for an automatic compaction ++ // of sstable A. A bug would cause the compaction to be marked as ++ // occurring at level 1 (instead of the correct level 0). ++ ++ // Step 1: First place sstables in levels 0 and 2 ++ int compaction_count = 0; ++ while (NumTableFilesAtLevel(0) == 0 || ++ NumTableFilesAtLevel(2) == 0) { ++ ASSERT_LE(compaction_count, 100) << "could not fill levels 0 and 2"; ++ compaction_count++; ++ Put("a", "begin"); ++ Put("z", "end"); ++ dbfull()->TEST_CompactMemTable(); ++ } ++ ++ // Step 2: clear level 1 if necessary. ++ dbfull()->TEST_CompactRange(1, NULL, NULL); ++ ASSERT_EQ(NumTableFilesAtLevel(0), 1); ++ ASSERT_EQ(NumTableFilesAtLevel(1), 0); ++ ASSERT_EQ(NumTableFilesAtLevel(2), 1); ++ ++ // Step 3: read a bunch of times ++ for (int i = 0; i < 1000; i++) { ++ ASSERT_EQ("NOT_FOUND", Get("missing")); ++ } ++ ++ // Step 4: Wait for compaction to finish ++ DelayMilliseconds(1000); ++ ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, IterEmpty) { ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->Seek("foo"); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ delete iter; ++} ++ ++TEST(DBTest, IterSingle) { ++ ASSERT_OK(Put("a", "va")); ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->Seek(""); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->Seek("a"); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->Seek("b"); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ delete iter; ++} ++ ++TEST(DBTest, IterMulti) { ++ ASSERT_OK(Put("a", "va")); ++ ASSERT_OK(Put("b", "vb")); ++ ASSERT_OK(Put("c", "vc")); ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->Seek(""); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Seek("a"); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Seek("ax"); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Seek("b"); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Seek("z"); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ // Switch from reverse to forward ++ iter->SeekToLast(); ++ iter->Prev(); ++ iter->Prev(); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ ++ // Switch from forward to reverse ++ iter->SeekToFirst(); ++ iter->Next(); ++ iter->Next(); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ ++ // Make sure iter stays at snapshot ++ ASSERT_OK(Put("a", "va2")); ++ ASSERT_OK(Put("a2", "va3")); ++ ASSERT_OK(Put("b", "vb2")); ++ ASSERT_OK(Put("c", "vc2")); ++ ASSERT_OK(Delete("b")); ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "b->vb"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ delete iter; ++} ++ ++TEST(DBTest, IterSmallAndLargeMix) { ++ ASSERT_OK(Put("a", "va")); ++ ASSERT_OK(Put("b", std::string(100000, 'b'))); ++ ASSERT_OK(Put("c", "vc")); ++ ASSERT_OK(Put("d", std::string(100000, 'd'))); ++ ASSERT_OK(Put("e", std::string(100000, 'e'))); ++ ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ ++ iter->SeekToFirst(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b')); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd')); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e')); ++ iter->Next(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ iter->SeekToLast(); ++ ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e')); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd')); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b')); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "(invalid)"); ++ ++ delete iter; ++} ++ ++TEST(DBTest, IterMultiWithDelete) { ++ do { ++ ASSERT_OK(Put("a", "va")); ++ ASSERT_OK(Put("b", "vb")); ++ ASSERT_OK(Put("c", "vc")); ++ ASSERT_OK(Delete("b")); ++ ASSERT_EQ("NOT_FOUND", Get("b")); ++ ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ iter->Seek("c"); ++ ASSERT_EQ(IterStatus(iter), "c->vc"); ++ iter->Prev(); ++ ASSERT_EQ(IterStatus(iter), "a->va"); ++ delete iter; ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, Recover) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ ASSERT_OK(Put("baz", "v5")); ++ ++ Reopen(); ++ ASSERT_EQ("v1", Get("foo")); ++ ++ ASSERT_EQ("v1", Get("foo")); ++ ASSERT_EQ("v5", Get("baz")); ++ ASSERT_OK(Put("bar", "v2")); ++ ASSERT_OK(Put("foo", "v3")); ++ ++ Reopen(); ++ ASSERT_EQ("v3", Get("foo")); ++ ASSERT_OK(Put("foo", "v4")); ++ ASSERT_EQ("v4", Get("foo")); ++ ASSERT_EQ("v2", Get("bar")); ++ ASSERT_EQ("v5", Get("baz")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, RecoveryWithEmptyLog) { ++ do { ++ ASSERT_OK(Put("foo", "v1")); ++ ASSERT_OK(Put("foo", "v2")); ++ Reopen(); ++ Reopen(); ++ ASSERT_OK(Put("foo", "v3")); ++ Reopen(); ++ ASSERT_EQ("v3", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++// Check that writes done during a memtable compaction are recovered ++// if the database is shutdown during the memtable compaction. ++TEST(DBTest, RecoverDuringMemtableCompaction) { ++ do { ++ Options options = CurrentOptions(); ++ options.env = env_; ++ options.write_buffer_size = 1000000; ++ Reopen(&options); ++ ++ // Trigger a long memtable compaction and reopen the database during it ++ ASSERT_OK(Put("foo", "v1")); // Goes to 1st log file ++ ASSERT_OK(Put("big1", std::string(10000000, 'x'))); // Fills memtable ++ ASSERT_OK(Put("big2", std::string(1000, 'y'))); // Triggers compaction ++ ASSERT_OK(Put("bar", "v2")); // Goes to new log file ++ ++ Reopen(&options); ++ ASSERT_EQ("v1", Get("foo")); ++ ASSERT_EQ("v2", Get("bar")); ++ ASSERT_EQ(std::string(10000000, 'x'), Get("big1")); ++ ASSERT_EQ(std::string(1000, 'y'), Get("big2")); ++ } while (ChangeOptions()); ++} ++ ++static std::string Key(int i) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "key%06d", i); ++ return std::string(buf); ++} ++ ++TEST(DBTest, MinorCompactionsHappen) { ++ Options options = CurrentOptions(); ++ options.write_buffer_size = 10000; ++ Reopen(&options); ++ ++ const int N = 500; ++ ++ int starting_num_tables = TotalTableFiles(); ++ for (int i = 0; i < N; i++) { ++ ASSERT_OK(Put(Key(i), Key(i) + std::string(1000, 'v'))); ++ } ++ int ending_num_tables = TotalTableFiles(); ++ ASSERT_GT(ending_num_tables, starting_num_tables); ++ ++ for (int i = 0; i < N; i++) { ++ ASSERT_EQ(Key(i) + std::string(1000, 'v'), Get(Key(i))); ++ } ++ ++ Reopen(); ++ ++ for (int i = 0; i < N; i++) { ++ ASSERT_EQ(Key(i) + std::string(1000, 'v'), Get(Key(i))); ++ } ++} ++ ++TEST(DBTest, RecoverWithLargeLog) { ++ { ++ Options options = CurrentOptions(); ++ Reopen(&options); ++ ASSERT_OK(Put("big1", std::string(200000, '1'))); ++ ASSERT_OK(Put("big2", std::string(200000, '2'))); ++ ASSERT_OK(Put("small3", std::string(10, '3'))); ++ ASSERT_OK(Put("small4", std::string(10, '4'))); ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ } ++ ++ // Make sure that if we re-open with a small write buffer size that ++ // we flush table files in the middle of a large log file. ++ Options options = CurrentOptions(); ++ options.write_buffer_size = 100000; ++ Reopen(&options); ++ ASSERT_EQ(NumTableFilesAtLevel(0), 3); ++ ASSERT_EQ(std::string(200000, '1'), Get("big1")); ++ ASSERT_EQ(std::string(200000, '2'), Get("big2")); ++ ASSERT_EQ(std::string(10, '3'), Get("small3")); ++ ASSERT_EQ(std::string(10, '4'), Get("small4")); ++ ASSERT_GT(NumTableFilesAtLevel(0), 1); ++} ++ ++TEST(DBTest, CompactionsGenerateMultipleFiles) { ++ Options options = CurrentOptions(); ++ options.write_buffer_size = 100000000; // Large write buffer ++ Reopen(&options); ++ ++ Random rnd(301); ++ ++ // Write 8MB (80 values, each 100K) ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ std::vector values; ++ for (int i = 0; i < 80; i++) { ++ values.push_back(RandomString(&rnd, 100000)); ++ ASSERT_OK(Put(Key(i), values[i])); ++ } ++ ++ // Reopening moves updates to level-0 ++ Reopen(&options); ++ dbfull()->TEST_CompactRange(0, NULL, NULL); ++ ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ ASSERT_GT(NumTableFilesAtLevel(1), 1); ++ for (int i = 0; i < 80; i++) { ++ ASSERT_EQ(Get(Key(i)), values[i]); ++ } ++} ++ ++TEST(DBTest, RepeatedWritesToSameKey) { ++ Options options = CurrentOptions(); ++ options.env = env_; ++ options.write_buffer_size = 100000; // Small write buffer ++ Reopen(&options); ++ ++ // We must have at most one file per level except for level-0, ++ // which may have up to kL0_StopWritesTrigger files. ++ const int kMaxFiles = config::kNumLevels + config::kL0_StopWritesTrigger; ++ ++ Random rnd(301); ++ std::string value = RandomString(&rnd, 2 * options.write_buffer_size); ++ for (int i = 0; i < 5 * kMaxFiles; i++) { ++ Put("key", value); ++ ASSERT_LE(TotalTableFiles(), kMaxFiles); ++ fprintf(stderr, "after %d: %d files\n", int(i+1), TotalTableFiles()); ++ } ++} ++ ++TEST(DBTest, SparseMerge) { ++ Options options = CurrentOptions(); ++ options.compression = kNoCompression; ++ Reopen(&options); ++ ++ FillLevels("A", "Z"); ++ ++ // Suppose there is: ++ // small amount of data with prefix A ++ // large amount of data with prefix B ++ // small amount of data with prefix C ++ // and that recent updates have made small changes to all three prefixes. ++ // Check that we do not do a compaction that merges all of B in one shot. ++ const std::string value(1000, 'x'); ++ Put("A", "va"); ++ // Write approximately 100MB of "B" values ++ for (int i = 0; i < 100000; i++) { ++ char key[100]; ++ snprintf(key, sizeof(key), "B%010d", i); ++ Put(key, value); ++ } ++ Put("C", "vc"); ++ dbfull()->TEST_CompactMemTable(); ++ dbfull()->TEST_CompactRange(0, NULL, NULL); ++ ++ // Make sparse update ++ Put("A", "va2"); ++ Put("B100", "bvalue2"); ++ Put("C", "vc2"); ++ dbfull()->TEST_CompactMemTable(); ++ ++ // Compactions should not cause us to create a situation where ++ // a file overlaps too much data at the next level. ++ ASSERT_LE(dbfull()->TEST_MaxNextLevelOverlappingBytes(), 20*1048576); ++ dbfull()->TEST_CompactRange(0, NULL, NULL); ++ ASSERT_LE(dbfull()->TEST_MaxNextLevelOverlappingBytes(), 20*1048576); ++ dbfull()->TEST_CompactRange(1, NULL, NULL); ++ ASSERT_LE(dbfull()->TEST_MaxNextLevelOverlappingBytes(), 20*1048576); ++} ++ ++static bool Between(uint64_t val, uint64_t low, uint64_t high) { ++ bool result = (val >= low) && (val <= high); ++ if (!result) { ++ fprintf(stderr, "Value %llu is not in range [%llu, %llu]\n", ++ (unsigned long long)(val), ++ (unsigned long long)(low), ++ (unsigned long long)(high)); ++ } ++ return result; ++} ++ ++TEST(DBTest, ApproximateSizes) { ++ do { ++ Options options = CurrentOptions(); ++ options.write_buffer_size = 100000000; // Large write buffer ++ options.compression = kNoCompression; ++ DestroyAndReopen(); ++ ++ ASSERT_TRUE(Between(Size("", "xyz"), 0, 0)); ++ Reopen(&options); ++ ASSERT_TRUE(Between(Size("", "xyz"), 0, 0)); ++ ++ // Write 8MB (80 values, each 100K) ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ const int N = 80; ++ static const int S1 = 100000; ++ static const int S2 = 105000; // Allow some expansion from metadata ++ Random rnd(301); ++ for (int i = 0; i < N; i++) { ++ ASSERT_OK(Put(Key(i), RandomString(&rnd, S1))); ++ } ++ ++ // 0 because GetApproximateSizes() does not account for memtable space ++ ASSERT_TRUE(Between(Size("", Key(50)), 0, 0)); ++ ++ if (options.reuse_logs) { ++ // Recovery will reuse memtable, and GetApproximateSizes() does not ++ // account for memtable usage; ++ Reopen(&options); ++ ASSERT_TRUE(Between(Size("", Key(50)), 0, 0)); ++ continue; ++ } ++ ++ // Check sizes across recovery by reopening a few times ++ for (int run = 0; run < 3; run++) { ++ Reopen(&options); ++ ++ for (int compact_start = 0; compact_start < N; compact_start += 10) { ++ for (int i = 0; i < N; i += 10) { ++ ASSERT_TRUE(Between(Size("", Key(i)), S1*i, S2*i)); ++ ASSERT_TRUE(Between(Size("", Key(i)+".suffix"), S1*(i+1), S2*(i+1))); ++ ASSERT_TRUE(Between(Size(Key(i), Key(i+10)), S1*10, S2*10)); ++ } ++ ASSERT_TRUE(Between(Size("", Key(50)), S1*50, S2*50)); ++ ASSERT_TRUE(Between(Size("", Key(50)+".suffix"), S1*50, S2*50)); ++ ++ std::string cstart_str = Key(compact_start); ++ std::string cend_str = Key(compact_start + 9); ++ Slice cstart = cstart_str; ++ Slice cend = cend_str; ++ dbfull()->TEST_CompactRange(0, &cstart, &cend); ++ } ++ ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ ASSERT_GT(NumTableFilesAtLevel(1), 0); ++ } ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, ApproximateSizes_MixOfSmallAndLarge) { ++ do { ++ Options options = CurrentOptions(); ++ options.compression = kNoCompression; ++ Reopen(); ++ ++ Random rnd(301); ++ std::string big1 = RandomString(&rnd, 100000); ++ ASSERT_OK(Put(Key(0), RandomString(&rnd, 10000))); ++ ASSERT_OK(Put(Key(1), RandomString(&rnd, 10000))); ++ ASSERT_OK(Put(Key(2), big1)); ++ ASSERT_OK(Put(Key(3), RandomString(&rnd, 10000))); ++ ASSERT_OK(Put(Key(4), big1)); ++ ASSERT_OK(Put(Key(5), RandomString(&rnd, 10000))); ++ ASSERT_OK(Put(Key(6), RandomString(&rnd, 300000))); ++ ASSERT_OK(Put(Key(7), RandomString(&rnd, 10000))); ++ ++ if (options.reuse_logs) { ++ // Need to force a memtable compaction since recovery does not do so. ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); ++ } ++ ++ // Check sizes across recovery by reopening a few times ++ for (int run = 0; run < 3; run++) { ++ Reopen(&options); ++ ++ ASSERT_TRUE(Between(Size("", Key(0)), 0, 0)); ++ ASSERT_TRUE(Between(Size("", Key(1)), 10000, 11000)); ++ ASSERT_TRUE(Between(Size("", Key(2)), 20000, 21000)); ++ ASSERT_TRUE(Between(Size("", Key(3)), 120000, 121000)); ++ ASSERT_TRUE(Between(Size("", Key(4)), 130000, 131000)); ++ ASSERT_TRUE(Between(Size("", Key(5)), 230000, 231000)); ++ ASSERT_TRUE(Between(Size("", Key(6)), 240000, 241000)); ++ ASSERT_TRUE(Between(Size("", Key(7)), 540000, 541000)); ++ ASSERT_TRUE(Between(Size("", Key(8)), 550000, 560000)); ++ ++ ASSERT_TRUE(Between(Size(Key(3), Key(5)), 110000, 111000)); ++ ++ dbfull()->TEST_CompactRange(0, NULL, NULL); ++ } ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, IteratorPinsRef) { ++ Put("foo", "hello"); ++ ++ // Get iterator that will yield the current contents of the DB. ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ ++ // Write to force compactions ++ Put("foo", "newvalue1"); ++ for (int i = 0; i < 100; i++) { ++ ASSERT_OK(Put(Key(i), Key(i) + std::string(100000, 'v'))); // 100K values ++ } ++ Put("foo", "newvalue2"); ++ ++ iter->SeekToFirst(); ++ ASSERT_TRUE(iter->Valid()); ++ ASSERT_EQ("foo", iter->key().ToString()); ++ ASSERT_EQ("hello", iter->value().ToString()); ++ iter->Next(); ++ ASSERT_TRUE(!iter->Valid()); ++ delete iter; ++} ++ ++TEST(DBTest, Snapshot) { ++ do { ++ Put("foo", "v1"); ++ const Snapshot* s1 = db_->GetSnapshot(); ++ Put("foo", "v2"); ++ const Snapshot* s2 = db_->GetSnapshot(); ++ Put("foo", "v3"); ++ const Snapshot* s3 = db_->GetSnapshot(); ++ ++ Put("foo", "v4"); ++ ASSERT_EQ("v1", Get("foo", s1)); ++ ASSERT_EQ("v2", Get("foo", s2)); ++ ASSERT_EQ("v3", Get("foo", s3)); ++ ASSERT_EQ("v4", Get("foo")); ++ ++ db_->ReleaseSnapshot(s3); ++ ASSERT_EQ("v1", Get("foo", s1)); ++ ASSERT_EQ("v2", Get("foo", s2)); ++ ASSERT_EQ("v4", Get("foo")); ++ ++ db_->ReleaseSnapshot(s1); ++ ASSERT_EQ("v2", Get("foo", s2)); ++ ASSERT_EQ("v4", Get("foo")); ++ ++ db_->ReleaseSnapshot(s2); ++ ASSERT_EQ("v4", Get("foo")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, HiddenValuesAreRemoved) { ++ do { ++ Random rnd(301); ++ FillLevels("a", "z"); ++ ++ std::string big = RandomString(&rnd, 50000); ++ Put("foo", big); ++ Put("pastfoo", "v"); ++ const Snapshot* snapshot = db_->GetSnapshot(); ++ Put("foo", "tiny"); ++ Put("pastfoo2", "v2"); // Advance sequence number one more ++ ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); ++ ASSERT_GT(NumTableFilesAtLevel(0), 0); ++ ++ ASSERT_EQ(big, Get("foo", snapshot)); ++ ASSERT_TRUE(Between(Size("", "pastfoo"), 50000, 60000)); ++ db_->ReleaseSnapshot(snapshot); ++ ASSERT_EQ(AllEntriesFor("foo"), "[ tiny, " + big + " ]"); ++ Slice x("x"); ++ dbfull()->TEST_CompactRange(0, NULL, &x); ++ ASSERT_EQ(AllEntriesFor("foo"), "[ tiny ]"); ++ ASSERT_EQ(NumTableFilesAtLevel(0), 0); ++ ASSERT_GE(NumTableFilesAtLevel(1), 1); ++ dbfull()->TEST_CompactRange(1, NULL, &x); ++ ASSERT_EQ(AllEntriesFor("foo"), "[ tiny ]"); ++ ++ ASSERT_TRUE(Between(Size("", "pastfoo"), 0, 1000)); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, DeletionMarkers1) { ++ Put("foo", "v1"); ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); ++ const int last = config::kMaxMemCompactLevel; ++ ASSERT_EQ(NumTableFilesAtLevel(last), 1); // foo => v1 is now in last level ++ ++ // Place a table at level last-1 to prevent merging with preceding mutation ++ Put("a", "begin"); ++ Put("z", "end"); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ(NumTableFilesAtLevel(last), 1); ++ ASSERT_EQ(NumTableFilesAtLevel(last-1), 1); ++ ++ Delete("foo"); ++ Put("foo", "v2"); ++ ASSERT_EQ(AllEntriesFor("foo"), "[ v2, DEL, v1 ]"); ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); // Moves to level last-2 ++ ASSERT_EQ(AllEntriesFor("foo"), "[ v2, DEL, v1 ]"); ++ Slice z("z"); ++ dbfull()->TEST_CompactRange(last-2, NULL, &z); ++ // DEL eliminated, but v1 remains because we aren't compacting that level ++ // (DEL can be eliminated because v2 hides v1). ++ ASSERT_EQ(AllEntriesFor("foo"), "[ v2, v1 ]"); ++ dbfull()->TEST_CompactRange(last-1, NULL, NULL); ++ // Merging last-1 w/ last, so we are the base level for "foo", so ++ // DEL is removed. (as is v1). ++ ASSERT_EQ(AllEntriesFor("foo"), "[ v2 ]"); ++} ++ ++TEST(DBTest, DeletionMarkers2) { ++ Put("foo", "v1"); ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); ++ const int last = config::kMaxMemCompactLevel; ++ ASSERT_EQ(NumTableFilesAtLevel(last), 1); // foo => v1 is now in last level ++ ++ // Place a table at level last-1 to prevent merging with preceding mutation ++ Put("a", "begin"); ++ Put("z", "end"); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ(NumTableFilesAtLevel(last), 1); ++ ASSERT_EQ(NumTableFilesAtLevel(last-1), 1); ++ ++ Delete("foo"); ++ ASSERT_EQ(AllEntriesFor("foo"), "[ DEL, v1 ]"); ++ ASSERT_OK(dbfull()->TEST_CompactMemTable()); // Moves to level last-2 ++ ASSERT_EQ(AllEntriesFor("foo"), "[ DEL, v1 ]"); ++ dbfull()->TEST_CompactRange(last-2, NULL, NULL); ++ // DEL kept: "last" file overlaps ++ ASSERT_EQ(AllEntriesFor("foo"), "[ DEL, v1 ]"); ++ dbfull()->TEST_CompactRange(last-1, NULL, NULL); ++ // Merging last-1 w/ last, so we are the base level for "foo", so ++ // DEL is removed. (as is v1). ++ ASSERT_EQ(AllEntriesFor("foo"), "[ ]"); ++} ++ ++TEST(DBTest, OverlapInLevel0) { ++ do { ++ ASSERT_EQ(config::kMaxMemCompactLevel, 2) << "Fix test to match config"; ++ ++ // Fill levels 1 and 2 to disable the pushing of new memtables to levels > 0. ++ ASSERT_OK(Put("100", "v100")); ++ ASSERT_OK(Put("999", "v999")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_OK(Delete("100")); ++ ASSERT_OK(Delete("999")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("0,1,1", FilesPerLevel()); ++ ++ // Make files spanning the following ranges in level-0: ++ // files[0] 200 .. 900 ++ // files[1] 300 .. 500 ++ // Note that files are sorted by smallest key. ++ ASSERT_OK(Put("300", "v300")); ++ ASSERT_OK(Put("500", "v500")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_OK(Put("200", "v200")); ++ ASSERT_OK(Put("600", "v600")); ++ ASSERT_OK(Put("900", "v900")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("2,1,1", FilesPerLevel()); ++ ++ // Compact away the placeholder files we created initially ++ dbfull()->TEST_CompactRange(1, NULL, NULL); ++ dbfull()->TEST_CompactRange(2, NULL, NULL); ++ ASSERT_EQ("2", FilesPerLevel()); ++ ++ // Do a memtable compaction. Before bug-fix, the compaction would ++ // not detect the overlap with level-0 files and would incorrectly place ++ // the deletion in a deeper level. ++ ASSERT_OK(Delete("600")); ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("3", FilesPerLevel()); ++ ASSERT_EQ("NOT_FOUND", Get("600")); ++ } while (ChangeOptions()); ++} ++ ++TEST(DBTest, L0_CompactionBug_Issue44_a) { ++ Reopen(); ++ ASSERT_OK(Put("b", "v")); ++ Reopen(); ++ ASSERT_OK(Delete("b")); ++ ASSERT_OK(Delete("a")); ++ Reopen(); ++ ASSERT_OK(Delete("a")); ++ Reopen(); ++ ASSERT_OK(Put("a", "v")); ++ Reopen(); ++ Reopen(); ++ ASSERT_EQ("(a->v)", Contents()); ++ DelayMilliseconds(1000); // Wait for compaction to finish ++ ASSERT_EQ("(a->v)", Contents()); ++} ++ ++TEST(DBTest, L0_CompactionBug_Issue44_b) { ++ Reopen(); ++ Put("",""); ++ Reopen(); ++ Delete("e"); ++ Put("",""); ++ Reopen(); ++ Put("c", "cv"); ++ Reopen(); ++ Put("",""); ++ Reopen(); ++ Put("",""); ++ DelayMilliseconds(1000); // Wait for compaction to finish ++ Reopen(); ++ Put("d","dv"); ++ Reopen(); ++ Put("",""); ++ Reopen(); ++ Delete("d"); ++ Delete("b"); ++ Reopen(); ++ ASSERT_EQ("(->)(c->cv)", Contents()); ++ DelayMilliseconds(1000); // Wait for compaction to finish ++ ASSERT_EQ("(->)(c->cv)", Contents()); ++} ++ ++TEST(DBTest, ComparatorCheck) { ++ class NewComparator : public Comparator { ++ public: ++ virtual const char* Name() const { return "leveldb.NewComparator"; } ++ virtual int Compare(const Slice& a, const Slice& b) const { ++ return BytewiseComparator()->Compare(a, b); ++ } ++ virtual void FindShortestSeparator(std::string* s, const Slice& l) const { ++ BytewiseComparator()->FindShortestSeparator(s, l); ++ } ++ virtual void FindShortSuccessor(std::string* key) const { ++ BytewiseComparator()->FindShortSuccessor(key); ++ } ++ }; ++ NewComparator cmp; ++ Options new_options = CurrentOptions(); ++ new_options.comparator = &cmp; ++ Status s = TryReopen(&new_options); ++ ASSERT_TRUE(!s.ok()); ++ ASSERT_TRUE(s.ToString().find("comparator") != std::string::npos) ++ << s.ToString(); ++} ++ ++TEST(DBTest, CustomComparator) { ++ class NumberComparator : public Comparator { ++ public: ++ virtual const char* Name() const { return "test.NumberComparator"; } ++ virtual int Compare(const Slice& a, const Slice& b) const { ++ return ToNumber(a) - ToNumber(b); ++ } ++ virtual void FindShortestSeparator(std::string* s, const Slice& l) const { ++ ToNumber(*s); // Check format ++ ToNumber(l); // Check format ++ } ++ virtual void FindShortSuccessor(std::string* key) const { ++ ToNumber(*key); // Check format ++ } ++ private: ++ static int ToNumber(const Slice& x) { ++ // Check that there are no extra characters. ++ ASSERT_TRUE(x.size() >= 2 && x[0] == '[' && x[x.size()-1] == ']') ++ << EscapeString(x); ++ int val; ++ char ignored; ++ ASSERT_TRUE(sscanf(x.ToString().c_str(), "[%i]%c", &val, &ignored) == 1) ++ << EscapeString(x); ++ return val; ++ } ++ }; ++ NumberComparator cmp; ++ Options new_options = CurrentOptions(); ++ new_options.create_if_missing = true; ++ new_options.comparator = &cmp; ++ new_options.filter_policy = NULL; // Cannot use bloom filters ++ new_options.write_buffer_size = 1000; // Compact more often ++ DestroyAndReopen(&new_options); ++ ASSERT_OK(Put("[10]", "ten")); ++ ASSERT_OK(Put("[0x14]", "twenty")); ++ for (int i = 0; i < 2; i++) { ++ ASSERT_EQ("ten", Get("[10]")); ++ ASSERT_EQ("ten", Get("[0xa]")); ++ ASSERT_EQ("twenty", Get("[20]")); ++ ASSERT_EQ("twenty", Get("[0x14]")); ++ ASSERT_EQ("NOT_FOUND", Get("[15]")); ++ ASSERT_EQ("NOT_FOUND", Get("[0xf]")); ++ Compact("[0]", "[9999]"); ++ } ++ ++ for (int run = 0; run < 2; run++) { ++ for (int i = 0; i < 1000; i++) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "[%d]", i*10); ++ ASSERT_OK(Put(buf, buf)); ++ } ++ Compact("[0]", "[1000000]"); ++ } ++} ++ ++TEST(DBTest, ManualCompaction) { ++ ASSERT_EQ(config::kMaxMemCompactLevel, 2) ++ << "Need to update this test to match kMaxMemCompactLevel"; ++ ++ MakeTables(3, "p", "q"); ++ ASSERT_EQ("1,1,1", FilesPerLevel()); ++ ++ // Compaction range falls before files ++ Compact("", "c"); ++ ASSERT_EQ("1,1,1", FilesPerLevel()); ++ ++ // Compaction range falls after files ++ Compact("r", "z"); ++ ASSERT_EQ("1,1,1", FilesPerLevel()); ++ ++ // Compaction range overlaps files ++ Compact("p1", "p9"); ++ ASSERT_EQ("0,0,1", FilesPerLevel()); ++ ++ // Populate a different range ++ MakeTables(3, "c", "e"); ++ ASSERT_EQ("1,1,2", FilesPerLevel()); ++ ++ // Compact just the new range ++ Compact("b", "f"); ++ ASSERT_EQ("0,0,2", FilesPerLevel()); ++ ++ // Compact all ++ MakeTables(1, "a", "z"); ++ ASSERT_EQ("0,1,2", FilesPerLevel()); ++ db_->CompactRange(NULL, NULL); ++ ASSERT_EQ("0,0,1", FilesPerLevel()); ++} ++ ++TEST(DBTest, DBOpen_Options) { ++ std::string dbname = test::TmpDir() + "/db_options_test"; ++ DestroyDB(dbname, Options()); ++ ++ // Does not exist, and create_if_missing == false: error ++ DB* db = NULL; ++ Options opts; ++ opts.create_if_missing = false; ++ Status s = DB::Open(opts, dbname, &db); ++ ASSERT_TRUE(strstr(s.ToString().c_str(), "does not exist") != NULL); ++ ASSERT_TRUE(db == NULL); ++ ++ // Does not exist, and create_if_missing == true: OK ++ opts.create_if_missing = true; ++ s = DB::Open(opts, dbname, &db); ++ ASSERT_OK(s); ++ ASSERT_TRUE(db != NULL); ++ ++ delete db; ++ db = NULL; ++ ++ // Does exist, and error_if_exists == true: error ++ opts.create_if_missing = false; ++ opts.error_if_exists = true; ++ s = DB::Open(opts, dbname, &db); ++ ASSERT_TRUE(strstr(s.ToString().c_str(), "exists") != NULL); ++ ASSERT_TRUE(db == NULL); ++ ++ // Does exist, and error_if_exists == false: OK ++ opts.create_if_missing = true; ++ opts.error_if_exists = false; ++ s = DB::Open(opts, dbname, &db); ++ ASSERT_OK(s); ++ ASSERT_TRUE(db != NULL); ++ ++ delete db; ++ db = NULL; ++} ++ ++TEST(DBTest, Locking) { ++ DB* db2 = NULL; ++ Status s = DB::Open(CurrentOptions(), dbname_, &db2); ++ ASSERT_TRUE(!s.ok()) << "Locking did not prevent re-opening db"; ++} ++ ++// Check that number of files does not grow when we are out of space ++TEST(DBTest, NoSpace) { ++ Options options = CurrentOptions(); ++ options.env = env_; ++ Reopen(&options); ++ ++ ASSERT_OK(Put("foo", "v1")); ++ ASSERT_EQ("v1", Get("foo")); ++ Compact("a", "z"); ++ const int num_files = CountFiles(); ++ env_->no_space_.Release_Store(env_); // Force out-of-space errors ++ for (int i = 0; i < 10; i++) { ++ for (int level = 0; level < config::kNumLevels-1; level++) { ++ dbfull()->TEST_CompactRange(level, NULL, NULL); ++ } ++ } ++ env_->no_space_.Release_Store(NULL); ++ ASSERT_LT(CountFiles(), num_files + 3); ++} ++ ++TEST(DBTest, NonWritableFileSystem) { ++ Options options = CurrentOptions(); ++ options.write_buffer_size = 1000; ++ options.env = env_; ++ Reopen(&options); ++ ASSERT_OK(Put("foo", "v1")); ++ env_->non_writable_.Release_Store(env_); // Force errors for new files ++ std::string big(100000, 'x'); ++ int errors = 0; ++ for (int i = 0; i < 20; i++) { ++ fprintf(stderr, "iter %d; errors %d\n", i, errors); ++ if (!Put("foo", big).ok()) { ++ errors++; ++ DelayMilliseconds(100); ++ } ++ } ++ ASSERT_GT(errors, 0); ++ env_->non_writable_.Release_Store(NULL); ++} ++ ++TEST(DBTest, WriteSyncError) { ++ // Check that log sync errors cause the DB to disallow future writes. ++ ++ // (a) Cause log sync calls to fail ++ Options options = CurrentOptions(); ++ options.env = env_; ++ Reopen(&options); ++ env_->data_sync_error_.Release_Store(env_); ++ ++ // (b) Normal write should succeed ++ WriteOptions w; ++ ASSERT_OK(db_->Put(w, "k1", "v1")); ++ ASSERT_EQ("v1", Get("k1")); ++ ++ // (c) Do a sync write; should fail ++ w.sync = true; ++ ASSERT_TRUE(!db_->Put(w, "k2", "v2").ok()); ++ ASSERT_EQ("v1", Get("k1")); ++ ASSERT_EQ("NOT_FOUND", Get("k2")); ++ ++ // (d) make sync behave normally ++ env_->data_sync_error_.Release_Store(NULL); ++ ++ // (e) Do a non-sync write; should fail ++ w.sync = false; ++ ASSERT_TRUE(!db_->Put(w, "k3", "v3").ok()); ++ ASSERT_EQ("v1", Get("k1")); ++ ASSERT_EQ("NOT_FOUND", Get("k2")); ++ ASSERT_EQ("NOT_FOUND", Get("k3")); ++} ++ ++TEST(DBTest, ManifestWriteError) { ++ // Test for the following problem: ++ // (a) Compaction produces file F ++ // (b) Log record containing F is written to MANIFEST file, but Sync() fails ++ // (c) GC deletes F ++ // (d) After reopening DB, reads fail since deleted F is named in log record ++ ++ // We iterate twice. In the second iteration, everything is the ++ // same except the log record never makes it to the MANIFEST file. ++ for (int iter = 0; iter < 2; iter++) { ++ port::AtomicPointer* error_type = (iter == 0) ++ ? &env_->manifest_sync_error_ ++ : &env_->manifest_write_error_; ++ ++ // Insert foo=>bar mapping ++ Options options = CurrentOptions(); ++ options.env = env_; ++ options.create_if_missing = true; ++ options.error_if_exists = false; ++ DestroyAndReopen(&options); ++ ASSERT_OK(Put("foo", "bar")); ++ ASSERT_EQ("bar", Get("foo")); ++ ++ // Memtable compaction (will succeed) ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("bar", Get("foo")); ++ const int last = config::kMaxMemCompactLevel; ++ ASSERT_EQ(NumTableFilesAtLevel(last), 1); // foo=>bar is now in last level ++ ++ // Merging compaction (will fail) ++ error_type->Release_Store(env_); ++ dbfull()->TEST_CompactRange(last, NULL, NULL); // Should fail ++ ASSERT_EQ("bar", Get("foo")); ++ ++ // Recovery: should not lose data ++ error_type->Release_Store(NULL); ++ Reopen(&options); ++ ASSERT_EQ("bar", Get("foo")); ++ } ++} ++ ++TEST(DBTest, MissingSSTFile) { ++ ASSERT_OK(Put("foo", "bar")); ++ ASSERT_EQ("bar", Get("foo")); ++ ++ // Dump the memtable to disk. ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("bar", Get("foo")); ++ ++ Close(); ++ ASSERT_TRUE(DeleteAnSSTFile()); ++ Options options = CurrentOptions(); ++ options.paranoid_checks = true; ++ Status s = TryReopen(&options); ++ ASSERT_TRUE(!s.ok()); ++ ASSERT_TRUE(s.ToString().find("issing") != std::string::npos) ++ << s.ToString(); ++} ++ ++TEST(DBTest, StillReadSST) { ++ ASSERT_OK(Put("foo", "bar")); ++ ASSERT_EQ("bar", Get("foo")); ++ ++ // Dump the memtable to disk. ++ dbfull()->TEST_CompactMemTable(); ++ ASSERT_EQ("bar", Get("foo")); ++ Close(); ++ ASSERT_GT(RenameLDBToSST(), 0); ++ Options options = CurrentOptions(); ++ options.paranoid_checks = true; ++ Status s = TryReopen(&options); ++ ASSERT_TRUE(s.ok()); ++ ASSERT_EQ("bar", Get("foo")); ++} ++ ++TEST(DBTest, FilesDeletedAfterCompaction) { ++ ASSERT_OK(Put("foo", "v2")); ++ Compact("a", "z"); ++ const int num_files = CountFiles(); ++ for (int i = 0; i < 10; i++) { ++ ASSERT_OK(Put("foo", "v2")); ++ Compact("a", "z"); ++ } ++ ASSERT_EQ(CountFiles(), num_files); ++} ++ ++TEST(DBTest, BloomFilter) { ++ env_->count_random_reads_ = true; ++ Options options = CurrentOptions(); ++ options.env = env_; ++ options.block_cache = NewLRUCache(0); // Prevent cache hits ++ options.filter_policy = NewBloomFilterPolicy(10); ++ Reopen(&options); ++ ++ // Populate multiple layers ++ const int N = 10000; ++ for (int i = 0; i < N; i++) { ++ ASSERT_OK(Put(Key(i), Key(i))); ++ } ++ Compact("a", "z"); ++ for (int i = 0; i < N; i += 100) { ++ ASSERT_OK(Put(Key(i), Key(i))); ++ } ++ dbfull()->TEST_CompactMemTable(); ++ ++ // Prevent auto compactions triggered by seeks ++ env_->delay_data_sync_.Release_Store(env_); ++ ++ // Lookup present keys. Should rarely read from small sstable. ++ env_->random_read_counter_.Reset(); ++ for (int i = 0; i < N; i++) { ++ ASSERT_EQ(Key(i), Get(Key(i))); ++ } ++ int reads = env_->random_read_counter_.Read(); ++ fprintf(stderr, "%d present => %d reads\n", N, reads); ++ ASSERT_GE(reads, N); ++ ASSERT_LE(reads, N + 2*N/100); ++ ++ // Lookup present keys. Should rarely read from either sstable. ++ env_->random_read_counter_.Reset(); ++ for (int i = 0; i < N; i++) { ++ ASSERT_EQ("NOT_FOUND", Get(Key(i) + ".missing")); ++ } ++ reads = env_->random_read_counter_.Read(); ++ fprintf(stderr, "%d missing => %d reads\n", N, reads); ++ ASSERT_LE(reads, 3*N/100); ++ ++ env_->delay_data_sync_.Release_Store(NULL); ++ Close(); ++ delete options.block_cache; ++ delete options.filter_policy; ++} ++ ++// Multi-threaded test: ++namespace { ++ ++static const int kNumThreads = 4; ++static const int kTestSeconds = 10; ++static const int kNumKeys = 1000; ++ ++struct MTState { ++ DBTest* test; ++ port::AtomicPointer stop; ++ port::AtomicPointer counter[kNumThreads]; ++ port::AtomicPointer thread_done[kNumThreads]; ++}; ++ ++struct MTThread { ++ MTState* state; ++ int id; ++}; ++ ++static void MTThreadBody(void* arg) { ++ MTThread* t = reinterpret_cast(arg); ++ int id = t->id; ++ DB* db = t->state->test->db_; ++ uintptr_t counter = 0; ++ fprintf(stderr, "... starting thread %d\n", id); ++ Random rnd(1000 + id); ++ std::string value; ++ char valbuf[1500]; ++ while (t->state->stop.Acquire_Load() == NULL) { ++ t->state->counter[id].Release_Store(reinterpret_cast(counter)); ++ ++ int key = rnd.Uniform(kNumKeys); ++ char keybuf[20]; ++ snprintf(keybuf, sizeof(keybuf), "%016d", key); ++ ++ if (rnd.OneIn(2)) { ++ // Write values of the form . ++ // We add some padding for force compactions. ++ snprintf(valbuf, sizeof(valbuf), "%d.%d.%-1000d", ++ key, id, static_cast(counter)); ++ ASSERT_OK(db->Put(WriteOptions(), Slice(keybuf), Slice(valbuf))); ++ } else { ++ // Read a value and verify that it matches the pattern written above. ++ Status s = db->Get(ReadOptions(), Slice(keybuf), &value); ++ if (s.IsNotFound()) { ++ // Key has not yet been written ++ } else { ++ // Check that the writer thread counter is >= the counter in the value ++ ASSERT_OK(s); ++ int k, w, c; ++ ASSERT_EQ(3, sscanf(value.c_str(), "%d.%d.%d", &k, &w, &c)) << value; ++ ASSERT_EQ(k, key); ++ ASSERT_GE(w, 0); ++ ASSERT_LT(w, kNumThreads); ++ ASSERT_LE(static_cast(c), reinterpret_cast( ++ t->state->counter[w].Acquire_Load())); ++ } ++ } ++ counter++; ++ } ++ t->state->thread_done[id].Release_Store(t); ++ fprintf(stderr, "... stopping thread %d after %d ops\n", id, int(counter)); ++} ++ ++} // namespace ++ ++TEST(DBTest, MultiThreaded) { ++ do { ++ // Initialize state ++ MTState mt; ++ mt.test = this; ++ mt.stop.Release_Store(0); ++ for (int id = 0; id < kNumThreads; id++) { ++ mt.counter[id].Release_Store(0); ++ mt.thread_done[id].Release_Store(0); ++ } ++ ++ // Start threads ++ MTThread thread[kNumThreads]; ++ for (int id = 0; id < kNumThreads; id++) { ++ thread[id].state = &mt; ++ thread[id].id = id; ++ env_->StartThread(MTThreadBody, &thread[id]); ++ } ++ ++ // Let them run for a while ++ DelayMilliseconds(kTestSeconds * 1000); ++ ++ // Stop the threads and wait for them to finish ++ mt.stop.Release_Store(&mt); ++ for (int id = 0; id < kNumThreads; id++) { ++ while (mt.thread_done[id].Acquire_Load() == NULL) { ++ DelayMilliseconds(100); ++ } ++ } ++ } while (ChangeOptions()); ++} ++ ++namespace { ++typedef std::map KVMap; ++} ++ ++class ModelDB: public DB { ++ public: ++ class ModelSnapshot : public Snapshot { ++ public: ++ KVMap map_; ++ }; ++ ++ explicit ModelDB(const Options& options): options_(options) { } ++ ~ModelDB() { } ++ virtual Status Put(const WriteOptions& o, const Slice& k, const Slice& v) { ++ return DB::Put(o, k, v); ++ } ++ virtual Status Delete(const WriteOptions& o, const Slice& key) { ++ return DB::Delete(o, key); ++ } ++ virtual Status Get(const ReadOptions& options, ++ const Slice& key, std::string* value) { ++ assert(false); // Not implemented ++ return Status::NotFound(key); ++ } ++ virtual Iterator* NewIterator(const ReadOptions& options) { ++ if (options.snapshot == NULL) { ++ KVMap* saved = new KVMap; ++ *saved = map_; ++ return new ModelIter(saved, true); ++ } else { ++ const KVMap* snapshot_state = ++ &(reinterpret_cast(options.snapshot)->map_); ++ return new ModelIter(snapshot_state, false); ++ } ++ } ++ virtual const Snapshot* GetSnapshot() { ++ ModelSnapshot* snapshot = new ModelSnapshot; ++ snapshot->map_ = map_; ++ return snapshot; ++ } ++ ++ virtual void ReleaseSnapshot(const Snapshot* snapshot) { ++ delete reinterpret_cast(snapshot); ++ } ++ virtual Status Write(const WriteOptions& options, WriteBatch* batch) { ++ class Handler : public WriteBatch::Handler { ++ public: ++ KVMap* map_; ++ virtual void Put(const Slice& key, const Slice& value) { ++ (*map_)[key.ToString()] = value.ToString(); ++ } ++ virtual void Delete(const Slice& key) { ++ map_->erase(key.ToString()); ++ } ++ }; ++ Handler handler; ++ handler.map_ = &map_; ++ return batch->Iterate(&handler); ++ } ++ ++ virtual bool GetProperty(const Slice& property, std::string* value) { ++ return false; ++ } ++ virtual void GetApproximateSizes(const Range* r, int n, uint64_t* sizes) { ++ for (int i = 0; i < n; i++) { ++ sizes[i] = 0; ++ } ++ } ++ virtual void CompactRange(const Slice* start, const Slice* end) { ++ } ++ ++ private: ++ class ModelIter: public Iterator { ++ public: ++ ModelIter(const KVMap* map, bool owned) ++ : map_(map), owned_(owned), iter_(map_->end()) { ++ } ++ ~ModelIter() { ++ if (owned_) delete map_; ++ } ++ virtual bool Valid() const { return iter_ != map_->end(); } ++ virtual void SeekToFirst() { iter_ = map_->begin(); } ++ virtual void SeekToLast() { ++ if (map_->empty()) { ++ iter_ = map_->end(); ++ } else { ++ iter_ = map_->find(map_->rbegin()->first); ++ } ++ } ++ virtual void Seek(const Slice& k) { ++ iter_ = map_->lower_bound(k.ToString()); ++ } ++ virtual void Next() { ++iter_; } ++ virtual void Prev() { --iter_; } ++ virtual Slice key() const { return iter_->first; } ++ virtual Slice value() const { return iter_->second; } ++ virtual Status status() const { return Status::OK(); } ++ private: ++ const KVMap* const map_; ++ const bool owned_; // Do we own map_ ++ KVMap::const_iterator iter_; ++ }; ++ const Options options_; ++ KVMap map_; ++}; ++ ++static std::string RandomKey(Random* rnd) { ++ int len = (rnd->OneIn(3) ++ ? 1 // Short sometimes to encourage collisions ++ : (rnd->OneIn(100) ? rnd->Skewed(10) : rnd->Uniform(10))); ++ return test::RandomKey(rnd, len); ++} ++ ++static bool CompareIterators(int step, ++ DB* model, ++ DB* db, ++ const Snapshot* model_snap, ++ const Snapshot* db_snap) { ++ ReadOptions options; ++ options.snapshot = model_snap; ++ Iterator* miter = model->NewIterator(options); ++ options.snapshot = db_snap; ++ Iterator* dbiter = db->NewIterator(options); ++ bool ok = true; ++ int count = 0; ++ for (miter->SeekToFirst(), dbiter->SeekToFirst(); ++ ok && miter->Valid() && dbiter->Valid(); ++ miter->Next(), dbiter->Next()) { ++ count++; ++ if (miter->key().compare(dbiter->key()) != 0) { ++ fprintf(stderr, "step %d: Key mismatch: '%s' vs. '%s'\n", ++ step, ++ EscapeString(miter->key()).c_str(), ++ EscapeString(dbiter->key()).c_str()); ++ ok = false; ++ break; ++ } ++ ++ if (miter->value().compare(dbiter->value()) != 0) { ++ fprintf(stderr, "step %d: Value mismatch for key '%s': '%s' vs. '%s'\n", ++ step, ++ EscapeString(miter->key()).c_str(), ++ EscapeString(miter->value()).c_str(), ++ EscapeString(miter->value()).c_str()); ++ ok = false; ++ } ++ } ++ ++ if (ok) { ++ if (miter->Valid() != dbiter->Valid()) { ++ fprintf(stderr, "step %d: Mismatch at end of iterators: %d vs. %d\n", ++ step, miter->Valid(), dbiter->Valid()); ++ ok = false; ++ } ++ } ++ fprintf(stderr, "%d entries compared: ok=%d\n", count, ok); ++ delete miter; ++ delete dbiter; ++ return ok; ++} ++ ++TEST(DBTest, Randomized) { ++ Random rnd(test::RandomSeed()); ++ do { ++ ModelDB model(CurrentOptions()); ++ const int N = 10000; ++ const Snapshot* model_snap = NULL; ++ const Snapshot* db_snap = NULL; ++ std::string k, v; ++ for (int step = 0; step < N; step++) { ++ if (step % 100 == 0) { ++ fprintf(stderr, "Step %d of %d\n", step, N); ++ } ++ // TODO(sanjay): Test Get() works ++ int p = rnd.Uniform(100); ++ if (p < 45) { // Put ++ k = RandomKey(&rnd); ++ v = RandomString(&rnd, ++ rnd.OneIn(20) ++ ? 100 + rnd.Uniform(100) ++ : rnd.Uniform(8)); ++ ASSERT_OK(model.Put(WriteOptions(), k, v)); ++ ASSERT_OK(db_->Put(WriteOptions(), k, v)); ++ ++ } else if (p < 90) { // Delete ++ k = RandomKey(&rnd); ++ ASSERT_OK(model.Delete(WriteOptions(), k)); ++ ASSERT_OK(db_->Delete(WriteOptions(), k)); ++ ++ ++ } else { // Multi-element batch ++ WriteBatch b; ++ const int num = rnd.Uniform(8); ++ for (int i = 0; i < num; i++) { ++ if (i == 0 || !rnd.OneIn(10)) { ++ k = RandomKey(&rnd); ++ } else { ++ // Periodically re-use the same key from the previous iter, so ++ // we have multiple entries in the write batch for the same key ++ } ++ if (rnd.OneIn(2)) { ++ v = RandomString(&rnd, rnd.Uniform(10)); ++ b.Put(k, v); ++ } else { ++ b.Delete(k); ++ } ++ } ++ ASSERT_OK(model.Write(WriteOptions(), &b)); ++ ASSERT_OK(db_->Write(WriteOptions(), &b)); ++ } ++ ++ if ((step % 100) == 0) { ++ ASSERT_TRUE(CompareIterators(step, &model, db_, NULL, NULL)); ++ ASSERT_TRUE(CompareIterators(step, &model, db_, model_snap, db_snap)); ++ // Save a snapshot from each DB this time that we'll use next ++ // time we compare things, to make sure the current state is ++ // preserved with the snapshot ++ if (model_snap != NULL) model.ReleaseSnapshot(model_snap); ++ if (db_snap != NULL) db_->ReleaseSnapshot(db_snap); ++ ++ Reopen(); ++ ASSERT_TRUE(CompareIterators(step, &model, db_, NULL, NULL)); ++ ++ model_snap = model.GetSnapshot(); ++ db_snap = db_->GetSnapshot(); ++ } ++ } ++ if (model_snap != NULL) model.ReleaseSnapshot(model_snap); ++ if (db_snap != NULL) db_->ReleaseSnapshot(db_snap); ++ } while (ChangeOptions()); ++} ++ ++std::string MakeKey(unsigned int num) { ++ char buf[30]; ++ snprintf(buf, sizeof(buf), "%016u", num); ++ return std::string(buf); ++} ++ ++void BM_LogAndApply(int iters, int num_base_files) { ++ std::string dbname = test::TmpDir() + "/leveldb_test_benchmark"; ++ DestroyDB(dbname, Options()); ++ ++ DB* db = NULL; ++ Options opts; ++ opts.create_if_missing = true; ++ Status s = DB::Open(opts, dbname, &db); ++ ASSERT_OK(s); ++ ASSERT_TRUE(db != NULL); ++ ++ delete db; ++ db = NULL; ++ ++ Env* env = Env::Default(); ++ ++ port::Mutex mu; ++ MutexLock l(&mu); ++ ++ InternalKeyComparator cmp(BytewiseComparator()); ++ Options options; ++ VersionSet vset(dbname, &options, NULL, &cmp); ++ bool save_manifest; ++ ASSERT_OK(vset.Recover(&save_manifest)); ++ VersionEdit vbase; ++ uint64_t fnum = 1; ++ for (int i = 0; i < num_base_files; i++) { ++ InternalKey start(MakeKey(2*fnum), 1, kTypeValue); ++ InternalKey limit(MakeKey(2*fnum+1), 1, kTypeDeletion); ++ vbase.AddFile(2, fnum++, 1 /* file size */, start, limit); ++ } ++ ASSERT_OK(vset.LogAndApply(&vbase, &mu)); ++ ++ uint64_t start_micros = env->NowMicros(); ++ ++ for (int i = 0; i < iters; i++) { ++ VersionEdit vedit; ++ vedit.DeleteFile(2, fnum); ++ InternalKey start(MakeKey(2*fnum), 1, kTypeValue); ++ InternalKey limit(MakeKey(2*fnum+1), 1, kTypeDeletion); ++ vedit.AddFile(2, fnum++, 1 /* file size */, start, limit); ++ vset.LogAndApply(&vedit, &mu); ++ } ++ uint64_t stop_micros = env->NowMicros(); ++ unsigned int us = stop_micros - start_micros; ++ char buf[16]; ++ snprintf(buf, sizeof(buf), "%d", num_base_files); ++ fprintf(stderr, ++ "BM_LogAndApply/%-6s %8d iters : %9u us (%7.0f us / iter)\n", ++ buf, iters, us, ((float)us) / iters); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ if (argc > 1 && std::string(argv[1]) == "--benchmark") { ++ leveldb::BM_LogAndApply(1000, 1); ++ leveldb::BM_LogAndApply(1000, 100); ++ leveldb::BM_LogAndApply(1000, 10000); ++ leveldb::BM_LogAndApply(100, 100000); ++ return 0; ++ } ++ ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.cc +new file mode 100644 +index 0000000..20a7ca4 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.cc +@@ -0,0 +1,140 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include "db/dbformat.h" ++#include "port/port.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++static uint64_t PackSequenceAndType(uint64_t seq, ValueType t) { ++ assert(seq <= kMaxSequenceNumber); ++ assert(t <= kValueTypeForSeek); ++ return (seq << 8) | t; ++} ++ ++void AppendInternalKey(std::string* result, const ParsedInternalKey& key) { ++ result->append(key.user_key.data(), key.user_key.size()); ++ PutFixed64(result, PackSequenceAndType(key.sequence, key.type)); ++} ++ ++std::string ParsedInternalKey::DebugString() const { ++ char buf[50]; ++ snprintf(buf, sizeof(buf), "' @ %llu : %d", ++ (unsigned long long) sequence, ++ int(type)); ++ std::string result = "'"; ++ result += EscapeString(user_key.ToString()); ++ result += buf; ++ return result; ++} ++ ++std::string InternalKey::DebugString() const { ++ std::string result; ++ ParsedInternalKey parsed; ++ if (ParseInternalKey(rep_, &parsed)) { ++ result = parsed.DebugString(); ++ } else { ++ result = "(bad)"; ++ result.append(EscapeString(rep_)); ++ } ++ return result; ++} ++ ++const char* InternalKeyComparator::Name() const { ++ return "leveldb.InternalKeyComparator"; ++} ++ ++int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const { ++ // Order by: ++ // increasing user key (according to user-supplied comparator) ++ // decreasing sequence number ++ // decreasing type (though sequence# should be enough to disambiguate) ++ int r = user_comparator_->Compare(ExtractUserKey(akey), ExtractUserKey(bkey)); ++ if (r == 0) { ++ const uint64_t anum = DecodeFixed64(akey.data() + akey.size() - 8); ++ const uint64_t bnum = DecodeFixed64(bkey.data() + bkey.size() - 8); ++ if (anum > bnum) { ++ r = -1; ++ } else if (anum < bnum) { ++ r = +1; ++ } ++ } ++ return r; ++} ++ ++void InternalKeyComparator::FindShortestSeparator( ++ std::string* start, ++ const Slice& limit) const { ++ // Attempt to shorten the user portion of the key ++ Slice user_start = ExtractUserKey(*start); ++ Slice user_limit = ExtractUserKey(limit); ++ std::string tmp(user_start.data(), user_start.size()); ++ user_comparator_->FindShortestSeparator(&tmp, user_limit); ++ if (tmp.size() < user_start.size() && ++ user_comparator_->Compare(user_start, tmp) < 0) { ++ // User key has become shorter physically, but larger logically. ++ // Tack on the earliest possible number to the shortened user key. ++ PutFixed64(&tmp, PackSequenceAndType(kMaxSequenceNumber,kValueTypeForSeek)); ++ assert(this->Compare(*start, tmp) < 0); ++ assert(this->Compare(tmp, limit) < 0); ++ start->swap(tmp); ++ } ++} ++ ++void InternalKeyComparator::FindShortSuccessor(std::string* key) const { ++ Slice user_key = ExtractUserKey(*key); ++ std::string tmp(user_key.data(), user_key.size()); ++ user_comparator_->FindShortSuccessor(&tmp); ++ if (tmp.size() < user_key.size() && ++ user_comparator_->Compare(user_key, tmp) < 0) { ++ // User key has become shorter physically, but larger logically. ++ // Tack on the earliest possible number to the shortened user key. ++ PutFixed64(&tmp, PackSequenceAndType(kMaxSequenceNumber,kValueTypeForSeek)); ++ assert(this->Compare(*key, tmp) < 0); ++ key->swap(tmp); ++ } ++} ++ ++const char* InternalFilterPolicy::Name() const { ++ return user_policy_->Name(); ++} ++ ++void InternalFilterPolicy::CreateFilter(const Slice* keys, int n, ++ std::string* dst) const { ++ // We rely on the fact that the code in table.cc does not mind us ++ // adjusting keys[]. ++ Slice* mkey = const_cast(keys); ++ for (int i = 0; i < n; i++) { ++ mkey[i] = ExtractUserKey(keys[i]); ++ // TODO(sanjay): Suppress dups? ++ } ++ user_policy_->CreateFilter(keys, n, dst); ++} ++ ++bool InternalFilterPolicy::KeyMayMatch(const Slice& key, const Slice& f) const { ++ return user_policy_->KeyMayMatch(ExtractUserKey(key), f); ++} ++ ++LookupKey::LookupKey(const Slice& user_key, SequenceNumber s) { ++ size_t usize = user_key.size(); ++ size_t needed = usize + 13; // A conservative estimate ++ char* dst; ++ if (needed <= sizeof(space_)) { ++ dst = space_; ++ } else { ++ dst = new char[needed]; ++ } ++ start_ = dst; ++ dst = EncodeVarint32(dst, usize + 8); ++ kstart_ = dst; ++ memcpy(dst, user_key.data(), usize); ++ dst += usize; ++ EncodeFixed64(dst, PackSequenceAndType(s, kValueTypeForSeek)); ++ dst += 8; ++ end_ = dst; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.h +new file mode 100644 +index 0000000..ea897b1 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.h +@@ -0,0 +1,230 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_DBFORMAT_H_ ++#define STORAGE_LEVELDB_DB_DBFORMAT_H_ ++ ++#include ++#include "leveldb/comparator.h" ++#include "leveldb/db.h" ++#include "leveldb/filter_policy.h" ++#include "leveldb/slice.h" ++#include "leveldb/table_builder.h" ++#include "util/coding.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++// Grouping of constants. We may want to make some of these ++// parameters set via options. ++namespace config { ++static const int kNumLevels = 7; ++ ++// Level-0 compaction is started when we hit this many files. ++static const int kL0_CompactionTrigger = 4; ++ ++// Soft limit on number of level-0 files. We slow down writes at this point. ++static const int kL0_SlowdownWritesTrigger = 8; ++ ++// Maximum number of level-0 files. We stop writes at this point. ++static const int kL0_StopWritesTrigger = 12; ++ ++// Maximum level to which a new compacted memtable is pushed if it ++// does not create overlap. We try to push to level 2 to avoid the ++// relatively expensive level 0=>1 compactions and to avoid some ++// expensive manifest file operations. We do not push all the way to ++// the largest level since that can generate a lot of wasted disk ++// space if the same key space is being repeatedly overwritten. ++static const int kMaxMemCompactLevel = 2; ++ ++// Approximate gap in bytes between samples of data read during iteration. ++static const int kReadBytesPeriod = 1048576; ++ ++} // namespace config ++ ++class InternalKey; ++ ++// Value types encoded as the last component of internal keys. ++// DO NOT CHANGE THESE ENUM VALUES: they are embedded in the on-disk ++// data structures. ++enum ValueType { ++ kTypeDeletion = 0x0, ++ kTypeValue = 0x1 ++}; ++// kValueTypeForSeek defines the ValueType that should be passed when ++// constructing a ParsedInternalKey object for seeking to a particular ++// sequence number (since we sort sequence numbers in decreasing order ++// and the value type is embedded as the low 8 bits in the sequence ++// number in internal keys, we need to use the highest-numbered ++// ValueType, not the lowest). ++static const ValueType kValueTypeForSeek = kTypeValue; ++ ++typedef uint64_t SequenceNumber; ++ ++// We leave eight bits empty at the bottom so a type and sequence# ++// can be packed together into 64-bits. ++static const SequenceNumber kMaxSequenceNumber = ++ ((0x1ull << 56) - 1); ++ ++struct ParsedInternalKey { ++ Slice user_key; ++ SequenceNumber sequence; ++ ValueType type; ++ ++ ParsedInternalKey() { } // Intentionally left uninitialized (for speed) ++ ParsedInternalKey(const Slice& u, const SequenceNumber& seq, ValueType t) ++ : user_key(u), sequence(seq), type(t) { } ++ std::string DebugString() const; ++}; ++ ++// Return the length of the encoding of "key". ++inline size_t InternalKeyEncodingLength(const ParsedInternalKey& key) { ++ return key.user_key.size() + 8; ++} ++ ++// Append the serialization of "key" to *result. ++extern void AppendInternalKey(std::string* result, ++ const ParsedInternalKey& key); ++ ++// Attempt to parse an internal key from "internal_key". On success, ++// stores the parsed data in "*result", and returns true. ++// ++// On error, returns false, leaves "*result" in an undefined state. ++extern bool ParseInternalKey(const Slice& internal_key, ++ ParsedInternalKey* result); ++ ++// Returns the user key portion of an internal key. ++inline Slice ExtractUserKey(const Slice& internal_key) { ++ assert(internal_key.size() >= 8); ++ return Slice(internal_key.data(), internal_key.size() - 8); ++} ++ ++inline ValueType ExtractValueType(const Slice& internal_key) { ++ assert(internal_key.size() >= 8); ++ const size_t n = internal_key.size(); ++ uint64_t num = DecodeFixed64(internal_key.data() + n - 8); ++ unsigned char c = num & 0xff; ++ return static_cast(c); ++} ++ ++// A comparator for internal keys that uses a specified comparator for ++// the user key portion and breaks ties by decreasing sequence number. ++class InternalKeyComparator : public Comparator { ++ private: ++ const Comparator* user_comparator_; ++ public: ++ explicit InternalKeyComparator(const Comparator* c) : user_comparator_(c) { } ++ virtual const char* Name() const; ++ virtual int Compare(const Slice& a, const Slice& b) const; ++ virtual void FindShortestSeparator( ++ std::string* start, ++ const Slice& limit) const; ++ virtual void FindShortSuccessor(std::string* key) const; ++ ++ const Comparator* user_comparator() const { return user_comparator_; } ++ ++ int Compare(const InternalKey& a, const InternalKey& b) const; ++}; ++ ++// Filter policy wrapper that converts from internal keys to user keys ++class InternalFilterPolicy : public FilterPolicy { ++ private: ++ const FilterPolicy* const user_policy_; ++ public: ++ explicit InternalFilterPolicy(const FilterPolicy* p) : user_policy_(p) { } ++ virtual const char* Name() const; ++ virtual void CreateFilter(const Slice* keys, int n, std::string* dst) const; ++ virtual bool KeyMayMatch(const Slice& key, const Slice& filter) const; ++}; ++ ++// Modules in this directory should keep internal keys wrapped inside ++// the following class instead of plain strings so that we do not ++// incorrectly use string comparisons instead of an InternalKeyComparator. ++class InternalKey { ++ private: ++ std::string rep_; ++ public: ++ InternalKey() { } // Leave rep_ as empty to indicate it is invalid ++ InternalKey(const Slice& user_key, SequenceNumber s, ValueType t) { ++ AppendInternalKey(&rep_, ParsedInternalKey(user_key, s, t)); ++ } ++ ++ void DecodeFrom(const Slice& s) { rep_.assign(s.data(), s.size()); } ++ Slice Encode() const { ++ assert(!rep_.empty()); ++ return rep_; ++ } ++ ++ Slice user_key() const { return ExtractUserKey(rep_); } ++ ++ void SetFrom(const ParsedInternalKey& p) { ++ rep_.clear(); ++ AppendInternalKey(&rep_, p); ++ } ++ ++ void Clear() { rep_.clear(); } ++ ++ std::string DebugString() const; ++}; ++ ++inline int InternalKeyComparator::Compare( ++ const InternalKey& a, const InternalKey& b) const { ++ return Compare(a.Encode(), b.Encode()); ++} ++ ++inline bool ParseInternalKey(const Slice& internal_key, ++ ParsedInternalKey* result) { ++ const size_t n = internal_key.size(); ++ if (n < 8) return false; ++ uint64_t num = DecodeFixed64(internal_key.data() + n - 8); ++ unsigned char c = num & 0xff; ++ result->sequence = num >> 8; ++ result->type = static_cast(c); ++ result->user_key = Slice(internal_key.data(), n - 8); ++ return (c <= static_cast(kTypeValue)); ++} ++ ++// A helper class useful for DBImpl::Get() ++class LookupKey { ++ public: ++ // Initialize *this for looking up user_key at a snapshot with ++ // the specified sequence number. ++ LookupKey(const Slice& user_key, SequenceNumber sequence); ++ ++ ~LookupKey(); ++ ++ // Return a key suitable for lookup in a MemTable. ++ Slice memtable_key() const { return Slice(start_, end_ - start_); } ++ ++ // Return an internal key (suitable for passing to an internal iterator) ++ Slice internal_key() const { return Slice(kstart_, end_ - kstart_); } ++ ++ // Return the user key ++ Slice user_key() const { return Slice(kstart_, end_ - kstart_ - 8); } ++ ++ private: ++ // We construct a char array of the form: ++ // klength varint32 <-- start_ ++ // userkey char[klength] <-- kstart_ ++ // tag uint64 ++ // <-- end_ ++ // The array is a suitable MemTable key. ++ // The suffix starting with "userkey" can be used as an InternalKey. ++ const char* start_; ++ const char* kstart_; ++ const char* end_; ++ char space_[200]; // Avoid allocation for short keys ++ ++ // No copying allowed ++ LookupKey(const LookupKey&); ++ void operator=(const LookupKey&); ++}; ++ ++inline LookupKey::~LookupKey() { ++ if (start_ != space_) delete[] start_; ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_DBFORMAT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat_test.cc +new file mode 100644 +index 0000000..5d82f5d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat_test.cc +@@ -0,0 +1,112 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/dbformat.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++static std::string IKey(const std::string& user_key, ++ uint64_t seq, ++ ValueType vt) { ++ std::string encoded; ++ AppendInternalKey(&encoded, ParsedInternalKey(user_key, seq, vt)); ++ return encoded; ++} ++ ++static std::string Shorten(const std::string& s, const std::string& l) { ++ std::string result = s; ++ InternalKeyComparator(BytewiseComparator()).FindShortestSeparator(&result, l); ++ return result; ++} ++ ++static std::string ShortSuccessor(const std::string& s) { ++ std::string result = s; ++ InternalKeyComparator(BytewiseComparator()).FindShortSuccessor(&result); ++ return result; ++} ++ ++static void TestKey(const std::string& key, ++ uint64_t seq, ++ ValueType vt) { ++ std::string encoded = IKey(key, seq, vt); ++ ++ Slice in(encoded); ++ ParsedInternalKey decoded("", 0, kTypeValue); ++ ++ ASSERT_TRUE(ParseInternalKey(in, &decoded)); ++ ASSERT_EQ(key, decoded.user_key.ToString()); ++ ASSERT_EQ(seq, decoded.sequence); ++ ASSERT_EQ(vt, decoded.type); ++ ++ ASSERT_TRUE(!ParseInternalKey(Slice("bar"), &decoded)); ++} ++ ++class FormatTest { }; ++ ++TEST(FormatTest, InternalKey_EncodeDecode) { ++ const char* keys[] = { "", "k", "hello", "longggggggggggggggggggggg" }; ++ const uint64_t seq[] = { ++ 1, 2, 3, ++ (1ull << 8) - 1, 1ull << 8, (1ull << 8) + 1, ++ (1ull << 16) - 1, 1ull << 16, (1ull << 16) + 1, ++ (1ull << 32) - 1, 1ull << 32, (1ull << 32) + 1 ++ }; ++ for (int k = 0; k < sizeof(keys) / sizeof(keys[0]); k++) { ++ for (int s = 0; s < sizeof(seq) / sizeof(seq[0]); s++) { ++ TestKey(keys[k], seq[s], kTypeValue); ++ TestKey("hello", 1, kTypeDeletion); ++ } ++ } ++} ++ ++TEST(FormatTest, InternalKeyShortSeparator) { ++ // When user keys are same ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("foo", 99, kTypeValue))); ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("foo", 101, kTypeValue))); ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("foo", 100, kTypeValue))); ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("foo", 100, kTypeDeletion))); ++ ++ // When user keys are misordered ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("bar", 99, kTypeValue))); ++ ++ // When user keys are different, but correctly ordered ++ ASSERT_EQ(IKey("g", kMaxSequenceNumber, kValueTypeForSeek), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("hello", 200, kTypeValue))); ++ ++ // When start user key is prefix of limit user key ++ ASSERT_EQ(IKey("foo", 100, kTypeValue), ++ Shorten(IKey("foo", 100, kTypeValue), ++ IKey("foobar", 200, kTypeValue))); ++ ++ // When limit user key is prefix of start user key ++ ASSERT_EQ(IKey("foobar", 100, kTypeValue), ++ Shorten(IKey("foobar", 100, kTypeValue), ++ IKey("foo", 200, kTypeValue))); ++} ++ ++TEST(FormatTest, InternalKeyShortestSuccessor) { ++ ASSERT_EQ(IKey("g", kMaxSequenceNumber, kValueTypeForSeek), ++ ShortSuccessor(IKey("foo", 100, kTypeValue))); ++ ASSERT_EQ(IKey("\xff\xff", 100, kTypeValue), ++ ShortSuccessor(IKey("\xff\xff", 100, kTypeValue))); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dumpfile.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dumpfile.cc +new file mode 100644 +index 0000000..61c47c2 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dumpfile.cc +@@ -0,0 +1,225 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include "db/dbformat.h" ++#include "db/filename.h" ++#include "db/log_reader.h" ++#include "db/version_edit.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/env.h" ++#include "leveldb/iterator.h" ++#include "leveldb/options.h" ++#include "leveldb/status.h" ++#include "leveldb/table.h" ++#include "leveldb/write_batch.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++namespace { ++ ++bool GuessType(const std::string& fname, FileType* type) { ++ size_t pos = fname.rfind('/'); ++ std::string basename; ++ if (pos == std::string::npos) { ++ basename = fname; ++ } else { ++ basename = std::string(fname.data() + pos + 1, fname.size() - pos - 1); ++ } ++ uint64_t ignored; ++ return ParseFileName(basename, &ignored, type); ++} ++ ++// Notified when log reader encounters corruption. ++class CorruptionReporter : public log::Reader::Reporter { ++ public: ++ WritableFile* dst_; ++ virtual void Corruption(size_t bytes, const Status& status) { ++ std::string r = "corruption: "; ++ AppendNumberTo(&r, bytes); ++ r += " bytes; "; ++ r += status.ToString(); ++ r.push_back('\n'); ++ dst_->Append(r); ++ } ++}; ++ ++// Print contents of a log file. (*func)() is called on every record. ++Status PrintLogContents(Env* env, const std::string& fname, ++ void (*func)(uint64_t, Slice, WritableFile*), ++ WritableFile* dst) { ++ SequentialFile* file; ++ Status s = env->NewSequentialFile(fname, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ CorruptionReporter reporter; ++ reporter.dst_ = dst; ++ log::Reader reader(file, &reporter, true, 0); ++ Slice record; ++ std::string scratch; ++ while (reader.ReadRecord(&record, &scratch)) { ++ (*func)(reader.LastRecordOffset(), record, dst); ++ } ++ delete file; ++ return Status::OK(); ++} ++ ++// Called on every item found in a WriteBatch. ++class WriteBatchItemPrinter : public WriteBatch::Handler { ++ public: ++ WritableFile* dst_; ++ virtual void Put(const Slice& key, const Slice& value) { ++ std::string r = " put '"; ++ AppendEscapedStringTo(&r, key); ++ r += "' '"; ++ AppendEscapedStringTo(&r, value); ++ r += "'\n"; ++ dst_->Append(r); ++ } ++ virtual void Delete(const Slice& key) { ++ std::string r = " del '"; ++ AppendEscapedStringTo(&r, key); ++ r += "'\n"; ++ dst_->Append(r); ++ } ++}; ++ ++ ++// Called on every log record (each one of which is a WriteBatch) ++// found in a kLogFile. ++static void WriteBatchPrinter(uint64_t pos, Slice record, WritableFile* dst) { ++ std::string r = "--- offset "; ++ AppendNumberTo(&r, pos); ++ r += "; "; ++ if (record.size() < 12) { ++ r += "log record length "; ++ AppendNumberTo(&r, record.size()); ++ r += " is too small\n"; ++ dst->Append(r); ++ return; ++ } ++ WriteBatch batch; ++ WriteBatchInternal::SetContents(&batch, record); ++ r += "sequence "; ++ AppendNumberTo(&r, WriteBatchInternal::Sequence(&batch)); ++ r.push_back('\n'); ++ dst->Append(r); ++ WriteBatchItemPrinter batch_item_printer; ++ batch_item_printer.dst_ = dst; ++ Status s = batch.Iterate(&batch_item_printer); ++ if (!s.ok()) { ++ dst->Append(" error: " + s.ToString() + "\n"); ++ } ++} ++ ++Status DumpLog(Env* env, const std::string& fname, WritableFile* dst) { ++ return PrintLogContents(env, fname, WriteBatchPrinter, dst); ++} ++ ++// Called on every log record (each one of which is a WriteBatch) ++// found in a kDescriptorFile. ++static void VersionEditPrinter(uint64_t pos, Slice record, WritableFile* dst) { ++ std::string r = "--- offset "; ++ AppendNumberTo(&r, pos); ++ r += "; "; ++ VersionEdit edit; ++ Status s = edit.DecodeFrom(record); ++ if (!s.ok()) { ++ r += s.ToString(); ++ r.push_back('\n'); ++ } else { ++ r += edit.DebugString(); ++ } ++ dst->Append(r); ++} ++ ++Status DumpDescriptor(Env* env, const std::string& fname, WritableFile* dst) { ++ return PrintLogContents(env, fname, VersionEditPrinter, dst); ++} ++ ++Status DumpTable(Env* env, const std::string& fname, WritableFile* dst) { ++ uint64_t file_size; ++ RandomAccessFile* file = NULL; ++ Table* table = NULL; ++ Status s = env->GetFileSize(fname, &file_size); ++ if (s.ok()) { ++ s = env->NewRandomAccessFile(fname, &file); ++ } ++ if (s.ok()) { ++ // We use the default comparator, which may or may not match the ++ // comparator used in this database. However this should not cause ++ // problems since we only use Table operations that do not require ++ // any comparisons. In particular, we do not call Seek or Prev. ++ s = Table::Open(Options(), file, file_size, &table); ++ } ++ if (!s.ok()) { ++ delete table; ++ delete file; ++ return s; ++ } ++ ++ ReadOptions ro; ++ ro.fill_cache = false; ++ Iterator* iter = table->NewIterator(ro); ++ std::string r; ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ r.clear(); ++ ParsedInternalKey key; ++ if (!ParseInternalKey(iter->key(), &key)) { ++ r = "badkey '"; ++ AppendEscapedStringTo(&r, iter->key()); ++ r += "' => '"; ++ AppendEscapedStringTo(&r, iter->value()); ++ r += "'\n"; ++ dst->Append(r); ++ } else { ++ r = "'"; ++ AppendEscapedStringTo(&r, key.user_key); ++ r += "' @ "; ++ AppendNumberTo(&r, key.sequence); ++ r += " : "; ++ if (key.type == kTypeDeletion) { ++ r += "del"; ++ } else if (key.type == kTypeValue) { ++ r += "val"; ++ } else { ++ AppendNumberTo(&r, key.type); ++ } ++ r += " => '"; ++ AppendEscapedStringTo(&r, iter->value()); ++ r += "'\n"; ++ dst->Append(r); ++ } ++ } ++ s = iter->status(); ++ if (!s.ok()) { ++ dst->Append("iterator error: " + s.ToString() + "\n"); ++ } ++ ++ delete iter; ++ delete table; ++ delete file; ++ return Status::OK(); ++} ++ ++} // namespace ++ ++Status DumpFile(Env* env, const std::string& fname, WritableFile* dst) { ++ FileType ftype; ++ if (!GuessType(fname, &ftype)) { ++ return Status::InvalidArgument(fname + ": unknown file type"); ++ } ++ switch (ftype) { ++ case kLogFile: return DumpLog(env, fname, dst); ++ case kDescriptorFile: return DumpDescriptor(env, fname, dst); ++ case kTableFile: return DumpTable(env, fname, dst); ++ default: ++ break; ++ } ++ return Status::InvalidArgument(fname + ": not a dump-able file type"); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/fault_injection_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/fault_injection_test.cc +new file mode 100644 +index 0000000..875dfe8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/fault_injection_test.cc +@@ -0,0 +1,554 @@ ++// Copyright 2014 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// This test uses a custom Env to keep track of the state of a filesystem as of ++// the last "sync". It then checks for data loss errors by purposely dropping ++// file data (or entire files) not protected by a "sync". ++ ++#include "leveldb/db.h" ++ ++#include ++#include ++#include "db/db_impl.h" ++#include "db/filename.h" ++#include "db/log_format.h" ++#include "db/version_set.h" ++#include "leveldb/cache.h" ++#include "leveldb/env.h" ++#include "leveldb/table.h" ++#include "leveldb/write_batch.h" ++#include "util/logging.h" ++#include "util/mutexlock.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++static const int kValueSize = 1000; ++static const int kMaxNumValues = 2000; ++static const size_t kNumIterations = 3; ++ ++class FaultInjectionTestEnv; ++ ++namespace { ++ ++// Assume a filename, and not a directory name like "/foo/bar/" ++static std::string GetDirName(const std::string filename) { ++ size_t found = filename.find_last_of("/\\"); ++ if (found == std::string::npos) { ++ return ""; ++ } else { ++ return filename.substr(0, found); ++ } ++} ++ ++Status SyncDir(const std::string& dir) { ++ // As this is a test it isn't required to *actually* sync this directory. ++ return Status::OK(); ++} ++ ++// A basic file truncation function suitable for this test. ++Status Truncate(const std::string& filename, uint64_t length) { ++ leveldb::Env* env = leveldb::Env::Default(); ++ ++ SequentialFile* orig_file; ++ Status s = env->NewSequentialFile(filename, &orig_file); ++ if (!s.ok()) ++ return s; ++ ++ char* scratch = new char[length]; ++ leveldb::Slice result; ++ s = orig_file->Read(length, &result, scratch); ++ delete orig_file; ++ if (s.ok()) { ++ std::string tmp_name = GetDirName(filename) + "/truncate.tmp"; ++ WritableFile* tmp_file; ++ s = env->NewWritableFile(tmp_name, &tmp_file); ++ if (s.ok()) { ++ s = tmp_file->Append(result); ++ delete tmp_file; ++ if (s.ok()) { ++ s = env->RenameFile(tmp_name, filename); ++ } else { ++ env->DeleteFile(tmp_name); ++ } ++ } ++ } ++ ++ delete[] scratch; ++ ++ return s; ++} ++ ++struct FileState { ++ std::string filename_; ++ ssize_t pos_; ++ ssize_t pos_at_last_sync_; ++ ssize_t pos_at_last_flush_; ++ ++ FileState(const std::string& filename) ++ : filename_(filename), ++ pos_(-1), ++ pos_at_last_sync_(-1), ++ pos_at_last_flush_(-1) { } ++ ++ FileState() : pos_(-1), pos_at_last_sync_(-1), pos_at_last_flush_(-1) {} ++ ++ bool IsFullySynced() const { return pos_ <= 0 || pos_ == pos_at_last_sync_; } ++ ++ Status DropUnsyncedData() const; ++}; ++ ++} // anonymous namespace ++ ++// A wrapper around WritableFile which informs another Env whenever this file ++// is written to or sync'ed. ++class TestWritableFile : public WritableFile { ++ public: ++ TestWritableFile(const FileState& state, ++ WritableFile* f, ++ FaultInjectionTestEnv* env); ++ virtual ~TestWritableFile(); ++ virtual Status Append(const Slice& data); ++ virtual Status Close(); ++ virtual Status Flush(); ++ virtual Status Sync(); ++ ++ private: ++ FileState state_; ++ WritableFile* target_; ++ bool writable_file_opened_; ++ FaultInjectionTestEnv* env_; ++ ++ Status SyncParent(); ++}; ++ ++class FaultInjectionTestEnv : public EnvWrapper { ++ public: ++ FaultInjectionTestEnv() : EnvWrapper(Env::Default()), filesystem_active_(true) {} ++ virtual ~FaultInjectionTestEnv() { } ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result); ++ virtual Status NewAppendableFile(const std::string& fname, ++ WritableFile** result); ++ virtual Status DeleteFile(const std::string& f); ++ virtual Status RenameFile(const std::string& s, const std::string& t); ++ ++ void WritableFileClosed(const FileState& state); ++ Status DropUnsyncedFileData(); ++ Status DeleteFilesCreatedAfterLastDirSync(); ++ void DirWasSynced(); ++ bool IsFileCreatedSinceLastDirSync(const std::string& filename); ++ void ResetState(); ++ void UntrackFile(const std::string& f); ++ // Setting the filesystem to inactive is the test equivalent to simulating a ++ // system reset. Setting to inactive will freeze our saved filesystem state so ++ // that it will stop being recorded. It can then be reset back to the state at ++ // the time of the reset. ++ bool IsFilesystemActive() const { return filesystem_active_; } ++ void SetFilesystemActive(bool active) { filesystem_active_ = active; } ++ ++ private: ++ port::Mutex mutex_; ++ std::map db_file_state_; ++ std::set new_files_since_last_dir_sync_; ++ bool filesystem_active_; // Record flushes, syncs, writes ++}; ++ ++TestWritableFile::TestWritableFile(const FileState& state, ++ WritableFile* f, ++ FaultInjectionTestEnv* env) ++ : state_(state), ++ target_(f), ++ writable_file_opened_(true), ++ env_(env) { ++ assert(f != NULL); ++} ++ ++TestWritableFile::~TestWritableFile() { ++ if (writable_file_opened_) { ++ Close(); ++ } ++ delete target_; ++} ++ ++Status TestWritableFile::Append(const Slice& data) { ++ Status s = target_->Append(data); ++ if (s.ok() && env_->IsFilesystemActive()) { ++ state_.pos_ += data.size(); ++ } ++ return s; ++} ++ ++Status TestWritableFile::Close() { ++ writable_file_opened_ = false; ++ Status s = target_->Close(); ++ if (s.ok()) { ++ env_->WritableFileClosed(state_); ++ } ++ return s; ++} ++ ++Status TestWritableFile::Flush() { ++ Status s = target_->Flush(); ++ if (s.ok() && env_->IsFilesystemActive()) { ++ state_.pos_at_last_flush_ = state_.pos_; ++ } ++ return s; ++} ++ ++Status TestWritableFile::SyncParent() { ++ Status s = SyncDir(GetDirName(state_.filename_)); ++ if (s.ok()) { ++ env_->DirWasSynced(); ++ } ++ return s; ++} ++ ++Status TestWritableFile::Sync() { ++ if (!env_->IsFilesystemActive()) { ++ return Status::OK(); ++ } ++ // Ensure new files referred to by the manifest are in the filesystem. ++ Status s = target_->Sync(); ++ if (s.ok()) { ++ state_.pos_at_last_sync_ = state_.pos_; ++ } ++ if (env_->IsFileCreatedSinceLastDirSync(state_.filename_)) { ++ Status ps = SyncParent(); ++ if (s.ok() && !ps.ok()) { ++ s = ps; ++ } ++ } ++ return s; ++} ++ ++Status FaultInjectionTestEnv::NewWritableFile(const std::string& fname, ++ WritableFile** result) { ++ WritableFile* actual_writable_file; ++ Status s = target()->NewWritableFile(fname, &actual_writable_file); ++ if (s.ok()) { ++ FileState state(fname); ++ state.pos_ = 0; ++ *result = new TestWritableFile(state, actual_writable_file, this); ++ // NewWritableFile doesn't append to files, so if the same file is ++ // opened again then it will be truncated - so forget our saved ++ // state. ++ UntrackFile(fname); ++ MutexLock l(&mutex_); ++ new_files_since_last_dir_sync_.insert(fname); ++ } ++ return s; ++} ++ ++Status FaultInjectionTestEnv::NewAppendableFile(const std::string& fname, ++ WritableFile** result) { ++ WritableFile* actual_writable_file; ++ Status s = target()->NewAppendableFile(fname, &actual_writable_file); ++ if (s.ok()) { ++ FileState state(fname); ++ state.pos_ = 0; ++ { ++ MutexLock l(&mutex_); ++ if (db_file_state_.count(fname) == 0) { ++ new_files_since_last_dir_sync_.insert(fname); ++ } else { ++ state = db_file_state_[fname]; ++ } ++ } ++ *result = new TestWritableFile(state, actual_writable_file, this); ++ } ++ return s; ++} ++ ++Status FaultInjectionTestEnv::DropUnsyncedFileData() { ++ Status s; ++ MutexLock l(&mutex_); ++ for (std::map::const_iterator it = ++ db_file_state_.begin(); ++ s.ok() && it != db_file_state_.end(); ++it) { ++ const FileState& state = it->second; ++ if (!state.IsFullySynced()) { ++ s = state.DropUnsyncedData(); ++ } ++ } ++ return s; ++} ++ ++void FaultInjectionTestEnv::DirWasSynced() { ++ MutexLock l(&mutex_); ++ new_files_since_last_dir_sync_.clear(); ++} ++ ++bool FaultInjectionTestEnv::IsFileCreatedSinceLastDirSync( ++ const std::string& filename) { ++ MutexLock l(&mutex_); ++ return new_files_since_last_dir_sync_.find(filename) != ++ new_files_since_last_dir_sync_.end(); ++} ++ ++void FaultInjectionTestEnv::UntrackFile(const std::string& f) { ++ MutexLock l(&mutex_); ++ db_file_state_.erase(f); ++ new_files_since_last_dir_sync_.erase(f); ++} ++ ++Status FaultInjectionTestEnv::DeleteFile(const std::string& f) { ++ Status s = EnvWrapper::DeleteFile(f); ++ ASSERT_OK(s); ++ if (s.ok()) { ++ UntrackFile(f); ++ } ++ return s; ++} ++ ++Status FaultInjectionTestEnv::RenameFile(const std::string& s, ++ const std::string& t) { ++ Status ret = EnvWrapper::RenameFile(s, t); ++ ++ if (ret.ok()) { ++ MutexLock l(&mutex_); ++ if (db_file_state_.find(s) != db_file_state_.end()) { ++ db_file_state_[t] = db_file_state_[s]; ++ db_file_state_.erase(s); ++ } ++ ++ if (new_files_since_last_dir_sync_.erase(s) != 0) { ++ assert(new_files_since_last_dir_sync_.find(t) == ++ new_files_since_last_dir_sync_.end()); ++ new_files_since_last_dir_sync_.insert(t); ++ } ++ } ++ ++ return ret; ++} ++ ++void FaultInjectionTestEnv::ResetState() { ++ // Since we are not destroying the database, the existing files ++ // should keep their recorded synced/flushed state. Therefore ++ // we do not reset db_file_state_ and new_files_since_last_dir_sync_. ++ MutexLock l(&mutex_); ++ SetFilesystemActive(true); ++} ++ ++Status FaultInjectionTestEnv::DeleteFilesCreatedAfterLastDirSync() { ++ // Because DeleteFile access this container make a copy to avoid deadlock ++ mutex_.Lock(); ++ std::set new_files(new_files_since_last_dir_sync_.begin(), ++ new_files_since_last_dir_sync_.end()); ++ mutex_.Unlock(); ++ Status s; ++ std::set::const_iterator it; ++ for (it = new_files.begin(); s.ok() && it != new_files.end(); ++it) { ++ s = DeleteFile(*it); ++ } ++ return s; ++} ++ ++void FaultInjectionTestEnv::WritableFileClosed(const FileState& state) { ++ MutexLock l(&mutex_); ++ db_file_state_[state.filename_] = state; ++} ++ ++Status FileState::DropUnsyncedData() const { ++ ssize_t sync_pos = pos_at_last_sync_ == -1 ? 0 : pos_at_last_sync_; ++ return Truncate(filename_, sync_pos); ++} ++ ++class FaultInjectionTest { ++ public: ++ enum ExpectedVerifResult { VAL_EXPECT_NO_ERROR, VAL_EXPECT_ERROR }; ++ enum ResetMethod { RESET_DROP_UNSYNCED_DATA, RESET_DELETE_UNSYNCED_FILES }; ++ ++ FaultInjectionTestEnv* env_; ++ std::string dbname_; ++ Cache* tiny_cache_; ++ Options options_; ++ DB* db_; ++ ++ FaultInjectionTest() ++ : env_(new FaultInjectionTestEnv), ++ tiny_cache_(NewLRUCache(100)), ++ db_(NULL) { ++ dbname_ = test::TmpDir() + "/fault_test"; ++ DestroyDB(dbname_, Options()); // Destroy any db from earlier run ++ options_.reuse_logs = true; ++ options_.env = env_; ++ options_.paranoid_checks = true; ++ options_.block_cache = tiny_cache_; ++ options_.create_if_missing = true; ++ } ++ ++ ~FaultInjectionTest() { ++ CloseDB(); ++ DestroyDB(dbname_, Options()); ++ delete tiny_cache_; ++ delete env_; ++ } ++ ++ void ReuseLogs(bool reuse) { ++ options_.reuse_logs = reuse; ++ } ++ ++ void Build(int start_idx, int num_vals) { ++ std::string key_space, value_space; ++ WriteBatch batch; ++ for (int i = start_idx; i < start_idx + num_vals; i++) { ++ Slice key = Key(i, &key_space); ++ batch.Clear(); ++ batch.Put(key, Value(i, &value_space)); ++ WriteOptions options; ++ ASSERT_OK(db_->Write(options, &batch)); ++ } ++ } ++ ++ Status ReadValue(int i, std::string* val) const { ++ std::string key_space, value_space; ++ Slice key = Key(i, &key_space); ++ Value(i, &value_space); ++ ReadOptions options; ++ return db_->Get(options, key, val); ++ } ++ ++ Status Verify(int start_idx, int num_vals, ++ ExpectedVerifResult expected) const { ++ std::string val; ++ std::string value_space; ++ Status s; ++ for (int i = start_idx; i < start_idx + num_vals && s.ok(); i++) { ++ Value(i, &value_space); ++ s = ReadValue(i, &val); ++ if (expected == VAL_EXPECT_NO_ERROR) { ++ if (s.ok()) { ++ ASSERT_EQ(value_space, val); ++ } ++ } else if (s.ok()) { ++ fprintf(stderr, "Expected an error at %d, but was OK\n", i); ++ s = Status::IOError(dbname_, "Expected value error:"); ++ } else { ++ s = Status::OK(); // An expected error ++ } ++ } ++ return s; ++ } ++ ++ // Return the ith key ++ Slice Key(int i, std::string* storage) const { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%016d", i); ++ storage->assign(buf, strlen(buf)); ++ return Slice(*storage); ++ } ++ ++ // Return the value to associate with the specified key ++ Slice Value(int k, std::string* storage) const { ++ Random r(k); ++ return test::RandomString(&r, kValueSize, storage); ++ } ++ ++ Status OpenDB() { ++ delete db_; ++ db_ = NULL; ++ env_->ResetState(); ++ return DB::Open(options_, dbname_, &db_); ++ } ++ ++ void CloseDB() { ++ delete db_; ++ db_ = NULL; ++ } ++ ++ void DeleteAllData() { ++ Iterator* iter = db_->NewIterator(ReadOptions()); ++ WriteOptions options; ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ ASSERT_OK(db_->Delete(WriteOptions(), iter->key())); ++ } ++ ++ delete iter; ++ } ++ ++ void ResetDBState(ResetMethod reset_method) { ++ switch (reset_method) { ++ case RESET_DROP_UNSYNCED_DATA: ++ ASSERT_OK(env_->DropUnsyncedFileData()); ++ break; ++ case RESET_DELETE_UNSYNCED_FILES: ++ ASSERT_OK(env_->DeleteFilesCreatedAfterLastDirSync()); ++ break; ++ default: ++ assert(false); ++ } ++ } ++ ++ void PartialCompactTestPreFault(int num_pre_sync, int num_post_sync) { ++ DeleteAllData(); ++ Build(0, num_pre_sync); ++ db_->CompactRange(NULL, NULL); ++ Build(num_pre_sync, num_post_sync); ++ } ++ ++ void PartialCompactTestReopenWithFault(ResetMethod reset_method, ++ int num_pre_sync, ++ int num_post_sync) { ++ env_->SetFilesystemActive(false); ++ CloseDB(); ++ ResetDBState(reset_method); ++ ASSERT_OK(OpenDB()); ++ ASSERT_OK(Verify(0, num_pre_sync, FaultInjectionTest::VAL_EXPECT_NO_ERROR)); ++ ASSERT_OK(Verify(num_pre_sync, num_post_sync, FaultInjectionTest::VAL_EXPECT_ERROR)); ++ } ++ ++ void NoWriteTestPreFault() { ++ } ++ ++ void NoWriteTestReopenWithFault(ResetMethod reset_method) { ++ CloseDB(); ++ ResetDBState(reset_method); ++ ASSERT_OK(OpenDB()); ++ } ++ ++ void DoTest() { ++ Random rnd(0); ++ ASSERT_OK(OpenDB()); ++ for (size_t idx = 0; idx < kNumIterations; idx++) { ++ int num_pre_sync = rnd.Uniform(kMaxNumValues); ++ int num_post_sync = rnd.Uniform(kMaxNumValues); ++ ++ PartialCompactTestPreFault(num_pre_sync, num_post_sync); ++ PartialCompactTestReopenWithFault(RESET_DROP_UNSYNCED_DATA, ++ num_pre_sync, ++ num_post_sync); ++ ++ NoWriteTestPreFault(); ++ NoWriteTestReopenWithFault(RESET_DROP_UNSYNCED_DATA); ++ ++ PartialCompactTestPreFault(num_pre_sync, num_post_sync); ++ // No new files created so we expect all values since no files will be ++ // dropped. ++ PartialCompactTestReopenWithFault(RESET_DELETE_UNSYNCED_FILES, ++ num_pre_sync + num_post_sync, ++ 0); ++ ++ NoWriteTestPreFault(); ++ NoWriteTestReopenWithFault(RESET_DELETE_UNSYNCED_FILES); ++ } ++ } ++}; ++ ++TEST(FaultInjectionTest, FaultTestNoLogReuse) { ++ ReuseLogs(false); ++ DoTest(); ++} ++ ++TEST(FaultInjectionTest, FaultTestWithLogReuse) { ++ ReuseLogs(true); ++ DoTest(); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.cc +new file mode 100644 +index 0000000..da32946 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.cc +@@ -0,0 +1,144 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include "db/filename.h" ++#include "db/dbformat.h" ++#include "leveldb/env.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++// A utility routine: write "data" to the named file and Sync() it. ++extern Status WriteStringToFileSync(Env* env, const Slice& data, ++ const std::string& fname); ++ ++static std::string MakeFileName(const std::string& name, uint64_t number, ++ const char* suffix) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "/%06llu.%s", ++ static_cast(number), ++ suffix); ++ return name + buf; ++} ++ ++std::string LogFileName(const std::string& name, uint64_t number) { ++ assert(number > 0); ++ return MakeFileName(name, number, "log"); ++} ++ ++std::string TableFileName(const std::string& name, uint64_t number) { ++ assert(number > 0); ++ return MakeFileName(name, number, "ldb"); ++} ++ ++std::string SSTTableFileName(const std::string& name, uint64_t number) { ++ assert(number > 0); ++ return MakeFileName(name, number, "sst"); ++} ++ ++std::string DescriptorFileName(const std::string& dbname, uint64_t number) { ++ assert(number > 0); ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "/MANIFEST-%06llu", ++ static_cast(number)); ++ return dbname + buf; ++} ++ ++std::string CurrentFileName(const std::string& dbname) { ++ return dbname + "/CURRENT"; ++} ++ ++std::string LockFileName(const std::string& dbname) { ++ return dbname + "/LOCK"; ++} ++ ++std::string TempFileName(const std::string& dbname, uint64_t number) { ++ assert(number > 0); ++ return MakeFileName(dbname, number, "dbtmp"); ++} ++ ++std::string InfoLogFileName(const std::string& dbname) { ++ return dbname + "/LOG"; ++} ++ ++// Return the name of the old info log file for "dbname". ++std::string OldInfoLogFileName(const std::string& dbname) { ++ return dbname + "/LOG.old"; ++} ++ ++ ++// Owned filenames have the form: ++// dbname/CURRENT ++// dbname/LOCK ++// dbname/LOG ++// dbname/LOG.old ++// dbname/MANIFEST-[0-9]+ ++// dbname/[0-9]+.(log|sst|ldb) ++bool ParseFileName(const std::string& fname, ++ uint64_t* number, ++ FileType* type) { ++ Slice rest(fname); ++ if (rest == "CURRENT") { ++ *number = 0; ++ *type = kCurrentFile; ++ } else if (rest == "LOCK") { ++ *number = 0; ++ *type = kDBLockFile; ++ } else if (rest == "LOG" || rest == "LOG.old") { ++ *number = 0; ++ *type = kInfoLogFile; ++ } else if (rest.starts_with("MANIFEST-")) { ++ rest.remove_prefix(strlen("MANIFEST-")); ++ uint64_t num; ++ if (!ConsumeDecimalNumber(&rest, &num)) { ++ return false; ++ } ++ if (!rest.empty()) { ++ return false; ++ } ++ *type = kDescriptorFile; ++ *number = num; ++ } else { ++ // Avoid strtoull() to keep filename format independent of the ++ // current locale ++ uint64_t num; ++ if (!ConsumeDecimalNumber(&rest, &num)) { ++ return false; ++ } ++ Slice suffix = rest; ++ if (suffix == Slice(".log")) { ++ *type = kLogFile; ++ } else if (suffix == Slice(".sst") || suffix == Slice(".ldb")) { ++ *type = kTableFile; ++ } else if (suffix == Slice(".dbtmp")) { ++ *type = kTempFile; ++ } else { ++ return false; ++ } ++ *number = num; ++ } ++ return true; ++} ++ ++Status SetCurrentFile(Env* env, const std::string& dbname, ++ uint64_t descriptor_number) { ++ // Remove leading "dbname/" and add newline to manifest file name ++ std::string manifest = DescriptorFileName(dbname, descriptor_number); ++ Slice contents = manifest; ++ assert(contents.starts_with(dbname + "/")); ++ contents.remove_prefix(dbname.size() + 1); ++ std::string tmp = TempFileName(dbname, descriptor_number); ++ Status s = WriteStringToFileSync(env, contents.ToString() + "\n", tmp); ++ if (s.ok()) { ++ s = env->RenameFile(tmp, CurrentFileName(dbname)); ++ } ++ if (!s.ok()) { ++ env->DeleteFile(tmp); ++ } ++ return s; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.h +new file mode 100644 +index 0000000..87a7526 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.h +@@ -0,0 +1,85 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// File names used by DB code ++ ++#ifndef STORAGE_LEVELDB_DB_FILENAME_H_ ++#define STORAGE_LEVELDB_DB_FILENAME_H_ ++ ++#include ++#include ++#include "leveldb/slice.h" ++#include "leveldb/status.h" ++#include "port/port.h" ++ ++namespace leveldb { ++ ++class Env; ++ ++enum FileType { ++ kLogFile, ++ kDBLockFile, ++ kTableFile, ++ kDescriptorFile, ++ kCurrentFile, ++ kTempFile, ++ kInfoLogFile // Either the current one, or an old one ++}; ++ ++// Return the name of the log file with the specified number ++// in the db named by "dbname". The result will be prefixed with ++// "dbname". ++extern std::string LogFileName(const std::string& dbname, uint64_t number); ++ ++// Return the name of the sstable with the specified number ++// in the db named by "dbname". The result will be prefixed with ++// "dbname". ++extern std::string TableFileName(const std::string& dbname, uint64_t number); ++ ++// Return the legacy file name for an sstable with the specified number ++// in the db named by "dbname". The result will be prefixed with ++// "dbname". ++extern std::string SSTTableFileName(const std::string& dbname, uint64_t number); ++ ++// Return the name of the descriptor file for the db named by ++// "dbname" and the specified incarnation number. The result will be ++// prefixed with "dbname". ++extern std::string DescriptorFileName(const std::string& dbname, ++ uint64_t number); ++ ++// Return the name of the current file. This file contains the name ++// of the current manifest file. The result will be prefixed with ++// "dbname". ++extern std::string CurrentFileName(const std::string& dbname); ++ ++// Return the name of the lock file for the db named by ++// "dbname". The result will be prefixed with "dbname". ++extern std::string LockFileName(const std::string& dbname); ++ ++// Return the name of a temporary file owned by the db named "dbname". ++// The result will be prefixed with "dbname". ++extern std::string TempFileName(const std::string& dbname, uint64_t number); ++ ++// Return the name of the info log file for "dbname". ++extern std::string InfoLogFileName(const std::string& dbname); ++ ++// Return the name of the old info log file for "dbname". ++extern std::string OldInfoLogFileName(const std::string& dbname); ++ ++// If filename is a leveldb file, store the type of the file in *type. ++// The number encoded in the filename is stored in *number. If the ++// filename was successfully parsed, returns true. Else return false. ++extern bool ParseFileName(const std::string& filename, ++ uint64_t* number, ++ FileType* type); ++ ++// Make the CURRENT file point to the descriptor file with the ++// specified number. ++extern Status SetCurrentFile(Env* env, const std::string& dbname, ++ uint64_t descriptor_number); ++ ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_FILENAME_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename_test.cc +new file mode 100644 +index 0000000..a32556d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename_test.cc +@@ -0,0 +1,123 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/filename.h" ++ ++#include "db/dbformat.h" ++#include "port/port.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++class FileNameTest { }; ++ ++TEST(FileNameTest, Parse) { ++ Slice db; ++ FileType type; ++ uint64_t number; ++ ++ // Successful parses ++ static struct { ++ const char* fname; ++ uint64_t number; ++ FileType type; ++ } cases[] = { ++ { "100.log", 100, kLogFile }, ++ { "0.log", 0, kLogFile }, ++ { "0.sst", 0, kTableFile }, ++ { "0.ldb", 0, kTableFile }, ++ { "CURRENT", 0, kCurrentFile }, ++ { "LOCK", 0, kDBLockFile }, ++ { "MANIFEST-2", 2, kDescriptorFile }, ++ { "MANIFEST-7", 7, kDescriptorFile }, ++ { "LOG", 0, kInfoLogFile }, ++ { "LOG.old", 0, kInfoLogFile }, ++ { "18446744073709551615.log", 18446744073709551615ull, kLogFile }, ++ }; ++ for (int i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { ++ std::string f = cases[i].fname; ++ ASSERT_TRUE(ParseFileName(f, &number, &type)) << f; ++ ASSERT_EQ(cases[i].type, type) << f; ++ ASSERT_EQ(cases[i].number, number) << f; ++ } ++ ++ // Errors ++ static const char* errors[] = { ++ "", ++ "foo", ++ "foo-dx-100.log", ++ ".log", ++ "", ++ "manifest", ++ "CURREN", ++ "CURRENTX", ++ "MANIFES", ++ "MANIFEST", ++ "MANIFEST-", ++ "XMANIFEST-3", ++ "MANIFEST-3x", ++ "LOC", ++ "LOCKx", ++ "LO", ++ "LOGx", ++ "18446744073709551616.log", ++ "184467440737095516150.log", ++ "100", ++ "100.", ++ "100.lop" ++ }; ++ for (int i = 0; i < sizeof(errors) / sizeof(errors[0]); i++) { ++ std::string f = errors[i]; ++ ASSERT_TRUE(!ParseFileName(f, &number, &type)) << f; ++ } ++} ++ ++TEST(FileNameTest, Construction) { ++ uint64_t number; ++ FileType type; ++ std::string fname; ++ ++ fname = CurrentFileName("foo"); ++ ASSERT_EQ("foo/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(0, number); ++ ASSERT_EQ(kCurrentFile, type); ++ ++ fname = LockFileName("foo"); ++ ASSERT_EQ("foo/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(0, number); ++ ASSERT_EQ(kDBLockFile, type); ++ ++ fname = LogFileName("foo", 192); ++ ASSERT_EQ("foo/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(192, number); ++ ASSERT_EQ(kLogFile, type); ++ ++ fname = TableFileName("bar", 200); ++ ASSERT_EQ("bar/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(200, number); ++ ASSERT_EQ(kTableFile, type); ++ ++ fname = DescriptorFileName("bar", 100); ++ ASSERT_EQ("bar/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(100, number); ++ ASSERT_EQ(kDescriptorFile, type); ++ ++ fname = TempFileName("tmp", 999); ++ ASSERT_EQ("tmp/", std::string(fname.data(), 4)); ++ ASSERT_TRUE(ParseFileName(fname.c_str() + 4, &number, &type)); ++ ASSERT_EQ(999, number); ++ ASSERT_EQ(kTempFile, type); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/leveldbutil.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/leveldbutil.cc +new file mode 100644 +index 0000000..9f4b7dd +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/leveldbutil.cc +@@ -0,0 +1,64 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include "leveldb/dumpfile.h" ++#include "leveldb/env.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++namespace { ++ ++class StdoutPrinter : public WritableFile { ++ public: ++ virtual Status Append(const Slice& data) { ++ fwrite(data.data(), 1, data.size(), stdout); ++ return Status::OK(); ++ } ++ virtual Status Close() { return Status::OK(); } ++ virtual Status Flush() { return Status::OK(); } ++ virtual Status Sync() { return Status::OK(); } ++}; ++ ++bool HandleDumpCommand(Env* env, char** files, int num) { ++ StdoutPrinter printer; ++ bool ok = true; ++ for (int i = 0; i < num; i++) { ++ Status s = DumpFile(env, files[i], &printer); ++ if (!s.ok()) { ++ fprintf(stderr, "%s\n", s.ToString().c_str()); ++ ok = false; ++ } ++ } ++ return ok; ++} ++ ++} // namespace ++} // namespace leveldb ++ ++static void Usage() { ++ fprintf( ++ stderr, ++ "Usage: leveldbutil command...\n" ++ " dump files... -- dump contents of specified files\n" ++ ); ++} ++ ++int main(int argc, char** argv) { ++ leveldb::Env* env = leveldb::Env::Default(); ++ bool ok = true; ++ if (argc < 2) { ++ Usage(); ++ ok = false; ++ } else { ++ std::string command = argv[1]; ++ if (command == "dump") { ++ ok = leveldb::HandleDumpCommand(env, argv+2, argc-2); ++ } else { ++ Usage(); ++ ok = false; ++ } ++ } ++ return (ok ? 0 : 1); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_format.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_format.h +new file mode 100644 +index 0000000..356e69f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_format.h +@@ -0,0 +1,35 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Log format information shared by reader and writer. ++// See ../doc/log_format.md for more detail. ++ ++#ifndef STORAGE_LEVELDB_DB_LOG_FORMAT_H_ ++#define STORAGE_LEVELDB_DB_LOG_FORMAT_H_ ++ ++namespace leveldb { ++namespace log { ++ ++enum RecordType { ++ // Zero is reserved for preallocated files ++ kZeroType = 0, ++ ++ kFullType = 1, ++ ++ // For fragments ++ kFirstType = 2, ++ kMiddleType = 3, ++ kLastType = 4 ++}; ++static const int kMaxRecordType = kLastType; ++ ++static const int kBlockSize = 32768; ++ ++// Header is checksum (4 bytes), length (2 bytes), type (1 byte). ++static const int kHeaderSize = 4 + 2 + 1; ++ ++} // namespace log ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_LOG_FORMAT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.cc +new file mode 100644 +index 0000000..a6d3045 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.cc +@@ -0,0 +1,284 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/log_reader.h" ++ ++#include ++#include "leveldb/env.h" ++#include "util/coding.h" ++#include "util/crc32c.h" ++ ++namespace leveldb { ++namespace log { ++ ++Reader::Reporter::~Reporter() { ++} ++ ++Reader::Reader(SequentialFile* file, Reporter* reporter, bool checksum, ++ uint64_t initial_offset) ++ : file_(file), ++ reporter_(reporter), ++ checksum_(checksum), ++ backing_store_(new char[kBlockSize]), ++ buffer_(), ++ eof_(false), ++ last_record_offset_(0), ++ end_of_buffer_offset_(0), ++ initial_offset_(initial_offset), ++ resyncing_(initial_offset > 0) { ++} ++ ++Reader::~Reader() { ++ delete[] backing_store_; ++} ++ ++bool Reader::SkipToInitialBlock() { ++ size_t offset_in_block = initial_offset_ % kBlockSize; ++ uint64_t block_start_location = initial_offset_ - offset_in_block; ++ ++ // Don't search a block if we'd be in the trailer ++ if (offset_in_block > kBlockSize - 6) { ++ offset_in_block = 0; ++ block_start_location += kBlockSize; ++ } ++ ++ end_of_buffer_offset_ = block_start_location; ++ ++ // Skip to start of first block that can contain the initial record ++ if (block_start_location > 0) { ++ Status skip_status = file_->Skip(block_start_location); ++ if (!skip_status.ok()) { ++ ReportDrop(block_start_location, skip_status); ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++bool Reader::ReadRecord(Slice* record, std::string* scratch) { ++ if (last_record_offset_ < initial_offset_) { ++ if (!SkipToInitialBlock()) { ++ return false; ++ } ++ } ++ ++ scratch->clear(); ++ record->clear(); ++ bool in_fragmented_record = false; ++ // Record offset of the logical record that we're reading ++ // 0 is a dummy value to make compilers happy ++ uint64_t prospective_record_offset = 0; ++ ++ Slice fragment; ++ while (true) { ++ const unsigned int record_type = ReadPhysicalRecord(&fragment); ++ ++ // ReadPhysicalRecord may have only had an empty trailer remaining in its ++ // internal buffer. Calculate the offset of the next physical record now ++ // that it has returned, properly accounting for its header size. ++ uint64_t physical_record_offset = ++ end_of_buffer_offset_ - buffer_.size() - kHeaderSize - fragment.size(); ++ ++ if (resyncing_) { ++ if (record_type == kMiddleType) { ++ continue; ++ } else if (record_type == kLastType) { ++ resyncing_ = false; ++ continue; ++ } else { ++ resyncing_ = false; ++ } ++ } ++ ++ switch (record_type) { ++ case kFullType: ++ if (in_fragmented_record) { ++ // Handle bug in earlier versions of log::Writer where ++ // it could emit an empty kFirstType record at the tail end ++ // of a block followed by a kFullType or kFirstType record ++ // at the beginning of the next block. ++ if (scratch->empty()) { ++ in_fragmented_record = false; ++ } else { ++ ReportCorruption(scratch->size(), "partial record without end(1)"); ++ } ++ } ++ prospective_record_offset = physical_record_offset; ++ scratch->clear(); ++ *record = fragment; ++ last_record_offset_ = prospective_record_offset; ++ return true; ++ ++ case kFirstType: ++ if (in_fragmented_record) { ++ // Handle bug in earlier versions of log::Writer where ++ // it could emit an empty kFirstType record at the tail end ++ // of a block followed by a kFullType or kFirstType record ++ // at the beginning of the next block. ++ if (scratch->empty()) { ++ in_fragmented_record = false; ++ } else { ++ ReportCorruption(scratch->size(), "partial record without end(2)"); ++ } ++ } ++ prospective_record_offset = physical_record_offset; ++ scratch->assign(fragment.data(), fragment.size()); ++ in_fragmented_record = true; ++ break; ++ ++ case kMiddleType: ++ if (!in_fragmented_record) { ++ ReportCorruption(fragment.size(), ++ "missing start of fragmented record(1)"); ++ } else { ++ scratch->append(fragment.data(), fragment.size()); ++ } ++ break; ++ ++ case kLastType: ++ if (!in_fragmented_record) { ++ ReportCorruption(fragment.size(), ++ "missing start of fragmented record(2)"); ++ } else { ++ scratch->append(fragment.data(), fragment.size()); ++ *record = Slice(*scratch); ++ last_record_offset_ = prospective_record_offset; ++ return true; ++ } ++ break; ++ ++ case kEof: ++ if (in_fragmented_record) { ++ // This can be caused by the writer dying immediately after ++ // writing a physical record but before completing the next; don't ++ // treat it as a corruption, just ignore the entire logical record. ++ scratch->clear(); ++ } ++ return false; ++ ++ case kBadRecord: ++ if (in_fragmented_record) { ++ ReportCorruption(scratch->size(), "error in middle of record"); ++ in_fragmented_record = false; ++ scratch->clear(); ++ } ++ break; ++ ++ default: { ++ char buf[40]; ++ snprintf(buf, sizeof(buf), "unknown record type %u", record_type); ++ ReportCorruption( ++ (fragment.size() + (in_fragmented_record ? scratch->size() : 0)), ++ buf); ++ in_fragmented_record = false; ++ scratch->clear(); ++ break; ++ } ++ } ++ } ++ return false; ++} ++ ++uint64_t Reader::LastRecordOffset() { ++ return last_record_offset_; ++} ++ ++void Reader::ReportCorruption(uint64_t bytes, const char* reason) { ++ ReportDrop(bytes, Status::Corruption(reason)); ++} ++ ++void Reader::ReportDrop(uint64_t bytes, const Status& reason) { ++ if (reporter_ != NULL && ++ end_of_buffer_offset_ - buffer_.size() - bytes >= initial_offset_) { ++ reporter_->Corruption(static_cast(bytes), reason); ++ } ++} ++ ++unsigned int Reader::ReadPhysicalRecord(Slice* result) { ++ while (true) { ++ if (buffer_.size() < kHeaderSize) { ++ if (!eof_) { ++ // Last read was a full read, so this is a trailer to skip ++ buffer_.clear(); ++ Status status = file_->Read(kBlockSize, &buffer_, backing_store_); ++ end_of_buffer_offset_ += buffer_.size(); ++ if (!status.ok()) { ++ buffer_.clear(); ++ ReportDrop(kBlockSize, status); ++ eof_ = true; ++ return kEof; ++ } else if (buffer_.size() < kBlockSize) { ++ eof_ = true; ++ } ++ continue; ++ } else { ++ // Note that if buffer_ is non-empty, we have a truncated header at the ++ // end of the file, which can be caused by the writer crashing in the ++ // middle of writing the header. Instead of considering this an error, ++ // just report EOF. ++ buffer_.clear(); ++ return kEof; ++ } ++ } ++ ++ // Parse the header ++ const char* header = buffer_.data(); ++ const uint32_t a = static_cast(header[4]) & 0xff; ++ const uint32_t b = static_cast(header[5]) & 0xff; ++ const unsigned int type = header[6]; ++ const uint32_t length = a | (b << 8); ++ if (kHeaderSize + length > buffer_.size()) { ++ size_t drop_size = buffer_.size(); ++ buffer_.clear(); ++ if (!eof_) { ++ ReportCorruption(drop_size, "bad record length"); ++ return kBadRecord; ++ } ++ // If the end of the file has been reached without reading |length| bytes ++ // of payload, assume the writer died in the middle of writing the record. ++ // Don't report a corruption. ++ return kEof; ++ } ++ ++ if (type == kZeroType && length == 0) { ++ // Skip zero length record without reporting any drops since ++ // such records are produced by the mmap based writing code in ++ // env_posix.cc that preallocates file regions. ++ buffer_.clear(); ++ return kBadRecord; ++ } ++ ++ // Check crc ++ if (checksum_) { ++ uint32_t expected_crc = crc32c::Unmask(DecodeFixed32(header)); ++ uint32_t actual_crc = crc32c::Value(header + 6, 1 + length); ++ if (actual_crc != expected_crc) { ++ // Drop the rest of the buffer since "length" itself may have ++ // been corrupted and if we trust it, we could find some ++ // fragment of a real log record that just happens to look ++ // like a valid log record. ++ size_t drop_size = buffer_.size(); ++ buffer_.clear(); ++ ReportCorruption(drop_size, "checksum mismatch"); ++ return kBadRecord; ++ } ++ } ++ ++ buffer_.remove_prefix(kHeaderSize + length); ++ ++ // Skip physical record that started before initial_offset_ ++ if (end_of_buffer_offset_ - buffer_.size() - kHeaderSize - length < ++ initial_offset_) { ++ result->clear(); ++ return kBadRecord; ++ } ++ ++ *result = Slice(header + kHeaderSize, length); ++ return type; ++ } ++} ++ ++} // namespace log ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.h +new file mode 100644 +index 0000000..8389d61 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.h +@@ -0,0 +1,113 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_LOG_READER_H_ ++#define STORAGE_LEVELDB_DB_LOG_READER_H_ ++ ++#include ++ ++#include "db/log_format.h" ++#include "leveldb/slice.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class SequentialFile; ++ ++namespace log { ++ ++class Reader { ++ public: ++ // Interface for reporting errors. ++ class Reporter { ++ public: ++ virtual ~Reporter(); ++ ++ // Some corruption was detected. "size" is the approximate number ++ // of bytes dropped due to the corruption. ++ virtual void Corruption(size_t bytes, const Status& status) = 0; ++ }; ++ ++ // Create a reader that will return log records from "*file". ++ // "*file" must remain live while this Reader is in use. ++ // ++ // If "reporter" is non-NULL, it is notified whenever some data is ++ // dropped due to a detected corruption. "*reporter" must remain ++ // live while this Reader is in use. ++ // ++ // If "checksum" is true, verify checksums if available. ++ // ++ // The Reader will start reading at the first record located at physical ++ // position >= initial_offset within the file. ++ Reader(SequentialFile* file, Reporter* reporter, bool checksum, ++ uint64_t initial_offset); ++ ++ ~Reader(); ++ ++ // Read the next record into *record. Returns true if read ++ // successfully, false if we hit end of the input. May use ++ // "*scratch" as temporary storage. The contents filled in *record ++ // will only be valid until the next mutating operation on this ++ // reader or the next mutation to *scratch. ++ bool ReadRecord(Slice* record, std::string* scratch); ++ ++ // Returns the physical offset of the last record returned by ReadRecord. ++ // ++ // Undefined before the first call to ReadRecord. ++ uint64_t LastRecordOffset(); ++ ++ private: ++ SequentialFile* const file_; ++ Reporter* const reporter_; ++ bool const checksum_; ++ char* const backing_store_; ++ Slice buffer_; ++ bool eof_; // Last Read() indicated EOF by returning < kBlockSize ++ ++ // Offset of the last record returned by ReadRecord. ++ uint64_t last_record_offset_; ++ // Offset of the first location past the end of buffer_. ++ uint64_t end_of_buffer_offset_; ++ ++ // Offset at which to start looking for the first record to return ++ uint64_t const initial_offset_; ++ ++ // True if we are resynchronizing after a seek (initial_offset_ > 0). In ++ // particular, a run of kMiddleType and kLastType records can be silently ++ // skipped in this mode ++ bool resyncing_; ++ ++ // Extend record types with the following special values ++ enum { ++ kEof = kMaxRecordType + 1, ++ // Returned whenever we find an invalid physical record. ++ // Currently there are three situations in which this happens: ++ // * The record has an invalid CRC (ReadPhysicalRecord reports a drop) ++ // * The record is a 0-length record (No drop is reported) ++ // * The record is below constructor's initial_offset (No drop is reported) ++ kBadRecord = kMaxRecordType + 2 ++ }; ++ ++ // Skips all blocks that are completely before "initial_offset_". ++ // ++ // Returns true on success. Handles reporting. ++ bool SkipToInitialBlock(); ++ ++ // Return type, or one of the preceding special values ++ unsigned int ReadPhysicalRecord(Slice* result); ++ ++ // Reports dropped bytes to the reporter. ++ // buffer_ must be updated to remove the dropped bytes prior to invocation. ++ void ReportCorruption(uint64_t bytes, const char* reason); ++ void ReportDrop(uint64_t bytes, const Status& reason); ++ ++ // No copying allowed ++ Reader(const Reader&); ++ void operator=(const Reader&); ++}; ++ ++} // namespace log ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_LOG_READER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_test.cc +new file mode 100644 +index 0000000..48a5928 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_test.cc +@@ -0,0 +1,591 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/log_reader.h" ++#include "db/log_writer.h" ++#include "leveldb/env.h" ++#include "util/coding.h" ++#include "util/crc32c.h" ++#include "util/random.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++namespace log { ++ ++// Construct a string of the specified length made out of the supplied ++// partial string. ++static std::string BigString(const std::string& partial_string, size_t n) { ++ std::string result; ++ while (result.size() < n) { ++ result.append(partial_string); ++ } ++ result.resize(n); ++ return result; ++} ++ ++// Construct a string from a number ++static std::string NumberString(int n) { ++ char buf[50]; ++ snprintf(buf, sizeof(buf), "%d.", n); ++ return std::string(buf); ++} ++ ++// Return a skewed potentially long string ++static std::string RandomSkewedString(int i, Random* rnd) { ++ return BigString(NumberString(i), rnd->Skewed(17)); ++} ++ ++class LogTest { ++ private: ++ class StringDest : public WritableFile { ++ public: ++ std::string contents_; ++ ++ virtual Status Close() { return Status::OK(); } ++ virtual Status Flush() { return Status::OK(); } ++ virtual Status Sync() { return Status::OK(); } ++ virtual Status Append(const Slice& slice) { ++ contents_.append(slice.data(), slice.size()); ++ return Status::OK(); ++ } ++ }; ++ ++ class StringSource : public SequentialFile { ++ public: ++ Slice contents_; ++ bool force_error_; ++ bool returned_partial_; ++ StringSource() : force_error_(false), returned_partial_(false) { } ++ ++ virtual Status Read(size_t n, Slice* result, char* scratch) { ++ ASSERT_TRUE(!returned_partial_) << "must not Read() after eof/error"; ++ ++ if (force_error_) { ++ force_error_ = false; ++ returned_partial_ = true; ++ return Status::Corruption("read error"); ++ } ++ ++ if (contents_.size() < n) { ++ n = contents_.size(); ++ returned_partial_ = true; ++ } ++ *result = Slice(contents_.data(), n); ++ contents_.remove_prefix(n); ++ return Status::OK(); ++ } ++ ++ virtual Status Skip(uint64_t n) { ++ if (n > contents_.size()) { ++ contents_.clear(); ++ return Status::NotFound("in-memory file skipped past end"); ++ } ++ ++ contents_.remove_prefix(n); ++ ++ return Status::OK(); ++ } ++ }; ++ ++ class ReportCollector : public Reader::Reporter { ++ public: ++ size_t dropped_bytes_; ++ std::string message_; ++ ++ ReportCollector() : dropped_bytes_(0) { } ++ virtual void Corruption(size_t bytes, const Status& status) { ++ dropped_bytes_ += bytes; ++ message_.append(status.ToString()); ++ } ++ }; ++ ++ StringDest dest_; ++ StringSource source_; ++ ReportCollector report_; ++ bool reading_; ++ Writer* writer_; ++ Reader* reader_; ++ ++ // Record metadata for testing initial offset functionality ++ static size_t initial_offset_record_sizes_[]; ++ static uint64_t initial_offset_last_record_offsets_[]; ++ static int num_initial_offset_records_; ++ ++ public: ++ LogTest() : reading_(false), ++ writer_(new Writer(&dest_)), ++ reader_(new Reader(&source_, &report_, true/*checksum*/, ++ 0/*initial_offset*/)) { ++ } ++ ++ ~LogTest() { ++ delete writer_; ++ delete reader_; ++ } ++ ++ void ReopenForAppend() { ++ delete writer_; ++ writer_ = new Writer(&dest_, dest_.contents_.size()); ++ } ++ ++ void Write(const std::string& msg) { ++ ASSERT_TRUE(!reading_) << "Write() after starting to read"; ++ writer_->AddRecord(Slice(msg)); ++ } ++ ++ size_t WrittenBytes() const { ++ return dest_.contents_.size(); ++ } ++ ++ std::string Read() { ++ if (!reading_) { ++ reading_ = true; ++ source_.contents_ = Slice(dest_.contents_); ++ } ++ std::string scratch; ++ Slice record; ++ if (reader_->ReadRecord(&record, &scratch)) { ++ return record.ToString(); ++ } else { ++ return "EOF"; ++ } ++ } ++ ++ void IncrementByte(int offset, int delta) { ++ dest_.contents_[offset] += delta; ++ } ++ ++ void SetByte(int offset, char new_byte) { ++ dest_.contents_[offset] = new_byte; ++ } ++ ++ void ShrinkSize(int bytes) { ++ dest_.contents_.resize(dest_.contents_.size() - bytes); ++ } ++ ++ void FixChecksum(int header_offset, int len) { ++ // Compute crc of type/len/data ++ uint32_t crc = crc32c::Value(&dest_.contents_[header_offset+6], 1 + len); ++ crc = crc32c::Mask(crc); ++ EncodeFixed32(&dest_.contents_[header_offset], crc); ++ } ++ ++ void ForceError() { ++ source_.force_error_ = true; ++ } ++ ++ size_t DroppedBytes() const { ++ return report_.dropped_bytes_; ++ } ++ ++ std::string ReportMessage() const { ++ return report_.message_; ++ } ++ ++ // Returns OK iff recorded error message contains "msg" ++ std::string MatchError(const std::string& msg) const { ++ if (report_.message_.find(msg) == std::string::npos) { ++ return report_.message_; ++ } else { ++ return "OK"; ++ } ++ } ++ ++ void WriteInitialOffsetLog() { ++ for (int i = 0; i < num_initial_offset_records_; i++) { ++ std::string record(initial_offset_record_sizes_[i], ++ static_cast('a' + i)); ++ Write(record); ++ } ++ } ++ ++ void StartReadingAt(uint64_t initial_offset) { ++ delete reader_; ++ reader_ = new Reader(&source_, &report_, true/*checksum*/, initial_offset); ++ } ++ ++ void CheckOffsetPastEndReturnsNoRecords(uint64_t offset_past_end) { ++ WriteInitialOffsetLog(); ++ reading_ = true; ++ source_.contents_ = Slice(dest_.contents_); ++ Reader* offset_reader = new Reader(&source_, &report_, true/*checksum*/, ++ WrittenBytes() + offset_past_end); ++ Slice record; ++ std::string scratch; ++ ASSERT_TRUE(!offset_reader->ReadRecord(&record, &scratch)); ++ delete offset_reader; ++ } ++ ++ void CheckInitialOffsetRecord(uint64_t initial_offset, ++ int expected_record_offset) { ++ WriteInitialOffsetLog(); ++ reading_ = true; ++ source_.contents_ = Slice(dest_.contents_); ++ Reader* offset_reader = new Reader(&source_, &report_, true/*checksum*/, ++ initial_offset); ++ ++ // Read all records from expected_record_offset through the last one. ++ ASSERT_LT(expected_record_offset, num_initial_offset_records_); ++ for (; expected_record_offset < num_initial_offset_records_; ++ ++expected_record_offset) { ++ Slice record; ++ std::string scratch; ++ ASSERT_TRUE(offset_reader->ReadRecord(&record, &scratch)); ++ ASSERT_EQ(initial_offset_record_sizes_[expected_record_offset], ++ record.size()); ++ ASSERT_EQ(initial_offset_last_record_offsets_[expected_record_offset], ++ offset_reader->LastRecordOffset()); ++ ASSERT_EQ((char)('a' + expected_record_offset), record.data()[0]); ++ } ++ delete offset_reader; ++ } ++}; ++ ++size_t LogTest::initial_offset_record_sizes_[] = ++ {10000, // Two sizable records in first block ++ 10000, ++ 2 * log::kBlockSize - 1000, // Span three blocks ++ 1, ++ 13716, // Consume all but two bytes of block 3. ++ log::kBlockSize - kHeaderSize, // Consume the entirety of block 4. ++ }; ++ ++uint64_t LogTest::initial_offset_last_record_offsets_[] = ++ {0, ++ kHeaderSize + 10000, ++ 2 * (kHeaderSize + 10000), ++ 2 * (kHeaderSize + 10000) + ++ (2 * log::kBlockSize - 1000) + 3 * kHeaderSize, ++ 2 * (kHeaderSize + 10000) + ++ (2 * log::kBlockSize - 1000) + 3 * kHeaderSize ++ + kHeaderSize + 1, ++ 3 * log::kBlockSize, ++ }; ++ ++// LogTest::initial_offset_last_record_offsets_ must be defined before this. ++int LogTest::num_initial_offset_records_ = ++ sizeof(LogTest::initial_offset_last_record_offsets_)/sizeof(uint64_t); ++ ++TEST(LogTest, Empty) { ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, ReadWrite) { ++ Write("foo"); ++ Write("bar"); ++ Write(""); ++ Write("xxxx"); ++ ASSERT_EQ("foo", Read()); ++ ASSERT_EQ("bar", Read()); ++ ASSERT_EQ("", Read()); ++ ASSERT_EQ("xxxx", Read()); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ("EOF", Read()); // Make sure reads at eof work ++} ++ ++TEST(LogTest, ManyBlocks) { ++ for (int i = 0; i < 100000; i++) { ++ Write(NumberString(i)); ++ } ++ for (int i = 0; i < 100000; i++) { ++ ASSERT_EQ(NumberString(i), Read()); ++ } ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, Fragmentation) { ++ Write("small"); ++ Write(BigString("medium", 50000)); ++ Write(BigString("large", 100000)); ++ ASSERT_EQ("small", Read()); ++ ASSERT_EQ(BigString("medium", 50000), Read()); ++ ASSERT_EQ(BigString("large", 100000), Read()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, MarginalTrailer) { ++ // Make a trailer that is exactly the same length as an empty record. ++ const int n = kBlockSize - 2*kHeaderSize; ++ Write(BigString("foo", n)); ++ ASSERT_EQ(kBlockSize - kHeaderSize, WrittenBytes()); ++ Write(""); ++ Write("bar"); ++ ASSERT_EQ(BigString("foo", n), Read()); ++ ASSERT_EQ("", Read()); ++ ASSERT_EQ("bar", Read()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, MarginalTrailer2) { ++ // Make a trailer that is exactly the same length as an empty record. ++ const int n = kBlockSize - 2*kHeaderSize; ++ Write(BigString("foo", n)); ++ ASSERT_EQ(kBlockSize - kHeaderSize, WrittenBytes()); ++ Write("bar"); ++ ASSERT_EQ(BigString("foo", n), Read()); ++ ASSERT_EQ("bar", Read()); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(0, DroppedBytes()); ++ ASSERT_EQ("", ReportMessage()); ++} ++ ++TEST(LogTest, ShortTrailer) { ++ const int n = kBlockSize - 2*kHeaderSize + 4; ++ Write(BigString("foo", n)); ++ ASSERT_EQ(kBlockSize - kHeaderSize + 4, WrittenBytes()); ++ Write(""); ++ Write("bar"); ++ ASSERT_EQ(BigString("foo", n), Read()); ++ ASSERT_EQ("", Read()); ++ ASSERT_EQ("bar", Read()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, AlignedEof) { ++ const int n = kBlockSize - 2*kHeaderSize + 4; ++ Write(BigString("foo", n)); ++ ASSERT_EQ(kBlockSize - kHeaderSize + 4, WrittenBytes()); ++ ASSERT_EQ(BigString("foo", n), Read()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, OpenForAppend) { ++ Write("hello"); ++ ReopenForAppend(); ++ Write("world"); ++ ASSERT_EQ("hello", Read()); ++ ASSERT_EQ("world", Read()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, RandomRead) { ++ const int N = 500; ++ Random write_rnd(301); ++ for (int i = 0; i < N; i++) { ++ Write(RandomSkewedString(i, &write_rnd)); ++ } ++ Random read_rnd(301); ++ for (int i = 0; i < N; i++) { ++ ASSERT_EQ(RandomSkewedString(i, &read_rnd), Read()); ++ } ++ ASSERT_EQ("EOF", Read()); ++} ++ ++// Tests of all the error paths in log_reader.cc follow: ++ ++TEST(LogTest, ReadError) { ++ Write("foo"); ++ ForceError(); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(kBlockSize, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("read error")); ++} ++ ++TEST(LogTest, BadRecordType) { ++ Write("foo"); ++ // Type is stored in header[6] ++ IncrementByte(6, 100); ++ FixChecksum(0, 3); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(3, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("unknown record type")); ++} ++ ++TEST(LogTest, TruncatedTrailingRecordIsIgnored) { ++ Write("foo"); ++ ShrinkSize(4); // Drop all payload as well as a header byte ++ ASSERT_EQ("EOF", Read()); ++ // Truncated last record is ignored, not treated as an error. ++ ASSERT_EQ(0, DroppedBytes()); ++ ASSERT_EQ("", ReportMessage()); ++} ++ ++TEST(LogTest, BadLength) { ++ const int kPayloadSize = kBlockSize - kHeaderSize; ++ Write(BigString("bar", kPayloadSize)); ++ Write("foo"); ++ // Least significant size byte is stored in header[4]. ++ IncrementByte(4, 1); ++ ASSERT_EQ("foo", Read()); ++ ASSERT_EQ(kBlockSize, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("bad record length")); ++} ++ ++TEST(LogTest, BadLengthAtEndIsIgnored) { ++ Write("foo"); ++ ShrinkSize(1); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(0, DroppedBytes()); ++ ASSERT_EQ("", ReportMessage()); ++} ++ ++TEST(LogTest, ChecksumMismatch) { ++ Write("foo"); ++ IncrementByte(0, 10); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(10, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("checksum mismatch")); ++} ++ ++TEST(LogTest, UnexpectedMiddleType) { ++ Write("foo"); ++ SetByte(6, kMiddleType); ++ FixChecksum(0, 3); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(3, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("missing start")); ++} ++ ++TEST(LogTest, UnexpectedLastType) { ++ Write("foo"); ++ SetByte(6, kLastType); ++ FixChecksum(0, 3); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(3, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("missing start")); ++} ++ ++TEST(LogTest, UnexpectedFullType) { ++ Write("foo"); ++ Write("bar"); ++ SetByte(6, kFirstType); ++ FixChecksum(0, 3); ++ ASSERT_EQ("bar", Read()); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(3, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("partial record without end")); ++} ++ ++TEST(LogTest, UnexpectedFirstType) { ++ Write("foo"); ++ Write(BigString("bar", 100000)); ++ SetByte(6, kFirstType); ++ FixChecksum(0, 3); ++ ASSERT_EQ(BigString("bar", 100000), Read()); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ(3, DroppedBytes()); ++ ASSERT_EQ("OK", MatchError("partial record without end")); ++} ++ ++TEST(LogTest, MissingLastIsIgnored) { ++ Write(BigString("bar", kBlockSize)); ++ // Remove the LAST block, including header. ++ ShrinkSize(14); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ("", ReportMessage()); ++ ASSERT_EQ(0, DroppedBytes()); ++} ++ ++TEST(LogTest, PartialLastIsIgnored) { ++ Write(BigString("bar", kBlockSize)); ++ // Cause a bad record length in the LAST block. ++ ShrinkSize(1); ++ ASSERT_EQ("EOF", Read()); ++ ASSERT_EQ("", ReportMessage()); ++ ASSERT_EQ(0, DroppedBytes()); ++} ++ ++TEST(LogTest, SkipIntoMultiRecord) { ++ // Consider a fragmented record: ++ // first(R1), middle(R1), last(R1), first(R2) ++ // If initial_offset points to a record after first(R1) but before first(R2) ++ // incomplete fragment errors are not actual errors, and must be suppressed ++ // until a new first or full record is encountered. ++ Write(BigString("foo", 3*kBlockSize)); ++ Write("correct"); ++ StartReadingAt(kBlockSize); ++ ++ ASSERT_EQ("correct", Read()); ++ ASSERT_EQ("", ReportMessage()); ++ ASSERT_EQ(0, DroppedBytes()); ++ ASSERT_EQ("EOF", Read()); ++} ++ ++TEST(LogTest, ErrorJoinsRecords) { ++ // Consider two fragmented records: ++ // first(R1) last(R1) first(R2) last(R2) ++ // where the middle two fragments disappear. We do not want ++ // first(R1),last(R2) to get joined and returned as a valid record. ++ ++ // Write records that span two blocks ++ Write(BigString("foo", kBlockSize)); ++ Write(BigString("bar", kBlockSize)); ++ Write("correct"); ++ ++ // Wipe the middle block ++ for (int offset = kBlockSize; offset < 2*kBlockSize; offset++) { ++ SetByte(offset, 'x'); ++ } ++ ++ ASSERT_EQ("correct", Read()); ++ ASSERT_EQ("EOF", Read()); ++ const size_t dropped = DroppedBytes(); ++ ASSERT_LE(dropped, 2*kBlockSize + 100); ++ ASSERT_GE(dropped, 2*kBlockSize); ++} ++ ++TEST(LogTest, ReadStart) { ++ CheckInitialOffsetRecord(0, 0); ++} ++ ++TEST(LogTest, ReadSecondOneOff) { ++ CheckInitialOffsetRecord(1, 1); ++} ++ ++TEST(LogTest, ReadSecondTenThousand) { ++ CheckInitialOffsetRecord(10000, 1); ++} ++ ++TEST(LogTest, ReadSecondStart) { ++ CheckInitialOffsetRecord(10007, 1); ++} ++ ++TEST(LogTest, ReadThirdOneOff) { ++ CheckInitialOffsetRecord(10008, 2); ++} ++ ++TEST(LogTest, ReadThirdStart) { ++ CheckInitialOffsetRecord(20014, 2); ++} ++ ++TEST(LogTest, ReadFourthOneOff) { ++ CheckInitialOffsetRecord(20015, 3); ++} ++ ++TEST(LogTest, ReadFourthFirstBlockTrailer) { ++ CheckInitialOffsetRecord(log::kBlockSize - 4, 3); ++} ++ ++TEST(LogTest, ReadFourthMiddleBlock) { ++ CheckInitialOffsetRecord(log::kBlockSize + 1, 3); ++} ++ ++TEST(LogTest, ReadFourthLastBlock) { ++ CheckInitialOffsetRecord(2 * log::kBlockSize + 1, 3); ++} ++ ++TEST(LogTest, ReadFourthStart) { ++ CheckInitialOffsetRecord( ++ 2 * (kHeaderSize + 1000) + (2 * log::kBlockSize - 1000) + 3 * kHeaderSize, ++ 3); ++} ++ ++TEST(LogTest, ReadInitialOffsetIntoBlockPadding) { ++ CheckInitialOffsetRecord(3 * log::kBlockSize - 3, 5); ++} ++ ++TEST(LogTest, ReadEnd) { ++ CheckOffsetPastEndReturnsNoRecords(0); ++} ++ ++TEST(LogTest, ReadPastEnd) { ++ CheckOffsetPastEndReturnsNoRecords(5); ++} ++ ++} // namespace log ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.cc +new file mode 100644 +index 0000000..74a0327 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.cc +@@ -0,0 +1,112 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/log_writer.h" ++ ++#include ++#include "leveldb/env.h" ++#include "util/coding.h" ++#include "util/crc32c.h" ++ ++namespace leveldb { ++namespace log { ++ ++static void InitTypeCrc(uint32_t* type_crc) { ++ for (int i = 0; i <= kMaxRecordType; i++) { ++ char t = static_cast(i); ++ type_crc[i] = crc32c::Value(&t, 1); ++ } ++} ++ ++Writer::Writer(WritableFile* dest) ++ : dest_(dest), ++ block_offset_(0) { ++ InitTypeCrc(type_crc_); ++} ++ ++Writer::Writer(WritableFile* dest, uint64_t dest_length) ++ : dest_(dest), block_offset_(dest_length % kBlockSize) { ++ InitTypeCrc(type_crc_); ++} ++ ++Writer::~Writer() { ++} ++ ++Status Writer::AddRecord(const Slice& slice) { ++ const char* ptr = slice.data(); ++ size_t left = slice.size(); ++ ++ // Fragment the record if necessary and emit it. Note that if slice ++ // is empty, we still want to iterate once to emit a single ++ // zero-length record ++ Status s; ++ bool begin = true; ++ do { ++ const int leftover = kBlockSize - block_offset_; ++ assert(leftover >= 0); ++ if (leftover < kHeaderSize) { ++ // Switch to a new block ++ if (leftover > 0) { ++ // Fill the trailer (literal below relies on kHeaderSize being 7) ++ assert(kHeaderSize == 7); ++ dest_->Append(Slice("\x00\x00\x00\x00\x00\x00", leftover)); ++ } ++ block_offset_ = 0; ++ } ++ ++ // Invariant: we never leave < kHeaderSize bytes in a block. ++ assert(kBlockSize - block_offset_ - kHeaderSize >= 0); ++ ++ const size_t avail = kBlockSize - block_offset_ - kHeaderSize; ++ const size_t fragment_length = (left < avail) ? left : avail; ++ ++ RecordType type; ++ const bool end = (left == fragment_length); ++ if (begin && end) { ++ type = kFullType; ++ } else if (begin) { ++ type = kFirstType; ++ } else if (end) { ++ type = kLastType; ++ } else { ++ type = kMiddleType; ++ } ++ ++ s = EmitPhysicalRecord(type, ptr, fragment_length); ++ ptr += fragment_length; ++ left -= fragment_length; ++ begin = false; ++ } while (s.ok() && left > 0); ++ return s; ++} ++ ++Status Writer::EmitPhysicalRecord(RecordType t, const char* ptr, size_t n) { ++ assert(n <= 0xffff); // Must fit in two bytes ++ assert(block_offset_ + kHeaderSize + n <= kBlockSize); ++ ++ // Format the header ++ char buf[kHeaderSize]; ++ buf[4] = static_cast(n & 0xff); ++ buf[5] = static_cast(n >> 8); ++ buf[6] = static_cast(t); ++ ++ // Compute the crc of the record type and the payload. ++ uint32_t crc = crc32c::Extend(type_crc_[t], ptr, n); ++ crc = crc32c::Mask(crc); // Adjust for storage ++ EncodeFixed32(buf, crc); ++ ++ // Write the header and the payload ++ Status s = dest_->Append(Slice(buf, kHeaderSize)); ++ if (s.ok()) { ++ s = dest_->Append(Slice(ptr, n)); ++ if (s.ok()) { ++ s = dest_->Flush(); ++ } ++ } ++ block_offset_ += kHeaderSize + n; ++ return s; ++} ++ ++} // namespace log ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.h +new file mode 100644 +index 0000000..9e7cc47 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.h +@@ -0,0 +1,54 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_LOG_WRITER_H_ ++#define STORAGE_LEVELDB_DB_LOG_WRITER_H_ ++ ++#include ++#include "db/log_format.h" ++#include "leveldb/slice.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class WritableFile; ++ ++namespace log { ++ ++class Writer { ++ public: ++ // Create a writer that will append data to "*dest". ++ // "*dest" must be initially empty. ++ // "*dest" must remain live while this Writer is in use. ++ explicit Writer(WritableFile* dest); ++ ++ // Create a writer that will append data to "*dest". ++ // "*dest" must have initial length "dest_length". ++ // "*dest" must remain live while this Writer is in use. ++ Writer(WritableFile* dest, uint64_t dest_length); ++ ++ ~Writer(); ++ ++ Status AddRecord(const Slice& slice); ++ ++ private: ++ WritableFile* dest_; ++ int block_offset_; // Current offset in block ++ ++ // crc32c values for all supported record types. These are ++ // pre-computed to reduce the overhead of computing the crc of the ++ // record type stored in the header. ++ uint32_t type_crc_[kMaxRecordType + 1]; ++ ++ Status EmitPhysicalRecord(RecordType type, const char* ptr, size_t length); ++ ++ // No copying allowed ++ Writer(const Writer&); ++ void operator=(const Writer&); ++}; ++ ++} // namespace log ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_LOG_WRITER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.cc +new file mode 100644 +index 0000000..bfec0a7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.cc +@@ -0,0 +1,145 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/memtable.h" ++#include "db/dbformat.h" ++#include "leveldb/comparator.h" ++#include "leveldb/env.h" ++#include "leveldb/iterator.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++static Slice GetLengthPrefixedSlice(const char* data) { ++ uint32_t len; ++ const char* p = data; ++ p = GetVarint32Ptr(p, p + 5, &len); // +5: we assume "p" is not corrupted ++ return Slice(p, len); ++} ++ ++MemTable::MemTable(const InternalKeyComparator& cmp) ++ : comparator_(cmp), ++ refs_(0), ++ table_(comparator_, &arena_) { ++} ++ ++MemTable::~MemTable() { ++ assert(refs_ == 0); ++} ++ ++size_t MemTable::ApproximateMemoryUsage() { return arena_.MemoryUsage(); } ++ ++int MemTable::KeyComparator::operator()(const char* aptr, const char* bptr) ++ const { ++ // Internal keys are encoded as length-prefixed strings. ++ Slice a = GetLengthPrefixedSlice(aptr); ++ Slice b = GetLengthPrefixedSlice(bptr); ++ return comparator.Compare(a, b); ++} ++ ++// Encode a suitable internal key target for "target" and return it. ++// Uses *scratch as scratch space, and the returned pointer will point ++// into this scratch space. ++static const char* EncodeKey(std::string* scratch, const Slice& target) { ++ scratch->clear(); ++ PutVarint32(scratch, target.size()); ++ scratch->append(target.data(), target.size()); ++ return scratch->data(); ++} ++ ++class MemTableIterator: public Iterator { ++ public: ++ explicit MemTableIterator(MemTable::Table* table) : iter_(table) { } ++ ++ virtual bool Valid() const { return iter_.Valid(); } ++ virtual void Seek(const Slice& k) { iter_.Seek(EncodeKey(&tmp_, k)); } ++ virtual void SeekToFirst() { iter_.SeekToFirst(); } ++ virtual void SeekToLast() { iter_.SeekToLast(); } ++ virtual void Next() { iter_.Next(); } ++ virtual void Prev() { iter_.Prev(); } ++ virtual Slice key() const { return GetLengthPrefixedSlice(iter_.key()); } ++ virtual Slice value() const { ++ Slice key_slice = GetLengthPrefixedSlice(iter_.key()); ++ return GetLengthPrefixedSlice(key_slice.data() + key_slice.size()); ++ } ++ ++ virtual Status status() const { return Status::OK(); } ++ ++ private: ++ MemTable::Table::Iterator iter_; ++ std::string tmp_; // For passing to EncodeKey ++ ++ // No copying allowed ++ MemTableIterator(const MemTableIterator&); ++ void operator=(const MemTableIterator&); ++}; ++ ++Iterator* MemTable::NewIterator() { ++ return new MemTableIterator(&table_); ++} ++ ++void MemTable::Add(SequenceNumber s, ValueType type, ++ const Slice& key, ++ const Slice& value) { ++ // Format of an entry is concatenation of: ++ // key_size : varint32 of internal_key.size() ++ // key bytes : char[internal_key.size()] ++ // value_size : varint32 of value.size() ++ // value bytes : char[value.size()] ++ size_t key_size = key.size(); ++ size_t val_size = value.size(); ++ size_t internal_key_size = key_size + 8; ++ const size_t encoded_len = ++ VarintLength(internal_key_size) + internal_key_size + ++ VarintLength(val_size) + val_size; ++ char* buf = arena_.Allocate(encoded_len); ++ char* p = EncodeVarint32(buf, internal_key_size); ++ memcpy(p, key.data(), key_size); ++ p += key_size; ++ EncodeFixed64(p, (s << 8) | type); ++ p += 8; ++ p = EncodeVarint32(p, val_size); ++ memcpy(p, value.data(), val_size); ++ assert((p + val_size) - buf == encoded_len); ++ table_.Insert(buf); ++} ++ ++bool MemTable::Get(const LookupKey& key, std::string* value, Status* s) { ++ Slice memkey = key.memtable_key(); ++ Table::Iterator iter(&table_); ++ iter.Seek(memkey.data()); ++ if (iter.Valid()) { ++ // entry format is: ++ // klength varint32 ++ // userkey char[klength] ++ // tag uint64 ++ // vlength varint32 ++ // value char[vlength] ++ // Check that it belongs to same user key. We do not check the ++ // sequence number since the Seek() call above should have skipped ++ // all entries with overly large sequence numbers. ++ const char* entry = iter.key(); ++ uint32_t key_length; ++ const char* key_ptr = GetVarint32Ptr(entry, entry+5, &key_length); ++ if (comparator_.comparator.user_comparator()->Compare( ++ Slice(key_ptr, key_length - 8), ++ key.user_key()) == 0) { ++ // Correct user key ++ const uint64_t tag = DecodeFixed64(key_ptr + key_length - 8); ++ switch (static_cast(tag & 0xff)) { ++ case kTypeValue: { ++ Slice v = GetLengthPrefixedSlice(key_ptr + key_length); ++ value->assign(v.data(), v.size()); ++ return true; ++ } ++ case kTypeDeletion: ++ *s = Status::NotFound(Slice()); ++ return true; ++ } ++ } ++ } ++ return false; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.h +new file mode 100644 +index 0000000..9f41567 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.h +@@ -0,0 +1,88 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_MEMTABLE_H_ ++#define STORAGE_LEVELDB_DB_MEMTABLE_H_ ++ ++#include ++#include "leveldb/db.h" ++#include "db/dbformat.h" ++#include "db/skiplist.h" ++#include "util/arena.h" ++ ++namespace leveldb { ++ ++class InternalKeyComparator; ++class Mutex; ++class MemTableIterator; ++ ++class MemTable { ++ public: ++ // MemTables are reference counted. The initial reference count ++ // is zero and the caller must call Ref() at least once. ++ explicit MemTable(const InternalKeyComparator& comparator); ++ ++ // Increase reference count. ++ void Ref() { ++refs_; } ++ ++ // Drop reference count. Delete if no more references exist. ++ void Unref() { ++ --refs_; ++ assert(refs_ >= 0); ++ if (refs_ <= 0) { ++ delete this; ++ } ++ } ++ ++ // Returns an estimate of the number of bytes of data in use by this ++ // data structure. It is safe to call when MemTable is being modified. ++ size_t ApproximateMemoryUsage(); ++ ++ // Return an iterator that yields the contents of the memtable. ++ // ++ // The caller must ensure that the underlying MemTable remains live ++ // while the returned iterator is live. The keys returned by this ++ // iterator are internal keys encoded by AppendInternalKey in the ++ // db/format.{h,cc} module. ++ Iterator* NewIterator(); ++ ++ // Add an entry into memtable that maps key to value at the ++ // specified sequence number and with the specified type. ++ // Typically value will be empty if type==kTypeDeletion. ++ void Add(SequenceNumber seq, ValueType type, ++ const Slice& key, ++ const Slice& value); ++ ++ // If memtable contains a value for key, store it in *value and return true. ++ // If memtable contains a deletion for key, store a NotFound() error ++ // in *status and return true. ++ // Else, return false. ++ bool Get(const LookupKey& key, std::string* value, Status* s); ++ ++ private: ++ ~MemTable(); // Private since only Unref() should be used to delete it ++ ++ struct KeyComparator { ++ const InternalKeyComparator comparator; ++ explicit KeyComparator(const InternalKeyComparator& c) : comparator(c) { } ++ int operator()(const char* a, const char* b) const; ++ }; ++ friend class MemTableIterator; ++ friend class MemTableBackwardIterator; ++ ++ typedef SkipList Table; ++ ++ KeyComparator comparator_; ++ int refs_; ++ Arena arena_; ++ Table table_; ++ ++ // No copying allowed ++ MemTable(const MemTable&); ++ void operator=(const MemTable&); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_MEMTABLE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/recovery_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/recovery_test.cc +new file mode 100644 +index 0000000..9596f42 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/recovery_test.cc +@@ -0,0 +1,324 @@ ++// Copyright (c) 2014 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/db_impl.h" ++#include "db/filename.h" ++#include "db/version_set.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/write_batch.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++class RecoveryTest { ++ public: ++ RecoveryTest() : env_(Env::Default()), db_(NULL) { ++ dbname_ = test::TmpDir() + "/recovery_test"; ++ DestroyDB(dbname_, Options()); ++ Open(); ++ } ++ ++ ~RecoveryTest() { ++ Close(); ++ DestroyDB(dbname_, Options()); ++ } ++ ++ DBImpl* dbfull() const { return reinterpret_cast(db_); } ++ Env* env() const { return env_; } ++ ++ bool CanAppend() { ++ WritableFile* tmp; ++ Status s = env_->NewAppendableFile(CurrentFileName(dbname_), &tmp); ++ delete tmp; ++ if (s.IsNotSupportedError()) { ++ return false; ++ } else { ++ return true; ++ } ++ } ++ ++ void Close() { ++ delete db_; ++ db_ = NULL; ++ } ++ ++ void Open(Options* options = NULL) { ++ Close(); ++ Options opts; ++ if (options != NULL) { ++ opts = *options; ++ } else { ++ opts.reuse_logs = true; // TODO(sanjay): test both ways ++ opts.create_if_missing = true; ++ } ++ if (opts.env == NULL) { ++ opts.env = env_; ++ } ++ ASSERT_OK(DB::Open(opts, dbname_, &db_)); ++ ASSERT_EQ(1, NumLogs()); ++ } ++ ++ Status Put(const std::string& k, const std::string& v) { ++ return db_->Put(WriteOptions(), k, v); ++ } ++ ++ std::string Get(const std::string& k, const Snapshot* snapshot = NULL) { ++ std::string result; ++ Status s = db_->Get(ReadOptions(), k, &result); ++ if (s.IsNotFound()) { ++ result = "NOT_FOUND"; ++ } else if (!s.ok()) { ++ result = s.ToString(); ++ } ++ return result; ++ } ++ ++ std::string ManifestFileName() { ++ std::string current; ++ ASSERT_OK(ReadFileToString(env_, CurrentFileName(dbname_), ¤t)); ++ size_t len = current.size(); ++ if (len > 0 && current[len-1] == '\n') { ++ current.resize(len - 1); ++ } ++ return dbname_ + "/" + current; ++ } ++ ++ std::string LogName(uint64_t number) { ++ return LogFileName(dbname_, number); ++ } ++ ++ size_t DeleteLogFiles() { ++ std::vector logs = GetFiles(kLogFile); ++ for (size_t i = 0; i < logs.size(); i++) { ++ ASSERT_OK(env_->DeleteFile(LogName(logs[i]))) << LogName(logs[i]); ++ } ++ return logs.size(); ++ } ++ ++ uint64_t FirstLogFile() { ++ return GetFiles(kLogFile)[0]; ++ } ++ ++ std::vector GetFiles(FileType t) { ++ std::vector filenames; ++ ASSERT_OK(env_->GetChildren(dbname_, &filenames)); ++ std::vector result; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ uint64_t number; ++ FileType type; ++ if (ParseFileName(filenames[i], &number, &type) && type == t) { ++ result.push_back(number); ++ } ++ } ++ return result; ++ } ++ ++ int NumLogs() { ++ return GetFiles(kLogFile).size(); ++ } ++ ++ int NumTables() { ++ return GetFiles(kTableFile).size(); ++ } ++ ++ uint64_t FileSize(const std::string& fname) { ++ uint64_t result; ++ ASSERT_OK(env_->GetFileSize(fname, &result)) << fname; ++ return result; ++ } ++ ++ void CompactMemTable() { ++ dbfull()->TEST_CompactMemTable(); ++ } ++ ++ // Directly construct a log file that sets key to val. ++ void MakeLogFile(uint64_t lognum, SequenceNumber seq, Slice key, Slice val) { ++ std::string fname = LogFileName(dbname_, lognum); ++ WritableFile* file; ++ ASSERT_OK(env_->NewWritableFile(fname, &file)); ++ log::Writer writer(file); ++ WriteBatch batch; ++ batch.Put(key, val); ++ WriteBatchInternal::SetSequence(&batch, seq); ++ ASSERT_OK(writer.AddRecord(WriteBatchInternal::Contents(&batch))); ++ ASSERT_OK(file->Flush()); ++ delete file; ++ } ++ ++ private: ++ std::string dbname_; ++ Env* env_; ++ DB* db_; ++}; ++ ++TEST(RecoveryTest, ManifestReused) { ++ if (!CanAppend()) { ++ fprintf(stderr, "skipping test because env does not support appending\n"); ++ return; ++ } ++ ASSERT_OK(Put("foo", "bar")); ++ Close(); ++ std::string old_manifest = ManifestFileName(); ++ Open(); ++ ASSERT_EQ(old_manifest, ManifestFileName()); ++ ASSERT_EQ("bar", Get("foo")); ++ Open(); ++ ASSERT_EQ(old_manifest, ManifestFileName()); ++ ASSERT_EQ("bar", Get("foo")); ++} ++ ++TEST(RecoveryTest, LargeManifestCompacted) { ++ if (!CanAppend()) { ++ fprintf(stderr, "skipping test because env does not support appending\n"); ++ return; ++ } ++ ASSERT_OK(Put("foo", "bar")); ++ Close(); ++ std::string old_manifest = ManifestFileName(); ++ ++ // Pad with zeroes to make manifest file very big. ++ { ++ uint64_t len = FileSize(old_manifest); ++ WritableFile* file; ++ ASSERT_OK(env()->NewAppendableFile(old_manifest, &file)); ++ std::string zeroes(3*1048576 - static_cast(len), 0); ++ ASSERT_OK(file->Append(zeroes)); ++ ASSERT_OK(file->Flush()); ++ delete file; ++ } ++ ++ Open(); ++ std::string new_manifest = ManifestFileName(); ++ ASSERT_NE(old_manifest, new_manifest); ++ ASSERT_GT(10000, FileSize(new_manifest)); ++ ASSERT_EQ("bar", Get("foo")); ++ ++ Open(); ++ ASSERT_EQ(new_manifest, ManifestFileName()); ++ ASSERT_EQ("bar", Get("foo")); ++} ++ ++TEST(RecoveryTest, NoLogFiles) { ++ ASSERT_OK(Put("foo", "bar")); ++ ASSERT_EQ(1, DeleteLogFiles()); ++ Open(); ++ ASSERT_EQ("NOT_FOUND", Get("foo")); ++ Open(); ++ ASSERT_EQ("NOT_FOUND", Get("foo")); ++} ++ ++TEST(RecoveryTest, LogFileReuse) { ++ if (!CanAppend()) { ++ fprintf(stderr, "skipping test because env does not support appending\n"); ++ return; ++ } ++ for (int i = 0; i < 2; i++) { ++ ASSERT_OK(Put("foo", "bar")); ++ if (i == 0) { ++ // Compact to ensure current log is empty ++ CompactMemTable(); ++ } ++ Close(); ++ ASSERT_EQ(1, NumLogs()); ++ uint64_t number = FirstLogFile(); ++ if (i == 0) { ++ ASSERT_EQ(0, FileSize(LogName(number))); ++ } else { ++ ASSERT_LT(0, FileSize(LogName(number))); ++ } ++ Open(); ++ ASSERT_EQ(1, NumLogs()); ++ ASSERT_EQ(number, FirstLogFile()) << "did not reuse log file"; ++ ASSERT_EQ("bar", Get("foo")); ++ Open(); ++ ASSERT_EQ(1, NumLogs()); ++ ASSERT_EQ(number, FirstLogFile()) << "did not reuse log file"; ++ ASSERT_EQ("bar", Get("foo")); ++ } ++} ++ ++TEST(RecoveryTest, MultipleMemTables) { ++ // Make a large log. ++ const int kNum = 1000; ++ for (int i = 0; i < kNum; i++) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%050d", i); ++ ASSERT_OK(Put(buf, buf)); ++ } ++ ASSERT_EQ(0, NumTables()); ++ Close(); ++ ASSERT_EQ(0, NumTables()); ++ ASSERT_EQ(1, NumLogs()); ++ uint64_t old_log_file = FirstLogFile(); ++ ++ // Force creation of multiple memtables by reducing the write buffer size. ++ Options opt; ++ opt.reuse_logs = true; ++ opt.write_buffer_size = (kNum*100) / 2; ++ Open(&opt); ++ ASSERT_LE(2, NumTables()); ++ ASSERT_EQ(1, NumLogs()); ++ ASSERT_NE(old_log_file, FirstLogFile()) << "must not reuse log"; ++ for (int i = 0; i < kNum; i++) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "%050d", i); ++ ASSERT_EQ(buf, Get(buf)); ++ } ++} ++ ++TEST(RecoveryTest, MultipleLogFiles) { ++ ASSERT_OK(Put("foo", "bar")); ++ Close(); ++ ASSERT_EQ(1, NumLogs()); ++ ++ // Make a bunch of uncompacted log files. ++ uint64_t old_log = FirstLogFile(); ++ MakeLogFile(old_log+1, 1000, "hello", "world"); ++ MakeLogFile(old_log+2, 1001, "hi", "there"); ++ MakeLogFile(old_log+3, 1002, "foo", "bar2"); ++ ++ // Recover and check that all log files were processed. ++ Open(); ++ ASSERT_LE(1, NumTables()); ++ ASSERT_EQ(1, NumLogs()); ++ uint64_t new_log = FirstLogFile(); ++ ASSERT_LE(old_log+3, new_log); ++ ASSERT_EQ("bar2", Get("foo")); ++ ASSERT_EQ("world", Get("hello")); ++ ASSERT_EQ("there", Get("hi")); ++ ++ // Test that previous recovery produced recoverable state. ++ Open(); ++ ASSERT_LE(1, NumTables()); ++ ASSERT_EQ(1, NumLogs()); ++ if (CanAppend()) { ++ ASSERT_EQ(new_log, FirstLogFile()); ++ } ++ ASSERT_EQ("bar2", Get("foo")); ++ ASSERT_EQ("world", Get("hello")); ++ ASSERT_EQ("there", Get("hi")); ++ ++ // Check that introducing an older log file does not cause it to be re-read. ++ Close(); ++ MakeLogFile(old_log+1, 2000, "hello", "stale write"); ++ Open(); ++ ASSERT_LE(1, NumTables()); ++ ASSERT_EQ(1, NumLogs()); ++ if (CanAppend()) { ++ ASSERT_EQ(new_log, FirstLogFile()); ++ } ++ ASSERT_EQ("bar2", Get("foo")); ++ ASSERT_EQ("world", Get("hello")); ++ ASSERT_EQ("there", Get("hi")); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/repair.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/repair.cc +new file mode 100644 +index 0000000..4cd4bb0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/repair.cc +@@ -0,0 +1,461 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// We recover the contents of the descriptor from the other files we find. ++// (1) Any log files are first converted to tables ++// (2) We scan every table to compute ++// (a) smallest/largest for the table ++// (b) largest sequence number in the table ++// (3) We generate descriptor contents: ++// - log number is set to zero ++// - next-file-number is set to 1 + largest file number we found ++// - last-sequence-number is set to largest sequence# found across ++// all tables (see 2c) ++// - compaction pointers are cleared ++// - every table file is added at level 0 ++// ++// Possible optimization 1: ++// (a) Compute total size and use to pick appropriate max-level M ++// (b) Sort tables by largest sequence# in the table ++// (c) For each table: if it overlaps earlier table, place in level-0, ++// else place in level-M. ++// Possible optimization 2: ++// Store per-table metadata (smallest, largest, largest-seq#, ...) ++// in the table's meta section to speed up ScanTable. ++ ++#include "db/builder.h" ++#include "db/db_impl.h" ++#include "db/dbformat.h" ++#include "db/filename.h" ++#include "db/log_reader.h" ++#include "db/log_writer.h" ++#include "db/memtable.h" ++#include "db/table_cache.h" ++#include "db/version_edit.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/comparator.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++ ++namespace leveldb { ++ ++namespace { ++ ++class Repairer { ++ public: ++ Repairer(const std::string& dbname, const Options& options) ++ : dbname_(dbname), ++ env_(options.env), ++ icmp_(options.comparator), ++ ipolicy_(options.filter_policy), ++ options_(SanitizeOptions(dbname, &icmp_, &ipolicy_, options)), ++ owns_info_log_(options_.info_log != options.info_log), ++ owns_cache_(options_.block_cache != options.block_cache), ++ next_file_number_(1) { ++ // TableCache can be small since we expect each table to be opened once. ++ table_cache_ = new TableCache(dbname_, &options_, 10); ++ } ++ ++ ~Repairer() { ++ delete table_cache_; ++ if (owns_info_log_) { ++ delete options_.info_log; ++ } ++ if (owns_cache_) { ++ delete options_.block_cache; ++ } ++ } ++ ++ Status Run() { ++ Status status = FindFiles(); ++ if (status.ok()) { ++ ConvertLogFilesToTables(); ++ ExtractMetaData(); ++ status = WriteDescriptor(); ++ } ++ if (status.ok()) { ++ unsigned long long bytes = 0; ++ for (size_t i = 0; i < tables_.size(); i++) { ++ bytes += tables_[i].meta.file_size; ++ } ++ Log(options_.info_log, ++ "**** Repaired leveldb %s; " ++ "recovered %d files; %llu bytes. " ++ "Some data may have been lost. " ++ "****", ++ dbname_.c_str(), ++ static_cast(tables_.size()), ++ bytes); ++ } ++ return status; ++ } ++ ++ private: ++ struct TableInfo { ++ FileMetaData meta; ++ SequenceNumber max_sequence; ++ }; ++ ++ std::string const dbname_; ++ Env* const env_; ++ InternalKeyComparator const icmp_; ++ InternalFilterPolicy const ipolicy_; ++ Options const options_; ++ bool owns_info_log_; ++ bool owns_cache_; ++ TableCache* table_cache_; ++ VersionEdit edit_; ++ ++ std::vector manifests_; ++ std::vector table_numbers_; ++ std::vector logs_; ++ std::vector tables_; ++ uint64_t next_file_number_; ++ ++ Status FindFiles() { ++ std::vector filenames; ++ Status status = env_->GetChildren(dbname_, &filenames); ++ if (!status.ok()) { ++ return status; ++ } ++ if (filenames.empty()) { ++ return Status::IOError(dbname_, "repair found no files"); ++ } ++ ++ uint64_t number; ++ FileType type; ++ for (size_t i = 0; i < filenames.size(); i++) { ++ if (ParseFileName(filenames[i], &number, &type)) { ++ if (type == kDescriptorFile) { ++ manifests_.push_back(filenames[i]); ++ } else { ++ if (number + 1 > next_file_number_) { ++ next_file_number_ = number + 1; ++ } ++ if (type == kLogFile) { ++ logs_.push_back(number); ++ } else if (type == kTableFile) { ++ table_numbers_.push_back(number); ++ } else { ++ // Ignore other files ++ } ++ } ++ } ++ } ++ return status; ++ } ++ ++ void ConvertLogFilesToTables() { ++ for (size_t i = 0; i < logs_.size(); i++) { ++ std::string logname = LogFileName(dbname_, logs_[i]); ++ Status status = ConvertLogToTable(logs_[i]); ++ if (!status.ok()) { ++ Log(options_.info_log, "Log #%llu: ignoring conversion error: %s", ++ (unsigned long long) logs_[i], ++ status.ToString().c_str()); ++ } ++ ArchiveFile(logname); ++ } ++ } ++ ++ Status ConvertLogToTable(uint64_t log) { ++ struct LogReporter : public log::Reader::Reporter { ++ Env* env; ++ Logger* info_log; ++ uint64_t lognum; ++ virtual void Corruption(size_t bytes, const Status& s) { ++ // We print error messages for corruption, but continue repairing. ++ Log(info_log, "Log #%llu: dropping %d bytes; %s", ++ (unsigned long long) lognum, ++ static_cast(bytes), ++ s.ToString().c_str()); ++ } ++ }; ++ ++ // Open the log file ++ std::string logname = LogFileName(dbname_, log); ++ SequentialFile* lfile; ++ Status status = env_->NewSequentialFile(logname, &lfile); ++ if (!status.ok()) { ++ return status; ++ } ++ ++ // Create the log reader. ++ LogReporter reporter; ++ reporter.env = env_; ++ reporter.info_log = options_.info_log; ++ reporter.lognum = log; ++ // We intentionally make log::Reader do checksumming so that ++ // corruptions cause entire commits to be skipped instead of ++ // propagating bad information (like overly large sequence ++ // numbers). ++ log::Reader reader(lfile, &reporter, false/*do not checksum*/, ++ 0/*initial_offset*/); ++ ++ // Read all the records and add to a memtable ++ std::string scratch; ++ Slice record; ++ WriteBatch batch; ++ MemTable* mem = new MemTable(icmp_); ++ mem->Ref(); ++ int counter = 0; ++ while (reader.ReadRecord(&record, &scratch)) { ++ if (record.size() < 12) { ++ reporter.Corruption( ++ record.size(), Status::Corruption("log record too small")); ++ continue; ++ } ++ WriteBatchInternal::SetContents(&batch, record); ++ status = WriteBatchInternal::InsertInto(&batch, mem); ++ if (status.ok()) { ++ counter += WriteBatchInternal::Count(&batch); ++ } else { ++ Log(options_.info_log, "Log #%llu: ignoring %s", ++ (unsigned long long) log, ++ status.ToString().c_str()); ++ status = Status::OK(); // Keep going with rest of file ++ } ++ } ++ delete lfile; ++ ++ // Do not record a version edit for this conversion to a Table ++ // since ExtractMetaData() will also generate edits. ++ FileMetaData meta; ++ meta.number = next_file_number_++; ++ Iterator* iter = mem->NewIterator(); ++ status = BuildTable(dbname_, env_, options_, table_cache_, iter, &meta); ++ delete iter; ++ mem->Unref(); ++ mem = NULL; ++ if (status.ok()) { ++ if (meta.file_size > 0) { ++ table_numbers_.push_back(meta.number); ++ } ++ } ++ Log(options_.info_log, "Log #%llu: %d ops saved to Table #%llu %s", ++ (unsigned long long) log, ++ counter, ++ (unsigned long long) meta.number, ++ status.ToString().c_str()); ++ return status; ++ } ++ ++ void ExtractMetaData() { ++ for (size_t i = 0; i < table_numbers_.size(); i++) { ++ ScanTable(table_numbers_[i]); ++ } ++ } ++ ++ Iterator* NewTableIterator(const FileMetaData& meta) { ++ // Same as compaction iterators: if paranoid_checks are on, turn ++ // on checksum verification. ++ ReadOptions r; ++ r.verify_checksums = options_.paranoid_checks; ++ return table_cache_->NewIterator(r, meta.number, meta.file_size); ++ } ++ ++ void ScanTable(uint64_t number) { ++ TableInfo t; ++ t.meta.number = number; ++ std::string fname = TableFileName(dbname_, number); ++ Status status = env_->GetFileSize(fname, &t.meta.file_size); ++ if (!status.ok()) { ++ // Try alternate file name. ++ fname = SSTTableFileName(dbname_, number); ++ Status s2 = env_->GetFileSize(fname, &t.meta.file_size); ++ if (s2.ok()) { ++ status = Status::OK(); ++ } ++ } ++ if (!status.ok()) { ++ ArchiveFile(TableFileName(dbname_, number)); ++ ArchiveFile(SSTTableFileName(dbname_, number)); ++ Log(options_.info_log, "Table #%llu: dropped: %s", ++ (unsigned long long) t.meta.number, ++ status.ToString().c_str()); ++ return; ++ } ++ ++ // Extract metadata by scanning through table. ++ int counter = 0; ++ Iterator* iter = NewTableIterator(t.meta); ++ bool empty = true; ++ ParsedInternalKey parsed; ++ t.max_sequence = 0; ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ Slice key = iter->key(); ++ if (!ParseInternalKey(key, &parsed)) { ++ Log(options_.info_log, "Table #%llu: unparsable key %s", ++ (unsigned long long) t.meta.number, ++ EscapeString(key).c_str()); ++ continue; ++ } ++ ++ counter++; ++ if (empty) { ++ empty = false; ++ t.meta.smallest.DecodeFrom(key); ++ } ++ t.meta.largest.DecodeFrom(key); ++ if (parsed.sequence > t.max_sequence) { ++ t.max_sequence = parsed.sequence; ++ } ++ } ++ if (!iter->status().ok()) { ++ status = iter->status(); ++ } ++ delete iter; ++ Log(options_.info_log, "Table #%llu: %d entries %s", ++ (unsigned long long) t.meta.number, ++ counter, ++ status.ToString().c_str()); ++ ++ if (status.ok()) { ++ tables_.push_back(t); ++ } else { ++ RepairTable(fname, t); // RepairTable archives input file. ++ } ++ } ++ ++ void RepairTable(const std::string& src, TableInfo t) { ++ // We will copy src contents to a new table and then rename the ++ // new table over the source. ++ ++ // Create builder. ++ std::string copy = TableFileName(dbname_, next_file_number_++); ++ WritableFile* file; ++ Status s = env_->NewWritableFile(copy, &file); ++ if (!s.ok()) { ++ return; ++ } ++ TableBuilder* builder = new TableBuilder(options_, file); ++ ++ // Copy data. ++ Iterator* iter = NewTableIterator(t.meta); ++ int counter = 0; ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ builder->Add(iter->key(), iter->value()); ++ counter++; ++ } ++ delete iter; ++ ++ ArchiveFile(src); ++ if (counter == 0) { ++ builder->Abandon(); // Nothing to save ++ } else { ++ s = builder->Finish(); ++ if (s.ok()) { ++ t.meta.file_size = builder->FileSize(); ++ } ++ } ++ delete builder; ++ builder = NULL; ++ ++ if (s.ok()) { ++ s = file->Close(); ++ } ++ delete file; ++ file = NULL; ++ ++ if (counter > 0 && s.ok()) { ++ std::string orig = TableFileName(dbname_, t.meta.number); ++ s = env_->RenameFile(copy, orig); ++ if (s.ok()) { ++ Log(options_.info_log, "Table #%llu: %d entries repaired", ++ (unsigned long long) t.meta.number, counter); ++ tables_.push_back(t); ++ } ++ } ++ if (!s.ok()) { ++ env_->DeleteFile(copy); ++ } ++ } ++ ++ Status WriteDescriptor() { ++ std::string tmp = TempFileName(dbname_, 1); ++ WritableFile* file; ++ Status status = env_->NewWritableFile(tmp, &file); ++ if (!status.ok()) { ++ return status; ++ } ++ ++ SequenceNumber max_sequence = 0; ++ for (size_t i = 0; i < tables_.size(); i++) { ++ if (max_sequence < tables_[i].max_sequence) { ++ max_sequence = tables_[i].max_sequence; ++ } ++ } ++ ++ edit_.SetComparatorName(icmp_.user_comparator()->Name()); ++ edit_.SetLogNumber(0); ++ edit_.SetNextFile(next_file_number_); ++ edit_.SetLastSequence(max_sequence); ++ ++ for (size_t i = 0; i < tables_.size(); i++) { ++ // TODO(opt): separate out into multiple levels ++ const TableInfo& t = tables_[i]; ++ edit_.AddFile(0, t.meta.number, t.meta.file_size, ++ t.meta.smallest, t.meta.largest); ++ } ++ ++ //fprintf(stderr, "NewDescriptor:\n%s\n", edit_.DebugString().c_str()); ++ { ++ log::Writer log(file); ++ std::string record; ++ edit_.EncodeTo(&record); ++ status = log.AddRecord(record); ++ } ++ if (status.ok()) { ++ status = file->Close(); ++ } ++ delete file; ++ file = NULL; ++ ++ if (!status.ok()) { ++ env_->DeleteFile(tmp); ++ } else { ++ // Discard older manifests ++ for (size_t i = 0; i < manifests_.size(); i++) { ++ ArchiveFile(dbname_ + "/" + manifests_[i]); ++ } ++ ++ // Install new manifest ++ status = env_->RenameFile(tmp, DescriptorFileName(dbname_, 1)); ++ if (status.ok()) { ++ status = SetCurrentFile(env_, dbname_, 1); ++ } else { ++ env_->DeleteFile(tmp); ++ } ++ } ++ return status; ++ } ++ ++ void ArchiveFile(const std::string& fname) { ++ // Move into another directory. E.g., for ++ // dir/foo ++ // rename to ++ // dir/lost/foo ++ const char* slash = strrchr(fname.c_str(), '/'); ++ std::string new_dir; ++ if (slash != NULL) { ++ new_dir.assign(fname.data(), slash - fname.data()); ++ } ++ new_dir.append("/lost"); ++ env_->CreateDir(new_dir); // Ignore error ++ std::string new_file = new_dir; ++ new_file.append("/"); ++ new_file.append((slash == NULL) ? fname.c_str() : slash + 1); ++ Status s = env_->RenameFile(fname, new_file); ++ Log(options_.info_log, "Archiving %s: %s\n", ++ fname.c_str(), s.ToString().c_str()); ++ } ++}; ++} // namespace ++ ++Status RepairDB(const std::string& dbname, const Options& options) { ++ Repairer repairer(dbname, options); ++ return repairer.Run(); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist.h +new file mode 100644 +index 0000000..8bd7776 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist.h +@@ -0,0 +1,384 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_SKIPLIST_H_ ++#define STORAGE_LEVELDB_DB_SKIPLIST_H_ ++ ++// Thread safety ++// ------------- ++// ++// Writes require external synchronization, most likely a mutex. ++// Reads require a guarantee that the SkipList will not be destroyed ++// while the read is in progress. Apart from that, reads progress ++// without any internal locking or synchronization. ++// ++// Invariants: ++// ++// (1) Allocated nodes are never deleted until the SkipList is ++// destroyed. This is trivially guaranteed by the code since we ++// never delete any skip list nodes. ++// ++// (2) The contents of a Node except for the next/prev pointers are ++// immutable after the Node has been linked into the SkipList. ++// Only Insert() modifies the list, and it is careful to initialize ++// a node and use release-stores to publish the nodes in one or ++// more lists. ++// ++// ... prev vs. next pointer ordering ... ++ ++#include ++#include ++#include "port/port.h" ++#include "util/arena.h" ++#include "util/random.h" ++ ++namespace leveldb { ++ ++class Arena; ++ ++template ++class SkipList { ++ private: ++ struct Node; ++ ++ public: ++ // Create a new SkipList object that will use "cmp" for comparing keys, ++ // and will allocate memory using "*arena". Objects allocated in the arena ++ // must remain allocated for the lifetime of the skiplist object. ++ explicit SkipList(Comparator cmp, Arena* arena); ++ ++ // Insert key into the list. ++ // REQUIRES: nothing that compares equal to key is currently in the list. ++ void Insert(const Key& key); ++ ++ // Returns true iff an entry that compares equal to key is in the list. ++ bool Contains(const Key& key) const; ++ ++ // Iteration over the contents of a skip list ++ class Iterator { ++ public: ++ // Initialize an iterator over the specified list. ++ // The returned iterator is not valid. ++ explicit Iterator(const SkipList* list); ++ ++ // Returns true iff the iterator is positioned at a valid node. ++ bool Valid() const; ++ ++ // Returns the key at the current position. ++ // REQUIRES: Valid() ++ const Key& key() const; ++ ++ // Advances to the next position. ++ // REQUIRES: Valid() ++ void Next(); ++ ++ // Advances to the previous position. ++ // REQUIRES: Valid() ++ void Prev(); ++ ++ // Advance to the first entry with a key >= target ++ void Seek(const Key& target); ++ ++ // Position at the first entry in list. ++ // Final state of iterator is Valid() iff list is not empty. ++ void SeekToFirst(); ++ ++ // Position at the last entry in list. ++ // Final state of iterator is Valid() iff list is not empty. ++ void SeekToLast(); ++ ++ private: ++ const SkipList* list_; ++ Node* node_; ++ // Intentionally copyable ++ }; ++ ++ private: ++ enum { kMaxHeight = 12 }; ++ ++ // Immutable after construction ++ Comparator const compare_; ++ Arena* const arena_; // Arena used for allocations of nodes ++ ++ Node* const head_; ++ ++ // Modified only by Insert(). Read racily by readers, but stale ++ // values are ok. ++ port::AtomicPointer max_height_; // Height of the entire list ++ ++ inline int GetMaxHeight() const { ++ return static_cast( ++ reinterpret_cast(max_height_.NoBarrier_Load())); ++ } ++ ++ // Read/written only by Insert(). ++ Random rnd_; ++ ++ Node* NewNode(const Key& key, int height); ++ int RandomHeight(); ++ bool Equal(const Key& a, const Key& b) const { return (compare_(a, b) == 0); } ++ ++ // Return true if key is greater than the data stored in "n" ++ bool KeyIsAfterNode(const Key& key, Node* n) const; ++ ++ // Return the earliest node that comes at or after key. ++ // Return NULL if there is no such node. ++ // ++ // If prev is non-NULL, fills prev[level] with pointer to previous ++ // node at "level" for every level in [0..max_height_-1]. ++ Node* FindGreaterOrEqual(const Key& key, Node** prev) const; ++ ++ // Return the latest node with a key < key. ++ // Return head_ if there is no such node. ++ Node* FindLessThan(const Key& key) const; ++ ++ // Return the last node in the list. ++ // Return head_ if list is empty. ++ Node* FindLast() const; ++ ++ // No copying allowed ++ SkipList(const SkipList&); ++ void operator=(const SkipList&); ++}; ++ ++// Implementation details follow ++template ++struct SkipList::Node { ++ explicit Node(const Key& k) : key(k) { } ++ ++ Key const key; ++ ++ // Accessors/mutators for links. Wrapped in methods so we can ++ // add the appropriate barriers as necessary. ++ Node* Next(int n) { ++ assert(n >= 0); ++ // Use an 'acquire load' so that we observe a fully initialized ++ // version of the returned Node. ++ return reinterpret_cast(next_[n].Acquire_Load()); ++ } ++ void SetNext(int n, Node* x) { ++ assert(n >= 0); ++ // Use a 'release store' so that anybody who reads through this ++ // pointer observes a fully initialized version of the inserted node. ++ next_[n].Release_Store(x); ++ } ++ ++ // No-barrier variants that can be safely used in a few locations. ++ Node* NoBarrier_Next(int n) { ++ assert(n >= 0); ++ return reinterpret_cast(next_[n].NoBarrier_Load()); ++ } ++ void NoBarrier_SetNext(int n, Node* x) { ++ assert(n >= 0); ++ next_[n].NoBarrier_Store(x); ++ } ++ ++ private: ++ // Array of length equal to the node height. next_[0] is lowest level link. ++ port::AtomicPointer next_[1]; ++}; ++ ++template ++typename SkipList::Node* ++SkipList::NewNode(const Key& key, int height) { ++ char* mem = arena_->AllocateAligned( ++ sizeof(Node) + sizeof(port::AtomicPointer) * (height - 1)); ++ return new (mem) Node(key); ++} ++ ++template ++inline SkipList::Iterator::Iterator(const SkipList* list) { ++ list_ = list; ++ node_ = NULL; ++} ++ ++template ++inline bool SkipList::Iterator::Valid() const { ++ return node_ != NULL; ++} ++ ++template ++inline const Key& SkipList::Iterator::key() const { ++ assert(Valid()); ++ return node_->key; ++} ++ ++template ++inline void SkipList::Iterator::Next() { ++ assert(Valid()); ++ node_ = node_->Next(0); ++} ++ ++template ++inline void SkipList::Iterator::Prev() { ++ // Instead of using explicit "prev" links, we just search for the ++ // last node that falls before key. ++ assert(Valid()); ++ node_ = list_->FindLessThan(node_->key); ++ if (node_ == list_->head_) { ++ node_ = NULL; ++ } ++} ++ ++template ++inline void SkipList::Iterator::Seek(const Key& target) { ++ node_ = list_->FindGreaterOrEqual(target, NULL); ++} ++ ++template ++inline void SkipList::Iterator::SeekToFirst() { ++ node_ = list_->head_->Next(0); ++} ++ ++template ++inline void SkipList::Iterator::SeekToLast() { ++ node_ = list_->FindLast(); ++ if (node_ == list_->head_) { ++ node_ = NULL; ++ } ++} ++ ++template ++int SkipList::RandomHeight() { ++ // Increase height with probability 1 in kBranching ++ static const unsigned int kBranching = 4; ++ int height = 1; ++ while (height < kMaxHeight && ((rnd_.Next() % kBranching) == 0)) { ++ height++; ++ } ++ assert(height > 0); ++ assert(height <= kMaxHeight); ++ return height; ++} ++ ++template ++bool SkipList::KeyIsAfterNode(const Key& key, Node* n) const { ++ // NULL n is considered infinite ++ return (n != NULL) && (compare_(n->key, key) < 0); ++} ++ ++template ++typename SkipList::Node* SkipList::FindGreaterOrEqual(const Key& key, Node** prev) ++ const { ++ Node* x = head_; ++ int level = GetMaxHeight() - 1; ++ while (true) { ++ Node* next = x->Next(level); ++ if (KeyIsAfterNode(key, next)) { ++ // Keep searching in this list ++ x = next; ++ } else { ++ if (prev != NULL) prev[level] = x; ++ if (level == 0) { ++ return next; ++ } else { ++ // Switch to next list ++ level--; ++ } ++ } ++ } ++} ++ ++template ++typename SkipList::Node* ++SkipList::FindLessThan(const Key& key) const { ++ Node* x = head_; ++ int level = GetMaxHeight() - 1; ++ while (true) { ++ assert(x == head_ || compare_(x->key, key) < 0); ++ Node* next = x->Next(level); ++ if (next == NULL || compare_(next->key, key) >= 0) { ++ if (level == 0) { ++ return x; ++ } else { ++ // Switch to next list ++ level--; ++ } ++ } else { ++ x = next; ++ } ++ } ++} ++ ++template ++typename SkipList::Node* SkipList::FindLast() ++ const { ++ Node* x = head_; ++ int level = GetMaxHeight() - 1; ++ while (true) { ++ Node* next = x->Next(level); ++ if (next == NULL) { ++ if (level == 0) { ++ return x; ++ } else { ++ // Switch to next list ++ level--; ++ } ++ } else { ++ x = next; ++ } ++ } ++} ++ ++template ++SkipList::SkipList(Comparator cmp, Arena* arena) ++ : compare_(cmp), ++ arena_(arena), ++ head_(NewNode(0 /* any key will do */, kMaxHeight)), ++ max_height_(reinterpret_cast(1)), ++ rnd_(0xdeadbeef) { ++ for (int i = 0; i < kMaxHeight; i++) { ++ head_->SetNext(i, NULL); ++ } ++} ++ ++template ++void SkipList::Insert(const Key& key) { ++ // TODO(opt): We can use a barrier-free variant of FindGreaterOrEqual() ++ // here since Insert() is externally synchronized. ++ Node* prev[kMaxHeight]; ++ Node* x = FindGreaterOrEqual(key, prev); ++ ++ // Our data structure does not allow duplicate insertion ++ assert(x == NULL || !Equal(key, x->key)); ++ ++ int height = RandomHeight(); ++ if (height > GetMaxHeight()) { ++ for (int i = GetMaxHeight(); i < height; i++) { ++ prev[i] = head_; ++ } ++ //fprintf(stderr, "Change height from %d to %d\n", max_height_, height); ++ ++ // It is ok to mutate max_height_ without any synchronization ++ // with concurrent readers. A concurrent reader that observes ++ // the new value of max_height_ will see either the old value of ++ // new level pointers from head_ (NULL), or a new value set in ++ // the loop below. In the former case the reader will ++ // immediately drop to the next level since NULL sorts after all ++ // keys. In the latter case the reader will use the new node. ++ max_height_.NoBarrier_Store(reinterpret_cast(height)); ++ } ++ ++ x = NewNode(key, height); ++ for (int i = 0; i < height; i++) { ++ // NoBarrier_SetNext() suffices since we will add a barrier when ++ // we publish a pointer to "x" in prev[i]. ++ x->NoBarrier_SetNext(i, prev[i]->NoBarrier_Next(i)); ++ prev[i]->SetNext(i, x); ++ } ++} ++ ++template ++bool SkipList::Contains(const Key& key) const { ++ Node* x = FindGreaterOrEqual(key, NULL); ++ if (x != NULL && Equal(key, x->key)) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_SKIPLIST_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist_test.cc +new file mode 100644 +index 0000000..aee1461 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist_test.cc +@@ -0,0 +1,378 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/skiplist.h" ++#include ++#include "leveldb/env.h" ++#include "util/arena.h" ++#include "util/hash.h" ++#include "util/random.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++typedef uint64_t Key; ++ ++struct Comparator { ++ int operator()(const Key& a, const Key& b) const { ++ if (a < b) { ++ return -1; ++ } else if (a > b) { ++ return +1; ++ } else { ++ return 0; ++ } ++ } ++}; ++ ++class SkipTest { }; ++ ++TEST(SkipTest, Empty) { ++ Arena arena; ++ Comparator cmp; ++ SkipList list(cmp, &arena); ++ ASSERT_TRUE(!list.Contains(10)); ++ ++ SkipList::Iterator iter(&list); ++ ASSERT_TRUE(!iter.Valid()); ++ iter.SeekToFirst(); ++ ASSERT_TRUE(!iter.Valid()); ++ iter.Seek(100); ++ ASSERT_TRUE(!iter.Valid()); ++ iter.SeekToLast(); ++ ASSERT_TRUE(!iter.Valid()); ++} ++ ++TEST(SkipTest, InsertAndLookup) { ++ const int N = 2000; ++ const int R = 5000; ++ Random rnd(1000); ++ std::set keys; ++ Arena arena; ++ Comparator cmp; ++ SkipList list(cmp, &arena); ++ for (int i = 0; i < N; i++) { ++ Key key = rnd.Next() % R; ++ if (keys.insert(key).second) { ++ list.Insert(key); ++ } ++ } ++ ++ for (int i = 0; i < R; i++) { ++ if (list.Contains(i)) { ++ ASSERT_EQ(keys.count(i), 1); ++ } else { ++ ASSERT_EQ(keys.count(i), 0); ++ } ++ } ++ ++ // Simple iterator tests ++ { ++ SkipList::Iterator iter(&list); ++ ASSERT_TRUE(!iter.Valid()); ++ ++ iter.Seek(0); ++ ASSERT_TRUE(iter.Valid()); ++ ASSERT_EQ(*(keys.begin()), iter.key()); ++ ++ iter.SeekToFirst(); ++ ASSERT_TRUE(iter.Valid()); ++ ASSERT_EQ(*(keys.begin()), iter.key()); ++ ++ iter.SeekToLast(); ++ ASSERT_TRUE(iter.Valid()); ++ ASSERT_EQ(*(keys.rbegin()), iter.key()); ++ } ++ ++ // Forward iteration test ++ for (int i = 0; i < R; i++) { ++ SkipList::Iterator iter(&list); ++ iter.Seek(i); ++ ++ // Compare against model iterator ++ std::set::iterator model_iter = keys.lower_bound(i); ++ for (int j = 0; j < 3; j++) { ++ if (model_iter == keys.end()) { ++ ASSERT_TRUE(!iter.Valid()); ++ break; ++ } else { ++ ASSERT_TRUE(iter.Valid()); ++ ASSERT_EQ(*model_iter, iter.key()); ++ ++model_iter; ++ iter.Next(); ++ } ++ } ++ } ++ ++ // Backward iteration test ++ { ++ SkipList::Iterator iter(&list); ++ iter.SeekToLast(); ++ ++ // Compare against model iterator ++ for (std::set::reverse_iterator model_iter = keys.rbegin(); ++ model_iter != keys.rend(); ++ ++model_iter) { ++ ASSERT_TRUE(iter.Valid()); ++ ASSERT_EQ(*model_iter, iter.key()); ++ iter.Prev(); ++ } ++ ASSERT_TRUE(!iter.Valid()); ++ } ++} ++ ++// We want to make sure that with a single writer and multiple ++// concurrent readers (with no synchronization other than when a ++// reader's iterator is created), the reader always observes all the ++// data that was present in the skip list when the iterator was ++// constructor. Because insertions are happening concurrently, we may ++// also observe new values that were inserted since the iterator was ++// constructed, but we should never miss any values that were present ++// at iterator construction time. ++// ++// We generate multi-part keys: ++// ++// where: ++// key is in range [0..K-1] ++// gen is a generation number for key ++// hash is hash(key,gen) ++// ++// The insertion code picks a random key, sets gen to be 1 + the last ++// generation number inserted for that key, and sets hash to Hash(key,gen). ++// ++// At the beginning of a read, we snapshot the last inserted ++// generation number for each key. We then iterate, including random ++// calls to Next() and Seek(). For every key we encounter, we ++// check that it is either expected given the initial snapshot or has ++// been concurrently added since the iterator started. ++class ConcurrentTest { ++ private: ++ static const uint32_t K = 4; ++ ++ static uint64_t key(Key key) { return (key >> 40); } ++ static uint64_t gen(Key key) { return (key >> 8) & 0xffffffffu; } ++ static uint64_t hash(Key key) { return key & 0xff; } ++ ++ static uint64_t HashNumbers(uint64_t k, uint64_t g) { ++ uint64_t data[2] = { k, g }; ++ return Hash(reinterpret_cast(data), sizeof(data), 0); ++ } ++ ++ static Key MakeKey(uint64_t k, uint64_t g) { ++ assert(sizeof(Key) == sizeof(uint64_t)); ++ assert(k <= K); // We sometimes pass K to seek to the end of the skiplist ++ assert(g <= 0xffffffffu); ++ return ((k << 40) | (g << 8) | (HashNumbers(k, g) & 0xff)); ++ } ++ ++ static bool IsValidKey(Key k) { ++ return hash(k) == (HashNumbers(key(k), gen(k)) & 0xff); ++ } ++ ++ static Key RandomTarget(Random* rnd) { ++ switch (rnd->Next() % 10) { ++ case 0: ++ // Seek to beginning ++ return MakeKey(0, 0); ++ case 1: ++ // Seek to end ++ return MakeKey(K, 0); ++ default: ++ // Seek to middle ++ return MakeKey(rnd->Next() % K, 0); ++ } ++ } ++ ++ // Per-key generation ++ struct State { ++ port::AtomicPointer generation[K]; ++ void Set(int k, intptr_t v) { ++ generation[k].Release_Store(reinterpret_cast(v)); ++ } ++ intptr_t Get(int k) { ++ return reinterpret_cast(generation[k].Acquire_Load()); ++ } ++ ++ State() { ++ for (int k = 0; k < K; k++) { ++ Set(k, 0); ++ } ++ } ++ }; ++ ++ // Current state of the test ++ State current_; ++ ++ Arena arena_; ++ ++ // SkipList is not protected by mu_. We just use a single writer ++ // thread to modify it. ++ SkipList list_; ++ ++ public: ++ ConcurrentTest() : list_(Comparator(), &arena_) { } ++ ++ // REQUIRES: External synchronization ++ void WriteStep(Random* rnd) { ++ const uint32_t k = rnd->Next() % K; ++ const intptr_t g = current_.Get(k) + 1; ++ const Key key = MakeKey(k, g); ++ list_.Insert(key); ++ current_.Set(k, g); ++ } ++ ++ void ReadStep(Random* rnd) { ++ // Remember the initial committed state of the skiplist. ++ State initial_state; ++ for (int k = 0; k < K; k++) { ++ initial_state.Set(k, current_.Get(k)); ++ } ++ ++ Key pos = RandomTarget(rnd); ++ SkipList::Iterator iter(&list_); ++ iter.Seek(pos); ++ while (true) { ++ Key current; ++ if (!iter.Valid()) { ++ current = MakeKey(K, 0); ++ } else { ++ current = iter.key(); ++ ASSERT_TRUE(IsValidKey(current)) << current; ++ } ++ ASSERT_LE(pos, current) << "should not go backwards"; ++ ++ // Verify that everything in [pos,current) was not present in ++ // initial_state. ++ while (pos < current) { ++ ASSERT_LT(key(pos), K) << pos; ++ ++ // Note that generation 0 is never inserted, so it is ok if ++ // <*,0,*> is missing. ++ ASSERT_TRUE((gen(pos) == 0) || ++ (gen(pos) > static_cast(initial_state.Get(key(pos)))) ++ ) << "key: " << key(pos) ++ << "; gen: " << gen(pos) ++ << "; initgen: " ++ << initial_state.Get(key(pos)); ++ ++ // Advance to next key in the valid key space ++ if (key(pos) < key(current)) { ++ pos = MakeKey(key(pos) + 1, 0); ++ } else { ++ pos = MakeKey(key(pos), gen(pos) + 1); ++ } ++ } ++ ++ if (!iter.Valid()) { ++ break; ++ } ++ ++ if (rnd->Next() % 2) { ++ iter.Next(); ++ pos = MakeKey(key(pos), gen(pos) + 1); ++ } else { ++ Key new_target = RandomTarget(rnd); ++ if (new_target > pos) { ++ pos = new_target; ++ iter.Seek(new_target); ++ } ++ } ++ } ++ } ++}; ++const uint32_t ConcurrentTest::K; ++ ++// Simple test that does single-threaded testing of the ConcurrentTest ++// scaffolding. ++TEST(SkipTest, ConcurrentWithoutThreads) { ++ ConcurrentTest test; ++ Random rnd(test::RandomSeed()); ++ for (int i = 0; i < 10000; i++) { ++ test.ReadStep(&rnd); ++ test.WriteStep(&rnd); ++ } ++} ++ ++class TestState { ++ public: ++ ConcurrentTest t_; ++ int seed_; ++ port::AtomicPointer quit_flag_; ++ ++ enum ReaderState { ++ STARTING, ++ RUNNING, ++ DONE ++ }; ++ ++ explicit TestState(int s) ++ : seed_(s), ++ quit_flag_(NULL), ++ state_(STARTING), ++ state_cv_(&mu_) {} ++ ++ void Wait(ReaderState s) { ++ mu_.Lock(); ++ while (state_ != s) { ++ state_cv_.Wait(); ++ } ++ mu_.Unlock(); ++ } ++ ++ void Change(ReaderState s) { ++ mu_.Lock(); ++ state_ = s; ++ state_cv_.Signal(); ++ mu_.Unlock(); ++ } ++ ++ private: ++ port::Mutex mu_; ++ ReaderState state_; ++ port::CondVar state_cv_; ++}; ++ ++static void ConcurrentReader(void* arg) { ++ TestState* state = reinterpret_cast(arg); ++ Random rnd(state->seed_); ++ int64_t reads = 0; ++ state->Change(TestState::RUNNING); ++ while (!state->quit_flag_.Acquire_Load()) { ++ state->t_.ReadStep(&rnd); ++ ++reads; ++ } ++ state->Change(TestState::DONE); ++} ++ ++static void RunConcurrent(int run) { ++ const int seed = test::RandomSeed() + (run * 100); ++ Random rnd(seed); ++ const int N = 1000; ++ const int kSize = 1000; ++ for (int i = 0; i < N; i++) { ++ if ((i % 100) == 0) { ++ fprintf(stderr, "Run %d of %d\n", i, N); ++ } ++ TestState state(seed + 1); ++ Env::Default()->Schedule(ConcurrentReader, &state); ++ state.Wait(TestState::RUNNING); ++ for (int i = 0; i < kSize; i++) { ++ state.t_.WriteStep(&rnd); ++ } ++ state.quit_flag_.Release_Store(&state); // Any non-NULL arg will do ++ state.Wait(TestState::DONE); ++ } ++} ++ ++TEST(SkipTest, Concurrent1) { RunConcurrent(1); } ++TEST(SkipTest, Concurrent2) { RunConcurrent(2); } ++TEST(SkipTest, Concurrent3) { RunConcurrent(3); } ++TEST(SkipTest, Concurrent4) { RunConcurrent(4); } ++TEST(SkipTest, Concurrent5) { RunConcurrent(5); } ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/snapshot.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/snapshot.h +new file mode 100644 +index 0000000..6ed413c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/snapshot.h +@@ -0,0 +1,67 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_SNAPSHOT_H_ ++#define STORAGE_LEVELDB_DB_SNAPSHOT_H_ ++ ++#include "db/dbformat.h" ++#include "leveldb/db.h" ++ ++namespace leveldb { ++ ++class SnapshotList; ++ ++// Snapshots are kept in a doubly-linked list in the DB. ++// Each SnapshotImpl corresponds to a particular sequence number. ++class SnapshotImpl : public Snapshot { ++ public: ++ SequenceNumber number_; // const after creation ++ ++ private: ++ friend class SnapshotList; ++ ++ // SnapshotImpl is kept in a doubly-linked circular list ++ SnapshotImpl* prev_; ++ SnapshotImpl* next_; ++ ++ SnapshotList* list_; // just for sanity checks ++}; ++ ++class SnapshotList { ++ public: ++ SnapshotList() { ++ list_.prev_ = &list_; ++ list_.next_ = &list_; ++ } ++ ++ bool empty() const { return list_.next_ == &list_; } ++ SnapshotImpl* oldest() const { assert(!empty()); return list_.next_; } ++ SnapshotImpl* newest() const { assert(!empty()); return list_.prev_; } ++ ++ const SnapshotImpl* New(SequenceNumber seq) { ++ SnapshotImpl* s = new SnapshotImpl; ++ s->number_ = seq; ++ s->list_ = this; ++ s->next_ = &list_; ++ s->prev_ = list_.prev_; ++ s->prev_->next_ = s; ++ s->next_->prev_ = s; ++ return s; ++ } ++ ++ void Delete(const SnapshotImpl* s) { ++ assert(s->list_ == this); ++ s->prev_->next_ = s->next_; ++ s->next_->prev_ = s->prev_; ++ delete s; ++ } ++ ++ private: ++ // Dummy head of doubly-linked list of snapshots ++ SnapshotImpl list_; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_SNAPSHOT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.cc +new file mode 100644 +index 0000000..e3d82cd +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.cc +@@ -0,0 +1,127 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/table_cache.h" ++ ++#include "db/filename.h" ++#include "leveldb/env.h" ++#include "leveldb/table.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++struct TableAndFile { ++ RandomAccessFile* file; ++ Table* table; ++}; ++ ++static void DeleteEntry(const Slice& key, void* value) { ++ TableAndFile* tf = reinterpret_cast(value); ++ delete tf->table; ++ delete tf->file; ++ delete tf; ++} ++ ++static void UnrefEntry(void* arg1, void* arg2) { ++ Cache* cache = reinterpret_cast(arg1); ++ Cache::Handle* h = reinterpret_cast(arg2); ++ cache->Release(h); ++} ++ ++TableCache::TableCache(const std::string& dbname, ++ const Options* options, ++ int entries) ++ : env_(options->env), ++ dbname_(dbname), ++ options_(options), ++ cache_(NewLRUCache(entries)) { ++} ++ ++TableCache::~TableCache() { ++ delete cache_; ++} ++ ++Status TableCache::FindTable(uint64_t file_number, uint64_t file_size, ++ Cache::Handle** handle) { ++ Status s; ++ char buf[sizeof(file_number)]; ++ EncodeFixed64(buf, file_number); ++ Slice key(buf, sizeof(buf)); ++ *handle = cache_->Lookup(key); ++ if (*handle == NULL) { ++ std::string fname = TableFileName(dbname_, file_number); ++ RandomAccessFile* file = NULL; ++ Table* table = NULL; ++ s = env_->NewRandomAccessFile(fname, &file); ++ if (!s.ok()) { ++ std::string old_fname = SSTTableFileName(dbname_, file_number); ++ if (env_->NewRandomAccessFile(old_fname, &file).ok()) { ++ s = Status::OK(); ++ } ++ } ++ if (s.ok()) { ++ s = Table::Open(*options_, file, file_size, &table); ++ } ++ ++ if (!s.ok()) { ++ assert(table == NULL); ++ delete file; ++ // We do not cache error results so that if the error is transient, ++ // or somebody repairs the file, we recover automatically. ++ } else { ++ TableAndFile* tf = new TableAndFile; ++ tf->file = file; ++ tf->table = table; ++ *handle = cache_->Insert(key, tf, 1, &DeleteEntry); ++ } ++ } ++ return s; ++} ++ ++Iterator* TableCache::NewIterator(const ReadOptions& options, ++ uint64_t file_number, ++ uint64_t file_size, ++ Table** tableptr) { ++ if (tableptr != NULL) { ++ *tableptr = NULL; ++ } ++ ++ Cache::Handle* handle = NULL; ++ Status s = FindTable(file_number, file_size, &handle); ++ if (!s.ok()) { ++ return NewErrorIterator(s); ++ } ++ ++ Table* table = reinterpret_cast(cache_->Value(handle))->table; ++ Iterator* result = table->NewIterator(options); ++ result->RegisterCleanup(&UnrefEntry, cache_, handle); ++ if (tableptr != NULL) { ++ *tableptr = table; ++ } ++ return result; ++} ++ ++Status TableCache::Get(const ReadOptions& options, ++ uint64_t file_number, ++ uint64_t file_size, ++ const Slice& k, ++ void* arg, ++ void (*saver)(void*, const Slice&, const Slice&)) { ++ Cache::Handle* handle = NULL; ++ Status s = FindTable(file_number, file_size, &handle); ++ if (s.ok()) { ++ Table* t = reinterpret_cast(cache_->Value(handle))->table; ++ s = t->InternalGet(options, k, arg, saver); ++ cache_->Release(handle); ++ } ++ return s; ++} ++ ++void TableCache::Evict(uint64_t file_number) { ++ char buf[sizeof(file_number)]; ++ EncodeFixed64(buf, file_number); ++ cache_->Erase(Slice(buf, sizeof(buf))); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.h +new file mode 100644 +index 0000000..8cf4aaf +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.h +@@ -0,0 +1,61 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Thread-safe (provides internal synchronization) ++ ++#ifndef STORAGE_LEVELDB_DB_TABLE_CACHE_H_ ++#define STORAGE_LEVELDB_DB_TABLE_CACHE_H_ ++ ++#include ++#include ++#include "db/dbformat.h" ++#include "leveldb/cache.h" ++#include "leveldb/table.h" ++#include "port/port.h" ++ ++namespace leveldb { ++ ++class Env; ++ ++class TableCache { ++ public: ++ TableCache(const std::string& dbname, const Options* options, int entries); ++ ~TableCache(); ++ ++ // Return an iterator for the specified file number (the corresponding ++ // file length must be exactly "file_size" bytes). If "tableptr" is ++ // non-NULL, also sets "*tableptr" to point to the Table object ++ // underlying the returned iterator, or NULL if no Table object underlies ++ // the returned iterator. The returned "*tableptr" object is owned by ++ // the cache and should not be deleted, and is valid for as long as the ++ // returned iterator is live. ++ Iterator* NewIterator(const ReadOptions& options, ++ uint64_t file_number, ++ uint64_t file_size, ++ Table** tableptr = NULL); ++ ++ // If a seek to internal key "k" in specified file finds an entry, ++ // call (*handle_result)(arg, found_key, found_value). ++ Status Get(const ReadOptions& options, ++ uint64_t file_number, ++ uint64_t file_size, ++ const Slice& k, ++ void* arg, ++ void (*handle_result)(void*, const Slice&, const Slice&)); ++ ++ // Evict any entry for the specified file number ++ void Evict(uint64_t file_number); ++ ++ private: ++ Env* const env_; ++ const std::string dbname_; ++ const Options* options_; ++ Cache* cache_; ++ ++ Status FindTable(uint64_t file_number, uint64_t file_size, Cache::Handle**); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_TABLE_CACHE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.cc +new file mode 100644 +index 0000000..f10a2d5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.cc +@@ -0,0 +1,266 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/version_edit.h" ++ ++#include "db/version_set.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++// Tag numbers for serialized VersionEdit. These numbers are written to ++// disk and should not be changed. ++enum Tag { ++ kComparator = 1, ++ kLogNumber = 2, ++ kNextFileNumber = 3, ++ kLastSequence = 4, ++ kCompactPointer = 5, ++ kDeletedFile = 6, ++ kNewFile = 7, ++ // 8 was used for large value refs ++ kPrevLogNumber = 9 ++}; ++ ++void VersionEdit::Clear() { ++ comparator_.clear(); ++ log_number_ = 0; ++ prev_log_number_ = 0; ++ last_sequence_ = 0; ++ next_file_number_ = 0; ++ has_comparator_ = false; ++ has_log_number_ = false; ++ has_prev_log_number_ = false; ++ has_next_file_number_ = false; ++ has_last_sequence_ = false; ++ deleted_files_.clear(); ++ new_files_.clear(); ++} ++ ++void VersionEdit::EncodeTo(std::string* dst) const { ++ if (has_comparator_) { ++ PutVarint32(dst, kComparator); ++ PutLengthPrefixedSlice(dst, comparator_); ++ } ++ if (has_log_number_) { ++ PutVarint32(dst, kLogNumber); ++ PutVarint64(dst, log_number_); ++ } ++ if (has_prev_log_number_) { ++ PutVarint32(dst, kPrevLogNumber); ++ PutVarint64(dst, prev_log_number_); ++ } ++ if (has_next_file_number_) { ++ PutVarint32(dst, kNextFileNumber); ++ PutVarint64(dst, next_file_number_); ++ } ++ if (has_last_sequence_) { ++ PutVarint32(dst, kLastSequence); ++ PutVarint64(dst, last_sequence_); ++ } ++ ++ for (size_t i = 0; i < compact_pointers_.size(); i++) { ++ PutVarint32(dst, kCompactPointer); ++ PutVarint32(dst, compact_pointers_[i].first); // level ++ PutLengthPrefixedSlice(dst, compact_pointers_[i].second.Encode()); ++ } ++ ++ for (DeletedFileSet::const_iterator iter = deleted_files_.begin(); ++ iter != deleted_files_.end(); ++ ++iter) { ++ PutVarint32(dst, kDeletedFile); ++ PutVarint32(dst, iter->first); // level ++ PutVarint64(dst, iter->second); // file number ++ } ++ ++ for (size_t i = 0; i < new_files_.size(); i++) { ++ const FileMetaData& f = new_files_[i].second; ++ PutVarint32(dst, kNewFile); ++ PutVarint32(dst, new_files_[i].first); // level ++ PutVarint64(dst, f.number); ++ PutVarint64(dst, f.file_size); ++ PutLengthPrefixedSlice(dst, f.smallest.Encode()); ++ PutLengthPrefixedSlice(dst, f.largest.Encode()); ++ } ++} ++ ++static bool GetInternalKey(Slice* input, InternalKey* dst) { ++ Slice str; ++ if (GetLengthPrefixedSlice(input, &str)) { ++ dst->DecodeFrom(str); ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++static bool GetLevel(Slice* input, int* level) { ++ uint32_t v; ++ if (GetVarint32(input, &v) && ++ v < config::kNumLevels) { ++ *level = v; ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++Status VersionEdit::DecodeFrom(const Slice& src) { ++ Clear(); ++ Slice input = src; ++ const char* msg = NULL; ++ uint32_t tag; ++ ++ // Temporary storage for parsing ++ int level; ++ uint64_t number; ++ FileMetaData f; ++ Slice str; ++ InternalKey key; ++ ++ while (msg == NULL && GetVarint32(&input, &tag)) { ++ switch (tag) { ++ case kComparator: ++ if (GetLengthPrefixedSlice(&input, &str)) { ++ comparator_ = str.ToString(); ++ has_comparator_ = true; ++ } else { ++ msg = "comparator name"; ++ } ++ break; ++ ++ case kLogNumber: ++ if (GetVarint64(&input, &log_number_)) { ++ has_log_number_ = true; ++ } else { ++ msg = "log number"; ++ } ++ break; ++ ++ case kPrevLogNumber: ++ if (GetVarint64(&input, &prev_log_number_)) { ++ has_prev_log_number_ = true; ++ } else { ++ msg = "previous log number"; ++ } ++ break; ++ ++ case kNextFileNumber: ++ if (GetVarint64(&input, &next_file_number_)) { ++ has_next_file_number_ = true; ++ } else { ++ msg = "next file number"; ++ } ++ break; ++ ++ case kLastSequence: ++ if (GetVarint64(&input, &last_sequence_)) { ++ has_last_sequence_ = true; ++ } else { ++ msg = "last sequence number"; ++ } ++ break; ++ ++ case kCompactPointer: ++ if (GetLevel(&input, &level) && ++ GetInternalKey(&input, &key)) { ++ compact_pointers_.push_back(std::make_pair(level, key)); ++ } else { ++ msg = "compaction pointer"; ++ } ++ break; ++ ++ case kDeletedFile: ++ if (GetLevel(&input, &level) && ++ GetVarint64(&input, &number)) { ++ deleted_files_.insert(std::make_pair(level, number)); ++ } else { ++ msg = "deleted file"; ++ } ++ break; ++ ++ case kNewFile: ++ if (GetLevel(&input, &level) && ++ GetVarint64(&input, &f.number) && ++ GetVarint64(&input, &f.file_size) && ++ GetInternalKey(&input, &f.smallest) && ++ GetInternalKey(&input, &f.largest)) { ++ new_files_.push_back(std::make_pair(level, f)); ++ } else { ++ msg = "new-file entry"; ++ } ++ break; ++ ++ default: ++ msg = "unknown tag"; ++ break; ++ } ++ } ++ ++ if (msg == NULL && !input.empty()) { ++ msg = "invalid tag"; ++ } ++ ++ Status result; ++ if (msg != NULL) { ++ result = Status::Corruption("VersionEdit", msg); ++ } ++ return result; ++} ++ ++std::string VersionEdit::DebugString() const { ++ std::string r; ++ r.append("VersionEdit {"); ++ if (has_comparator_) { ++ r.append("\n Comparator: "); ++ r.append(comparator_); ++ } ++ if (has_log_number_) { ++ r.append("\n LogNumber: "); ++ AppendNumberTo(&r, log_number_); ++ } ++ if (has_prev_log_number_) { ++ r.append("\n PrevLogNumber: "); ++ AppendNumberTo(&r, prev_log_number_); ++ } ++ if (has_next_file_number_) { ++ r.append("\n NextFile: "); ++ AppendNumberTo(&r, next_file_number_); ++ } ++ if (has_last_sequence_) { ++ r.append("\n LastSeq: "); ++ AppendNumberTo(&r, last_sequence_); ++ } ++ for (size_t i = 0; i < compact_pointers_.size(); i++) { ++ r.append("\n CompactPointer: "); ++ AppendNumberTo(&r, compact_pointers_[i].first); ++ r.append(" "); ++ r.append(compact_pointers_[i].second.DebugString()); ++ } ++ for (DeletedFileSet::const_iterator iter = deleted_files_.begin(); ++ iter != deleted_files_.end(); ++ ++iter) { ++ r.append("\n DeleteFile: "); ++ AppendNumberTo(&r, iter->first); ++ r.append(" "); ++ AppendNumberTo(&r, iter->second); ++ } ++ for (size_t i = 0; i < new_files_.size(); i++) { ++ const FileMetaData& f = new_files_[i].second; ++ r.append("\n AddFile: "); ++ AppendNumberTo(&r, new_files_[i].first); ++ r.append(" "); ++ AppendNumberTo(&r, f.number); ++ r.append(" "); ++ AppendNumberTo(&r, f.file_size); ++ r.append(" "); ++ r.append(f.smallest.DebugString()); ++ r.append(" .. "); ++ r.append(f.largest.DebugString()); ++ } ++ r.append("\n}\n"); ++ return r; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.h +new file mode 100644 +index 0000000..eaef77b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.h +@@ -0,0 +1,107 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_VERSION_EDIT_H_ ++#define STORAGE_LEVELDB_DB_VERSION_EDIT_H_ ++ ++#include ++#include ++#include ++#include "db/dbformat.h" ++ ++namespace leveldb { ++ ++class VersionSet; ++ ++struct FileMetaData { ++ int refs; ++ int allowed_seeks; // Seeks allowed until compaction ++ uint64_t number; ++ uint64_t file_size; // File size in bytes ++ InternalKey smallest; // Smallest internal key served by table ++ InternalKey largest; // Largest internal key served by table ++ ++ FileMetaData() : refs(0), allowed_seeks(1 << 30), file_size(0) { } ++}; ++ ++class VersionEdit { ++ public: ++ VersionEdit() { Clear(); } ++ ~VersionEdit() { } ++ ++ void Clear(); ++ ++ void SetComparatorName(const Slice& name) { ++ has_comparator_ = true; ++ comparator_ = name.ToString(); ++ } ++ void SetLogNumber(uint64_t num) { ++ has_log_number_ = true; ++ log_number_ = num; ++ } ++ void SetPrevLogNumber(uint64_t num) { ++ has_prev_log_number_ = true; ++ prev_log_number_ = num; ++ } ++ void SetNextFile(uint64_t num) { ++ has_next_file_number_ = true; ++ next_file_number_ = num; ++ } ++ void SetLastSequence(SequenceNumber seq) { ++ has_last_sequence_ = true; ++ last_sequence_ = seq; ++ } ++ void SetCompactPointer(int level, const InternalKey& key) { ++ compact_pointers_.push_back(std::make_pair(level, key)); ++ } ++ ++ // Add the specified file at the specified number. ++ // REQUIRES: This version has not been saved (see VersionSet::SaveTo) ++ // REQUIRES: "smallest" and "largest" are smallest and largest keys in file ++ void AddFile(int level, uint64_t file, ++ uint64_t file_size, ++ const InternalKey& smallest, ++ const InternalKey& largest) { ++ FileMetaData f; ++ f.number = file; ++ f.file_size = file_size; ++ f.smallest = smallest; ++ f.largest = largest; ++ new_files_.push_back(std::make_pair(level, f)); ++ } ++ ++ // Delete the specified "file" from the specified "level". ++ void DeleteFile(int level, uint64_t file) { ++ deleted_files_.insert(std::make_pair(level, file)); ++ } ++ ++ void EncodeTo(std::string* dst) const; ++ Status DecodeFrom(const Slice& src); ++ ++ std::string DebugString() const; ++ ++ private: ++ friend class VersionSet; ++ ++ typedef std::set< std::pair > DeletedFileSet; ++ ++ std::string comparator_; ++ uint64_t log_number_; ++ uint64_t prev_log_number_; ++ uint64_t next_file_number_; ++ SequenceNumber last_sequence_; ++ bool has_comparator_; ++ bool has_log_number_; ++ bool has_prev_log_number_; ++ bool has_next_file_number_; ++ bool has_last_sequence_; ++ ++ std::vector< std::pair > compact_pointers_; ++ DeletedFileSet deleted_files_; ++ std::vector< std::pair > new_files_; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_VERSION_EDIT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit_test.cc +new file mode 100644 +index 0000000..280310b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit_test.cc +@@ -0,0 +1,46 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/version_edit.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++static void TestEncodeDecode(const VersionEdit& edit) { ++ std::string encoded, encoded2; ++ edit.EncodeTo(&encoded); ++ VersionEdit parsed; ++ Status s = parsed.DecodeFrom(encoded); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ parsed.EncodeTo(&encoded2); ++ ASSERT_EQ(encoded, encoded2); ++} ++ ++class VersionEditTest { }; ++ ++TEST(VersionEditTest, EncodeDecode) { ++ static const uint64_t kBig = 1ull << 50; ++ ++ VersionEdit edit; ++ for (int i = 0; i < 4; i++) { ++ TestEncodeDecode(edit); ++ edit.AddFile(3, kBig + 300 + i, kBig + 400 + i, ++ InternalKey("foo", kBig + 500 + i, kTypeValue), ++ InternalKey("zoo", kBig + 600 + i, kTypeDeletion)); ++ edit.DeleteFile(4, kBig + 700 + i); ++ edit.SetCompactPointer(i, InternalKey("x", kBig + 900 + i, kTypeValue)); ++ } ++ ++ edit.SetComparatorName("foo"); ++ edit.SetLogNumber(kBig + 100); ++ edit.SetNextFile(kBig + 200); ++ edit.SetLastSequence(kBig + 1000); ++ TestEncodeDecode(edit); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.cc +new file mode 100644 +index 0000000..b1256f9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.cc +@@ -0,0 +1,1535 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/version_set.h" ++ ++#include ++#include ++#include "db/filename.h" ++#include "db/log_reader.h" ++#include "db/log_writer.h" ++#include "db/memtable.h" ++#include "db/table_cache.h" ++#include "leveldb/env.h" ++#include "leveldb/table_builder.h" ++#include "table/merger.h" ++#include "table/two_level_iterator.h" ++#include "util/coding.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++static int TargetFileSize(const Options* options) { ++ return options->max_file_size; ++} ++ ++// Maximum bytes of overlaps in grandparent (i.e., level+2) before we ++// stop building a single file in a level->level+1 compaction. ++static int64_t MaxGrandParentOverlapBytes(const Options* options) { ++ return 10 * TargetFileSize(options); ++} ++ ++// Maximum number of bytes in all compacted files. We avoid expanding ++// the lower level file set of a compaction if it would make the ++// total compaction cover more than this many bytes. ++static int64_t ExpandedCompactionByteSizeLimit(const Options* options) { ++ return 25 * TargetFileSize(options); ++} ++ ++static double MaxBytesForLevel(const Options* options, int level) { ++ // Note: the result for level zero is not really used since we set ++ // the level-0 compaction threshold based on number of files. ++ ++ // Result for both level-0 and level-1 ++ double result = 10. * 1048576.0; ++ while (level > 1) { ++ result *= 10; ++ level--; ++ } ++ return result; ++} ++ ++static uint64_t MaxFileSizeForLevel(const Options* options, int level) { ++ // We could vary per level to reduce number of files? ++ return TargetFileSize(options); ++} ++ ++static int64_t TotalFileSize(const std::vector& files) { ++ int64_t sum = 0; ++ for (size_t i = 0; i < files.size(); i++) { ++ sum += files[i]->file_size; ++ } ++ return sum; ++} ++ ++Version::~Version() { ++ assert(refs_ == 0); ++ ++ // Remove from linked list ++ prev_->next_ = next_; ++ next_->prev_ = prev_; ++ ++ // Drop references to files ++ for (int level = 0; level < config::kNumLevels; level++) { ++ for (size_t i = 0; i < files_[level].size(); i++) { ++ FileMetaData* f = files_[level][i]; ++ assert(f->refs > 0); ++ f->refs--; ++ if (f->refs <= 0) { ++ delete f; ++ } ++ } ++ } ++} ++ ++int FindFile(const InternalKeyComparator& icmp, ++ const std::vector& files, ++ const Slice& key) { ++ uint32_t left = 0; ++ uint32_t right = files.size(); ++ while (left < right) { ++ uint32_t mid = (left + right) / 2; ++ const FileMetaData* f = files[mid]; ++ if (icmp.InternalKeyComparator::Compare(f->largest.Encode(), key) < 0) { ++ // Key at "mid.largest" is < "target". Therefore all ++ // files at or before "mid" are uninteresting. ++ left = mid + 1; ++ } else { ++ // Key at "mid.largest" is >= "target". Therefore all files ++ // after "mid" are uninteresting. ++ right = mid; ++ } ++ } ++ return right; ++} ++ ++static bool AfterFile(const Comparator* ucmp, ++ const Slice* user_key, const FileMetaData* f) { ++ // NULL user_key occurs before all keys and is therefore never after *f ++ return (user_key != NULL && ++ ucmp->Compare(*user_key, f->largest.user_key()) > 0); ++} ++ ++static bool BeforeFile(const Comparator* ucmp, ++ const Slice* user_key, const FileMetaData* f) { ++ // NULL user_key occurs after all keys and is therefore never before *f ++ return (user_key != NULL && ++ ucmp->Compare(*user_key, f->smallest.user_key()) < 0); ++} ++ ++bool SomeFileOverlapsRange( ++ const InternalKeyComparator& icmp, ++ bool disjoint_sorted_files, ++ const std::vector& files, ++ const Slice* smallest_user_key, ++ const Slice* largest_user_key) { ++ const Comparator* ucmp = icmp.user_comparator(); ++ if (!disjoint_sorted_files) { ++ // Need to check against all files ++ for (size_t i = 0; i < files.size(); i++) { ++ const FileMetaData* f = files[i]; ++ if (AfterFile(ucmp, smallest_user_key, f) || ++ BeforeFile(ucmp, largest_user_key, f)) { ++ // No overlap ++ } else { ++ return true; // Overlap ++ } ++ } ++ return false; ++ } ++ ++ // Binary search over file list ++ uint32_t index = 0; ++ if (smallest_user_key != NULL) { ++ // Find the earliest possible internal key for smallest_user_key ++ InternalKey small(*smallest_user_key, kMaxSequenceNumber,kValueTypeForSeek); ++ index = FindFile(icmp, files, small.Encode()); ++ } ++ ++ if (index >= files.size()) { ++ // beginning of range is after all files, so no overlap. ++ return false; ++ } ++ ++ return !BeforeFile(ucmp, largest_user_key, files[index]); ++} ++ ++// An internal iterator. For a given version/level pair, yields ++// information about the files in the level. For a given entry, key() ++// is the largest key that occurs in the file, and value() is an ++// 16-byte value containing the file number and file size, both ++// encoded using EncodeFixed64. ++class Version::LevelFileNumIterator : public Iterator { ++ public: ++ LevelFileNumIterator(const InternalKeyComparator& icmp, ++ const std::vector* flist) ++ : icmp_(icmp), ++ flist_(flist), ++ index_(flist->size()) { // Marks as invalid ++ } ++ virtual bool Valid() const { ++ return index_ < flist_->size(); ++ } ++ virtual void Seek(const Slice& target) { ++ index_ = FindFile(icmp_, *flist_, target); ++ } ++ virtual void SeekToFirst() { index_ = 0; } ++ virtual void SeekToLast() { ++ index_ = flist_->empty() ? 0 : flist_->size() - 1; ++ } ++ virtual void Next() { ++ assert(Valid()); ++ index_++; ++ } ++ virtual void Prev() { ++ assert(Valid()); ++ if (index_ == 0) { ++ index_ = flist_->size(); // Marks as invalid ++ } else { ++ index_--; ++ } ++ } ++ Slice key() const { ++ assert(Valid()); ++ return (*flist_)[index_]->largest.Encode(); ++ } ++ Slice value() const { ++ assert(Valid()); ++ EncodeFixed64(value_buf_, (*flist_)[index_]->number); ++ EncodeFixed64(value_buf_+8, (*flist_)[index_]->file_size); ++ return Slice(value_buf_, sizeof(value_buf_)); ++ } ++ virtual Status status() const { return Status::OK(); } ++ private: ++ const InternalKeyComparator icmp_; ++ const std::vector* const flist_; ++ uint32_t index_; ++ ++ // Backing store for value(). Holds the file number and size. ++ mutable char value_buf_[16]; ++}; ++ ++static Iterator* GetFileIterator(void* arg, ++ const ReadOptions& options, ++ const Slice& file_value) { ++ TableCache* cache = reinterpret_cast(arg); ++ if (file_value.size() != 16) { ++ return NewErrorIterator( ++ Status::Corruption("FileReader invoked with unexpected value")); ++ } else { ++ return cache->NewIterator(options, ++ DecodeFixed64(file_value.data()), ++ DecodeFixed64(file_value.data() + 8)); ++ } ++} ++ ++Iterator* Version::NewConcatenatingIterator(const ReadOptions& options, ++ int level) const { ++ return NewTwoLevelIterator( ++ new LevelFileNumIterator(vset_->icmp_, &files_[level]), ++ &GetFileIterator, vset_->table_cache_, options); ++} ++ ++void Version::AddIterators(const ReadOptions& options, ++ std::vector* iters) { ++ // Merge all level zero files together since they may overlap ++ for (size_t i = 0; i < files_[0].size(); i++) { ++ iters->push_back( ++ vset_->table_cache_->NewIterator( ++ options, files_[0][i]->number, files_[0][i]->file_size)); ++ } ++ ++ // For levels > 0, we can use a concatenating iterator that sequentially ++ // walks through the non-overlapping files in the level, opening them ++ // lazily. ++ for (int level = 1; level < config::kNumLevels; level++) { ++ if (!files_[level].empty()) { ++ iters->push_back(NewConcatenatingIterator(options, level)); ++ } ++ } ++} ++ ++// Callback from TableCache::Get() ++namespace { ++enum SaverState { ++ kNotFound, ++ kFound, ++ kDeleted, ++ kCorrupt, ++}; ++struct Saver { ++ SaverState state; ++ const Comparator* ucmp; ++ Slice user_key; ++ std::string* value; ++}; ++} ++static void SaveValue(void* arg, const Slice& ikey, const Slice& v) { ++ Saver* s = reinterpret_cast(arg); ++ ParsedInternalKey parsed_key; ++ if (!ParseInternalKey(ikey, &parsed_key)) { ++ s->state = kCorrupt; ++ } else { ++ if (s->ucmp->Compare(parsed_key.user_key, s->user_key) == 0) { ++ s->state = (parsed_key.type == kTypeValue) ? kFound : kDeleted; ++ if (s->state == kFound) { ++ s->value->assign(v.data(), v.size()); ++ } ++ } ++ } ++} ++ ++static bool NewestFirst(FileMetaData* a, FileMetaData* b) { ++ return a->number > b->number; ++} ++ ++void Version::ForEachOverlapping(Slice user_key, Slice internal_key, ++ void* arg, ++ bool (*func)(void*, int, FileMetaData*)) { ++ // TODO(sanjay): Change Version::Get() to use this function. ++ const Comparator* ucmp = vset_->icmp_.user_comparator(); ++ ++ // Search level-0 in order from newest to oldest. ++ std::vector tmp; ++ tmp.reserve(files_[0].size()); ++ for (uint32_t i = 0; i < files_[0].size(); i++) { ++ FileMetaData* f = files_[0][i]; ++ if (ucmp->Compare(user_key, f->smallest.user_key()) >= 0 && ++ ucmp->Compare(user_key, f->largest.user_key()) <= 0) { ++ tmp.push_back(f); ++ } ++ } ++ if (!tmp.empty()) { ++ std::sort(tmp.begin(), tmp.end(), NewestFirst); ++ for (uint32_t i = 0; i < tmp.size(); i++) { ++ if (!(*func)(arg, 0, tmp[i])) { ++ return; ++ } ++ } ++ } ++ ++ // Search other levels. ++ for (int level = 1; level < config::kNumLevels; level++) { ++ size_t num_files = files_[level].size(); ++ if (num_files == 0) continue; ++ ++ // Binary search to find earliest index whose largest key >= internal_key. ++ uint32_t index = FindFile(vset_->icmp_, files_[level], internal_key); ++ if (index < num_files) { ++ FileMetaData* f = files_[level][index]; ++ if (ucmp->Compare(user_key, f->smallest.user_key()) < 0) { ++ // All of "f" is past any data for user_key ++ } else { ++ if (!(*func)(arg, level, f)) { ++ return; ++ } ++ } ++ } ++ } ++} ++ ++Status Version::Get(const ReadOptions& options, ++ const LookupKey& k, ++ std::string* value, ++ GetStats* stats) { ++ Slice ikey = k.internal_key(); ++ Slice user_key = k.user_key(); ++ const Comparator* ucmp = vset_->icmp_.user_comparator(); ++ Status s; ++ ++ stats->seek_file = NULL; ++ stats->seek_file_level = -1; ++ FileMetaData* last_file_read = NULL; ++ int last_file_read_level = -1; ++ ++ // We can search level-by-level since entries never hop across ++ // levels. Therefore we are guaranteed that if we find data ++ // in an smaller level, later levels are irrelevant. ++ std::vector tmp; ++ FileMetaData* tmp2; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ size_t num_files = files_[level].size(); ++ if (num_files == 0) continue; ++ ++ // Get the list of files to search in this level ++ FileMetaData* const* files = &files_[level][0]; ++ if (level == 0) { ++ // Level-0 files may overlap each other. Find all files that ++ // overlap user_key and process them in order from newest to oldest. ++ tmp.reserve(num_files); ++ for (uint32_t i = 0; i < num_files; i++) { ++ FileMetaData* f = files[i]; ++ if (ucmp->Compare(user_key, f->smallest.user_key()) >= 0 && ++ ucmp->Compare(user_key, f->largest.user_key()) <= 0) { ++ tmp.push_back(f); ++ } ++ } ++ if (tmp.empty()) continue; ++ ++ std::sort(tmp.begin(), tmp.end(), NewestFirst); ++ files = &tmp[0]; ++ num_files = tmp.size(); ++ } else { ++ // Binary search to find earliest index whose largest key >= ikey. ++ uint32_t index = FindFile(vset_->icmp_, files_[level], ikey); ++ if (index >= num_files) { ++ files = NULL; ++ num_files = 0; ++ } else { ++ tmp2 = files[index]; ++ if (ucmp->Compare(user_key, tmp2->smallest.user_key()) < 0) { ++ // All of "tmp2" is past any data for user_key ++ files = NULL; ++ num_files = 0; ++ } else { ++ files = &tmp2; ++ num_files = 1; ++ } ++ } ++ } ++ ++ for (uint32_t i = 0; i < num_files; ++i) { ++ if (last_file_read != NULL && stats->seek_file == NULL) { ++ // We have had more than one seek for this read. Charge the 1st file. ++ stats->seek_file = last_file_read; ++ stats->seek_file_level = last_file_read_level; ++ } ++ ++ FileMetaData* f = files[i]; ++ last_file_read = f; ++ last_file_read_level = level; ++ ++ Saver saver; ++ saver.state = kNotFound; ++ saver.ucmp = ucmp; ++ saver.user_key = user_key; ++ saver.value = value; ++ s = vset_->table_cache_->Get(options, f->number, f->file_size, ++ ikey, &saver, SaveValue); ++ if (!s.ok()) { ++ return s; ++ } ++ switch (saver.state) { ++ case kNotFound: ++ break; // Keep searching in other files ++ case kFound: ++ return s; ++ case kDeleted: ++ s = Status::NotFound(Slice()); // Use empty error message for speed ++ return s; ++ case kCorrupt: ++ s = Status::Corruption("corrupted key for ", user_key); ++ return s; ++ } ++ } ++ } ++ ++ return Status::NotFound(Slice()); // Use an empty error message for speed ++} ++ ++bool Version::UpdateStats(const GetStats& stats) { ++ FileMetaData* f = stats.seek_file; ++ if (f != NULL) { ++ f->allowed_seeks--; ++ if (f->allowed_seeks <= 0 && file_to_compact_ == NULL) { ++ file_to_compact_ = f; ++ file_to_compact_level_ = stats.seek_file_level; ++ return true; ++ } ++ } ++ return false; ++} ++ ++bool Version::RecordReadSample(Slice internal_key) { ++ ParsedInternalKey ikey; ++ if (!ParseInternalKey(internal_key, &ikey)) { ++ return false; ++ } ++ ++ struct State { ++ GetStats stats; // Holds first matching file ++ int matches; ++ ++ static bool Match(void* arg, int level, FileMetaData* f) { ++ State* state = reinterpret_cast(arg); ++ state->matches++; ++ if (state->matches == 1) { ++ // Remember first match. ++ state->stats.seek_file = f; ++ state->stats.seek_file_level = level; ++ } ++ // We can stop iterating once we have a second match. ++ return state->matches < 2; ++ } ++ }; ++ ++ State state; ++ state.matches = 0; ++ ForEachOverlapping(ikey.user_key, internal_key, &state, &State::Match); ++ ++ // Must have at least two matches since we want to merge across ++ // files. But what if we have a single file that contains many ++ // overwrites and deletions? Should we have another mechanism for ++ // finding such files? ++ if (state.matches >= 2) { ++ // 1MB cost is about 1 seek (see comment in Builder::Apply). ++ return UpdateStats(state.stats); ++ } ++ return false; ++} ++ ++void Version::Ref() { ++ ++refs_; ++} ++ ++void Version::Unref() { ++ assert(this != &vset_->dummy_versions_); ++ assert(refs_ >= 1); ++ --refs_; ++ if (refs_ == 0) { ++ delete this; ++ } ++} ++ ++bool Version::OverlapInLevel(int level, ++ const Slice* smallest_user_key, ++ const Slice* largest_user_key) { ++ return SomeFileOverlapsRange(vset_->icmp_, (level > 0), files_[level], ++ smallest_user_key, largest_user_key); ++} ++ ++int Version::PickLevelForMemTableOutput( ++ const Slice& smallest_user_key, ++ const Slice& largest_user_key) { ++ int level = 0; ++ if (!OverlapInLevel(0, &smallest_user_key, &largest_user_key)) { ++ // Push to next level if there is no overlap in next level, ++ // and the #bytes overlapping in the level after that are limited. ++ InternalKey start(smallest_user_key, kMaxSequenceNumber, kValueTypeForSeek); ++ InternalKey limit(largest_user_key, 0, static_cast(0)); ++ std::vector overlaps; ++ while (level < config::kMaxMemCompactLevel) { ++ if (OverlapInLevel(level + 1, &smallest_user_key, &largest_user_key)) { ++ break; ++ } ++ if (level + 2 < config::kNumLevels) { ++ // Check that file does not overlap too many grandparent bytes. ++ GetOverlappingInputs(level + 2, &start, &limit, &overlaps); ++ const int64_t sum = TotalFileSize(overlaps); ++ if (sum > MaxGrandParentOverlapBytes(vset_->options_)) { ++ break; ++ } ++ } ++ level++; ++ } ++ } ++ return level; ++} ++ ++// Store in "*inputs" all files in "level" that overlap [begin,end] ++void Version::GetOverlappingInputs( ++ int level, ++ const InternalKey* begin, ++ const InternalKey* end, ++ std::vector* inputs) { ++ assert(level >= 0); ++ assert(level < config::kNumLevels); ++ inputs->clear(); ++ Slice user_begin, user_end; ++ if (begin != NULL) { ++ user_begin = begin->user_key(); ++ } ++ if (end != NULL) { ++ user_end = end->user_key(); ++ } ++ const Comparator* user_cmp = vset_->icmp_.user_comparator(); ++ for (size_t i = 0; i < files_[level].size(); ) { ++ FileMetaData* f = files_[level][i++]; ++ const Slice file_start = f->smallest.user_key(); ++ const Slice file_limit = f->largest.user_key(); ++ if (begin != NULL && user_cmp->Compare(file_limit, user_begin) < 0) { ++ // "f" is completely before specified range; skip it ++ } else if (end != NULL && user_cmp->Compare(file_start, user_end) > 0) { ++ // "f" is completely after specified range; skip it ++ } else { ++ inputs->push_back(f); ++ if (level == 0) { ++ // Level-0 files may overlap each other. So check if the newly ++ // added file has expanded the range. If so, restart search. ++ if (begin != NULL && user_cmp->Compare(file_start, user_begin) < 0) { ++ user_begin = file_start; ++ inputs->clear(); ++ i = 0; ++ } else if (end != NULL && user_cmp->Compare(file_limit, user_end) > 0) { ++ user_end = file_limit; ++ inputs->clear(); ++ i = 0; ++ } ++ } ++ } ++ } ++} ++ ++std::string Version::DebugString() const { ++ std::string r; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ // E.g., ++ // --- level 1 --- ++ // 17:123['a' .. 'd'] ++ // 20:43['e' .. 'g'] ++ r.append("--- level "); ++ AppendNumberTo(&r, level); ++ r.append(" ---\n"); ++ const std::vector& files = files_[level]; ++ for (size_t i = 0; i < files.size(); i++) { ++ r.push_back(' '); ++ AppendNumberTo(&r, files[i]->number); ++ r.push_back(':'); ++ AppendNumberTo(&r, files[i]->file_size); ++ r.append("["); ++ r.append(files[i]->smallest.DebugString()); ++ r.append(" .. "); ++ r.append(files[i]->largest.DebugString()); ++ r.append("]\n"); ++ } ++ } ++ return r; ++} ++ ++// A helper class so we can efficiently apply a whole sequence ++// of edits to a particular state without creating intermediate ++// Versions that contain full copies of the intermediate state. ++class VersionSet::Builder { ++ private: ++ // Helper to sort by v->files_[file_number].smallest ++ struct BySmallestKey { ++ const InternalKeyComparator* internal_comparator; ++ ++ bool operator()(FileMetaData* f1, FileMetaData* f2) const { ++ int r = internal_comparator->Compare(f1->smallest, f2->smallest); ++ if (r != 0) { ++ return (r < 0); ++ } else { ++ // Break ties by file number ++ return (f1->number < f2->number); ++ } ++ } ++ }; ++ ++ typedef std::set FileSet; ++ struct LevelState { ++ std::set deleted_files; ++ FileSet* added_files; ++ }; ++ ++ VersionSet* vset_; ++ Version* base_; ++ LevelState levels_[config::kNumLevels]; ++ ++ public: ++ // Initialize a builder with the files from *base and other info from *vset ++ Builder(VersionSet* vset, Version* base) ++ : vset_(vset), ++ base_(base) { ++ base_->Ref(); ++ BySmallestKey cmp; ++ cmp.internal_comparator = &vset_->icmp_; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ levels_[level].added_files = new FileSet(cmp); ++ } ++ } ++ ++ ~Builder() { ++ for (int level = 0; level < config::kNumLevels; level++) { ++ const FileSet* added = levels_[level].added_files; ++ std::vector to_unref; ++ to_unref.reserve(added->size()); ++ for (FileSet::const_iterator it = added->begin(); ++ it != added->end(); ++it) { ++ to_unref.push_back(*it); ++ } ++ delete added; ++ for (uint32_t i = 0; i < to_unref.size(); i++) { ++ FileMetaData* f = to_unref[i]; ++ f->refs--; ++ if (f->refs <= 0) { ++ delete f; ++ } ++ } ++ } ++ base_->Unref(); ++ } ++ ++ // Apply all of the edits in *edit to the current state. ++ void Apply(VersionEdit* edit) { ++ // Update compaction pointers ++ for (size_t i = 0; i < edit->compact_pointers_.size(); i++) { ++ const int level = edit->compact_pointers_[i].first; ++ vset_->compact_pointer_[level] = ++ edit->compact_pointers_[i].second.Encode().ToString(); ++ } ++ ++ // Delete files ++ const VersionEdit::DeletedFileSet& del = edit->deleted_files_; ++ for (VersionEdit::DeletedFileSet::const_iterator iter = del.begin(); ++ iter != del.end(); ++ ++iter) { ++ const int level = iter->first; ++ const uint64_t number = iter->second; ++ levels_[level].deleted_files.insert(number); ++ } ++ ++ // Add new files ++ for (size_t i = 0; i < edit->new_files_.size(); i++) { ++ const int level = edit->new_files_[i].first; ++ FileMetaData* f = new FileMetaData(edit->new_files_[i].second); ++ f->refs = 1; ++ ++ // We arrange to automatically compact this file after ++ // a certain number of seeks. Let's assume: ++ // (1) One seek costs 10ms ++ // (2) Writing or reading 1MB costs 10ms (100MB/s) ++ // (3) A compaction of 1MB does 25MB of IO: ++ // 1MB read from this level ++ // 10-12MB read from next level (boundaries may be misaligned) ++ // 10-12MB written to next level ++ // This implies that 25 seeks cost the same as the compaction ++ // of 1MB of data. I.e., one seek costs approximately the ++ // same as the compaction of 40KB of data. We are a little ++ // conservative and allow approximately one seek for every 16KB ++ // of data before triggering a compaction. ++ f->allowed_seeks = (f->file_size / 16384); ++ if (f->allowed_seeks < 100) f->allowed_seeks = 100; ++ ++ levels_[level].deleted_files.erase(f->number); ++ levels_[level].added_files->insert(f); ++ } ++ } ++ ++ // Save the current state in *v. ++ void SaveTo(Version* v) { ++ BySmallestKey cmp; ++ cmp.internal_comparator = &vset_->icmp_; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ // Merge the set of added files with the set of pre-existing files. ++ // Drop any deleted files. Store the result in *v. ++ const std::vector& base_files = base_->files_[level]; ++ std::vector::const_iterator base_iter = base_files.begin(); ++ std::vector::const_iterator base_end = base_files.end(); ++ const FileSet* added = levels_[level].added_files; ++ v->files_[level].reserve(base_files.size() + added->size()); ++ for (FileSet::const_iterator added_iter = added->begin(); ++ added_iter != added->end(); ++ ++added_iter) { ++ // Add all smaller files listed in base_ ++ for (std::vector::const_iterator bpos ++ = std::upper_bound(base_iter, base_end, *added_iter, cmp); ++ base_iter != bpos; ++ ++base_iter) { ++ MaybeAddFile(v, level, *base_iter); ++ } ++ ++ MaybeAddFile(v, level, *added_iter); ++ } ++ ++ // Add remaining base files ++ for (; base_iter != base_end; ++base_iter) { ++ MaybeAddFile(v, level, *base_iter); ++ } ++ ++#ifndef NDEBUG ++ // Make sure there is no overlap in levels > 0 ++ if (level > 0) { ++ for (uint32_t i = 1; i < v->files_[level].size(); i++) { ++ const InternalKey& prev_end = v->files_[level][i-1]->largest; ++ const InternalKey& this_begin = v->files_[level][i]->smallest; ++ if (vset_->icmp_.Compare(prev_end, this_begin) >= 0) { ++ fprintf(stderr, "overlapping ranges in same level %s vs. %s\n", ++ prev_end.DebugString().c_str(), ++ this_begin.DebugString().c_str()); ++ abort(); ++ } ++ } ++ } ++#endif ++ } ++ } ++ ++ void MaybeAddFile(Version* v, int level, FileMetaData* f) { ++ if (levels_[level].deleted_files.count(f->number) > 0) { ++ // File is deleted: do nothing ++ } else { ++ std::vector* files = &v->files_[level]; ++ if (level > 0 && !files->empty()) { ++ // Must not overlap ++ assert(vset_->icmp_.Compare((*files)[files->size()-1]->largest, ++ f->smallest) < 0); ++ } ++ f->refs++; ++ files->push_back(f); ++ } ++ } ++}; ++ ++VersionSet::VersionSet(const std::string& dbname, ++ const Options* options, ++ TableCache* table_cache, ++ const InternalKeyComparator* cmp) ++ : env_(options->env), ++ dbname_(dbname), ++ options_(options), ++ table_cache_(table_cache), ++ icmp_(*cmp), ++ next_file_number_(2), ++ manifest_file_number_(0), // Filled by Recover() ++ last_sequence_(0), ++ log_number_(0), ++ prev_log_number_(0), ++ descriptor_file_(NULL), ++ descriptor_log_(NULL), ++ dummy_versions_(this), ++ current_(NULL) { ++ AppendVersion(new Version(this)); ++} ++ ++VersionSet::~VersionSet() { ++ current_->Unref(); ++ assert(dummy_versions_.next_ == &dummy_versions_); // List must be empty ++ delete descriptor_log_; ++ delete descriptor_file_; ++} ++ ++void VersionSet::AppendVersion(Version* v) { ++ // Make "v" current ++ assert(v->refs_ == 0); ++ assert(v != current_); ++ if (current_ != NULL) { ++ current_->Unref(); ++ } ++ current_ = v; ++ v->Ref(); ++ ++ // Append to linked list ++ v->prev_ = dummy_versions_.prev_; ++ v->next_ = &dummy_versions_; ++ v->prev_->next_ = v; ++ v->next_->prev_ = v; ++} ++ ++Status VersionSet::LogAndApply(VersionEdit* edit, port::Mutex* mu) { ++ if (edit->has_log_number_) { ++ assert(edit->log_number_ >= log_number_); ++ assert(edit->log_number_ < next_file_number_); ++ } else { ++ edit->SetLogNumber(log_number_); ++ } ++ ++ if (!edit->has_prev_log_number_) { ++ edit->SetPrevLogNumber(prev_log_number_); ++ } ++ ++ edit->SetNextFile(next_file_number_); ++ edit->SetLastSequence(last_sequence_); ++ ++ Version* v = new Version(this); ++ { ++ Builder builder(this, current_); ++ builder.Apply(edit); ++ builder.SaveTo(v); ++ } ++ Finalize(v); ++ ++ // Initialize new descriptor log file if necessary by creating ++ // a temporary file that contains a snapshot of the current version. ++ std::string new_manifest_file; ++ Status s; ++ if (descriptor_log_ == NULL) { ++ // No reason to unlock *mu here since we only hit this path in the ++ // first call to LogAndApply (when opening the database). ++ assert(descriptor_file_ == NULL); ++ new_manifest_file = DescriptorFileName(dbname_, manifest_file_number_); ++ edit->SetNextFile(next_file_number_); ++ s = env_->NewWritableFile(new_manifest_file, &descriptor_file_); ++ if (s.ok()) { ++ descriptor_log_ = new log::Writer(descriptor_file_); ++ s = WriteSnapshot(descriptor_log_); ++ } ++ } ++ ++ // Unlock during expensive MANIFEST log write ++ { ++ mu->Unlock(); ++ ++ // Write new record to MANIFEST log ++ if (s.ok()) { ++ std::string record; ++ edit->EncodeTo(&record); ++ s = descriptor_log_->AddRecord(record); ++ if (s.ok()) { ++ s = descriptor_file_->Sync(); ++ } ++ if (!s.ok()) { ++ Log(options_->info_log, "MANIFEST write: %s\n", s.ToString().c_str()); ++ } ++ } ++ ++ // If we just created a new descriptor file, install it by writing a ++ // new CURRENT file that points to it. ++ if (s.ok() && !new_manifest_file.empty()) { ++ s = SetCurrentFile(env_, dbname_, manifest_file_number_); ++ } ++ ++ mu->Lock(); ++ } ++ ++ // Install the new version ++ if (s.ok()) { ++ AppendVersion(v); ++ log_number_ = edit->log_number_; ++ prev_log_number_ = edit->prev_log_number_; ++ } else { ++ delete v; ++ if (!new_manifest_file.empty()) { ++ delete descriptor_log_; ++ delete descriptor_file_; ++ descriptor_log_ = NULL; ++ descriptor_file_ = NULL; ++ env_->DeleteFile(new_manifest_file); ++ } ++ } ++ ++ return s; ++} ++ ++Status VersionSet::Recover(bool *save_manifest) { ++ struct LogReporter : public log::Reader::Reporter { ++ Status* status; ++ virtual void Corruption(size_t bytes, const Status& s) { ++ if (this->status->ok()) *this->status = s; ++ } ++ }; ++ ++ // Read "CURRENT" file, which contains a pointer to the current manifest file ++ std::string current; ++ Status s = ReadFileToString(env_, CurrentFileName(dbname_), ¤t); ++ if (!s.ok()) { ++ return s; ++ } ++ if (current.empty() || current[current.size()-1] != '\n') { ++ return Status::Corruption("CURRENT file does not end with newline"); ++ } ++ current.resize(current.size() - 1); ++ ++ std::string dscname = dbname_ + "/" + current; ++ SequentialFile* file; ++ s = env_->NewSequentialFile(dscname, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ ++ bool have_log_number = false; ++ bool have_prev_log_number = false; ++ bool have_next_file = false; ++ bool have_last_sequence = false; ++ uint64_t next_file = 0; ++ uint64_t last_sequence = 0; ++ uint64_t log_number = 0; ++ uint64_t prev_log_number = 0; ++ Builder builder(this, current_); ++ ++ { ++ LogReporter reporter; ++ reporter.status = &s; ++ log::Reader reader(file, &reporter, true/*checksum*/, 0/*initial_offset*/); ++ Slice record; ++ std::string scratch; ++ while (reader.ReadRecord(&record, &scratch) && s.ok()) { ++ VersionEdit edit; ++ s = edit.DecodeFrom(record); ++ if (s.ok()) { ++ if (edit.has_comparator_ && ++ edit.comparator_ != icmp_.user_comparator()->Name()) { ++ s = Status::InvalidArgument( ++ edit.comparator_ + " does not match existing comparator ", ++ icmp_.user_comparator()->Name()); ++ } ++ } ++ ++ if (s.ok()) { ++ builder.Apply(&edit); ++ } ++ ++ if (edit.has_log_number_) { ++ log_number = edit.log_number_; ++ have_log_number = true; ++ } ++ ++ if (edit.has_prev_log_number_) { ++ prev_log_number = edit.prev_log_number_; ++ have_prev_log_number = true; ++ } ++ ++ if (edit.has_next_file_number_) { ++ next_file = edit.next_file_number_; ++ have_next_file = true; ++ } ++ ++ if (edit.has_last_sequence_) { ++ last_sequence = edit.last_sequence_; ++ have_last_sequence = true; ++ } ++ } ++ } ++ delete file; ++ file = NULL; ++ ++ if (s.ok()) { ++ if (!have_next_file) { ++ s = Status::Corruption("no meta-nextfile entry in descriptor"); ++ } else if (!have_log_number) { ++ s = Status::Corruption("no meta-lognumber entry in descriptor"); ++ } else if (!have_last_sequence) { ++ s = Status::Corruption("no last-sequence-number entry in descriptor"); ++ } ++ ++ if (!have_prev_log_number) { ++ prev_log_number = 0; ++ } ++ ++ MarkFileNumberUsed(prev_log_number); ++ MarkFileNumberUsed(log_number); ++ } ++ ++ if (s.ok()) { ++ Version* v = new Version(this); ++ builder.SaveTo(v); ++ // Install recovered version ++ Finalize(v); ++ AppendVersion(v); ++ manifest_file_number_ = next_file; ++ next_file_number_ = next_file + 1; ++ last_sequence_ = last_sequence; ++ log_number_ = log_number; ++ prev_log_number_ = prev_log_number; ++ ++ // See if we can reuse the existing MANIFEST file. ++ if (ReuseManifest(dscname, current)) { ++ // No need to save new manifest ++ } else { ++ *save_manifest = true; ++ } ++ } ++ ++ return s; ++} ++ ++bool VersionSet::ReuseManifest(const std::string& dscname, ++ const std::string& dscbase) { ++ if (!options_->reuse_logs) { ++ return false; ++ } ++ FileType manifest_type; ++ uint64_t manifest_number; ++ uint64_t manifest_size; ++ if (!ParseFileName(dscbase, &manifest_number, &manifest_type) || ++ manifest_type != kDescriptorFile || ++ !env_->GetFileSize(dscname, &manifest_size).ok() || ++ // Make new compacted MANIFEST if old one is too big ++ manifest_size >= TargetFileSize(options_)) { ++ return false; ++ } ++ ++ assert(descriptor_file_ == NULL); ++ assert(descriptor_log_ == NULL); ++ Status r = env_->NewAppendableFile(dscname, &descriptor_file_); ++ if (!r.ok()) { ++ Log(options_->info_log, "Reuse MANIFEST: %s\n", r.ToString().c_str()); ++ assert(descriptor_file_ == NULL); ++ return false; ++ } ++ ++ Log(options_->info_log, "Reusing MANIFEST %s\n", dscname.c_str()); ++ descriptor_log_ = new log::Writer(descriptor_file_, manifest_size); ++ manifest_file_number_ = manifest_number; ++ return true; ++} ++ ++void VersionSet::MarkFileNumberUsed(uint64_t number) { ++ if (next_file_number_ <= number) { ++ next_file_number_ = number + 1; ++ } ++} ++ ++void VersionSet::Finalize(Version* v) { ++ // Precomputed best level for next compaction ++ int best_level = -1; ++ double best_score = -1; ++ ++ for (int level = 0; level < config::kNumLevels-1; level++) { ++ double score; ++ if (level == 0) { ++ // We treat level-0 specially by bounding the number of files ++ // instead of number of bytes for two reasons: ++ // ++ // (1) With larger write-buffer sizes, it is nice not to do too ++ // many level-0 compactions. ++ // ++ // (2) The files in level-0 are merged on every read and ++ // therefore we wish to avoid too many files when the individual ++ // file size is small (perhaps because of a small write-buffer ++ // setting, or very high compression ratios, or lots of ++ // overwrites/deletions). ++ score = v->files_[level].size() / ++ static_cast(config::kL0_CompactionTrigger); ++ } else { ++ // Compute the ratio of current size to size limit. ++ const uint64_t level_bytes = TotalFileSize(v->files_[level]); ++ score = ++ static_cast(level_bytes) / MaxBytesForLevel(options_, level); ++ } ++ ++ if (score > best_score) { ++ best_level = level; ++ best_score = score; ++ } ++ } ++ ++ v->compaction_level_ = best_level; ++ v->compaction_score_ = best_score; ++} ++ ++Status VersionSet::WriteSnapshot(log::Writer* log) { ++ // TODO: Break up into multiple records to reduce memory usage on recovery? ++ ++ // Save metadata ++ VersionEdit edit; ++ edit.SetComparatorName(icmp_.user_comparator()->Name()); ++ ++ // Save compaction pointers ++ for (int level = 0; level < config::kNumLevels; level++) { ++ if (!compact_pointer_[level].empty()) { ++ InternalKey key; ++ key.DecodeFrom(compact_pointer_[level]); ++ edit.SetCompactPointer(level, key); ++ } ++ } ++ ++ // Save files ++ for (int level = 0; level < config::kNumLevels; level++) { ++ const std::vector& files = current_->files_[level]; ++ for (size_t i = 0; i < files.size(); i++) { ++ const FileMetaData* f = files[i]; ++ edit.AddFile(level, f->number, f->file_size, f->smallest, f->largest); ++ } ++ } ++ ++ std::string record; ++ edit.EncodeTo(&record); ++ return log->AddRecord(record); ++} ++ ++int VersionSet::NumLevelFiles(int level) const { ++ assert(level >= 0); ++ assert(level < config::kNumLevels); ++ return current_->files_[level].size(); ++} ++ ++const char* VersionSet::LevelSummary(LevelSummaryStorage* scratch) const { ++ // Update code if kNumLevels changes ++ assert(config::kNumLevels == 7); ++ snprintf(scratch->buffer, sizeof(scratch->buffer), ++ "files[ %d %d %d %d %d %d %d ]", ++ int(current_->files_[0].size()), ++ int(current_->files_[1].size()), ++ int(current_->files_[2].size()), ++ int(current_->files_[3].size()), ++ int(current_->files_[4].size()), ++ int(current_->files_[5].size()), ++ int(current_->files_[6].size())); ++ return scratch->buffer; ++} ++ ++uint64_t VersionSet::ApproximateOffsetOf(Version* v, const InternalKey& ikey) { ++ uint64_t result = 0; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ const std::vector& files = v->files_[level]; ++ for (size_t i = 0; i < files.size(); i++) { ++ if (icmp_.Compare(files[i]->largest, ikey) <= 0) { ++ // Entire file is before "ikey", so just add the file size ++ result += files[i]->file_size; ++ } else if (icmp_.Compare(files[i]->smallest, ikey) > 0) { ++ // Entire file is after "ikey", so ignore ++ if (level > 0) { ++ // Files other than level 0 are sorted by meta->smallest, so ++ // no further files in this level will contain data for ++ // "ikey". ++ break; ++ } ++ } else { ++ // "ikey" falls in the range for this table. Add the ++ // approximate offset of "ikey" within the table. ++ Table* tableptr; ++ Iterator* iter = table_cache_->NewIterator( ++ ReadOptions(), files[i]->number, files[i]->file_size, &tableptr); ++ if (tableptr != NULL) { ++ result += tableptr->ApproximateOffsetOf(ikey.Encode()); ++ } ++ delete iter; ++ } ++ } ++ } ++ return result; ++} ++ ++void VersionSet::AddLiveFiles(std::set* live) { ++ for (Version* v = dummy_versions_.next_; ++ v != &dummy_versions_; ++ v = v->next_) { ++ for (int level = 0; level < config::kNumLevels; level++) { ++ const std::vector& files = v->files_[level]; ++ for (size_t i = 0; i < files.size(); i++) { ++ live->insert(files[i]->number); ++ } ++ } ++ } ++} ++ ++int64_t VersionSet::NumLevelBytes(int level) const { ++ assert(level >= 0); ++ assert(level < config::kNumLevels); ++ return TotalFileSize(current_->files_[level]); ++} ++ ++int64_t VersionSet::MaxNextLevelOverlappingBytes() { ++ int64_t result = 0; ++ std::vector overlaps; ++ for (int level = 1; level < config::kNumLevels - 1; level++) { ++ for (size_t i = 0; i < current_->files_[level].size(); i++) { ++ const FileMetaData* f = current_->files_[level][i]; ++ current_->GetOverlappingInputs(level+1, &f->smallest, &f->largest, ++ &overlaps); ++ const int64_t sum = TotalFileSize(overlaps); ++ if (sum > result) { ++ result = sum; ++ } ++ } ++ } ++ return result; ++} ++ ++// Stores the minimal range that covers all entries in inputs in ++// *smallest, *largest. ++// REQUIRES: inputs is not empty ++void VersionSet::GetRange(const std::vector& inputs, ++ InternalKey* smallest, ++ InternalKey* largest) { ++ assert(!inputs.empty()); ++ smallest->Clear(); ++ largest->Clear(); ++ for (size_t i = 0; i < inputs.size(); i++) { ++ FileMetaData* f = inputs[i]; ++ if (i == 0) { ++ *smallest = f->smallest; ++ *largest = f->largest; ++ } else { ++ if (icmp_.Compare(f->smallest, *smallest) < 0) { ++ *smallest = f->smallest; ++ } ++ if (icmp_.Compare(f->largest, *largest) > 0) { ++ *largest = f->largest; ++ } ++ } ++ } ++} ++ ++// Stores the minimal range that covers all entries in inputs1 and inputs2 ++// in *smallest, *largest. ++// REQUIRES: inputs is not empty ++void VersionSet::GetRange2(const std::vector& inputs1, ++ const std::vector& inputs2, ++ InternalKey* smallest, ++ InternalKey* largest) { ++ std::vector all = inputs1; ++ all.insert(all.end(), inputs2.begin(), inputs2.end()); ++ GetRange(all, smallest, largest); ++} ++ ++Iterator* VersionSet::MakeInputIterator(Compaction* c) { ++ ReadOptions options; ++ options.verify_checksums = options_->paranoid_checks; ++ options.fill_cache = false; ++ ++ // Level-0 files have to be merged together. For other levels, ++ // we will make a concatenating iterator per level. ++ // TODO(opt): use concatenating iterator for level-0 if there is no overlap ++ const int space = (c->level() == 0 ? c->inputs_[0].size() + 1 : 2); ++ Iterator** list = new Iterator*[space]; ++ int num = 0; ++ for (int which = 0; which < 2; which++) { ++ if (!c->inputs_[which].empty()) { ++ if (c->level() + which == 0) { ++ const std::vector& files = c->inputs_[which]; ++ for (size_t i = 0; i < files.size(); i++) { ++ list[num++] = table_cache_->NewIterator( ++ options, files[i]->number, files[i]->file_size); ++ } ++ } else { ++ // Create concatenating iterator for the files from this level ++ list[num++] = NewTwoLevelIterator( ++ new Version::LevelFileNumIterator(icmp_, &c->inputs_[which]), ++ &GetFileIterator, table_cache_, options); ++ } ++ } ++ } ++ assert(num <= space); ++ Iterator* result = NewMergingIterator(&icmp_, list, num); ++ delete[] list; ++ return result; ++} ++ ++Compaction* VersionSet::PickCompaction() { ++ Compaction* c; ++ int level; ++ ++ // We prefer compactions triggered by too much data in a level over ++ // the compactions triggered by seeks. ++ const bool size_compaction = (current_->compaction_score_ >= 1); ++ const bool seek_compaction = (current_->file_to_compact_ != NULL); ++ if (size_compaction) { ++ level = current_->compaction_level_; ++ assert(level >= 0); ++ assert(level+1 < config::kNumLevels); ++ c = new Compaction(options_, level); ++ ++ // Pick the first file that comes after compact_pointer_[level] ++ for (size_t i = 0; i < current_->files_[level].size(); i++) { ++ FileMetaData* f = current_->files_[level][i]; ++ if (compact_pointer_[level].empty() || ++ icmp_.Compare(f->largest.Encode(), compact_pointer_[level]) > 0) { ++ c->inputs_[0].push_back(f); ++ break; ++ } ++ } ++ if (c->inputs_[0].empty()) { ++ // Wrap-around to the beginning of the key space ++ c->inputs_[0].push_back(current_->files_[level][0]); ++ } ++ } else if (seek_compaction) { ++ level = current_->file_to_compact_level_; ++ c = new Compaction(options_, level); ++ c->inputs_[0].push_back(current_->file_to_compact_); ++ } else { ++ return NULL; ++ } ++ ++ c->input_version_ = current_; ++ c->input_version_->Ref(); ++ ++ // Files in level 0 may overlap each other, so pick up all overlapping ones ++ if (level == 0) { ++ InternalKey smallest, largest; ++ GetRange(c->inputs_[0], &smallest, &largest); ++ // Note that the next call will discard the file we placed in ++ // c->inputs_[0] earlier and replace it with an overlapping set ++ // which will include the picked file. ++ current_->GetOverlappingInputs(0, &smallest, &largest, &c->inputs_[0]); ++ assert(!c->inputs_[0].empty()); ++ } ++ ++ SetupOtherInputs(c); ++ ++ return c; ++} ++ ++void VersionSet::SetupOtherInputs(Compaction* c) { ++ const int level = c->level(); ++ InternalKey smallest, largest; ++ GetRange(c->inputs_[0], &smallest, &largest); ++ ++ current_->GetOverlappingInputs(level+1, &smallest, &largest, &c->inputs_[1]); ++ ++ // Get entire range covered by compaction ++ InternalKey all_start, all_limit; ++ GetRange2(c->inputs_[0], c->inputs_[1], &all_start, &all_limit); ++ ++ // See if we can grow the number of inputs in "level" without ++ // changing the number of "level+1" files we pick up. ++ if (!c->inputs_[1].empty()) { ++ std::vector expanded0; ++ current_->GetOverlappingInputs(level, &all_start, &all_limit, &expanded0); ++ const int64_t inputs0_size = TotalFileSize(c->inputs_[0]); ++ const int64_t inputs1_size = TotalFileSize(c->inputs_[1]); ++ const int64_t expanded0_size = TotalFileSize(expanded0); ++ if (expanded0.size() > c->inputs_[0].size() && ++ inputs1_size + expanded0_size < ++ ExpandedCompactionByteSizeLimit(options_)) { ++ InternalKey new_start, new_limit; ++ GetRange(expanded0, &new_start, &new_limit); ++ std::vector expanded1; ++ current_->GetOverlappingInputs(level+1, &new_start, &new_limit, ++ &expanded1); ++ if (expanded1.size() == c->inputs_[1].size()) { ++ Log(options_->info_log, ++ "Expanding@%d %d+%d (%ld+%ld bytes) to %d+%d (%ld+%ld bytes)\n", ++ level, ++ int(c->inputs_[0].size()), ++ int(c->inputs_[1].size()), ++ long(inputs0_size), long(inputs1_size), ++ int(expanded0.size()), ++ int(expanded1.size()), ++ long(expanded0_size), long(inputs1_size)); ++ smallest = new_start; ++ largest = new_limit; ++ c->inputs_[0] = expanded0; ++ c->inputs_[1] = expanded1; ++ GetRange2(c->inputs_[0], c->inputs_[1], &all_start, &all_limit); ++ } ++ } ++ } ++ ++ // Compute the set of grandparent files that overlap this compaction ++ // (parent == level+1; grandparent == level+2) ++ if (level + 2 < config::kNumLevels) { ++ current_->GetOverlappingInputs(level + 2, &all_start, &all_limit, ++ &c->grandparents_); ++ } ++ ++ if (false) { ++ Log(options_->info_log, "Compacting %d '%s' .. '%s'", ++ level, ++ smallest.DebugString().c_str(), ++ largest.DebugString().c_str()); ++ } ++ ++ // Update the place where we will do the next compaction for this level. ++ // We update this immediately instead of waiting for the VersionEdit ++ // to be applied so that if the compaction fails, we will try a different ++ // key range next time. ++ compact_pointer_[level] = largest.Encode().ToString(); ++ c->edit_.SetCompactPointer(level, largest); ++} ++ ++Compaction* VersionSet::CompactRange( ++ int level, ++ const InternalKey* begin, ++ const InternalKey* end) { ++ std::vector inputs; ++ current_->GetOverlappingInputs(level, begin, end, &inputs); ++ if (inputs.empty()) { ++ return NULL; ++ } ++ ++ // Avoid compacting too much in one shot in case the range is large. ++ // But we cannot do this for level-0 since level-0 files can overlap ++ // and we must not pick one file and drop another older file if the ++ // two files overlap. ++ if (level > 0) { ++ const uint64_t limit = MaxFileSizeForLevel(options_, level); ++ uint64_t total = 0; ++ for (size_t i = 0; i < inputs.size(); i++) { ++ uint64_t s = inputs[i]->file_size; ++ total += s; ++ if (total >= limit) { ++ inputs.resize(i + 1); ++ break; ++ } ++ } ++ } ++ ++ Compaction* c = new Compaction(options_, level); ++ c->input_version_ = current_; ++ c->input_version_->Ref(); ++ c->inputs_[0] = inputs; ++ SetupOtherInputs(c); ++ return c; ++} ++ ++Compaction::Compaction(const Options* options, int level) ++ : level_(level), ++ max_output_file_size_(MaxFileSizeForLevel(options, level)), ++ input_version_(NULL), ++ grandparent_index_(0), ++ seen_key_(false), ++ overlapped_bytes_(0) { ++ for (int i = 0; i < config::kNumLevels; i++) { ++ level_ptrs_[i] = 0; ++ } ++} ++ ++Compaction::~Compaction() { ++ if (input_version_ != NULL) { ++ input_version_->Unref(); ++ } ++} ++ ++bool Compaction::IsTrivialMove() const { ++ const VersionSet* vset = input_version_->vset_; ++ // Avoid a move if there is lots of overlapping grandparent data. ++ // Otherwise, the move could create a parent file that will require ++ // a very expensive merge later on. ++ return (num_input_files(0) == 1 && num_input_files(1) == 0 && ++ TotalFileSize(grandparents_) <= ++ MaxGrandParentOverlapBytes(vset->options_)); ++} ++ ++void Compaction::AddInputDeletions(VersionEdit* edit) { ++ for (int which = 0; which < 2; which++) { ++ for (size_t i = 0; i < inputs_[which].size(); i++) { ++ edit->DeleteFile(level_ + which, inputs_[which][i]->number); ++ } ++ } ++} ++ ++bool Compaction::IsBaseLevelForKey(const Slice& user_key) { ++ // Maybe use binary search to find right entry instead of linear search? ++ const Comparator* user_cmp = input_version_->vset_->icmp_.user_comparator(); ++ for (int lvl = level_ + 2; lvl < config::kNumLevels; lvl++) { ++ const std::vector& files = input_version_->files_[lvl]; ++ for (; level_ptrs_[lvl] < files.size(); ) { ++ FileMetaData* f = files[level_ptrs_[lvl]]; ++ if (user_cmp->Compare(user_key, f->largest.user_key()) <= 0) { ++ // We've advanced far enough ++ if (user_cmp->Compare(user_key, f->smallest.user_key()) >= 0) { ++ // Key falls in this file's range, so definitely not base level ++ return false; ++ } ++ break; ++ } ++ level_ptrs_[lvl]++; ++ } ++ } ++ return true; ++} ++ ++bool Compaction::ShouldStopBefore(const Slice& internal_key) { ++ const VersionSet* vset = input_version_->vset_; ++ // Scan to find earliest grandparent file that contains key. ++ const InternalKeyComparator* icmp = &vset->icmp_; ++ while (grandparent_index_ < grandparents_.size() && ++ icmp->Compare(internal_key, ++ grandparents_[grandparent_index_]->largest.Encode()) > 0) { ++ if (seen_key_) { ++ overlapped_bytes_ += grandparents_[grandparent_index_]->file_size; ++ } ++ grandparent_index_++; ++ } ++ seen_key_ = true; ++ ++ if (overlapped_bytes_ > MaxGrandParentOverlapBytes(vset->options_)) { ++ // Too much overlap for current output; start new output ++ overlapped_bytes_ = 0; ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++void Compaction::ReleaseInputs() { ++ if (input_version_ != NULL) { ++ input_version_->Unref(); ++ input_version_ = NULL; ++ } ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.h +new file mode 100644 +index 0000000..c4e7ac3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.h +@@ -0,0 +1,398 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// The representation of a DBImpl consists of a set of Versions. The ++// newest version is called "current". Older versions may be kept ++// around to provide a consistent view to live iterators. ++// ++// Each Version keeps track of a set of Table files per level. The ++// entire set of versions is maintained in a VersionSet. ++// ++// Version,VersionSet are thread-compatible, but require external ++// synchronization on all accesses. ++ ++#ifndef STORAGE_LEVELDB_DB_VERSION_SET_H_ ++#define STORAGE_LEVELDB_DB_VERSION_SET_H_ ++ ++#include ++#include ++#include ++#include "db/dbformat.h" ++#include "db/version_edit.h" ++#include "port/port.h" ++#include "port/thread_annotations.h" ++ ++namespace leveldb { ++ ++namespace log { class Writer; } ++ ++class Compaction; ++class Iterator; ++class MemTable; ++class TableBuilder; ++class TableCache; ++class Version; ++class VersionSet; ++class WritableFile; ++ ++// Return the smallest index i such that files[i]->largest >= key. ++// Return files.size() if there is no such file. ++// REQUIRES: "files" contains a sorted list of non-overlapping files. ++extern int FindFile(const InternalKeyComparator& icmp, ++ const std::vector& files, ++ const Slice& key); ++ ++// Returns true iff some file in "files" overlaps the user key range ++// [*smallest,*largest]. ++// smallest==NULL represents a key smaller than all keys in the DB. ++// largest==NULL represents a key largest than all keys in the DB. ++// REQUIRES: If disjoint_sorted_files, files[] contains disjoint ranges ++// in sorted order. ++extern bool SomeFileOverlapsRange( ++ const InternalKeyComparator& icmp, ++ bool disjoint_sorted_files, ++ const std::vector& files, ++ const Slice* smallest_user_key, ++ const Slice* largest_user_key); ++ ++class Version { ++ public: ++ // Append to *iters a sequence of iterators that will ++ // yield the contents of this Version when merged together. ++ // REQUIRES: This version has been saved (see VersionSet::SaveTo) ++ void AddIterators(const ReadOptions&, std::vector* iters); ++ ++ // Lookup the value for key. If found, store it in *val and ++ // return OK. Else return a non-OK status. Fills *stats. ++ // REQUIRES: lock is not held ++ struct GetStats { ++ FileMetaData* seek_file; ++ int seek_file_level; ++ }; ++ Status Get(const ReadOptions&, const LookupKey& key, std::string* val, ++ GetStats* stats); ++ ++ // Adds "stats" into the current state. Returns true if a new ++ // compaction may need to be triggered, false otherwise. ++ // REQUIRES: lock is held ++ bool UpdateStats(const GetStats& stats); ++ ++ // Record a sample of bytes read at the specified internal key. ++ // Samples are taken approximately once every config::kReadBytesPeriod ++ // bytes. Returns true if a new compaction may need to be triggered. ++ // REQUIRES: lock is held ++ bool RecordReadSample(Slice key); ++ ++ // Reference count management (so Versions do not disappear out from ++ // under live iterators) ++ void Ref(); ++ void Unref(); ++ ++ void GetOverlappingInputs( ++ int level, ++ const InternalKey* begin, // NULL means before all keys ++ const InternalKey* end, // NULL means after all keys ++ std::vector* inputs); ++ ++ // Returns true iff some file in the specified level overlaps ++ // some part of [*smallest_user_key,*largest_user_key]. ++ // smallest_user_key==NULL represents a key smaller than all keys in the DB. ++ // largest_user_key==NULL represents a key largest than all keys in the DB. ++ bool OverlapInLevel(int level, ++ const Slice* smallest_user_key, ++ const Slice* largest_user_key); ++ ++ // Return the level at which we should place a new memtable compaction ++ // result that covers the range [smallest_user_key,largest_user_key]. ++ int PickLevelForMemTableOutput(const Slice& smallest_user_key, ++ const Slice& largest_user_key); ++ ++ int NumFiles(int level) const { return files_[level].size(); } ++ ++ // Return a human readable string that describes this version's contents. ++ std::string DebugString() const; ++ ++ private: ++ friend class Compaction; ++ friend class VersionSet; ++ ++ class LevelFileNumIterator; ++ Iterator* NewConcatenatingIterator(const ReadOptions&, int level) const; ++ ++ // Call func(arg, level, f) for every file that overlaps user_key in ++ // order from newest to oldest. If an invocation of func returns ++ // false, makes no more calls. ++ // ++ // REQUIRES: user portion of internal_key == user_key. ++ void ForEachOverlapping(Slice user_key, Slice internal_key, ++ void* arg, ++ bool (*func)(void*, int, FileMetaData*)); ++ ++ VersionSet* vset_; // VersionSet to which this Version belongs ++ Version* next_; // Next version in linked list ++ Version* prev_; // Previous version in linked list ++ int refs_; // Number of live refs to this version ++ ++ // List of files per level ++ std::vector files_[config::kNumLevels]; ++ ++ // Next file to compact based on seek stats. ++ FileMetaData* file_to_compact_; ++ int file_to_compact_level_; ++ ++ // Level that should be compacted next and its compaction score. ++ // Score < 1 means compaction is not strictly needed. These fields ++ // are initialized by Finalize(). ++ double compaction_score_; ++ int compaction_level_; ++ ++ explicit Version(VersionSet* vset) ++ : vset_(vset), next_(this), prev_(this), refs_(0), ++ file_to_compact_(NULL), ++ file_to_compact_level_(-1), ++ compaction_score_(-1), ++ compaction_level_(-1) { ++ } ++ ++ ~Version(); ++ ++ // No copying allowed ++ Version(const Version&); ++ void operator=(const Version&); ++}; ++ ++class VersionSet { ++ public: ++ VersionSet(const std::string& dbname, ++ const Options* options, ++ TableCache* table_cache, ++ const InternalKeyComparator*); ++ ~VersionSet(); ++ ++ // Apply *edit to the current version to form a new descriptor that ++ // is both saved to persistent state and installed as the new ++ // current version. Will release *mu while actually writing to the file. ++ // REQUIRES: *mu is held on entry. ++ // REQUIRES: no other thread concurrently calls LogAndApply() ++ Status LogAndApply(VersionEdit* edit, port::Mutex* mu) ++ EXCLUSIVE_LOCKS_REQUIRED(mu); ++ ++ // Recover the last saved descriptor from persistent storage. ++ Status Recover(bool *save_manifest); ++ ++ // Return the current version. ++ Version* current() const { return current_; } ++ ++ // Return the current manifest file number ++ uint64_t ManifestFileNumber() const { return manifest_file_number_; } ++ ++ // Allocate and return a new file number ++ uint64_t NewFileNumber() { return next_file_number_++; } ++ ++ // Arrange to reuse "file_number" unless a newer file number has ++ // already been allocated. ++ // REQUIRES: "file_number" was returned by a call to NewFileNumber(). ++ void ReuseFileNumber(uint64_t file_number) { ++ if (next_file_number_ == file_number + 1) { ++ next_file_number_ = file_number; ++ } ++ } ++ ++ // Return the number of Table files at the specified level. ++ int NumLevelFiles(int level) const; ++ ++ // Return the combined file size of all files at the specified level. ++ int64_t NumLevelBytes(int level) const; ++ ++ // Return the last sequence number. ++ uint64_t LastSequence() const { return last_sequence_; } ++ ++ // Set the last sequence number to s. ++ void SetLastSequence(uint64_t s) { ++ assert(s >= last_sequence_); ++ last_sequence_ = s; ++ } ++ ++ // Mark the specified file number as used. ++ void MarkFileNumberUsed(uint64_t number); ++ ++ // Return the current log file number. ++ uint64_t LogNumber() const { return log_number_; } ++ ++ // Return the log file number for the log file that is currently ++ // being compacted, or zero if there is no such log file. ++ uint64_t PrevLogNumber() const { return prev_log_number_; } ++ ++ // Pick level and inputs for a new compaction. ++ // Returns NULL if there is no compaction to be done. ++ // Otherwise returns a pointer to a heap-allocated object that ++ // describes the compaction. Caller should delete the result. ++ Compaction* PickCompaction(); ++ ++ // Return a compaction object for compacting the range [begin,end] in ++ // the specified level. Returns NULL if there is nothing in that ++ // level that overlaps the specified range. Caller should delete ++ // the result. ++ Compaction* CompactRange( ++ int level, ++ const InternalKey* begin, ++ const InternalKey* end); ++ ++ // Return the maximum overlapping data (in bytes) at next level for any ++ // file at a level >= 1. ++ int64_t MaxNextLevelOverlappingBytes(); ++ ++ // Create an iterator that reads over the compaction inputs for "*c". ++ // The caller should delete the iterator when no longer needed. ++ Iterator* MakeInputIterator(Compaction* c); ++ ++ // Returns true iff some level needs a compaction. ++ bool NeedsCompaction() const { ++ Version* v = current_; ++ return (v->compaction_score_ >= 1) || (v->file_to_compact_ != NULL); ++ } ++ ++ // Add all files listed in any live version to *live. ++ // May also mutate some internal state. ++ void AddLiveFiles(std::set* live); ++ ++ // Return the approximate offset in the database of the data for ++ // "key" as of version "v". ++ uint64_t ApproximateOffsetOf(Version* v, const InternalKey& key); ++ ++ // Return a human-readable short (single-line) summary of the number ++ // of files per level. Uses *scratch as backing store. ++ struct LevelSummaryStorage { ++ char buffer[100]; ++ }; ++ const char* LevelSummary(LevelSummaryStorage* scratch) const; ++ ++ private: ++ class Builder; ++ ++ friend class Compaction; ++ friend class Version; ++ ++ bool ReuseManifest(const std::string& dscname, const std::string& dscbase); ++ ++ void Finalize(Version* v); ++ ++ void GetRange(const std::vector& inputs, ++ InternalKey* smallest, ++ InternalKey* largest); ++ ++ void GetRange2(const std::vector& inputs1, ++ const std::vector& inputs2, ++ InternalKey* smallest, ++ InternalKey* largest); ++ ++ void SetupOtherInputs(Compaction* c); ++ ++ // Save current contents to *log ++ Status WriteSnapshot(log::Writer* log); ++ ++ void AppendVersion(Version* v); ++ ++ Env* const env_; ++ const std::string dbname_; ++ const Options* const options_; ++ TableCache* const table_cache_; ++ const InternalKeyComparator icmp_; ++ uint64_t next_file_number_; ++ uint64_t manifest_file_number_; ++ uint64_t last_sequence_; ++ uint64_t log_number_; ++ uint64_t prev_log_number_; // 0 or backing store for memtable being compacted ++ ++ // Opened lazily ++ WritableFile* descriptor_file_; ++ log::Writer* descriptor_log_; ++ Version dummy_versions_; // Head of circular doubly-linked list of versions. ++ Version* current_; // == dummy_versions_.prev_ ++ ++ // Per-level key at which the next compaction at that level should start. ++ // Either an empty string, or a valid InternalKey. ++ std::string compact_pointer_[config::kNumLevels]; ++ ++ // No copying allowed ++ VersionSet(const VersionSet&); ++ void operator=(const VersionSet&); ++}; ++ ++// A Compaction encapsulates information about a compaction. ++class Compaction { ++ public: ++ ~Compaction(); ++ ++ // Return the level that is being compacted. Inputs from "level" ++ // and "level+1" will be merged to produce a set of "level+1" files. ++ int level() const { return level_; } ++ ++ // Return the object that holds the edits to the descriptor done ++ // by this compaction. ++ VersionEdit* edit() { return &edit_; } ++ ++ // "which" must be either 0 or 1 ++ int num_input_files(int which) const { return inputs_[which].size(); } ++ ++ // Return the ith input file at "level()+which" ("which" must be 0 or 1). ++ FileMetaData* input(int which, int i) const { return inputs_[which][i]; } ++ ++ // Maximum size of files to build during this compaction. ++ uint64_t MaxOutputFileSize() const { return max_output_file_size_; } ++ ++ // Is this a trivial compaction that can be implemented by just ++ // moving a single input file to the next level (no merging or splitting) ++ bool IsTrivialMove() const; ++ ++ // Add all inputs to this compaction as delete operations to *edit. ++ void AddInputDeletions(VersionEdit* edit); ++ ++ // Returns true if the information we have available guarantees that ++ // the compaction is producing data in "level+1" for which no data exists ++ // in levels greater than "level+1". ++ bool IsBaseLevelForKey(const Slice& user_key); ++ ++ // Returns true iff we should stop building the current output ++ // before processing "internal_key". ++ bool ShouldStopBefore(const Slice& internal_key); ++ ++ // Release the input version for the compaction, once the compaction ++ // is successful. ++ void ReleaseInputs(); ++ ++ private: ++ friend class Version; ++ friend class VersionSet; ++ ++ Compaction(const Options* options, int level); ++ ++ int level_; ++ uint64_t max_output_file_size_; ++ Version* input_version_; ++ VersionEdit edit_; ++ ++ // Each compaction reads inputs from "level_" and "level_+1" ++ std::vector inputs_[2]; // The two sets of inputs ++ ++ // State used to check for number of of overlapping grandparent files ++ // (parent == level_ + 1, grandparent == level_ + 2) ++ std::vector grandparents_; ++ size_t grandparent_index_; // Index in grandparent_starts_ ++ bool seen_key_; // Some output key has been seen ++ int64_t overlapped_bytes_; // Bytes of overlap between current output ++ // and grandparent files ++ ++ // State for implementing IsBaseLevelForKey ++ ++ // level_ptrs_ holds indices into input_version_->levels_: our state ++ // is that we are positioned at one of the file ranges for each ++ // higher level than the ones involved in this compaction (i.e. for ++ // all L >= level_ + 2). ++ size_t level_ptrs_[config::kNumLevels]; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_DB_VERSION_SET_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set_test.cc +new file mode 100644 +index 0000000..501e34d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set_test.cc +@@ -0,0 +1,179 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "db/version_set.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++class FindFileTest { ++ public: ++ std::vector files_; ++ bool disjoint_sorted_files_; ++ ++ FindFileTest() : disjoint_sorted_files_(true) { } ++ ++ ~FindFileTest() { ++ for (int i = 0; i < files_.size(); i++) { ++ delete files_[i]; ++ } ++ } ++ ++ void Add(const char* smallest, const char* largest, ++ SequenceNumber smallest_seq = 100, ++ SequenceNumber largest_seq = 100) { ++ FileMetaData* f = new FileMetaData; ++ f->number = files_.size() + 1; ++ f->smallest = InternalKey(smallest, smallest_seq, kTypeValue); ++ f->largest = InternalKey(largest, largest_seq, kTypeValue); ++ files_.push_back(f); ++ } ++ ++ int Find(const char* key) { ++ InternalKey target(key, 100, kTypeValue); ++ InternalKeyComparator cmp(BytewiseComparator()); ++ return FindFile(cmp, files_, target.Encode()); ++ } ++ ++ bool Overlaps(const char* smallest, const char* largest) { ++ InternalKeyComparator cmp(BytewiseComparator()); ++ Slice s(smallest != NULL ? smallest : ""); ++ Slice l(largest != NULL ? largest : ""); ++ return SomeFileOverlapsRange(cmp, disjoint_sorted_files_, files_, ++ (smallest != NULL ? &s : NULL), ++ (largest != NULL ? &l : NULL)); ++ } ++}; ++ ++TEST(FindFileTest, Empty) { ++ ASSERT_EQ(0, Find("foo")); ++ ASSERT_TRUE(! Overlaps("a", "z")); ++ ASSERT_TRUE(! Overlaps(NULL, "z")); ++ ASSERT_TRUE(! Overlaps("a", NULL)); ++ ASSERT_TRUE(! Overlaps(NULL, NULL)); ++} ++ ++TEST(FindFileTest, Single) { ++ Add("p", "q"); ++ ASSERT_EQ(0, Find("a")); ++ ASSERT_EQ(0, Find("p")); ++ ASSERT_EQ(0, Find("p1")); ++ ASSERT_EQ(0, Find("q")); ++ ASSERT_EQ(1, Find("q1")); ++ ASSERT_EQ(1, Find("z")); ++ ++ ASSERT_TRUE(! Overlaps("a", "b")); ++ ASSERT_TRUE(! Overlaps("z1", "z2")); ++ ASSERT_TRUE(Overlaps("a", "p")); ++ ASSERT_TRUE(Overlaps("a", "q")); ++ ASSERT_TRUE(Overlaps("a", "z")); ++ ASSERT_TRUE(Overlaps("p", "p1")); ++ ASSERT_TRUE(Overlaps("p", "q")); ++ ASSERT_TRUE(Overlaps("p", "z")); ++ ASSERT_TRUE(Overlaps("p1", "p2")); ++ ASSERT_TRUE(Overlaps("p1", "z")); ++ ASSERT_TRUE(Overlaps("q", "q")); ++ ASSERT_TRUE(Overlaps("q", "q1")); ++ ++ ASSERT_TRUE(! Overlaps(NULL, "j")); ++ ASSERT_TRUE(! Overlaps("r", NULL)); ++ ASSERT_TRUE(Overlaps(NULL, "p")); ++ ASSERT_TRUE(Overlaps(NULL, "p1")); ++ ASSERT_TRUE(Overlaps("q", NULL)); ++ ASSERT_TRUE(Overlaps(NULL, NULL)); ++} ++ ++ ++TEST(FindFileTest, Multiple) { ++ Add("150", "200"); ++ Add("200", "250"); ++ Add("300", "350"); ++ Add("400", "450"); ++ ASSERT_EQ(0, Find("100")); ++ ASSERT_EQ(0, Find("150")); ++ ASSERT_EQ(0, Find("151")); ++ ASSERT_EQ(0, Find("199")); ++ ASSERT_EQ(0, Find("200")); ++ ASSERT_EQ(1, Find("201")); ++ ASSERT_EQ(1, Find("249")); ++ ASSERT_EQ(1, Find("250")); ++ ASSERT_EQ(2, Find("251")); ++ ASSERT_EQ(2, Find("299")); ++ ASSERT_EQ(2, Find("300")); ++ ASSERT_EQ(2, Find("349")); ++ ASSERT_EQ(2, Find("350")); ++ ASSERT_EQ(3, Find("351")); ++ ASSERT_EQ(3, Find("400")); ++ ASSERT_EQ(3, Find("450")); ++ ASSERT_EQ(4, Find("451")); ++ ++ ASSERT_TRUE(! Overlaps("100", "149")); ++ ASSERT_TRUE(! Overlaps("251", "299")); ++ ASSERT_TRUE(! Overlaps("451", "500")); ++ ASSERT_TRUE(! Overlaps("351", "399")); ++ ++ ASSERT_TRUE(Overlaps("100", "150")); ++ ASSERT_TRUE(Overlaps("100", "200")); ++ ASSERT_TRUE(Overlaps("100", "300")); ++ ASSERT_TRUE(Overlaps("100", "400")); ++ ASSERT_TRUE(Overlaps("100", "500")); ++ ASSERT_TRUE(Overlaps("375", "400")); ++ ASSERT_TRUE(Overlaps("450", "450")); ++ ASSERT_TRUE(Overlaps("450", "500")); ++} ++ ++TEST(FindFileTest, MultipleNullBoundaries) { ++ Add("150", "200"); ++ Add("200", "250"); ++ Add("300", "350"); ++ Add("400", "450"); ++ ASSERT_TRUE(! Overlaps(NULL, "149")); ++ ASSERT_TRUE(! Overlaps("451", NULL)); ++ ASSERT_TRUE(Overlaps(NULL, NULL)); ++ ASSERT_TRUE(Overlaps(NULL, "150")); ++ ASSERT_TRUE(Overlaps(NULL, "199")); ++ ASSERT_TRUE(Overlaps(NULL, "200")); ++ ASSERT_TRUE(Overlaps(NULL, "201")); ++ ASSERT_TRUE(Overlaps(NULL, "400")); ++ ASSERT_TRUE(Overlaps(NULL, "800")); ++ ASSERT_TRUE(Overlaps("100", NULL)); ++ ASSERT_TRUE(Overlaps("200", NULL)); ++ ASSERT_TRUE(Overlaps("449", NULL)); ++ ASSERT_TRUE(Overlaps("450", NULL)); ++} ++ ++TEST(FindFileTest, OverlapSequenceChecks) { ++ Add("200", "200", 5000, 3000); ++ ASSERT_TRUE(! Overlaps("199", "199")); ++ ASSERT_TRUE(! Overlaps("201", "300")); ++ ASSERT_TRUE(Overlaps("200", "200")); ++ ASSERT_TRUE(Overlaps("190", "200")); ++ ASSERT_TRUE(Overlaps("200", "210")); ++} ++ ++TEST(FindFileTest, OverlappingFiles) { ++ Add("150", "600"); ++ Add("400", "500"); ++ disjoint_sorted_files_ = false; ++ ASSERT_TRUE(! Overlaps("100", "149")); ++ ASSERT_TRUE(! Overlaps("601", "700")); ++ ASSERT_TRUE(Overlaps("100", "150")); ++ ASSERT_TRUE(Overlaps("100", "200")); ++ ASSERT_TRUE(Overlaps("100", "300")); ++ ASSERT_TRUE(Overlaps("100", "400")); ++ ASSERT_TRUE(Overlaps("100", "500")); ++ ASSERT_TRUE(Overlaps("375", "400")); ++ ASSERT_TRUE(Overlaps("450", "450")); ++ ASSERT_TRUE(Overlaps("450", "500")); ++ ASSERT_TRUE(Overlaps("450", "700")); ++ ASSERT_TRUE(Overlaps("600", "700")); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch.cc +new file mode 100644 +index 0000000..33f4a42 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch.cc +@@ -0,0 +1,147 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// WriteBatch::rep_ := ++// sequence: fixed64 ++// count: fixed32 ++// data: record[count] ++// record := ++// kTypeValue varstring varstring | ++// kTypeDeletion varstring ++// varstring := ++// len: varint32 ++// data: uint8[len] ++ ++#include "leveldb/write_batch.h" ++ ++#include "leveldb/db.h" ++#include "db/dbformat.h" ++#include "db/memtable.h" ++#include "db/write_batch_internal.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++// WriteBatch header has an 8-byte sequence number followed by a 4-byte count. ++static const size_t kHeader = 12; ++ ++WriteBatch::WriteBatch() { ++ Clear(); ++} ++ ++WriteBatch::~WriteBatch() { } ++ ++WriteBatch::Handler::~Handler() { } ++ ++void WriteBatch::Clear() { ++ rep_.clear(); ++ rep_.resize(kHeader); ++} ++ ++Status WriteBatch::Iterate(Handler* handler) const { ++ Slice input(rep_); ++ if (input.size() < kHeader) { ++ return Status::Corruption("malformed WriteBatch (too small)"); ++ } ++ ++ input.remove_prefix(kHeader); ++ Slice key, value; ++ int found = 0; ++ while (!input.empty()) { ++ found++; ++ char tag = input[0]; ++ input.remove_prefix(1); ++ switch (tag) { ++ case kTypeValue: ++ if (GetLengthPrefixedSlice(&input, &key) && ++ GetLengthPrefixedSlice(&input, &value)) { ++ handler->Put(key, value); ++ } else { ++ return Status::Corruption("bad WriteBatch Put"); ++ } ++ break; ++ case kTypeDeletion: ++ if (GetLengthPrefixedSlice(&input, &key)) { ++ handler->Delete(key); ++ } else { ++ return Status::Corruption("bad WriteBatch Delete"); ++ } ++ break; ++ default: ++ return Status::Corruption("unknown WriteBatch tag"); ++ } ++ } ++ if (found != WriteBatchInternal::Count(this)) { ++ return Status::Corruption("WriteBatch has wrong count"); ++ } else { ++ return Status::OK(); ++ } ++} ++ ++int WriteBatchInternal::Count(const WriteBatch* b) { ++ return DecodeFixed32(b->rep_.data() + 8); ++} ++ ++void WriteBatchInternal::SetCount(WriteBatch* b, int n) { ++ EncodeFixed32(&b->rep_[8], n); ++} ++ ++SequenceNumber WriteBatchInternal::Sequence(const WriteBatch* b) { ++ return SequenceNumber(DecodeFixed64(b->rep_.data())); ++} ++ ++void WriteBatchInternal::SetSequence(WriteBatch* b, SequenceNumber seq) { ++ EncodeFixed64(&b->rep_[0], seq); ++} ++ ++void WriteBatch::Put(const Slice& key, const Slice& value) { ++ WriteBatchInternal::SetCount(this, WriteBatchInternal::Count(this) + 1); ++ rep_.push_back(static_cast(kTypeValue)); ++ PutLengthPrefixedSlice(&rep_, key); ++ PutLengthPrefixedSlice(&rep_, value); ++} ++ ++void WriteBatch::Delete(const Slice& key) { ++ WriteBatchInternal::SetCount(this, WriteBatchInternal::Count(this) + 1); ++ rep_.push_back(static_cast(kTypeDeletion)); ++ PutLengthPrefixedSlice(&rep_, key); ++} ++ ++namespace { ++class MemTableInserter : public WriteBatch::Handler { ++ public: ++ SequenceNumber sequence_; ++ MemTable* mem_; ++ ++ virtual void Put(const Slice& key, const Slice& value) { ++ mem_->Add(sequence_, kTypeValue, key, value); ++ sequence_++; ++ } ++ virtual void Delete(const Slice& key) { ++ mem_->Add(sequence_, kTypeDeletion, key, Slice()); ++ sequence_++; ++ } ++}; ++} // namespace ++ ++Status WriteBatchInternal::InsertInto(const WriteBatch* b, ++ MemTable* memtable) { ++ MemTableInserter inserter; ++ inserter.sequence_ = WriteBatchInternal::Sequence(b); ++ inserter.mem_ = memtable; ++ return b->Iterate(&inserter); ++} ++ ++void WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) { ++ assert(contents.size() >= kHeader); ++ b->rep_.assign(contents.data(), contents.size()); ++} ++ ++void WriteBatchInternal::Append(WriteBatch* dst, const WriteBatch* src) { ++ SetCount(dst, Count(dst) + Count(src)); ++ assert(src->rep_.size() >= kHeader); ++ dst->rep_.append(src->rep_.data() + kHeader, src->rep_.size() - kHeader); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_internal.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_internal.h +new file mode 100644 +index 0000000..9448ef7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_internal.h +@@ -0,0 +1,50 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_DB_WRITE_BATCH_INTERNAL_H_ ++#define STORAGE_LEVELDB_DB_WRITE_BATCH_INTERNAL_H_ ++ ++#include "db/dbformat.h" ++#include "leveldb/write_batch.h" ++ ++namespace leveldb { ++ ++class MemTable; ++ ++// WriteBatchInternal provides static methods for manipulating a ++// WriteBatch that we don't want in the public WriteBatch interface. ++class WriteBatchInternal { ++ public: ++ // Return the number of entries in the batch. ++ static int Count(const WriteBatch* batch); ++ ++ // Set the count for the number of entries in the batch. ++ static void SetCount(WriteBatch* batch, int n); ++ ++ // Return the sequence number for the start of this batch. ++ static SequenceNumber Sequence(const WriteBatch* batch); ++ ++ // Store the specified number as the sequence number for the start of ++ // this batch. ++ static void SetSequence(WriteBatch* batch, SequenceNumber seq); ++ ++ static Slice Contents(const WriteBatch* batch) { ++ return Slice(batch->rep_); ++ } ++ ++ static size_t ByteSize(const WriteBatch* batch) { ++ return batch->rep_.size(); ++ } ++ ++ static void SetContents(WriteBatch* batch, const Slice& contents); ++ ++ static Status InsertInto(const WriteBatch* batch, MemTable* memtable); ++ ++ static void Append(WriteBatch* dst, const WriteBatch* src); ++}; ++ ++} // namespace leveldb ++ ++ ++#endif // STORAGE_LEVELDB_DB_WRITE_BATCH_INTERNAL_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_test.cc +new file mode 100644 +index 0000000..9064e3d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_test.cc +@@ -0,0 +1,120 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/db.h" ++ ++#include "db/memtable.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/env.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++static std::string PrintContents(WriteBatch* b) { ++ InternalKeyComparator cmp(BytewiseComparator()); ++ MemTable* mem = new MemTable(cmp); ++ mem->Ref(); ++ std::string state; ++ Status s = WriteBatchInternal::InsertInto(b, mem); ++ int count = 0; ++ Iterator* iter = mem->NewIterator(); ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ ParsedInternalKey ikey; ++ ASSERT_TRUE(ParseInternalKey(iter->key(), &ikey)); ++ switch (ikey.type) { ++ case kTypeValue: ++ state.append("Put("); ++ state.append(ikey.user_key.ToString()); ++ state.append(", "); ++ state.append(iter->value().ToString()); ++ state.append(")"); ++ count++; ++ break; ++ case kTypeDeletion: ++ state.append("Delete("); ++ state.append(ikey.user_key.ToString()); ++ state.append(")"); ++ count++; ++ break; ++ } ++ state.append("@"); ++ state.append(NumberToString(ikey.sequence)); ++ } ++ delete iter; ++ if (!s.ok()) { ++ state.append("ParseError()"); ++ } else if (count != WriteBatchInternal::Count(b)) { ++ state.append("CountMismatch()"); ++ } ++ mem->Unref(); ++ return state; ++} ++ ++class WriteBatchTest { }; ++ ++TEST(WriteBatchTest, Empty) { ++ WriteBatch batch; ++ ASSERT_EQ("", PrintContents(&batch)); ++ ASSERT_EQ(0, WriteBatchInternal::Count(&batch)); ++} ++ ++TEST(WriteBatchTest, Multiple) { ++ WriteBatch batch; ++ batch.Put(Slice("foo"), Slice("bar")); ++ batch.Delete(Slice("box")); ++ batch.Put(Slice("baz"), Slice("boo")); ++ WriteBatchInternal::SetSequence(&batch, 100); ++ ASSERT_EQ(100, WriteBatchInternal::Sequence(&batch)); ++ ASSERT_EQ(3, WriteBatchInternal::Count(&batch)); ++ ASSERT_EQ("Put(baz, boo)@102" ++ "Delete(box)@101" ++ "Put(foo, bar)@100", ++ PrintContents(&batch)); ++} ++ ++TEST(WriteBatchTest, Corruption) { ++ WriteBatch batch; ++ batch.Put(Slice("foo"), Slice("bar")); ++ batch.Delete(Slice("box")); ++ WriteBatchInternal::SetSequence(&batch, 200); ++ Slice contents = WriteBatchInternal::Contents(&batch); ++ WriteBatchInternal::SetContents(&batch, ++ Slice(contents.data(),contents.size()-1)); ++ ASSERT_EQ("Put(foo, bar)@200" ++ "ParseError()", ++ PrintContents(&batch)); ++} ++ ++TEST(WriteBatchTest, Append) { ++ WriteBatch b1, b2; ++ WriteBatchInternal::SetSequence(&b1, 200); ++ WriteBatchInternal::SetSequence(&b2, 300); ++ WriteBatchInternal::Append(&b1, &b2); ++ ASSERT_EQ("", ++ PrintContents(&b1)); ++ b2.Put("a", "va"); ++ WriteBatchInternal::Append(&b1, &b2); ++ ASSERT_EQ("Put(a, va)@200", ++ PrintContents(&b1)); ++ b2.Clear(); ++ b2.Put("b", "vb"); ++ WriteBatchInternal::Append(&b1, &b2); ++ ASSERT_EQ("Put(a, va)@200" ++ "Put(b, vb)@201", ++ PrintContents(&b1)); ++ b2.Delete("foo"); ++ WriteBatchInternal::Append(&b1, &b2); ++ ASSERT_EQ("Put(a, va)@200" ++ "Put(b, vb)@202" ++ "Put(b, vb)@201" ++ "Delete(foo)@203", ++ PrintContents(&b1)); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.cc +new file mode 100644 +index 0000000..9a98884 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.cc +@@ -0,0 +1,398 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "helpers/memenv/memenv.h" ++ ++#include "leveldb/env.h" ++#include "leveldb/status.h" ++#include "port/port.h" ++#include "util/mutexlock.h" ++#include ++#include ++#include ++#include ++ ++namespace leveldb { ++ ++namespace { ++ ++class FileState { ++ public: ++ // FileStates are reference counted. The initial reference count is zero ++ // and the caller must call Ref() at least once. ++ FileState() : refs_(0), size_(0) {} ++ ++ // Increase the reference count. ++ void Ref() { ++ MutexLock lock(&refs_mutex_); ++ ++refs_; ++ } ++ ++ // Decrease the reference count. Delete if this is the last reference. ++ void Unref() { ++ bool do_delete = false; ++ ++ { ++ MutexLock lock(&refs_mutex_); ++ --refs_; ++ assert(refs_ >= 0); ++ if (refs_ <= 0) { ++ do_delete = true; ++ } ++ } ++ ++ if (do_delete) { ++ delete this; ++ } ++ } ++ ++ uint64_t Size() const { return size_; } ++ ++ Status Read(uint64_t offset, size_t n, Slice* result, char* scratch) const { ++ if (offset > size_) { ++ return Status::IOError("Offset greater than file size."); ++ } ++ const uint64_t available = size_ - offset; ++ if (n > available) { ++ n = static_cast(available); ++ } ++ if (n == 0) { ++ *result = Slice(); ++ return Status::OK(); ++ } ++ ++ assert(offset / kBlockSize <= SIZE_MAX); ++ size_t block = static_cast(offset / kBlockSize); ++ size_t block_offset = offset % kBlockSize; ++ ++ if (n <= kBlockSize - block_offset) { ++ // The requested bytes are all in the first block. ++ *result = Slice(blocks_[block] + block_offset, n); ++ return Status::OK(); ++ } ++ ++ size_t bytes_to_copy = n; ++ char* dst = scratch; ++ ++ while (bytes_to_copy > 0) { ++ size_t avail = kBlockSize - block_offset; ++ if (avail > bytes_to_copy) { ++ avail = bytes_to_copy; ++ } ++ memcpy(dst, blocks_[block] + block_offset, avail); ++ ++ bytes_to_copy -= avail; ++ dst += avail; ++ block++; ++ block_offset = 0; ++ } ++ ++ *result = Slice(scratch, n); ++ return Status::OK(); ++ } ++ ++ Status Append(const Slice& data) { ++ const char* src = data.data(); ++ size_t src_len = data.size(); ++ ++ while (src_len > 0) { ++ size_t avail; ++ size_t offset = size_ % kBlockSize; ++ ++ if (offset != 0) { ++ // There is some room in the last block. ++ avail = kBlockSize - offset; ++ } else { ++ // No room in the last block; push new one. ++ blocks_.push_back(new char[kBlockSize]); ++ avail = kBlockSize; ++ } ++ ++ if (avail > src_len) { ++ avail = src_len; ++ } ++ memcpy(blocks_.back() + offset, src, avail); ++ src_len -= avail; ++ src += avail; ++ size_ += avail; ++ } ++ ++ return Status::OK(); ++ } ++ ++ private: ++ // Private since only Unref() should be used to delete it. ++ ~FileState() { ++ for (std::vector::iterator i = blocks_.begin(); i != blocks_.end(); ++ ++i) { ++ delete [] *i; ++ } ++ } ++ ++ // No copying allowed. ++ FileState(const FileState&); ++ void operator=(const FileState&); ++ ++ port::Mutex refs_mutex_; ++ int refs_; // Protected by refs_mutex_; ++ ++ // The following fields are not protected by any mutex. They are only mutable ++ // while the file is being written, and concurrent access is not allowed ++ // to writable files. ++ std::vector blocks_; ++ uint64_t size_; ++ ++ enum { kBlockSize = 8 * 1024 }; ++}; ++ ++class SequentialFileImpl : public SequentialFile { ++ public: ++ explicit SequentialFileImpl(FileState* file) : file_(file), pos_(0) { ++ file_->Ref(); ++ } ++ ++ ~SequentialFileImpl() { ++ file_->Unref(); ++ } ++ ++ virtual Status Read(size_t n, Slice* result, char* scratch) { ++ Status s = file_->Read(pos_, n, result, scratch); ++ if (s.ok()) { ++ pos_ += result->size(); ++ } ++ return s; ++ } ++ ++ virtual Status Skip(uint64_t n) { ++ if (pos_ > file_->Size()) { ++ return Status::IOError("pos_ > file_->Size()"); ++ } ++ const uint64_t available = file_->Size() - pos_; ++ if (n > available) { ++ n = available; ++ } ++ pos_ += n; ++ return Status::OK(); ++ } ++ ++ private: ++ FileState* file_; ++ uint64_t pos_; ++}; ++ ++class RandomAccessFileImpl : public RandomAccessFile { ++ public: ++ explicit RandomAccessFileImpl(FileState* file) : file_(file) { ++ file_->Ref(); ++ } ++ ++ ~RandomAccessFileImpl() { ++ file_->Unref(); ++ } ++ ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ return file_->Read(offset, n, result, scratch); ++ } ++ ++ private: ++ FileState* file_; ++}; ++ ++class WritableFileImpl : public WritableFile { ++ public: ++ WritableFileImpl(FileState* file) : file_(file) { ++ file_->Ref(); ++ } ++ ++ ~WritableFileImpl() { ++ file_->Unref(); ++ } ++ ++ virtual Status Append(const Slice& data) { ++ return file_->Append(data); ++ } ++ ++ virtual Status Close() { return Status::OK(); } ++ virtual Status Flush() { return Status::OK(); } ++ virtual Status Sync() { return Status::OK(); } ++ ++ private: ++ FileState* file_; ++}; ++ ++class NoOpLogger : public Logger { ++ public: ++ virtual void Logv(const char* format, va_list ap) { } ++}; ++ ++class InMemoryEnv : public EnvWrapper { ++ public: ++ explicit InMemoryEnv(Env* base_env) : EnvWrapper(base_env) { } ++ ++ virtual ~InMemoryEnv() { ++ for (FileSystem::iterator i = file_map_.begin(); i != file_map_.end(); ++i){ ++ i->second->Unref(); ++ } ++ } ++ ++ // Partial implementation of the Env interface. ++ virtual Status NewSequentialFile(const std::string& fname, ++ SequentialFile** result) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(fname) == file_map_.end()) { ++ *result = NULL; ++ return Status::IOError(fname, "File not found"); ++ } ++ ++ *result = new SequentialFileImpl(file_map_[fname]); ++ return Status::OK(); ++ } ++ ++ virtual Status NewRandomAccessFile(const std::string& fname, ++ RandomAccessFile** result) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(fname) == file_map_.end()) { ++ *result = NULL; ++ return Status::IOError(fname, "File not found"); ++ } ++ ++ *result = new RandomAccessFileImpl(file_map_[fname]); ++ return Status::OK(); ++ } ++ ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(fname) != file_map_.end()) { ++ DeleteFileInternal(fname); ++ } ++ ++ FileState* file = new FileState(); ++ file->Ref(); ++ file_map_[fname] = file; ++ ++ *result = new WritableFileImpl(file); ++ return Status::OK(); ++ } ++ ++ virtual Status NewAppendableFile(const std::string& fname, ++ WritableFile** result) { ++ MutexLock lock(&mutex_); ++ FileState** sptr = &file_map_[fname]; ++ FileState* file = *sptr; ++ if (file == NULL) { ++ file = new FileState(); ++ file->Ref(); ++ } ++ *result = new WritableFileImpl(file); ++ return Status::OK(); ++ } ++ ++ virtual bool FileExists(const std::string& fname) { ++ MutexLock lock(&mutex_); ++ return file_map_.find(fname) != file_map_.end(); ++ } ++ ++ virtual Status GetChildren(const std::string& dir, ++ std::vector* result) { ++ MutexLock lock(&mutex_); ++ result->clear(); ++ ++ for (FileSystem::iterator i = file_map_.begin(); i != file_map_.end(); ++i){ ++ const std::string& filename = i->first; ++ ++ if (filename.size() >= dir.size() + 1 && filename[dir.size()] == '/' && ++ Slice(filename).starts_with(Slice(dir))) { ++ result->push_back(filename.substr(dir.size() + 1)); ++ } ++ } ++ ++ return Status::OK(); ++ } ++ ++ void DeleteFileInternal(const std::string& fname) { ++ if (file_map_.find(fname) == file_map_.end()) { ++ return; ++ } ++ ++ file_map_[fname]->Unref(); ++ file_map_.erase(fname); ++ } ++ ++ virtual Status DeleteFile(const std::string& fname) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(fname) == file_map_.end()) { ++ return Status::IOError(fname, "File not found"); ++ } ++ ++ DeleteFileInternal(fname); ++ return Status::OK(); ++ } ++ ++ virtual Status CreateDir(const std::string& dirname) { ++ return Status::OK(); ++ } ++ ++ virtual Status DeleteDir(const std::string& dirname) { ++ return Status::OK(); ++ } ++ ++ virtual Status GetFileSize(const std::string& fname, uint64_t* file_size) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(fname) == file_map_.end()) { ++ return Status::IOError(fname, "File not found"); ++ } ++ ++ *file_size = file_map_[fname]->Size(); ++ return Status::OK(); ++ } ++ ++ virtual Status RenameFile(const std::string& src, ++ const std::string& target) { ++ MutexLock lock(&mutex_); ++ if (file_map_.find(src) == file_map_.end()) { ++ return Status::IOError(src, "File not found"); ++ } ++ ++ DeleteFileInternal(target); ++ file_map_[target] = file_map_[src]; ++ file_map_.erase(src); ++ return Status::OK(); ++ } ++ ++ virtual Status LockFile(const std::string& fname, FileLock** lock) { ++ *lock = new FileLock; ++ return Status::OK(); ++ } ++ ++ virtual Status UnlockFile(FileLock* lock) { ++ delete lock; ++ return Status::OK(); ++ } ++ ++ virtual Status GetTestDirectory(std::string* path) { ++ *path = "/test"; ++ return Status::OK(); ++ } ++ ++ virtual Status NewLogger(const std::string& fname, Logger** result) { ++ *result = new NoOpLogger; ++ return Status::OK(); ++ } ++ ++ private: ++ // Map from filenames to FileState objects, representing a simple file system. ++ typedef std::map FileSystem; ++ port::Mutex mutex_; ++ FileSystem file_map_; // Protected by mutex_. ++}; ++ ++} // namespace ++ ++Env* NewMemEnv(Env* base_env) { ++ return new InMemoryEnv(base_env); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.h +new file mode 100644 +index 0000000..03b88de +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.h +@@ -0,0 +1,20 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_HELPERS_MEMENV_MEMENV_H_ ++#define STORAGE_LEVELDB_HELPERS_MEMENV_MEMENV_H_ ++ ++namespace leveldb { ++ ++class Env; ++ ++// Returns a new environment that stores its data in memory and delegates ++// all non-file-storage tasks to base_env. The caller must delete the result ++// when it is no longer needed. ++// *base_env must remain live while the result is in use. ++Env* NewMemEnv(Env* base_env); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_HELPERS_MEMENV_MEMENV_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv_test.cc +new file mode 100644 +index 0000000..5cff776 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv_test.cc +@@ -0,0 +1,241 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "helpers/memenv/memenv.h" ++ ++#include "db/db_impl.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "util/testharness.h" ++#include ++#include ++ ++namespace leveldb { ++ ++class MemEnvTest { ++ public: ++ Env* env_; ++ ++ MemEnvTest() ++ : env_(NewMemEnv(Env::Default())) { ++ } ++ ~MemEnvTest() { ++ delete env_; ++ } ++}; ++ ++TEST(MemEnvTest, Basics) { ++ uint64_t file_size; ++ WritableFile* writable_file; ++ std::vector children; ++ ++ ASSERT_OK(env_->CreateDir("/dir")); ++ ++ // Check that the directory is empty. ++ ASSERT_TRUE(!env_->FileExists("/dir/non_existent")); ++ ASSERT_TRUE(!env_->GetFileSize("/dir/non_existent", &file_size).ok()); ++ ASSERT_OK(env_->GetChildren("/dir", &children)); ++ ASSERT_EQ(0, children.size()); ++ ++ // Create a file. ++ ASSERT_OK(env_->NewWritableFile("/dir/f", &writable_file)); ++ ASSERT_OK(env_->GetFileSize("/dir/f", &file_size)); ++ ASSERT_EQ(0, file_size); ++ delete writable_file; ++ ++ // Check that the file exists. ++ ASSERT_TRUE(env_->FileExists("/dir/f")); ++ ASSERT_OK(env_->GetFileSize("/dir/f", &file_size)); ++ ASSERT_EQ(0, file_size); ++ ASSERT_OK(env_->GetChildren("/dir", &children)); ++ ASSERT_EQ(1, children.size()); ++ ASSERT_EQ("f", children[0]); ++ ++ // Write to the file. ++ ASSERT_OK(env_->NewWritableFile("/dir/f", &writable_file)); ++ ASSERT_OK(writable_file->Append("abc")); ++ delete writable_file; ++ ++ // Check that append works. ++ ASSERT_OK(env_->NewAppendableFile("/dir/f", &writable_file)); ++ ASSERT_OK(env_->GetFileSize("/dir/f", &file_size)); ++ ASSERT_EQ(3, file_size); ++ ASSERT_OK(writable_file->Append("hello")); ++ delete writable_file; ++ ++ // Check for expected size. ++ ASSERT_OK(env_->GetFileSize("/dir/f", &file_size)); ++ ASSERT_EQ(8, file_size); ++ ++ // Check that renaming works. ++ ASSERT_TRUE(!env_->RenameFile("/dir/non_existent", "/dir/g").ok()); ++ ASSERT_OK(env_->RenameFile("/dir/f", "/dir/g")); ++ ASSERT_TRUE(!env_->FileExists("/dir/f")); ++ ASSERT_TRUE(env_->FileExists("/dir/g")); ++ ASSERT_OK(env_->GetFileSize("/dir/g", &file_size)); ++ ASSERT_EQ(8, file_size); ++ ++ // Check that opening non-existent file fails. ++ SequentialFile* seq_file; ++ RandomAccessFile* rand_file; ++ ASSERT_TRUE(!env_->NewSequentialFile("/dir/non_existent", &seq_file).ok()); ++ ASSERT_TRUE(!seq_file); ++ ASSERT_TRUE(!env_->NewRandomAccessFile("/dir/non_existent", &rand_file).ok()); ++ ASSERT_TRUE(!rand_file); ++ ++ // Check that deleting works. ++ ASSERT_TRUE(!env_->DeleteFile("/dir/non_existent").ok()); ++ ASSERT_OK(env_->DeleteFile("/dir/g")); ++ ASSERT_TRUE(!env_->FileExists("/dir/g")); ++ ASSERT_OK(env_->GetChildren("/dir", &children)); ++ ASSERT_EQ(0, children.size()); ++ ASSERT_OK(env_->DeleteDir("/dir")); ++} ++ ++TEST(MemEnvTest, ReadWrite) { ++ WritableFile* writable_file; ++ SequentialFile* seq_file; ++ RandomAccessFile* rand_file; ++ Slice result; ++ char scratch[100]; ++ ++ ASSERT_OK(env_->CreateDir("/dir")); ++ ++ ASSERT_OK(env_->NewWritableFile("/dir/f", &writable_file)); ++ ASSERT_OK(writable_file->Append("hello ")); ++ ASSERT_OK(writable_file->Append("world")); ++ delete writable_file; ++ ++ // Read sequentially. ++ ASSERT_OK(env_->NewSequentialFile("/dir/f", &seq_file)); ++ ASSERT_OK(seq_file->Read(5, &result, scratch)); // Read "hello". ++ ASSERT_EQ(0, result.compare("hello")); ++ ASSERT_OK(seq_file->Skip(1)); ++ ASSERT_OK(seq_file->Read(1000, &result, scratch)); // Read "world". ++ ASSERT_EQ(0, result.compare("world")); ++ ASSERT_OK(seq_file->Read(1000, &result, scratch)); // Try reading past EOF. ++ ASSERT_EQ(0, result.size()); ++ ASSERT_OK(seq_file->Skip(100)); // Try to skip past end of file. ++ ASSERT_OK(seq_file->Read(1000, &result, scratch)); ++ ASSERT_EQ(0, result.size()); ++ delete seq_file; ++ ++ // Random reads. ++ ASSERT_OK(env_->NewRandomAccessFile("/dir/f", &rand_file)); ++ ASSERT_OK(rand_file->Read(6, 5, &result, scratch)); // Read "world". ++ ASSERT_EQ(0, result.compare("world")); ++ ASSERT_OK(rand_file->Read(0, 5, &result, scratch)); // Read "hello". ++ ASSERT_EQ(0, result.compare("hello")); ++ ASSERT_OK(rand_file->Read(10, 100, &result, scratch)); // Read "d". ++ ASSERT_EQ(0, result.compare("d")); ++ ++ // Too high offset. ++ ASSERT_TRUE(!rand_file->Read(1000, 5, &result, scratch).ok()); ++ delete rand_file; ++} ++ ++TEST(MemEnvTest, Locks) { ++ FileLock* lock; ++ ++ // These are no-ops, but we test they return success. ++ ASSERT_OK(env_->LockFile("some file", &lock)); ++ ASSERT_OK(env_->UnlockFile(lock)); ++} ++ ++TEST(MemEnvTest, Misc) { ++ std::string test_dir; ++ ASSERT_OK(env_->GetTestDirectory(&test_dir)); ++ ASSERT_TRUE(!test_dir.empty()); ++ ++ WritableFile* writable_file; ++ ASSERT_OK(env_->NewWritableFile("/a/b", &writable_file)); ++ ++ // These are no-ops, but we test they return success. ++ ASSERT_OK(writable_file->Sync()); ++ ASSERT_OK(writable_file->Flush()); ++ ASSERT_OK(writable_file->Close()); ++ delete writable_file; ++} ++ ++TEST(MemEnvTest, LargeWrite) { ++ const size_t kWriteSize = 300 * 1024; ++ char* scratch = new char[kWriteSize * 2]; ++ ++ std::string write_data; ++ for (size_t i = 0; i < kWriteSize; ++i) { ++ write_data.append(1, static_cast(i)); ++ } ++ ++ WritableFile* writable_file; ++ ASSERT_OK(env_->NewWritableFile("/dir/f", &writable_file)); ++ ASSERT_OK(writable_file->Append("foo")); ++ ASSERT_OK(writable_file->Append(write_data)); ++ delete writable_file; ++ ++ SequentialFile* seq_file; ++ Slice result; ++ ASSERT_OK(env_->NewSequentialFile("/dir/f", &seq_file)); ++ ASSERT_OK(seq_file->Read(3, &result, scratch)); // Read "foo". ++ ASSERT_EQ(0, result.compare("foo")); ++ ++ size_t read = 0; ++ std::string read_data; ++ while (read < kWriteSize) { ++ ASSERT_OK(seq_file->Read(kWriteSize - read, &result, scratch)); ++ read_data.append(result.data(), result.size()); ++ read += result.size(); ++ } ++ ASSERT_TRUE(write_data == read_data); ++ delete seq_file; ++ delete [] scratch; ++} ++ ++TEST(MemEnvTest, DBTest) { ++ Options options; ++ options.create_if_missing = true; ++ options.env = env_; ++ DB* db; ++ ++ const Slice keys[] = {Slice("aaa"), Slice("bbb"), Slice("ccc")}; ++ const Slice vals[] = {Slice("foo"), Slice("bar"), Slice("baz")}; ++ ++ ASSERT_OK(DB::Open(options, "/dir/db", &db)); ++ for (size_t i = 0; i < 3; ++i) { ++ ASSERT_OK(db->Put(WriteOptions(), keys[i], vals[i])); ++ } ++ ++ for (size_t i = 0; i < 3; ++i) { ++ std::string res; ++ ASSERT_OK(db->Get(ReadOptions(), keys[i], &res)); ++ ASSERT_TRUE(res == vals[i]); ++ } ++ ++ Iterator* iterator = db->NewIterator(ReadOptions()); ++ iterator->SeekToFirst(); ++ for (size_t i = 0; i < 3; ++i) { ++ ASSERT_TRUE(iterator->Valid()); ++ ASSERT_TRUE(keys[i] == iterator->key()); ++ ASSERT_TRUE(vals[i] == iterator->value()); ++ iterator->Next(); ++ } ++ ASSERT_TRUE(!iterator->Valid()); ++ delete iterator; ++ ++ DBImpl* dbi = reinterpret_cast(db); ++ ASSERT_OK(dbi->TEST_CompactMemTable()); ++ ++ for (size_t i = 0; i < 3; ++i) { ++ std::string res; ++ ASSERT_OK(db->Get(ReadOptions(), keys[i], &res)); ++ ASSERT_TRUE(res == vals[i]); ++ } ++ ++ delete db; ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/c.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/c.h +new file mode 100644 +index 0000000..1048fe3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/c.h +@@ -0,0 +1,290 @@ ++/* Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++ Use of this source code is governed by a BSD-style license that can be ++ found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++ C bindings for leveldb. May be useful as a stable ABI that can be ++ used by programs that keep leveldb in a shared library, or for ++ a JNI api. ++ ++ Does not support: ++ . getters for the option types ++ . custom comparators that implement key shortening ++ . custom iter, db, env, cache implementations using just the C bindings ++ ++ Some conventions: ++ ++ (1) We expose just opaque struct pointers and functions to clients. ++ This allows us to change internal representations without having to ++ recompile clients. ++ ++ (2) For simplicity, there is no equivalent to the Slice type. Instead, ++ the caller has to pass the pointer and length as separate ++ arguments. ++ ++ (3) Errors are represented by a null-terminated c string. NULL ++ means no error. All operations that can raise an error are passed ++ a "char** errptr" as the last argument. One of the following must ++ be true on entry: ++ *errptr == NULL ++ *errptr points to a malloc()ed null-terminated error message ++ (On Windows, *errptr must have been malloc()-ed by this library.) ++ On success, a leveldb routine leaves *errptr unchanged. ++ On failure, leveldb frees the old value of *errptr and ++ set *errptr to a malloc()ed error message. ++ ++ (4) Bools have the type unsigned char (0 == false; rest == true) ++ ++ (5) All of the pointer arguments must be non-NULL. ++*/ ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_C_H_ ++#define STORAGE_LEVELDB_INCLUDE_C_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++#include ++#include ++ ++/* Exported types */ ++ ++typedef struct leveldb_t leveldb_t; ++typedef struct leveldb_cache_t leveldb_cache_t; ++typedef struct leveldb_comparator_t leveldb_comparator_t; ++typedef struct leveldb_env_t leveldb_env_t; ++typedef struct leveldb_filelock_t leveldb_filelock_t; ++typedef struct leveldb_filterpolicy_t leveldb_filterpolicy_t; ++typedef struct leveldb_iterator_t leveldb_iterator_t; ++typedef struct leveldb_logger_t leveldb_logger_t; ++typedef struct leveldb_options_t leveldb_options_t; ++typedef struct leveldb_randomfile_t leveldb_randomfile_t; ++typedef struct leveldb_readoptions_t leveldb_readoptions_t; ++typedef struct leveldb_seqfile_t leveldb_seqfile_t; ++typedef struct leveldb_snapshot_t leveldb_snapshot_t; ++typedef struct leveldb_writablefile_t leveldb_writablefile_t; ++typedef struct leveldb_writebatch_t leveldb_writebatch_t; ++typedef struct leveldb_writeoptions_t leveldb_writeoptions_t; ++ ++/* DB operations */ ++ ++extern leveldb_t* leveldb_open( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr); ++ ++extern void leveldb_close(leveldb_t* db); ++ ++extern void leveldb_put( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ const char* key, size_t keylen, ++ const char* val, size_t vallen, ++ char** errptr); ++ ++extern void leveldb_delete( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ const char* key, size_t keylen, ++ char** errptr); ++ ++extern void leveldb_write( ++ leveldb_t* db, ++ const leveldb_writeoptions_t* options, ++ leveldb_writebatch_t* batch, ++ char** errptr); ++ ++/* Returns NULL if not found. A malloc()ed array otherwise. ++ Stores the length of the array in *vallen. */ ++extern char* leveldb_get( ++ leveldb_t* db, ++ const leveldb_readoptions_t* options, ++ const char* key, size_t keylen, ++ size_t* vallen, ++ char** errptr); ++ ++extern leveldb_iterator_t* leveldb_create_iterator( ++ leveldb_t* db, ++ const leveldb_readoptions_t* options); ++ ++extern const leveldb_snapshot_t* leveldb_create_snapshot( ++ leveldb_t* db); ++ ++extern void leveldb_release_snapshot( ++ leveldb_t* db, ++ const leveldb_snapshot_t* snapshot); ++ ++/* Returns NULL if property name is unknown. ++ Else returns a pointer to a malloc()-ed null-terminated value. */ ++extern char* leveldb_property_value( ++ leveldb_t* db, ++ const char* propname); ++ ++extern void leveldb_approximate_sizes( ++ leveldb_t* db, ++ int num_ranges, ++ const char* const* range_start_key, const size_t* range_start_key_len, ++ const char* const* range_limit_key, const size_t* range_limit_key_len, ++ uint64_t* sizes); ++ ++extern void leveldb_compact_range( ++ leveldb_t* db, ++ const char* start_key, size_t start_key_len, ++ const char* limit_key, size_t limit_key_len); ++ ++/* Management operations */ ++ ++extern void leveldb_destroy_db( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr); ++ ++extern void leveldb_repair_db( ++ const leveldb_options_t* options, ++ const char* name, ++ char** errptr); ++ ++/* Iterator */ ++ ++extern void leveldb_iter_destroy(leveldb_iterator_t*); ++extern unsigned char leveldb_iter_valid(const leveldb_iterator_t*); ++extern void leveldb_iter_seek_to_first(leveldb_iterator_t*); ++extern void leveldb_iter_seek_to_last(leveldb_iterator_t*); ++extern void leveldb_iter_seek(leveldb_iterator_t*, const char* k, size_t klen); ++extern void leveldb_iter_next(leveldb_iterator_t*); ++extern void leveldb_iter_prev(leveldb_iterator_t*); ++extern const char* leveldb_iter_key(const leveldb_iterator_t*, size_t* klen); ++extern const char* leveldb_iter_value(const leveldb_iterator_t*, size_t* vlen); ++extern void leveldb_iter_get_error(const leveldb_iterator_t*, char** errptr); ++ ++/* Write batch */ ++ ++extern leveldb_writebatch_t* leveldb_writebatch_create(); ++extern void leveldb_writebatch_destroy(leveldb_writebatch_t*); ++extern void leveldb_writebatch_clear(leveldb_writebatch_t*); ++extern void leveldb_writebatch_put( ++ leveldb_writebatch_t*, ++ const char* key, size_t klen, ++ const char* val, size_t vlen); ++extern void leveldb_writebatch_delete( ++ leveldb_writebatch_t*, ++ const char* key, size_t klen); ++extern void leveldb_writebatch_iterate( ++ leveldb_writebatch_t*, ++ void* state, ++ void (*put)(void*, const char* k, size_t klen, const char* v, size_t vlen), ++ void (*deleted)(void*, const char* k, size_t klen)); ++ ++/* Options */ ++ ++extern leveldb_options_t* leveldb_options_create(); ++extern void leveldb_options_destroy(leveldb_options_t*); ++extern void leveldb_options_set_comparator( ++ leveldb_options_t*, ++ leveldb_comparator_t*); ++extern void leveldb_options_set_filter_policy( ++ leveldb_options_t*, ++ leveldb_filterpolicy_t*); ++extern void leveldb_options_set_create_if_missing( ++ leveldb_options_t*, unsigned char); ++extern void leveldb_options_set_error_if_exists( ++ leveldb_options_t*, unsigned char); ++extern void leveldb_options_set_paranoid_checks( ++ leveldb_options_t*, unsigned char); ++extern void leveldb_options_set_env(leveldb_options_t*, leveldb_env_t*); ++extern void leveldb_options_set_info_log(leveldb_options_t*, leveldb_logger_t*); ++extern void leveldb_options_set_write_buffer_size(leveldb_options_t*, size_t); ++extern void leveldb_options_set_max_open_files(leveldb_options_t*, int); ++extern void leveldb_options_set_cache(leveldb_options_t*, leveldb_cache_t*); ++extern void leveldb_options_set_block_size(leveldb_options_t*, size_t); ++extern void leveldb_options_set_block_restart_interval(leveldb_options_t*, int); ++ ++enum { ++ leveldb_no_compression = 0, ++ leveldb_snappy_compression = 1 ++}; ++extern void leveldb_options_set_compression(leveldb_options_t*, int); ++ ++/* Comparator */ ++ ++extern leveldb_comparator_t* leveldb_comparator_create( ++ void* state, ++ void (*destructor)(void*), ++ int (*compare)( ++ void*, ++ const char* a, size_t alen, ++ const char* b, size_t blen), ++ const char* (*name)(void*)); ++extern void leveldb_comparator_destroy(leveldb_comparator_t*); ++ ++/* Filter policy */ ++ ++extern leveldb_filterpolicy_t* leveldb_filterpolicy_create( ++ void* state, ++ void (*destructor)(void*), ++ char* (*create_filter)( ++ void*, ++ const char* const* key_array, const size_t* key_length_array, ++ int num_keys, ++ size_t* filter_length), ++ unsigned char (*key_may_match)( ++ void*, ++ const char* key, size_t length, ++ const char* filter, size_t filter_length), ++ const char* (*name)(void*)); ++extern void leveldb_filterpolicy_destroy(leveldb_filterpolicy_t*); ++ ++extern leveldb_filterpolicy_t* leveldb_filterpolicy_create_bloom( ++ int bits_per_key); ++ ++/* Read options */ ++ ++extern leveldb_readoptions_t* leveldb_readoptions_create(); ++extern void leveldb_readoptions_destroy(leveldb_readoptions_t*); ++extern void leveldb_readoptions_set_verify_checksums( ++ leveldb_readoptions_t*, ++ unsigned char); ++extern void leveldb_readoptions_set_fill_cache( ++ leveldb_readoptions_t*, unsigned char); ++extern void leveldb_readoptions_set_snapshot( ++ leveldb_readoptions_t*, ++ const leveldb_snapshot_t*); ++ ++/* Write options */ ++ ++extern leveldb_writeoptions_t* leveldb_writeoptions_create(); ++extern void leveldb_writeoptions_destroy(leveldb_writeoptions_t*); ++extern void leveldb_writeoptions_set_sync( ++ leveldb_writeoptions_t*, unsigned char); ++ ++/* Cache */ ++ ++extern leveldb_cache_t* leveldb_cache_create_lru(size_t capacity); ++extern void leveldb_cache_destroy(leveldb_cache_t* cache); ++ ++/* Env */ ++ ++extern leveldb_env_t* leveldb_create_default_env(); ++extern void leveldb_env_destroy(leveldb_env_t*); ++ ++/* Utility */ ++ ++/* Calls free(ptr). ++ REQUIRES: ptr was malloc()-ed and returned by one of the routines ++ in this file. Note that in certain cases (typically on Windows), you ++ may need to call this routine instead of free(ptr) to dispose of ++ malloc()-ed memory returned by this library. */ ++extern void leveldb_free(void* ptr); ++ ++/* Return the major version number for this release. */ ++extern int leveldb_major_version(); ++ ++/* Return the minor version number for this release. */ ++extern int leveldb_minor_version(); ++ ++#ifdef __cplusplus ++} /* end extern "C" */ ++#endif ++ ++#endif /* STORAGE_LEVELDB_INCLUDE_C_H_ */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/cache.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/cache.h +new file mode 100644 +index 0000000..6819d5b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/cache.h +@@ -0,0 +1,110 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A Cache is an interface that maps keys to values. It has internal ++// synchronization and may be safely accessed concurrently from ++// multiple threads. It may automatically evict entries to make room ++// for new entries. Values have a specified charge against the cache ++// capacity. For example, a cache where the values are variable ++// length strings, may use the length of the string as the charge for ++// the string. ++// ++// A builtin cache implementation with a least-recently-used eviction ++// policy is provided. Clients may use their own implementations if ++// they want something more sophisticated (like scan-resistance, a ++// custom eviction policy, variable cache sizing, etc.) ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_CACHE_H_ ++#define STORAGE_LEVELDB_INCLUDE_CACHE_H_ ++ ++#include ++#include "leveldb/slice.h" ++ ++namespace leveldb { ++ ++class Cache; ++ ++// Create a new cache with a fixed size capacity. This implementation ++// of Cache uses a least-recently-used eviction policy. ++extern Cache* NewLRUCache(size_t capacity); ++ ++class Cache { ++ public: ++ Cache() { } ++ ++ // Destroys all existing entries by calling the "deleter" ++ // function that was passed to the constructor. ++ virtual ~Cache(); ++ ++ // Opaque handle to an entry stored in the cache. ++ struct Handle { }; ++ ++ // Insert a mapping from key->value into the cache and assign it ++ // the specified charge against the total cache capacity. ++ // ++ // Returns a handle that corresponds to the mapping. The caller ++ // must call this->Release(handle) when the returned mapping is no ++ // longer needed. ++ // ++ // When the inserted entry is no longer needed, the key and ++ // value will be passed to "deleter". ++ virtual Handle* Insert(const Slice& key, void* value, size_t charge, ++ void (*deleter)(const Slice& key, void* value)) = 0; ++ ++ // If the cache has no mapping for "key", returns NULL. ++ // ++ // Else return a handle that corresponds to the mapping. The caller ++ // must call this->Release(handle) when the returned mapping is no ++ // longer needed. ++ virtual Handle* Lookup(const Slice& key) = 0; ++ ++ // Release a mapping returned by a previous Lookup(). ++ // REQUIRES: handle must not have been released yet. ++ // REQUIRES: handle must have been returned by a method on *this. ++ virtual void Release(Handle* handle) = 0; ++ ++ // Return the value encapsulated in a handle returned by a ++ // successful Lookup(). ++ // REQUIRES: handle must not have been released yet. ++ // REQUIRES: handle must have been returned by a method on *this. ++ virtual void* Value(Handle* handle) = 0; ++ ++ // If the cache contains entry for key, erase it. Note that the ++ // underlying entry will be kept around until all existing handles ++ // to it have been released. ++ virtual void Erase(const Slice& key) = 0; ++ ++ // Return a new numeric id. May be used by multiple clients who are ++ // sharing the same cache to partition the key space. Typically the ++ // client will allocate a new id at startup and prepend the id to ++ // its cache keys. ++ virtual uint64_t NewId() = 0; ++ ++ // Remove all cache entries that are not actively in use. Memory-constrained ++ // applications may wish to call this method to reduce memory usage. ++ // Default implementation of Prune() does nothing. Subclasses are strongly ++ // encouraged to override the default implementation. A future release of ++ // leveldb may change Prune() to a pure abstract method. ++ virtual void Prune() {} ++ ++ // Return an estimate of the combined charges of all elements stored in the ++ // cache. ++ virtual size_t TotalCharge() const = 0; ++ ++ private: ++ void LRU_Remove(Handle* e); ++ void LRU_Append(Handle* e); ++ void Unref(Handle* e); ++ ++ struct Rep; ++ Rep* rep_; ++ ++ // No copying allowed ++ Cache(const Cache&); ++ void operator=(const Cache&); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_CACHE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/comparator.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/comparator.h +new file mode 100644 +index 0000000..556b984 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/comparator.h +@@ -0,0 +1,63 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_COMPARATOR_H_ ++#define STORAGE_LEVELDB_INCLUDE_COMPARATOR_H_ ++ ++#include ++ ++namespace leveldb { ++ ++class Slice; ++ ++// A Comparator object provides a total order across slices that are ++// used as keys in an sstable or a database. A Comparator implementation ++// must be thread-safe since leveldb may invoke its methods concurrently ++// from multiple threads. ++class Comparator { ++ public: ++ virtual ~Comparator(); ++ ++ // Three-way comparison. Returns value: ++ // < 0 iff "a" < "b", ++ // == 0 iff "a" == "b", ++ // > 0 iff "a" > "b" ++ virtual int Compare(const Slice& a, const Slice& b) const = 0; ++ ++ // The name of the comparator. Used to check for comparator ++ // mismatches (i.e., a DB created with one comparator is ++ // accessed using a different comparator. ++ // ++ // The client of this package should switch to a new name whenever ++ // the comparator implementation changes in a way that will cause ++ // the relative ordering of any two keys to change. ++ // ++ // Names starting with "leveldb." are reserved and should not be used ++ // by any clients of this package. ++ virtual const char* Name() const = 0; ++ ++ // Advanced functions: these are used to reduce the space requirements ++ // for internal data structures like index blocks. ++ ++ // If *start < limit, changes *start to a short string in [start,limit). ++ // Simple comparator implementations may return with *start unchanged, ++ // i.e., an implementation of this method that does nothing is correct. ++ virtual void FindShortestSeparator( ++ std::string* start, ++ const Slice& limit) const = 0; ++ ++ // Changes *key to a short string >= *key. ++ // Simple comparator implementations may return with *key unchanged, ++ // i.e., an implementation of this method that does nothing is correct. ++ virtual void FindShortSuccessor(std::string* key) const = 0; ++}; ++ ++// Return a builtin comparator that uses lexicographic byte-wise ++// ordering. The result remains the property of this module and ++// must not be deleted. ++extern const Comparator* BytewiseComparator(); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_COMPARATOR_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/db.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/db.h +new file mode 100644 +index 0000000..bfab10a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/db.h +@@ -0,0 +1,163 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_DB_H_ ++#define STORAGE_LEVELDB_INCLUDE_DB_H_ ++ ++#include ++#include ++#include "leveldb/iterator.h" ++#include "leveldb/options.h" ++ ++namespace leveldb { ++ ++// Update Makefile if you change these ++static const int kMajorVersion = 1; ++static const int kMinorVersion = 20; ++ ++struct Options; ++struct ReadOptions; ++struct WriteOptions; ++class WriteBatch; ++ ++// Abstract handle to particular state of a DB. ++// A Snapshot is an immutable object and can therefore be safely ++// accessed from multiple threads without any external synchronization. ++class Snapshot { ++ protected: ++ virtual ~Snapshot(); ++}; ++ ++// A range of keys ++struct Range { ++ Slice start; // Included in the range ++ Slice limit; // Not included in the range ++ ++ Range() { } ++ Range(const Slice& s, const Slice& l) : start(s), limit(l) { } ++}; ++ ++// A DB is a persistent ordered map from keys to values. ++// A DB is safe for concurrent access from multiple threads without ++// any external synchronization. ++class DB { ++ public: ++ // Open the database with the specified "name". ++ // Stores a pointer to a heap-allocated database in *dbptr and returns ++ // OK on success. ++ // Stores NULL in *dbptr and returns a non-OK status on error. ++ // Caller should delete *dbptr when it is no longer needed. ++ static Status Open(const Options& options, ++ const std::string& name, ++ DB** dbptr); ++ ++ DB() { } ++ virtual ~DB(); ++ ++ // Set the database entry for "key" to "value". Returns OK on success, ++ // and a non-OK status on error. ++ // Note: consider setting options.sync = true. ++ virtual Status Put(const WriteOptions& options, ++ const Slice& key, ++ const Slice& value) = 0; ++ ++ // Remove the database entry (if any) for "key". Returns OK on ++ // success, and a non-OK status on error. It is not an error if "key" ++ // did not exist in the database. ++ // Note: consider setting options.sync = true. ++ virtual Status Delete(const WriteOptions& options, const Slice& key) = 0; ++ ++ // Apply the specified updates to the database. ++ // Returns OK on success, non-OK on failure. ++ // Note: consider setting options.sync = true. ++ virtual Status Write(const WriteOptions& options, WriteBatch* updates) = 0; ++ ++ // If the database contains an entry for "key" store the ++ // corresponding value in *value and return OK. ++ // ++ // If there is no entry for "key" leave *value unchanged and return ++ // a status for which Status::IsNotFound() returns true. ++ // ++ // May return some other Status on an error. ++ virtual Status Get(const ReadOptions& options, ++ const Slice& key, std::string* value) = 0; ++ ++ // Return a heap-allocated iterator over the contents of the database. ++ // The result of NewIterator() is initially invalid (caller must ++ // call one of the Seek methods on the iterator before using it). ++ // ++ // Caller should delete the iterator when it is no longer needed. ++ // The returned iterator should be deleted before this db is deleted. ++ virtual Iterator* NewIterator(const ReadOptions& options) = 0; ++ ++ // Return a handle to the current DB state. Iterators created with ++ // this handle will all observe a stable snapshot of the current DB ++ // state. The caller must call ReleaseSnapshot(result) when the ++ // snapshot is no longer needed. ++ virtual const Snapshot* GetSnapshot() = 0; ++ ++ // Release a previously acquired snapshot. The caller must not ++ // use "snapshot" after this call. ++ virtual void ReleaseSnapshot(const Snapshot* snapshot) = 0; ++ ++ // DB implementations can export properties about their state ++ // via this method. If "property" is a valid property understood by this ++ // DB implementation, fills "*value" with its current value and returns ++ // true. Otherwise returns false. ++ // ++ // ++ // Valid property names include: ++ // ++ // "leveldb.num-files-at-level" - return the number of files at level , ++ // where is an ASCII representation of a level number (e.g. "0"). ++ // "leveldb.stats" - returns a multi-line string that describes statistics ++ // about the internal operation of the DB. ++ // "leveldb.sstables" - returns a multi-line string that describes all ++ // of the sstables that make up the db contents. ++ // "leveldb.approximate-memory-usage" - returns the approximate number of ++ // bytes of memory in use by the DB. ++ virtual bool GetProperty(const Slice& property, std::string* value) = 0; ++ ++ // For each i in [0,n-1], store in "sizes[i]", the approximate ++ // file system space used by keys in "[range[i].start .. range[i].limit)". ++ // ++ // Note that the returned sizes measure file system space usage, so ++ // if the user data compresses by a factor of ten, the returned ++ // sizes will be one-tenth the size of the corresponding user data size. ++ // ++ // The results may not include the sizes of recently written data. ++ virtual void GetApproximateSizes(const Range* range, int n, ++ uint64_t* sizes) = 0; ++ ++ // Compact the underlying storage for the key range [*begin,*end]. ++ // In particular, deleted and overwritten versions are discarded, ++ // and the data is rearranged to reduce the cost of operations ++ // needed to access the data. This operation should typically only ++ // be invoked by users who understand the underlying implementation. ++ // ++ // begin==NULL is treated as a key before all keys in the database. ++ // end==NULL is treated as a key after all keys in the database. ++ // Therefore the following call will compact the entire database: ++ // db->CompactRange(NULL, NULL); ++ virtual void CompactRange(const Slice* begin, const Slice* end) = 0; ++ ++ private: ++ // No copying allowed ++ DB(const DB&); ++ void operator=(const DB&); ++}; ++ ++// Destroy the contents of the specified database. ++// Be very careful using this method. ++Status DestroyDB(const std::string& name, const Options& options); ++ ++// If a DB cannot be opened, you may attempt to call this method to ++// resurrect as much of the contents of the database as possible. ++// Some data may be lost, so be careful when calling this function ++// on a database that contains important information. ++Status RepairDB(const std::string& dbname, const Options& options); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_DB_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/dumpfile.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/dumpfile.h +new file mode 100644 +index 0000000..3f97fda +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/dumpfile.h +@@ -0,0 +1,25 @@ ++// Copyright (c) 2014 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_DUMPFILE_H_ ++#define STORAGE_LEVELDB_INCLUDE_DUMPFILE_H_ ++ ++#include ++#include "leveldb/env.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++// Dump the contents of the file named by fname in text format to ++// *dst. Makes a sequence of dst->Append() calls; each call is passed ++// the newline-terminated text corresponding to a single item found ++// in the file. ++// ++// Returns a non-OK result if fname does not name a leveldb storage ++// file, or if the file cannot be read. ++Status DumpFile(Env* env, const std::string& fname, WritableFile* dst); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_DUMPFILE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/env.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/env.h +new file mode 100644 +index 0000000..99b6c21 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/env.h +@@ -0,0 +1,351 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// An Env is an interface used by the leveldb implementation to access ++// operating system functionality like the filesystem etc. Callers ++// may wish to provide a custom Env object when opening a database to ++// get fine gain control; e.g., to rate limit file system operations. ++// ++// All Env implementations are safe for concurrent access from ++// multiple threads without any external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_ENV_H_ ++#define STORAGE_LEVELDB_INCLUDE_ENV_H_ ++ ++#include ++#include ++#include ++#include ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class FileLock; ++class Logger; ++class RandomAccessFile; ++class SequentialFile; ++class Slice; ++class WritableFile; ++ ++class Env { ++ public: ++ Env() { } ++ virtual ~Env(); ++ ++ // Return a default environment suitable for the current operating ++ // system. Sophisticated users may wish to provide their own Env ++ // implementation instead of relying on this default environment. ++ // ++ // The result of Default() belongs to leveldb and must never be deleted. ++ static Env* Default(); ++ ++ // Create a brand new sequentially-readable file with the specified name. ++ // On success, stores a pointer to the new file in *result and returns OK. ++ // On failure stores NULL in *result and returns non-OK. If the file does ++ // not exist, returns a non-OK status. ++ // ++ // The returned file will only be accessed by one thread at a time. ++ virtual Status NewSequentialFile(const std::string& fname, ++ SequentialFile** result) = 0; ++ ++ // Create a brand new random access read-only file with the ++ // specified name. On success, stores a pointer to the new file in ++ // *result and returns OK. On failure stores NULL in *result and ++ // returns non-OK. If the file does not exist, returns a non-OK ++ // status. ++ // ++ // The returned file may be concurrently accessed by multiple threads. ++ virtual Status NewRandomAccessFile(const std::string& fname, ++ RandomAccessFile** result) = 0; ++ ++ // Create an object that writes to a new file with the specified ++ // name. Deletes any existing file with the same name and creates a ++ // new file. On success, stores a pointer to the new file in ++ // *result and returns OK. On failure stores NULL in *result and ++ // returns non-OK. ++ // ++ // The returned file will only be accessed by one thread at a time. ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result) = 0; ++ ++ // Create an object that either appends to an existing file, or ++ // writes to a new file (if the file does not exist to begin with). ++ // On success, stores a pointer to the new file in *result and ++ // returns OK. On failure stores NULL in *result and returns ++ // non-OK. ++ // ++ // The returned file will only be accessed by one thread at a time. ++ // ++ // May return an IsNotSupportedError error if this Env does ++ // not allow appending to an existing file. Users of Env (including ++ // the leveldb implementation) must be prepared to deal with ++ // an Env that does not support appending. ++ virtual Status NewAppendableFile(const std::string& fname, ++ WritableFile** result); ++ ++ // Returns true iff the named file exists. ++ virtual bool FileExists(const std::string& fname) = 0; ++ ++ // Store in *result the names of the children of the specified directory. ++ // The names are relative to "dir". ++ // Original contents of *results are dropped. ++ virtual Status GetChildren(const std::string& dir, ++ std::vector* result) = 0; ++ ++ // Delete the named file. ++ virtual Status DeleteFile(const std::string& fname) = 0; ++ ++ // Create the specified directory. ++ virtual Status CreateDir(const std::string& dirname) = 0; ++ ++ // Delete the specified directory. ++ virtual Status DeleteDir(const std::string& dirname) = 0; ++ ++ // Store the size of fname in *file_size. ++ virtual Status GetFileSize(const std::string& fname, uint64_t* file_size) = 0; ++ ++ // Rename file src to target. ++ virtual Status RenameFile(const std::string& src, ++ const std::string& target) = 0; ++ ++ // Lock the specified file. Used to prevent concurrent access to ++ // the same db by multiple processes. On failure, stores NULL in ++ // *lock and returns non-OK. ++ // ++ // On success, stores a pointer to the object that represents the ++ // acquired lock in *lock and returns OK. The caller should call ++ // UnlockFile(*lock) to release the lock. If the process exits, ++ // the lock will be automatically released. ++ // ++ // If somebody else already holds the lock, finishes immediately ++ // with a failure. I.e., this call does not wait for existing locks ++ // to go away. ++ // ++ // May create the named file if it does not already exist. ++ virtual Status LockFile(const std::string& fname, FileLock** lock) = 0; ++ ++ // Release the lock acquired by a previous successful call to LockFile. ++ // REQUIRES: lock was returned by a successful LockFile() call ++ // REQUIRES: lock has not already been unlocked. ++ virtual Status UnlockFile(FileLock* lock) = 0; ++ ++ // Arrange to run "(*function)(arg)" once in a background thread. ++ // ++ // "function" may run in an unspecified thread. Multiple functions ++ // added to the same Env may run concurrently in different threads. ++ // I.e., the caller may not assume that background work items are ++ // serialized. ++ virtual void Schedule( ++ void (*function)(void* arg), ++ void* arg) = 0; ++ ++ // Start a new thread, invoking "function(arg)" within the new thread. ++ // When "function(arg)" returns, the thread will be destroyed. ++ virtual void StartThread(void (*function)(void* arg), void* arg) = 0; ++ ++ // *path is set to a temporary directory that can be used for testing. It may ++ // or many not have just been created. The directory may or may not differ ++ // between runs of the same process, but subsequent calls will return the ++ // same directory. ++ virtual Status GetTestDirectory(std::string* path) = 0; ++ ++ // Create and return a log file for storing informational messages. ++ virtual Status NewLogger(const std::string& fname, Logger** result) = 0; ++ ++ // Returns the number of micro-seconds since some fixed point in time. Only ++ // useful for computing deltas of time. ++ virtual uint64_t NowMicros() = 0; ++ ++ // Sleep/delay the thread for the prescribed number of micro-seconds. ++ virtual void SleepForMicroseconds(int micros) = 0; ++ ++ private: ++ // No copying allowed ++ Env(const Env&); ++ void operator=(const Env&); ++}; ++ ++// A file abstraction for reading sequentially through a file ++class SequentialFile { ++ public: ++ SequentialFile() { } ++ virtual ~SequentialFile(); ++ ++ // Read up to "n" bytes from the file. "scratch[0..n-1]" may be ++ // written by this routine. Sets "*result" to the data that was ++ // read (including if fewer than "n" bytes were successfully read). ++ // May set "*result" to point at data in "scratch[0..n-1]", so ++ // "scratch[0..n-1]" must be live when "*result" is used. ++ // If an error was encountered, returns a non-OK status. ++ // ++ // REQUIRES: External synchronization ++ virtual Status Read(size_t n, Slice* result, char* scratch) = 0; ++ ++ // Skip "n" bytes from the file. This is guaranteed to be no ++ // slower that reading the same data, but may be faster. ++ // ++ // If end of file is reached, skipping will stop at the end of the ++ // file, and Skip will return OK. ++ // ++ // REQUIRES: External synchronization ++ virtual Status Skip(uint64_t n) = 0; ++ ++ private: ++ // No copying allowed ++ SequentialFile(const SequentialFile&); ++ void operator=(const SequentialFile&); ++}; ++ ++// A file abstraction for randomly reading the contents of a file. ++class RandomAccessFile { ++ public: ++ RandomAccessFile() { } ++ virtual ~RandomAccessFile(); ++ ++ // Read up to "n" bytes from the file starting at "offset". ++ // "scratch[0..n-1]" may be written by this routine. Sets "*result" ++ // to the data that was read (including if fewer than "n" bytes were ++ // successfully read). May set "*result" to point at data in ++ // "scratch[0..n-1]", so "scratch[0..n-1]" must be live when ++ // "*result" is used. If an error was encountered, returns a non-OK ++ // status. ++ // ++ // Safe for concurrent use by multiple threads. ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const = 0; ++ ++ private: ++ // No copying allowed ++ RandomAccessFile(const RandomAccessFile&); ++ void operator=(const RandomAccessFile&); ++}; ++ ++// A file abstraction for sequential writing. The implementation ++// must provide buffering since callers may append small fragments ++// at a time to the file. ++class WritableFile { ++ public: ++ WritableFile() { } ++ virtual ~WritableFile(); ++ ++ virtual Status Append(const Slice& data) = 0; ++ virtual Status Close() = 0; ++ virtual Status Flush() = 0; ++ virtual Status Sync() = 0; ++ ++ private: ++ // No copying allowed ++ WritableFile(const WritableFile&); ++ void operator=(const WritableFile&); ++}; ++ ++// An interface for writing log messages. ++class Logger { ++ public: ++ Logger() { } ++ virtual ~Logger(); ++ ++ // Write an entry to the log file with the specified format. ++ virtual void Logv(const char* format, va_list ap) = 0; ++ ++ private: ++ // No copying allowed ++ Logger(const Logger&); ++ void operator=(const Logger&); ++}; ++ ++ ++// Identifies a locked file. ++class FileLock { ++ public: ++ FileLock() { } ++ virtual ~FileLock(); ++ private: ++ // No copying allowed ++ FileLock(const FileLock&); ++ void operator=(const FileLock&); ++}; ++ ++// Log the specified data to *info_log if info_log is non-NULL. ++extern void Log(Logger* info_log, const char* format, ...) ++# if defined(__GNUC__) || defined(__clang__) ++ __attribute__((__format__ (__printf__, 2, 3))) ++# endif ++ ; ++ ++// A utility routine: write "data" to the named file. ++extern Status WriteStringToFile(Env* env, const Slice& data, ++ const std::string& fname); ++ ++// A utility routine: read contents of named file into *data ++extern Status ReadFileToString(Env* env, const std::string& fname, ++ std::string* data); ++ ++// An implementation of Env that forwards all calls to another Env. ++// May be useful to clients who wish to override just part of the ++// functionality of another Env. ++class EnvWrapper : public Env { ++ public: ++ // Initialize an EnvWrapper that delegates all calls to *t ++ explicit EnvWrapper(Env* t) : target_(t) { } ++ virtual ~EnvWrapper(); ++ ++ // Return the target to which this Env forwards all calls ++ Env* target() const { return target_; } ++ ++ // The following text is boilerplate that forwards all methods to target() ++ Status NewSequentialFile(const std::string& f, SequentialFile** r) { ++ return target_->NewSequentialFile(f, r); ++ } ++ Status NewRandomAccessFile(const std::string& f, RandomAccessFile** r) { ++ return target_->NewRandomAccessFile(f, r); ++ } ++ Status NewWritableFile(const std::string& f, WritableFile** r) { ++ return target_->NewWritableFile(f, r); ++ } ++ Status NewAppendableFile(const std::string& f, WritableFile** r) { ++ return target_->NewAppendableFile(f, r); ++ } ++ bool FileExists(const std::string& f) { return target_->FileExists(f); } ++ Status GetChildren(const std::string& dir, std::vector* r) { ++ return target_->GetChildren(dir, r); ++ } ++ Status DeleteFile(const std::string& f) { return target_->DeleteFile(f); } ++ Status CreateDir(const std::string& d) { return target_->CreateDir(d); } ++ Status DeleteDir(const std::string& d) { return target_->DeleteDir(d); } ++ Status GetFileSize(const std::string& f, uint64_t* s) { ++ return target_->GetFileSize(f, s); ++ } ++ Status RenameFile(const std::string& s, const std::string& t) { ++ return target_->RenameFile(s, t); ++ } ++ Status LockFile(const std::string& f, FileLock** l) { ++ return target_->LockFile(f, l); ++ } ++ Status UnlockFile(FileLock* l) { return target_->UnlockFile(l); } ++ void Schedule(void (*f)(void*), void* a) { ++ return target_->Schedule(f, a); ++ } ++ void StartThread(void (*f)(void*), void* a) { ++ return target_->StartThread(f, a); ++ } ++ virtual Status GetTestDirectory(std::string* path) { ++ return target_->GetTestDirectory(path); ++ } ++ virtual Status NewLogger(const std::string& fname, Logger** result) { ++ return target_->NewLogger(fname, result); ++ } ++ uint64_t NowMicros() { ++ return target_->NowMicros(); ++ } ++ void SleepForMicroseconds(int micros) { ++ target_->SleepForMicroseconds(micros); ++ } ++ private: ++ Env* target_; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_ENV_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/filter_policy.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/filter_policy.h +new file mode 100644 +index 0000000..1fba080 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/filter_policy.h +@@ -0,0 +1,70 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A database can be configured with a custom FilterPolicy object. ++// This object is responsible for creating a small filter from a set ++// of keys. These filters are stored in leveldb and are consulted ++// automatically by leveldb to decide whether or not to read some ++// information from disk. In many cases, a filter can cut down the ++// number of disk seeks form a handful to a single disk seek per ++// DB::Get() call. ++// ++// Most people will want to use the builtin bloom filter support (see ++// NewBloomFilterPolicy() below). ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_FILTER_POLICY_H_ ++#define STORAGE_LEVELDB_INCLUDE_FILTER_POLICY_H_ ++ ++#include ++ ++namespace leveldb { ++ ++class Slice; ++ ++class FilterPolicy { ++ public: ++ virtual ~FilterPolicy(); ++ ++ // Return the name of this policy. Note that if the filter encoding ++ // changes in an incompatible way, the name returned by this method ++ // must be changed. Otherwise, old incompatible filters may be ++ // passed to methods of this type. ++ virtual const char* Name() const = 0; ++ ++ // keys[0,n-1] contains a list of keys (potentially with duplicates) ++ // that are ordered according to the user supplied comparator. ++ // Append a filter that summarizes keys[0,n-1] to *dst. ++ // ++ // Warning: do not change the initial contents of *dst. Instead, ++ // append the newly constructed filter to *dst. ++ virtual void CreateFilter(const Slice* keys, int n, std::string* dst) ++ const = 0; ++ ++ // "filter" contains the data appended by a preceding call to ++ // CreateFilter() on this class. This method must return true if ++ // the key was in the list of keys passed to CreateFilter(). ++ // This method may return true or false if the key was not on the ++ // list, but it should aim to return false with a high probability. ++ virtual bool KeyMayMatch(const Slice& key, const Slice& filter) const = 0; ++}; ++ ++// Return a new filter policy that uses a bloom filter with approximately ++// the specified number of bits per key. A good value for bits_per_key ++// is 10, which yields a filter with ~ 1% false positive rate. ++// ++// Callers must delete the result after any database that is using the ++// result has been closed. ++// ++// Note: if you are using a custom comparator that ignores some parts ++// of the keys being compared, you must not use NewBloomFilterPolicy() ++// and must provide your own FilterPolicy that also ignores the ++// corresponding parts of the keys. For example, if the comparator ++// ignores trailing spaces, it would be incorrect to use a ++// FilterPolicy (like NewBloomFilterPolicy) that does not ignore ++// trailing spaces in keys. ++extern const FilterPolicy* NewBloomFilterPolicy(int bits_per_key); ++ ++} ++ ++#endif // STORAGE_LEVELDB_INCLUDE_FILTER_POLICY_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/iterator.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/iterator.h +new file mode 100644 +index 0000000..da631ed +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/iterator.h +@@ -0,0 +1,100 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// An iterator yields a sequence of key/value pairs from a source. ++// The following class defines the interface. Multiple implementations ++// are provided by this library. In particular, iterators are provided ++// to access the contents of a Table or a DB. ++// ++// Multiple threads can invoke const methods on an Iterator without ++// external synchronization, but if any of the threads may call a ++// non-const method, all threads accessing the same Iterator must use ++// external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_ITERATOR_H_ ++#define STORAGE_LEVELDB_INCLUDE_ITERATOR_H_ ++ ++#include "leveldb/slice.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class Iterator { ++ public: ++ Iterator(); ++ virtual ~Iterator(); ++ ++ // An iterator is either positioned at a key/value pair, or ++ // not valid. This method returns true iff the iterator is valid. ++ virtual bool Valid() const = 0; ++ ++ // Position at the first key in the source. The iterator is Valid() ++ // after this call iff the source is not empty. ++ virtual void SeekToFirst() = 0; ++ ++ // Position at the last key in the source. The iterator is ++ // Valid() after this call iff the source is not empty. ++ virtual void SeekToLast() = 0; ++ ++ // Position at the first key in the source that is at or past target. ++ // The iterator is Valid() after this call iff the source contains ++ // an entry that comes at or past target. ++ virtual void Seek(const Slice& target) = 0; ++ ++ // Moves to the next entry in the source. After this call, Valid() is ++ // true iff the iterator was not positioned at the last entry in the source. ++ // REQUIRES: Valid() ++ virtual void Next() = 0; ++ ++ // Moves to the previous entry in the source. After this call, Valid() is ++ // true iff the iterator was not positioned at the first entry in source. ++ // REQUIRES: Valid() ++ virtual void Prev() = 0; ++ ++ // Return the key for the current entry. The underlying storage for ++ // the returned slice is valid only until the next modification of ++ // the iterator. ++ // REQUIRES: Valid() ++ virtual Slice key() const = 0; ++ ++ // Return the value for the current entry. The underlying storage for ++ // the returned slice is valid only until the next modification of ++ // the iterator. ++ // REQUIRES: Valid() ++ virtual Slice value() const = 0; ++ ++ // If an error has occurred, return it. Else return an ok status. ++ virtual Status status() const = 0; ++ ++ // Clients are allowed to register function/arg1/arg2 triples that ++ // will be invoked when this iterator is destroyed. ++ // ++ // Note that unlike all of the preceding methods, this method is ++ // not abstract and therefore clients should not override it. ++ typedef void (*CleanupFunction)(void* arg1, void* arg2); ++ void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2); ++ ++ private: ++ struct Cleanup { ++ CleanupFunction function; ++ void* arg1; ++ void* arg2; ++ Cleanup* next; ++ }; ++ Cleanup cleanup_; ++ ++ // No copying allowed ++ Iterator(const Iterator&); ++ void operator=(const Iterator&); ++}; ++ ++// Return an empty iterator (yields nothing). ++extern Iterator* NewEmptyIterator(); ++ ++// Return an empty iterator with the specified status. ++extern Iterator* NewErrorIterator(const Status& status); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_ITERATOR_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/options.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/options.h +new file mode 100644 +index 0000000..976e381 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/options.h +@@ -0,0 +1,213 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_OPTIONS_H_ ++#define STORAGE_LEVELDB_INCLUDE_OPTIONS_H_ ++ ++#include ++ ++namespace leveldb { ++ ++class Cache; ++class Comparator; ++class Env; ++class FilterPolicy; ++class Logger; ++class Snapshot; ++ ++// DB contents are stored in a set of blocks, each of which holds a ++// sequence of key,value pairs. Each block may be compressed before ++// being stored in a file. The following enum describes which ++// compression method (if any) is used to compress a block. ++enum CompressionType { ++ // NOTE: do not change the values of existing entries, as these are ++ // part of the persistent format on disk. ++ kNoCompression = 0x0, ++ kSnappyCompression = 0x1 ++}; ++ ++// Options to control the behavior of a database (passed to DB::Open) ++struct Options { ++ // ------------------- ++ // Parameters that affect behavior ++ ++ // Comparator used to define the order of keys in the table. ++ // Default: a comparator that uses lexicographic byte-wise ordering ++ // ++ // REQUIRES: The client must ensure that the comparator supplied ++ // here has the same name and orders keys *exactly* the same as the ++ // comparator provided to previous open calls on the same DB. ++ const Comparator* comparator; ++ ++ // If true, the database will be created if it is missing. ++ // Default: false ++ bool create_if_missing; ++ ++ // If true, an error is raised if the database already exists. ++ // Default: false ++ bool error_if_exists; ++ ++ // If true, the implementation will do aggressive checking of the ++ // data it is processing and will stop early if it detects any ++ // errors. This may have unforeseen ramifications: for example, a ++ // corruption of one DB entry may cause a large number of entries to ++ // become unreadable or for the entire DB to become unopenable. ++ // Default: false ++ bool paranoid_checks; ++ ++ // Use the specified object to interact with the environment, ++ // e.g. to read/write files, schedule background work, etc. ++ // Default: Env::Default() ++ Env* env; ++ ++ // Any internal progress/error information generated by the db will ++ // be written to info_log if it is non-NULL, or to a file stored ++ // in the same directory as the DB contents if info_log is NULL. ++ // Default: NULL ++ Logger* info_log; ++ ++ // ------------------- ++ // Parameters that affect performance ++ ++ // Amount of data to build up in memory (backed by an unsorted log ++ // on disk) before converting to a sorted on-disk file. ++ // ++ // Larger values increase performance, especially during bulk loads. ++ // Up to two write buffers may be held in memory at the same time, ++ // so you may wish to adjust this parameter to control memory usage. ++ // Also, a larger write buffer will result in a longer recovery time ++ // the next time the database is opened. ++ // ++ // Default: 4MB ++ size_t write_buffer_size; ++ ++ // Number of open files that can be used by the DB. You may need to ++ // increase this if your database has a large working set (budget ++ // one open file per 2MB of working set). ++ // ++ // Default: 1000 ++ int max_open_files; ++ ++ // Control over blocks (user data is stored in a set of blocks, and ++ // a block is the unit of reading from disk). ++ ++ // If non-NULL, use the specified cache for blocks. ++ // If NULL, leveldb will automatically create and use an 8MB internal cache. ++ // Default: NULL ++ Cache* block_cache; ++ ++ // Approximate size of user data packed per block. Note that the ++ // block size specified here corresponds to uncompressed data. The ++ // actual size of the unit read from disk may be smaller if ++ // compression is enabled. This parameter can be changed dynamically. ++ // ++ // Default: 4K ++ size_t block_size; ++ ++ // Number of keys between restart points for delta encoding of keys. ++ // This parameter can be changed dynamically. Most clients should ++ // leave this parameter alone. ++ // ++ // Default: 16 ++ int block_restart_interval; ++ ++ // Leveldb will write up to this amount of bytes to a file before ++ // switching to a new one. ++ // Most clients should leave this parameter alone. However if your ++ // filesystem is more efficient with larger files, you could ++ // consider increasing the value. The downside will be longer ++ // compactions and hence longer latency/performance hiccups. ++ // Another reason to increase this parameter might be when you are ++ // initially populating a large database. ++ // ++ // Default: 2MB ++ size_t max_file_size; ++ ++ // Compress blocks using the specified compression algorithm. This ++ // parameter can be changed dynamically. ++ // ++ // Default: kSnappyCompression, which gives lightweight but fast ++ // compression. ++ // ++ // Typical speeds of kSnappyCompression on an Intel(R) Core(TM)2 2.4GHz: ++ // ~200-500MB/s compression ++ // ~400-800MB/s decompression ++ // Note that these speeds are significantly faster than most ++ // persistent storage speeds, and therefore it is typically never ++ // worth switching to kNoCompression. Even if the input data is ++ // incompressible, the kSnappyCompression implementation will ++ // efficiently detect that and will switch to uncompressed mode. ++ CompressionType compression; ++ ++ // EXPERIMENTAL: If true, append to existing MANIFEST and log files ++ // when a database is opened. This can significantly speed up open. ++ // ++ // Default: currently false, but may become true later. ++ bool reuse_logs; ++ ++ // If non-NULL, use the specified filter policy to reduce disk reads. ++ // Many applications will benefit from passing the result of ++ // NewBloomFilterPolicy() here. ++ // ++ // Default: NULL ++ const FilterPolicy* filter_policy; ++ ++ // Create an Options object with default values for all fields. ++ Options(); ++}; ++ ++// Options that control read operations ++struct ReadOptions { ++ // If true, all data read from underlying storage will be ++ // verified against corresponding checksums. ++ // Default: false ++ bool verify_checksums; ++ ++ // Should the data read for this iteration be cached in memory? ++ // Callers may wish to set this field to false for bulk scans. ++ // Default: true ++ bool fill_cache; ++ ++ // If "snapshot" is non-NULL, read as of the supplied snapshot ++ // (which must belong to the DB that is being read and which must ++ // not have been released). If "snapshot" is NULL, use an implicit ++ // snapshot of the state at the beginning of this read operation. ++ // Default: NULL ++ const Snapshot* snapshot; ++ ++ ReadOptions() ++ : verify_checksums(false), ++ fill_cache(true), ++ snapshot(NULL) { ++ } ++}; ++ ++// Options that control write operations ++struct WriteOptions { ++ // If true, the write will be flushed from the operating system ++ // buffer cache (by calling WritableFile::Sync()) before the write ++ // is considered complete. If this flag is true, writes will be ++ // slower. ++ // ++ // If this flag is false, and the machine crashes, some recent ++ // writes may be lost. Note that if it is just the process that ++ // crashes (i.e., the machine does not reboot), no writes will be ++ // lost even if sync==false. ++ // ++ // In other words, a DB write with sync==false has similar ++ // crash semantics as the "write()" system call. A DB write ++ // with sync==true has similar crash semantics to a "write()" ++ // system call followed by "fsync()". ++ // ++ // Default: false ++ bool sync; ++ ++ WriteOptions() ++ : sync(false) { ++ } ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_OPTIONS_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/slice.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/slice.h +new file mode 100644 +index 0000000..bc36798 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/slice.h +@@ -0,0 +1,109 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Slice is a simple structure containing a pointer into some external ++// storage and a size. The user of a Slice must ensure that the slice ++// is not used after the corresponding external storage has been ++// deallocated. ++// ++// Multiple threads can invoke const methods on a Slice without ++// external synchronization, but if any of the threads may call a ++// non-const method, all threads accessing the same Slice must use ++// external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_SLICE_H_ ++#define STORAGE_LEVELDB_INCLUDE_SLICE_H_ ++ ++#include ++#include ++#include ++#include ++ ++namespace leveldb { ++ ++class Slice { ++ public: ++ // Create an empty slice. ++ Slice() : data_(""), size_(0) { } ++ ++ // Create a slice that refers to d[0,n-1]. ++ Slice(const char* d, size_t n) : data_(d), size_(n) { } ++ ++ // Create a slice that refers to the contents of "s" ++ Slice(const std::string& s) : data_(s.data()), size_(s.size()) { } ++ ++ // Create a slice that refers to s[0,strlen(s)-1] ++ Slice(const char* s) : data_(s), size_(strlen(s)) { } ++ ++ // Return a pointer to the beginning of the referenced data ++ const char* data() const { return data_; } ++ ++ // Return the length (in bytes) of the referenced data ++ size_t size() const { return size_; } ++ ++ // Return true iff the length of the referenced data is zero ++ bool empty() const { return size_ == 0; } ++ ++ // Return the ith byte in the referenced data. ++ // REQUIRES: n < size() ++ char operator[](size_t n) const { ++ assert(n < size()); ++ return data_[n]; ++ } ++ ++ // Change this slice to refer to an empty array ++ void clear() { data_ = ""; size_ = 0; } ++ ++ // Drop the first "n" bytes from this slice. ++ void remove_prefix(size_t n) { ++ assert(n <= size()); ++ data_ += n; ++ size_ -= n; ++ } ++ ++ // Return a string that contains the copy of the referenced data. ++ std::string ToString() const { return std::string(data_, size_); } ++ ++ // Three-way comparison. Returns value: ++ // < 0 iff "*this" < "b", ++ // == 0 iff "*this" == "b", ++ // > 0 iff "*this" > "b" ++ int compare(const Slice& b) const; ++ ++ // Return true iff "x" is a prefix of "*this" ++ bool starts_with(const Slice& x) const { ++ return ((size_ >= x.size_) && ++ (memcmp(data_, x.data_, x.size_) == 0)); ++ } ++ ++ private: ++ const char* data_; ++ size_t size_; ++ ++ // Intentionally copyable ++}; ++ ++inline bool operator==(const Slice& x, const Slice& y) { ++ return ((x.size() == y.size()) && ++ (memcmp(x.data(), y.data(), x.size()) == 0)); ++} ++ ++inline bool operator!=(const Slice& x, const Slice& y) { ++ return !(x == y); ++} ++ ++inline int Slice::compare(const Slice& b) const { ++ const size_t min_len = (size_ < b.size_) ? size_ : b.size_; ++ int r = memcmp(data_, b.data_, min_len); ++ if (r == 0) { ++ if (size_ < b.size_) r = -1; ++ else if (size_ > b.size_) r = +1; ++ } ++ return r; ++} ++ ++} // namespace leveldb ++ ++ ++#endif // STORAGE_LEVELDB_INCLUDE_SLICE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/status.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/status.h +new file mode 100644 +index 0000000..d9575f9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/status.h +@@ -0,0 +1,112 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A Status encapsulates the result of an operation. It may indicate success, ++// or it may indicate an error with an associated error message. ++// ++// Multiple threads can invoke const methods on a Status without ++// external synchronization, but if any of the threads may call a ++// non-const method, all threads accessing the same Status must use ++// external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_STATUS_H_ ++#define STORAGE_LEVELDB_INCLUDE_STATUS_H_ ++ ++#include ++#include "leveldb/slice.h" ++ ++namespace leveldb { ++ ++class Status { ++ public: ++ // Create a success status. ++ Status() : state_(NULL) { } ++ ~Status() { delete[] state_; } ++ ++ // Copy the specified status. ++ Status(const Status& s); ++ void operator=(const Status& s); ++ ++ // Return a success status. ++ static Status OK() { return Status(); } ++ ++ // Return error status of an appropriate type. ++ static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) { ++ return Status(kNotFound, msg, msg2); ++ } ++ static Status Corruption(const Slice& msg, const Slice& msg2 = Slice()) { ++ return Status(kCorruption, msg, msg2); ++ } ++ static Status NotSupported(const Slice& msg, const Slice& msg2 = Slice()) { ++ return Status(kNotSupported, msg, msg2); ++ } ++ static Status InvalidArgument(const Slice& msg, const Slice& msg2 = Slice()) { ++ return Status(kInvalidArgument, msg, msg2); ++ } ++ static Status IOError(const Slice& msg, const Slice& msg2 = Slice()) { ++ return Status(kIOError, msg, msg2); ++ } ++ ++ // Returns true iff the status indicates success. ++ bool ok() const { return (state_ == NULL); } ++ ++ // Returns true iff the status indicates a NotFound error. ++ bool IsNotFound() const { return code() == kNotFound; } ++ ++ // Returns true iff the status indicates a Corruption error. ++ bool IsCorruption() const { return code() == kCorruption; } ++ ++ // Returns true iff the status indicates an IOError. ++ bool IsIOError() const { return code() == kIOError; } ++ ++ // Returns true iff the status indicates a NotSupportedError. ++ bool IsNotSupportedError() const { return code() == kNotSupported; } ++ ++ // Returns true iff the status indicates an InvalidArgument. ++ bool IsInvalidArgument() const { return code() == kInvalidArgument; } ++ ++ // Return a string representation of this status suitable for printing. ++ // Returns the string "OK" for success. ++ std::string ToString() const; ++ ++ private: ++ // OK status has a NULL state_. Otherwise, state_ is a new[] array ++ // of the following form: ++ // state_[0..3] == length of message ++ // state_[4] == code ++ // state_[5..] == message ++ const char* state_; ++ ++ enum Code { ++ kOk = 0, ++ kNotFound = 1, ++ kCorruption = 2, ++ kNotSupported = 3, ++ kInvalidArgument = 4, ++ kIOError = 5 ++ }; ++ ++ Code code() const { ++ return (state_ == NULL) ? kOk : static_cast(state_[4]); ++ } ++ ++ Status(Code code, const Slice& msg, const Slice& msg2); ++ static const char* CopyState(const char* s); ++}; ++ ++inline Status::Status(const Status& s) { ++ state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_); ++} ++inline void Status::operator=(const Status& s) { ++ // The following condition catches both aliasing (when this == &s), ++ // and the common case where both s and *this are ok. ++ if (state_ != s.state_) { ++ delete[] state_; ++ state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_); ++ } ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table.h +new file mode 100644 +index 0000000..a9746c3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table.h +@@ -0,0 +1,85 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_TABLE_H_ ++#define STORAGE_LEVELDB_INCLUDE_TABLE_H_ ++ ++#include ++#include "leveldb/iterator.h" ++ ++namespace leveldb { ++ ++class Block; ++class BlockHandle; ++class Footer; ++struct Options; ++class RandomAccessFile; ++struct ReadOptions; ++class TableCache; ++ ++// A Table is a sorted map from strings to strings. Tables are ++// immutable and persistent. A Table may be safely accessed from ++// multiple threads without external synchronization. ++class Table { ++ public: ++ // Attempt to open the table that is stored in bytes [0..file_size) ++ // of "file", and read the metadata entries necessary to allow ++ // retrieving data from the table. ++ // ++ // If successful, returns ok and sets "*table" to the newly opened ++ // table. The client should delete "*table" when no longer needed. ++ // If there was an error while initializing the table, sets "*table" ++ // to NULL and returns a non-ok status. Does not take ownership of ++ // "*source", but the client must ensure that "source" remains live ++ // for the duration of the returned table's lifetime. ++ // ++ // *file must remain live while this Table is in use. ++ static Status Open(const Options& options, ++ RandomAccessFile* file, ++ uint64_t file_size, ++ Table** table); ++ ++ ~Table(); ++ ++ // Returns a new iterator over the table contents. ++ // The result of NewIterator() is initially invalid (caller must ++ // call one of the Seek methods on the iterator before using it). ++ Iterator* NewIterator(const ReadOptions&) const; ++ ++ // Given a key, return an approximate byte offset in the file where ++ // the data for that key begins (or would begin if the key were ++ // present in the file). The returned value is in terms of file ++ // bytes, and so includes effects like compression of the underlying data. ++ // E.g., the approximate offset of the last key in the table will ++ // be close to the file length. ++ uint64_t ApproximateOffsetOf(const Slice& key) const; ++ ++ private: ++ struct Rep; ++ Rep* rep_; ++ ++ explicit Table(Rep* rep) { rep_ = rep; } ++ static Iterator* BlockReader(void*, const ReadOptions&, const Slice&); ++ ++ // Calls (*handle_result)(arg, ...) with the entry found after a call ++ // to Seek(key). May not make such a call if filter policy says ++ // that key is not present. ++ friend class TableCache; ++ Status InternalGet( ++ const ReadOptions&, const Slice& key, ++ void* arg, ++ void (*handle_result)(void* arg, const Slice& k, const Slice& v)); ++ ++ ++ void ReadMeta(const Footer& footer); ++ void ReadFilter(const Slice& filter_handle_value); ++ ++ // No copying allowed ++ Table(const Table&); ++ void operator=(const Table&); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_TABLE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table_builder.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table_builder.h +new file mode 100644 +index 0000000..5fd1dc7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table_builder.h +@@ -0,0 +1,92 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// TableBuilder provides the interface used to build a Table ++// (an immutable and sorted map from keys to values). ++// ++// Multiple threads can invoke const methods on a TableBuilder without ++// external synchronization, but if any of the threads may call a ++// non-const method, all threads accessing the same TableBuilder must use ++// external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_ ++#define STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_ ++ ++#include ++#include "leveldb/options.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class BlockBuilder; ++class BlockHandle; ++class WritableFile; ++ ++class TableBuilder { ++ public: ++ // Create a builder that will store the contents of the table it is ++ // building in *file. Does not close the file. It is up to the ++ // caller to close the file after calling Finish(). ++ TableBuilder(const Options& options, WritableFile* file); ++ ++ // REQUIRES: Either Finish() or Abandon() has been called. ++ ~TableBuilder(); ++ ++ // Change the options used by this builder. Note: only some of the ++ // option fields can be changed after construction. If a field is ++ // not allowed to change dynamically and its value in the structure ++ // passed to the constructor is different from its value in the ++ // structure passed to this method, this method will return an error ++ // without changing any fields. ++ Status ChangeOptions(const Options& options); ++ ++ // Add key,value to the table being constructed. ++ // REQUIRES: key is after any previously added key according to comparator. ++ // REQUIRES: Finish(), Abandon() have not been called ++ void Add(const Slice& key, const Slice& value); ++ ++ // Advanced operation: flush any buffered key/value pairs to file. ++ // Can be used to ensure that two adjacent entries never live in ++ // the same data block. Most clients should not need to use this method. ++ // REQUIRES: Finish(), Abandon() have not been called ++ void Flush(); ++ ++ // Return non-ok iff some error has been detected. ++ Status status() const; ++ ++ // Finish building the table. Stops using the file passed to the ++ // constructor after this function returns. ++ // REQUIRES: Finish(), Abandon() have not been called ++ Status Finish(); ++ ++ // Indicate that the contents of this builder should be abandoned. Stops ++ // using the file passed to the constructor after this function returns. ++ // If the caller is not going to call Finish(), it must call Abandon() ++ // before destroying this builder. ++ // REQUIRES: Finish(), Abandon() have not been called ++ void Abandon(); ++ ++ // Number of calls to Add() so far. ++ uint64_t NumEntries() const; ++ ++ // Size of the file generated so far. If invoked after a successful ++ // Finish() call, returns the size of the final generated file. ++ uint64_t FileSize() const; ++ ++ private: ++ bool ok() const { return status().ok(); } ++ void WriteBlock(BlockBuilder* block, BlockHandle* handle); ++ void WriteRawBlock(const Slice& data, CompressionType, BlockHandle* handle); ++ ++ struct Rep; ++ Rep* rep_; ++ ++ // No copying allowed ++ TableBuilder(const TableBuilder&); ++ void operator=(const TableBuilder&); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/write_batch.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/write_batch.h +new file mode 100644 +index 0000000..ee9aab6 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/write_batch.h +@@ -0,0 +1,64 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// WriteBatch holds a collection of updates to apply atomically to a DB. ++// ++// The updates are applied in the order in which they are added ++// to the WriteBatch. For example, the value of "key" will be "v3" ++// after the following batch is written: ++// ++// batch.Put("key", "v1"); ++// batch.Delete("key"); ++// batch.Put("key", "v2"); ++// batch.Put("key", "v3"); ++// ++// Multiple threads can invoke const methods on a WriteBatch without ++// external synchronization, but if any of the threads may call a ++// non-const method, all threads accessing the same WriteBatch must use ++// external synchronization. ++ ++#ifndef STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_ ++#define STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_ ++ ++#include ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++class Slice; ++ ++class WriteBatch { ++ public: ++ WriteBatch(); ++ ~WriteBatch(); ++ ++ // Store the mapping "key->value" in the database. ++ void Put(const Slice& key, const Slice& value); ++ ++ // If the database contains a mapping for "key", erase it. Else do nothing. ++ void Delete(const Slice& key); ++ ++ // Clear all updates buffered in this batch. ++ void Clear(); ++ ++ // Support for iterating over the contents of a batch. ++ class Handler { ++ public: ++ virtual ~Handler(); ++ virtual void Put(const Slice& key, const Slice& value) = 0; ++ virtual void Delete(const Slice& key) = 0; ++ }; ++ Status Iterate(Handler* handler) const; ++ ++ private: ++ friend class WriteBatchInternal; ++ ++ std::string rep_; // See comment in write_batch.cc for the format of rep_ ++ ++ // Intentionally copyable ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_INCLUDE_WRITE_BATCH_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue178_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue178_test.cc +new file mode 100644 +index 0000000..1b1cf8b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue178_test.cc +@@ -0,0 +1,92 @@ ++// Copyright (c) 2013 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// Test for issue 178: a manual compaction causes deleted data to reappear. ++#include ++#include ++#include ++ ++#include "leveldb/db.h" ++#include "leveldb/write_batch.h" ++#include "util/testharness.h" ++ ++namespace { ++ ++const int kNumKeys = 1100000; ++ ++std::string Key1(int i) { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "my_key_%d", i); ++ return buf; ++} ++ ++std::string Key2(int i) { ++ return Key1(i) + "_xxx"; ++} ++ ++class Issue178 { }; ++ ++TEST(Issue178, Test) { ++ // Get rid of any state from an old run. ++ std::string dbpath = leveldb::test::TmpDir() + "/leveldb_cbug_test"; ++ DestroyDB(dbpath, leveldb::Options()); ++ ++ // Open database. Disable compression since it affects the creation ++ // of layers and the code below is trying to test against a very ++ // specific scenario. ++ leveldb::DB* db; ++ leveldb::Options db_options; ++ db_options.create_if_missing = true; ++ db_options.compression = leveldb::kNoCompression; ++ ASSERT_OK(leveldb::DB::Open(db_options, dbpath, &db)); ++ ++ // create first key range ++ leveldb::WriteBatch batch; ++ for (size_t i = 0; i < kNumKeys; i++) { ++ batch.Put(Key1(i), "value for range 1 key"); ++ } ++ ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch)); ++ ++ // create second key range ++ batch.Clear(); ++ for (size_t i = 0; i < kNumKeys; i++) { ++ batch.Put(Key2(i), "value for range 2 key"); ++ } ++ ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch)); ++ ++ // delete second key range ++ batch.Clear(); ++ for (size_t i = 0; i < kNumKeys; i++) { ++ batch.Delete(Key2(i)); ++ } ++ ASSERT_OK(db->Write(leveldb::WriteOptions(), &batch)); ++ ++ // compact database ++ std::string start_key = Key1(0); ++ std::string end_key = Key1(kNumKeys - 1); ++ leveldb::Slice least(start_key.data(), start_key.size()); ++ leveldb::Slice greatest(end_key.data(), end_key.size()); ++ ++ // commenting out the line below causes the example to work correctly ++ db->CompactRange(&least, &greatest); ++ ++ // count the keys ++ leveldb::Iterator* iter = db->NewIterator(leveldb::ReadOptions()); ++ size_t num_keys = 0; ++ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { ++ num_keys++; ++ } ++ delete iter; ++ ASSERT_EQ(kNumKeys, num_keys) << "Bad number of keys"; ++ ++ // close database ++ delete db; ++ DestroyDB(dbpath, leveldb::Options()); ++} ++ ++} // anonymous namespace ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue200_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue200_test.cc +new file mode 100644 +index 0000000..1cec79f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue200_test.cc +@@ -0,0 +1,59 @@ ++// Copyright (c) 2013 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// Test for issue 200: when iterator switches direction from backward ++// to forward, the current key can be yielded unexpectedly if a new ++// mutation has been added just before the current key. ++ ++#include "leveldb/db.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++class Issue200 { }; ++ ++TEST(Issue200, Test) { ++ // Get rid of any state from an old run. ++ std::string dbpath = test::TmpDir() + "/leveldb_issue200_test"; ++ DestroyDB(dbpath, Options()); ++ ++ DB *db; ++ Options options; ++ options.create_if_missing = true; ++ ASSERT_OK(DB::Open(options, dbpath, &db)); ++ ++ WriteOptions write_options; ++ ASSERT_OK(db->Put(write_options, "1", "b")); ++ ASSERT_OK(db->Put(write_options, "2", "c")); ++ ASSERT_OK(db->Put(write_options, "3", "d")); ++ ASSERT_OK(db->Put(write_options, "4", "e")); ++ ASSERT_OK(db->Put(write_options, "5", "f")); ++ ++ ReadOptions read_options; ++ Iterator *iter = db->NewIterator(read_options); ++ ++ // Add an element that should not be reflected in the iterator. ++ ASSERT_OK(db->Put(write_options, "25", "cd")); ++ ++ iter->Seek("5"); ++ ASSERT_EQ(iter->key().ToString(), "5"); ++ iter->Prev(); ++ ASSERT_EQ(iter->key().ToString(), "4"); ++ iter->Prev(); ++ ASSERT_EQ(iter->key().ToString(), "3"); ++ iter->Next(); ++ ASSERT_EQ(iter->key().ToString(), "4"); ++ iter->Next(); ++ ASSERT_EQ(iter->key().ToString(), "5"); ++ ++ delete iter; ++ delete db; ++ DestroyDB(dbpath, options); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/README b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/README +new file mode 100644 +index 0000000..422563e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/README +@@ -0,0 +1,10 @@ ++This directory contains interfaces and implementations that isolate the ++rest of the package from platform details. ++ ++Code in the rest of the package includes "port.h" from this directory. ++"port.h" in turn includes a platform specific "port_.h" file ++that provides the platform specific implementation. ++ ++See port_posix.h for an example of what must be provided in a platform ++specific header file. ++ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/atomic_pointer.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/atomic_pointer.h +new file mode 100644 +index 0000000..1c4c7aa +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/atomic_pointer.h +@@ -0,0 +1,242 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// AtomicPointer provides storage for a lock-free pointer. ++// Platform-dependent implementation of AtomicPointer: ++// - If the platform provides a cheap barrier, we use it with raw pointers ++// - If is present (on newer versions of gcc, it is), we use ++// a -based AtomicPointer. However we prefer the memory ++// barrier based version, because at least on a gcc 4.4 32-bit build ++// on linux, we have encountered a buggy implementation. ++// Also, some implementations are much slower than a memory-barrier ++// based implementation (~16ns for based acquire-load vs. ~1ns for ++// a barrier based acquire-load). ++// This code is based on atomicops-internals-* in Google's perftools: ++// http://code.google.com/p/google-perftools/source/browse/#svn%2Ftrunk%2Fsrc%2Fbase ++ ++#ifndef PORT_ATOMIC_POINTER_H_ ++#define PORT_ATOMIC_POINTER_H_ ++ ++#include ++#ifdef LEVELDB_ATOMIC_PRESENT ++#include ++#endif ++#ifdef OS_WIN ++#include ++#endif ++#ifdef OS_MACOSX ++#include ++#endif ++ ++#if defined(_M_X64) || defined(__x86_64__) ++#define ARCH_CPU_X86_FAMILY 1 ++#elif defined(_M_IX86) || defined(__i386__) || defined(__i386) ++#define ARCH_CPU_X86_FAMILY 1 ++#elif defined(__ARMEL__) ++#define ARCH_CPU_ARM_FAMILY 1 ++#elif defined(__aarch64__) ++#define ARCH_CPU_ARM64_FAMILY 1 ++#elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc64__) ++#define ARCH_CPU_PPC_FAMILY 1 ++#elif defined(__mips__) ++#define ARCH_CPU_MIPS_FAMILY 1 ++#endif ++ ++namespace leveldb { ++namespace port { ++ ++// Define MemoryBarrier() if available ++// Windows on x86 ++#if defined(OS_WIN) && defined(COMPILER_MSVC) && defined(ARCH_CPU_X86_FAMILY) ++// windows.h already provides a MemoryBarrier(void) macro ++// http://msdn.microsoft.com/en-us/library/ms684208(v=vs.85).aspx ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// Mac OS ++#elif defined(OS_MACOSX) ++inline void MemoryBarrier() { ++ OSMemoryBarrier(); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// Gcc on x86 ++#elif defined(ARCH_CPU_X86_FAMILY) && defined(__GNUC__) ++inline void MemoryBarrier() { ++ // See http://gcc.gnu.org/ml/gcc/2003-04/msg01180.html for a discussion on ++ // this idiom. Also see http://en.wikipedia.org/wiki/Memory_ordering. ++ __asm__ __volatile__("" : : : "memory"); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// Sun Studio ++#elif defined(ARCH_CPU_X86_FAMILY) && defined(__SUNPRO_CC) ++inline void MemoryBarrier() { ++ // See http://gcc.gnu.org/ml/gcc/2003-04/msg01180.html for a discussion on ++ // this idiom. Also see http://en.wikipedia.org/wiki/Memory_ordering. ++ asm volatile("" : : : "memory"); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// ARM Linux ++#elif defined(ARCH_CPU_ARM_FAMILY) && defined(__linux__) ++typedef void (*LinuxKernelMemoryBarrierFunc)(void); ++// The Linux ARM kernel provides a highly optimized device-specific memory ++// barrier function at a fixed memory address that is mapped in every ++// user-level process. ++// ++// This beats using CPU-specific instructions which are, on single-core ++// devices, un-necessary and very costly (e.g. ARMv7-A "dmb" takes more ++// than 180ns on a Cortex-A8 like the one on a Nexus One). Benchmarking ++// shows that the extra function call cost is completely negligible on ++// multi-core devices. ++// ++inline void MemoryBarrier() { ++ (*(LinuxKernelMemoryBarrierFunc)0xffff0fa0)(); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// ARM64 ++#elif defined(ARCH_CPU_ARM64_FAMILY) ++inline void MemoryBarrier() { ++ asm volatile("dmb sy" : : : "memory"); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// PPC ++#elif defined(ARCH_CPU_PPC_FAMILY) && defined(__GNUC__) ++inline void MemoryBarrier() { ++ // TODO for some powerpc expert: is there a cheaper suitable variant? ++ // Perhaps by having separate barriers for acquire and release ops. ++ asm volatile("sync" : : : "memory"); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++// MIPS ++#elif defined(ARCH_CPU_MIPS_FAMILY) && defined(__GNUC__) ++inline void MemoryBarrier() { ++ __asm__ __volatile__("sync" : : : "memory"); ++} ++#define LEVELDB_HAVE_MEMORY_BARRIER ++ ++#endif ++ ++// AtomicPointer built using platform-specific MemoryBarrier() ++#if defined(LEVELDB_HAVE_MEMORY_BARRIER) ++class AtomicPointer { ++ private: ++ void* rep_; ++ public: ++ AtomicPointer() { } ++ explicit AtomicPointer(void* p) : rep_(p) {} ++ inline void* NoBarrier_Load() const { return rep_; } ++ inline void NoBarrier_Store(void* v) { rep_ = v; } ++ inline void* Acquire_Load() const { ++ void* result = rep_; ++ MemoryBarrier(); ++ return result; ++ } ++ inline void Release_Store(void* v) { ++ MemoryBarrier(); ++ rep_ = v; ++ } ++}; ++ ++// AtomicPointer based on ++#elif defined(LEVELDB_ATOMIC_PRESENT) ++class AtomicPointer { ++ private: ++ std::atomic rep_; ++ public: ++ AtomicPointer() { } ++ explicit AtomicPointer(void* v) : rep_(v) { } ++ inline void* Acquire_Load() const { ++ return rep_.load(std::memory_order_acquire); ++ } ++ inline void Release_Store(void* v) { ++ rep_.store(v, std::memory_order_release); ++ } ++ inline void* NoBarrier_Load() const { ++ return rep_.load(std::memory_order_relaxed); ++ } ++ inline void NoBarrier_Store(void* v) { ++ rep_.store(v, std::memory_order_relaxed); ++ } ++}; ++ ++// Atomic pointer based on sparc memory barriers ++#elif defined(__sparcv9) && defined(__GNUC__) ++class AtomicPointer { ++ private: ++ void* rep_; ++ public: ++ AtomicPointer() { } ++ explicit AtomicPointer(void* v) : rep_(v) { } ++ inline void* Acquire_Load() const { ++ void* val; ++ __asm__ __volatile__ ( ++ "ldx [%[rep_]], %[val] \n\t" ++ "membar #LoadLoad|#LoadStore \n\t" ++ : [val] "=r" (val) ++ : [rep_] "r" (&rep_) ++ : "memory"); ++ return val; ++ } ++ inline void Release_Store(void* v) { ++ __asm__ __volatile__ ( ++ "membar #LoadStore|#StoreStore \n\t" ++ "stx %[v], [%[rep_]] \n\t" ++ : ++ : [rep_] "r" (&rep_), [v] "r" (v) ++ : "memory"); ++ } ++ inline void* NoBarrier_Load() const { return rep_; } ++ inline void NoBarrier_Store(void* v) { rep_ = v; } ++}; ++ ++// Atomic pointer based on ia64 acq/rel ++#elif defined(__ia64) && defined(__GNUC__) ++class AtomicPointer { ++ private: ++ void* rep_; ++ public: ++ AtomicPointer() { } ++ explicit AtomicPointer(void* v) : rep_(v) { } ++ inline void* Acquire_Load() const { ++ void* val ; ++ __asm__ __volatile__ ( ++ "ld8.acq %[val] = [%[rep_]] \n\t" ++ : [val] "=r" (val) ++ : [rep_] "r" (&rep_) ++ : "memory" ++ ); ++ return val; ++ } ++ inline void Release_Store(void* v) { ++ __asm__ __volatile__ ( ++ "st8.rel [%[rep_]] = %[v] \n\t" ++ : ++ : [rep_] "r" (&rep_), [v] "r" (v) ++ : "memory" ++ ); ++ } ++ inline void* NoBarrier_Load() const { return rep_; } ++ inline void NoBarrier_Store(void* v) { rep_ = v; } ++}; ++ ++// We have neither MemoryBarrier(), nor ++#else ++#error Please implement AtomicPointer for this platform. ++ ++#endif ++ ++#undef LEVELDB_HAVE_MEMORY_BARRIER ++#undef ARCH_CPU_X86_FAMILY ++#undef ARCH_CPU_ARM_FAMILY ++#undef ARCH_CPU_ARM64_FAMILY ++#undef ARCH_CPU_PPC_FAMILY ++ ++} // namespace port ++} // namespace leveldb ++ ++#endif // PORT_ATOMIC_POINTER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port.h +new file mode 100644 +index 0000000..e009fb6 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port.h +@@ -0,0 +1,21 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_PORT_PORT_H_ ++#define STORAGE_LEVELDB_PORT_PORT_H_ ++ ++#include ++ ++// Include the appropriate platform specific file below. If you are ++// porting to a new platform, see "port_example.h" for documentation ++// of what the new port_.h file must provide. ++#if defined(LEVELDB_PLATFORM_UV) ++# include "port_uv.h" ++#elif defined(LEVELDB_PLATFORM_POSIX) ++# include "port/port_posix.h" ++#elif defined(LEVELDB_PLATFORM_CHROMIUM) ++# include "port/port_chromium.h" ++#endif ++ ++#endif // STORAGE_LEVELDB_PORT_PORT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_example.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_example.h +new file mode 100644 +index 0000000..97bd669 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_example.h +@@ -0,0 +1,141 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// This file contains the specification, but not the implementations, ++// of the types/operations/etc. that should be defined by a platform ++// specific port_.h file. Use this file as a reference for ++// how to port this package to a new platform. ++ ++#ifndef STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_ ++#define STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_ ++ ++namespace leveldb { ++namespace port { ++ ++// TODO(jorlow): Many of these belong more in the environment class rather than ++// here. We should try moving them and see if it affects perf. ++ ++// The following boolean constant must be true on a little-endian machine ++// and false otherwise. ++static const bool kLittleEndian = true /* or some other expression */; ++ ++// ------------------ Threading ------------------- ++ ++// A Mutex represents an exclusive lock. ++class Mutex { ++ public: ++ Mutex(); ++ ~Mutex(); ++ ++ // Lock the mutex. Waits until other lockers have exited. ++ // Will deadlock if the mutex is already locked by this thread. ++ void Lock(); ++ ++ // Unlock the mutex. ++ // REQUIRES: This mutex was locked by this thread. ++ void Unlock(); ++ ++ // Optionally crash if this thread does not hold this mutex. ++ // The implementation must be fast, especially if NDEBUG is ++ // defined. The implementation is allowed to skip all checks. ++ void AssertHeld(); ++}; ++ ++class CondVar { ++ public: ++ explicit CondVar(Mutex* mu); ++ ~CondVar(); ++ ++ // Atomically release *mu and block on this condition variable until ++ // either a call to SignalAll(), or a call to Signal() that picks ++ // this thread to wakeup. ++ // REQUIRES: this thread holds *mu ++ void Wait(); ++ ++ // If there are some threads waiting, wake up at least one of them. ++ void Signal(); ++ ++ // Wake up all waiting threads. ++ void SignallAll(); ++}; ++ ++// Thread-safe initialization. ++// Used as follows: ++// static port::OnceType init_control = LEVELDB_ONCE_INIT; ++// static void Initializer() { ... do something ...; } ++// ... ++// port::InitOnce(&init_control, &Initializer); ++typedef intptr_t OnceType; ++#define LEVELDB_ONCE_INIT 0 ++extern void InitOnce(port::OnceType*, void (*initializer)()); ++ ++// A type that holds a pointer that can be read or written atomically ++// (i.e., without word-tearing.) ++class AtomicPointer { ++ private: ++ intptr_t rep_; ++ public: ++ // Initialize to arbitrary value ++ AtomicPointer(); ++ ++ // Initialize to hold v ++ explicit AtomicPointer(void* v) : rep_(v) { } ++ ++ // Read and return the stored pointer with the guarantee that no ++ // later memory access (read or write) by this thread can be ++ // reordered ahead of this read. ++ void* Acquire_Load() const; ++ ++ // Set v as the stored pointer with the guarantee that no earlier ++ // memory access (read or write) by this thread can be reordered ++ // after this store. ++ void Release_Store(void* v); ++ ++ // Read the stored pointer with no ordering guarantees. ++ void* NoBarrier_Load() const; ++ ++ // Set va as the stored pointer with no ordering guarantees. ++ void NoBarrier_Store(void* v); ++}; ++ ++// ------------------ Compression ------------------- ++ ++// Store the snappy compression of "input[0,input_length-1]" in *output. ++// Returns false if snappy is not supported by this port. ++extern bool Snappy_Compress(const char* input, size_t input_length, ++ std::string* output); ++ ++// If input[0,input_length-1] looks like a valid snappy compressed ++// buffer, store the size of the uncompressed data in *result and ++// return true. Else return false. ++extern bool Snappy_GetUncompressedLength(const char* input, size_t length, ++ size_t* result); ++ ++// Attempt to snappy uncompress input[0,input_length-1] into *output. ++// Returns true if successful, false if the input is invalid lightweight ++// compressed data. ++// ++// REQUIRES: at least the first "n" bytes of output[] must be writable ++// where "n" is the result of a successful call to ++// Snappy_GetUncompressedLength. ++extern bool Snappy_Uncompress(const char* input_data, size_t input_length, ++ char* output); ++ ++// ------------------ Miscellaneous ------------------- ++ ++// If heap profiling is not supported, returns false. ++// Else repeatedly calls (*func)(arg, data, n) and then returns true. ++// The concatenation of all "data[0,n-1]" fragments is the heap profile. ++extern bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg); ++ ++// Extend the CRC to include the first n bytes of buf. ++// ++// Returns zero if the CRC cannot be extended using acceleration, else returns ++// the newly extended CRC value (which may also be zero). ++uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size); ++ ++} // namespace port ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.cc +new file mode 100644 +index 0000000..30e8007 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.cc +@@ -0,0 +1,53 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "port/port_posix.h" ++ ++#include ++#include ++#include ++ ++namespace leveldb { ++namespace port { ++ ++static void PthreadCall(const char* label, int result) { ++ if (result != 0) { ++ fprintf(stderr, "pthread %s: %s\n", label, strerror(result)); ++ abort(); ++ } ++} ++ ++Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); } ++ ++Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); } ++ ++void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); } ++ ++void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); } ++ ++CondVar::CondVar(Mutex* mu) ++ : mu_(mu) { ++ PthreadCall("init cv", pthread_cond_init(&cv_, NULL)); ++} ++ ++CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); } ++ ++void CondVar::Wait() { ++ PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_)); ++} ++ ++void CondVar::Signal() { ++ PthreadCall("signal", pthread_cond_signal(&cv_)); ++} ++ ++void CondVar::SignalAll() { ++ PthreadCall("broadcast", pthread_cond_broadcast(&cv_)); ++} ++ ++void InitOnce(OnceType* once, void (*initializer)()) { ++ PthreadCall("once", pthread_once(once, initializer)); ++} ++ ++} // namespace port ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.h +new file mode 100644 +index 0000000..b630b7b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.h +@@ -0,0 +1,156 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// See port_example.h for documentation for the following types/functions. ++ ++#ifndef STORAGE_LEVELDB_PORT_PORT_POSIX_H_ ++#define STORAGE_LEVELDB_PORT_PORT_POSIX_H_ ++ ++#undef PLATFORM_IS_LITTLE_ENDIAN ++#if defined(OS_MACOSX) || defined(OS_IOS) ++ #include ++ #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER) ++ #define PLATFORM_IS_LITTLE_ENDIAN \ ++ (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN) ++ #endif ++#elif defined(OS_SOLARIS) ++ #include ++ #ifdef _LITTLE_ENDIAN ++ #define PLATFORM_IS_LITTLE_ENDIAN true ++ #else ++ #define PLATFORM_IS_LITTLE_ENDIAN false ++ #endif ++#elif defined(OS_FREEBSD) || defined(OS_OPENBSD) ||\ ++ defined(OS_NETBSD) || defined(OS_DRAGONFLYBSD) ++ #include ++ #include ++ #define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN) ++#elif defined(OS_HPUX) ++ #define PLATFORM_IS_LITTLE_ENDIAN false ++#elif defined(OS_ANDROID) ++ // Due to a bug in the NDK x86 definition, ++ // _BYTE_ORDER must be used instead of __BYTE_ORDER on Android. ++ // See http://code.google.com/p/android/issues/detail?id=39824 ++ #include ++ #define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN) ++#else ++ #include ++#endif ++ ++#include ++#ifdef SNAPPY ++#include ++#endif ++#include ++#include ++#include "port/atomic_pointer.h" ++ ++#ifndef PLATFORM_IS_LITTLE_ENDIAN ++#define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN) ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_IOS) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\ ++ defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\ ++ defined(OS_ANDROID) || defined(OS_HPUX) || defined(CYGWIN) ++// Use fread/fwrite/fflush on platforms without _unlocked variants ++#define fread_unlocked fread ++#define fwrite_unlocked fwrite ++#define fflush_unlocked fflush ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_IOS) || defined(OS_FREEBSD) ||\ ++ defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ++// Use fsync() on platforms without fdatasync() ++#define fdatasync fsync ++#endif ++ ++#if defined(OS_ANDROID) && __ANDROID_API__ < 9 ++// fdatasync() was only introduced in API level 9 on Android. Use fsync() ++// when targetting older platforms. ++#define fdatasync fsync ++#endif ++ ++namespace leveldb { ++namespace port { ++ ++static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; ++#undef PLATFORM_IS_LITTLE_ENDIAN ++ ++class CondVar; ++ ++class Mutex { ++ public: ++ Mutex(); ++ ~Mutex(); ++ ++ void Lock(); ++ void Unlock(); ++ void AssertHeld() { } ++ ++ private: ++ friend class CondVar; ++ pthread_mutex_t mu_; ++ ++ // No copying ++ Mutex(const Mutex&); ++ void operator=(const Mutex&); ++}; ++ ++class CondVar { ++ public: ++ explicit CondVar(Mutex* mu); ++ ~CondVar(); ++ void Wait(); ++ void Signal(); ++ void SignalAll(); ++ private: ++ pthread_cond_t cv_; ++ Mutex* mu_; ++}; ++ ++typedef pthread_once_t OnceType; ++#define LEVELDB_ONCE_INIT PTHREAD_ONCE_INIT ++extern void InitOnce(OnceType* once, void (*initializer)()); ++ ++inline bool Snappy_Compress(const char* input, size_t length, ++ ::std::string* output) { ++#ifdef SNAPPY ++ output->resize(snappy::MaxCompressedLength(length)); ++ size_t outlen; ++ snappy::RawCompress(input, length, &(*output)[0], &outlen); ++ output->resize(outlen); ++ return true; ++#endif ++ ++ return false; ++} ++ ++inline bool Snappy_GetUncompressedLength(const char* input, size_t length, ++ size_t* result) { ++#ifdef SNAPPY ++ return snappy::GetUncompressedLength(input, length, result); ++#else ++ return false; ++#endif ++} ++ ++inline bool Snappy_Uncompress(const char* input, size_t length, ++ char* output) { ++#ifdef SNAPPY ++ return snappy::RawUncompress(input, length, output); ++#else ++ return false; ++#endif ++} ++ ++inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { ++ return false; ++} ++ ++uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size); ++ ++} // namespace port ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_PORT_PORT_POSIX_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix_sse.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix_sse.cc +new file mode 100644 +index 0000000..1e519ba +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix_sse.cc +@@ -0,0 +1,129 @@ ++// Copyright 2016 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A portable implementation of crc32c, optimized to handle ++// four bytes at a time. ++// ++// In a separate source file to allow this accelerated CRC32C function to be ++// compiled with the appropriate compiler flags to enable x86 SSE 4.2 ++// instructions. ++ ++#include ++#include ++#include "port/port.h" ++ ++#if defined(LEVELDB_PLATFORM_POSIX_SSE) ++ ++#if defined(_MSC_VER) ++#include ++#elif defined(__GNUC__) && defined(__SSE4_2__) ++#include ++#include ++#endif ++ ++#endif // defined(LEVELDB_PLATFORM_POSIX_SSE) ++ ++namespace leveldb { ++namespace port { ++ ++#if defined(LEVELDB_PLATFORM_POSIX_SSE) ++ ++// Used to fetch a naturally-aligned 32-bit word in little endian byte-order ++static inline uint32_t LE_LOAD32(const uint8_t *p) { ++ // SSE is x86 only, so ensured that |p| is always little-endian. ++ uint32_t word; ++ memcpy(&word, p, sizeof(word)); ++ return word; ++} ++ ++#if defined(_M_X64) || defined(__x86_64__) // LE_LOAD64 is only used on x64. ++ ++// Used to fetch a naturally-aligned 64-bit word in little endian byte-order ++static inline uint64_t LE_LOAD64(const uint8_t *p) { ++ uint64_t dword; ++ memcpy(&dword, p, sizeof(dword)); ++ return dword; ++} ++ ++#endif // defined(_M_X64) || defined(__x86_64__) ++ ++static inline bool HaveSSE42() { ++#if defined(_MSC_VER) ++ int cpu_info[4]; ++ __cpuid(cpu_info, 1); ++ return (cpu_info[2] & (1 << 20)) != 0; ++#elif defined(__GNUC__) ++ unsigned int eax, ebx, ecx, edx; ++ __get_cpuid(1, &eax, &ebx, &ecx, &edx); ++ return (ecx & (1 << 20)) != 0; ++#else ++ return false; ++#endif ++} ++ ++#endif // defined(LEVELDB_PLATFORM_POSIX_SSE) ++ ++// For further improvements see Intel publication at: ++// http://download.intel.com/design/intarch/papers/323405.pdf ++uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size) { ++#if !defined(LEVELDB_PLATFORM_POSIX_SSE) ++ return 0; ++#else ++ static bool have = HaveSSE42(); ++ if (!have) { ++ return 0; ++ } ++ ++ const uint8_t *p = reinterpret_cast(buf); ++ const uint8_t *e = p + size; ++ uint32_t l = crc ^ 0xffffffffu; ++ ++#define STEP1 do { \ ++ l = _mm_crc32_u8(l, *p++); \ ++} while (0) ++#define STEP4 do { \ ++ l = _mm_crc32_u32(l, LE_LOAD32(p)); \ ++ p += 4; \ ++} while (0) ++#define STEP8 do { \ ++ l = _mm_crc32_u64(l, LE_LOAD64(p)); \ ++ p += 8; \ ++} while (0) ++ ++ if (size > 16) { ++ // Process unaligned bytes ++ for (unsigned int i = reinterpret_cast(p) % 8; i; --i) { ++ STEP1; ++ } ++ ++ // _mm_crc32_u64 is only available on x64. ++#if defined(_M_X64) || defined(__x86_64__) ++ // Process 8 bytes at a time ++ while ((e-p) >= 8) { ++ STEP8; ++ } ++ // Process 4 bytes at a time ++ if ((e-p) >= 4) { ++ STEP4; ++ } ++#else // !(defined(_M_X64) || defined(__x86_64__)) ++ // Process 4 bytes at a time ++ while ((e-p) >= 4) { ++ STEP4; ++ } ++#endif // defined(_M_X64) || defined(__x86_64__) ++ } ++ // Process the last few bytes ++ while (p != e) { ++ STEP1; ++ } ++#undef STEP8 ++#undef STEP4 ++#undef STEP1 ++ return l ^ 0xffffffffu; ++#endif // defined(LEVELDB_PLATFORM_POSIX_SSE) ++} ++ ++} // namespace port ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/thread_annotations.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/thread_annotations.h +new file mode 100644 +index 0000000..9470ef5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/thread_annotations.h +@@ -0,0 +1,60 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ ++#define STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ ++ ++// Some environments provide custom macros to aid in static thread-safety ++// analysis. Provide empty definitions of such macros unless they are already ++// defined. ++ ++#ifndef EXCLUSIVE_LOCKS_REQUIRED ++#define EXCLUSIVE_LOCKS_REQUIRED(...) ++#endif ++ ++#ifndef SHARED_LOCKS_REQUIRED ++#define SHARED_LOCKS_REQUIRED(...) ++#endif ++ ++#ifndef LOCKS_EXCLUDED ++#define LOCKS_EXCLUDED(...) ++#endif ++ ++#ifndef LOCK_RETURNED ++#define LOCK_RETURNED(x) ++#endif ++ ++#ifndef LOCKABLE ++#define LOCKABLE ++#endif ++ ++#ifndef SCOPED_LOCKABLE ++#define SCOPED_LOCKABLE ++#endif ++ ++#ifndef EXCLUSIVE_LOCK_FUNCTION ++#define EXCLUSIVE_LOCK_FUNCTION(...) ++#endif ++ ++#ifndef SHARED_LOCK_FUNCTION ++#define SHARED_LOCK_FUNCTION(...) ++#endif ++ ++#ifndef EXCLUSIVE_TRYLOCK_FUNCTION ++#define EXCLUSIVE_TRYLOCK_FUNCTION(...) ++#endif ++ ++#ifndef SHARED_TRYLOCK_FUNCTION ++#define SHARED_TRYLOCK_FUNCTION(...) ++#endif ++ ++#ifndef UNLOCK_FUNCTION ++#define UNLOCK_FUNCTION(...) ++#endif ++ ++#ifndef NO_THREAD_SAFETY_ANALYSIS ++#define NO_THREAD_SAFETY_ANALYSIS ++#endif ++ ++#endif // STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/win/stdint.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/win/stdint.h +new file mode 100644 +index 0000000..39edd0d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/win/stdint.h +@@ -0,0 +1,24 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// MSVC didn't ship with this file until the 2010 version. ++ ++#ifndef STORAGE_LEVELDB_PORT_WIN_STDINT_H_ ++#define STORAGE_LEVELDB_PORT_WIN_STDINT_H_ ++ ++#if !defined(_MSC_VER) ++#error This file should only be included when compiling with MSVC. ++#endif ++ ++// Define C99 equivalent types. ++typedef signed char int8_t; ++typedef signed short int16_t; ++typedef signed int int32_t; ++typedef signed long long int64_t; ++typedef unsigned char uint8_t; ++typedef unsigned short uint16_t; ++typedef unsigned int uint32_t; ++typedef unsigned long long uint64_t; ++ ++#endif // STORAGE_LEVELDB_PORT_WIN_STDINT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.cc +new file mode 100644 +index 0000000..43e402c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.cc +@@ -0,0 +1,268 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Decodes the blocks generated by block_builder.cc. ++ ++#include "table/block.h" ++ ++#include ++#include ++#include "leveldb/comparator.h" ++#include "table/format.h" ++#include "util/coding.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++inline uint32_t Block::NumRestarts() const { ++ assert(size_ >= sizeof(uint32_t)); ++ return DecodeFixed32(data_ + size_ - sizeof(uint32_t)); ++} ++ ++Block::Block(const BlockContents& contents) ++ : data_(contents.data.data()), ++ size_(contents.data.size()), ++ owned_(contents.heap_allocated) { ++ if (size_ < sizeof(uint32_t)) { ++ size_ = 0; // Error marker ++ } else { ++ size_t max_restarts_allowed = (size_-sizeof(uint32_t)) / sizeof(uint32_t); ++ if (NumRestarts() > max_restarts_allowed) { ++ // The size is too small for NumRestarts() ++ size_ = 0; ++ } else { ++ restart_offset_ = size_ - (1 + NumRestarts()) * sizeof(uint32_t); ++ } ++ } ++} ++ ++Block::~Block() { ++ if (owned_) { ++ delete[] data_; ++ } ++} ++ ++// Helper routine: decode the next block entry starting at "p", ++// storing the number of shared key bytes, non_shared key bytes, ++// and the length of the value in "*shared", "*non_shared", and ++// "*value_length", respectively. Will not dereference past "limit". ++// ++// If any errors are detected, returns NULL. Otherwise, returns a ++// pointer to the key delta (just past the three decoded values). ++static inline const char* DecodeEntry(const char* p, const char* limit, ++ uint32_t* shared, ++ uint32_t* non_shared, ++ uint32_t* value_length) { ++ if (limit - p < 3) return NULL; ++ *shared = reinterpret_cast(p)[0]; ++ *non_shared = reinterpret_cast(p)[1]; ++ *value_length = reinterpret_cast(p)[2]; ++ if ((*shared | *non_shared | *value_length) < 128) { ++ // Fast path: all three values are encoded in one byte each ++ p += 3; ++ } else { ++ if ((p = GetVarint32Ptr(p, limit, shared)) == NULL) return NULL; ++ if ((p = GetVarint32Ptr(p, limit, non_shared)) == NULL) return NULL; ++ if ((p = GetVarint32Ptr(p, limit, value_length)) == NULL) return NULL; ++ } ++ ++ if (static_cast(limit - p) < (*non_shared + *value_length)) { ++ return NULL; ++ } ++ return p; ++} ++ ++class Block::Iter : public Iterator { ++ private: ++ const Comparator* const comparator_; ++ const char* const data_; // underlying block contents ++ uint32_t const restarts_; // Offset of restart array (list of fixed32) ++ uint32_t const num_restarts_; // Number of uint32_t entries in restart array ++ ++ // current_ is offset in data_ of current entry. >= restarts_ if !Valid ++ uint32_t current_; ++ uint32_t restart_index_; // Index of restart block in which current_ falls ++ std::string key_; ++ Slice value_; ++ Status status_; ++ ++ inline int Compare(const Slice& a, const Slice& b) const { ++ return comparator_->Compare(a, b); ++ } ++ ++ // Return the offset in data_ just past the end of the current entry. ++ inline uint32_t NextEntryOffset() const { ++ return (value_.data() + value_.size()) - data_; ++ } ++ ++ uint32_t GetRestartPoint(uint32_t index) { ++ assert(index < num_restarts_); ++ return DecodeFixed32(data_ + restarts_ + index * sizeof(uint32_t)); ++ } ++ ++ void SeekToRestartPoint(uint32_t index) { ++ key_.clear(); ++ restart_index_ = index; ++ // current_ will be fixed by ParseNextKey(); ++ ++ // ParseNextKey() starts at the end of value_, so set value_ accordingly ++ uint32_t offset = GetRestartPoint(index); ++ value_ = Slice(data_ + offset, 0); ++ } ++ ++ public: ++ Iter(const Comparator* comparator, ++ const char* data, ++ uint32_t restarts, ++ uint32_t num_restarts) ++ : comparator_(comparator), ++ data_(data), ++ restarts_(restarts), ++ num_restarts_(num_restarts), ++ current_(restarts_), ++ restart_index_(num_restarts_) { ++ assert(num_restarts_ > 0); ++ } ++ ++ virtual bool Valid() const { return current_ < restarts_; } ++ virtual Status status() const { return status_; } ++ virtual Slice key() const { ++ assert(Valid()); ++ return key_; ++ } ++ virtual Slice value() const { ++ assert(Valid()); ++ return value_; ++ } ++ ++ virtual void Next() { ++ assert(Valid()); ++ ParseNextKey(); ++ } ++ ++ virtual void Prev() { ++ assert(Valid()); ++ ++ // Scan backwards to a restart point before current_ ++ const uint32_t original = current_; ++ while (GetRestartPoint(restart_index_) >= original) { ++ if (restart_index_ == 0) { ++ // No more entries ++ current_ = restarts_; ++ restart_index_ = num_restarts_; ++ return; ++ } ++ restart_index_--; ++ } ++ ++ SeekToRestartPoint(restart_index_); ++ do { ++ // Loop until end of current entry hits the start of original entry ++ } while (ParseNextKey() && NextEntryOffset() < original); ++ } ++ ++ virtual void Seek(const Slice& target) { ++ // Binary search in restart array to find the last restart point ++ // with a key < target ++ uint32_t left = 0; ++ uint32_t right = num_restarts_ - 1; ++ while (left < right) { ++ uint32_t mid = (left + right + 1) / 2; ++ uint32_t region_offset = GetRestartPoint(mid); ++ uint32_t shared, non_shared, value_length; ++ const char* key_ptr = DecodeEntry(data_ + region_offset, ++ data_ + restarts_, ++ &shared, &non_shared, &value_length); ++ if (key_ptr == NULL || (shared != 0)) { ++ CorruptionError(); ++ return; ++ } ++ Slice mid_key(key_ptr, non_shared); ++ if (Compare(mid_key, target) < 0) { ++ // Key at "mid" is smaller than "target". Therefore all ++ // blocks before "mid" are uninteresting. ++ left = mid; ++ } else { ++ // Key at "mid" is >= "target". Therefore all blocks at or ++ // after "mid" are uninteresting. ++ right = mid - 1; ++ } ++ } ++ ++ // Linear search (within restart block) for first key >= target ++ SeekToRestartPoint(left); ++ while (true) { ++ if (!ParseNextKey()) { ++ return; ++ } ++ if (Compare(key_, target) >= 0) { ++ return; ++ } ++ } ++ } ++ ++ virtual void SeekToFirst() { ++ SeekToRestartPoint(0); ++ ParseNextKey(); ++ } ++ ++ virtual void SeekToLast() { ++ SeekToRestartPoint(num_restarts_ - 1); ++ while (ParseNextKey() && NextEntryOffset() < restarts_) { ++ // Keep skipping ++ } ++ } ++ ++ private: ++ void CorruptionError() { ++ current_ = restarts_; ++ restart_index_ = num_restarts_; ++ status_ = Status::Corruption("bad entry in block"); ++ key_.clear(); ++ value_.clear(); ++ } ++ ++ bool ParseNextKey() { ++ current_ = NextEntryOffset(); ++ const char* p = data_ + current_; ++ const char* limit = data_ + restarts_; // Restarts come right after data ++ if (p >= limit) { ++ // No more entries to return. Mark as invalid. ++ current_ = restarts_; ++ restart_index_ = num_restarts_; ++ return false; ++ } ++ ++ // Decode next entry ++ uint32_t shared, non_shared, value_length; ++ p = DecodeEntry(p, limit, &shared, &non_shared, &value_length); ++ if (p == NULL || key_.size() < shared) { ++ CorruptionError(); ++ return false; ++ } else { ++ key_.resize(shared); ++ key_.append(p, non_shared); ++ value_ = Slice(p + non_shared, value_length); ++ while (restart_index_ + 1 < num_restarts_ && ++ GetRestartPoint(restart_index_ + 1) < current_) { ++ ++restart_index_; ++ } ++ return true; ++ } ++ } ++}; ++ ++Iterator* Block::NewIterator(const Comparator* cmp) { ++ if (size_ < sizeof(uint32_t)) { ++ return NewErrorIterator(Status::Corruption("bad block contents")); ++ } ++ const uint32_t num_restarts = NumRestarts(); ++ if (num_restarts == 0) { ++ return NewEmptyIterator(); ++ } else { ++ return new Iter(cmp, data_, restart_offset_, num_restarts); ++ } ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.h +new file mode 100644 +index 0000000..2493eb9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.h +@@ -0,0 +1,44 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_BLOCK_H_ ++#define STORAGE_LEVELDB_TABLE_BLOCK_H_ ++ ++#include ++#include ++#include "leveldb/iterator.h" ++ ++namespace leveldb { ++ ++struct BlockContents; ++class Comparator; ++ ++class Block { ++ public: ++ // Initialize the block with the specified contents. ++ explicit Block(const BlockContents& contents); ++ ++ ~Block(); ++ ++ size_t size() const { return size_; } ++ Iterator* NewIterator(const Comparator* comparator); ++ ++ private: ++ uint32_t NumRestarts() const; ++ ++ const char* data_; ++ size_t size_; ++ uint32_t restart_offset_; // Offset in data_ of restart array ++ bool owned_; // Block owns data_[] ++ ++ // No copying allowed ++ Block(const Block&); ++ void operator=(const Block&); ++ ++ class Iter; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_BLOCK_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.cc +new file mode 100644 +index 0000000..db660cd +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.cc +@@ -0,0 +1,109 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// BlockBuilder generates blocks where keys are prefix-compressed: ++// ++// When we store a key, we drop the prefix shared with the previous ++// string. This helps reduce the space requirement significantly. ++// Furthermore, once every K keys, we do not apply the prefix ++// compression and store the entire key. We call this a "restart ++// point". The tail end of the block stores the offsets of all of the ++// restart points, and can be used to do a binary search when looking ++// for a particular key. Values are stored as-is (without compression) ++// immediately following the corresponding key. ++// ++// An entry for a particular key-value pair has the form: ++// shared_bytes: varint32 ++// unshared_bytes: varint32 ++// value_length: varint32 ++// key_delta: char[unshared_bytes] ++// value: char[value_length] ++// shared_bytes == 0 for restart points. ++// ++// The trailer of the block has the form: ++// restarts: uint32[num_restarts] ++// num_restarts: uint32 ++// restarts[i] contains the offset within the block of the ith restart point. ++ ++#include "table/block_builder.h" ++ ++#include ++#include ++#include "leveldb/comparator.h" ++#include "leveldb/table_builder.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++BlockBuilder::BlockBuilder(const Options* options) ++ : options_(options), ++ restarts_(), ++ counter_(0), ++ finished_(false) { ++ assert(options->block_restart_interval >= 1); ++ restarts_.push_back(0); // First restart point is at offset 0 ++} ++ ++void BlockBuilder::Reset() { ++ buffer_.clear(); ++ restarts_.clear(); ++ restarts_.push_back(0); // First restart point is at offset 0 ++ counter_ = 0; ++ finished_ = false; ++ last_key_.clear(); ++} ++ ++size_t BlockBuilder::CurrentSizeEstimate() const { ++ return (buffer_.size() + // Raw data buffer ++ restarts_.size() * sizeof(uint32_t) + // Restart array ++ sizeof(uint32_t)); // Restart array length ++} ++ ++Slice BlockBuilder::Finish() { ++ // Append restart array ++ for (size_t i = 0; i < restarts_.size(); i++) { ++ PutFixed32(&buffer_, restarts_[i]); ++ } ++ PutFixed32(&buffer_, restarts_.size()); ++ finished_ = true; ++ return Slice(buffer_); ++} ++ ++void BlockBuilder::Add(const Slice& key, const Slice& value) { ++ Slice last_key_piece(last_key_); ++ assert(!finished_); ++ assert(counter_ <= options_->block_restart_interval); ++ assert(buffer_.empty() // No values yet? ++ || options_->comparator->Compare(key, last_key_piece) > 0); ++ size_t shared = 0; ++ if (counter_ < options_->block_restart_interval) { ++ // See how much sharing to do with previous string ++ const size_t min_length = std::min(last_key_piece.size(), key.size()); ++ while ((shared < min_length) && (last_key_piece[shared] == key[shared])) { ++ shared++; ++ } ++ } else { ++ // Restart compression ++ restarts_.push_back(buffer_.size()); ++ counter_ = 0; ++ } ++ const size_t non_shared = key.size() - shared; ++ ++ // Add "" to buffer_ ++ PutVarint32(&buffer_, shared); ++ PutVarint32(&buffer_, non_shared); ++ PutVarint32(&buffer_, value.size()); ++ ++ // Add string delta to buffer_ followed by value ++ buffer_.append(key.data() + shared, non_shared); ++ buffer_.append(value.data(), value.size()); ++ ++ // Update state ++ last_key_.resize(shared); ++ last_key_.append(key.data() + shared, non_shared); ++ assert(Slice(last_key_) == key); ++ counter_++; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.h +new file mode 100644 +index 0000000..4fbcb33 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.h +@@ -0,0 +1,57 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_BLOCK_BUILDER_H_ ++#define STORAGE_LEVELDB_TABLE_BLOCK_BUILDER_H_ ++ ++#include ++ ++#include ++#include "leveldb/slice.h" ++ ++namespace leveldb { ++ ++struct Options; ++ ++class BlockBuilder { ++ public: ++ explicit BlockBuilder(const Options* options); ++ ++ // Reset the contents as if the BlockBuilder was just constructed. ++ void Reset(); ++ ++ // REQUIRES: Finish() has not been called since the last call to Reset(). ++ // REQUIRES: key is larger than any previously added key ++ void Add(const Slice& key, const Slice& value); ++ ++ // Finish building the block and return a slice that refers to the ++ // block contents. The returned slice will remain valid for the ++ // lifetime of this builder or until Reset() is called. ++ Slice Finish(); ++ ++ // Returns an estimate of the current (uncompressed) size of the block ++ // we are building. ++ size_t CurrentSizeEstimate() const; ++ ++ // Return true iff no entries have been added since the last Reset() ++ bool empty() const { ++ return buffer_.empty(); ++ } ++ ++ private: ++ const Options* options_; ++ std::string buffer_; // Destination buffer ++ std::vector restarts_; // Restart points ++ int counter_; // Number of entries emitted since restart ++ bool finished_; // Has Finish() been called? ++ std::string last_key_; ++ ++ // No copying allowed ++ BlockBuilder(const BlockBuilder&); ++ void operator=(const BlockBuilder&); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_BLOCK_BUILDER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.cc +new file mode 100644 +index 0000000..1ed5134 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.cc +@@ -0,0 +1,111 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "table/filter_block.h" ++ ++#include "leveldb/filter_policy.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++// See doc/table_format.md for an explanation of the filter block format. ++ ++// Generate new filter every 2KB of data ++static const size_t kFilterBaseLg = 11; ++static const size_t kFilterBase = 1 << kFilterBaseLg; ++ ++FilterBlockBuilder::FilterBlockBuilder(const FilterPolicy* policy) ++ : policy_(policy) { ++} ++ ++void FilterBlockBuilder::StartBlock(uint64_t block_offset) { ++ uint64_t filter_index = (block_offset / kFilterBase); ++ assert(filter_index >= filter_offsets_.size()); ++ while (filter_index > filter_offsets_.size()) { ++ GenerateFilter(); ++ } ++} ++ ++void FilterBlockBuilder::AddKey(const Slice& key) { ++ Slice k = key; ++ start_.push_back(keys_.size()); ++ keys_.append(k.data(), k.size()); ++} ++ ++Slice FilterBlockBuilder::Finish() { ++ if (!start_.empty()) { ++ GenerateFilter(); ++ } ++ ++ // Append array of per-filter offsets ++ const uint32_t array_offset = result_.size(); ++ for (size_t i = 0; i < filter_offsets_.size(); i++) { ++ PutFixed32(&result_, filter_offsets_[i]); ++ } ++ ++ PutFixed32(&result_, array_offset); ++ result_.push_back(kFilterBaseLg); // Save encoding parameter in result ++ return Slice(result_); ++} ++ ++void FilterBlockBuilder::GenerateFilter() { ++ const size_t num_keys = start_.size(); ++ if (num_keys == 0) { ++ // Fast path if there are no keys for this filter ++ filter_offsets_.push_back(result_.size()); ++ return; ++ } ++ ++ // Make list of keys from flattened key structure ++ start_.push_back(keys_.size()); // Simplify length computation ++ tmp_keys_.resize(num_keys); ++ for (size_t i = 0; i < num_keys; i++) { ++ const char* base = keys_.data() + start_[i]; ++ size_t length = start_[i+1] - start_[i]; ++ tmp_keys_[i] = Slice(base, length); ++ } ++ ++ // Generate filter for current set of keys and append to result_. ++ filter_offsets_.push_back(result_.size()); ++ policy_->CreateFilter(&tmp_keys_[0], static_cast(num_keys), &result_); ++ ++ tmp_keys_.clear(); ++ keys_.clear(); ++ start_.clear(); ++} ++ ++FilterBlockReader::FilterBlockReader(const FilterPolicy* policy, ++ const Slice& contents) ++ : policy_(policy), ++ data_(NULL), ++ offset_(NULL), ++ num_(0), ++ base_lg_(0) { ++ size_t n = contents.size(); ++ if (n < 5) return; // 1 byte for base_lg_ and 4 for start of offset array ++ base_lg_ = contents[n-1]; ++ uint32_t last_word = DecodeFixed32(contents.data() + n - 5); ++ if (last_word > n - 5) return; ++ data_ = contents.data(); ++ offset_ = data_ + last_word; ++ num_ = (n - 5 - last_word) / 4; ++} ++ ++bool FilterBlockReader::KeyMayMatch(uint64_t block_offset, const Slice& key) { ++ uint64_t index = block_offset >> base_lg_; ++ if (index < num_) { ++ uint32_t start = DecodeFixed32(offset_ + index*4); ++ uint32_t limit = DecodeFixed32(offset_ + index*4 + 4); ++ if (start <= limit && limit <= static_cast(offset_ - data_)) { ++ Slice filter = Slice(data_ + start, limit - start); ++ return policy_->KeyMayMatch(key, filter); ++ } else if (start == limit) { ++ // Empty filters do not match any keys ++ return false; ++ } ++ } ++ return true; // Errors are treated as potential matches ++} ++ ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.h +new file mode 100644 +index 0000000..c67d010 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.h +@@ -0,0 +1,68 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A filter block is stored near the end of a Table file. It contains ++// filters (e.g., bloom filters) for all data blocks in the table combined ++// into a single filter block. ++ ++#ifndef STORAGE_LEVELDB_TABLE_FILTER_BLOCK_H_ ++#define STORAGE_LEVELDB_TABLE_FILTER_BLOCK_H_ ++ ++#include ++#include ++#include ++#include ++#include "leveldb/slice.h" ++#include "util/hash.h" ++ ++namespace leveldb { ++ ++class FilterPolicy; ++ ++// A FilterBlockBuilder is used to construct all of the filters for a ++// particular Table. It generates a single string which is stored as ++// a special block in the Table. ++// ++// The sequence of calls to FilterBlockBuilder must match the regexp: ++// (StartBlock AddKey*)* Finish ++class FilterBlockBuilder { ++ public: ++ explicit FilterBlockBuilder(const FilterPolicy*); ++ ++ void StartBlock(uint64_t block_offset); ++ void AddKey(const Slice& key); ++ Slice Finish(); ++ ++ private: ++ void GenerateFilter(); ++ ++ const FilterPolicy* policy_; ++ std::string keys_; // Flattened key contents ++ std::vector start_; // Starting index in keys_ of each key ++ std::string result_; // Filter data computed so far ++ std::vector tmp_keys_; // policy_->CreateFilter() argument ++ std::vector filter_offsets_; ++ ++ // No copying allowed ++ FilterBlockBuilder(const FilterBlockBuilder&); ++ void operator=(const FilterBlockBuilder&); ++}; ++ ++class FilterBlockReader { ++ public: ++ // REQUIRES: "contents" and *policy must stay live while *this is live. ++ FilterBlockReader(const FilterPolicy* policy, const Slice& contents); ++ bool KeyMayMatch(uint64_t block_offset, const Slice& key); ++ ++ private: ++ const FilterPolicy* policy_; ++ const char* data_; // Pointer to filter data (at block-start) ++ const char* offset_; // Pointer to beginning of offset array (at block-end) ++ size_t num_; // Number of entries in offset array ++ size_t base_lg_; // Encoding parameter (see kFilterBaseLg in .cc file) ++}; ++ ++} ++ ++#endif // STORAGE_LEVELDB_TABLE_FILTER_BLOCK_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block_test.cc +new file mode 100644 +index 0000000..8c4a474 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block_test.cc +@@ -0,0 +1,128 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "table/filter_block.h" ++ ++#include "leveldb/filter_policy.h" ++#include "util/coding.h" ++#include "util/hash.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++// For testing: emit an array with one hash value per key ++class TestHashFilter : public FilterPolicy { ++ public: ++ virtual const char* Name() const { ++ return "TestHashFilter"; ++ } ++ ++ virtual void CreateFilter(const Slice* keys, int n, std::string* dst) const { ++ for (int i = 0; i < n; i++) { ++ uint32_t h = Hash(keys[i].data(), keys[i].size(), 1); ++ PutFixed32(dst, h); ++ } ++ } ++ ++ virtual bool KeyMayMatch(const Slice& key, const Slice& filter) const { ++ uint32_t h = Hash(key.data(), key.size(), 1); ++ for (size_t i = 0; i + 4 <= filter.size(); i += 4) { ++ if (h == DecodeFixed32(filter.data() + i)) { ++ return true; ++ } ++ } ++ return false; ++ } ++}; ++ ++class FilterBlockTest { ++ public: ++ TestHashFilter policy_; ++}; ++ ++TEST(FilterBlockTest, EmptyBuilder) { ++ FilterBlockBuilder builder(&policy_); ++ Slice block = builder.Finish(); ++ ASSERT_EQ("\\x00\\x00\\x00\\x00\\x0b", EscapeString(block)); ++ FilterBlockReader reader(&policy_, block); ++ ASSERT_TRUE(reader.KeyMayMatch(0, "foo")); ++ ASSERT_TRUE(reader.KeyMayMatch(100000, "foo")); ++} ++ ++TEST(FilterBlockTest, SingleChunk) { ++ FilterBlockBuilder builder(&policy_); ++ builder.StartBlock(100); ++ builder.AddKey("foo"); ++ builder.AddKey("bar"); ++ builder.AddKey("box"); ++ builder.StartBlock(200); ++ builder.AddKey("box"); ++ builder.StartBlock(300); ++ builder.AddKey("hello"); ++ Slice block = builder.Finish(); ++ FilterBlockReader reader(&policy_, block); ++ ASSERT_TRUE(reader.KeyMayMatch(100, "foo")); ++ ASSERT_TRUE(reader.KeyMayMatch(100, "bar")); ++ ASSERT_TRUE(reader.KeyMayMatch(100, "box")); ++ ASSERT_TRUE(reader.KeyMayMatch(100, "hello")); ++ ASSERT_TRUE(reader.KeyMayMatch(100, "foo")); ++ ASSERT_TRUE(! reader.KeyMayMatch(100, "missing")); ++ ASSERT_TRUE(! reader.KeyMayMatch(100, "other")); ++} ++ ++TEST(FilterBlockTest, MultiChunk) { ++ FilterBlockBuilder builder(&policy_); ++ ++ // First filter ++ builder.StartBlock(0); ++ builder.AddKey("foo"); ++ builder.StartBlock(2000); ++ builder.AddKey("bar"); ++ ++ // Second filter ++ builder.StartBlock(3100); ++ builder.AddKey("box"); ++ ++ // Third filter is empty ++ ++ // Last filter ++ builder.StartBlock(9000); ++ builder.AddKey("box"); ++ builder.AddKey("hello"); ++ ++ Slice block = builder.Finish(); ++ FilterBlockReader reader(&policy_, block); ++ ++ // Check first filter ++ ASSERT_TRUE(reader.KeyMayMatch(0, "foo")); ++ ASSERT_TRUE(reader.KeyMayMatch(2000, "bar")); ++ ASSERT_TRUE(! reader.KeyMayMatch(0, "box")); ++ ASSERT_TRUE(! reader.KeyMayMatch(0, "hello")); ++ ++ // Check second filter ++ ASSERT_TRUE(reader.KeyMayMatch(3100, "box")); ++ ASSERT_TRUE(! reader.KeyMayMatch(3100, "foo")); ++ ASSERT_TRUE(! reader.KeyMayMatch(3100, "bar")); ++ ASSERT_TRUE(! reader.KeyMayMatch(3100, "hello")); ++ ++ // Check third filter (empty) ++ ASSERT_TRUE(! reader.KeyMayMatch(4100, "foo")); ++ ASSERT_TRUE(! reader.KeyMayMatch(4100, "bar")); ++ ASSERT_TRUE(! reader.KeyMayMatch(4100, "box")); ++ ASSERT_TRUE(! reader.KeyMayMatch(4100, "hello")); ++ ++ // Check last filter ++ ASSERT_TRUE(reader.KeyMayMatch(9000, "box")); ++ ASSERT_TRUE(reader.KeyMayMatch(9000, "hello")); ++ ASSERT_TRUE(! reader.KeyMayMatch(9000, "foo")); ++ ASSERT_TRUE(! reader.KeyMayMatch(9000, "bar")); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.cc +new file mode 100644 +index 0000000..24e4e02 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.cc +@@ -0,0 +1,144 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "table/format.h" ++ ++#include "leveldb/env.h" ++#include "port/port.h" ++#include "table/block.h" ++#include "util/coding.h" ++#include "util/crc32c.h" ++ ++namespace leveldb { ++ ++void BlockHandle::EncodeTo(std::string* dst) const { ++ // Sanity check that all fields have been set ++ assert(offset_ != ~static_cast(0)); ++ assert(size_ != ~static_cast(0)); ++ PutVarint64(dst, offset_); ++ PutVarint64(dst, size_); ++} ++ ++Status BlockHandle::DecodeFrom(Slice* input) { ++ if (GetVarint64(input, &offset_) && ++ GetVarint64(input, &size_)) { ++ return Status::OK(); ++ } else { ++ return Status::Corruption("bad block handle"); ++ } ++} ++ ++void Footer::EncodeTo(std::string* dst) const { ++ const size_t original_size = dst->size(); ++ metaindex_handle_.EncodeTo(dst); ++ index_handle_.EncodeTo(dst); ++ dst->resize(2 * BlockHandle::kMaxEncodedLength); // Padding ++ PutFixed32(dst, static_cast(kTableMagicNumber & 0xffffffffu)); ++ PutFixed32(dst, static_cast(kTableMagicNumber >> 32)); ++ assert(dst->size() == original_size + kEncodedLength); ++ (void)original_size; // Disable unused variable warning. ++} ++ ++Status Footer::DecodeFrom(Slice* input) { ++ const char* magic_ptr = input->data() + kEncodedLength - 8; ++ const uint32_t magic_lo = DecodeFixed32(magic_ptr); ++ const uint32_t magic_hi = DecodeFixed32(magic_ptr + 4); ++ const uint64_t magic = ((static_cast(magic_hi) << 32) | ++ (static_cast(magic_lo))); ++ if (magic != kTableMagicNumber) { ++ return Status::Corruption("not an sstable (bad magic number)"); ++ } ++ ++ Status result = metaindex_handle_.DecodeFrom(input); ++ if (result.ok()) { ++ result = index_handle_.DecodeFrom(input); ++ } ++ if (result.ok()) { ++ // We skip over any leftover data (just padding for now) in "input" ++ const char* end = magic_ptr + 8; ++ *input = Slice(end, input->data() + input->size() - end); ++ } ++ return result; ++} ++ ++Status ReadBlock(RandomAccessFile* file, ++ const ReadOptions& options, ++ const BlockHandle& handle, ++ BlockContents* result) { ++ result->data = Slice(); ++ result->cachable = false; ++ result->heap_allocated = false; ++ ++ // Read the block contents as well as the type/crc footer. ++ // See table_builder.cc for the code that built this structure. ++ size_t n = static_cast(handle.size()); ++ char* buf = new char[n + kBlockTrailerSize]; ++ Slice contents; ++ Status s = file->Read(handle.offset(), n + kBlockTrailerSize, &contents, buf); ++ if (!s.ok()) { ++ delete[] buf; ++ return s; ++ } ++ if (contents.size() != n + kBlockTrailerSize) { ++ delete[] buf; ++ return Status::Corruption("truncated block read"); ++ } ++ ++ // Check the crc of the type and the block contents ++ const char* data = contents.data(); // Pointer to where Read put the data ++ if (options.verify_checksums) { ++ const uint32_t crc = crc32c::Unmask(DecodeFixed32(data + n + 1)); ++ const uint32_t actual = crc32c::Value(data, n + 1); ++ if (actual != crc) { ++ delete[] buf; ++ s = Status::Corruption("block checksum mismatch"); ++ return s; ++ } ++ } ++ ++ switch (data[n]) { ++ case kNoCompression: ++ if (data != buf) { ++ // File implementation gave us pointer to some other data. ++ // Use it directly under the assumption that it will be live ++ // while the file is open. ++ delete[] buf; ++ result->data = Slice(data, n); ++ result->heap_allocated = false; ++ result->cachable = false; // Do not double-cache ++ } else { ++ result->data = Slice(buf, n); ++ result->heap_allocated = true; ++ result->cachable = true; ++ } ++ ++ // Ok ++ break; ++ case kSnappyCompression: { ++ size_t ulength = 0; ++ if (!port::Snappy_GetUncompressedLength(data, n, &ulength)) { ++ delete[] buf; ++ return Status::Corruption("corrupted compressed block contents"); ++ } ++ char* ubuf = new char[ulength]; ++ if (!port::Snappy_Uncompress(data, n, ubuf)) { ++ delete[] buf; ++ delete[] ubuf; ++ return Status::Corruption("corrupted compressed block contents"); ++ } ++ delete[] buf; ++ result->data = Slice(ubuf, ulength); ++ result->heap_allocated = true; ++ result->cachable = true; ++ break; ++ } ++ default: ++ delete[] buf; ++ return Status::Corruption("bad block type"); ++ } ++ ++ return Status::OK(); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.h +new file mode 100644 +index 0000000..6c0b80c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.h +@@ -0,0 +1,108 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_FORMAT_H_ ++#define STORAGE_LEVELDB_TABLE_FORMAT_H_ ++ ++#include ++#include ++#include "leveldb/slice.h" ++#include "leveldb/status.h" ++#include "leveldb/table_builder.h" ++ ++namespace leveldb { ++ ++class Block; ++class RandomAccessFile; ++struct ReadOptions; ++ ++// BlockHandle is a pointer to the extent of a file that stores a data ++// block or a meta block. ++class BlockHandle { ++ public: ++ BlockHandle(); ++ ++ // The offset of the block in the file. ++ uint64_t offset() const { return offset_; } ++ void set_offset(uint64_t offset) { offset_ = offset; } ++ ++ // The size of the stored block ++ uint64_t size() const { return size_; } ++ void set_size(uint64_t size) { size_ = size; } ++ ++ void EncodeTo(std::string* dst) const; ++ Status DecodeFrom(Slice* input); ++ ++ // Maximum encoding length of a BlockHandle ++ enum { kMaxEncodedLength = 10 + 10 }; ++ ++ private: ++ uint64_t offset_; ++ uint64_t size_; ++}; ++ ++// Footer encapsulates the fixed information stored at the tail ++// end of every table file. ++class Footer { ++ public: ++ Footer() { } ++ ++ // The block handle for the metaindex block of the table ++ const BlockHandle& metaindex_handle() const { return metaindex_handle_; } ++ void set_metaindex_handle(const BlockHandle& h) { metaindex_handle_ = h; } ++ ++ // The block handle for the index block of the table ++ const BlockHandle& index_handle() const { ++ return index_handle_; ++ } ++ void set_index_handle(const BlockHandle& h) { ++ index_handle_ = h; ++ } ++ ++ void EncodeTo(std::string* dst) const; ++ Status DecodeFrom(Slice* input); ++ ++ // Encoded length of a Footer. Note that the serialization of a ++ // Footer will always occupy exactly this many bytes. It consists ++ // of two block handles and a magic number. ++ enum { ++ kEncodedLength = 2*BlockHandle::kMaxEncodedLength + 8 ++ }; ++ ++ private: ++ BlockHandle metaindex_handle_; ++ BlockHandle index_handle_; ++}; ++ ++// kTableMagicNumber was picked by running ++// echo http://code.google.com/p/leveldb/ | sha1sum ++// and taking the leading 64 bits. ++static const uint64_t kTableMagicNumber = 0xdb4775248b80fb57ull; ++ ++// 1-byte type + 32-bit crc ++static const size_t kBlockTrailerSize = 5; ++ ++struct BlockContents { ++ Slice data; // Actual contents of data ++ bool cachable; // True iff data can be cached ++ bool heap_allocated; // True iff caller should delete[] data.data() ++}; ++ ++// Read the block identified by "handle" from "file". On failure ++// return non-OK. On success fill *result and return OK. ++extern Status ReadBlock(RandomAccessFile* file, ++ const ReadOptions& options, ++ const BlockHandle& handle, ++ BlockContents* result); ++ ++// Implementation details follow. Clients should ignore, ++ ++inline BlockHandle::BlockHandle() ++ : offset_(~static_cast(0)), ++ size_(~static_cast(0)) { ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_FORMAT_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator.cc +new file mode 100644 +index 0000000..3d1c87f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator.cc +@@ -0,0 +1,67 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/iterator.h" ++ ++namespace leveldb { ++ ++Iterator::Iterator() { ++ cleanup_.function = NULL; ++ cleanup_.next = NULL; ++} ++ ++Iterator::~Iterator() { ++ if (cleanup_.function != NULL) { ++ (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2); ++ for (Cleanup* c = cleanup_.next; c != NULL; ) { ++ (*c->function)(c->arg1, c->arg2); ++ Cleanup* next = c->next; ++ delete c; ++ c = next; ++ } ++ } ++} ++ ++void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) { ++ assert(func != NULL); ++ Cleanup* c; ++ if (cleanup_.function == NULL) { ++ c = &cleanup_; ++ } else { ++ c = new Cleanup; ++ c->next = cleanup_.next; ++ cleanup_.next = c; ++ } ++ c->function = func; ++ c->arg1 = arg1; ++ c->arg2 = arg2; ++} ++ ++namespace { ++class EmptyIterator : public Iterator { ++ public: ++ EmptyIterator(const Status& s) : status_(s) { } ++ virtual bool Valid() const { return false; } ++ virtual void Seek(const Slice& target) { } ++ virtual void SeekToFirst() { } ++ virtual void SeekToLast() { } ++ virtual void Next() { assert(false); } ++ virtual void Prev() { assert(false); } ++ Slice key() const { assert(false); return Slice(); } ++ Slice value() const { assert(false); return Slice(); } ++ virtual Status status() const { return status_; } ++ private: ++ Status status_; ++}; ++} // namespace ++ ++Iterator* NewEmptyIterator() { ++ return new EmptyIterator(Status::OK()); ++} ++ ++Iterator* NewErrorIterator(const Status& status) { ++ return new EmptyIterator(status); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator_wrapper.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator_wrapper.h +new file mode 100644 +index 0000000..f410c3f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator_wrapper.h +@@ -0,0 +1,66 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ ++#define STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ ++ ++#include "leveldb/iterator.h" ++#include "leveldb/slice.h" ++ ++namespace leveldb { ++ ++// A internal wrapper class with an interface similar to Iterator that ++// caches the valid() and key() results for an underlying iterator. ++// This can help avoid virtual function calls and also gives better ++// cache locality. ++class IteratorWrapper { ++ public: ++ IteratorWrapper(): iter_(NULL), valid_(false) { } ++ explicit IteratorWrapper(Iterator* iter): iter_(NULL) { ++ Set(iter); ++ } ++ ~IteratorWrapper() { delete iter_; } ++ Iterator* iter() const { return iter_; } ++ ++ // Takes ownership of "iter" and will delete it when destroyed, or ++ // when Set() is invoked again. ++ void Set(Iterator* iter) { ++ delete iter_; ++ iter_ = iter; ++ if (iter_ == NULL) { ++ valid_ = false; ++ } else { ++ Update(); ++ } ++ } ++ ++ ++ // Iterator interface methods ++ bool Valid() const { return valid_; } ++ Slice key() const { assert(Valid()); return key_; } ++ Slice value() const { assert(Valid()); return iter_->value(); } ++ // Methods below require iter() != NULL ++ Status status() const { assert(iter_); return iter_->status(); } ++ void Next() { assert(iter_); iter_->Next(); Update(); } ++ void Prev() { assert(iter_); iter_->Prev(); Update(); } ++ void Seek(const Slice& k) { assert(iter_); iter_->Seek(k); Update(); } ++ void SeekToFirst() { assert(iter_); iter_->SeekToFirst(); Update(); } ++ void SeekToLast() { assert(iter_); iter_->SeekToLast(); Update(); } ++ ++ private: ++ void Update() { ++ valid_ = iter_->Valid(); ++ if (valid_) { ++ key_ = iter_->key(); ++ } ++ } ++ ++ Iterator* iter_; ++ bool valid_; ++ Slice key_; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.cc +new file mode 100644 +index 0000000..2dde4dc +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.cc +@@ -0,0 +1,197 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "table/merger.h" ++ ++#include "leveldb/comparator.h" ++#include "leveldb/iterator.h" ++#include "table/iterator_wrapper.h" ++ ++namespace leveldb { ++ ++namespace { ++class MergingIterator : public Iterator { ++ public: ++ MergingIterator(const Comparator* comparator, Iterator** children, int n) ++ : comparator_(comparator), ++ children_(new IteratorWrapper[n]), ++ n_(n), ++ current_(NULL), ++ direction_(kForward) { ++ for (int i = 0; i < n; i++) { ++ children_[i].Set(children[i]); ++ } ++ } ++ ++ virtual ~MergingIterator() { ++ delete[] children_; ++ } ++ ++ virtual bool Valid() const { ++ return (current_ != NULL); ++ } ++ ++ virtual void SeekToFirst() { ++ for (int i = 0; i < n_; i++) { ++ children_[i].SeekToFirst(); ++ } ++ FindSmallest(); ++ direction_ = kForward; ++ } ++ ++ virtual void SeekToLast() { ++ for (int i = 0; i < n_; i++) { ++ children_[i].SeekToLast(); ++ } ++ FindLargest(); ++ direction_ = kReverse; ++ } ++ ++ virtual void Seek(const Slice& target) { ++ for (int i = 0; i < n_; i++) { ++ children_[i].Seek(target); ++ } ++ FindSmallest(); ++ direction_ = kForward; ++ } ++ ++ virtual void Next() { ++ assert(Valid()); ++ ++ // Ensure that all children are positioned after key(). ++ // If we are moving in the forward direction, it is already ++ // true for all of the non-current_ children since current_ is ++ // the smallest child and key() == current_->key(). Otherwise, ++ // we explicitly position the non-current_ children. ++ if (direction_ != kForward) { ++ for (int i = 0; i < n_; i++) { ++ IteratorWrapper* child = &children_[i]; ++ if (child != current_) { ++ child->Seek(key()); ++ if (child->Valid() && ++ comparator_->Compare(key(), child->key()) == 0) { ++ child->Next(); ++ } ++ } ++ } ++ direction_ = kForward; ++ } ++ ++ current_->Next(); ++ FindSmallest(); ++ } ++ ++ virtual void Prev() { ++ assert(Valid()); ++ ++ // Ensure that all children are positioned before key(). ++ // If we are moving in the reverse direction, it is already ++ // true for all of the non-current_ children since current_ is ++ // the largest child and key() == current_->key(). Otherwise, ++ // we explicitly position the non-current_ children. ++ if (direction_ != kReverse) { ++ for (int i = 0; i < n_; i++) { ++ IteratorWrapper* child = &children_[i]; ++ if (child != current_) { ++ child->Seek(key()); ++ if (child->Valid()) { ++ // Child is at first entry >= key(). Step back one to be < key() ++ child->Prev(); ++ } else { ++ // Child has no entries >= key(). Position at last entry. ++ child->SeekToLast(); ++ } ++ } ++ } ++ direction_ = kReverse; ++ } ++ ++ current_->Prev(); ++ FindLargest(); ++ } ++ ++ virtual Slice key() const { ++ assert(Valid()); ++ return current_->key(); ++ } ++ ++ virtual Slice value() const { ++ assert(Valid()); ++ return current_->value(); ++ } ++ ++ virtual Status status() const { ++ Status status; ++ for (int i = 0; i < n_; i++) { ++ status = children_[i].status(); ++ if (!status.ok()) { ++ break; ++ } ++ } ++ return status; ++ } ++ ++ private: ++ void FindSmallest(); ++ void FindLargest(); ++ ++ // We might want to use a heap in case there are lots of children. ++ // For now we use a simple array since we expect a very small number ++ // of children in leveldb. ++ const Comparator* comparator_; ++ IteratorWrapper* children_; ++ int n_; ++ IteratorWrapper* current_; ++ ++ // Which direction is the iterator moving? ++ enum Direction { ++ kForward, ++ kReverse ++ }; ++ Direction direction_; ++}; ++ ++void MergingIterator::FindSmallest() { ++ IteratorWrapper* smallest = NULL; ++ for (int i = 0; i < n_; i++) { ++ IteratorWrapper* child = &children_[i]; ++ if (child->Valid()) { ++ if (smallest == NULL) { ++ smallest = child; ++ } else if (comparator_->Compare(child->key(), smallest->key()) < 0) { ++ smallest = child; ++ } ++ } ++ } ++ current_ = smallest; ++} ++ ++void MergingIterator::FindLargest() { ++ IteratorWrapper* largest = NULL; ++ for (int i = n_-1; i >= 0; i--) { ++ IteratorWrapper* child = &children_[i]; ++ if (child->Valid()) { ++ if (largest == NULL) { ++ largest = child; ++ } else if (comparator_->Compare(child->key(), largest->key()) > 0) { ++ largest = child; ++ } ++ } ++ } ++ current_ = largest; ++} ++} // namespace ++ ++Iterator* NewMergingIterator(const Comparator* cmp, Iterator** list, int n) { ++ assert(n >= 0); ++ if (n == 0) { ++ return NewEmptyIterator(); ++ } else if (n == 1) { ++ return list[0]; ++ } else { ++ return new MergingIterator(cmp, list, n); ++ } ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.h +new file mode 100644 +index 0000000..91ddd80 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.h +@@ -0,0 +1,26 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_MERGER_H_ ++#define STORAGE_LEVELDB_TABLE_MERGER_H_ ++ ++namespace leveldb { ++ ++class Comparator; ++class Iterator; ++ ++// Return an iterator that provided the union of the data in ++// children[0,n-1]. Takes ownership of the child iterators and ++// will delete them when the result iterator is deleted. ++// ++// The result does no duplicate suppression. I.e., if a particular ++// key is present in K child iterators, it will be yielded K times. ++// ++// REQUIRES: n >= 0 ++extern Iterator* NewMergingIterator( ++ const Comparator* comparator, Iterator** children, int n); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_MERGER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table.cc +new file mode 100644 +index 0000000..decf808 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table.cc +@@ -0,0 +1,285 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/table.h" ++ ++#include "leveldb/cache.h" ++#include "leveldb/comparator.h" ++#include "leveldb/env.h" ++#include "leveldb/filter_policy.h" ++#include "leveldb/options.h" ++#include "table/block.h" ++#include "table/filter_block.h" ++#include "table/format.h" ++#include "table/two_level_iterator.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++struct Table::Rep { ++ ~Rep() { ++ delete filter; ++ delete [] filter_data; ++ delete index_block; ++ } ++ ++ Options options; ++ Status status; ++ RandomAccessFile* file; ++ uint64_t cache_id; ++ FilterBlockReader* filter; ++ const char* filter_data; ++ ++ BlockHandle metaindex_handle; // Handle to metaindex_block: saved from footer ++ Block* index_block; ++}; ++ ++Status Table::Open(const Options& options, ++ RandomAccessFile* file, ++ uint64_t size, ++ Table** table) { ++ *table = NULL; ++ if (size < Footer::kEncodedLength) { ++ return Status::Corruption("file is too short to be an sstable"); ++ } ++ ++ char footer_space[Footer::kEncodedLength]; ++ Slice footer_input; ++ Status s = file->Read(size - Footer::kEncodedLength, Footer::kEncodedLength, ++ &footer_input, footer_space); ++ if (!s.ok()) return s; ++ ++ Footer footer; ++ s = footer.DecodeFrom(&footer_input); ++ if (!s.ok()) return s; ++ ++ // Read the index block ++ BlockContents contents; ++ Block* index_block = NULL; ++ if (s.ok()) { ++ ReadOptions opt; ++ if (options.paranoid_checks) { ++ opt.verify_checksums = true; ++ } ++ s = ReadBlock(file, opt, footer.index_handle(), &contents); ++ if (s.ok()) { ++ index_block = new Block(contents); ++ } ++ } ++ ++ if (s.ok()) { ++ // We've successfully read the footer and the index block: we're ++ // ready to serve requests. ++ Rep* rep = new Table::Rep; ++ rep->options = options; ++ rep->file = file; ++ rep->metaindex_handle = footer.metaindex_handle(); ++ rep->index_block = index_block; ++ rep->cache_id = (options.block_cache ? options.block_cache->NewId() : 0); ++ rep->filter_data = NULL; ++ rep->filter = NULL; ++ *table = new Table(rep); ++ (*table)->ReadMeta(footer); ++ } else { ++ delete index_block; ++ } ++ ++ return s; ++} ++ ++void Table::ReadMeta(const Footer& footer) { ++ if (rep_->options.filter_policy == NULL) { ++ return; // Do not need any metadata ++ } ++ ++ // TODO(sanjay): Skip this if footer.metaindex_handle() size indicates ++ // it is an empty block. ++ ReadOptions opt; ++ if (rep_->options.paranoid_checks) { ++ opt.verify_checksums = true; ++ } ++ BlockContents contents; ++ if (!ReadBlock(rep_->file, opt, footer.metaindex_handle(), &contents).ok()) { ++ // Do not propagate errors since meta info is not needed for operation ++ return; ++ } ++ Block* meta = new Block(contents); ++ ++ Iterator* iter = meta->NewIterator(BytewiseComparator()); ++ std::string key = "filter."; ++ key.append(rep_->options.filter_policy->Name()); ++ iter->Seek(key); ++ if (iter->Valid() && iter->key() == Slice(key)) { ++ ReadFilter(iter->value()); ++ } ++ delete iter; ++ delete meta; ++} ++ ++void Table::ReadFilter(const Slice& filter_handle_value) { ++ Slice v = filter_handle_value; ++ BlockHandle filter_handle; ++ if (!filter_handle.DecodeFrom(&v).ok()) { ++ return; ++ } ++ ++ // We might want to unify with ReadBlock() if we start ++ // requiring checksum verification in Table::Open. ++ ReadOptions opt; ++ if (rep_->options.paranoid_checks) { ++ opt.verify_checksums = true; ++ } ++ BlockContents block; ++ if (!ReadBlock(rep_->file, opt, filter_handle, &block).ok()) { ++ return; ++ } ++ if (block.heap_allocated) { ++ rep_->filter_data = block.data.data(); // Will need to delete later ++ } ++ rep_->filter = new FilterBlockReader(rep_->options.filter_policy, block.data); ++} ++ ++Table::~Table() { ++ delete rep_; ++} ++ ++static void DeleteBlock(void* arg, void* ignored) { ++ delete reinterpret_cast(arg); ++} ++ ++static void DeleteCachedBlock(const Slice& key, void* value) { ++ Block* block = reinterpret_cast(value); ++ delete block; ++} ++ ++static void ReleaseBlock(void* arg, void* h) { ++ Cache* cache = reinterpret_cast(arg); ++ Cache::Handle* handle = reinterpret_cast(h); ++ cache->Release(handle); ++} ++ ++// Convert an index iterator value (i.e., an encoded BlockHandle) ++// into an iterator over the contents of the corresponding block. ++Iterator* Table::BlockReader(void* arg, ++ const ReadOptions& options, ++ const Slice& index_value) { ++ Table* table = reinterpret_cast(arg); ++ Cache* block_cache = table->rep_->options.block_cache; ++ Block* block = NULL; ++ Cache::Handle* cache_handle = NULL; ++ ++ BlockHandle handle; ++ Slice input = index_value; ++ Status s = handle.DecodeFrom(&input); ++ // We intentionally allow extra stuff in index_value so that we ++ // can add more features in the future. ++ ++ if (s.ok()) { ++ BlockContents contents; ++ if (block_cache != NULL) { ++ char cache_key_buffer[16]; ++ EncodeFixed64(cache_key_buffer, table->rep_->cache_id); ++ EncodeFixed64(cache_key_buffer+8, handle.offset()); ++ Slice key(cache_key_buffer, sizeof(cache_key_buffer)); ++ cache_handle = block_cache->Lookup(key); ++ if (cache_handle != NULL) { ++ block = reinterpret_cast(block_cache->Value(cache_handle)); ++ } else { ++ s = ReadBlock(table->rep_->file, options, handle, &contents); ++ if (s.ok()) { ++ block = new Block(contents); ++ if (contents.cachable && options.fill_cache) { ++ cache_handle = block_cache->Insert( ++ key, block, block->size(), &DeleteCachedBlock); ++ } ++ } ++ } ++ } else { ++ s = ReadBlock(table->rep_->file, options, handle, &contents); ++ if (s.ok()) { ++ block = new Block(contents); ++ } ++ } ++ } ++ ++ Iterator* iter; ++ if (block != NULL) { ++ iter = block->NewIterator(table->rep_->options.comparator); ++ if (cache_handle == NULL) { ++ iter->RegisterCleanup(&DeleteBlock, block, NULL); ++ } else { ++ iter->RegisterCleanup(&ReleaseBlock, block_cache, cache_handle); ++ } ++ } else { ++ iter = NewErrorIterator(s); ++ } ++ return iter; ++} ++ ++Iterator* Table::NewIterator(const ReadOptions& options) const { ++ return NewTwoLevelIterator( ++ rep_->index_block->NewIterator(rep_->options.comparator), ++ &Table::BlockReader, const_cast(this), options); ++} ++ ++Status Table::InternalGet(const ReadOptions& options, const Slice& k, ++ void* arg, ++ void (*saver)(void*, const Slice&, const Slice&)) { ++ Status s; ++ Iterator* iiter = rep_->index_block->NewIterator(rep_->options.comparator); ++ iiter->Seek(k); ++ if (iiter->Valid()) { ++ Slice handle_value = iiter->value(); ++ FilterBlockReader* filter = rep_->filter; ++ BlockHandle handle; ++ if (filter != NULL && ++ handle.DecodeFrom(&handle_value).ok() && ++ !filter->KeyMayMatch(handle.offset(), k)) { ++ // Not found ++ } else { ++ Iterator* block_iter = BlockReader(this, options, iiter->value()); ++ block_iter->Seek(k); ++ if (block_iter->Valid()) { ++ (*saver)(arg, block_iter->key(), block_iter->value()); ++ } ++ s = block_iter->status(); ++ delete block_iter; ++ } ++ } ++ if (s.ok()) { ++ s = iiter->status(); ++ } ++ delete iiter; ++ return s; ++} ++ ++ ++uint64_t Table::ApproximateOffsetOf(const Slice& key) const { ++ Iterator* index_iter = ++ rep_->index_block->NewIterator(rep_->options.comparator); ++ index_iter->Seek(key); ++ uint64_t result; ++ if (index_iter->Valid()) { ++ BlockHandle handle; ++ Slice input = index_iter->value(); ++ Status s = handle.DecodeFrom(&input); ++ if (s.ok()) { ++ result = handle.offset(); ++ } else { ++ // Strange: we can't decode the block handle in the index block. ++ // We'll just return the offset of the metaindex block, which is ++ // close to the whole file size for this case. ++ result = rep_->metaindex_handle.offset(); ++ } ++ } else { ++ // key is past the last key in the file. Approximate the offset ++ // by returning the offset of the metaindex block (which is ++ // right near the end of the file). ++ result = rep_->metaindex_handle.offset(); ++ } ++ delete index_iter; ++ return result; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_builder.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_builder.cc +new file mode 100644 +index 0000000..62002c8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_builder.cc +@@ -0,0 +1,270 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/table_builder.h" ++ ++#include ++#include "leveldb/comparator.h" ++#include "leveldb/env.h" ++#include "leveldb/filter_policy.h" ++#include "leveldb/options.h" ++#include "table/block_builder.h" ++#include "table/filter_block.h" ++#include "table/format.h" ++#include "util/coding.h" ++#include "util/crc32c.h" ++ ++namespace leveldb { ++ ++struct TableBuilder::Rep { ++ Options options; ++ Options index_block_options; ++ WritableFile* file; ++ uint64_t offset; ++ Status status; ++ BlockBuilder data_block; ++ BlockBuilder index_block; ++ std::string last_key; ++ int64_t num_entries; ++ bool closed; // Either Finish() or Abandon() has been called. ++ FilterBlockBuilder* filter_block; ++ ++ // We do not emit the index entry for a block until we have seen the ++ // first key for the next data block. This allows us to use shorter ++ // keys in the index block. For example, consider a block boundary ++ // between the keys "the quick brown fox" and "the who". We can use ++ // "the r" as the key for the index block entry since it is >= all ++ // entries in the first block and < all entries in subsequent ++ // blocks. ++ // ++ // Invariant: r->pending_index_entry is true only if data_block is empty. ++ bool pending_index_entry; ++ BlockHandle pending_handle; // Handle to add to index block ++ ++ std::string compressed_output; ++ ++ Rep(const Options& opt, WritableFile* f) ++ : options(opt), ++ index_block_options(opt), ++ file(f), ++ offset(0), ++ data_block(&options), ++ index_block(&index_block_options), ++ num_entries(0), ++ closed(false), ++ filter_block(opt.filter_policy == NULL ? NULL ++ : new FilterBlockBuilder(opt.filter_policy)), ++ pending_index_entry(false) { ++ index_block_options.block_restart_interval = 1; ++ } ++}; ++ ++TableBuilder::TableBuilder(const Options& options, WritableFile* file) ++ : rep_(new Rep(options, file)) { ++ if (rep_->filter_block != NULL) { ++ rep_->filter_block->StartBlock(0); ++ } ++} ++ ++TableBuilder::~TableBuilder() { ++ assert(rep_->closed); // Catch errors where caller forgot to call Finish() ++ delete rep_->filter_block; ++ delete rep_; ++} ++ ++Status TableBuilder::ChangeOptions(const Options& options) { ++ // Note: if more fields are added to Options, update ++ // this function to catch changes that should not be allowed to ++ // change in the middle of building a Table. ++ if (options.comparator != rep_->options.comparator) { ++ return Status::InvalidArgument("changing comparator while building table"); ++ } ++ ++ // Note that any live BlockBuilders point to rep_->options and therefore ++ // will automatically pick up the updated options. ++ rep_->options = options; ++ rep_->index_block_options = options; ++ rep_->index_block_options.block_restart_interval = 1; ++ return Status::OK(); ++} ++ ++void TableBuilder::Add(const Slice& key, const Slice& value) { ++ Rep* r = rep_; ++ assert(!r->closed); ++ if (!ok()) return; ++ if (r->num_entries > 0) { ++ assert(r->options.comparator->Compare(key, Slice(r->last_key)) > 0); ++ } ++ ++ if (r->pending_index_entry) { ++ assert(r->data_block.empty()); ++ r->options.comparator->FindShortestSeparator(&r->last_key, key); ++ std::string handle_encoding; ++ r->pending_handle.EncodeTo(&handle_encoding); ++ r->index_block.Add(r->last_key, Slice(handle_encoding)); ++ r->pending_index_entry = false; ++ } ++ ++ if (r->filter_block != NULL) { ++ r->filter_block->AddKey(key); ++ } ++ ++ r->last_key.assign(key.data(), key.size()); ++ r->num_entries++; ++ r->data_block.Add(key, value); ++ ++ const size_t estimated_block_size = r->data_block.CurrentSizeEstimate(); ++ if (estimated_block_size >= r->options.block_size) { ++ Flush(); ++ } ++} ++ ++void TableBuilder::Flush() { ++ Rep* r = rep_; ++ assert(!r->closed); ++ if (!ok()) return; ++ if (r->data_block.empty()) return; ++ assert(!r->pending_index_entry); ++ WriteBlock(&r->data_block, &r->pending_handle); ++ if (ok()) { ++ r->pending_index_entry = true; ++ r->status = r->file->Flush(); ++ } ++ if (r->filter_block != NULL) { ++ r->filter_block->StartBlock(r->offset); ++ } ++} ++ ++void TableBuilder::WriteBlock(BlockBuilder* block, BlockHandle* handle) { ++ // File format contains a sequence of blocks where each block has: ++ // block_data: uint8[n] ++ // type: uint8 ++ // crc: uint32 ++ assert(ok()); ++ Rep* r = rep_; ++ Slice raw = block->Finish(); ++ ++ Slice block_contents; ++ CompressionType type = r->options.compression; ++ // TODO(postrelease): Support more compression options: zlib? ++ switch (type) { ++ case kNoCompression: ++ block_contents = raw; ++ break; ++ ++ case kSnappyCompression: { ++ std::string* compressed = &r->compressed_output; ++ if (port::Snappy_Compress(raw.data(), raw.size(), compressed) && ++ compressed->size() < raw.size() - (raw.size() / 8u)) { ++ block_contents = *compressed; ++ } else { ++ // Snappy not supported, or compressed less than 12.5%, so just ++ // store uncompressed form ++ block_contents = raw; ++ type = kNoCompression; ++ } ++ break; ++ } ++ } ++ WriteRawBlock(block_contents, type, handle); ++ r->compressed_output.clear(); ++ block->Reset(); ++} ++ ++void TableBuilder::WriteRawBlock(const Slice& block_contents, ++ CompressionType type, ++ BlockHandle* handle) { ++ Rep* r = rep_; ++ handle->set_offset(r->offset); ++ handle->set_size(block_contents.size()); ++ r->status = r->file->Append(block_contents); ++ if (r->status.ok()) { ++ char trailer[kBlockTrailerSize]; ++ trailer[0] = type; ++ uint32_t crc = crc32c::Value(block_contents.data(), block_contents.size()); ++ crc = crc32c::Extend(crc, trailer, 1); // Extend crc to cover block type ++ EncodeFixed32(trailer+1, crc32c::Mask(crc)); ++ r->status = r->file->Append(Slice(trailer, kBlockTrailerSize)); ++ if (r->status.ok()) { ++ r->offset += block_contents.size() + kBlockTrailerSize; ++ } ++ } ++} ++ ++Status TableBuilder::status() const { ++ return rep_->status; ++} ++ ++Status TableBuilder::Finish() { ++ Rep* r = rep_; ++ Flush(); ++ assert(!r->closed); ++ r->closed = true; ++ ++ BlockHandle filter_block_handle, metaindex_block_handle, index_block_handle; ++ ++ // Write filter block ++ if (ok() && r->filter_block != NULL) { ++ WriteRawBlock(r->filter_block->Finish(), kNoCompression, ++ &filter_block_handle); ++ } ++ ++ // Write metaindex block ++ if (ok()) { ++ BlockBuilder meta_index_block(&r->options); ++ if (r->filter_block != NULL) { ++ // Add mapping from "filter.Name" to location of filter data ++ std::string key = "filter."; ++ key.append(r->options.filter_policy->Name()); ++ std::string handle_encoding; ++ filter_block_handle.EncodeTo(&handle_encoding); ++ meta_index_block.Add(key, handle_encoding); ++ } ++ ++ // TODO(postrelease): Add stats and other meta blocks ++ WriteBlock(&meta_index_block, &metaindex_block_handle); ++ } ++ ++ // Write index block ++ if (ok()) { ++ if (r->pending_index_entry) { ++ r->options.comparator->FindShortSuccessor(&r->last_key); ++ std::string handle_encoding; ++ r->pending_handle.EncodeTo(&handle_encoding); ++ r->index_block.Add(r->last_key, Slice(handle_encoding)); ++ r->pending_index_entry = false; ++ } ++ WriteBlock(&r->index_block, &index_block_handle); ++ } ++ ++ // Write footer ++ if (ok()) { ++ Footer footer; ++ footer.set_metaindex_handle(metaindex_block_handle); ++ footer.set_index_handle(index_block_handle); ++ std::string footer_encoding; ++ footer.EncodeTo(&footer_encoding); ++ r->status = r->file->Append(footer_encoding); ++ if (r->status.ok()) { ++ r->offset += footer_encoding.size(); ++ } ++ } ++ return r->status; ++} ++ ++void TableBuilder::Abandon() { ++ Rep* r = rep_; ++ assert(!r->closed); ++ r->closed = true; ++} ++ ++uint64_t TableBuilder::NumEntries() const { ++ return rep_->num_entries; ++} ++ ++uint64_t TableBuilder::FileSize() const { ++ return rep_->offset; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_test.cc +new file mode 100644 +index 0000000..abf6e24 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_test.cc +@@ -0,0 +1,876 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/table.h" ++ ++#include ++#include ++#include "db/dbformat.h" ++#include "db/memtable.h" ++#include "db/write_batch_internal.h" ++#include "leveldb/db.h" ++#include "leveldb/env.h" ++#include "leveldb/iterator.h" ++#include "leveldb/table_builder.h" ++#include "table/block.h" ++#include "table/block_builder.h" ++#include "table/format.h" ++#include "util/random.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++// Return reverse of "key". ++// Used to test non-lexicographic comparators. ++static std::string Reverse(const Slice& key) { ++ std::string str(key.ToString()); ++ std::string rev(""); ++ for (std::string::reverse_iterator rit = str.rbegin(); ++ rit != str.rend(); ++rit) { ++ rev.push_back(*rit); ++ } ++ return rev; ++} ++ ++namespace { ++class ReverseKeyComparator : public Comparator { ++ public: ++ virtual const char* Name() const { ++ return "leveldb.ReverseBytewiseComparator"; ++ } ++ ++ virtual int Compare(const Slice& a, const Slice& b) const { ++ return BytewiseComparator()->Compare(Reverse(a), Reverse(b)); ++ } ++ ++ virtual void FindShortestSeparator( ++ std::string* start, ++ const Slice& limit) const { ++ std::string s = Reverse(*start); ++ std::string l = Reverse(limit); ++ BytewiseComparator()->FindShortestSeparator(&s, l); ++ *start = Reverse(s); ++ } ++ ++ virtual void FindShortSuccessor(std::string* key) const { ++ std::string s = Reverse(*key); ++ BytewiseComparator()->FindShortSuccessor(&s); ++ *key = Reverse(s); ++ } ++}; ++} // namespace ++static ReverseKeyComparator reverse_key_comparator; ++ ++static void Increment(const Comparator* cmp, std::string* key) { ++ if (cmp == BytewiseComparator()) { ++ key->push_back('\0'); ++ } else { ++ assert(cmp == &reverse_key_comparator); ++ std::string rev = Reverse(*key); ++ rev.push_back('\0'); ++ *key = Reverse(rev); ++ } ++} ++ ++// An STL comparator that uses a Comparator ++namespace { ++struct STLLessThan { ++ const Comparator* cmp; ++ ++ STLLessThan() : cmp(BytewiseComparator()) { } ++ STLLessThan(const Comparator* c) : cmp(c) { } ++ bool operator()(const std::string& a, const std::string& b) const { ++ return cmp->Compare(Slice(a), Slice(b)) < 0; ++ } ++}; ++} // namespace ++ ++class StringSink: public WritableFile { ++ public: ++ ~StringSink() { } ++ ++ const std::string& contents() const { return contents_; } ++ ++ virtual Status Close() { return Status::OK(); } ++ virtual Status Flush() { return Status::OK(); } ++ virtual Status Sync() { return Status::OK(); } ++ ++ virtual Status Append(const Slice& data) { ++ contents_.append(data.data(), data.size()); ++ return Status::OK(); ++ } ++ ++ private: ++ std::string contents_; ++}; ++ ++ ++class StringSource: public RandomAccessFile { ++ public: ++ StringSource(const Slice& contents) ++ : contents_(contents.data(), contents.size()) { ++ } ++ ++ virtual ~StringSource() { } ++ ++ uint64_t Size() const { return contents_.size(); } ++ ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ if (offset > contents_.size()) { ++ return Status::InvalidArgument("invalid Read offset"); ++ } ++ if (offset + n > contents_.size()) { ++ n = contents_.size() - offset; ++ } ++ memcpy(scratch, &contents_[offset], n); ++ *result = Slice(scratch, n); ++ return Status::OK(); ++ } ++ ++ private: ++ std::string contents_; ++}; ++ ++typedef std::map KVMap; ++ ++// Helper class for tests to unify the interface between ++// BlockBuilder/TableBuilder and Block/Table. ++class Constructor { ++ public: ++ explicit Constructor(const Comparator* cmp) : data_(STLLessThan(cmp)) { } ++ virtual ~Constructor() { } ++ ++ void Add(const std::string& key, const Slice& value) { ++ data_[key] = value.ToString(); ++ } ++ ++ // Finish constructing the data structure with all the keys that have ++ // been added so far. Returns the keys in sorted order in "*keys" ++ // and stores the key/value pairs in "*kvmap" ++ void Finish(const Options& options, ++ std::vector* keys, ++ KVMap* kvmap) { ++ *kvmap = data_; ++ keys->clear(); ++ for (KVMap::const_iterator it = data_.begin(); ++ it != data_.end(); ++ ++it) { ++ keys->push_back(it->first); ++ } ++ data_.clear(); ++ Status s = FinishImpl(options, *kvmap); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ } ++ ++ // Construct the data structure from the data in "data" ++ virtual Status FinishImpl(const Options& options, const KVMap& data) = 0; ++ ++ virtual Iterator* NewIterator() const = 0; ++ ++ virtual const KVMap& data() { return data_; } ++ ++ virtual DB* db() const { return NULL; } // Overridden in DBConstructor ++ ++ private: ++ KVMap data_; ++}; ++ ++class BlockConstructor: public Constructor { ++ public: ++ explicit BlockConstructor(const Comparator* cmp) ++ : Constructor(cmp), ++ comparator_(cmp), ++ block_(NULL) { } ++ ~BlockConstructor() { ++ delete block_; ++ } ++ virtual Status FinishImpl(const Options& options, const KVMap& data) { ++ delete block_; ++ block_ = NULL; ++ BlockBuilder builder(&options); ++ ++ for (KVMap::const_iterator it = data.begin(); ++ it != data.end(); ++ ++it) { ++ builder.Add(it->first, it->second); ++ } ++ // Open the block ++ data_ = builder.Finish().ToString(); ++ BlockContents contents; ++ contents.data = data_; ++ contents.cachable = false; ++ contents.heap_allocated = false; ++ block_ = new Block(contents); ++ return Status::OK(); ++ } ++ virtual Iterator* NewIterator() const { ++ return block_->NewIterator(comparator_); ++ } ++ ++ private: ++ const Comparator* comparator_; ++ std::string data_; ++ Block* block_; ++ ++ BlockConstructor(); ++}; ++ ++class TableConstructor: public Constructor { ++ public: ++ TableConstructor(const Comparator* cmp) ++ : Constructor(cmp), ++ source_(NULL), table_(NULL) { ++ } ++ ~TableConstructor() { ++ Reset(); ++ } ++ virtual Status FinishImpl(const Options& options, const KVMap& data) { ++ Reset(); ++ StringSink sink; ++ TableBuilder builder(options, &sink); ++ ++ for (KVMap::const_iterator it = data.begin(); ++ it != data.end(); ++ ++it) { ++ builder.Add(it->first, it->second); ++ ASSERT_TRUE(builder.status().ok()); ++ } ++ Status s = builder.Finish(); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ ++ ASSERT_EQ(sink.contents().size(), builder.FileSize()); ++ ++ // Open the table ++ source_ = new StringSource(sink.contents()); ++ Options table_options; ++ table_options.comparator = options.comparator; ++ return Table::Open(table_options, source_, sink.contents().size(), &table_); ++ } ++ ++ virtual Iterator* NewIterator() const { ++ return table_->NewIterator(ReadOptions()); ++ } ++ ++ uint64_t ApproximateOffsetOf(const Slice& key) const { ++ return table_->ApproximateOffsetOf(key); ++ } ++ ++ private: ++ void Reset() { ++ delete table_; ++ delete source_; ++ table_ = NULL; ++ source_ = NULL; ++ } ++ ++ StringSource* source_; ++ Table* table_; ++ ++ TableConstructor(); ++}; ++ ++// A helper class that converts internal format keys into user keys ++class KeyConvertingIterator: public Iterator { ++ public: ++ explicit KeyConvertingIterator(Iterator* iter) : iter_(iter) { } ++ virtual ~KeyConvertingIterator() { delete iter_; } ++ virtual bool Valid() const { return iter_->Valid(); } ++ virtual void Seek(const Slice& target) { ++ ParsedInternalKey ikey(target, kMaxSequenceNumber, kTypeValue); ++ std::string encoded; ++ AppendInternalKey(&encoded, ikey); ++ iter_->Seek(encoded); ++ } ++ virtual void SeekToFirst() { iter_->SeekToFirst(); } ++ virtual void SeekToLast() { iter_->SeekToLast(); } ++ virtual void Next() { iter_->Next(); } ++ virtual void Prev() { iter_->Prev(); } ++ ++ virtual Slice key() const { ++ assert(Valid()); ++ ParsedInternalKey key; ++ if (!ParseInternalKey(iter_->key(), &key)) { ++ status_ = Status::Corruption("malformed internal key"); ++ return Slice("corrupted key"); ++ } ++ return key.user_key; ++ } ++ ++ virtual Slice value() const { return iter_->value(); } ++ virtual Status status() const { ++ return status_.ok() ? iter_->status() : status_; ++ } ++ ++ private: ++ mutable Status status_; ++ Iterator* iter_; ++ ++ // No copying allowed ++ KeyConvertingIterator(const KeyConvertingIterator&); ++ void operator=(const KeyConvertingIterator&); ++}; ++ ++class MemTableConstructor: public Constructor { ++ public: ++ explicit MemTableConstructor(const Comparator* cmp) ++ : Constructor(cmp), ++ internal_comparator_(cmp) { ++ memtable_ = new MemTable(internal_comparator_); ++ memtable_->Ref(); ++ } ++ ~MemTableConstructor() { ++ memtable_->Unref(); ++ } ++ virtual Status FinishImpl(const Options& options, const KVMap& data) { ++ memtable_->Unref(); ++ memtable_ = new MemTable(internal_comparator_); ++ memtable_->Ref(); ++ int seq = 1; ++ for (KVMap::const_iterator it = data.begin(); ++ it != data.end(); ++ ++it) { ++ memtable_->Add(seq, kTypeValue, it->first, it->second); ++ seq++; ++ } ++ return Status::OK(); ++ } ++ virtual Iterator* NewIterator() const { ++ return new KeyConvertingIterator(memtable_->NewIterator()); ++ } ++ ++ private: ++ InternalKeyComparator internal_comparator_; ++ MemTable* memtable_; ++}; ++ ++class DBConstructor: public Constructor { ++ public: ++ explicit DBConstructor(const Comparator* cmp) ++ : Constructor(cmp), ++ comparator_(cmp) { ++ db_ = NULL; ++ NewDB(); ++ } ++ ~DBConstructor() { ++ delete db_; ++ } ++ virtual Status FinishImpl(const Options& options, const KVMap& data) { ++ delete db_; ++ db_ = NULL; ++ NewDB(); ++ for (KVMap::const_iterator it = data.begin(); ++ it != data.end(); ++ ++it) { ++ WriteBatch batch; ++ batch.Put(it->first, it->second); ++ ASSERT_TRUE(db_->Write(WriteOptions(), &batch).ok()); ++ } ++ return Status::OK(); ++ } ++ virtual Iterator* NewIterator() const { ++ return db_->NewIterator(ReadOptions()); ++ } ++ ++ virtual DB* db() const { return db_; } ++ ++ private: ++ void NewDB() { ++ std::string name = test::TmpDir() + "/table_testdb"; ++ ++ Options options; ++ options.comparator = comparator_; ++ Status status = DestroyDB(name, options); ++ ASSERT_TRUE(status.ok()) << status.ToString(); ++ ++ options.create_if_missing = true; ++ options.error_if_exists = true; ++ options.write_buffer_size = 10000; // Something small to force merging ++ status = DB::Open(options, name, &db_); ++ ASSERT_TRUE(status.ok()) << status.ToString(); ++ } ++ ++ const Comparator* comparator_; ++ DB* db_; ++}; ++ ++enum TestType { ++ TABLE_TEST, ++ BLOCK_TEST, ++ MEMTABLE_TEST, ++ DB_TEST ++}; ++ ++struct TestArgs { ++ TestType type; ++ bool reverse_compare; ++ int restart_interval; ++}; ++ ++static const TestArgs kTestArgList[] = { ++ { TABLE_TEST, false, 16 }, ++ { TABLE_TEST, false, 1 }, ++ { TABLE_TEST, false, 1024 }, ++ { TABLE_TEST, true, 16 }, ++ { TABLE_TEST, true, 1 }, ++ { TABLE_TEST, true, 1024 }, ++ ++ { BLOCK_TEST, false, 16 }, ++ { BLOCK_TEST, false, 1 }, ++ { BLOCK_TEST, false, 1024 }, ++ { BLOCK_TEST, true, 16 }, ++ { BLOCK_TEST, true, 1 }, ++ { BLOCK_TEST, true, 1024 }, ++ ++ // Restart interval does not matter for memtables ++ { MEMTABLE_TEST, false, 16 }, ++ { MEMTABLE_TEST, true, 16 }, ++ ++ // Do not bother with restart interval variations for DB ++ { DB_TEST, false, 16 }, ++ { DB_TEST, true, 16 }, ++}; ++static const int kNumTestArgs = sizeof(kTestArgList) / sizeof(kTestArgList[0]); ++ ++class Harness { ++ public: ++ Harness() : constructor_(NULL) { } ++ ++ void Init(const TestArgs& args) { ++ delete constructor_; ++ constructor_ = NULL; ++ options_ = Options(); ++ ++ options_.block_restart_interval = args.restart_interval; ++ // Use shorter block size for tests to exercise block boundary ++ // conditions more. ++ options_.block_size = 256; ++ if (args.reverse_compare) { ++ options_.comparator = &reverse_key_comparator; ++ } ++ switch (args.type) { ++ case TABLE_TEST: ++ constructor_ = new TableConstructor(options_.comparator); ++ break; ++ case BLOCK_TEST: ++ constructor_ = new BlockConstructor(options_.comparator); ++ break; ++ case MEMTABLE_TEST: ++ constructor_ = new MemTableConstructor(options_.comparator); ++ break; ++ case DB_TEST: ++ constructor_ = new DBConstructor(options_.comparator); ++ break; ++ } ++ } ++ ++ ~Harness() { ++ delete constructor_; ++ } ++ ++ void Add(const std::string& key, const std::string& value) { ++ constructor_->Add(key, value); ++ } ++ ++ void Test(Random* rnd) { ++ std::vector keys; ++ KVMap data; ++ constructor_->Finish(options_, &keys, &data); ++ ++ TestForwardScan(keys, data); ++ TestBackwardScan(keys, data); ++ TestRandomAccess(rnd, keys, data); ++ } ++ ++ void TestForwardScan(const std::vector& keys, ++ const KVMap& data) { ++ Iterator* iter = constructor_->NewIterator(); ++ ASSERT_TRUE(!iter->Valid()); ++ iter->SeekToFirst(); ++ for (KVMap::const_iterator model_iter = data.begin(); ++ model_iter != data.end(); ++ ++model_iter) { ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ iter->Next(); ++ } ++ ASSERT_TRUE(!iter->Valid()); ++ delete iter; ++ } ++ ++ void TestBackwardScan(const std::vector& keys, ++ const KVMap& data) { ++ Iterator* iter = constructor_->NewIterator(); ++ ASSERT_TRUE(!iter->Valid()); ++ iter->SeekToLast(); ++ for (KVMap::const_reverse_iterator model_iter = data.rbegin(); ++ model_iter != data.rend(); ++ ++model_iter) { ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ iter->Prev(); ++ } ++ ASSERT_TRUE(!iter->Valid()); ++ delete iter; ++ } ++ ++ void TestRandomAccess(Random* rnd, ++ const std::vector& keys, ++ const KVMap& data) { ++ static const bool kVerbose = false; ++ Iterator* iter = constructor_->NewIterator(); ++ ASSERT_TRUE(!iter->Valid()); ++ KVMap::const_iterator model_iter = data.begin(); ++ if (kVerbose) fprintf(stderr, "---\n"); ++ for (int i = 0; i < 200; i++) { ++ const int toss = rnd->Uniform(5); ++ switch (toss) { ++ case 0: { ++ if (iter->Valid()) { ++ if (kVerbose) fprintf(stderr, "Next\n"); ++ iter->Next(); ++ ++model_iter; ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ } ++ break; ++ } ++ ++ case 1: { ++ if (kVerbose) fprintf(stderr, "SeekToFirst\n"); ++ iter->SeekToFirst(); ++ model_iter = data.begin(); ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ break; ++ } ++ ++ case 2: { ++ std::string key = PickRandomKey(rnd, keys); ++ model_iter = data.lower_bound(key); ++ if (kVerbose) fprintf(stderr, "Seek '%s'\n", ++ EscapeString(key).c_str()); ++ iter->Seek(Slice(key)); ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ break; ++ } ++ ++ case 3: { ++ if (iter->Valid()) { ++ if (kVerbose) fprintf(stderr, "Prev\n"); ++ iter->Prev(); ++ if (model_iter == data.begin()) { ++ model_iter = data.end(); // Wrap around to invalid value ++ } else { ++ --model_iter; ++ } ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ } ++ break; ++ } ++ ++ case 4: { ++ if (kVerbose) fprintf(stderr, "SeekToLast\n"); ++ iter->SeekToLast(); ++ if (keys.empty()) { ++ model_iter = data.end(); ++ } else { ++ std::string last = data.rbegin()->first; ++ model_iter = data.lower_bound(last); ++ } ++ ASSERT_EQ(ToString(data, model_iter), ToString(iter)); ++ break; ++ } ++ } ++ } ++ delete iter; ++ } ++ ++ std::string ToString(const KVMap& data, const KVMap::const_iterator& it) { ++ if (it == data.end()) { ++ return "END"; ++ } else { ++ return "'" + it->first + "->" + it->second + "'"; ++ } ++ } ++ ++ std::string ToString(const KVMap& data, ++ const KVMap::const_reverse_iterator& it) { ++ if (it == data.rend()) { ++ return "END"; ++ } else { ++ return "'" + it->first + "->" + it->second + "'"; ++ } ++ } ++ ++ std::string ToString(const Iterator* it) { ++ if (!it->Valid()) { ++ return "END"; ++ } else { ++ return "'" + it->key().ToString() + "->" + it->value().ToString() + "'"; ++ } ++ } ++ ++ std::string PickRandomKey(Random* rnd, const std::vector& keys) { ++ if (keys.empty()) { ++ return "foo"; ++ } else { ++ const int index = rnd->Uniform(keys.size()); ++ std::string result = keys[index]; ++ switch (rnd->Uniform(3)) { ++ case 0: ++ // Return an existing key ++ break; ++ case 1: { ++ // Attempt to return something smaller than an existing key ++ if (result.size() > 0 && result[result.size()-1] > '\0') { ++ result[result.size()-1]--; ++ } ++ break; ++ } ++ case 2: { ++ // Return something larger than an existing key ++ Increment(options_.comparator, &result); ++ break; ++ } ++ } ++ return result; ++ } ++ } ++ ++ // Returns NULL if not running against a DB ++ DB* db() const { return constructor_->db(); } ++ ++ private: ++ Options options_; ++ Constructor* constructor_; ++}; ++ ++// Test empty table/block. ++TEST(Harness, Empty) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 1); ++ Test(&rnd); ++ } ++} ++ ++// Special test for a block with no restart entries. The C++ leveldb ++// code never generates such blocks, but the Java version of leveldb ++// seems to. ++TEST(Harness, ZeroRestartPointsInBlock) { ++ char data[sizeof(uint32_t)]; ++ memset(data, 0, sizeof(data)); ++ BlockContents contents; ++ contents.data = Slice(data, sizeof(data)); ++ contents.cachable = false; ++ contents.heap_allocated = false; ++ Block block(contents); ++ Iterator* iter = block.NewIterator(BytewiseComparator()); ++ iter->SeekToFirst(); ++ ASSERT_TRUE(!iter->Valid()); ++ iter->SeekToLast(); ++ ASSERT_TRUE(!iter->Valid()); ++ iter->Seek("foo"); ++ ASSERT_TRUE(!iter->Valid()); ++ delete iter; ++} ++ ++// Test the empty key ++TEST(Harness, SimpleEmptyKey) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 1); ++ Add("", "v"); ++ Test(&rnd); ++ } ++} ++ ++TEST(Harness, SimpleSingle) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 2); ++ Add("abc", "v"); ++ Test(&rnd); ++ } ++} ++ ++TEST(Harness, SimpleMulti) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 3); ++ Add("abc", "v"); ++ Add("abcd", "v"); ++ Add("ac", "v2"); ++ Test(&rnd); ++ } ++} ++ ++TEST(Harness, SimpleSpecialKey) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 4); ++ Add("\xff\xff", "v3"); ++ Test(&rnd); ++ } ++} ++ ++TEST(Harness, Randomized) { ++ for (int i = 0; i < kNumTestArgs; i++) { ++ Init(kTestArgList[i]); ++ Random rnd(test::RandomSeed() + 5); ++ for (int num_entries = 0; num_entries < 2000; ++ num_entries += (num_entries < 50 ? 1 : 200)) { ++ if ((num_entries % 10) == 0) { ++ fprintf(stderr, "case %d of %d: num_entries = %d\n", ++ (i + 1), int(kNumTestArgs), num_entries); ++ } ++ for (int e = 0; e < num_entries; e++) { ++ std::string v; ++ Add(test::RandomKey(&rnd, rnd.Skewed(4)), ++ test::RandomString(&rnd, rnd.Skewed(5), &v).ToString()); ++ } ++ Test(&rnd); ++ } ++ } ++} ++ ++TEST(Harness, RandomizedLongDB) { ++ Random rnd(test::RandomSeed()); ++ TestArgs args = { DB_TEST, false, 16 }; ++ Init(args); ++ int num_entries = 100000; ++ for (int e = 0; e < num_entries; e++) { ++ std::string v; ++ Add(test::RandomKey(&rnd, rnd.Skewed(4)), ++ test::RandomString(&rnd, rnd.Skewed(5), &v).ToString()); ++ } ++ Test(&rnd); ++ ++ // We must have created enough data to force merging ++ int files = 0; ++ for (int level = 0; level < config::kNumLevels; level++) { ++ std::string value; ++ char name[100]; ++ snprintf(name, sizeof(name), "leveldb.num-files-at-level%d", level); ++ ASSERT_TRUE(db()->GetProperty(name, &value)); ++ files += atoi(value.c_str()); ++ } ++ ASSERT_GT(files, 0); ++} ++ ++class MemTableTest { }; ++ ++TEST(MemTableTest, Simple) { ++ InternalKeyComparator cmp(BytewiseComparator()); ++ MemTable* memtable = new MemTable(cmp); ++ memtable->Ref(); ++ WriteBatch batch; ++ WriteBatchInternal::SetSequence(&batch, 100); ++ batch.Put(std::string("k1"), std::string("v1")); ++ batch.Put(std::string("k2"), std::string("v2")); ++ batch.Put(std::string("k3"), std::string("v3")); ++ batch.Put(std::string("largekey"), std::string("vlarge")); ++ ASSERT_TRUE(WriteBatchInternal::InsertInto(&batch, memtable).ok()); ++ ++ Iterator* iter = memtable->NewIterator(); ++ iter->SeekToFirst(); ++ while (iter->Valid()) { ++ fprintf(stderr, "key: '%s' -> '%s'\n", ++ iter->key().ToString().c_str(), ++ iter->value().ToString().c_str()); ++ iter->Next(); ++ } ++ ++ delete iter; ++ memtable->Unref(); ++} ++ ++static bool Between(uint64_t val, uint64_t low, uint64_t high) { ++ bool result = (val >= low) && (val <= high); ++ if (!result) { ++ fprintf(stderr, "Value %llu is not in range [%llu, %llu]\n", ++ (unsigned long long)(val), ++ (unsigned long long)(low), ++ (unsigned long long)(high)); ++ } ++ return result; ++} ++ ++class TableTest { }; ++ ++TEST(TableTest, ApproximateOffsetOfPlain) { ++ TableConstructor c(BytewiseComparator()); ++ c.Add("k01", "hello"); ++ c.Add("k02", "hello2"); ++ c.Add("k03", std::string(10000, 'x')); ++ c.Add("k04", std::string(200000, 'x')); ++ c.Add("k05", std::string(300000, 'x')); ++ c.Add("k06", "hello3"); ++ c.Add("k07", std::string(100000, 'x')); ++ std::vector keys; ++ KVMap kvmap; ++ Options options; ++ options.block_size = 1024; ++ options.compression = kNoCompression; ++ c.Finish(options, &keys, &kvmap); ++ ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("abc"), 0, 0)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01"), 0, 0)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01a"), 0, 0)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k02"), 0, 0)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), 0, 0)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), 10000, 11000)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04a"), 210000, 211000)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k05"), 210000, 211000)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k06"), 510000, 511000)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k07"), 510000, 511000)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 610000, 612000)); ++ ++} ++ ++static bool SnappyCompressionSupported() { ++ std::string out; ++ Slice in = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; ++ return port::Snappy_Compress(in.data(), in.size(), &out); ++} ++ ++TEST(TableTest, ApproximateOffsetOfCompressed) { ++ if (!SnappyCompressionSupported()) { ++ fprintf(stderr, "skipping compression tests\n"); ++ return; ++ } ++ ++ Random rnd(301); ++ TableConstructor c(BytewiseComparator()); ++ std::string tmp; ++ c.Add("k01", "hello"); ++ c.Add("k02", test::CompressibleString(&rnd, 0.25, 10000, &tmp)); ++ c.Add("k03", "hello3"); ++ c.Add("k04", test::CompressibleString(&rnd, 0.25, 10000, &tmp)); ++ std::vector keys; ++ KVMap kvmap; ++ Options options; ++ options.block_size = 1024; ++ options.compression = kSnappyCompression; ++ c.Finish(options, &keys, &kvmap); ++ ++ // Expected upper and lower bounds of space used by compressible strings. ++ static const int kSlop = 1000; // Compressor effectiveness varies. ++ const int expected = 2500; // 10000 * compression ratio (0.25) ++ const int min_z = expected - kSlop; ++ const int max_z = expected + kSlop; ++ ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("abc"), 0, kSlop)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01"), 0, kSlop)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k02"), 0, kSlop)); ++ // Have now emitted a large compressible string, so adjust expected offset. ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), min_z, max_z)); ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), min_z, max_z)); ++ // Have now emitted two large compressible strings, so adjust expected offset. ++ ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 2 * min_z, 2 * max_z)); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.cc +new file mode 100644 +index 0000000..7822eba +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.cc +@@ -0,0 +1,182 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "table/two_level_iterator.h" ++ ++#include "leveldb/table.h" ++#include "table/block.h" ++#include "table/format.h" ++#include "table/iterator_wrapper.h" ++ ++namespace leveldb { ++ ++namespace { ++ ++typedef Iterator* (*BlockFunction)(void*, const ReadOptions&, const Slice&); ++ ++class TwoLevelIterator: public Iterator { ++ public: ++ TwoLevelIterator( ++ Iterator* index_iter, ++ BlockFunction block_function, ++ void* arg, ++ const ReadOptions& options); ++ ++ virtual ~TwoLevelIterator(); ++ ++ virtual void Seek(const Slice& target); ++ virtual void SeekToFirst(); ++ virtual void SeekToLast(); ++ virtual void Next(); ++ virtual void Prev(); ++ ++ virtual bool Valid() const { ++ return data_iter_.Valid(); ++ } ++ virtual Slice key() const { ++ assert(Valid()); ++ return data_iter_.key(); ++ } ++ virtual Slice value() const { ++ assert(Valid()); ++ return data_iter_.value(); ++ } ++ virtual Status status() const { ++ // It'd be nice if status() returned a const Status& instead of a Status ++ if (!index_iter_.status().ok()) { ++ return index_iter_.status(); ++ } else if (data_iter_.iter() != NULL && !data_iter_.status().ok()) { ++ return data_iter_.status(); ++ } else { ++ return status_; ++ } ++ } ++ ++ private: ++ void SaveError(const Status& s) { ++ if (status_.ok() && !s.ok()) status_ = s; ++ } ++ void SkipEmptyDataBlocksForward(); ++ void SkipEmptyDataBlocksBackward(); ++ void SetDataIterator(Iterator* data_iter); ++ void InitDataBlock(); ++ ++ BlockFunction block_function_; ++ void* arg_; ++ const ReadOptions options_; ++ Status status_; ++ IteratorWrapper index_iter_; ++ IteratorWrapper data_iter_; // May be NULL ++ // If data_iter_ is non-NULL, then "data_block_handle_" holds the ++ // "index_value" passed to block_function_ to create the data_iter_. ++ std::string data_block_handle_; ++}; ++ ++TwoLevelIterator::TwoLevelIterator( ++ Iterator* index_iter, ++ BlockFunction block_function, ++ void* arg, ++ const ReadOptions& options) ++ : block_function_(block_function), ++ arg_(arg), ++ options_(options), ++ index_iter_(index_iter), ++ data_iter_(NULL) { ++} ++ ++TwoLevelIterator::~TwoLevelIterator() { ++} ++ ++void TwoLevelIterator::Seek(const Slice& target) { ++ index_iter_.Seek(target); ++ InitDataBlock(); ++ if (data_iter_.iter() != NULL) data_iter_.Seek(target); ++ SkipEmptyDataBlocksForward(); ++} ++ ++void TwoLevelIterator::SeekToFirst() { ++ index_iter_.SeekToFirst(); ++ InitDataBlock(); ++ if (data_iter_.iter() != NULL) data_iter_.SeekToFirst(); ++ SkipEmptyDataBlocksForward(); ++} ++ ++void TwoLevelIterator::SeekToLast() { ++ index_iter_.SeekToLast(); ++ InitDataBlock(); ++ if (data_iter_.iter() != NULL) data_iter_.SeekToLast(); ++ SkipEmptyDataBlocksBackward(); ++} ++ ++void TwoLevelIterator::Next() { ++ assert(Valid()); ++ data_iter_.Next(); ++ SkipEmptyDataBlocksForward(); ++} ++ ++void TwoLevelIterator::Prev() { ++ assert(Valid()); ++ data_iter_.Prev(); ++ SkipEmptyDataBlocksBackward(); ++} ++ ++ ++void TwoLevelIterator::SkipEmptyDataBlocksForward() { ++ while (data_iter_.iter() == NULL || !data_iter_.Valid()) { ++ // Move to next block ++ if (!index_iter_.Valid()) { ++ SetDataIterator(NULL); ++ return; ++ } ++ index_iter_.Next(); ++ InitDataBlock(); ++ if (data_iter_.iter() != NULL) data_iter_.SeekToFirst(); ++ } ++} ++ ++void TwoLevelIterator::SkipEmptyDataBlocksBackward() { ++ while (data_iter_.iter() == NULL || !data_iter_.Valid()) { ++ // Move to next block ++ if (!index_iter_.Valid()) { ++ SetDataIterator(NULL); ++ return; ++ } ++ index_iter_.Prev(); ++ InitDataBlock(); ++ if (data_iter_.iter() != NULL) data_iter_.SeekToLast(); ++ } ++} ++ ++void TwoLevelIterator::SetDataIterator(Iterator* data_iter) { ++ if (data_iter_.iter() != NULL) SaveError(data_iter_.status()); ++ data_iter_.Set(data_iter); ++} ++ ++void TwoLevelIterator::InitDataBlock() { ++ if (!index_iter_.Valid()) { ++ SetDataIterator(NULL); ++ } else { ++ Slice handle = index_iter_.value(); ++ if (data_iter_.iter() != NULL && handle.compare(data_block_handle_) == 0) { ++ // data_iter_ is already constructed with this iterator, so ++ // no need to change anything ++ } else { ++ Iterator* iter = (*block_function_)(arg_, options_, handle); ++ data_block_handle_.assign(handle.data(), handle.size()); ++ SetDataIterator(iter); ++ } ++ } ++} ++ ++} // namespace ++ ++Iterator* NewTwoLevelIterator( ++ Iterator* index_iter, ++ BlockFunction block_function, ++ void* arg, ++ const ReadOptions& options) { ++ return new TwoLevelIterator(index_iter, block_function, arg, options); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.h +new file mode 100644 +index 0000000..629ca34 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.h +@@ -0,0 +1,34 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_TABLE_TWO_LEVEL_ITERATOR_H_ ++#define STORAGE_LEVELDB_TABLE_TWO_LEVEL_ITERATOR_H_ ++ ++#include "leveldb/iterator.h" ++ ++namespace leveldb { ++ ++struct ReadOptions; ++ ++// Return a new two level iterator. A two-level iterator contains an ++// index iterator whose values point to a sequence of blocks where ++// each block is itself a sequence of key,value pairs. The returned ++// two-level iterator yields the concatenation of all key/value pairs ++// in the sequence of blocks. Takes ownership of "index_iter" and ++// will delete it when no longer needed. ++// ++// Uses a supplied function to convert an index_iter value into ++// an iterator over the contents of the corresponding block. ++extern Iterator* NewTwoLevelIterator( ++ Iterator* index_iter, ++ Iterator* (*block_function)( ++ void* arg, ++ const ReadOptions& options, ++ const Slice& index_value), ++ void* arg, ++ const ReadOptions& options); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_TABLE_TWO_LEVEL_ITERATOR_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.cc +new file mode 100644 +index 0000000..7407821 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.cc +@@ -0,0 +1,68 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/arena.h" ++#include ++ ++namespace leveldb { ++ ++static const int kBlockSize = 4096; ++ ++Arena::Arena() : memory_usage_(0) { ++ alloc_ptr_ = NULL; // First allocation will allocate a block ++ alloc_bytes_remaining_ = 0; ++} ++ ++Arena::~Arena() { ++ for (size_t i = 0; i < blocks_.size(); i++) { ++ delete[] blocks_[i]; ++ } ++} ++ ++char* Arena::AllocateFallback(size_t bytes) { ++ if (bytes > kBlockSize / 4) { ++ // Object is more than a quarter of our block size. Allocate it separately ++ // to avoid wasting too much space in leftover bytes. ++ char* result = AllocateNewBlock(bytes); ++ return result; ++ } ++ ++ // We waste the remaining space in the current block. ++ alloc_ptr_ = AllocateNewBlock(kBlockSize); ++ alloc_bytes_remaining_ = kBlockSize; ++ ++ char* result = alloc_ptr_; ++ alloc_ptr_ += bytes; ++ alloc_bytes_remaining_ -= bytes; ++ return result; ++} ++ ++char* Arena::AllocateAligned(size_t bytes) { ++ const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8; ++ assert((align & (align-1)) == 0); // Pointer size should be a power of 2 ++ size_t current_mod = reinterpret_cast(alloc_ptr_) & (align-1); ++ size_t slop = (current_mod == 0 ? 0 : align - current_mod); ++ size_t needed = bytes + slop; ++ char* result; ++ if (needed <= alloc_bytes_remaining_) { ++ result = alloc_ptr_ + slop; ++ alloc_ptr_ += needed; ++ alloc_bytes_remaining_ -= needed; ++ } else { ++ // AllocateFallback always returned aligned memory ++ result = AllocateFallback(bytes); ++ } ++ assert((reinterpret_cast(result) & (align-1)) == 0); ++ return result; ++} ++ ++char* Arena::AllocateNewBlock(size_t block_bytes) { ++ char* result = new char[block_bytes]; ++ blocks_.push_back(result); ++ memory_usage_.NoBarrier_Store( ++ reinterpret_cast(MemoryUsage() + block_bytes + sizeof(char*))); ++ return result; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.h +new file mode 100644 +index 0000000..48bab33 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.h +@@ -0,0 +1,68 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_ARENA_H_ ++#define STORAGE_LEVELDB_UTIL_ARENA_H_ ++ ++#include ++#include ++#include ++#include ++#include "port/port.h" ++ ++namespace leveldb { ++ ++class Arena { ++ public: ++ Arena(); ++ ~Arena(); ++ ++ // Return a pointer to a newly allocated memory block of "bytes" bytes. ++ char* Allocate(size_t bytes); ++ ++ // Allocate memory with the normal alignment guarantees provided by malloc ++ char* AllocateAligned(size_t bytes); ++ ++ // Returns an estimate of the total memory usage of data allocated ++ // by the arena. ++ size_t MemoryUsage() const { ++ return reinterpret_cast(memory_usage_.NoBarrier_Load()); ++ } ++ ++ private: ++ char* AllocateFallback(size_t bytes); ++ char* AllocateNewBlock(size_t block_bytes); ++ ++ // Allocation state ++ char* alloc_ptr_; ++ size_t alloc_bytes_remaining_; ++ ++ // Array of new[] allocated memory blocks ++ std::vector blocks_; ++ ++ // Total memory usage of the arena. ++ port::AtomicPointer memory_usage_; ++ ++ // No copying allowed ++ Arena(const Arena&); ++ void operator=(const Arena&); ++}; ++ ++inline char* Arena::Allocate(size_t bytes) { ++ // The semantics of what to return are a bit messy if we allow ++ // 0-byte allocations, so we disallow them here (we don't need ++ // them for our internal use). ++ assert(bytes > 0); ++ if (bytes <= alloc_bytes_remaining_) { ++ char* result = alloc_ptr_; ++ alloc_ptr_ += bytes; ++ alloc_bytes_remaining_ -= bytes; ++ return result; ++ } ++ return AllocateFallback(bytes); ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_ARENA_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena_test.cc +new file mode 100644 +index 0000000..58e870e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena_test.cc +@@ -0,0 +1,68 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/arena.h" ++ ++#include "util/random.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++class ArenaTest { }; ++ ++TEST(ArenaTest, Empty) { ++ Arena arena; ++} ++ ++TEST(ArenaTest, Simple) { ++ std::vector > allocated; ++ Arena arena; ++ const int N = 100000; ++ size_t bytes = 0; ++ Random rnd(301); ++ for (int i = 0; i < N; i++) { ++ size_t s; ++ if (i % (N / 10) == 0) { ++ s = i; ++ } else { ++ s = rnd.OneIn(4000) ? rnd.Uniform(6000) : ++ (rnd.OneIn(10) ? rnd.Uniform(100) : rnd.Uniform(20)); ++ } ++ if (s == 0) { ++ // Our arena disallows size 0 allocations. ++ s = 1; ++ } ++ char* r; ++ if (rnd.OneIn(10)) { ++ r = arena.AllocateAligned(s); ++ } else { ++ r = arena.Allocate(s); ++ } ++ ++ for (size_t b = 0; b < s; b++) { ++ // Fill the "i"th allocation with a known bit pattern ++ r[b] = i % 256; ++ } ++ bytes += s; ++ allocated.push_back(std::make_pair(s, r)); ++ ASSERT_GE(arena.MemoryUsage(), bytes); ++ if (i > N/10) { ++ ASSERT_LE(arena.MemoryUsage(), bytes * 1.10); ++ } ++ } ++ for (size_t i = 0; i < allocated.size(); i++) { ++ size_t num_bytes = allocated[i].first; ++ const char* p = allocated[i].second; ++ for (size_t b = 0; b < num_bytes; b++) { ++ // Check the "i"th allocation for the known bit pattern ++ ASSERT_EQ(int(p[b]) & 0xff, i % 256); ++ } ++ } ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom.cc +new file mode 100644 +index 0000000..bf3e4ca +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom.cc +@@ -0,0 +1,95 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/filter_policy.h" ++ ++#include "leveldb/slice.h" ++#include "util/hash.h" ++ ++namespace leveldb { ++ ++namespace { ++static uint32_t BloomHash(const Slice& key) { ++ return Hash(key.data(), key.size(), 0xbc9f1d34); ++} ++ ++class BloomFilterPolicy : public FilterPolicy { ++ private: ++ size_t bits_per_key_; ++ size_t k_; ++ ++ public: ++ explicit BloomFilterPolicy(int bits_per_key) ++ : bits_per_key_(bits_per_key) { ++ // We intentionally round down to reduce probing cost a little bit ++ k_ = static_cast(bits_per_key * 0.69); // 0.69 =~ ln(2) ++ if (k_ < 1) k_ = 1; ++ if (k_ > 30) k_ = 30; ++ } ++ ++ virtual const char* Name() const { ++ return "leveldb.BuiltinBloomFilter2"; ++ } ++ ++ virtual void CreateFilter(const Slice* keys, int n, std::string* dst) const { ++ // Compute bloom filter size (in both bits and bytes) ++ size_t bits = n * bits_per_key_; ++ ++ // For small n, we can see a very high false positive rate. Fix it ++ // by enforcing a minimum bloom filter length. ++ if (bits < 64) bits = 64; ++ ++ size_t bytes = (bits + 7) / 8; ++ bits = bytes * 8; ++ ++ const size_t init_size = dst->size(); ++ dst->resize(init_size + bytes, 0); ++ dst->push_back(static_cast(k_)); // Remember # of probes in filter ++ char* array = &(*dst)[init_size]; ++ for (int i = 0; i < n; i++) { ++ // Use double-hashing to generate a sequence of hash values. ++ // See analysis in [Kirsch,Mitzenmacher 2006]. ++ uint32_t h = BloomHash(keys[i]); ++ const uint32_t delta = (h >> 17) | (h << 15); // Rotate right 17 bits ++ for (size_t j = 0; j < k_; j++) { ++ const uint32_t bitpos = h % bits; ++ array[bitpos/8] |= (1 << (bitpos % 8)); ++ h += delta; ++ } ++ } ++ } ++ ++ virtual bool KeyMayMatch(const Slice& key, const Slice& bloom_filter) const { ++ const size_t len = bloom_filter.size(); ++ if (len < 2) return false; ++ ++ const char* array = bloom_filter.data(); ++ const size_t bits = (len - 1) * 8; ++ ++ // Use the encoded k so that we can read filters generated by ++ // bloom filters created using different parameters. ++ const size_t k = array[len-1]; ++ if (k > 30) { ++ // Reserved for potentially new encodings for short bloom filters. ++ // Consider it a match. ++ return true; ++ } ++ ++ uint32_t h = BloomHash(key); ++ const uint32_t delta = (h >> 17) | (h << 15); // Rotate right 17 bits ++ for (size_t j = 0; j < k; j++) { ++ const uint32_t bitpos = h % bits; ++ if ((array[bitpos/8] & (1 << (bitpos % 8))) == 0) return false; ++ h += delta; ++ } ++ return true; ++ } ++}; ++} ++ ++const FilterPolicy* NewBloomFilterPolicy(int bits_per_key) { ++ return new BloomFilterPolicy(bits_per_key); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom_test.cc +new file mode 100644 +index 0000000..1b87a2b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom_test.cc +@@ -0,0 +1,162 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/filter_policy.h" ++ ++#include "util/coding.h" ++#include "util/logging.h" ++#include "util/testharness.h" ++#include "util/testutil.h" ++ ++namespace leveldb { ++ ++static const int kVerbose = 1; ++ ++static Slice Key(int i, char* buffer) { ++ EncodeFixed32(buffer, i); ++ return Slice(buffer, sizeof(uint32_t)); ++} ++ ++class BloomTest { ++ private: ++ const FilterPolicy* policy_; ++ std::string filter_; ++ std::vector keys_; ++ ++ public: ++ BloomTest() : policy_(NewBloomFilterPolicy(10)) { } ++ ++ ~BloomTest() { ++ delete policy_; ++ } ++ ++ void Reset() { ++ keys_.clear(); ++ filter_.clear(); ++ } ++ ++ void Add(const Slice& s) { ++ keys_.push_back(s.ToString()); ++ } ++ ++ void Build() { ++ std::vector key_slices; ++ for (size_t i = 0; i < keys_.size(); i++) { ++ key_slices.push_back(Slice(keys_[i])); ++ } ++ filter_.clear(); ++ policy_->CreateFilter(&key_slices[0], static_cast(key_slices.size()), ++ &filter_); ++ keys_.clear(); ++ if (kVerbose >= 2) DumpFilter(); ++ } ++ ++ size_t FilterSize() const { ++ return filter_.size(); ++ } ++ ++ void DumpFilter() { ++ fprintf(stderr, "F("); ++ for (size_t i = 0; i+1 < filter_.size(); i++) { ++ const unsigned int c = static_cast(filter_[i]); ++ for (int j = 0; j < 8; j++) { ++ fprintf(stderr, "%c", (c & (1 <KeyMayMatch(s, filter_); ++ } ++ ++ double FalsePositiveRate() { ++ char buffer[sizeof(int)]; ++ int result = 0; ++ for (int i = 0; i < 10000; i++) { ++ if (Matches(Key(i + 1000000000, buffer))) { ++ result++; ++ } ++ } ++ return result / 10000.0; ++ } ++}; ++ ++TEST(BloomTest, EmptyFilter) { ++ ASSERT_TRUE(! Matches("hello")); ++ ASSERT_TRUE(! Matches("world")); ++} ++ ++TEST(BloomTest, Small) { ++ Add("hello"); ++ Add("world"); ++ ASSERT_TRUE(Matches("hello")); ++ ASSERT_TRUE(Matches("world")); ++ ASSERT_TRUE(! Matches("x")); ++ ASSERT_TRUE(! Matches("foo")); ++} ++ ++static int NextLength(int length) { ++ if (length < 10) { ++ length += 1; ++ } else if (length < 100) { ++ length += 10; ++ } else if (length < 1000) { ++ length += 100; ++ } else { ++ length += 1000; ++ } ++ return length; ++} ++ ++TEST(BloomTest, VaryingLengths) { ++ char buffer[sizeof(int)]; ++ ++ // Count number of filters that significantly exceed the false positive rate ++ int mediocre_filters = 0; ++ int good_filters = 0; ++ ++ for (int length = 1; length <= 10000; length = NextLength(length)) { ++ Reset(); ++ for (int i = 0; i < length; i++) { ++ Add(Key(i, buffer)); ++ } ++ Build(); ++ ++ ASSERT_LE(FilterSize(), static_cast((length * 10 / 8) + 40)) ++ << length; ++ ++ // All added keys must match ++ for (int i = 0; i < length; i++) { ++ ASSERT_TRUE(Matches(Key(i, buffer))) ++ << "Length " << length << "; key " << i; ++ } ++ ++ // Check false positive rate ++ double rate = FalsePositiveRate(); ++ if (kVerbose >= 1) { ++ fprintf(stderr, "False positives: %5.2f%% @ length = %6d ; bytes = %6d\n", ++ rate*100.0, length, static_cast(FilterSize())); ++ } ++ ASSERT_LE(rate, 0.02); // Must not be over 2% ++ if (rate > 0.0125) mediocre_filters++; // Allowed, but not too often ++ else good_filters++; ++ } ++ if (kVerbose >= 1) { ++ fprintf(stderr, "Filters: %d good, %d mediocre\n", ++ good_filters, mediocre_filters); ++ } ++ ASSERT_LE(mediocre_filters, good_filters/5); ++} ++ ++// Different bits-per-byte ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache.cc +new file mode 100644 +index 0000000..ce46886 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache.cc +@@ -0,0 +1,405 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include ++ ++#include "leveldb/cache.h" ++#include "port/port.h" ++#include "util/hash.h" ++#include "util/mutexlock.h" ++ ++namespace leveldb { ++ ++Cache::~Cache() { ++} ++ ++namespace { ++ ++// LRU cache implementation ++// ++// Cache entries have an "in_cache" boolean indicating whether the cache has a ++// reference on the entry. The only ways that this can become false without the ++// entry being passed to its "deleter" are via Erase(), via Insert() when ++// an element with a duplicate key is inserted, or on destruction of the cache. ++// ++// The cache keeps two linked lists of items in the cache. All items in the ++// cache are in one list or the other, and never both. Items still referenced ++// by clients but erased from the cache are in neither list. The lists are: ++// - in-use: contains the items currently referenced by clients, in no ++// particular order. (This list is used for invariant checking. If we ++// removed the check, elements that would otherwise be on this list could be ++// left as disconnected singleton lists.) ++// - LRU: contains the items not currently referenced by clients, in LRU order ++// Elements are moved between these lists by the Ref() and Unref() methods, ++// when they detect an element in the cache acquiring or losing its only ++// external reference. ++ ++// An entry is a variable length heap-allocated structure. Entries ++// are kept in a circular doubly linked list ordered by access time. ++struct LRUHandle { ++ void* value; ++ void (*deleter)(const Slice&, void* value); ++ LRUHandle* next_hash; ++ LRUHandle* next; ++ LRUHandle* prev; ++ size_t charge; // TODO(opt): Only allow uint32_t? ++ size_t key_length; ++ bool in_cache; // Whether entry is in the cache. ++ uint32_t refs; // References, including cache reference, if present. ++ uint32_t hash; // Hash of key(); used for fast sharding and comparisons ++ char key_data[1]; // Beginning of key ++ ++ Slice key() const { ++ // For cheaper lookups, we allow a temporary Handle object ++ // to store a pointer to a key in "value". ++ if (next == this) { ++ return *(reinterpret_cast(value)); ++ } else { ++ return Slice(key_data, key_length); ++ } ++ } ++}; ++ ++// We provide our own simple hash table since it removes a whole bunch ++// of porting hacks and is also faster than some of the built-in hash ++// table implementations in some of the compiler/runtime combinations ++// we have tested. E.g., readrandom speeds up by ~5% over the g++ ++// 4.4.3's builtin hashtable. ++class HandleTable { ++ public: ++ HandleTable() : length_(0), elems_(0), list_(NULL) { Resize(); } ++ ~HandleTable() { delete[] list_; } ++ ++ LRUHandle* Lookup(const Slice& key, uint32_t hash) { ++ return *FindPointer(key, hash); ++ } ++ ++ LRUHandle* Insert(LRUHandle* h) { ++ LRUHandle** ptr = FindPointer(h->key(), h->hash); ++ LRUHandle* old = *ptr; ++ h->next_hash = (old == NULL ? NULL : old->next_hash); ++ *ptr = h; ++ if (old == NULL) { ++ ++elems_; ++ if (elems_ > length_) { ++ // Since each cache entry is fairly large, we aim for a small ++ // average linked list length (<= 1). ++ Resize(); ++ } ++ } ++ return old; ++ } ++ ++ LRUHandle* Remove(const Slice& key, uint32_t hash) { ++ LRUHandle** ptr = FindPointer(key, hash); ++ LRUHandle* result = *ptr; ++ if (result != NULL) { ++ *ptr = result->next_hash; ++ --elems_; ++ } ++ return result; ++ } ++ ++ private: ++ // The table consists of an array of buckets where each bucket is ++ // a linked list of cache entries that hash into the bucket. ++ uint32_t length_; ++ uint32_t elems_; ++ LRUHandle** list_; ++ ++ // Return a pointer to slot that points to a cache entry that ++ // matches key/hash. If there is no such cache entry, return a ++ // pointer to the trailing slot in the corresponding linked list. ++ LRUHandle** FindPointer(const Slice& key, uint32_t hash) { ++ LRUHandle** ptr = &list_[hash & (length_ - 1)]; ++ while (*ptr != NULL && ++ ((*ptr)->hash != hash || key != (*ptr)->key())) { ++ ptr = &(*ptr)->next_hash; ++ } ++ return ptr; ++ } ++ ++ void Resize() { ++ uint32_t new_length = 4; ++ while (new_length < elems_) { ++ new_length *= 2; ++ } ++ LRUHandle** new_list = new LRUHandle*[new_length]; ++ memset(new_list, 0, sizeof(new_list[0]) * new_length); ++ uint32_t count = 0; ++ for (uint32_t i = 0; i < length_; i++) { ++ LRUHandle* h = list_[i]; ++ while (h != NULL) { ++ LRUHandle* next = h->next_hash; ++ uint32_t hash = h->hash; ++ LRUHandle** ptr = &new_list[hash & (new_length - 1)]; ++ h->next_hash = *ptr; ++ *ptr = h; ++ h = next; ++ count++; ++ } ++ } ++ assert(elems_ == count); ++ delete[] list_; ++ list_ = new_list; ++ length_ = new_length; ++ } ++}; ++ ++// A single shard of sharded cache. ++class LRUCache { ++ public: ++ LRUCache(); ++ ~LRUCache(); ++ ++ // Separate from constructor so caller can easily make an array of LRUCache ++ void SetCapacity(size_t capacity) { capacity_ = capacity; } ++ ++ // Like Cache methods, but with an extra "hash" parameter. ++ Cache::Handle* Insert(const Slice& key, uint32_t hash, ++ void* value, size_t charge, ++ void (*deleter)(const Slice& key, void* value)); ++ Cache::Handle* Lookup(const Slice& key, uint32_t hash); ++ void Release(Cache::Handle* handle); ++ void Erase(const Slice& key, uint32_t hash); ++ void Prune(); ++ size_t TotalCharge() const { ++ MutexLock l(&mutex_); ++ return usage_; ++ } ++ ++ private: ++ void LRU_Remove(LRUHandle* e); ++ void LRU_Append(LRUHandle*list, LRUHandle* e); ++ void Ref(LRUHandle* e); ++ void Unref(LRUHandle* e); ++ bool FinishErase(LRUHandle* e); ++ ++ // Initialized before use. ++ size_t capacity_; ++ ++ // mutex_ protects the following state. ++ mutable port::Mutex mutex_; ++ size_t usage_; ++ ++ // Dummy head of LRU list. ++ // lru.prev is newest entry, lru.next is oldest entry. ++ // Entries have refs==1 and in_cache==true. ++ LRUHandle lru_; ++ ++ // Dummy head of in-use list. ++ // Entries are in use by clients, and have refs >= 2 and in_cache==true. ++ LRUHandle in_use_; ++ ++ HandleTable table_; ++}; ++ ++LRUCache::LRUCache() ++ : usage_(0) { ++ // Make empty circular linked lists. ++ lru_.next = &lru_; ++ lru_.prev = &lru_; ++ in_use_.next = &in_use_; ++ in_use_.prev = &in_use_; ++} ++ ++LRUCache::~LRUCache() { ++ assert(in_use_.next == &in_use_); // Error if caller has an unreleased handle ++ for (LRUHandle* e = lru_.next; e != &lru_; ) { ++ LRUHandle* next = e->next; ++ assert(e->in_cache); ++ e->in_cache = false; ++ assert(e->refs == 1); // Invariant of lru_ list. ++ Unref(e); ++ e = next; ++ } ++} ++ ++void LRUCache::Ref(LRUHandle* e) { ++ if (e->refs == 1 && e->in_cache) { // If on lru_ list, move to in_use_ list. ++ LRU_Remove(e); ++ LRU_Append(&in_use_, e); ++ } ++ e->refs++; ++} ++ ++void LRUCache::Unref(LRUHandle* e) { ++ assert(e->refs > 0); ++ e->refs--; ++ if (e->refs == 0) { // Deallocate. ++ assert(!e->in_cache); ++ (*e->deleter)(e->key(), e->value); ++ free(e); ++ } else if (e->in_cache && e->refs == 1) { // No longer in use; move to lru_ list. ++ LRU_Remove(e); ++ LRU_Append(&lru_, e); ++ } ++} ++ ++void LRUCache::LRU_Remove(LRUHandle* e) { ++ e->next->prev = e->prev; ++ e->prev->next = e->next; ++} ++ ++void LRUCache::LRU_Append(LRUHandle* list, LRUHandle* e) { ++ // Make "e" newest entry by inserting just before *list ++ e->next = list; ++ e->prev = list->prev; ++ e->prev->next = e; ++ e->next->prev = e; ++} ++ ++Cache::Handle* LRUCache::Lookup(const Slice& key, uint32_t hash) { ++ MutexLock l(&mutex_); ++ LRUHandle* e = table_.Lookup(key, hash); ++ if (e != NULL) { ++ Ref(e); ++ } ++ return reinterpret_cast(e); ++} ++ ++void LRUCache::Release(Cache::Handle* handle) { ++ MutexLock l(&mutex_); ++ Unref(reinterpret_cast(handle)); ++} ++ ++Cache::Handle* LRUCache::Insert( ++ const Slice& key, uint32_t hash, void* value, size_t charge, ++ void (*deleter)(const Slice& key, void* value)) { ++ MutexLock l(&mutex_); ++ ++ LRUHandle* e = reinterpret_cast( ++ malloc(sizeof(LRUHandle)-1 + key.size())); ++ e->value = value; ++ e->deleter = deleter; ++ e->charge = charge; ++ e->key_length = key.size(); ++ e->hash = hash; ++ e->in_cache = false; ++ e->refs = 1; // for the returned handle. ++ memcpy(e->key_data, key.data(), key.size()); ++ ++ if (capacity_ > 0) { ++ e->refs++; // for the cache's reference. ++ e->in_cache = true; ++ LRU_Append(&in_use_, e); ++ usage_ += charge; ++ FinishErase(table_.Insert(e)); ++ } // else don't cache. (Tests use capacity_==0 to turn off caching.) ++ ++ while (usage_ > capacity_ && lru_.next != &lru_) { ++ LRUHandle* old = lru_.next; ++ assert(old->refs == 1); ++ bool erased = FinishErase(table_.Remove(old->key(), old->hash)); ++ if (!erased) { // to avoid unused variable when compiled NDEBUG ++ assert(erased); ++ } ++ } ++ ++ return reinterpret_cast(e); ++} ++ ++// If e != NULL, finish removing *e from the cache; it has already been removed ++// from the hash table. Return whether e != NULL. Requires mutex_ held. ++bool LRUCache::FinishErase(LRUHandle* e) { ++ if (e != NULL) { ++ assert(e->in_cache); ++ LRU_Remove(e); ++ e->in_cache = false; ++ usage_ -= e->charge; ++ Unref(e); ++ } ++ return e != NULL; ++} ++ ++void LRUCache::Erase(const Slice& key, uint32_t hash) { ++ MutexLock l(&mutex_); ++ FinishErase(table_.Remove(key, hash)); ++} ++ ++void LRUCache::Prune() { ++ MutexLock l(&mutex_); ++ while (lru_.next != &lru_) { ++ LRUHandle* e = lru_.next; ++ assert(e->refs == 1); ++ bool erased = FinishErase(table_.Remove(e->key(), e->hash)); ++ if (!erased) { // to avoid unused variable when compiled NDEBUG ++ assert(erased); ++ } ++ } ++} ++ ++static const int kNumShardBits = 4; ++static const int kNumShards = 1 << kNumShardBits; ++ ++class ShardedLRUCache : public Cache { ++ private: ++ LRUCache shard_[kNumShards]; ++ port::Mutex id_mutex_; ++ uint64_t last_id_; ++ ++ static inline uint32_t HashSlice(const Slice& s) { ++ return Hash(s.data(), s.size(), 0); ++ } ++ ++ static uint32_t Shard(uint32_t hash) { ++ return hash >> (32 - kNumShardBits); ++ } ++ ++ public: ++ explicit ShardedLRUCache(size_t capacity) ++ : last_id_(0) { ++ const size_t per_shard = (capacity + (kNumShards - 1)) / kNumShards; ++ for (int s = 0; s < kNumShards; s++) { ++ shard_[s].SetCapacity(per_shard); ++ } ++ } ++ virtual ~ShardedLRUCache() { } ++ virtual Handle* Insert(const Slice& key, void* value, size_t charge, ++ void (*deleter)(const Slice& key, void* value)) { ++ const uint32_t hash = HashSlice(key); ++ return shard_[Shard(hash)].Insert(key, hash, value, charge, deleter); ++ } ++ virtual Handle* Lookup(const Slice& key) { ++ const uint32_t hash = HashSlice(key); ++ return shard_[Shard(hash)].Lookup(key, hash); ++ } ++ virtual void Release(Handle* handle) { ++ LRUHandle* h = reinterpret_cast(handle); ++ shard_[Shard(h->hash)].Release(handle); ++ } ++ virtual void Erase(const Slice& key) { ++ const uint32_t hash = HashSlice(key); ++ shard_[Shard(hash)].Erase(key, hash); ++ } ++ virtual void* Value(Handle* handle) { ++ return reinterpret_cast(handle)->value; ++ } ++ virtual uint64_t NewId() { ++ MutexLock l(&id_mutex_); ++ return ++(last_id_); ++ } ++ virtual void Prune() { ++ for (int s = 0; s < kNumShards; s++) { ++ shard_[s].Prune(); ++ } ++ } ++ virtual size_t TotalCharge() const { ++ size_t total = 0; ++ for (int s = 0; s < kNumShards; s++) { ++ total += shard_[s].TotalCharge(); ++ } ++ return total; ++ } ++}; ++ ++} // end anonymous namespace ++ ++Cache* NewLRUCache(size_t capacity) { ++ return new ShardedLRUCache(capacity); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache_test.cc +new file mode 100644 +index 0000000..468f7a6 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache_test.cc +@@ -0,0 +1,226 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/cache.h" ++ ++#include ++#include "util/coding.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++// Conversions between numeric keys/values and the types expected by Cache. ++static std::string EncodeKey(int k) { ++ std::string result; ++ PutFixed32(&result, k); ++ return result; ++} ++static int DecodeKey(const Slice& k) { ++ assert(k.size() == 4); ++ return DecodeFixed32(k.data()); ++} ++static void* EncodeValue(uintptr_t v) { return reinterpret_cast(v); } ++static int DecodeValue(void* v) { return reinterpret_cast(v); } ++ ++class CacheTest { ++ public: ++ static CacheTest* current_; ++ ++ static void Deleter(const Slice& key, void* v) { ++ current_->deleted_keys_.push_back(DecodeKey(key)); ++ current_->deleted_values_.push_back(DecodeValue(v)); ++ } ++ ++ static const int kCacheSize = 1000; ++ std::vector deleted_keys_; ++ std::vector deleted_values_; ++ Cache* cache_; ++ ++ CacheTest() : cache_(NewLRUCache(kCacheSize)) { ++ current_ = this; ++ } ++ ++ ~CacheTest() { ++ delete cache_; ++ } ++ ++ int Lookup(int key) { ++ Cache::Handle* handle = cache_->Lookup(EncodeKey(key)); ++ const int r = (handle == NULL) ? -1 : DecodeValue(cache_->Value(handle)); ++ if (handle != NULL) { ++ cache_->Release(handle); ++ } ++ return r; ++ } ++ ++ void Insert(int key, int value, int charge = 1) { ++ cache_->Release(cache_->Insert(EncodeKey(key), EncodeValue(value), charge, ++ &CacheTest::Deleter)); ++ } ++ ++ Cache::Handle* InsertAndReturnHandle(int key, int value, int charge = 1) { ++ return cache_->Insert(EncodeKey(key), EncodeValue(value), charge, ++ &CacheTest::Deleter); ++ } ++ ++ void Erase(int key) { ++ cache_->Erase(EncodeKey(key)); ++ } ++}; ++CacheTest* CacheTest::current_; ++ ++TEST(CacheTest, HitAndMiss) { ++ ASSERT_EQ(-1, Lookup(100)); ++ ++ Insert(100, 101); ++ ASSERT_EQ(101, Lookup(100)); ++ ASSERT_EQ(-1, Lookup(200)); ++ ASSERT_EQ(-1, Lookup(300)); ++ ++ Insert(200, 201); ++ ASSERT_EQ(101, Lookup(100)); ++ ASSERT_EQ(201, Lookup(200)); ++ ASSERT_EQ(-1, Lookup(300)); ++ ++ Insert(100, 102); ++ ASSERT_EQ(102, Lookup(100)); ++ ASSERT_EQ(201, Lookup(200)); ++ ASSERT_EQ(-1, Lookup(300)); ++ ++ ASSERT_EQ(1, deleted_keys_.size()); ++ ASSERT_EQ(100, deleted_keys_[0]); ++ ASSERT_EQ(101, deleted_values_[0]); ++} ++ ++TEST(CacheTest, Erase) { ++ Erase(200); ++ ASSERT_EQ(0, deleted_keys_.size()); ++ ++ Insert(100, 101); ++ Insert(200, 201); ++ Erase(100); ++ ASSERT_EQ(-1, Lookup(100)); ++ ASSERT_EQ(201, Lookup(200)); ++ ASSERT_EQ(1, deleted_keys_.size()); ++ ASSERT_EQ(100, deleted_keys_[0]); ++ ASSERT_EQ(101, deleted_values_[0]); ++ ++ Erase(100); ++ ASSERT_EQ(-1, Lookup(100)); ++ ASSERT_EQ(201, Lookup(200)); ++ ASSERT_EQ(1, deleted_keys_.size()); ++} ++ ++TEST(CacheTest, EntriesArePinned) { ++ Insert(100, 101); ++ Cache::Handle* h1 = cache_->Lookup(EncodeKey(100)); ++ ASSERT_EQ(101, DecodeValue(cache_->Value(h1))); ++ ++ Insert(100, 102); ++ Cache::Handle* h2 = cache_->Lookup(EncodeKey(100)); ++ ASSERT_EQ(102, DecodeValue(cache_->Value(h2))); ++ ASSERT_EQ(0, deleted_keys_.size()); ++ ++ cache_->Release(h1); ++ ASSERT_EQ(1, deleted_keys_.size()); ++ ASSERT_EQ(100, deleted_keys_[0]); ++ ASSERT_EQ(101, deleted_values_[0]); ++ ++ Erase(100); ++ ASSERT_EQ(-1, Lookup(100)); ++ ASSERT_EQ(1, deleted_keys_.size()); ++ ++ cache_->Release(h2); ++ ASSERT_EQ(2, deleted_keys_.size()); ++ ASSERT_EQ(100, deleted_keys_[1]); ++ ASSERT_EQ(102, deleted_values_[1]); ++} ++ ++TEST(CacheTest, EvictionPolicy) { ++ Insert(100, 101); ++ Insert(200, 201); ++ Insert(300, 301); ++ Cache::Handle* h = cache_->Lookup(EncodeKey(300)); ++ ++ // Frequently used entry must be kept around, ++ // as must things that are still in use. ++ for (int i = 0; i < kCacheSize + 100; i++) { ++ Insert(1000+i, 2000+i); ++ ASSERT_EQ(2000+i, Lookup(1000+i)); ++ ASSERT_EQ(101, Lookup(100)); ++ } ++ ASSERT_EQ(101, Lookup(100)); ++ ASSERT_EQ(-1, Lookup(200)); ++ ASSERT_EQ(301, Lookup(300)); ++ cache_->Release(h); ++} ++ ++TEST(CacheTest, UseExceedsCacheSize) { ++ // Overfill the cache, keeping handles on all inserted entries. ++ std::vector h; ++ for (int i = 0; i < kCacheSize + 100; i++) { ++ h.push_back(InsertAndReturnHandle(1000+i, 2000+i)); ++ } ++ ++ // Check that all the entries can be found in the cache. ++ for (int i = 0; i < h.size(); i++) { ++ ASSERT_EQ(2000+i, Lookup(1000+i)); ++ } ++ ++ for (int i = 0; i < h.size(); i++) { ++ cache_->Release(h[i]); ++ } ++} ++ ++TEST(CacheTest, HeavyEntries) { ++ // Add a bunch of light and heavy entries and then count the combined ++ // size of items still in the cache, which must be approximately the ++ // same as the total capacity. ++ const int kLight = 1; ++ const int kHeavy = 10; ++ int added = 0; ++ int index = 0; ++ while (added < 2*kCacheSize) { ++ const int weight = (index & 1) ? kLight : kHeavy; ++ Insert(index, 1000+index, weight); ++ added += weight; ++ index++; ++ } ++ ++ int cached_weight = 0; ++ for (int i = 0; i < index; i++) { ++ const int weight = (i & 1 ? kLight : kHeavy); ++ int r = Lookup(i); ++ if (r >= 0) { ++ cached_weight += weight; ++ ASSERT_EQ(1000+i, r); ++ } ++ } ++ ASSERT_LE(cached_weight, kCacheSize + kCacheSize/10); ++} ++ ++TEST(CacheTest, NewId) { ++ uint64_t a = cache_->NewId(); ++ uint64_t b = cache_->NewId(); ++ ASSERT_NE(a, b); ++} ++ ++TEST(CacheTest, Prune) { ++ Insert(1, 100); ++ Insert(2, 200); ++ ++ Cache::Handle* handle = cache_->Lookup(EncodeKey(1)); ++ ASSERT_TRUE(handle); ++ cache_->Prune(); ++ cache_->Release(handle); ++ ++ ASSERT_EQ(100, Lookup(1)); ++ ASSERT_EQ(-1, Lookup(2)); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.cc +new file mode 100644 +index 0000000..21e3186 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.cc +@@ -0,0 +1,194 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/coding.h" ++ ++namespace leveldb { ++ ++void EncodeFixed32(char* buf, uint32_t value) { ++ if (port::kLittleEndian) { ++ memcpy(buf, &value, sizeof(value)); ++ } else { ++ buf[0] = value & 0xff; ++ buf[1] = (value >> 8) & 0xff; ++ buf[2] = (value >> 16) & 0xff; ++ buf[3] = (value >> 24) & 0xff; ++ } ++} ++ ++void EncodeFixed64(char* buf, uint64_t value) { ++ if (port::kLittleEndian) { ++ memcpy(buf, &value, sizeof(value)); ++ } else { ++ buf[0] = value & 0xff; ++ buf[1] = (value >> 8) & 0xff; ++ buf[2] = (value >> 16) & 0xff; ++ buf[3] = (value >> 24) & 0xff; ++ buf[4] = (value >> 32) & 0xff; ++ buf[5] = (value >> 40) & 0xff; ++ buf[6] = (value >> 48) & 0xff; ++ buf[7] = (value >> 56) & 0xff; ++ } ++} ++ ++void PutFixed32(std::string* dst, uint32_t value) { ++ char buf[sizeof(value)]; ++ EncodeFixed32(buf, value); ++ dst->append(buf, sizeof(buf)); ++} ++ ++void PutFixed64(std::string* dst, uint64_t value) { ++ char buf[sizeof(value)]; ++ EncodeFixed64(buf, value); ++ dst->append(buf, sizeof(buf)); ++} ++ ++char* EncodeVarint32(char* dst, uint32_t v) { ++ // Operate on characters as unsigneds ++ unsigned char* ptr = reinterpret_cast(dst); ++ static const int B = 128; ++ if (v < (1<<7)) { ++ *(ptr++) = v; ++ } else if (v < (1<<14)) { ++ *(ptr++) = v | B; ++ *(ptr++) = v>>7; ++ } else if (v < (1<<21)) { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = v>>14; ++ } else if (v < (1<<28)) { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = (v>>14) | B; ++ *(ptr++) = v>>21; ++ } else { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = (v>>14) | B; ++ *(ptr++) = (v>>21) | B; ++ *(ptr++) = v>>28; ++ } ++ return reinterpret_cast(ptr); ++} ++ ++void PutVarint32(std::string* dst, uint32_t v) { ++ char buf[5]; ++ char* ptr = EncodeVarint32(buf, v); ++ dst->append(buf, ptr - buf); ++} ++ ++char* EncodeVarint64(char* dst, uint64_t v) { ++ static const int B = 128; ++ unsigned char* ptr = reinterpret_cast(dst); ++ while (v >= B) { ++ *(ptr++) = (v & (B-1)) | B; ++ v >>= 7; ++ } ++ *(ptr++) = static_cast(v); ++ return reinterpret_cast(ptr); ++} ++ ++void PutVarint64(std::string* dst, uint64_t v) { ++ char buf[10]; ++ char* ptr = EncodeVarint64(buf, v); ++ dst->append(buf, ptr - buf); ++} ++ ++void PutLengthPrefixedSlice(std::string* dst, const Slice& value) { ++ PutVarint32(dst, value.size()); ++ dst->append(value.data(), value.size()); ++} ++ ++int VarintLength(uint64_t v) { ++ int len = 1; ++ while (v >= 128) { ++ v >>= 7; ++ len++; ++ } ++ return len; ++} ++ ++const char* GetVarint32PtrFallback(const char* p, ++ const char* limit, ++ uint32_t* value) { ++ uint32_t result = 0; ++ for (uint32_t shift = 0; shift <= 28 && p < limit; shift += 7) { ++ uint32_t byte = *(reinterpret_cast(p)); ++ p++; ++ if (byte & 128) { ++ // More bytes are present ++ result |= ((byte & 127) << shift); ++ } else { ++ result |= (byte << shift); ++ *value = result; ++ return reinterpret_cast(p); ++ } ++ } ++ return NULL; ++} ++ ++bool GetVarint32(Slice* input, uint32_t* value) { ++ const char* p = input->data(); ++ const char* limit = p + input->size(); ++ const char* q = GetVarint32Ptr(p, limit, value); ++ if (q == NULL) { ++ return false; ++ } else { ++ *input = Slice(q, limit - q); ++ return true; ++ } ++} ++ ++const char* GetVarint64Ptr(const char* p, const char* limit, uint64_t* value) { ++ uint64_t result = 0; ++ for (uint32_t shift = 0; shift <= 63 && p < limit; shift += 7) { ++ uint64_t byte = *(reinterpret_cast(p)); ++ p++; ++ if (byte & 128) { ++ // More bytes are present ++ result |= ((byte & 127) << shift); ++ } else { ++ result |= (byte << shift); ++ *value = result; ++ return reinterpret_cast(p); ++ } ++ } ++ return NULL; ++} ++ ++bool GetVarint64(Slice* input, uint64_t* value) { ++ const char* p = input->data(); ++ const char* limit = p + input->size(); ++ const char* q = GetVarint64Ptr(p, limit, value); ++ if (q == NULL) { ++ return false; ++ } else { ++ *input = Slice(q, limit - q); ++ return true; ++ } ++} ++ ++const char* GetLengthPrefixedSlice(const char* p, const char* limit, ++ Slice* result) { ++ uint32_t len; ++ p = GetVarint32Ptr(p, limit, &len); ++ if (p == NULL) return NULL; ++ if (p + len > limit) return NULL; ++ *result = Slice(p, len); ++ return p + len; ++} ++ ++bool GetLengthPrefixedSlice(Slice* input, Slice* result) { ++ uint32_t len; ++ if (GetVarint32(input, &len) && ++ input->size() >= len) { ++ *result = Slice(input->data(), len); ++ input->remove_prefix(len); ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.h +new file mode 100644 +index 0000000..3993c4a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.h +@@ -0,0 +1,104 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Endian-neutral encoding: ++// * Fixed-length numbers are encoded with least-significant byte first ++// * In addition we support variable length "varint" encoding ++// * Strings are encoded prefixed by their length in varint format ++ ++#ifndef STORAGE_LEVELDB_UTIL_CODING_H_ ++#define STORAGE_LEVELDB_UTIL_CODING_H_ ++ ++#include ++#include ++#include ++#include "leveldb/slice.h" ++#include "port/port.h" ++ ++namespace leveldb { ++ ++// Standard Put... routines append to a string ++extern void PutFixed32(std::string* dst, uint32_t value); ++extern void PutFixed64(std::string* dst, uint64_t value); ++extern void PutVarint32(std::string* dst, uint32_t value); ++extern void PutVarint64(std::string* dst, uint64_t value); ++extern void PutLengthPrefixedSlice(std::string* dst, const Slice& value); ++ ++// Standard Get... routines parse a value from the beginning of a Slice ++// and advance the slice past the parsed value. ++extern bool GetVarint32(Slice* input, uint32_t* value); ++extern bool GetVarint64(Slice* input, uint64_t* value); ++extern bool GetLengthPrefixedSlice(Slice* input, Slice* result); ++ ++// Pointer-based variants of GetVarint... These either store a value ++// in *v and return a pointer just past the parsed value, or return ++// NULL on error. These routines only look at bytes in the range ++// [p..limit-1] ++extern const char* GetVarint32Ptr(const char* p,const char* limit, uint32_t* v); ++extern const char* GetVarint64Ptr(const char* p,const char* limit, uint64_t* v); ++ ++// Returns the length of the varint32 or varint64 encoding of "v" ++extern int VarintLength(uint64_t v); ++ ++// Lower-level versions of Put... that write directly into a character buffer ++// REQUIRES: dst has enough space for the value being written ++extern void EncodeFixed32(char* dst, uint32_t value); ++extern void EncodeFixed64(char* dst, uint64_t value); ++ ++// Lower-level versions of Put... that write directly into a character buffer ++// and return a pointer just past the last byte written. ++// REQUIRES: dst has enough space for the value being written ++extern char* EncodeVarint32(char* dst, uint32_t value); ++extern char* EncodeVarint64(char* dst, uint64_t value); ++ ++// Lower-level versions of Get... that read directly from a character buffer ++// without any bounds checking. ++ ++inline uint32_t DecodeFixed32(const char* ptr) { ++ if (port::kLittleEndian) { ++ // Load the raw bytes ++ uint32_t result; ++ memcpy(&result, ptr, sizeof(result)); // gcc optimizes this to a plain load ++ return result; ++ } else { ++ return ((static_cast(static_cast(ptr[0]))) ++ | (static_cast(static_cast(ptr[1])) << 8) ++ | (static_cast(static_cast(ptr[2])) << 16) ++ | (static_cast(static_cast(ptr[3])) << 24)); ++ } ++} ++ ++inline uint64_t DecodeFixed64(const char* ptr) { ++ if (port::kLittleEndian) { ++ // Load the raw bytes ++ uint64_t result; ++ memcpy(&result, ptr, sizeof(result)); // gcc optimizes this to a plain load ++ return result; ++ } else { ++ uint64_t lo = DecodeFixed32(ptr); ++ uint64_t hi = DecodeFixed32(ptr + 4); ++ return (hi << 32) | lo; ++ } ++} ++ ++// Internal routine for use by fallback path of GetVarint32Ptr ++extern const char* GetVarint32PtrFallback(const char* p, ++ const char* limit, ++ uint32_t* value); ++inline const char* GetVarint32Ptr(const char* p, ++ const char* limit, ++ uint32_t* value) { ++ if (p < limit) { ++ uint32_t result = *(reinterpret_cast(p)); ++ if ((result & 128) == 0) { ++ *value = result; ++ return p + 1; ++ } ++ } ++ return GetVarint32PtrFallback(p, limit, value); ++} ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_CODING_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding_test.cc +new file mode 100644 +index 0000000..521541e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding_test.cc +@@ -0,0 +1,196 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/coding.h" ++ ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++class Coding { }; ++ ++TEST(Coding, Fixed32) { ++ std::string s; ++ for (uint32_t v = 0; v < 100000; v++) { ++ PutFixed32(&s, v); ++ } ++ ++ const char* p = s.data(); ++ for (uint32_t v = 0; v < 100000; v++) { ++ uint32_t actual = DecodeFixed32(p); ++ ASSERT_EQ(v, actual); ++ p += sizeof(uint32_t); ++ } ++} ++ ++TEST(Coding, Fixed64) { ++ std::string s; ++ for (int power = 0; power <= 63; power++) { ++ uint64_t v = static_cast(1) << power; ++ PutFixed64(&s, v - 1); ++ PutFixed64(&s, v + 0); ++ PutFixed64(&s, v + 1); ++ } ++ ++ const char* p = s.data(); ++ for (int power = 0; power <= 63; power++) { ++ uint64_t v = static_cast(1) << power; ++ uint64_t actual; ++ actual = DecodeFixed64(p); ++ ASSERT_EQ(v-1, actual); ++ p += sizeof(uint64_t); ++ ++ actual = DecodeFixed64(p); ++ ASSERT_EQ(v+0, actual); ++ p += sizeof(uint64_t); ++ ++ actual = DecodeFixed64(p); ++ ASSERT_EQ(v+1, actual); ++ p += sizeof(uint64_t); ++ } ++} ++ ++// Test that encoding routines generate little-endian encodings ++TEST(Coding, EncodingOutput) { ++ std::string dst; ++ PutFixed32(&dst, 0x04030201); ++ ASSERT_EQ(4, dst.size()); ++ ASSERT_EQ(0x01, static_cast(dst[0])); ++ ASSERT_EQ(0x02, static_cast(dst[1])); ++ ASSERT_EQ(0x03, static_cast(dst[2])); ++ ASSERT_EQ(0x04, static_cast(dst[3])); ++ ++ dst.clear(); ++ PutFixed64(&dst, 0x0807060504030201ull); ++ ASSERT_EQ(8, dst.size()); ++ ASSERT_EQ(0x01, static_cast(dst[0])); ++ ASSERT_EQ(0x02, static_cast(dst[1])); ++ ASSERT_EQ(0x03, static_cast(dst[2])); ++ ASSERT_EQ(0x04, static_cast(dst[3])); ++ ASSERT_EQ(0x05, static_cast(dst[4])); ++ ASSERT_EQ(0x06, static_cast(dst[5])); ++ ASSERT_EQ(0x07, static_cast(dst[6])); ++ ASSERT_EQ(0x08, static_cast(dst[7])); ++} ++ ++TEST(Coding, Varint32) { ++ std::string s; ++ for (uint32_t i = 0; i < (32 * 32); i++) { ++ uint32_t v = (i / 32) << (i % 32); ++ PutVarint32(&s, v); ++ } ++ ++ const char* p = s.data(); ++ const char* limit = p + s.size(); ++ for (uint32_t i = 0; i < (32 * 32); i++) { ++ uint32_t expected = (i / 32) << (i % 32); ++ uint32_t actual; ++ const char* start = p; ++ p = GetVarint32Ptr(p, limit, &actual); ++ ASSERT_TRUE(p != NULL); ++ ASSERT_EQ(expected, actual); ++ ASSERT_EQ(VarintLength(actual), p - start); ++ } ++ ASSERT_EQ(p, s.data() + s.size()); ++} ++ ++TEST(Coding, Varint64) { ++ // Construct the list of values to check ++ std::vector values; ++ // Some special values ++ values.push_back(0); ++ values.push_back(100); ++ values.push_back(~static_cast(0)); ++ values.push_back(~static_cast(0) - 1); ++ for (uint32_t k = 0; k < 64; k++) { ++ // Test values near powers of two ++ const uint64_t power = 1ull << k; ++ values.push_back(power); ++ values.push_back(power-1); ++ values.push_back(power+1); ++ } ++ ++ std::string s; ++ for (size_t i = 0; i < values.size(); i++) { ++ PutVarint64(&s, values[i]); ++ } ++ ++ const char* p = s.data(); ++ const char* limit = p + s.size(); ++ for (size_t i = 0; i < values.size(); i++) { ++ ASSERT_TRUE(p < limit); ++ uint64_t actual; ++ const char* start = p; ++ p = GetVarint64Ptr(p, limit, &actual); ++ ASSERT_TRUE(p != NULL); ++ ASSERT_EQ(values[i], actual); ++ ASSERT_EQ(VarintLength(actual), p - start); ++ } ++ ASSERT_EQ(p, limit); ++ ++} ++ ++TEST(Coding, Varint32Overflow) { ++ uint32_t result; ++ std::string input("\x81\x82\x83\x84\x85\x11"); ++ ASSERT_TRUE(GetVarint32Ptr(input.data(), input.data() + input.size(), &result) ++ == NULL); ++} ++ ++TEST(Coding, Varint32Truncation) { ++ uint32_t large_value = (1u << 31) + 100; ++ std::string s; ++ PutVarint32(&s, large_value); ++ uint32_t result; ++ for (size_t len = 0; len < s.size() - 1; len++) { ++ ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + len, &result) == NULL); ++ } ++ ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + s.size(), &result) != NULL); ++ ASSERT_EQ(large_value, result); ++} ++ ++TEST(Coding, Varint64Overflow) { ++ uint64_t result; ++ std::string input("\x81\x82\x83\x84\x85\x81\x82\x83\x84\x85\x11"); ++ ASSERT_TRUE(GetVarint64Ptr(input.data(), input.data() + input.size(), &result) ++ == NULL); ++} ++ ++TEST(Coding, Varint64Truncation) { ++ uint64_t large_value = (1ull << 63) + 100ull; ++ std::string s; ++ PutVarint64(&s, large_value); ++ uint64_t result; ++ for (size_t len = 0; len < s.size() - 1; len++) { ++ ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + len, &result) == NULL); ++ } ++ ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + s.size(), &result) != NULL); ++ ASSERT_EQ(large_value, result); ++} ++ ++TEST(Coding, Strings) { ++ std::string s; ++ PutLengthPrefixedSlice(&s, Slice("")); ++ PutLengthPrefixedSlice(&s, Slice("foo")); ++ PutLengthPrefixedSlice(&s, Slice("bar")); ++ PutLengthPrefixedSlice(&s, Slice(std::string(200, 'x'))); ++ ++ Slice input(s); ++ Slice v; ++ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v)); ++ ASSERT_EQ("", v.ToString()); ++ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v)); ++ ASSERT_EQ("foo", v.ToString()); ++ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v)); ++ ASSERT_EQ("bar", v.ToString()); ++ ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v)); ++ ASSERT_EQ(std::string(200, 'x'), v.ToString()); ++ ASSERT_EQ("", input.ToString()); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/comparator.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/comparator.cc +new file mode 100644 +index 0000000..4b7b572 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/comparator.cc +@@ -0,0 +1,81 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include "leveldb/comparator.h" ++#include "leveldb/slice.h" ++#include "port/port.h" ++#include "util/logging.h" ++ ++namespace leveldb { ++ ++Comparator::~Comparator() { } ++ ++namespace { ++class BytewiseComparatorImpl : public Comparator { ++ public: ++ BytewiseComparatorImpl() { } ++ ++ virtual const char* Name() const { ++ return "leveldb.BytewiseComparator"; ++ } ++ ++ virtual int Compare(const Slice& a, const Slice& b) const { ++ return a.compare(b); ++ } ++ ++ virtual void FindShortestSeparator( ++ std::string* start, ++ const Slice& limit) const { ++ // Find length of common prefix ++ size_t min_length = std::min(start->size(), limit.size()); ++ size_t diff_index = 0; ++ while ((diff_index < min_length) && ++ ((*start)[diff_index] == limit[diff_index])) { ++ diff_index++; ++ } ++ ++ if (diff_index >= min_length) { ++ // Do not shorten if one string is a prefix of the other ++ } else { ++ uint8_t diff_byte = static_cast((*start)[diff_index]); ++ if (diff_byte < static_cast(0xff) && ++ diff_byte + 1 < static_cast(limit[diff_index])) { ++ (*start)[diff_index]++; ++ start->resize(diff_index + 1); ++ assert(Compare(*start, limit) < 0); ++ } ++ } ++ } ++ ++ virtual void FindShortSuccessor(std::string* key) const { ++ // Find first character that can be incremented ++ size_t n = key->size(); ++ for (size_t i = 0; i < n; i++) { ++ const uint8_t byte = (*key)[i]; ++ if (byte != static_cast(0xff)) { ++ (*key)[i] = byte + 1; ++ key->resize(i+1); ++ return; ++ } ++ } ++ // *key is a run of 0xffs. Leave it alone. ++ } ++}; ++} // namespace ++ ++static port::OnceType once = LEVELDB_ONCE_INIT; ++static const Comparator* bytewise; ++ ++static void InitModule() { ++ bytewise = new BytewiseComparatorImpl; ++} ++ ++const Comparator* BytewiseComparator() { ++ port::InitOnce(&once, InitModule); ++ return bytewise; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.cc +new file mode 100644 +index 0000000..edd61cf +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.cc +@@ -0,0 +1,350 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// A portable implementation of crc32c, optimized to handle ++// four bytes at a time. ++ ++#include "util/crc32c.h" ++ ++#include ++ ++#include "port/port.h" ++#include "util/coding.h" ++ ++namespace leveldb { ++namespace crc32c { ++ ++static const uint32_t table0_[256] = { ++ 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, ++ 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb, ++ 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b, ++ 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, ++ 0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b, ++ 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384, ++ 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, ++ 0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b, ++ 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a, ++ 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, ++ 0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5, ++ 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa, ++ 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, ++ 0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a, ++ 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a, ++ 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, ++ 0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48, ++ 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957, ++ 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, ++ 0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198, ++ 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927, ++ 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, ++ 0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8, ++ 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7, ++ 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, ++ 0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789, ++ 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859, ++ 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, ++ 0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9, ++ 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6, ++ 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, ++ 0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829, ++ 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c, ++ 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, ++ 0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043, ++ 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c, ++ 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, ++ 0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc, ++ 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c, ++ 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, ++ 0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652, ++ 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d, ++ 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, ++ 0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982, ++ 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d, ++ 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, ++ 0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2, ++ 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed, ++ 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, ++ 0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f, ++ 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff, ++ 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, ++ 0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f, ++ 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540, ++ 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, ++ 0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f, ++ 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee, ++ 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, ++ 0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321, ++ 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e, ++ 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, ++ 0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e, ++ 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e, ++ 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351 ++}; ++static const uint32_t table1_[256] = { ++ 0x00000000, 0x13a29877, 0x274530ee, 0x34e7a899, ++ 0x4e8a61dc, 0x5d28f9ab, 0x69cf5132, 0x7a6dc945, ++ 0x9d14c3b8, 0x8eb65bcf, 0xba51f356, 0xa9f36b21, ++ 0xd39ea264, 0xc03c3a13, 0xf4db928a, 0xe7790afd, ++ 0x3fc5f181, 0x2c6769f6, 0x1880c16f, 0x0b225918, ++ 0x714f905d, 0x62ed082a, 0x560aa0b3, 0x45a838c4, ++ 0xa2d13239, 0xb173aa4e, 0x859402d7, 0x96369aa0, ++ 0xec5b53e5, 0xfff9cb92, 0xcb1e630b, 0xd8bcfb7c, ++ 0x7f8be302, 0x6c297b75, 0x58ced3ec, 0x4b6c4b9b, ++ 0x310182de, 0x22a31aa9, 0x1644b230, 0x05e62a47, ++ 0xe29f20ba, 0xf13db8cd, 0xc5da1054, 0xd6788823, ++ 0xac154166, 0xbfb7d911, 0x8b507188, 0x98f2e9ff, ++ 0x404e1283, 0x53ec8af4, 0x670b226d, 0x74a9ba1a, ++ 0x0ec4735f, 0x1d66eb28, 0x298143b1, 0x3a23dbc6, ++ 0xdd5ad13b, 0xcef8494c, 0xfa1fe1d5, 0xe9bd79a2, ++ 0x93d0b0e7, 0x80722890, 0xb4958009, 0xa737187e, ++ 0xff17c604, 0xecb55e73, 0xd852f6ea, 0xcbf06e9d, ++ 0xb19da7d8, 0xa23f3faf, 0x96d89736, 0x857a0f41, ++ 0x620305bc, 0x71a19dcb, 0x45463552, 0x56e4ad25, ++ 0x2c896460, 0x3f2bfc17, 0x0bcc548e, 0x186eccf9, ++ 0xc0d23785, 0xd370aff2, 0xe797076b, 0xf4359f1c, ++ 0x8e585659, 0x9dface2e, 0xa91d66b7, 0xbabffec0, ++ 0x5dc6f43d, 0x4e646c4a, 0x7a83c4d3, 0x69215ca4, ++ 0x134c95e1, 0x00ee0d96, 0x3409a50f, 0x27ab3d78, ++ 0x809c2506, 0x933ebd71, 0xa7d915e8, 0xb47b8d9f, ++ 0xce1644da, 0xddb4dcad, 0xe9537434, 0xfaf1ec43, ++ 0x1d88e6be, 0x0e2a7ec9, 0x3acdd650, 0x296f4e27, ++ 0x53028762, 0x40a01f15, 0x7447b78c, 0x67e52ffb, ++ 0xbf59d487, 0xacfb4cf0, 0x981ce469, 0x8bbe7c1e, ++ 0xf1d3b55b, 0xe2712d2c, 0xd69685b5, 0xc5341dc2, ++ 0x224d173f, 0x31ef8f48, 0x050827d1, 0x16aabfa6, ++ 0x6cc776e3, 0x7f65ee94, 0x4b82460d, 0x5820de7a, ++ 0xfbc3faf9, 0xe861628e, 0xdc86ca17, 0xcf245260, ++ 0xb5499b25, 0xa6eb0352, 0x920cabcb, 0x81ae33bc, ++ 0x66d73941, 0x7575a136, 0x419209af, 0x523091d8, ++ 0x285d589d, 0x3bffc0ea, 0x0f186873, 0x1cbaf004, ++ 0xc4060b78, 0xd7a4930f, 0xe3433b96, 0xf0e1a3e1, ++ 0x8a8c6aa4, 0x992ef2d3, 0xadc95a4a, 0xbe6bc23d, ++ 0x5912c8c0, 0x4ab050b7, 0x7e57f82e, 0x6df56059, ++ 0x1798a91c, 0x043a316b, 0x30dd99f2, 0x237f0185, ++ 0x844819fb, 0x97ea818c, 0xa30d2915, 0xb0afb162, ++ 0xcac27827, 0xd960e050, 0xed8748c9, 0xfe25d0be, ++ 0x195cda43, 0x0afe4234, 0x3e19eaad, 0x2dbb72da, ++ 0x57d6bb9f, 0x447423e8, 0x70938b71, 0x63311306, ++ 0xbb8de87a, 0xa82f700d, 0x9cc8d894, 0x8f6a40e3, ++ 0xf50789a6, 0xe6a511d1, 0xd242b948, 0xc1e0213f, ++ 0x26992bc2, 0x353bb3b5, 0x01dc1b2c, 0x127e835b, ++ 0x68134a1e, 0x7bb1d269, 0x4f567af0, 0x5cf4e287, ++ 0x04d43cfd, 0x1776a48a, 0x23910c13, 0x30339464, ++ 0x4a5e5d21, 0x59fcc556, 0x6d1b6dcf, 0x7eb9f5b8, ++ 0x99c0ff45, 0x8a626732, 0xbe85cfab, 0xad2757dc, ++ 0xd74a9e99, 0xc4e806ee, 0xf00fae77, 0xe3ad3600, ++ 0x3b11cd7c, 0x28b3550b, 0x1c54fd92, 0x0ff665e5, ++ 0x759baca0, 0x663934d7, 0x52de9c4e, 0x417c0439, ++ 0xa6050ec4, 0xb5a796b3, 0x81403e2a, 0x92e2a65d, ++ 0xe88f6f18, 0xfb2df76f, 0xcfca5ff6, 0xdc68c781, ++ 0x7b5fdfff, 0x68fd4788, 0x5c1aef11, 0x4fb87766, ++ 0x35d5be23, 0x26772654, 0x12908ecd, 0x013216ba, ++ 0xe64b1c47, 0xf5e98430, 0xc10e2ca9, 0xd2acb4de, ++ 0xa8c17d9b, 0xbb63e5ec, 0x8f844d75, 0x9c26d502, ++ 0x449a2e7e, 0x5738b609, 0x63df1e90, 0x707d86e7, ++ 0x0a104fa2, 0x19b2d7d5, 0x2d557f4c, 0x3ef7e73b, ++ 0xd98eedc6, 0xca2c75b1, 0xfecbdd28, 0xed69455f, ++ 0x97048c1a, 0x84a6146d, 0xb041bcf4, 0xa3e32483 ++}; ++static const uint32_t table2_[256] = { ++ 0x00000000, 0xa541927e, 0x4f6f520d, 0xea2ec073, ++ 0x9edea41a, 0x3b9f3664, 0xd1b1f617, 0x74f06469, ++ 0x38513ec5, 0x9d10acbb, 0x773e6cc8, 0xd27ffeb6, ++ 0xa68f9adf, 0x03ce08a1, 0xe9e0c8d2, 0x4ca15aac, ++ 0x70a27d8a, 0xd5e3eff4, 0x3fcd2f87, 0x9a8cbdf9, ++ 0xee7cd990, 0x4b3d4bee, 0xa1138b9d, 0x045219e3, ++ 0x48f3434f, 0xedb2d131, 0x079c1142, 0xa2dd833c, ++ 0xd62de755, 0x736c752b, 0x9942b558, 0x3c032726, ++ 0xe144fb14, 0x4405696a, 0xae2ba919, 0x0b6a3b67, ++ 0x7f9a5f0e, 0xdadbcd70, 0x30f50d03, 0x95b49f7d, ++ 0xd915c5d1, 0x7c5457af, 0x967a97dc, 0x333b05a2, ++ 0x47cb61cb, 0xe28af3b5, 0x08a433c6, 0xade5a1b8, ++ 0x91e6869e, 0x34a714e0, 0xde89d493, 0x7bc846ed, ++ 0x0f382284, 0xaa79b0fa, 0x40577089, 0xe516e2f7, ++ 0xa9b7b85b, 0x0cf62a25, 0xe6d8ea56, 0x43997828, ++ 0x37691c41, 0x92288e3f, 0x78064e4c, 0xdd47dc32, ++ 0xc76580d9, 0x622412a7, 0x880ad2d4, 0x2d4b40aa, ++ 0x59bb24c3, 0xfcfab6bd, 0x16d476ce, 0xb395e4b0, ++ 0xff34be1c, 0x5a752c62, 0xb05bec11, 0x151a7e6f, ++ 0x61ea1a06, 0xc4ab8878, 0x2e85480b, 0x8bc4da75, ++ 0xb7c7fd53, 0x12866f2d, 0xf8a8af5e, 0x5de93d20, ++ 0x29195949, 0x8c58cb37, 0x66760b44, 0xc337993a, ++ 0x8f96c396, 0x2ad751e8, 0xc0f9919b, 0x65b803e5, ++ 0x1148678c, 0xb409f5f2, 0x5e273581, 0xfb66a7ff, ++ 0x26217bcd, 0x8360e9b3, 0x694e29c0, 0xcc0fbbbe, ++ 0xb8ffdfd7, 0x1dbe4da9, 0xf7908dda, 0x52d11fa4, ++ 0x1e704508, 0xbb31d776, 0x511f1705, 0xf45e857b, ++ 0x80aee112, 0x25ef736c, 0xcfc1b31f, 0x6a802161, ++ 0x56830647, 0xf3c29439, 0x19ec544a, 0xbcadc634, ++ 0xc85da25d, 0x6d1c3023, 0x8732f050, 0x2273622e, ++ 0x6ed23882, 0xcb93aafc, 0x21bd6a8f, 0x84fcf8f1, ++ 0xf00c9c98, 0x554d0ee6, 0xbf63ce95, 0x1a225ceb, ++ 0x8b277743, 0x2e66e53d, 0xc448254e, 0x6109b730, ++ 0x15f9d359, 0xb0b84127, 0x5a968154, 0xffd7132a, ++ 0xb3764986, 0x1637dbf8, 0xfc191b8b, 0x595889f5, ++ 0x2da8ed9c, 0x88e97fe2, 0x62c7bf91, 0xc7862def, ++ 0xfb850ac9, 0x5ec498b7, 0xb4ea58c4, 0x11abcaba, ++ 0x655baed3, 0xc01a3cad, 0x2a34fcde, 0x8f756ea0, ++ 0xc3d4340c, 0x6695a672, 0x8cbb6601, 0x29faf47f, ++ 0x5d0a9016, 0xf84b0268, 0x1265c21b, 0xb7245065, ++ 0x6a638c57, 0xcf221e29, 0x250cde5a, 0x804d4c24, ++ 0xf4bd284d, 0x51fcba33, 0xbbd27a40, 0x1e93e83e, ++ 0x5232b292, 0xf77320ec, 0x1d5de09f, 0xb81c72e1, ++ 0xccec1688, 0x69ad84f6, 0x83834485, 0x26c2d6fb, ++ 0x1ac1f1dd, 0xbf8063a3, 0x55aea3d0, 0xf0ef31ae, ++ 0x841f55c7, 0x215ec7b9, 0xcb7007ca, 0x6e3195b4, ++ 0x2290cf18, 0x87d15d66, 0x6dff9d15, 0xc8be0f6b, ++ 0xbc4e6b02, 0x190ff97c, 0xf321390f, 0x5660ab71, ++ 0x4c42f79a, 0xe90365e4, 0x032da597, 0xa66c37e9, ++ 0xd29c5380, 0x77ddc1fe, 0x9df3018d, 0x38b293f3, ++ 0x7413c95f, 0xd1525b21, 0x3b7c9b52, 0x9e3d092c, ++ 0xeacd6d45, 0x4f8cff3b, 0xa5a23f48, 0x00e3ad36, ++ 0x3ce08a10, 0x99a1186e, 0x738fd81d, 0xd6ce4a63, ++ 0xa23e2e0a, 0x077fbc74, 0xed517c07, 0x4810ee79, ++ 0x04b1b4d5, 0xa1f026ab, 0x4bdee6d8, 0xee9f74a6, ++ 0x9a6f10cf, 0x3f2e82b1, 0xd50042c2, 0x7041d0bc, ++ 0xad060c8e, 0x08479ef0, 0xe2695e83, 0x4728ccfd, ++ 0x33d8a894, 0x96993aea, 0x7cb7fa99, 0xd9f668e7, ++ 0x9557324b, 0x3016a035, 0xda386046, 0x7f79f238, ++ 0x0b899651, 0xaec8042f, 0x44e6c45c, 0xe1a75622, ++ 0xdda47104, 0x78e5e37a, 0x92cb2309, 0x378ab177, ++ 0x437ad51e, 0xe63b4760, 0x0c158713, 0xa954156d, ++ 0xe5f54fc1, 0x40b4ddbf, 0xaa9a1dcc, 0x0fdb8fb2, ++ 0x7b2bebdb, 0xde6a79a5, 0x3444b9d6, 0x91052ba8 ++}; ++static const uint32_t table3_[256] = { ++ 0x00000000, 0xdd45aab8, 0xbf672381, 0x62228939, ++ 0x7b2231f3, 0xa6679b4b, 0xc4451272, 0x1900b8ca, ++ 0xf64463e6, 0x2b01c95e, 0x49234067, 0x9466eadf, ++ 0x8d665215, 0x5023f8ad, 0x32017194, 0xef44db2c, ++ 0xe964b13d, 0x34211b85, 0x560392bc, 0x8b463804, ++ 0x924680ce, 0x4f032a76, 0x2d21a34f, 0xf06409f7, ++ 0x1f20d2db, 0xc2657863, 0xa047f15a, 0x7d025be2, ++ 0x6402e328, 0xb9474990, 0xdb65c0a9, 0x06206a11, ++ 0xd725148b, 0x0a60be33, 0x6842370a, 0xb5079db2, ++ 0xac072578, 0x71428fc0, 0x136006f9, 0xce25ac41, ++ 0x2161776d, 0xfc24ddd5, 0x9e0654ec, 0x4343fe54, ++ 0x5a43469e, 0x8706ec26, 0xe524651f, 0x3861cfa7, ++ 0x3e41a5b6, 0xe3040f0e, 0x81268637, 0x5c632c8f, ++ 0x45639445, 0x98263efd, 0xfa04b7c4, 0x27411d7c, ++ 0xc805c650, 0x15406ce8, 0x7762e5d1, 0xaa274f69, ++ 0xb327f7a3, 0x6e625d1b, 0x0c40d422, 0xd1057e9a, ++ 0xaba65fe7, 0x76e3f55f, 0x14c17c66, 0xc984d6de, ++ 0xd0846e14, 0x0dc1c4ac, 0x6fe34d95, 0xb2a6e72d, ++ 0x5de23c01, 0x80a796b9, 0xe2851f80, 0x3fc0b538, ++ 0x26c00df2, 0xfb85a74a, 0x99a72e73, 0x44e284cb, ++ 0x42c2eeda, 0x9f874462, 0xfda5cd5b, 0x20e067e3, ++ 0x39e0df29, 0xe4a57591, 0x8687fca8, 0x5bc25610, ++ 0xb4868d3c, 0x69c32784, 0x0be1aebd, 0xd6a40405, ++ 0xcfa4bccf, 0x12e11677, 0x70c39f4e, 0xad8635f6, ++ 0x7c834b6c, 0xa1c6e1d4, 0xc3e468ed, 0x1ea1c255, ++ 0x07a17a9f, 0xdae4d027, 0xb8c6591e, 0x6583f3a6, ++ 0x8ac7288a, 0x57828232, 0x35a00b0b, 0xe8e5a1b3, ++ 0xf1e51979, 0x2ca0b3c1, 0x4e823af8, 0x93c79040, ++ 0x95e7fa51, 0x48a250e9, 0x2a80d9d0, 0xf7c57368, ++ 0xeec5cba2, 0x3380611a, 0x51a2e823, 0x8ce7429b, ++ 0x63a399b7, 0xbee6330f, 0xdcc4ba36, 0x0181108e, ++ 0x1881a844, 0xc5c402fc, 0xa7e68bc5, 0x7aa3217d, ++ 0x52a0c93f, 0x8fe56387, 0xedc7eabe, 0x30824006, ++ 0x2982f8cc, 0xf4c75274, 0x96e5db4d, 0x4ba071f5, ++ 0xa4e4aad9, 0x79a10061, 0x1b838958, 0xc6c623e0, ++ 0xdfc69b2a, 0x02833192, 0x60a1b8ab, 0xbde41213, ++ 0xbbc47802, 0x6681d2ba, 0x04a35b83, 0xd9e6f13b, ++ 0xc0e649f1, 0x1da3e349, 0x7f816a70, 0xa2c4c0c8, ++ 0x4d801be4, 0x90c5b15c, 0xf2e73865, 0x2fa292dd, ++ 0x36a22a17, 0xebe780af, 0x89c50996, 0x5480a32e, ++ 0x8585ddb4, 0x58c0770c, 0x3ae2fe35, 0xe7a7548d, ++ 0xfea7ec47, 0x23e246ff, 0x41c0cfc6, 0x9c85657e, ++ 0x73c1be52, 0xae8414ea, 0xcca69dd3, 0x11e3376b, ++ 0x08e38fa1, 0xd5a62519, 0xb784ac20, 0x6ac10698, ++ 0x6ce16c89, 0xb1a4c631, 0xd3864f08, 0x0ec3e5b0, ++ 0x17c35d7a, 0xca86f7c2, 0xa8a47efb, 0x75e1d443, ++ 0x9aa50f6f, 0x47e0a5d7, 0x25c22cee, 0xf8878656, ++ 0xe1873e9c, 0x3cc29424, 0x5ee01d1d, 0x83a5b7a5, ++ 0xf90696d8, 0x24433c60, 0x4661b559, 0x9b241fe1, ++ 0x8224a72b, 0x5f610d93, 0x3d4384aa, 0xe0062e12, ++ 0x0f42f53e, 0xd2075f86, 0xb025d6bf, 0x6d607c07, ++ 0x7460c4cd, 0xa9256e75, 0xcb07e74c, 0x16424df4, ++ 0x106227e5, 0xcd278d5d, 0xaf050464, 0x7240aedc, ++ 0x6b401616, 0xb605bcae, 0xd4273597, 0x09629f2f, ++ 0xe6264403, 0x3b63eebb, 0x59416782, 0x8404cd3a, ++ 0x9d0475f0, 0x4041df48, 0x22635671, 0xff26fcc9, ++ 0x2e238253, 0xf36628eb, 0x9144a1d2, 0x4c010b6a, ++ 0x5501b3a0, 0x88441918, 0xea669021, 0x37233a99, ++ 0xd867e1b5, 0x05224b0d, 0x6700c234, 0xba45688c, ++ 0xa345d046, 0x7e007afe, 0x1c22f3c7, 0xc167597f, ++ 0xc747336e, 0x1a0299d6, 0x782010ef, 0xa565ba57, ++ 0xbc65029d, 0x6120a825, 0x0302211c, 0xde478ba4, ++ 0x31035088, 0xec46fa30, 0x8e647309, 0x5321d9b1, ++ 0x4a21617b, 0x9764cbc3, 0xf54642fa, 0x2803e842 ++}; ++ ++// Used to fetch a naturally-aligned 32-bit word in little endian byte-order ++static inline uint32_t LE_LOAD32(const uint8_t *p) { ++ return DecodeFixed32(reinterpret_cast(p)); ++} ++ ++// Determine if the CPU running this program can accelerate the CRC32C ++// calculation. ++static bool CanAccelerateCRC32C() { ++ // port::AcceleretedCRC32C returns zero when unable to accelerate. ++ static const char kTestCRCBuffer[] = "TestCRCBuffer"; ++ static const char kBufSize = sizeof(kTestCRCBuffer) - 1; ++ static const uint32_t kTestCRCValue = 0xdcbc59fa; ++ ++ return port::AcceleratedCRC32C(0, kTestCRCBuffer, kBufSize) == kTestCRCValue; ++} ++ ++uint32_t Extend(uint32_t crc, const char* buf, size_t size) { ++ static bool accelerate = CanAccelerateCRC32C(); ++ if (accelerate) { ++ return port::AcceleratedCRC32C(crc, buf, size); ++ } ++ ++ const uint8_t *p = reinterpret_cast(buf); ++ const uint8_t *e = p + size; ++ uint32_t l = crc ^ 0xffffffffu; ++ ++#define STEP1 do { \ ++ int c = (l & 0xff) ^ *p++; \ ++ l = table0_[c] ^ (l >> 8); \ ++} while (0) ++#define STEP4 do { \ ++ uint32_t c = l ^ LE_LOAD32(p); \ ++ p += 4; \ ++ l = table3_[c & 0xff] ^ \ ++ table2_[(c >> 8) & 0xff] ^ \ ++ table1_[(c >> 16) & 0xff] ^ \ ++ table0_[c >> 24]; \ ++} while (0) ++ ++ // Point x at first 4-byte aligned byte in string. This might be ++ // just past the end of the string. ++ const uintptr_t pval = reinterpret_cast(p); ++ const uint8_t* x = reinterpret_cast(((pval + 3) >> 2) << 2); ++ if (x <= e) { ++ // Process bytes until finished or p is 4-byte aligned ++ while (p != x) { ++ STEP1; ++ } ++ } ++ // Process bytes 16 at a time ++ while ((e-p) >= 16) { ++ STEP4; STEP4; STEP4; STEP4; ++ } ++ // Process bytes 4 at a time ++ while ((e-p) >= 4) { ++ STEP4; ++ } ++ // Process the last few bytes ++ while (p != e) { ++ STEP1; ++ } ++#undef STEP4 ++#undef STEP1 ++ return l ^ 0xffffffffu; ++} ++ ++} // namespace crc32c ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.h +new file mode 100644 +index 0000000..1d7e5c0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.h +@@ -0,0 +1,45 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_CRC32C_H_ ++#define STORAGE_LEVELDB_UTIL_CRC32C_H_ ++ ++#include ++#include ++ ++namespace leveldb { ++namespace crc32c { ++ ++// Return the crc32c of concat(A, data[0,n-1]) where init_crc is the ++// crc32c of some string A. Extend() is often used to maintain the ++// crc32c of a stream of data. ++extern uint32_t Extend(uint32_t init_crc, const char* data, size_t n); ++ ++// Return the crc32c of data[0,n-1] ++inline uint32_t Value(const char* data, size_t n) { ++ return Extend(0, data, n); ++} ++ ++static const uint32_t kMaskDelta = 0xa282ead8ul; ++ ++// Return a masked representation of crc. ++// ++// Motivation: it is problematic to compute the CRC of a string that ++// contains embedded CRCs. Therefore we recommend that CRCs stored ++// somewhere (e.g., in files) should be masked before being stored. ++inline uint32_t Mask(uint32_t crc) { ++ // Rotate right by 15 bits and add a constant. ++ return ((crc >> 15) | (crc << 17)) + kMaskDelta; ++} ++ ++// Return the crc whose masked representation is masked_crc. ++inline uint32_t Unmask(uint32_t masked_crc) { ++ uint32_t rot = masked_crc - kMaskDelta; ++ return ((rot >> 17) | (rot << 15)); ++} ++ ++} // namespace crc32c ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_CRC32C_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c_test.cc +new file mode 100644 +index 0000000..4b957ee +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c_test.cc +@@ -0,0 +1,72 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/crc32c.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++namespace crc32c { ++ ++class CRC { }; ++ ++TEST(CRC, StandardResults) { ++ // From rfc3720 section B.4. ++ char buf[32]; ++ ++ memset(buf, 0, sizeof(buf)); ++ ASSERT_EQ(0x8a9136aa, Value(buf, sizeof(buf))); ++ ++ memset(buf, 0xff, sizeof(buf)); ++ ASSERT_EQ(0x62a8ab43, Value(buf, sizeof(buf))); ++ ++ for (int i = 0; i < 32; i++) { ++ buf[i] = i; ++ } ++ ASSERT_EQ(0x46dd794e, Value(buf, sizeof(buf))); ++ ++ for (int i = 0; i < 32; i++) { ++ buf[i] = 31 - i; ++ } ++ ASSERT_EQ(0x113fdb5c, Value(buf, sizeof(buf))); ++ ++ unsigned char data[48] = { ++ 0x01, 0xc0, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x14, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x04, 0x00, ++ 0x00, 0x00, 0x00, 0x14, ++ 0x00, 0x00, 0x00, 0x18, ++ 0x28, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x02, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ }; ++ ASSERT_EQ(0xd9963a56, Value(reinterpret_cast(data), sizeof(data))); ++} ++ ++TEST(CRC, Values) { ++ ASSERT_NE(Value("a", 1), Value("foo", 3)); ++} ++ ++TEST(CRC, Extend) { ++ ASSERT_EQ(Value("hello world", 11), ++ Extend(Value("hello ", 6), "world", 5)); ++} ++ ++TEST(CRC, Mask) { ++ uint32_t crc = Value("foo", 3); ++ ASSERT_NE(crc, Mask(crc)); ++ ASSERT_NE(crc, Mask(Mask(crc))); ++ ASSERT_EQ(crc, Unmask(Mask(crc))); ++ ASSERT_EQ(crc, Unmask(Unmask(Mask(Mask(crc))))); ++} ++ ++} // namespace crc32c ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env.cc +new file mode 100644 +index 0000000..c58a082 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env.cc +@@ -0,0 +1,100 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/env.h" ++ ++namespace leveldb { ++ ++Env::~Env() { ++} ++ ++Status Env::NewAppendableFile(const std::string& fname, WritableFile** result) { ++ return Status::NotSupported("NewAppendableFile", fname); ++} ++ ++SequentialFile::~SequentialFile() { ++} ++ ++RandomAccessFile::~RandomAccessFile() { ++} ++ ++WritableFile::~WritableFile() { ++} ++ ++Logger::~Logger() { ++} ++ ++FileLock::~FileLock() { ++} ++ ++void Log(Logger* info_log, const char* format, ...) { ++ if (info_log != NULL) { ++ va_list ap; ++ va_start(ap, format); ++ info_log->Logv(format, ap); ++ va_end(ap); ++ } ++} ++ ++static Status DoWriteStringToFile(Env* env, const Slice& data, ++ const std::string& fname, ++ bool should_sync) { ++ WritableFile* file; ++ Status s = env->NewWritableFile(fname, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ s = file->Append(data); ++ if (s.ok() && should_sync) { ++ s = file->Sync(); ++ } ++ if (s.ok()) { ++ s = file->Close(); ++ } ++ delete file; // Will auto-close if we did not close above ++ if (!s.ok()) { ++ env->DeleteFile(fname); ++ } ++ return s; ++} ++ ++Status WriteStringToFile(Env* env, const Slice& data, ++ const std::string& fname) { ++ return DoWriteStringToFile(env, data, fname, false); ++} ++ ++Status WriteStringToFileSync(Env* env, const Slice& data, ++ const std::string& fname) { ++ return DoWriteStringToFile(env, data, fname, true); ++} ++ ++Status ReadFileToString(Env* env, const std::string& fname, std::string* data) { ++ data->clear(); ++ SequentialFile* file; ++ Status s = env->NewSequentialFile(fname, &file); ++ if (!s.ok()) { ++ return s; ++ } ++ static const int kBufferSize = 8192; ++ char* space = new char[kBufferSize]; ++ while (true) { ++ Slice fragment; ++ s = file->Read(kBufferSize, &fragment, space); ++ if (!s.ok()) { ++ break; ++ } ++ data->append(fragment.data(), fragment.size()); ++ if (fragment.empty()) { ++ break; ++ } ++ } ++ delete[] space; ++ delete file; ++ return s; ++} ++ ++EnvWrapper::~EnvWrapper() { ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix.cc +new file mode 100644 +index 0000000..84aabb2 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix.cc +@@ -0,0 +1,695 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "leveldb/env.h" ++#include "leveldb/slice.h" ++#include "port/port.h" ++#include "util/logging.h" ++#include "util/mutexlock.h" ++#include "util/posix_logger.h" ++#include "util/env_posix_test_helper.h" ++ ++namespace leveldb { ++ ++namespace { ++ ++static int open_read_only_file_limit = -1; ++static int mmap_limit = -1; ++ ++static Status IOError(const std::string& context, int err_number) { ++ return Status::IOError(context, strerror(err_number)); ++} ++ ++// Helper class to limit resource usage to avoid exhaustion. ++// Currently used to limit read-only file descriptors and mmap file usage ++// so that we do not end up running out of file descriptors, virtual memory, ++// or running into kernel performance problems for very large databases. ++class Limiter { ++ public: ++ // Limit maximum number of resources to |n|. ++ Limiter(intptr_t n) { ++ SetAllowed(n); ++ } ++ ++ // If another resource is available, acquire it and return true. ++ // Else return false. ++ bool Acquire() { ++ if (GetAllowed() <= 0) { ++ return false; ++ } ++ MutexLock l(&mu_); ++ intptr_t x = GetAllowed(); ++ if (x <= 0) { ++ return false; ++ } else { ++ SetAllowed(x - 1); ++ return true; ++ } ++ } ++ ++ // Release a resource acquired by a previous call to Acquire() that returned ++ // true. ++ void Release() { ++ MutexLock l(&mu_); ++ SetAllowed(GetAllowed() + 1); ++ } ++ ++ private: ++ port::Mutex mu_; ++ port::AtomicPointer allowed_; ++ ++ intptr_t GetAllowed() const { ++ return reinterpret_cast(allowed_.Acquire_Load()); ++ } ++ ++ // REQUIRES: mu_ must be held ++ void SetAllowed(intptr_t v) { ++ allowed_.Release_Store(reinterpret_cast(v)); ++ } ++ ++ Limiter(const Limiter&); ++ void operator=(const Limiter&); ++}; ++ ++class PosixSequentialFile: public SequentialFile { ++ private: ++ std::string filename_; ++ FILE* file_; ++ ++ public: ++ PosixSequentialFile(const std::string& fname, FILE* f) ++ : filename_(fname), file_(f) { } ++ virtual ~PosixSequentialFile() { fclose(file_); } ++ ++ virtual Status Read(size_t n, Slice* result, char* scratch) { ++ Status s; ++ size_t r = fread_unlocked(scratch, 1, n, file_); ++ *result = Slice(scratch, r); ++ if (r < n) { ++ if (feof(file_)) { ++ // We leave status as ok if we hit the end of the file ++ } else { ++ // A partial read with an error: return a non-ok status ++ s = IOError(filename_, errno); ++ } ++ } ++ return s; ++ } ++ ++ virtual Status Skip(uint64_t n) { ++ if (fseek(file_, n, SEEK_CUR)) { ++ return IOError(filename_, errno); ++ } ++ return Status::OK(); ++ } ++}; ++ ++// pread() based random-access ++class PosixRandomAccessFile: public RandomAccessFile { ++ private: ++ std::string filename_; ++ bool temporary_fd_; // If true, fd_ is -1 and we open on every read. ++ int fd_; ++ Limiter* limiter_; ++ ++ public: ++ PosixRandomAccessFile(const std::string& fname, int fd, Limiter* limiter) ++ : filename_(fname), fd_(fd), limiter_(limiter) { ++ temporary_fd_ = !limiter->Acquire(); ++ if (temporary_fd_) { ++ // Open file on every access. ++ close(fd_); ++ fd_ = -1; ++ } ++ } ++ ++ virtual ~PosixRandomAccessFile() { ++ if (!temporary_fd_) { ++ close(fd_); ++ limiter_->Release(); ++ } ++ } ++ ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ int fd = fd_; ++ if (temporary_fd_) { ++ fd = open(filename_.c_str(), O_RDONLY); ++ if (fd < 0) { ++ return IOError(filename_, errno); ++ } ++ } ++ ++ Status s; ++ ssize_t r = pread(fd, scratch, n, static_cast(offset)); ++ *result = Slice(scratch, (r < 0) ? 0 : r); ++ if (r < 0) { ++ // An error: return a non-ok status ++ s = IOError(filename_, errno); ++ } ++ if (temporary_fd_) { ++ // Close the temporary file descriptor opened earlier. ++ close(fd); ++ } ++ return s; ++ } ++}; ++ ++// mmap() based random-access ++class PosixMmapReadableFile: public RandomAccessFile { ++ private: ++ std::string filename_; ++ void* mmapped_region_; ++ size_t length_; ++ Limiter* limiter_; ++ ++ public: ++ // base[0,length-1] contains the mmapped contents of the file. ++ PosixMmapReadableFile(const std::string& fname, void* base, size_t length, ++ Limiter* limiter) ++ : filename_(fname), mmapped_region_(base), length_(length), ++ limiter_(limiter) { ++ } ++ ++ virtual ~PosixMmapReadableFile() { ++ munmap(mmapped_region_, length_); ++ limiter_->Release(); ++ } ++ ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ Status s; ++ if (offset + n > length_) { ++ *result = Slice(); ++ s = IOError(filename_, EINVAL); ++ } else { ++ *result = Slice(reinterpret_cast(mmapped_region_) + offset, n); ++ } ++ return s; ++ } ++}; ++ ++class PosixWritableFile : public WritableFile { ++ private: ++ std::string filename_; ++ FILE* file_; ++ ++ public: ++ PosixWritableFile(const std::string& fname, FILE* f) ++ : filename_(fname), file_(f) { } ++ ++ ~PosixWritableFile() { ++ if (file_ != NULL) { ++ // Ignoring any potential errors ++ fclose(file_); ++ } ++ } ++ ++ virtual Status Append(const Slice& data) { ++ size_t r = fwrite_unlocked(data.data(), 1, data.size(), file_); ++ if (r != data.size()) { ++ return IOError(filename_, errno); ++ } ++ return Status::OK(); ++ } ++ ++ virtual Status Close() { ++ Status result; ++ if (fclose(file_) != 0) { ++ result = IOError(filename_, errno); ++ } ++ file_ = NULL; ++ return result; ++ } ++ ++ virtual Status Flush() { ++ if (fflush_unlocked(file_) != 0) { ++ return IOError(filename_, errno); ++ } ++ return Status::OK(); ++ } ++ ++ Status SyncDirIfManifest() { ++ const char* f = filename_.c_str(); ++ const char* sep = strrchr(f, '/'); ++ Slice basename; ++ std::string dir; ++ if (sep == NULL) { ++ dir = "."; ++ basename = f; ++ } else { ++ dir = std::string(f, sep - f); ++ basename = sep + 1; ++ } ++ Status s; ++ if (basename.starts_with("MANIFEST")) { ++ int fd = open(dir.c_str(), O_RDONLY); ++ if (fd < 0) { ++ s = IOError(dir, errno); ++ } else { ++ if (fsync(fd) < 0) { ++ s = IOError(dir, errno); ++ } ++ close(fd); ++ } ++ } ++ return s; ++ } ++ ++ virtual Status Sync() { ++ // Ensure new files referred to by the manifest are in the filesystem. ++ Status s = SyncDirIfManifest(); ++ if (!s.ok()) { ++ return s; ++ } ++ if (fflush_unlocked(file_) != 0 || ++ fdatasync(fileno(file_)) != 0) { ++ s = Status::IOError(filename_, strerror(errno)); ++ } ++ return s; ++ } ++}; ++ ++static int LockOrUnlock(int fd, bool lock) { ++ errno = 0; ++ struct flock f; ++ memset(&f, 0, sizeof(f)); ++ f.l_type = (lock ? F_WRLCK : F_UNLCK); ++ f.l_whence = SEEK_SET; ++ f.l_start = 0; ++ f.l_len = 0; // Lock/unlock entire file ++ return fcntl(fd, F_SETLK, &f); ++} ++ ++class PosixFileLock : public FileLock { ++ public: ++ int fd_; ++ std::string name_; ++}; ++ ++// Set of locked files. We keep a separate set instead of just ++// relying on fcntrl(F_SETLK) since fcntl(F_SETLK) does not provide ++// any protection against multiple uses from the same process. ++class PosixLockTable { ++ private: ++ port::Mutex mu_; ++ std::set locked_files_; ++ public: ++ bool Insert(const std::string& fname) { ++ MutexLock l(&mu_); ++ return locked_files_.insert(fname).second; ++ } ++ void Remove(const std::string& fname) { ++ MutexLock l(&mu_); ++ locked_files_.erase(fname); ++ } ++}; ++ ++class PosixEnv : public Env { ++ public: ++ PosixEnv(); ++ virtual ~PosixEnv() { ++ char msg[] = "Destroying Env::Default()\n"; ++ fwrite(msg, 1, sizeof(msg), stderr); ++ abort(); ++ } ++ ++ virtual Status NewSequentialFile(const std::string& fname, ++ SequentialFile** result) { ++ FILE* f = fopen(fname.c_str(), "r"); ++ if (f == NULL) { ++ *result = NULL; ++ return IOError(fname, errno); ++ } else { ++ *result = new PosixSequentialFile(fname, f); ++ return Status::OK(); ++ } ++ } ++ ++ virtual Status NewRandomAccessFile(const std::string& fname, ++ RandomAccessFile** result) { ++ *result = NULL; ++ Status s; ++ int fd = open(fname.c_str(), O_RDONLY); ++ if (fd < 0) { ++ s = IOError(fname, errno); ++ } else if (mmap_limit_.Acquire()) { ++ uint64_t size; ++ s = GetFileSize(fname, &size); ++ if (s.ok()) { ++ void* base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); ++ if (base != MAP_FAILED) { ++ *result = new PosixMmapReadableFile(fname, base, size, &mmap_limit_); ++ } else { ++ s = IOError(fname, errno); ++ } ++ } ++ close(fd); ++ if (!s.ok()) { ++ mmap_limit_.Release(); ++ } ++ } else { ++ *result = new PosixRandomAccessFile(fname, fd, &fd_limit_); ++ } ++ return s; ++ } ++ ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result) { ++ Status s; ++ FILE* f = fopen(fname.c_str(), "w"); ++ if (f == NULL) { ++ *result = NULL; ++ s = IOError(fname, errno); ++ } else { ++ *result = new PosixWritableFile(fname, f); ++ } ++ return s; ++ } ++ ++ virtual Status NewAppendableFile(const std::string& fname, ++ WritableFile** result) { ++ Status s; ++ FILE* f = fopen(fname.c_str(), "a"); ++ if (f == NULL) { ++ *result = NULL; ++ s = IOError(fname, errno); ++ } else { ++ *result = new PosixWritableFile(fname, f); ++ } ++ return s; ++ } ++ ++ virtual bool FileExists(const std::string& fname) { ++ return access(fname.c_str(), F_OK) == 0; ++ } ++ ++ virtual Status GetChildren(const std::string& dir, ++ std::vector* result) { ++ result->clear(); ++ DIR* d = opendir(dir.c_str()); ++ if (d == NULL) { ++ return IOError(dir, errno); ++ } ++ struct dirent* entry; ++ while ((entry = readdir(d)) != NULL) { ++ result->push_back(entry->d_name); ++ } ++ closedir(d); ++ return Status::OK(); ++ } ++ ++ virtual Status DeleteFile(const std::string& fname) { ++ Status result; ++ if (unlink(fname.c_str()) != 0) { ++ result = IOError(fname, errno); ++ } ++ return result; ++ } ++ ++ virtual Status CreateDir(const std::string& name) { ++ Status result; ++ if (mkdir(name.c_str(), 0755) != 0) { ++ result = IOError(name, errno); ++ } ++ return result; ++ } ++ ++ virtual Status DeleteDir(const std::string& name) { ++ Status result; ++ if (rmdir(name.c_str()) != 0) { ++ result = IOError(name, errno); ++ } ++ return result; ++ } ++ ++ virtual Status GetFileSize(const std::string& fname, uint64_t* size) { ++ Status s; ++ struct stat sbuf; ++ if (stat(fname.c_str(), &sbuf) != 0) { ++ *size = 0; ++ s = IOError(fname, errno); ++ } else { ++ *size = sbuf.st_size; ++ } ++ return s; ++ } ++ ++ virtual Status RenameFile(const std::string& src, const std::string& target) { ++ Status result; ++ if (rename(src.c_str(), target.c_str()) != 0) { ++ result = IOError(src, errno); ++ } ++ return result; ++ } ++ ++ virtual Status LockFile(const std::string& fname, FileLock** lock) { ++ *lock = NULL; ++ Status result; ++ int fd = open(fname.c_str(), O_RDWR | O_CREAT, 0644); ++ if (fd < 0) { ++ result = IOError(fname, errno); ++ } else if (!locks_.Insert(fname)) { ++ close(fd); ++ result = Status::IOError("lock " + fname, "already held by process"); ++ } else if (LockOrUnlock(fd, true) == -1) { ++ result = IOError("lock " + fname, errno); ++ close(fd); ++ locks_.Remove(fname); ++ } else { ++ PosixFileLock* my_lock = new PosixFileLock; ++ my_lock->fd_ = fd; ++ my_lock->name_ = fname; ++ *lock = my_lock; ++ } ++ return result; ++ } ++ ++ virtual Status UnlockFile(FileLock* lock) { ++ PosixFileLock* my_lock = reinterpret_cast(lock); ++ Status result; ++ if (LockOrUnlock(my_lock->fd_, false) == -1) { ++ result = IOError("unlock", errno); ++ } ++ locks_.Remove(my_lock->name_); ++ close(my_lock->fd_); ++ delete my_lock; ++ return result; ++ } ++ ++ virtual void Schedule(void (*function)(void*), void* arg); ++ ++ virtual void StartThread(void (*function)(void* arg), void* arg); ++ ++ virtual Status GetTestDirectory(std::string* result) { ++ const char* env = getenv("TEST_TMPDIR"); ++ if (env && env[0] != '\0') { ++ *result = env; ++ } else { ++ char buf[100]; ++ snprintf(buf, sizeof(buf), "/tmp/leveldbtest-%d", int(geteuid())); ++ *result = buf; ++ } ++ // Directory may already exist ++ CreateDir(*result); ++ return Status::OK(); ++ } ++ ++ static uint64_t gettid() { ++ pthread_t tid = pthread_self(); ++ uint64_t thread_id = 0; ++ memcpy(&thread_id, &tid, std::min(sizeof(thread_id), sizeof(tid))); ++ return thread_id; ++ } ++ ++ virtual Status NewLogger(const std::string& fname, Logger** result) { ++ FILE* f = fopen(fname.c_str(), "w"); ++ if (f == NULL) { ++ *result = NULL; ++ return IOError(fname, errno); ++ } else { ++ *result = new PosixLogger(f, &PosixEnv::gettid); ++ return Status::OK(); ++ } ++ } ++ ++ virtual uint64_t NowMicros() { ++ struct timeval tv; ++ gettimeofday(&tv, NULL); ++ return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; ++ } ++ ++ virtual void SleepForMicroseconds(int micros) { ++ usleep(micros); ++ } ++ ++ private: ++ void PthreadCall(const char* label, int result) { ++ if (result != 0) { ++ fprintf(stderr, "pthread %s: %s\n", label, strerror(result)); ++ abort(); ++ } ++ } ++ ++ // BGThread() is the body of the background thread ++ void BGThread(); ++ static void* BGThreadWrapper(void* arg) { ++ reinterpret_cast(arg)->BGThread(); ++ return NULL; ++ } ++ ++ pthread_mutex_t mu_; ++ pthread_cond_t bgsignal_; ++ pthread_t bgthread_; ++ bool started_bgthread_; ++ ++ // Entry per Schedule() call ++ struct BGItem { void* arg; void (*function)(void*); }; ++ typedef std::deque BGQueue; ++ BGQueue queue_; ++ ++ PosixLockTable locks_; ++ Limiter mmap_limit_; ++ Limiter fd_limit_; ++}; ++ ++// Return the maximum number of concurrent mmaps. ++static int MaxMmaps() { ++ if (mmap_limit >= 0) { ++ return mmap_limit; ++ } ++ // Up to 1000 mmaps for 64-bit binaries; none for smaller pointer sizes. ++ mmap_limit = sizeof(void*) >= 8 ? 1000 : 0; ++ return mmap_limit; ++} ++ ++// Return the maximum number of read-only files to keep open. ++static intptr_t MaxOpenFiles() { ++ if (open_read_only_file_limit >= 0) { ++ return open_read_only_file_limit; ++ } ++ struct rlimit rlim; ++ if (getrlimit(RLIMIT_NOFILE, &rlim)) { ++ // getrlimit failed, fallback to hard-coded default. ++ open_read_only_file_limit = 50; ++ } else if (rlim.rlim_cur == RLIM_INFINITY) { ++ open_read_only_file_limit = std::numeric_limits::max(); ++ } else { ++ // Allow use of 20% of available file descriptors for read-only files. ++ open_read_only_file_limit = rlim.rlim_cur / 5; ++ } ++ return open_read_only_file_limit; ++} ++ ++PosixEnv::PosixEnv() ++ : started_bgthread_(false), ++ mmap_limit_(MaxMmaps()), ++ fd_limit_(MaxOpenFiles()) { ++ PthreadCall("mutex_init", pthread_mutex_init(&mu_, NULL)); ++ PthreadCall("cvar_init", pthread_cond_init(&bgsignal_, NULL)); ++} ++ ++void PosixEnv::Schedule(void (*function)(void*), void* arg) { ++ PthreadCall("lock", pthread_mutex_lock(&mu_)); ++ ++ // Start background thread if necessary ++ if (!started_bgthread_) { ++ started_bgthread_ = true; ++ PthreadCall( ++ "create thread", ++ pthread_create(&bgthread_, NULL, &PosixEnv::BGThreadWrapper, this)); ++ } ++ ++ // If the queue is currently empty, the background thread may currently be ++ // waiting. ++ if (queue_.empty()) { ++ PthreadCall("signal", pthread_cond_signal(&bgsignal_)); ++ } ++ ++ // Add to priority queue ++ queue_.push_back(BGItem()); ++ queue_.back().function = function; ++ queue_.back().arg = arg; ++ ++ PthreadCall("unlock", pthread_mutex_unlock(&mu_)); ++} ++ ++void PosixEnv::BGThread() { ++ while (true) { ++ // Wait until there is an item that is ready to run ++ PthreadCall("lock", pthread_mutex_lock(&mu_)); ++ while (queue_.empty()) { ++ PthreadCall("wait", pthread_cond_wait(&bgsignal_, &mu_)); ++ } ++ ++ void (*function)(void*) = queue_.front().function; ++ void* arg = queue_.front().arg; ++ queue_.pop_front(); ++ ++ PthreadCall("unlock", pthread_mutex_unlock(&mu_)); ++ (*function)(arg); ++ } ++} ++ ++namespace { ++struct StartThreadState { ++ void (*user_function)(void*); ++ void* arg; ++}; ++} ++static void* StartThreadWrapper(void* arg) { ++ StartThreadState* state = reinterpret_cast(arg); ++ state->user_function(state->arg); ++ delete state; ++ return NULL; ++} ++ ++void PosixEnv::StartThread(void (*function)(void* arg), void* arg) { ++ pthread_t t; ++ StartThreadState* state = new StartThreadState; ++ state->user_function = function; ++ state->arg = arg; ++ PthreadCall("start thread", ++ pthread_create(&t, NULL, &StartThreadWrapper, state)); ++} ++ ++} // namespace ++ ++static pthread_once_t once = PTHREAD_ONCE_INIT; ++static Env* default_env; ++static void InitDefaultEnv() { default_env = new PosixEnv; } ++ ++void EnvPosixTestHelper::SetReadOnlyFDLimit(int limit) { ++ assert(default_env == NULL); ++ open_read_only_file_limit = limit; ++} ++ ++void EnvPosixTestHelper::SetReadOnlyMMapLimit(int limit) { ++ assert(default_env == NULL); ++ mmap_limit = limit; ++} ++ ++Env* Env::Default() { ++ pthread_once(&once, InitDefaultEnv); ++ return default_env; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test.cc +new file mode 100644 +index 0000000..295f8ae +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test.cc +@@ -0,0 +1,66 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/env.h" ++ ++#include "port/port.h" ++#include "util/testharness.h" ++#include "util/env_posix_test_helper.h" ++ ++namespace leveldb { ++ ++static const int kDelayMicros = 100000; ++static const int kReadOnlyFileLimit = 4; ++static const int kMMapLimit = 4; ++ ++class EnvPosixTest { ++ public: ++ Env* env_; ++ EnvPosixTest() : env_(Env::Default()) { } ++ ++ static void SetFileLimits(int read_only_file_limit, int mmap_limit) { ++ EnvPosixTestHelper::SetReadOnlyFDLimit(read_only_file_limit); ++ EnvPosixTestHelper::SetReadOnlyMMapLimit(mmap_limit); ++ } ++}; ++ ++TEST(EnvPosixTest, TestOpenOnRead) { ++ // Write some test data to a single file that will be opened |n| times. ++ std::string test_dir; ++ ASSERT_OK(env_->GetTestDirectory(&test_dir)); ++ std::string test_file = test_dir + "/open_on_read.txt"; ++ ++ FILE* f = fopen(test_file.c_str(), "w"); ++ ASSERT_TRUE(f != NULL); ++ const char kFileData[] = "abcdefghijklmnopqrstuvwxyz"; ++ fputs(kFileData, f); ++ fclose(f); ++ ++ // Open test file some number above the sum of the two limits to force ++ // open-on-read behavior of POSIX Env leveldb::RandomAccessFile. ++ const int kNumFiles = kReadOnlyFileLimit + kMMapLimit + 5; ++ leveldb::RandomAccessFile* files[kNumFiles] = {0}; ++ for (int i = 0; i < kNumFiles; i++) { ++ ASSERT_OK(env_->NewRandomAccessFile(test_file, &files[i])); ++ } ++ char scratch; ++ Slice read_result; ++ for (int i = 0; i < kNumFiles; i++) { ++ ASSERT_OK(files[i]->Read(i, 1, &read_result, &scratch)); ++ ASSERT_EQ(kFileData[i], read_result[0]); ++ } ++ for (int i = 0; i < kNumFiles; i++) { ++ delete files[i]; ++ } ++ ASSERT_OK(env_->DeleteFile(test_file)); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ // All tests currently run with the same read-only file limits. ++ leveldb::EnvPosixTest::SetFileLimits(leveldb::kReadOnlyFileLimit, ++ leveldb::kMMapLimit); ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test_helper.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test_helper.h +new file mode 100644 +index 0000000..0386960 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test_helper.h +@@ -0,0 +1,28 @@ ++// Copyright 2017 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_ENV_POSIX_TEST_HELPER_H_ ++#define STORAGE_LEVELDB_UTIL_ENV_POSIX_TEST_HELPER_H_ ++ ++namespace leveldb { ++ ++class EnvPosixTest; ++ ++// A helper for the POSIX Env to facilitate testing. ++class EnvPosixTestHelper { ++ private: ++ friend class EnvPosixTest; ++ ++ // Set the maximum number of read-only files that will be opened. ++ // Must be called before creating an Env. ++ static void SetReadOnlyFDLimit(int limit); ++ ++ // Set the maximum number of read-only files that will be mapped via mmap. ++ // Must be called before creating an Env. ++ static void SetReadOnlyMMapLimit(int limit); ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_ENV_POSIX_TEST_HELPER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_test.cc +new file mode 100644 +index 0000000..839ae56 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_test.cc +@@ -0,0 +1,106 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/env.h" ++ ++#include "port/port.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++static const int kDelayMicros = 100000; ++static const int kReadOnlyFileLimit = 4; ++static const int kMMapLimit = 4; ++ ++class EnvTest { ++ private: ++ port::Mutex mu_; ++ std::string events_; ++ ++ public: ++ Env* env_; ++ EnvTest() : env_(Env::Default()) { } ++}; ++ ++static void SetBool(void* ptr) { ++ reinterpret_cast(ptr)->NoBarrier_Store(ptr); ++} ++ ++TEST(EnvTest, RunImmediately) { ++ port::AtomicPointer called (NULL); ++ env_->Schedule(&SetBool, &called); ++ env_->SleepForMicroseconds(kDelayMicros); ++ ASSERT_TRUE(called.NoBarrier_Load() != NULL); ++} ++ ++TEST(EnvTest, RunMany) { ++ port::AtomicPointer last_id (NULL); ++ ++ struct CB { ++ port::AtomicPointer* last_id_ptr; // Pointer to shared slot ++ uintptr_t id; // Order# for the execution of this callback ++ ++ CB(port::AtomicPointer* p, int i) : last_id_ptr(p), id(i) { } ++ ++ static void Run(void* v) { ++ CB* cb = reinterpret_cast(v); ++ void* cur = cb->last_id_ptr->NoBarrier_Load(); ++ ASSERT_EQ(cb->id-1, reinterpret_cast(cur)); ++ cb->last_id_ptr->Release_Store(reinterpret_cast(cb->id)); ++ } ++ }; ++ ++ // Schedule in different order than start time ++ CB cb1(&last_id, 1); ++ CB cb2(&last_id, 2); ++ CB cb3(&last_id, 3); ++ CB cb4(&last_id, 4); ++ env_->Schedule(&CB::Run, &cb1); ++ env_->Schedule(&CB::Run, &cb2); ++ env_->Schedule(&CB::Run, &cb3); ++ env_->Schedule(&CB::Run, &cb4); ++ ++ env_->SleepForMicroseconds(kDelayMicros); ++ void* cur = last_id.Acquire_Load(); ++ ASSERT_EQ(4, reinterpret_cast(cur)); ++} ++ ++struct State { ++ port::Mutex mu; ++ int val; ++ int num_running; ++}; ++ ++static void ThreadBody(void* arg) { ++ State* s = reinterpret_cast(arg); ++ s->mu.Lock(); ++ s->val += 1; ++ s->num_running -= 1; ++ s->mu.Unlock(); ++} ++ ++TEST(EnvTest, StartThread) { ++ State state; ++ state.val = 0; ++ state.num_running = 3; ++ for (int i = 0; i < 3; i++) { ++ env_->StartThread(&ThreadBody, &state); ++ } ++ while (true) { ++ state.mu.Lock(); ++ int num = state.num_running; ++ state.mu.Unlock(); ++ if (num == 0) { ++ break; ++ } ++ env_->SleepForMicroseconds(kDelayMicros); ++ } ++ ASSERT_EQ(state.val, 3); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/filter_policy.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/filter_policy.cc +new file mode 100644 +index 0000000..7b045c8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/filter_policy.cc +@@ -0,0 +1,11 @@ ++// Copyright (c) 2012 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/filter_policy.h" ++ ++namespace leveldb { ++ ++FilterPolicy::~FilterPolicy() { } ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.cc +new file mode 100644 +index 0000000..ed439ce +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.cc +@@ -0,0 +1,52 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include "util/coding.h" ++#include "util/hash.h" ++ ++// The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through ++// between switch labels. The real definition should be provided externally. ++// This one is a fallback version for unsupported compilers. ++#ifndef FALLTHROUGH_INTENDED ++#define FALLTHROUGH_INTENDED do { } while (0) ++#endif ++ ++namespace leveldb { ++ ++uint32_t Hash(const char* data, size_t n, uint32_t seed) { ++ // Similar to murmur hash ++ const uint32_t m = 0xc6a4a793; ++ const uint32_t r = 24; ++ const char* limit = data + n; ++ uint32_t h = seed ^ (n * m); ++ ++ // Pick up four bytes at a time ++ while (data + 4 <= limit) { ++ uint32_t w = DecodeFixed32(data); ++ data += 4; ++ h += w; ++ h *= m; ++ h ^= (h >> 16); ++ } ++ ++ // Pick up remaining bytes ++ switch (limit - data) { ++ case 3: ++ h += static_cast(data[2]) << 16; ++ FALLTHROUGH_INTENDED; ++ case 2: ++ h += static_cast(data[1]) << 8; ++ FALLTHROUGH_INTENDED; ++ case 1: ++ h += static_cast(data[0]); ++ h *= m; ++ h ^= (h >> r); ++ break; ++ } ++ return h; ++} ++ ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.h +new file mode 100644 +index 0000000..8889d56 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.h +@@ -0,0 +1,19 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Simple hash function used for internal data structures ++ ++#ifndef STORAGE_LEVELDB_UTIL_HASH_H_ ++#define STORAGE_LEVELDB_UTIL_HASH_H_ ++ ++#include ++#include ++ ++namespace leveldb { ++ ++extern uint32_t Hash(const char* data, size_t n, uint32_t seed); ++ ++} ++ ++#endif // STORAGE_LEVELDB_UTIL_HASH_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash_test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash_test.cc +new file mode 100644 +index 0000000..eaa1c92 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash_test.cc +@@ -0,0 +1,54 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/hash.h" ++#include "util/testharness.h" ++ ++namespace leveldb { ++ ++class HASH { }; ++ ++TEST(HASH, SignedUnsignedIssue) { ++ const unsigned char data1[1] = {0x62}; ++ const unsigned char data2[2] = {0xc3, 0x97}; ++ const unsigned char data3[3] = {0xe2, 0x99, 0xa5}; ++ const unsigned char data4[4] = {0xe1, 0x80, 0xb9, 0x32}; ++ const unsigned char data5[48] = { ++ 0x01, 0xc0, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x14, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x04, 0x00, ++ 0x00, 0x00, 0x00, 0x14, ++ 0x00, 0x00, 0x00, 0x18, ++ 0x28, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ 0x02, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, ++ }; ++ ++ ASSERT_EQ(Hash(0, 0, 0xbc9f1d34), 0xbc9f1d34); ++ ASSERT_EQ( ++ Hash(reinterpret_cast(data1), sizeof(data1), 0xbc9f1d34), ++ 0xef1345c4); ++ ASSERT_EQ( ++ Hash(reinterpret_cast(data2), sizeof(data2), 0xbc9f1d34), ++ 0x5b663814); ++ ASSERT_EQ( ++ Hash(reinterpret_cast(data3), sizeof(data3), 0xbc9f1d34), ++ 0x323c078f); ++ ASSERT_EQ( ++ Hash(reinterpret_cast(data4), sizeof(data4), 0xbc9f1d34), ++ 0xed21633a); ++ ASSERT_EQ( ++ Hash(reinterpret_cast(data5), sizeof(data5), 0x12345678), ++ 0xf333dabb); ++} ++ ++} // namespace leveldb ++ ++int main(int argc, char** argv) { ++ return leveldb::test::RunAllTests(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.cc +new file mode 100644 +index 0000000..bb95f58 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.cc +@@ -0,0 +1,139 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include ++#include "port/port.h" ++#include "util/histogram.h" ++ ++namespace leveldb { ++ ++const double Histogram::kBucketLimit[kNumBuckets] = { ++ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 25, 30, 35, 40, 45, ++ 50, 60, 70, 80, 90, 100, 120, 140, 160, 180, 200, 250, 300, 350, 400, 450, ++ 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000, 2500, 3000, ++ 3500, 4000, 4500, 5000, 6000, 7000, 8000, 9000, 10000, 12000, 14000, ++ 16000, 18000, 20000, 25000, 30000, 35000, 40000, 45000, 50000, 60000, ++ 70000, 80000, 90000, 100000, 120000, 140000, 160000, 180000, 200000, ++ 250000, 300000, 350000, 400000, 450000, 500000, 600000, 700000, 800000, ++ 900000, 1000000, 1200000, 1400000, 1600000, 1800000, 2000000, 2500000, ++ 3000000, 3500000, 4000000, 4500000, 5000000, 6000000, 7000000, 8000000, ++ 9000000, 10000000, 12000000, 14000000, 16000000, 18000000, 20000000, ++ 25000000, 30000000, 35000000, 40000000, 45000000, 50000000, 60000000, ++ 70000000, 80000000, 90000000, 100000000, 120000000, 140000000, 160000000, ++ 180000000, 200000000, 250000000, 300000000, 350000000, 400000000, ++ 450000000, 500000000, 600000000, 700000000, 800000000, 900000000, ++ 1000000000, 1200000000, 1400000000, 1600000000, 1800000000, 2000000000, ++ 2500000000.0, 3000000000.0, 3500000000.0, 4000000000.0, 4500000000.0, ++ 5000000000.0, 6000000000.0, 7000000000.0, 8000000000.0, 9000000000.0, ++ 1e200, ++}; ++ ++void Histogram::Clear() { ++ min_ = kBucketLimit[kNumBuckets-1]; ++ max_ = 0; ++ num_ = 0; ++ sum_ = 0; ++ sum_squares_ = 0; ++ for (int i = 0; i < kNumBuckets; i++) { ++ buckets_[i] = 0; ++ } ++} ++ ++void Histogram::Add(double value) { ++ // Linear search is fast enough for our usage in db_bench ++ int b = 0; ++ while (b < kNumBuckets - 1 && kBucketLimit[b] <= value) { ++ b++; ++ } ++ buckets_[b] += 1.0; ++ if (min_ > value) min_ = value; ++ if (max_ < value) max_ = value; ++ num_++; ++ sum_ += value; ++ sum_squares_ += (value * value); ++} ++ ++void Histogram::Merge(const Histogram& other) { ++ if (other.min_ < min_) min_ = other.min_; ++ if (other.max_ > max_) max_ = other.max_; ++ num_ += other.num_; ++ sum_ += other.sum_; ++ sum_squares_ += other.sum_squares_; ++ for (int b = 0; b < kNumBuckets; b++) { ++ buckets_[b] += other.buckets_[b]; ++ } ++} ++ ++double Histogram::Median() const { ++ return Percentile(50.0); ++} ++ ++double Histogram::Percentile(double p) const { ++ double threshold = num_ * (p / 100.0); ++ double sum = 0; ++ for (int b = 0; b < kNumBuckets; b++) { ++ sum += buckets_[b]; ++ if (sum >= threshold) { ++ // Scale linearly within this bucket ++ double left_point = (b == 0) ? 0 : kBucketLimit[b-1]; ++ double right_point = kBucketLimit[b]; ++ double left_sum = sum - buckets_[b]; ++ double right_sum = sum; ++ double pos = (threshold - left_sum) / (right_sum - left_sum); ++ double r = left_point + (right_point - left_point) * pos; ++ if (r < min_) r = min_; ++ if (r > max_) r = max_; ++ return r; ++ } ++ } ++ return max_; ++} ++ ++double Histogram::Average() const { ++ if (num_ == 0.0) return 0; ++ return sum_ / num_; ++} ++ ++double Histogram::StandardDeviation() const { ++ if (num_ == 0.0) return 0; ++ double variance = (sum_squares_ * num_ - sum_ * sum_) / (num_ * num_); ++ return sqrt(variance); ++} ++ ++std::string Histogram::ToString() const { ++ std::string r; ++ char buf[200]; ++ snprintf(buf, sizeof(buf), ++ "Count: %.0f Average: %.4f StdDev: %.2f\n", ++ num_, Average(), StandardDeviation()); ++ r.append(buf); ++ snprintf(buf, sizeof(buf), ++ "Min: %.4f Median: %.4f Max: %.4f\n", ++ (num_ == 0.0 ? 0.0 : min_), Median(), max_); ++ r.append(buf); ++ r.append("------------------------------------------------------\n"); ++ const double mult = 100.0 / num_; ++ double sum = 0; ++ for (int b = 0; b < kNumBuckets; b++) { ++ if (buckets_[b] <= 0.0) continue; ++ sum += buckets_[b]; ++ snprintf(buf, sizeof(buf), ++ "[ %7.0f, %7.0f ) %7.0f %7.3f%% %7.3f%% ", ++ ((b == 0) ? 0.0 : kBucketLimit[b-1]), // left ++ kBucketLimit[b], // right ++ buckets_[b], // count ++ mult * buckets_[b], // percentage ++ mult * sum); // cumulative percentage ++ r.append(buf); ++ ++ // Add hash marks based on percentage; 20 marks for 100%. ++ int marks = static_cast(20*(buckets_[b] / num_) + 0.5); ++ r.append(marks, '#'); ++ r.push_back('\n'); ++ } ++ return r; ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.h +new file mode 100644 +index 0000000..1ef9f3c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.h +@@ -0,0 +1,42 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_HISTOGRAM_H_ ++#define STORAGE_LEVELDB_UTIL_HISTOGRAM_H_ ++ ++#include ++ ++namespace leveldb { ++ ++class Histogram { ++ public: ++ Histogram() { } ++ ~Histogram() { } ++ ++ void Clear(); ++ void Add(double value); ++ void Merge(const Histogram& other); ++ ++ std::string ToString() const; ++ ++ private: ++ double min_; ++ double max_; ++ double num_; ++ double sum_; ++ double sum_squares_; ++ ++ enum { kNumBuckets = 154 }; ++ static const double kBucketLimit[kNumBuckets]; ++ double buckets_[kNumBuckets]; ++ ++ double Median() const; ++ double Percentile(double p) const; ++ double Average() const; ++ double StandardDeviation() const; ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_HISTOGRAM_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.cc +new file mode 100644 +index 0000000..ca6b324 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.cc +@@ -0,0 +1,72 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/logging.h" ++ ++#include ++#include ++#include ++#include ++#include "leveldb/env.h" ++#include "leveldb/slice.h" ++ ++namespace leveldb { ++ ++void AppendNumberTo(std::string* str, uint64_t num) { ++ char buf[30]; ++ snprintf(buf, sizeof(buf), "%llu", (unsigned long long) num); ++ str->append(buf); ++} ++ ++void AppendEscapedStringTo(std::string* str, const Slice& value) { ++ for (size_t i = 0; i < value.size(); i++) { ++ char c = value[i]; ++ if (c >= ' ' && c <= '~') { ++ str->push_back(c); ++ } else { ++ char buf[10]; ++ snprintf(buf, sizeof(buf), "\\x%02x", ++ static_cast(c) & 0xff); ++ str->append(buf); ++ } ++ } ++} ++ ++std::string NumberToString(uint64_t num) { ++ std::string r; ++ AppendNumberTo(&r, num); ++ return r; ++} ++ ++std::string EscapeString(const Slice& value) { ++ std::string r; ++ AppendEscapedStringTo(&r, value); ++ return r; ++} ++ ++bool ConsumeDecimalNumber(Slice* in, uint64_t* val) { ++ uint64_t v = 0; ++ int digits = 0; ++ while (!in->empty()) { ++ char c = (*in)[0]; ++ if (c >= '0' && c <= '9') { ++ ++digits; ++ const int delta = (c - '0'); ++ static const uint64_t kMaxUint64 = ~static_cast(0); ++ if (v > kMaxUint64/10 || ++ (v == kMaxUint64/10 && delta > kMaxUint64%10)) { ++ // Overflow ++ return false; ++ } ++ v = (v * 10) + delta; ++ in->remove_prefix(1); ++ } else { ++ break; ++ } ++ } ++ *val = v; ++ return (digits > 0); ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.h +new file mode 100644 +index 0000000..1b450d2 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.h +@@ -0,0 +1,43 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Must not be included from any .h files to avoid polluting the namespace ++// with macros. ++ ++#ifndef STORAGE_LEVELDB_UTIL_LOGGING_H_ ++#define STORAGE_LEVELDB_UTIL_LOGGING_H_ ++ ++#include ++#include ++#include ++#include "port/port.h" ++ ++namespace leveldb { ++ ++class Slice; ++class WritableFile; ++ ++// Append a human-readable printout of "num" to *str ++extern void AppendNumberTo(std::string* str, uint64_t num); ++ ++// Append a human-readable printout of "value" to *str. ++// Escapes any non-printable characters found in "value". ++extern void AppendEscapedStringTo(std::string* str, const Slice& value); ++ ++// Return a human-readable printout of "num" ++extern std::string NumberToString(uint64_t num); ++ ++// Return a human-readable version of "value". ++// Escapes any non-printable characters found in "value". ++extern std::string EscapeString(const Slice& value); ++ ++// Parse a human-readable number from "*in" into *value. On success, ++// advances "*in" past the consumed number and sets "*val" to the ++// numeric value. Otherwise, returns false and leaves *in in an ++// unspecified state. ++extern bool ConsumeDecimalNumber(Slice* in, uint64_t* val); ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_LOGGING_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/mutexlock.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/mutexlock.h +new file mode 100644 +index 0000000..1ff5a9e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/mutexlock.h +@@ -0,0 +1,41 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_ ++#define STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_ ++ ++#include "port/port.h" ++#include "port/thread_annotations.h" ++ ++namespace leveldb { ++ ++// Helper class that locks a mutex on construction and unlocks the mutex when ++// the destructor of the MutexLock object is invoked. ++// ++// Typical usage: ++// ++// void MyClass::MyMethod() { ++// MutexLock l(&mu_); // mu_ is an instance variable ++// ... some complex code, possibly with multiple return paths ... ++// } ++ ++class SCOPED_LOCKABLE MutexLock { ++ public: ++ explicit MutexLock(port::Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu) ++ : mu_(mu) { ++ this->mu_->Lock(); ++ } ++ ~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); } ++ ++ private: ++ port::Mutex *const mu_; ++ // No copying allowed ++ MutexLock(const MutexLock&); ++ void operator=(const MutexLock&); ++}; ++ ++} // namespace leveldb ++ ++ ++#endif // STORAGE_LEVELDB_UTIL_MUTEXLOCK_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/options.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/options.cc +new file mode 100644 +index 0000000..b5e6227 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/options.cc +@@ -0,0 +1,30 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "leveldb/options.h" ++ ++#include "leveldb/comparator.h" ++#include "leveldb/env.h" ++ ++namespace leveldb { ++ ++Options::Options() ++ : comparator(BytewiseComparator()), ++ create_if_missing(false), ++ error_if_exists(false), ++ paranoid_checks(false), ++ env(Env::Default()), ++ info_log(NULL), ++ write_buffer_size(4<<20), ++ max_open_files(1000), ++ block_cache(NULL), ++ block_size(4096), ++ block_restart_interval(16), ++ max_file_size(2<<20), ++ compression(kSnappyCompression), ++ reuse_logs(false), ++ filter_policy(NULL) { ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/posix_logger.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/posix_logger.h +new file mode 100644 +index 0000000..9741b1a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/posix_logger.h +@@ -0,0 +1,98 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// Logger implementation that can be shared by all environments ++// where enough posix functionality is available. ++ ++#ifndef STORAGE_LEVELDB_UTIL_POSIX_LOGGER_H_ ++#define STORAGE_LEVELDB_UTIL_POSIX_LOGGER_H_ ++ ++#include ++#include ++#include ++#include ++#include "leveldb/env.h" ++ ++namespace leveldb { ++ ++class PosixLogger : public Logger { ++ private: ++ FILE* file_; ++ uint64_t (*gettid_)(); // Return the thread id for the current thread ++ public: ++ PosixLogger(FILE* f, uint64_t (*gettid)()) : file_(f), gettid_(gettid) { } ++ virtual ~PosixLogger() { ++ fclose(file_); ++ } ++ virtual void Logv(const char* format, va_list ap) { ++ const uint64_t thread_id = (*gettid_)(); ++ ++ // We try twice: the first time with a fixed-size stack allocated buffer, ++ // and the second time with a much larger dynamically allocated buffer. ++ char buffer[500]; ++ for (int iter = 0; iter < 2; iter++) { ++ char* base; ++ int bufsize; ++ if (iter == 0) { ++ bufsize = sizeof(buffer); ++ base = buffer; ++ } else { ++ bufsize = 30000; ++ base = new char[bufsize]; ++ } ++ char* p = base; ++ char* limit = base + bufsize; ++ ++ struct timeval now_tv; ++ gettimeofday(&now_tv, NULL); ++ const time_t seconds = now_tv.tv_sec; ++ struct tm t; ++ localtime_r(&seconds, &t); ++ p += snprintf(p, limit - p, ++ "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ", ++ t.tm_year + 1900, ++ t.tm_mon + 1, ++ t.tm_mday, ++ t.tm_hour, ++ t.tm_min, ++ t.tm_sec, ++ static_cast(now_tv.tv_usec), ++ static_cast(thread_id)); ++ ++ // Print the message ++ if (p < limit) { ++ va_list backup_ap; ++ va_copy(backup_ap, ap); ++ p += vsnprintf(p, limit - p, format, backup_ap); ++ va_end(backup_ap); ++ } ++ ++ // Truncate to available space if necessary ++ if (p >= limit) { ++ if (iter == 0) { ++ continue; // Try again with larger buffer ++ } else { ++ p = limit - 1; ++ } ++ } ++ ++ // Add newline if necessary ++ if (p == base || p[-1] != '\n') { ++ *p++ = '\n'; ++ } ++ ++ assert(p <= limit); ++ fwrite(base, 1, p - base, file_); ++ fflush(file_); ++ if (base != buffer) { ++ delete[] base; ++ } ++ break; ++ } ++ } ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_POSIX_LOGGER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/random.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/random.h +new file mode 100644 +index 0000000..ddd51b1 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/random.h +@@ -0,0 +1,64 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_RANDOM_H_ ++#define STORAGE_LEVELDB_UTIL_RANDOM_H_ ++ ++#include ++ ++namespace leveldb { ++ ++// A very simple random number generator. Not especially good at ++// generating truly random bits, but good enough for our needs in this ++// package. ++class Random { ++ private: ++ uint32_t seed_; ++ public: ++ explicit Random(uint32_t s) : seed_(s & 0x7fffffffu) { ++ // Avoid bad seeds. ++ if (seed_ == 0 || seed_ == 2147483647L) { ++ seed_ = 1; ++ } ++ } ++ uint32_t Next() { ++ static const uint32_t M = 2147483647L; // 2^31-1 ++ static const uint64_t A = 16807; // bits 14, 8, 7, 5, 2, 1, 0 ++ // We are computing ++ // seed_ = (seed_ * A) % M, where M = 2^31-1 ++ // ++ // seed_ must not be zero or M, or else all subsequent computed values ++ // will be zero or M respectively. For all other values, seed_ will end ++ // up cycling through every number in [1,M-1] ++ uint64_t product = seed_ * A; ++ ++ // Compute (product % M) using the fact that ((x << 31) % M) == x. ++ seed_ = static_cast((product >> 31) + (product & M)); ++ // The first reduction may overflow by 1 bit, so we may need to ++ // repeat. mod == M is not possible; using > allows the faster ++ // sign-bit-based test. ++ if (seed_ > M) { ++ seed_ -= M; ++ } ++ return seed_; ++ } ++ // Returns a uniformly distributed value in the range [0..n-1] ++ // REQUIRES: n > 0 ++ uint32_t Uniform(int n) { return Next() % n; } ++ ++ // Randomly returns true ~"1/n" of the time, and false otherwise. ++ // REQUIRES: n > 0 ++ bool OneIn(int n) { return (Next() % n) == 0; } ++ ++ // Skewed: pick "base" uniformly from range [0,max_log] and then ++ // return "base" random bits. The effect is to pick a number in the ++ // range [0,2^max_log-1] with exponential bias towards smaller numbers. ++ uint32_t Skewed(int max_log) { ++ return Uniform(1 << Uniform(max_log + 1)); ++ } ++}; ++ ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_RANDOM_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/status.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/status.cc +new file mode 100644 +index 0000000..a44f35b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/status.cc +@@ -0,0 +1,75 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include ++#include "port/port.h" ++#include "leveldb/status.h" ++ ++namespace leveldb { ++ ++const char* Status::CopyState(const char* state) { ++ uint32_t size; ++ memcpy(&size, state, sizeof(size)); ++ char* result = new char[size + 5]; ++ memcpy(result, state, size + 5); ++ return result; ++} ++ ++Status::Status(Code code, const Slice& msg, const Slice& msg2) { ++ assert(code != kOk); ++ const uint32_t len1 = msg.size(); ++ const uint32_t len2 = msg2.size(); ++ const uint32_t size = len1 + (len2 ? (2 + len2) : 0); ++ char* result = new char[size + 5]; ++ memcpy(result, &size, sizeof(size)); ++ result[4] = static_cast(code); ++ memcpy(result + 5, msg.data(), len1); ++ if (len2) { ++ result[5 + len1] = ':'; ++ result[6 + len1] = ' '; ++ memcpy(result + 7 + len1, msg2.data(), len2); ++ } ++ state_ = result; ++} ++ ++std::string Status::ToString() const { ++ if (state_ == NULL) { ++ return "OK"; ++ } else { ++ char tmp[30]; ++ const char* type; ++ switch (code()) { ++ case kOk: ++ type = "OK"; ++ break; ++ case kNotFound: ++ type = "NotFound: "; ++ break; ++ case kCorruption: ++ type = "Corruption: "; ++ break; ++ case kNotSupported: ++ type = "Not implemented: "; ++ break; ++ case kInvalidArgument: ++ type = "Invalid argument: "; ++ break; ++ case kIOError: ++ type = "IO error: "; ++ break; ++ default: ++ snprintf(tmp, sizeof(tmp), "Unknown code(%d): ", ++ static_cast(code())); ++ type = tmp; ++ break; ++ } ++ std::string result(type); ++ uint32_t length; ++ memcpy(&length, state_, sizeof(length)); ++ result.append(state_ + 5, length); ++ return result; ++ } ++} ++ ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.cc +new file mode 100644 +index 0000000..402fab3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.cc +@@ -0,0 +1,77 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/testharness.h" ++ ++#include ++#include ++#include ++#include ++ ++namespace leveldb { ++namespace test { ++ ++namespace { ++struct Test { ++ const char* base; ++ const char* name; ++ void (*func)(); ++}; ++std::vector* tests; ++} ++ ++bool RegisterTest(const char* base, const char* name, void (*func)()) { ++ if (tests == NULL) { ++ tests = new std::vector; ++ } ++ Test t; ++ t.base = base; ++ t.name = name; ++ t.func = func; ++ tests->push_back(t); ++ return true; ++} ++ ++int RunAllTests() { ++ const char* matcher = getenv("LEVELDB_TESTS"); ++ ++ int num = 0; ++ if (tests != NULL) { ++ for (size_t i = 0; i < tests->size(); i++) { ++ const Test& t = (*tests)[i]; ++ if (matcher != NULL) { ++ std::string name = t.base; ++ name.push_back('.'); ++ name.append(t.name); ++ if (strstr(name.c_str(), matcher) == NULL) { ++ continue; ++ } ++ } ++ fprintf(stderr, "==== Test %s.%s\n", t.base, t.name); ++ (*t.func)(); ++ ++num; ++ } ++ } ++ fprintf(stderr, "==== PASSED %d tests\n", num); ++ return 0; ++} ++ ++std::string TmpDir() { ++ std::string dir; ++ Status s = Env::Default()->GetTestDirectory(&dir); ++ ASSERT_TRUE(s.ok()) << s.ToString(); ++ return dir; ++} ++ ++int RandomSeed() { ++ const char* env = getenv("TEST_RANDOM_SEED"); ++ int result = (env != NULL ? atoi(env) : 301); ++ if (result <= 0) { ++ result = 301; ++ } ++ return result; ++} ++ ++} // namespace test ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.h +new file mode 100644 +index 0000000..da4fe68 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.h +@@ -0,0 +1,138 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_TESTHARNESS_H_ ++#define STORAGE_LEVELDB_UTIL_TESTHARNESS_H_ ++ ++#include ++#include ++#include ++#include "leveldb/env.h" ++#include "leveldb/slice.h" ++#include "util/random.h" ++ ++namespace leveldb { ++namespace test { ++ ++// Run some of the tests registered by the TEST() macro. If the ++// environment variable "LEVELDB_TESTS" is not set, runs all tests. ++// Otherwise, runs only the tests whose name contains the value of ++// "LEVELDB_TESTS" as a substring. E.g., suppose the tests are: ++// TEST(Foo, Hello) { ... } ++// TEST(Foo, World) { ... } ++// LEVELDB_TESTS=Hello will run the first test ++// LEVELDB_TESTS=o will run both tests ++// LEVELDB_TESTS=Junk will run no tests ++// ++// Returns 0 if all tests pass. ++// Dies or returns a non-zero value if some test fails. ++extern int RunAllTests(); ++ ++// Return the directory to use for temporary storage. ++extern std::string TmpDir(); ++ ++// Return a randomization seed for this run. Typically returns the ++// same number on repeated invocations of this binary, but automated ++// runs may be able to vary the seed. ++extern int RandomSeed(); ++ ++// An instance of Tester is allocated to hold temporary state during ++// the execution of an assertion. ++class Tester { ++ private: ++ bool ok_; ++ const char* fname_; ++ int line_; ++ std::stringstream ss_; ++ ++ public: ++ Tester(const char* f, int l) ++ : ok_(true), fname_(f), line_(l) { ++ } ++ ++ ~Tester() { ++ if (!ok_) { ++ fprintf(stderr, "%s:%d:%s\n", fname_, line_, ss_.str().c_str()); ++ exit(1); ++ } ++ } ++ ++ Tester& Is(bool b, const char* msg) { ++ if (!b) { ++ ss_ << " Assertion failure " << msg; ++ ok_ = false; ++ } ++ return *this; ++ } ++ ++ Tester& IsOk(const Status& s) { ++ if (!s.ok()) { ++ ss_ << " " << s.ToString(); ++ ok_ = false; ++ } ++ return *this; ++ } ++ ++#define BINARY_OP(name,op) \ ++ template \ ++ Tester& name(const X& x, const Y& y) { \ ++ if (! (x op y)) { \ ++ ss_ << " failed: " << x << (" " #op " ") << y; \ ++ ok_ = false; \ ++ } \ ++ return *this; \ ++ } ++ ++ BINARY_OP(IsEq, ==) ++ BINARY_OP(IsNe, !=) ++ BINARY_OP(IsGe, >=) ++ BINARY_OP(IsGt, >) ++ BINARY_OP(IsLe, <=) ++ BINARY_OP(IsLt, <) ++#undef BINARY_OP ++ ++ // Attach the specified value to the error message if an error has occurred ++ template ++ Tester& operator<<(const V& value) { ++ if (!ok_) { ++ ss_ << " " << value; ++ } ++ return *this; ++ } ++}; ++ ++#define ASSERT_TRUE(c) ::leveldb::test::Tester(__FILE__, __LINE__).Is((c), #c) ++#define ASSERT_OK(s) ::leveldb::test::Tester(__FILE__, __LINE__).IsOk((s)) ++#define ASSERT_EQ(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsEq((a),(b)) ++#define ASSERT_NE(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsNe((a),(b)) ++#define ASSERT_GE(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsGe((a),(b)) ++#define ASSERT_GT(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsGt((a),(b)) ++#define ASSERT_LE(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsLe((a),(b)) ++#define ASSERT_LT(a,b) ::leveldb::test::Tester(__FILE__, __LINE__).IsLt((a),(b)) ++ ++#define TCONCAT(a,b) TCONCAT1(a,b) ++#define TCONCAT1(a,b) a##b ++ ++#define TEST(base,name) \ ++class TCONCAT(_Test_,name) : public base { \ ++ public: \ ++ void _Run(); \ ++ static void _RunIt() { \ ++ TCONCAT(_Test_,name) t; \ ++ t._Run(); \ ++ } \ ++}; \ ++bool TCONCAT(_Test_ignored_,name) = \ ++ ::leveldb::test::RegisterTest(#base, #name, &TCONCAT(_Test_,name)::_RunIt); \ ++void TCONCAT(_Test_,name)::_Run() ++ ++// Register the specified test. Typically not used directly, but ++// invoked via the macro expansion of TEST. ++extern bool RegisterTest(const char* base, const char* name, void (*func)()); ++ ++ ++} // namespace test ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_TESTHARNESS_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.cc +new file mode 100644 +index 0000000..bee56bf +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.cc +@@ -0,0 +1,51 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "util/testutil.h" ++ ++#include "util/random.h" ++ ++namespace leveldb { ++namespace test { ++ ++Slice RandomString(Random* rnd, int len, std::string* dst) { ++ dst->resize(len); ++ for (int i = 0; i < len; i++) { ++ (*dst)[i] = static_cast(' ' + rnd->Uniform(95)); // ' ' .. '~' ++ } ++ return Slice(*dst); ++} ++ ++std::string RandomKey(Random* rnd, int len) { ++ // Make sure to generate a wide variety of characters so we ++ // test the boundary conditions for short-key optimizations. ++ static const char kTestChars[] = { ++ '\0', '\1', 'a', 'b', 'c', 'd', 'e', '\xfd', '\xfe', '\xff' ++ }; ++ std::string result; ++ for (int i = 0; i < len; i++) { ++ result += kTestChars[rnd->Uniform(sizeof(kTestChars))]; ++ } ++ return result; ++} ++ ++ ++extern Slice CompressibleString(Random* rnd, double compressed_fraction, ++ size_t len, std::string* dst) { ++ int raw = static_cast(len * compressed_fraction); ++ if (raw < 1) raw = 1; ++ std::string raw_data; ++ RandomString(rnd, raw, &raw_data); ++ ++ // Duplicate the random data until we have filled "len" bytes ++ dst->clear(); ++ while (dst->size() < len) { ++ dst->append(raw_data); ++ } ++ dst->resize(len); ++ return Slice(*dst); ++} ++ ++} // namespace test ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.h +new file mode 100644 +index 0000000..d7e4583 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.h +@@ -0,0 +1,63 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#ifndef STORAGE_LEVELDB_UTIL_TESTUTIL_H_ ++#define STORAGE_LEVELDB_UTIL_TESTUTIL_H_ ++ ++#include "leveldb/env.h" ++#include "leveldb/slice.h" ++#include "util/random.h" ++ ++namespace leveldb { ++namespace test { ++ ++// Store in *dst a random string of length "len" and return a Slice that ++// references the generated data. ++extern Slice RandomString(Random* rnd, int len, std::string* dst); ++ ++// Return a random key with the specified length that may contain interesting ++// characters (e.g. \x00, \xff, etc.). ++extern std::string RandomKey(Random* rnd, int len); ++ ++// Store in *dst a string of length "len" that will compress to ++// "N*compressed_fraction" bytes and return a Slice that references ++// the generated data. ++extern Slice CompressibleString(Random* rnd, double compressed_fraction, ++ size_t len, std::string* dst); ++ ++// A wrapper that allows injection of errors. ++class ErrorEnv : public EnvWrapper { ++ public: ++ bool writable_file_error_; ++ int num_writable_file_errors_; ++ ++ ErrorEnv() : EnvWrapper(Env::Default()), ++ writable_file_error_(false), ++ num_writable_file_errors_(0) { } ++ ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result) { ++ if (writable_file_error_) { ++ ++num_writable_file_errors_; ++ *result = NULL; ++ return Status::IOError(fname, "fake error"); ++ } ++ return target()->NewWritableFile(fname, result); ++ } ++ ++ virtual Status NewAppendableFile(const std::string& fname, ++ WritableFile** result) { ++ if (writable_file_error_) { ++ ++num_writable_file_errors_; ++ *result = NULL; ++ return Status::IOError(fname, "fake error"); ++ } ++ return target()->NewAppendableFile(fname, result); ++ } ++}; ++ ++} // namespace test ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_UTIL_TESTUTIL_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb.gyp b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb.gyp +new file mode 100644 +index 0000000..27881c9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/leveldb.gyp +@@ -0,0 +1,269 @@ ++{ ++ "targets": [{ ++ "target_name": "leveldb", ++ "variables": { ++ "ldbversion": "1.20" ++ }, ++ "type": "static_library", ++ "standalone_static_library": 1, ++ "dependencies": [ ++ "../snappy/snappy.gyp:snappy" ++ ], ++ "direct_dependent_settings": { ++ "include_dirs": [ ++ "leveldb-<(ldbversion)/include/", ++ "leveldb-<(ldbversion)/port/", ++ "leveldb-<(ldbversion)/util", ++ "leveldb-<(ldbversion)/" ++ ] ++ }, ++ "defines": [ ++ "SNAPPY=1" ++ ], ++ "include_dirs": [ ++ "leveldb-<(ldbversion)/", ++ "leveldb-<(ldbversion)/include/" ++ ], ++ "conditions": [ ++ ["OS == 'win'", { ++ "conditions": [ ++ ["MSVS_VERSION != '2015' and MSVS_VERSION != '2013'", { ++ "include_dirs": [ "leveldb-<(ldbversion)/port/win" ] ++ }] ++ ], ++ "include_dirs": [ ++ "port-libuv/" ++ ], ++ "defines": [ ++ "LEVELDB_PLATFORM_UV=1", ++ "NOMINMAX=1", ++ "_HAS_EXCEPTIONS=0" ++ ], ++ "sources": [ ++ "port-libuv/port_uv.cc", ++ "port-libuv/env_win.cc", ++ "port-libuv/win_logger.cc" ++ ], ++ "msvs_settings": { ++ "VCCLCompilerTool": { ++ "RuntimeTypeInfo": "false", ++ "EnableFunctionLevelLinking": "true", ++ "ExceptionHandling": "2", ++ "DisableSpecificWarnings": [ "4355", "4530" ,"4267", "4244" ] ++ } ++ } ++ }, { ++ "sources": [ ++ "leveldb-<(ldbversion)/port/port_posix.cc", ++ "leveldb-<(ldbversion)/port/port_posix.h", ++ "leveldb-<(ldbversion)/util/env_posix.cc" ++ ], ++ "defines": [ ++ "LEVELDB_PLATFORM_POSIX=1" ++ ], ++ "ccflags": [ ++ "-fno-builtin-memcmp", ++ "-fPIC" ++ ], ++ "cflags": [ "-std=c++0x" ], ++ "cflags!": [ "-fno-tree-vrp" ] ++ }], ++ ["OS != 'win'" and "OS != 'freebsd'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-but-set-variable" ++ ] ++ }], ++ ["OS == 'linux'", { ++ "defines": [ ++ "OS_LINUX=1" ++ ], ++ "libraries": [ ++ "-lpthread" ++ ], ++ "ccflags": [ ++ "-pthread" ++ ] ++ }], ++ ["OS == 'freebsd'", { ++ "defines": [ ++ "OS_FREEBSD=1", ++ "_REENTRANT=1" ++ ], ++ "libraries": [ ++ "-lpthread" ++ ], ++ "ccflags": [ ++ "-pthread" ++ ], ++ "cflags": [ ++ "-Wno-sign-compare" ++ ] ++ }], ++ ["OS == 'openbsd'", { ++ "defines": [ ++ "OS_OPENBSD=1", ++ "_REENTRANT=1" ++ ], ++ "libraries": [ ++ "-lpthread" ++ ], ++ "ccflags": [ ++ "-pthread" ++ ], ++ "cflags": [ ++ "-Wno-sign-compare" ++ ] ++ }], ++ ["OS == 'solaris'", { ++ "defines": [ ++ "OS_SOLARIS=1", ++ "_REENTRANT=1" ++ ], ++ "libraries": [ ++ "-lrt", ++ "-lpthread" ++ ], ++ "ccflags": [ ++ "-pthread" ++ ] ++ }], ++ ["OS == 'ios'", { ++ "defines": [ ++ "OS_IOS=1" ++ ], ++ "libraries": [], ++ "ccflags": [], ++ "xcode_settings": { ++ "WARNING_CFLAGS": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-variable", ++ "-Wno-unused-function" ++ ] ++ } ++ }], ++ ["OS == 'mac'", { ++ "defines": [ ++ "OS_MACOSX=1" ++ ], ++ "libraries": [], ++ "ccflags": [], ++ "xcode_settings": { ++ "WARNING_CFLAGS": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-variable", ++ "-Wno-unused-function" ++ ] ++ } ++ }], ++ ["OS == 'android'", { ++ "defines": [ ++ "OS_ANDROID=1", ++ "_REENTRANT=1" ++ ], ++ "libraries": [ ++ "-lpthread" ++ ], ++ "ccflags": [ ++ "-pthread", ++ "-fno-builtin-memcmp" ++ ], ++ "cflags": [ ++ "-fPIC" ++ ], ++ "cflags!": [ ++ "-fPIE", ++ "-mfloat-abi=hard", ++ "-Wno-unused-but-set-variable" ++ ] ++ }], ++ ["target_arch == 'arm'", { ++ "cflags": [ ++ "-mfloat-abi=hard" ++ ] ++ }] ++ ], ++ "sources": [ ++ "leveldb-<(ldbversion)/db/builder.cc", ++ "leveldb-<(ldbversion)/db/builder.h", ++ "leveldb-<(ldbversion)/db/db_impl.cc", ++ "leveldb-<(ldbversion)/db/db_impl.h", ++ "leveldb-<(ldbversion)/db/db_iter.cc", ++ "leveldb-<(ldbversion)/db/db_iter.h", ++ "leveldb-<(ldbversion)/db/filename.cc", ++ "leveldb-<(ldbversion)/db/filename.h", ++ "leveldb-<(ldbversion)/db/dbformat.cc", ++ "leveldb-<(ldbversion)/db/dbformat.h", ++ "leveldb-<(ldbversion)/db/log_format.h", ++ "leveldb-<(ldbversion)/db/log_reader.cc", ++ "leveldb-<(ldbversion)/db/log_reader.h", ++ "leveldb-<(ldbversion)/db/log_writer.cc", ++ "leveldb-<(ldbversion)/db/log_writer.h", ++ "leveldb-<(ldbversion)/db/memtable.cc", ++ "leveldb-<(ldbversion)/db/memtable.h", ++ "leveldb-<(ldbversion)/db/repair.cc", ++ "leveldb-<(ldbversion)/db/skiplist.h", ++ "leveldb-<(ldbversion)/db/snapshot.h", ++ "leveldb-<(ldbversion)/db/table_cache.cc", ++ "leveldb-<(ldbversion)/db/table_cache.h", ++ "leveldb-<(ldbversion)/db/version_edit.cc", ++ "leveldb-<(ldbversion)/db/version_edit.h", ++ "leveldb-<(ldbversion)/db/version_set.cc", ++ "leveldb-<(ldbversion)/db/version_set.h", ++ "leveldb-<(ldbversion)/db/write_batch.cc", ++ "leveldb-<(ldbversion)/db/write_batch_internal.h", ++ "leveldb-<(ldbversion)/helpers/memenv/memenv.cc", ++ "leveldb-<(ldbversion)/helpers/memenv/memenv.h", ++ "leveldb-<(ldbversion)/include/leveldb/cache.h", ++ "leveldb-<(ldbversion)/include/leveldb/comparator.h", ++ "leveldb-<(ldbversion)/include/leveldb/db.h", ++ "leveldb-<(ldbversion)/include/leveldb/dumpfile.h", ++ "leveldb-<(ldbversion)/include/leveldb/env.h", ++ "leveldb-<(ldbversion)/include/leveldb/filter_policy.h", ++ "leveldb-<(ldbversion)/include/leveldb/iterator.h", ++ "leveldb-<(ldbversion)/include/leveldb/options.h", ++ "leveldb-<(ldbversion)/include/leveldb/slice.h", ++ "leveldb-<(ldbversion)/include/leveldb/status.h", ++ "leveldb-<(ldbversion)/include/leveldb/table.h", ++ "leveldb-<(ldbversion)/include/leveldb/table_builder.h", ++ "leveldb-<(ldbversion)/include/leveldb/write_batch.h", ++ "leveldb-<(ldbversion)/port/port.h", ++ "leveldb-<(ldbversion)/port/port_posix_sse.cc", ++ "leveldb-<(ldbversion)/table/block.cc", ++ "leveldb-<(ldbversion)/table/block.h", ++ "leveldb-<(ldbversion)/table/block_builder.cc", ++ "leveldb-<(ldbversion)/table/block_builder.h", ++ "leveldb-<(ldbversion)/table/filter_block.cc", ++ "leveldb-<(ldbversion)/table/filter_block.h", ++ "leveldb-<(ldbversion)/table/format.cc", ++ "leveldb-<(ldbversion)/table/format.h", ++ "leveldb-<(ldbversion)/table/iterator.cc", ++ "leveldb-<(ldbversion)/table/iterator_wrapper.h", ++ "leveldb-<(ldbversion)/table/merger.cc", ++ "leveldb-<(ldbversion)/table/merger.h", ++ "leveldb-<(ldbversion)/table/table.cc", ++ "leveldb-<(ldbversion)/table/table_builder.cc", ++ "leveldb-<(ldbversion)/table/two_level_iterator.cc", ++ "leveldb-<(ldbversion)/table/two_level_iterator.h", ++ "leveldb-<(ldbversion)/util/arena.cc", ++ "leveldb-<(ldbversion)/util/arena.h", ++ "leveldb-<(ldbversion)/util/bloom.cc", ++ "leveldb-<(ldbversion)/util/cache.cc", ++ "leveldb-<(ldbversion)/util/coding.cc", ++ "leveldb-<(ldbversion)/util/coding.h", ++ "leveldb-<(ldbversion)/util/comparator.cc", ++ "leveldb-<(ldbversion)/util/crc32c.cc", ++ "leveldb-<(ldbversion)/util/crc32c.h", ++ "leveldb-<(ldbversion)/util/env.cc", ++ "leveldb-<(ldbversion)/util/filter_policy.cc", ++ "leveldb-<(ldbversion)/util/hash.cc", ++ "leveldb-<(ldbversion)/util/hash.h", ++ "leveldb-<(ldbversion)/util/logging.cc", ++ "leveldb-<(ldbversion)/util/logging.h", ++ "leveldb-<(ldbversion)/util/mutexlock.h", ++ "leveldb-<(ldbversion)/util/options.cc", ++ "leveldb-<(ldbversion)/util/random.h", ++ "leveldb-<(ldbversion)/util/status.cc" ++ ] ++ }] ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/atomic_pointer_win.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/atomic_pointer_win.h +new file mode 100644 +index 0000000..12ad2ea +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/atomic_pointer_win.h +@@ -0,0 +1,48 @@ ++#include ++#include ++ ++// credit: https://groups.google.com/forum/#!msg/leveldb/VuECZMnsob4/F6pGPGaK-XwJ ++ ++namespace leveldb { ++namespace port { ++ ++class AtomicPointer { ++ private: ++ void* rep_; ++ ++ public: ++ AtomicPointer () {} ++ explicit AtomicPointer(void* v) { ++ InterlockedExchangePointer(&rep_, v); ++ } ++ ++ // Read and return the stored pointer with the guarantee that no ++ // later memory access (read or write) by this thread can be ++ // reordered ahead of this read. ++ inline void* Acquire_Load() const { ++ void* r; ++ InterlockedExchangePointer(&r, rep_ ); ++ return r; ++ } ++ ++ // Set v as the stored pointer with the guarantee that no earlier ++ // memory access (read or write) by this thread can be reordered ++ // after this store. ++ inline void Release_Store(void* v) { ++ InterlockedExchangePointer(&rep_, v); ++ } ++ ++ // Read the stored pointer with no ordering guarantees. ++ inline void* NoBarrier_Load() const { ++ void* r = reinterpret_cast(rep_); ++ return r; ++ } ++ ++ // Set va as the stored pointer with no ordering guarantees. ++ inline void NoBarrier_Store(void* v) { ++ rep_ = reinterpret_cast(v); ++ } ++}; ++ ++} // namespace port ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/env_win.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/env_win.cc +new file mode 100644 +index 0000000..c1f5aaa +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/env_win.cc +@@ -0,0 +1,692 @@ ++/* ++ * originally from http://code.google.com/r/kkowalczyk-leveldb/ ++ * code by Krzysztof Kowalczyk kkowalczyk kowalczyk@gmail.com ++ * See also http://blog.kowalczyk.info/software/leveldb-for-windows/index.html ++ */ ++ ++ ++#include ++#include ++#include ++#include ++ ++#include "leveldb/env.h" ++#include "leveldb/slice.h" ++#include "port/port.h" ++#include "util/logging.h" ++#include "win_logger.h" ++ ++#if defined(_MSC_VER) ++# ifdef DeleteFile ++# undef DeleteFile ++# endif ++#endif ++ ++// To properly support file names on Windows we should be using Unicode ++// (WCHAR) strings. To accomodate existing interface which uses std::string, ++// we use the following convention: ++// * all filenames that we return (e.g. from GetTestDirectory()) are ++// utf8-encoded ++// * we'll try to interpret all input file names as if they're ++// utf8-encoded. If they're not valid utf8 strings, we'll try ++// to interpret them according to a current code page ++// This just works for names that don't use characters outside ascii ++// and for those that do, the caller needs to be aware of this convention ++// whenever it bubbles up to the user-level API. ++ ++namespace leveldb { ++ ++static Status IOError(const std::string& context, DWORD err = (DWORD)-1) { ++ char *err_msg = NULL; ++ Status s; ++ if ((DWORD)-1 == err) ++ err = GetLastError(); ++ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, ++ NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), ++ (LPSTR)&err_msg, 0, NULL); ++ if (!err_msg) ++ return Status::IOError(context); ++ s = Status::IOError(context, err_msg); ++ LocalFree(err_msg); ++ return s; ++} ++ ++class WinSequentialFile: public SequentialFile { ++private: ++ std::string fname_; ++ HANDLE file_; ++ ++public: ++ WinSequentialFile(const std::string& fname, HANDLE f) ++ : fname_(fname), file_(f) { } ++ virtual ~WinSequentialFile() { CloseHandle(file_); } ++ ++ virtual Status Read(size_t n, Slice* result, char* scratch) { ++ DWORD n2 = n; ++ DWORD r = 0; ++ BOOL ok = ReadFile(file_, (void*)scratch, n2, &r, NULL); ++ *result = Slice(scratch, r); ++ if (!ok) { ++ // We leave status as ok if we hit the end of the file ++ if (GetLastError() != ERROR_HANDLE_EOF) { ++ return IOError(fname_); ++ } ++ } ++ return Status::OK(); ++ } ++ ++ virtual Status Skip(uint64_t n) { ++ LARGE_INTEGER pos; ++ pos.QuadPart = n; ++ DWORD res = SetFilePointerEx(file_, pos, NULL, FILE_CURRENT); ++ if (res == 0) ++ return IOError(fname_); ++ return Status::OK(); ++ } ++}; ++ ++class WinRandomAccessFile: public RandomAccessFile { ++ private: ++ std::string fname_; ++ HANDLE file_; ++ ++ public: ++ WinRandomAccessFile(const std::string& fname, HANDLE file) ++ : fname_(fname), file_(file) { } ++ virtual ~WinRandomAccessFile() { CloseHandle(file_); } ++ ++ virtual Status Read(uint64_t offset, size_t n, Slice* result, ++ char* scratch) const { ++ OVERLAPPED overlapped = { 0 }; ++ overlapped.Offset = static_cast(offset); ++ overlapped.OffsetHigh = static_cast(offset >> 32); ++ DWORD bytes_read = 0; ++ BOOL success = ReadFile(file_, scratch, n, &bytes_read, &overlapped); ++ *result = Slice(scratch, bytes_read); ++ return success != FALSE ? Status::OK() : Status::IOError(fname_); ++ } ++}; ++ ++class WinWritableFile : public WritableFile { ++private: ++ std::string name_; ++ HANDLE file_; ++ ++public: ++ WinWritableFile(std::string name, HANDLE h) : name_(name), file_(h) { ++ } ++ ++ virtual ~WinWritableFile() { ++ Close(); ++ } ++ ++ virtual Status Append(const Slice& data) { ++ DWORD n = data.size(); ++ DWORD pos = 0; ++ while (pos < n) { ++ DWORD written = 0; ++ BOOL ok = WriteFile(file_, data.data() + pos, n - pos, &written, NULL); ++ if (!ok) ++ return IOError(name_+ "Append: cannot write"); ++ pos += written; ++ } ++ return Status::OK(); ++ } ++ ++ virtual Status Close() { ++ if (INVALID_HANDLE_VALUE == file_) ++ return Status::OK(); ++ Status s = Sync(); ++ CloseHandle(file_); ++ file_ = INVALID_HANDLE_VALUE; ++ return s; ++ } ++ ++ virtual Status Flush() { ++ return Status::OK(); ++ } ++ ++ virtual Status Sync() { ++ BOOL ok = FlushFileBuffers(file_); ++ if (!ok) ++ return IOError(name_); ++ return Status::OK(); ++ } ++}; ++ ++namespace { ++ ++#define DIR_SEP_CHAR L'\\' ++#define DIR_SEP_STR L"\\" ++ ++WCHAR *ToWcharFromCodePage(const char *src, UINT cp) { ++ int required_buf_size = MultiByteToWideChar(cp, 0, src, -1, NULL, 0); ++ if (0 == required_buf_size) // indicates an error ++ return NULL; ++ WCHAR *res = reinterpret_cast(malloc(sizeof(WCHAR) * required_buf_size)); ++ if (!res) ++ return NULL; ++ MultiByteToWideChar(cp, 0, src, -1, res, required_buf_size); ++ return res; ++} ++ ++// try to convert to WCHAR string trying most common code pages ++// to be as permissive as we can be ++WCHAR *ToWcharPermissive(const char *s) { ++ WCHAR *ws = ToWcharFromCodePage(s, CP_UTF8); ++ if (ws != NULL) ++ return ws; ++ ws = ToWcharFromCodePage(s, CP_ACP); ++ if (ws != NULL) ++ return ws; ++ ws = ToWcharFromCodePage(s, CP_OEMCP); ++ return ws; ++} ++ ++char *ToUtf8(const WCHAR *s) { ++ int required_buf_size = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL); ++ char *res = (char*)malloc(sizeof(char) * required_buf_size); ++ if (!res) ++ return NULL; ++ WideCharToMultiByte(CP_UTF8, 0, s, -1, res, required_buf_size, NULL, NULL); ++ return res; ++} ++ ++static size_t WstrLen(const WCHAR *s) { ++ if (NULL == s) ++ return 0; ++ return wcslen(s); ++} ++ ++static WCHAR *WstrJoin(const WCHAR *s1, const WCHAR *s2, const WCHAR *s3=NULL) { ++ size_t s1_len = WstrLen(s1); ++ size_t s2_len = WstrLen(s2); ++ size_t s3_len = WstrLen(s3); ++ size_t len =s1_len + s2_len + s3_len + 1; ++ WCHAR *res = (WCHAR*)malloc(sizeof(WCHAR) * len); ++ if (!res) ++ return NULL; ++ WCHAR *tmp = res; ++ if (s1 != NULL) { ++ memcpy(tmp, s1, s1_len * sizeof(WCHAR)); ++ tmp += s1_len; ++ } ++ if (s2 != NULL) { ++ memcpy(tmp, s2, s2_len * sizeof(WCHAR)); ++ tmp += s2_len; ++ } ++ if (s3 != NULL) { ++ memcpy(tmp, s3, s3_len * sizeof(WCHAR)); ++ tmp += s3_len; ++ } ++ *tmp = 0; ++ return res; ++} ++ ++static bool WstrEndsWith(const WCHAR *s1, WCHAR c) { ++ size_t len = WstrLen(s1); ++ return ((len > 0) && (s1[len-1] == c)); ++} ++ ++static WCHAR *WstrPathJoin(const WCHAR *s1, const WCHAR *s2) { ++ if (WstrEndsWith(s1, DIR_SEP_CHAR)) ++ return WstrJoin(s1, s2); ++ return WstrJoin(s1, DIR_SEP_STR, s2); ++} ++ ++// Return true if s is "." or "..", which are 2 directories ++// we should skip when enumerating a directory ++static bool SkipDir(const WCHAR *s) { ++ if (*s == L'.') { ++ if (s[1] == 0) ++ return true; ++ return ((s[1] == '.') && (s[2] == 0)); ++ } ++ return false; ++} ++ ++class WinFileLock : public FileLock { ++ public: ++ WinFileLock(const std::string &fname, HANDLE file) ++ : fname_(fname), file_(file) { ++ } ++ ++ virtual ~WinFileLock() { ++ Close(); ++ } ++ ++ bool Close() { ++ bool ok = true; ++ if (file_ != INVALID_HANDLE_VALUE) ++ ok = (CloseHandle(file_) != FALSE); ++ file_ = INVALID_HANDLE_VALUE; ++ return ok; ++ } ++ ++ std::string fname_; ++ HANDLE file_; ++}; ++ ++class WinEnv : public Env { ++ public: ++ WinEnv(); ++ virtual ~WinEnv() { ++ fprintf(stderr, "Destroying Env::Default()\n"); ++ //exit(1); ++ } ++ ++ virtual Status NewSequentialFile(const std::string& fname, ++ SequentialFile** result) { ++ *result = NULL; ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) { ++ return Status::InvalidArgument("Invalid file name"); ++ } ++ HANDLE h = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ++ free((void*)file_name); ++ if (h == INVALID_HANDLE_VALUE) { ++ return IOError(fname); ++ } ++ *result = new WinSequentialFile(fname, h); ++ return Status::OK(); ++ } ++ ++ virtual Status NewRandomAccessFile(const std::string& fname, ++ RandomAccessFile** result) { ++ *result = NULL; ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) { ++ return Status::InvalidArgument("Invalid file name"); ++ } ++ HANDLE h = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ++ free((void*)file_name); ++ if (h == INVALID_HANDLE_VALUE) { ++ return IOError(fname); ++ } ++ *result = new WinRandomAccessFile(fname, h); ++ return Status::OK(); ++ } ++ ++ virtual Status NewWritableFile(const std::string& fname, ++ WritableFile** result) { ++ *result = NULL; ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ HANDLE h = CreateFileW(file_name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ++ free((void*)file_name); ++ if (h == INVALID_HANDLE_VALUE) { ++ return IOError(fname); ++ } ++ *result = new WinWritableFile(fname, h); ++ return Status::OK(); ++ } ++ ++ virtual bool FileExists(const std::string& fname) { ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) ++ return false; ++ ++ WIN32_FILE_ATTRIBUTE_DATA file_info; ++ BOOL res = GetFileAttributesExW(file_name, GetFileExInfoStandard, &file_info); ++ free((void*)file_name); ++ if (0 == res) ++ return false; ++ ++ if ((file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) ++ return false; ++ return true; ++ } ++ ++ virtual Status GetChildren(const std::string& dir, ++ std::vector* result) { ++ result->clear(); ++ WCHAR *dir_name = ToWcharPermissive(dir.c_str()); ++ if (dir_name == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ WCHAR *pattern = WstrPathJoin(dir_name, L"*"); ++ free(dir_name); ++ if (NULL == pattern) ++ return Status::InvalidArgument("Invalid file name"); ++ WIN32_FIND_DATAW file_data; ++ HANDLE h = FindFirstFileW(pattern, &file_data); ++ free(pattern); ++ if (INVALID_HANDLE_VALUE == h) { ++ if (ERROR_FILE_NOT_FOUND == GetLastError()) ++ return Status::OK(); ++ return IOError(dir); ++ } ++ for (;;) { ++ WCHAR *s = file_data.cFileName; ++ if (!SkipDir(s)) { ++ char *s2 = ToUtf8(s); ++ result->push_back(s2); ++ free(s2); ++ } ++ if (FALSE == FindNextFileW(h, &file_data)) ++ break; ++ } ++ FindClose(h); ++ return Status::OK(); ++ } ++ ++ virtual Status DeleteFile(const std::string& fname) { ++ WCHAR *file_path = ToWcharPermissive(fname.c_str()); ++ if (file_path == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ ++ BOOL ok = DeleteFileW(file_path); ++ free(file_path); ++ if (!ok) { ++ DWORD err = GetLastError(); ++ if ((ERROR_PATH_NOT_FOUND == err) || (ERROR_FILE_NOT_FOUND == err)) ++ return Status::OK(); ++ return IOError("DeleteFile " + fname); ++ } ++ return Status::OK(); ++ } ++ ++ bool CreateDirIfNotExists(const WCHAR *dir) { ++ BOOL ok = CreateDirectoryW(dir, NULL); ++ if (ok) ++ return true; ++ return (ERROR_ALREADY_EXISTS == GetLastError()); ++ } ++ ++ bool DirExists(const WCHAR *dir) { ++ WIN32_FILE_ATTRIBUTE_DATA file_info; ++ BOOL res = GetFileAttributesExW(dir, GetFileExInfoStandard, &file_info); ++ if (0 == res) ++ return false; ++ ++ return (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; ++ } ++ ++ WCHAR *WstrDupN(const WCHAR *s, size_t len) { ++ void *res = malloc((len + 1) * sizeof(WCHAR)); ++ if (!res) ++ return NULL; ++ memcpy(res, s, len * sizeof(WCHAR)); ++ WCHAR *res2 = reinterpret_cast(res); ++ res2[len] = 0; ++ return res2; ++ } ++ ++ bool IsPathSep(WCHAR c) { ++ return (c == '\\') || (c == '/'); ++ } ++ ++ WCHAR *GetPathParent(const WCHAR *path) { ++ const WCHAR *last_sep = NULL; ++ const WCHAR *tmp = path; ++ // find the last path separator ++ // (ignoring one at the end of the string) ++ while (*tmp) { ++ if (IsPathSep(*tmp)) { ++ if (0 != tmp[1]) ++ last_sep = tmp; ++ } ++ ++tmp; ++ } ++ if (NULL == last_sep) ++ return NULL; ++ size_t len = last_sep - path; ++ return WstrDupN(path, len); ++ } ++ ++ bool CreateDirRecursive(WCHAR *dir) { ++ WCHAR *parent = GetPathParent(dir); ++ bool ok = true; ++ if (parent && !DirExists(parent)) { ++ ok = CreateDirRecursive(parent); ++ } ++ free(parent); ++ if (!ok) ++ return false; ++ return CreateDirIfNotExists(dir); ++ } ++ ++ virtual Status CreateDir(const std::string& name) { ++ WCHAR *dir = ToWcharPermissive(name.c_str()); ++ if (dir == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ bool ok = CreateDirRecursive(dir); ++ free(dir); ++ if (!ok) ++ return IOError(name); ++ return Status::OK(); ++ } ++ ++#if 1 ++ virtual Status DeleteDir(const std::string& name) { ++ WCHAR *dir = ToWcharPermissive(name.c_str()); ++ if (dir == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ BOOL ok = RemoveDirectoryW(dir); ++ free(dir); ++ if (!ok) ++ return IOError(name); ++ return Status::OK(); ++ } ++#else ++ virtual Status DeleteDir(const std::string& dirname) { ++ WCHAR *dir = ToWcharPermissive(dirname.c_str()); ++ if (dir == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ ++ SHFILEOPSTRUCTW fileop = { 0 }; ++ fileop.wFunc = FO_DELETE; ++ fileop.pFrom = (const WCHAR*)dir; ++ fileop.fFlags = FOF_NO_UI; ++ int res = SHFileOperationW(&fileop); ++ free((void*)dir); ++ if (res == 0 && fileop.fAnyOperationsAborted == FALSE) ++ return Status::OK(); ++ return IOError("DeleteDir " + dirname); ++ } ++#endif ++ ++ virtual Status GetFileSize(const std::string& fname, uint64_t* size) { ++ ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) ++ return Status::InvalidArgument("Invalid file name"); ++ HANDLE h = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, ++ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ++ free(file_name); ++ if (h == INVALID_HANDLE_VALUE) ++ return IOError("GetFileSize " + fname); ++ ++ // Not using GetFileAttributesEx() as it doesn't interact well with symlinks, etc. ++ LARGE_INTEGER lsize; ++ BOOL ok = GetFileSizeEx(h, &lsize); ++ CloseHandle(h); ++ if (!ok) ++ return IOError("GetFileSize " + fname); ++ ++ *size = static_cast(lsize.QuadPart); ++ return Status::OK(); ++ } ++ ++ virtual Status RenameFile(const std::string& src, const std::string& target) { ++ WCHAR *src2 = ToWcharPermissive(src.c_str()); ++ WCHAR *target2 = ToWcharPermissive(target.c_str()); ++ if ((src2 == NULL) || (target2 == NULL)) { ++ free(src2); ++ free(target2); ++ return Status::InvalidArgument("Invalid file name"); ++ } ++ BOOL ok = MoveFileExW(src2, target2, MOVEFILE_REPLACE_EXISTING); ++ free(src2); ++ free(target2); ++ if (!ok) ++ return IOError("RenameFile " + src + " " + target); ++ return Status::OK(); ++ } ++ ++ virtual Status LockFile(const std::string& fname, FileLock** lock) { ++ *lock = NULL; ++ WCHAR *file_name = ToWcharPermissive(fname.c_str()); ++ if (file_name == NULL) { ++ return Status::InvalidArgument("Invalid file name"); ++ } ++ HANDLE h = CreateFileW(file_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ++ free((void*)file_name); ++ if (h == INVALID_HANDLE_VALUE) { ++ return IOError("LockFile " + fname); ++ } ++ *lock = new WinFileLock(fname, h); ++ return Status::OK(); ++ } ++ ++ virtual Status UnlockFile(FileLock* lock) { ++ Status s; ++ WinFileLock* my_lock = reinterpret_cast(lock); ++ if (!my_lock->Close()) { ++ s = Status::IOError(my_lock->fname_, "Could not close lock file."); ++ } ++ delete my_lock; ++ return Status::OK(); ++ } ++ ++ virtual void Schedule(void (*function)(void*), void* arg); ++ ++ virtual void StartThread(void (*function)(void* arg), void* arg); ++ ++ virtual Status GetTestDirectory(std::string* result) { ++ WCHAR buf[MAX_PATH]; ++ DWORD res = GetTempPathW(MAX_PATH, buf); ++ if (0 == res) { ++ return IOError("Can't get test directory"); ++ } ++ char *s = ToUtf8(buf); ++ if (!s) { ++ return IOError("Can't get test directory"); ++ } ++ *result = std::string(s); ++ free(s); ++ return Status::OK(); ++ } ++ ++ virtual Status NewLogger(const std::string& fname, Logger** result) { ++ *result = NULL; ++ FILE* f = fopen(fname.c_str(), "wt"); ++ if (f == NULL) ++ return Status::IOError(fname, strerror(errno)); ++ *result = new WinLogger(f); ++ return Status::OK(); ++ } ++ ++ virtual uint64_t NowMicros() { ++ LARGE_INTEGER count; ++ QueryPerformanceCounter(&count); ++ return count.QuadPart * 1000000i64 / freq_.QuadPart; ++ } ++ ++ virtual void SleepForMicroseconds(int micros) { ++ // round up to the next millisecond ++ Sleep((micros + 999) / 1000); ++ } ++ ++private: ++ LARGE_INTEGER freq_; ++ ++ // BGThread() is the body of the background thread ++ void BGThread(); ++ ++ static unsigned __stdcall BGThreadWrapper(void* arg) { ++ (reinterpret_cast(arg))->BGThread(); ++ _endthreadex(0); ++ return 0; ++ } ++ ++ leveldb::port::Mutex mu_; ++ leveldb::port::CondVar bgsignal_; ++ HANDLE bgthread_; ++ ++ // Entry per Schedule() call ++ struct BGItem { void* arg; void (*function)(void*); }; ++ typedef std::deque BGQueue; ++ BGQueue queue_; ++}; ++ ++ ++WinEnv::WinEnv() : bgthread_(NULL), bgsignal_(&mu_) { ++ QueryPerformanceFrequency(&freq_); ++} ++ ++void WinEnv::Schedule(void (*function)(void*), void* arg) { ++ mu_.Lock(); ++ ++ // Start background thread if necessary ++ if (NULL == bgthread_) { ++ bgthread_ = (HANDLE)_beginthreadex(NULL, 0, &WinEnv::BGThreadWrapper, this, 0, NULL); ++ } ++ ++ // Add to priority queue ++ queue_.push_back(BGItem()); ++ queue_.back().function = function; ++ queue_.back().arg = arg; ++ ++ mu_.Unlock(); ++ ++ bgsignal_.Signal(); ++} ++ ++void WinEnv::BGThread() { ++ while (true) { ++ // Wait until there is an item that is ready to run ++ mu_.Lock(); ++ ++ while (queue_.empty()) { ++ bgsignal_.Wait(); ++ } ++ ++ void (*function)(void*) = queue_.front().function; ++ void* arg = queue_.front().arg; ++ queue_.pop_front(); ++ ++ mu_.Unlock(); ++ (*function)(arg); ++ } ++ // TODO: CloseHandle(bgthread_) ?? ++} ++ ++namespace { ++struct StartThreadState { ++ void (*user_function)(void*); ++ void* arg; ++ HANDLE threadHandle; ++}; ++} ++ ++static unsigned __stdcall StartThreadWrapper(void* arg) { ++ StartThreadState* state = reinterpret_cast(arg); ++ state->user_function(state->arg); ++ _endthreadex(0); ++ CloseHandle(state->threadHandle); ++ delete state; ++ return 0; ++} ++ ++void WinEnv::StartThread(void (*function)(void* arg), void* arg) { ++ StartThreadState* state = new StartThreadState; ++ state->user_function = function; ++ state->arg = arg; ++ state->threadHandle = (HANDLE)_beginthreadex(NULL, 0, &StartThreadWrapper, state, 0, NULL); ++} ++} ++ ++static Env* default_env; ++static void InitDefaultEnv() { default_env = new WinEnv(); } ++static leveldb::port::Mutex default_env_mutex; ++ ++Env* Env::Default() { ++ default_env_mutex.Lock(); ++ if (NULL == default_env) ++ InitDefaultEnv(); ++ default_env_mutex.Unlock(); ++ return default_env; ++} ++ ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.cc +new file mode 100644 +index 0000000..860fd4d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.cc +@@ -0,0 +1,36 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "port_uv.h" ++ ++#include ++#include ++#include ++#include "util/logging.h" ++ ++namespace leveldb { ++namespace port { ++ ++Mutex::Mutex() { uv_mutex_init(&mu_); } ++ ++Mutex::~Mutex() { uv_mutex_destroy(&mu_); } ++ ++void Mutex::Lock() { uv_mutex_lock(&mu_); } ++ ++void Mutex::Unlock() { uv_mutex_unlock(&mu_); } ++ ++CondVar::CondVar(Mutex* mu) : mu_(mu) { uv_cond_init(&cv_); } ++ ++CondVar::~CondVar() { uv_cond_destroy(&cv_); } ++ ++void CondVar::Wait() { uv_cond_wait(&cv_, &mu_->mu_); } ++ ++void CondVar::Signal() { uv_cond_signal(&cv_); } ++ ++void CondVar::SignalAll() { uv_cond_broadcast(&cv_); } ++ ++void InitOnce(OnceType* once, void (*initializer)()) { uv_once(once, initializer); } ++ ++} // namespace port ++} // namespace leveldb +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h +new file mode 100644 +index 0000000..15477ca +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h +@@ -0,0 +1,157 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// See port_example.h for documentation for the following types/functions. ++ ++#ifndef STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ ++#define STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ ++ ++#undef PLATFORM_IS_LITTLE_ENDIAN ++#if defined(OS_MACOSX) ++ #include ++ #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER) ++ #define PLATFORM_IS_LITTLE_ENDIAN \ ++ (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN) ++ #endif ++#elif defined(OS_SOLARIS) ++ #include ++ #ifdef _LITTLE_ENDIAN ++ #define PLATFORM_IS_LITTLE_ENDIAN true ++ #else ++ #define PLATFORM_IS_LITTLE_ENDIAN false ++ #endif ++#elif defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\ ++ defined(OS_DRAGONFLYBSD) || defined(OS_ANDROID) ++ #include ++ #include ++#elif defined(_MSC_VER) ++#if _MSC_VER < 1600 ++ #include "stdint-msvc2008.h" ++#endif ++ #define PLATFORM_IS_LITTLE_ENDIAN true ++#if _MSC_VER < 1900 ++ #define snprintf _snprintf ++#endif ++ #define close _close ++ #define fread_unlocked _fread_nolock ++#else ++ #include ++#endif ++ ++#include ++ ++#ifdef SNAPPY ++#include ++#endif ++#include ++#include ++#if defined(_MSC_VER) ++ #include "atomic_pointer_win.h" ++ #undef small ++#else ++ #include "port/atomic_pointer.h" ++#endif ++ ++#ifndef PLATFORM_IS_LITTLE_ENDIAN ++#define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN) ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\ ++ defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\ ++ defined(OS_ANDROID) ++// Use fread/fwrite/fflush on platforms without _unlocked variants ++#define fread_unlocked fread ++#define fwrite_unlocked fwrite ++#define fflush_unlocked fflush ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\ ++ defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ++// Use fsync() on platforms without fdatasync() ++#define fdatasync fsync ++#endif ++ ++namespace leveldb { ++namespace port { ++ ++static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; ++#undef PLATFORM_IS_LITTLE_ENDIAN ++ ++class CondVar; ++ ++class Mutex { ++ public: ++ Mutex(); ++ ~Mutex(); ++ ++ void Lock(); ++ void Unlock(); ++ void AssertHeld() { } ++ ++ private: ++ friend class CondVar; ++ uv_mutex_t mu_; ++ ++ // No copying ++ Mutex(const Mutex&); ++ void operator=(const Mutex&); ++}; ++ ++class CondVar { ++ public: ++ explicit CondVar(Mutex* mu); ++ ~CondVar(); ++ void Wait(); ++ void Signal(); ++ void SignalAll(); ++ private: ++ uv_cond_t cv_; ++ Mutex* mu_; ++}; ++ ++typedef uv_once_t OnceType; ++#define LEVELDB_ONCE_INIT UV_ONCE_INIT ++extern void InitOnce(OnceType* once, void (*initializer)()); ++ ++inline bool Snappy_Compress(const char* input, size_t length, ++ ::std::string* output) { ++#ifdef SNAPPY ++ output->resize(snappy::MaxCompressedLength(length)); ++ size_t outlen; ++ snappy::RawCompress(input, length, &(*output)[0], &outlen); ++ output->resize(outlen); ++ return true; ++#endif ++ ++ return false; ++} ++ ++inline bool Snappy_GetUncompressedLength(const char* input, size_t length, ++ size_t* result) { ++#ifdef SNAPPY ++ return snappy::GetUncompressedLength(input, length, result); ++#else ++ return false; ++#endif ++} ++ ++inline bool Snappy_Uncompress(const char* input, size_t length, ++ char* output) { ++#ifdef SNAPPY ++ return snappy::RawUncompress(input, length, output); ++#else ++ return false; ++#endif ++} ++ ++inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { ++ return false; ++} ++ ++uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size); ++ ++} // namespace port ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h.bak b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h.bak +new file mode 100644 +index 0000000..304b5a1 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h.bak +@@ -0,0 +1,153 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++// ++// See port_example.h for documentation for the following types/functions. ++ ++#ifndef STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ ++#define STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ ++ ++#undef PLATFORM_IS_LITTLE_ENDIAN ++#if defined(OS_MACOSX) ++ #include ++ #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER) ++ #define PLATFORM_IS_LITTLE_ENDIAN \ ++ (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN) ++ #endif ++#elif defined(OS_SOLARIS) ++ #include ++ #ifdef _LITTLE_ENDIAN ++ #define PLATFORM_IS_LITTLE_ENDIAN true ++ #else ++ #define PLATFORM_IS_LITTLE_ENDIAN false ++ #endif ++#elif defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\ ++ defined(OS_DRAGONFLYBSD) || defined(OS_ANDROID) ++ #include ++ #include ++#elif defined(_MSC_VER) ++ #define PLATFORM_IS_LITTLE_ENDIAN true ++ #define snprintf _snprintf ++ #define close _close ++ #define fread_unlocked _fread_nolock ++#else ++ #include ++#endif ++ ++typedef intptr_t ssize_t; ++#define _SSIZE_T_ ++#define _SSIZE_T_DEFINED ++ ++#include ++ ++#ifdef SNAPPY ++#include ++#endif ++#if defined(_MSC_VER) && _MSC_VER < 1600 ++# include "stdint-msvc2008.h" ++#else ++# include ++#endif ++#include ++#include "port/atomic_pointer.h" ++ ++#ifndef PLATFORM_IS_LITTLE_ENDIAN ++#define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN) ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\ ++ defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\ ++ defined(OS_ANDROID) ++// Use fread/fwrite/fflush on platforms without _unlocked variants ++#define fread_unlocked fread ++#define fwrite_unlocked fwrite ++#define fflush_unlocked fflush ++#endif ++ ++#if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\ ++ defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ++// Use fsync() on platforms without fdatasync() ++#define fdatasync fsync ++#endif ++ ++namespace leveldb { ++namespace port { ++ ++static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; ++#undef PLATFORM_IS_LITTLE_ENDIAN ++ ++class CondVar; ++ ++class Mutex { ++ public: ++ Mutex(); ++ ~Mutex(); ++ ++ void Lock(); ++ void Unlock(); ++ void AssertHeld() { } ++ ++ private: ++ friend class CondVar; ++ uv_mutex_t mu_; ++ ++ // No copying ++ Mutex(const Mutex&); ++ void operator=(const Mutex&); ++}; ++ ++class CondVar { ++ public: ++ explicit CondVar(Mutex* mu); ++ ~CondVar(); ++ void Wait(); ++ void Signal(); ++ void SignalAll(); ++ private: ++ uv_cond_t cv_; ++ Mutex* mu_; ++}; ++ ++typedef uv_once_t OnceType; ++#define LEVELDB_ONCE_INIT 0 ++extern void InitOnce(OnceType* once, void (*initializer)()); ++ ++inline bool Snappy_Compress(const char* input, size_t length, ++ ::std::string* output) { ++#ifdef SNAPPY ++ output->resize(snappy::MaxCompressedLength(length)); ++ size_t outlen; ++ snappy::RawCompress(input, length, &(*output)[0], &outlen); ++ output->resize(outlen); ++ return true; ++#endif ++ ++ return false; ++} ++ ++inline bool Snappy_GetUncompressedLength(const char* input, size_t length, ++ size_t* result) { ++#ifdef SNAPPY ++ return snappy::GetUncompressedLength(input, length, result); ++#else ++ return false; ++#endif ++} ++ ++inline bool Snappy_Uncompress(const char* input, size_t length, ++ char* output) { ++#ifdef SNAPPY ++ return snappy::RawUncompress(input, length, output); ++#else ++ return false; ++#endif ++} ++ ++inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { ++ return false; ++} ++ ++} // namespace port ++} // namespace leveldb ++ ++#endif // STORAGE_LEVELDB_PORT_PORT_LIBUV_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/stdint-msvc2008.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/stdint-msvc2008.h +new file mode 100644 +index 0000000..d02608a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/stdint-msvc2008.h +@@ -0,0 +1,247 @@ ++// ISO C9x compliant stdint.h for Microsoft Visual Studio ++// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 ++// ++// Copyright (c) 2006-2008 Alexander Chemeris ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are met: ++// ++// 1. Redistributions of source code must retain the above copyright notice, ++// this list of conditions and the following disclaimer. ++// ++// 2. Redistributions in binary form must reproduce the above copyright ++// notice, this list of conditions and the following disclaimer in the ++// documentation and/or other materials provided with the distribution. ++// ++// 3. The name of the author may be used to endorse or promote products ++// derived from this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED ++// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO ++// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ++// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ++// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ++// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ++// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++/////////////////////////////////////////////////////////////////////////////// ++ ++#ifndef _MSC_VER // [ ++#error "Use this header only with Microsoft Visual C++ compilers!" ++#endif // _MSC_VER ] ++ ++#ifndef _MSC_STDINT_H_ // [ ++#define _MSC_STDINT_H_ ++ ++#if _MSC_VER > 1000 ++#pragma once ++#endif ++ ++#include ++ ++// For Visual Studio 6 in C++ mode and for many Visual Studio versions when ++// compiling for ARM we should wrap include with 'extern "C++" {}' ++// or compiler give many errors like this: ++// error C2733: second C linkage of overloaded function 'wmemchr' not allowed ++#ifdef __cplusplus ++extern "C" { ++#endif ++# include ++#ifdef __cplusplus ++} ++#endif ++ ++// Define _W64 macros to mark types changing their size, like intptr_t. ++#ifndef _W64 ++# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 ++# define _W64 __w64 ++# else ++# define _W64 ++# endif ++#endif ++ ++ ++// 7.18.1 Integer types ++ ++// 7.18.1.1 Exact-width integer types ++ ++// Visual Studio 6 and Embedded Visual C++ 4 doesn't ++// realize that, e.g. char has the same size as __int8 ++// so we give up on __intX for them. ++#if (_MSC_VER < 1300) ++ typedef signed char int8_t; ++ typedef signed short int16_t; ++ typedef signed int int32_t; ++ typedef unsigned char uint8_t; ++ typedef unsigned short uint16_t; ++ typedef unsigned int uint32_t; ++#else ++ typedef signed __int8 int8_t; ++ typedef signed __int16 int16_t; ++ typedef signed __int32 int32_t; ++ typedef unsigned __int8 uint8_t; ++ typedef unsigned __int16 uint16_t; ++ typedef unsigned __int32 uint32_t; ++#endif ++typedef signed __int64 int64_t; ++typedef unsigned __int64 uint64_t; ++ ++ ++// 7.18.1.2 Minimum-width integer types ++typedef int8_t int_least8_t; ++typedef int16_t int_least16_t; ++typedef int32_t int_least32_t; ++typedef int64_t int_least64_t; ++typedef uint8_t uint_least8_t; ++typedef uint16_t uint_least16_t; ++typedef uint32_t uint_least32_t; ++typedef uint64_t uint_least64_t; ++ ++// 7.18.1.3 Fastest minimum-width integer types ++typedef int8_t int_fast8_t; ++typedef int16_t int_fast16_t; ++typedef int32_t int_fast32_t; ++typedef int64_t int_fast64_t; ++typedef uint8_t uint_fast8_t; ++typedef uint16_t uint_fast16_t; ++typedef uint32_t uint_fast32_t; ++typedef uint64_t uint_fast64_t; ++ ++// 7.18.1.4 Integer types capable of holding object pointers ++#ifdef _WIN64 // [ ++ typedef signed __int64 intptr_t; ++ typedef unsigned __int64 uintptr_t; ++#else // _WIN64 ][ ++ typedef _W64 signed int intptr_t; ++ typedef _W64 unsigned int uintptr_t; ++#endif // _WIN64 ] ++ ++// 7.18.1.5 Greatest-width integer types ++typedef int64_t intmax_t; ++typedef uint64_t uintmax_t; ++ ++ ++// 7.18.2 Limits of specified-width integer types ++ ++#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 ++ ++// 7.18.2.1 Limits of exact-width integer types ++#define INT8_MIN ((int8_t)_I8_MIN) ++#define INT8_MAX _I8_MAX ++#define INT16_MIN ((int16_t)_I16_MIN) ++#define INT16_MAX _I16_MAX ++#define INT32_MIN ((int32_t)_I32_MIN) ++#define INT32_MAX _I32_MAX ++#define INT64_MIN ((int64_t)_I64_MIN) ++#define INT64_MAX _I64_MAX ++#define UINT8_MAX _UI8_MAX ++#define UINT16_MAX _UI16_MAX ++#define UINT32_MAX _UI32_MAX ++#define UINT64_MAX _UI64_MAX ++ ++// 7.18.2.2 Limits of minimum-width integer types ++#define INT_LEAST8_MIN INT8_MIN ++#define INT_LEAST8_MAX INT8_MAX ++#define INT_LEAST16_MIN INT16_MIN ++#define INT_LEAST16_MAX INT16_MAX ++#define INT_LEAST32_MIN INT32_MIN ++#define INT_LEAST32_MAX INT32_MAX ++#define INT_LEAST64_MIN INT64_MIN ++#define INT_LEAST64_MAX INT64_MAX ++#define UINT_LEAST8_MAX UINT8_MAX ++#define UINT_LEAST16_MAX UINT16_MAX ++#define UINT_LEAST32_MAX UINT32_MAX ++#define UINT_LEAST64_MAX UINT64_MAX ++ ++// 7.18.2.3 Limits of fastest minimum-width integer types ++#define INT_FAST8_MIN INT8_MIN ++#define INT_FAST8_MAX INT8_MAX ++#define INT_FAST16_MIN INT16_MIN ++#define INT_FAST16_MAX INT16_MAX ++#define INT_FAST32_MIN INT32_MIN ++#define INT_FAST32_MAX INT32_MAX ++#define INT_FAST64_MIN INT64_MIN ++#define INT_FAST64_MAX INT64_MAX ++#define UINT_FAST8_MAX UINT8_MAX ++#define UINT_FAST16_MAX UINT16_MAX ++#define UINT_FAST32_MAX UINT32_MAX ++#define UINT_FAST64_MAX UINT64_MAX ++ ++// 7.18.2.4 Limits of integer types capable of holding object pointers ++#ifdef _WIN64 // [ ++# define INTPTR_MIN INT64_MIN ++# define INTPTR_MAX INT64_MAX ++# define UINTPTR_MAX UINT64_MAX ++#else // _WIN64 ][ ++# define INTPTR_MIN INT32_MIN ++# define INTPTR_MAX INT32_MAX ++# define UINTPTR_MAX UINT32_MAX ++#endif // _WIN64 ] ++ ++// 7.18.2.5 Limits of greatest-width integer types ++#define INTMAX_MIN INT64_MIN ++#define INTMAX_MAX INT64_MAX ++#define UINTMAX_MAX UINT64_MAX ++ ++// 7.18.3 Limits of other integer types ++ ++#ifdef _WIN64 // [ ++# define PTRDIFF_MIN _I64_MIN ++# define PTRDIFF_MAX _I64_MAX ++#else // _WIN64 ][ ++# define PTRDIFF_MIN _I32_MIN ++# define PTRDIFF_MAX _I32_MAX ++#endif // _WIN64 ] ++ ++#define SIG_ATOMIC_MIN INT_MIN ++#define SIG_ATOMIC_MAX INT_MAX ++ ++#ifndef SIZE_MAX // [ ++# ifdef _WIN64 // [ ++# define SIZE_MAX _UI64_MAX ++# else // _WIN64 ][ ++# define SIZE_MAX _UI32_MAX ++# endif // _WIN64 ] ++#endif // SIZE_MAX ] ++ ++// WCHAR_MIN and WCHAR_MAX are also defined in ++#ifndef WCHAR_MIN // [ ++# define WCHAR_MIN 0 ++#endif // WCHAR_MIN ] ++#ifndef WCHAR_MAX // [ ++# define WCHAR_MAX _UI16_MAX ++#endif // WCHAR_MAX ] ++ ++#define WINT_MIN 0 ++#define WINT_MAX _UI16_MAX ++ ++#endif // __STDC_LIMIT_MACROS ] ++ ++ ++// 7.18.4 Limits of other integer types ++ ++#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 ++ ++// 7.18.4.1 Macros for minimum-width integer constants ++ ++#define INT8_C(val) val##i8 ++#define INT16_C(val) val##i16 ++#define INT32_C(val) val##i32 ++#define INT64_C(val) val##i64 ++ ++#define UINT8_C(val) val##ui8 ++#define UINT16_C(val) val##ui16 ++#define UINT32_C(val) val##ui32 ++#define UINT64_C(val) val##ui64 ++ ++// 7.18.4.2 Macros for greatest-width integer constants ++#define INTMAX_C INT64_C ++#define UINTMAX_C UINT64_C ++ ++#endif // __STDC_CONSTANT_MACROS ] ++ ++ ++#endif // _MSC_STDINT_H_ ] +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar.h +new file mode 100644 +index 0000000..f3c7e03 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar.h +@@ -0,0 +1,45 @@ ++// uv_cond_* backport ++// Lifted from the Node 0.9 version of libuv for Node 0.8 compatibility ++// https://github.com/joyent/libuv/ ++ ++// libuv copyright notice: ++ ++/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. ++* ++* Permission is hereby granted, free of charge, to any person obtaining a copy ++* of this software and associated documentation files (the "Software"), to ++* deal in the Software without restriction, including without limitation the ++* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++* sell copies of the Software, and to permit persons to whom the Software is ++* furnished to do so, subject to the following conditions: ++* ++* The above copyright notice and this permission notice shall be included in ++* all copies or substantial portions of the Software. ++* ++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ++* IN THE SOFTWARE. ++*/ ++ ++#ifndef LEVELDB_PORT_LIBUV_CONVAR_H_ ++#define LEVELDB_PORT_LIBUV_CONVAR_H_ ++ ++#include ++ ++#ifdef LDB_UV_POSIX ++ typedef pthread_cond_t ldb_uv_cond_t; ++#endif ++ ++ ++UV_EXTERN int ldb_uv_cond_init(ldb_uv_cond_t* cond); ++UV_EXTERN void ldb_uv_cond_destroy(ldb_uv_cond_t* cond); ++UV_EXTERN void ldb_uv_cond_signal(ldb_uv_cond_t* cond); ++UV_EXTERN void ldb_uv_cond_broadcast(ldb_uv_cond_t* cond); ++UV_EXTERN void ldb_uv_cond_wait(ldb_uv_cond_t* cond, uv_mutex_t* mutex); ++UV_EXTERN int ldb_uv_cond_timedwait(ldb_uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout); ++ ++#endif // LEVELDB_PORT_LIBUV_CONVAR_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar_posix.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar_posix.cc +new file mode 100644 +index 0000000..d56f558 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar_posix.cc +@@ -0,0 +1,139 @@ ++// uv_cond_* backport ++// Lifted from the Node 0.9 version of libuv for Node 0.8 compatibility ++// https://github.com/joyent/libuv/ ++ ++// libuv copyright notice: ++ ++/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. ++* ++* Permission is hereby granted, free of charge, to any person obtaining a copy ++* of this software and associated documentation files (the "Software"), to ++* deal in the Software without restriction, including without limitation the ++* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++* sell copies of the Software, and to permit persons to whom the Software is ++* furnished to do so, subject to the following conditions: ++* ++* The above copyright notice and this permission notice shall be included in ++* all copies or substantial portions of the Software. ++* ++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ++* IN THE SOFTWARE. ++*/ ++ ++#include ++#include "uv_condvar.h" ++#include /* abort */ ++#include /* ETIMEDOUT */ ++ ++#undef NANOSEC ++#define NANOSEC ((uint64_t) 1e9) ++ ++#if defined(__APPLE__) && defined(__MACH__) ++ ++int ldb_uv_cond_init(ldb_uv_cond_t* cond) { ++ if (pthread_cond_init(cond, NULL)) ++ return -1; ++ else ++ return 0; ++} ++ ++#else /* !(defined(__APPLE__) && defined(__MACH__)) */ ++ ++int ldb_uv_cond_init(ldb_uv_cond_t* cond) { ++ pthread_condattr_t attr; ++ ++ if (pthread_condattr_init(&attr)) ++ return -1; ++ ++ if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) ++ goto error2; ++ ++ if (pthread_cond_init(cond, &attr)) ++ goto error2; ++ ++ if (pthread_condattr_destroy(&attr)) ++ goto error; ++ ++ return 0; ++ ++error: ++ pthread_cond_destroy(cond); ++error2: ++ pthread_condattr_destroy(&attr); ++ return -1; ++} ++ ++#endif /* defined(__APPLE__) && defined(__MACH__) */ ++ ++void ldb_uv_cond_destroy(ldb_uv_cond_t* cond) { ++ if (pthread_cond_destroy(cond)) ++ abort(); ++} ++ ++void ldb_uv_cond_signal(ldb_uv_cond_t* cond) { ++ if (pthread_cond_signal(cond)) ++ abort(); ++} ++ ++void ldb_uv_cond_broadcast(ldb_uv_cond_t* cond) { ++ if (pthread_cond_broadcast(cond)) ++ abort(); ++} ++ ++void ldb_uv_cond_wait(ldb_uv_cond_t* cond, uv_mutex_t* mutex) { ++ if (pthread_cond_wait(cond, mutex)) ++ abort(); ++} ++ ++#if defined(__APPLE__) && defined(__MACH__) ++ ++int ldb_uv_cond_timedwait(ldb_uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { ++ int r; ++ struct timeval tv; ++ struct timespec ts; ++ uint64_t abstime; ++ ++ gettimeofday(&tv, NULL); ++ abstime = tv.tv_sec * 1e9 + tv.tv_usec * 1e3 + timeout; ++ ts.tv_sec = abstime / NANOSEC; ++ ts.tv_nsec = abstime % NANOSEC; ++ r = pthread_cond_timedwait(cond, mutex, &ts); ++ ++ if (r == 0) ++ return 0; ++ ++ if (r == ETIMEDOUT) ++ return -1; ++ ++ abort(); ++ return -1; /* Satisfy the compiler. */ ++} ++ ++#else /* !(defined(__APPLE__) && defined(__MACH__)) */ ++ ++int ldb_uv_cond_timedwait(ldb_uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { ++ int r; ++ struct timespec ts; ++ uint64_t abstime; ++ ++ abstime = uv_hrtime() + timeout; ++ ts.tv_sec = abstime / NANOSEC; ++ ts.tv_nsec = abstime % NANOSEC; ++ r = pthread_cond_timedwait(cond, mutex, &ts); ++ ++ if (r == 0) ++ return 0; ++ ++ if (r == ETIMEDOUT) ++ return -1; ++ ++ abort(); ++ return -1; /* Satisfy the compiler. */ ++} ++ ++#endif /* defined(__APPLE__) && defined(__MACH__) */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.cc +new file mode 100644 +index 0000000..a2cec75 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.cc +@@ -0,0 +1,79 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++#include "win_logger.h" ++ ++#include ++ ++namespace leveldb { ++ ++void WinLogger::Logv(const char* format, va_list ap) { ++ const uint64_t thread_id = static_cast(::GetCurrentThreadId()); ++ ++ // We try twice: the first time with a fixed-size stack allocated buffer, ++ // and the second time with a much larger dynamically allocated buffer. ++ char buffer[500]; ++ ++ for (int iter = 0; iter < 2; iter++) { ++ char* base; ++ int bufsize; ++ if (iter == 0) { ++ bufsize = sizeof(buffer); ++ base = buffer; ++ } else { ++ bufsize = 30000; ++ base = new char[bufsize]; ++ } ++ ++ char* p = base; ++ char* limit = base + bufsize; ++ ++ SYSTEMTIME st; ++ ++ // GetSystemTime returns UTC time, we want local time! ++ ::GetLocalTime(&st); ++ ++ p += _snprintf_s(p, limit - p, _TRUNCATE, ++ "%04d/%02d/%02d-%02d:%02d:%02d.%03d %llx ", ++ st.wYear, ++ st.wMonth, ++ st.wDay, ++ st.wHour, ++ st.wMinute, ++ st.wSecond, ++ st.wMilliseconds, ++ static_cast(thread_id)); ++ ++ // Print the message ++ if (p < limit) { ++ va_list backup_ap = ap; ++ p += vsnprintf(p, limit - p, format, backup_ap); ++ va_end(backup_ap); ++ } ++ ++ // Truncate to available space if necessary ++ if (p >= limit) { ++ if (iter == 0) { ++ continue; // Try again with larger buffer ++ } else { ++ p = limit - 1; ++ } ++ } ++ ++ // Add newline if necessary ++ if (p == base || p[-1] != '\n') { ++ *p++ = '\n'; ++ } ++ ++ assert(p <= limit); ++ fwrite(base, 1, p - base, file_); ++ fflush(file_); ++ if (base != buffer) { ++ delete[] base; ++ } ++ break; ++ } ++} ++ ++} +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.h +new file mode 100644 +index 0000000..b155d5c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.h +@@ -0,0 +1,28 @@ ++// Copyright (c) 2011 The LevelDB Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. See the AUTHORS file for names of contributors. ++ ++// Logger implementation for Windows ++ ++#ifndef STORAGE_LEVELDB_UTIL_WIN_LOGGER_H_ ++#define STORAGE_LEVELDB_UTIL_WIN_LOGGER_H_ ++ ++#include ++#include "leveldb/env.h" ++ ++namespace leveldb { ++ ++class WinLogger : public Logger { ++ private: ++ FILE* file_; ++ public: ++ explicit WinLogger(FILE* f) : file_(f) { assert(file_); } ++ virtual ~WinLogger() { ++ fclose(file_); ++ } ++ virtual void Logv(const char* format, va_list ap); ++ ++}; ++ ++} ++#endif // STORAGE_LEVELDB_UTIL_WIN_LOGGER_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/config.h +new file mode 100644 +index 0000000..5ed0ace +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/config.h +@@ -0,0 +1,135 @@ ++/* config.h. Generated from config.h.in by configure. */ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define if building universal (internal helper macro) */ ++/* #undef AC_APPLE_UNIVERSAL_BUILD */ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#define HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#define HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_DLFCN_H 1 ++ ++/* Use the gflags package for command-line parsing. */ ++/* #undef HAVE_GFLAGS */ ++ ++/* Defined when Google Test is available. */ ++/* #undef HAVE_GTEST */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_INTTYPES_H 1 ++ ++/* Define to 1 if you have the `fastlz' library (-lfastlz). */ ++/* #undef HAVE_LIBFASTLZ */ ++ ++/* Define to 1 if you have the `lzf' library (-llzf). */ ++/* #undef HAVE_LIBLZF */ ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++/* #undef HAVE_LIBLZO2 */ ++ ++/* Define to 1 if you have the `quicklz' library (-lquicklz). */ ++/* #undef HAVE_LIBQUICKLZ */ ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#define HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_MEMORY_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDLIB_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRINGS_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRING_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_ENDIAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_STAT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TYPES_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_WINDOWS_H */ ++ ++/* Define to the sub-directory in which libtool stores uninstalled libraries. ++ */ ++#define LT_OBJDIR ".libs/" ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" ++ ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++/* # undef WORDS_BIGENDIAN */ ++# endif ++#endif ++ ++/* Define to `unsigned int' if does not define. */ ++/* #undef size_t */ ++ ++/* Define to `int' if does not define. */ ++/* #undef ssize_t */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/snappy-stubs-public.h +new file mode 100644 +index 0000000..3ce2b59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/freebsd/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 1 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !1 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/config.h +new file mode 100644 +index 0000000..11f632f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/config.h +@@ -0,0 +1,135 @@ ++/* config.h. Generated from config.h.in by configure. */ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define if building universal (internal helper macro) */ ++/* #undef AC_APPLE_UNIVERSAL_BUILD */ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#define HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#define HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_BYTESWAP_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_DLFCN_H 1 ++ ++/* Use the gflags package for command-line parsing. */ ++/* #undef HAVE_GFLAGS */ ++ ++/* Defined when Google Test is available. */ ++/* #undef HAVE_GTEST */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_INTTYPES_H 1 ++ ++/* Define to 1 if you have the `fastlz' library (-lfastlz). */ ++/* #undef HAVE_LIBFASTLZ */ ++ ++/* Define to 1 if you have the `lzf' library (-llzf). */ ++/* #undef HAVE_LIBLZF */ ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++/* #undef HAVE_LIBLZO2 */ ++ ++/* Define to 1 if you have the `quicklz' library (-lquicklz). */ ++/* #undef HAVE_LIBQUICKLZ */ ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#define HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_MEMORY_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDLIB_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRINGS_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRING_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_ENDIAN_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_STAT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TYPES_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_WINDOWS_H */ ++ ++/* Define to the sub-directory in which libtool stores uninstalled libraries. ++ */ ++#define LT_OBJDIR ".libs/" ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" ++ ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++/* # undef WORDS_BIGENDIAN */ ++# endif ++#endif ++ ++/* Define to `unsigned int' if does not define. */ ++/* #undef size_t */ ++ ++/* Define to `int' if does not define. */ ++/* #undef ssize_t */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/snappy-stubs-public.h +new file mode 100644 +index 0000000..3ce2b59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/linux/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 1 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !1 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/config.h +new file mode 100644 +index 0000000..a844119 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/config.h +@@ -0,0 +1,137 @@ ++/* config.h. Generated from config.h.in by configure. */ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define if building universal (internal helper macro) */ ++/* #undef AC_APPLE_UNIVERSAL_BUILD */ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#define HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#define HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_DLFCN_H 1 ++ ++/* Use the gflags package for command-line parsing. */ ++/* #undef HAVE_GFLAGS */ ++ ++/* Defined when Google Test is available. */ ++/* #undef HAVE_GTEST */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_INTTYPES_H 1 ++ ++/* Define to 1 if you have the `fastlz' library (-lfastlz). */ ++/* #undef HAVE_LIBFASTLZ */ ++ ++/* Define to 1 if you have the `lzf' library (-llzf). */ ++/* #undef HAVE_LIBLZF */ ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++/* #undef HAVE_LIBLZO2 */ ++ ++/* Define to 1 if you have the `quicklz' library (-lquicklz). */ ++/* #undef HAVE_LIBQUICKLZ */ ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#define HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_MEMORY_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDLIB_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRINGS_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRING_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_ENDIAN_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_STAT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TYPES_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_WINDOWS_H */ ++ ++/* Define to the sub-directory where libtool stores uninstalled libraries. */ ++#define LT_OBJDIR ".libs/" ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the home page for this package. */ ++#define PACKAGE_URL "" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" ++ ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++/* # undef WORDS_BIGENDIAN */ ++# endif ++#endif ++ ++/* Define to `unsigned int' if does not define. */ ++/* #undef size_t */ ++ ++/* Define to `int' if does not define. */ ++/* #undef ssize_t */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/snappy-stubs-public.h +new file mode 100644 +index 0000000..3ce2b59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/mac/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 1 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !1 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/config.h +new file mode 100644 +index 0000000..5ed0ace +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/config.h +@@ -0,0 +1,135 @@ ++/* config.h. Generated from config.h.in by configure. */ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define if building universal (internal helper macro) */ ++/* #undef AC_APPLE_UNIVERSAL_BUILD */ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#define HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#define HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_DLFCN_H 1 ++ ++/* Use the gflags package for command-line parsing. */ ++/* #undef HAVE_GFLAGS */ ++ ++/* Defined when Google Test is available. */ ++/* #undef HAVE_GTEST */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_INTTYPES_H 1 ++ ++/* Define to 1 if you have the `fastlz' library (-lfastlz). */ ++/* #undef HAVE_LIBFASTLZ */ ++ ++/* Define to 1 if you have the `lzf' library (-llzf). */ ++/* #undef HAVE_LIBLZF */ ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++/* #undef HAVE_LIBLZO2 */ ++ ++/* Define to 1 if you have the `quicklz' library (-lquicklz). */ ++/* #undef HAVE_LIBQUICKLZ */ ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#define HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_MEMORY_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDLIB_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRINGS_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRING_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_ENDIAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_STAT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TYPES_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_WINDOWS_H */ ++ ++/* Define to the sub-directory in which libtool stores uninstalled libraries. ++ */ ++#define LT_OBJDIR ".libs/" ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" ++ ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++/* # undef WORDS_BIGENDIAN */ ++# endif ++#endif ++ ++/* Define to `unsigned int' if does not define. */ ++/* #undef size_t */ ++ ++/* Define to `int' if does not define. */ ++/* #undef ssize_t */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/snappy-stubs-public.h +new file mode 100644 +index 0000000..3ce2b59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/openbsd/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 1 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !1 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy.gyp b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy.gyp +new file mode 100644 +index 0000000..c123f1e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy.gyp +@@ -0,0 +1,106 @@ ++{ ++ "targets": [{ ++ "variables": { ++ "conditions": [ ++ ["OS=='linux'", {"os_include": "linux"}], ++ ["OS=='android'", {"os_include": "linux"}], ++ ["OS=='ios'", {"os_include": "mac"}], ++ ["OS=='mac'", {"os_include": "mac"}], ++ ["OS=='solaris'", {"os_include": "solaris"}], ++ ["OS=='win'", {"os_include": "win32"}], ++ ["OS=='freebsd'", {"os_include": "freebsd"}], ++ ["OS=='openbsd'", {"os_include": "openbsd"}] ++ ] ++ }, ++ "target_name": "snappy", ++ "type": "static_library", ++ "standalone_static_library": 1, ++ "include_dirs": [ ++ "<(os_include)", ++ "snappy" ++ ], ++ "direct_dependent_settings": { ++ "include_dirs": [ ++ "<(os_include)", ++ "snappy" ++ ] ++ }, ++ "defines": [ ++ "HAVE_CONFIG_H=1" ++ ], ++ "conditions": [ ++ ["OS == 'win'", { ++ "defines": [ ++ "_HAS_EXCEPTIONS=0" ++ ], ++ "msvs_settings": { ++ "VCCLCompilerTool": { ++ "RuntimeTypeInfo": "false", ++ "EnableFunctionLevelLinking": "true", ++ "ExceptionHandling": "2", ++ "DisableSpecificWarnings": [ "4355", "4530" ,"4267", "4244", "4506", "4018" ] ++ } ++ } ++ }], ++ ["OS == 'linux'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-function" ++ ], ++ "cflags!": [ "-fno-tree-vrp" ] ++ }], ++ ["OS == 'freebsd'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-function" ++ ] ++ }], ++ ["OS == 'openbsd'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-function" ++ ] ++ }], ++ ["OS == 'solaris'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-function" ++ ] ++ }], ++ ["OS == 'mac'", { ++ "xcode_settings": { ++ "WARNING_CFLAGS": [ ++ "-Wno-sign-compare", ++ "-Wno-unused-function" ++ ] ++ } ++ }], ++ ["OS == 'android'", { ++ "cflags": [ ++ "-Wno-sign-compare", ++ "-fPIC", ++ "-Wno-unused-function" ++ ], ++ "cflags!": [ ++ "-fno-tree-vrp", ++ "-mfloat-abi=hard", ++ "-fPIE" ++ ] ++ }], ++ ["target_arch == 'arm'", { ++ "cflags": [ ++ "-mfloat-abi=hard" ++ ] ++ }] ++ ], ++ "sources": [ ++ "snappy/snappy-internal.h", ++ "snappy/snappy-sinksource.cc", ++ "snappy/snappy-sinksource.h", ++ "snappy/snappy-stubs-internal.cc", ++ "snappy/snappy-stubs-internal.h", ++ "snappy/snappy.cc", ++ "snappy/snappy.h" ++ ] ++ }] ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/COPYING b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/COPYING +new file mode 100644 +index 0000000..bd0e597 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/COPYING +@@ -0,0 +1,54 @@ ++Copyright 2011, Google Inc. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are ++met: ++ ++ * Redistributions of source code must retain the above copyright ++notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above ++copyright notice, this list of conditions and the following disclaimer ++in the documentation and/or other materials provided with the ++distribution. ++ * Neither the name of Google Inc. nor the names of its ++contributors may be used to endorse or promote products derived from ++this software without specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++=== ++ ++Some of the benchmark data in testdata/ is licensed differently: ++ ++ - fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and ++ is licensed under the Creative Commons Attribution 3.0 license ++ (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ ++ for more information. ++ ++ - kppkn.gtb is taken from the Gaviota chess tablebase set, and ++ is licensed under the MIT License. See ++ https://sites.google.com/site/gaviotachessengine/Home/endgame-tablebases-1 ++ for more information. ++ ++ - paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper ++ “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA ++ Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, ++ which is licensed under the CC-BY license. See ++ http://www.ploscompbiol.org/static/license for more ifnormation. ++ ++ - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project ++ Gutenberg. The first three have expired copyrights and are in the public ++ domain; the latter does not have expired copyright, but is still in the ++ public domain according to the license information ++ (http://www.gutenberg.org/ebooks/53). +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/README.md +new file mode 100644 +index 0000000..b9db833 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/README.md +@@ -0,0 +1,149 @@ ++Snappy, a fast compressor/decompressor. ++ ++ ++Introduction ++============ ++ ++Snappy is a compression/decompression library. It does not aim for maximum ++compression, or compatibility with any other compression library; instead, ++it aims for very high speeds and reasonable compression. For instance, ++compared to the fastest mode of zlib, Snappy is an order of magnitude faster ++for most inputs, but the resulting compressed files are anywhere from 20% to ++100% bigger. (For more information, see "Performance", below.) ++ ++Snappy has the following properties: ++ ++ * Fast: Compression speeds at 250 MB/sec and beyond, with no assembler code. ++ See "Performance" below. ++ * Stable: Over the last few years, Snappy has compressed and decompressed ++ petabytes of data in Google's production environment. The Snappy bitstream ++ format is stable and will not change between versions. ++ * Robust: The Snappy decompressor is designed not to crash in the face of ++ corrupted or malicious input. ++ * Free and open source software: Snappy is licensed under a BSD-type license. ++ For more information, see the included COPYING file. ++ ++Snappy has previously been called "Zippy" in some Google presentations ++and the like. ++ ++ ++Performance ++=========== ++ ++Snappy is intended to be fast. On a single core of a Core i7 processor ++in 64-bit mode, it compresses at about 250 MB/sec or more and decompresses at ++about 500 MB/sec or more. (These numbers are for the slowest inputs in our ++benchmark suite; others are much faster.) In our tests, Snappy usually ++is faster than algorithms in the same class (e.g. LZO, LZF, QuickLZ, ++etc.) while achieving comparable compression ratios. ++ ++Typical compression ratios (based on the benchmark suite) are about 1.5-1.7x ++for plain text, about 2-4x for HTML, and of course 1.0x for JPEGs, PNGs and ++other already-compressed data. Similar numbers for zlib in its fastest mode ++are 2.6-2.8x, 3-7x and 1.0x, respectively. More sophisticated algorithms are ++capable of achieving yet higher compression rates, although usually at the ++expense of speed. Of course, compression ratio will vary significantly with ++the input. ++ ++Although Snappy should be fairly portable, it is primarily optimized ++for 64-bit x86-compatible processors, and may run slower in other environments. ++In particular: ++ ++ - Snappy uses 64-bit operations in several places to process more data at ++ once than would otherwise be possible. ++ - Snappy assumes unaligned 32- and 64-bit loads and stores are cheap. ++ On some platforms, these must be emulated with single-byte loads ++ and stores, which is much slower. ++ - Snappy assumes little-endian throughout, and needs to byte-swap data in ++ several places if running on a big-endian platform. ++ ++Experience has shown that even heavily tuned code can be improved. ++Performance optimizations, whether for 64-bit x86 or other platforms, ++are of course most welcome; see "Contact", below. ++ ++ ++Building ++======== ++ ++CMake is supported and autotools will soon be deprecated. ++You need CMake 3.4 or above to build: ++ ++ mkdir build ++ cd build && cmake ../ && make ++ ++ ++Usage ++===== ++ ++Note that Snappy, both the implementation and the main interface, ++is written in C++. However, several third-party bindings to other languages ++are available; see the home page at http://google.github.io/snappy/ ++for more information. Also, if you want to use Snappy from C code, you can ++use the included C bindings in snappy-c.h. ++ ++To use Snappy from your own C++ program, include the file "snappy.h" from ++your calling file, and link against the compiled library. ++ ++There are many ways to call Snappy, but the simplest possible is ++ ++ snappy::Compress(input.data(), input.size(), &output); ++ ++and similarly ++ ++ snappy::Uncompress(input.data(), input.size(), &output); ++ ++where "input" and "output" are both instances of std::string. ++ ++There are other interfaces that are more flexible in various ways, including ++support for custom (non-array) input sources. See the header file for more ++information. ++ ++ ++Tests and benchmarks ++==================== ++ ++When you compile Snappy, snappy_unittest is compiled in addition to the ++library itself. You do not need it to use the compressor from your own library, ++but it contains several useful components for Snappy development. ++ ++First of all, it contains unit tests, verifying correctness on your machine in ++various scenarios. If you want to change or optimize Snappy, please run the ++tests to verify you have not broken anything. Note that if you have the ++Google Test library installed, unit test behavior (especially failures) will be ++significantly more user-friendly. You can find Google Test at ++ ++ http://github.com/google/googletest ++ ++You probably also want the gflags library for handling of command-line flags; ++you can find it at ++ ++ http://gflags.github.io/gflags/ ++ ++In addition to the unit tests, snappy contains microbenchmarks used to ++tune compression and decompression performance. These are automatically run ++before the unit tests, but you can disable them using the flag ++--run_microbenchmarks=false if you have gflags installed (otherwise you will ++need to edit the source). ++ ++Finally, snappy can benchmark Snappy against a few other compression libraries ++(zlib, LZO, LZF, and QuickLZ), if they were detected at configure time. ++To benchmark using a given file, give the compression algorithm you want to test ++Snappy against (e.g. --zlib) and then a list of one or more file names on the ++command line. The testdata/ directory contains the files used by the ++microbenchmark, which should provide a reasonably balanced starting point for ++benchmarking. (Note that baddata[1-3].snappy are not intended as benchmarks; they ++are used to verify correctness in the presence of corrupted data in the unit ++test.) ++ ++ ++Contact ++======= ++ ++Snappy is distributed through GitHub. For the latest version, a bug tracker, ++and other information, see ++ ++ http://google.github.io/snappy/ ++ ++or the repository at ++ ++ https://github.com/google/snappy +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/SnappyConfig.cmake b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/SnappyConfig.cmake +new file mode 100644 +index 0000000..dc308ae +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/SnappyConfig.cmake +@@ -0,0 +1 @@ ++include("${CMAKE_CURRENT_LIST_DIR}/SnappyTargets.cmake") +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/config.h.in b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/config.h.in +new file mode 100644 +index 0000000..97cd818 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/config.h.in +@@ -0,0 +1,62 @@ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#cmakedefine HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#cmakedefine HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_BYTESWAP_H 1 ++ ++/* Define to 1 if you have a definition for mmap() in . */ ++#cmakedefine HAVE_FUNC_MMAP 1 ++ ++/* Define to 1 if you have a definition for sysconf() in . */ ++#cmakedefine HAVE_FUNC_SYSCONF 1 ++ ++/* Define to 1 to use the gflags package for command-line parsing. */ ++#cmakedefine HAVE_GFLAGS 1 ++ ++/* Define to 1 if you have Google Test. */ ++#cmakedefine HAVE_GTEST 1 ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++#cmakedefine HAVE_LIBLZO2 1 ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#cmakedefine HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_SYS_ENDIAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#cmakedefine HAVE_WINDOWS_H 1 ++ ++/* Define to 1 if your processor stores words with the most significant byte ++ first (like Motorola and SPARC, unlike Intel and VAX). */ ++#cmakedefine SNAPPY_IS_BIG_ENDIAN 1 ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.cc +new file mode 100644 +index 0000000..473a0b0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.cc +@@ -0,0 +1,90 @@ ++// Copyright 2011 Martin Gieseking . ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#include "snappy.h" ++#include "snappy-c.h" ++ ++extern "C" { ++ ++snappy_status snappy_compress(const char* input, ++ size_t input_length, ++ char* compressed, ++ size_t *compressed_length) { ++ if (*compressed_length < snappy_max_compressed_length(input_length)) { ++ return SNAPPY_BUFFER_TOO_SMALL; ++ } ++ snappy::RawCompress(input, input_length, compressed, compressed_length); ++ return SNAPPY_OK; ++} ++ ++snappy_status snappy_uncompress(const char* compressed, ++ size_t compressed_length, ++ char* uncompressed, ++ size_t* uncompressed_length) { ++ size_t real_uncompressed_length; ++ if (!snappy::GetUncompressedLength(compressed, ++ compressed_length, ++ &real_uncompressed_length)) { ++ return SNAPPY_INVALID_INPUT; ++ } ++ if (*uncompressed_length < real_uncompressed_length) { ++ return SNAPPY_BUFFER_TOO_SMALL; ++ } ++ if (!snappy::RawUncompress(compressed, compressed_length, uncompressed)) { ++ return SNAPPY_INVALID_INPUT; ++ } ++ *uncompressed_length = real_uncompressed_length; ++ return SNAPPY_OK; ++} ++ ++size_t snappy_max_compressed_length(size_t source_length) { ++ return snappy::MaxCompressedLength(source_length); ++} ++ ++snappy_status snappy_uncompressed_length(const char *compressed, ++ size_t compressed_length, ++ size_t *result) { ++ if (snappy::GetUncompressedLength(compressed, ++ compressed_length, ++ result)) { ++ return SNAPPY_OK; ++ } else { ++ return SNAPPY_INVALID_INPUT; ++ } ++} ++ ++snappy_status snappy_validate_compressed_buffer(const char *compressed, ++ size_t compressed_length) { ++ if (snappy::IsValidCompressedBuffer(compressed, compressed_length)) { ++ return SNAPPY_OK; ++ } else { ++ return SNAPPY_INVALID_INPUT; ++ } ++} ++ ++} // extern "C" +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.h +new file mode 100644 +index 0000000..32aa0c6 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.h +@@ -0,0 +1,138 @@ ++/* ++ * Copyright 2011 Martin Gieseking . ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are ++ * met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * Redistributions in binary form must reproduce the above ++ * copyright notice, this list of conditions and the following disclaimer ++ * in the documentation and/or other materials provided with the ++ * distribution. ++ * * Neither the name of Google Inc. nor the names of its ++ * contributors may be used to endorse or promote products derived from ++ * this software without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * Plain C interface (a wrapper around the C++ implementation). ++ */ ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++/* ++ * Return values; see the documentation for each function to know ++ * what each can return. ++ */ ++typedef enum { ++ SNAPPY_OK = 0, ++ SNAPPY_INVALID_INPUT = 1, ++ SNAPPY_BUFFER_TOO_SMALL = 2 ++} snappy_status; ++ ++/* ++ * Takes the data stored in "input[0..input_length-1]" and stores ++ * it in the array pointed to by "compressed". ++ * ++ * signals the space available in "compressed". ++ * If it is not at least equal to "snappy_max_compressed_length(input_length)", ++ * SNAPPY_BUFFER_TOO_SMALL is returned. After successful compression, ++ * contains the true length of the compressed output, ++ * and SNAPPY_OK is returned. ++ * ++ * Example: ++ * size_t output_length = snappy_max_compressed_length(input_length); ++ * char* output = (char*)malloc(output_length); ++ * if (snappy_compress(input, input_length, output, &output_length) ++ * == SNAPPY_OK) { ++ * ... Process(output, output_length) ... ++ * } ++ * free(output); ++ */ ++snappy_status snappy_compress(const char* input, ++ size_t input_length, ++ char* compressed, ++ size_t* compressed_length); ++ ++/* ++ * Given data in "compressed[0..compressed_length-1]" generated by ++ * calling the snappy_compress routine, this routine stores ++ * the uncompressed data to ++ * uncompressed[0..uncompressed_length-1]. ++ * Returns failure (a value not equal to SNAPPY_OK) if the message ++ * is corrupted and could not be decrypted. ++ * ++ * signals the space available in "uncompressed". ++ * If it is not at least equal to the value returned by ++ * snappy_uncompressed_length for this stream, SNAPPY_BUFFER_TOO_SMALL ++ * is returned. After successful decompression, ++ * contains the true length of the decompressed output. ++ * ++ * Example: ++ * size_t output_length; ++ * if (snappy_uncompressed_length(input, input_length, &output_length) ++ * != SNAPPY_OK) { ++ * ... fail ... ++ * } ++ * char* output = (char*)malloc(output_length); ++ * if (snappy_uncompress(input, input_length, output, &output_length) ++ * == SNAPPY_OK) { ++ * ... Process(output, output_length) ... ++ * } ++ * free(output); ++ */ ++snappy_status snappy_uncompress(const char* compressed, ++ size_t compressed_length, ++ char* uncompressed, ++ size_t* uncompressed_length); ++ ++/* ++ * Returns the maximal size of the compressed representation of ++ * input data that is "source_length" bytes in length. ++ */ ++size_t snappy_max_compressed_length(size_t source_length); ++ ++/* ++ * REQUIRES: "compressed[]" was produced by snappy_compress() ++ * Returns SNAPPY_OK and stores the length of the uncompressed data in ++ * *result normally. Returns SNAPPY_INVALID_INPUT on parsing error. ++ * This operation takes O(1) time. ++ */ ++snappy_status snappy_uncompressed_length(const char* compressed, ++ size_t compressed_length, ++ size_t* result); ++ ++/* ++ * Check if the contents of "compressed[]" can be uncompressed successfully. ++ * Does not return the uncompressed data; if so, returns SNAPPY_OK, ++ * or if not, returns SNAPPY_INVALID_INPUT. ++ * Takes time proportional to compressed_length, but is usually at least a ++ * factor of four faster than actual decompression. ++ */ ++snappy_status snappy_validate_compressed_buffer(const char* compressed, ++ size_t compressed_length); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++#endif /* THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-internal.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-internal.h +new file mode 100644 +index 0000000..4b53d59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-internal.h +@@ -0,0 +1,224 @@ ++// Copyright 2008 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Internals shared between the Snappy implementation and its unittest. ++ ++#ifndef THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_ ++#define THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_ ++ ++#include "snappy-stubs-internal.h" ++ ++namespace snappy { ++namespace internal { ++ ++class WorkingMemory { ++ public: ++ WorkingMemory() : large_table_(NULL) { } ++ ~WorkingMemory() { delete[] large_table_; } ++ ++ // Allocates and clears a hash table using memory in "*this", ++ // stores the number of buckets in "*table_size" and returns a pointer to ++ // the base of the hash table. ++ uint16* GetHashTable(size_t input_size, int* table_size); ++ ++ private: ++ uint16 small_table_[1<<10]; // 2KB ++ uint16* large_table_; // Allocated only when needed ++ ++ // No copying ++ WorkingMemory(const WorkingMemory&); ++ void operator=(const WorkingMemory&); ++}; ++ ++// Flat array compression that does not emit the "uncompressed length" ++// prefix. Compresses "input" string to the "*op" buffer. ++// ++// REQUIRES: "input_length <= kBlockSize" ++// REQUIRES: "op" points to an array of memory that is at least ++// "MaxCompressedLength(input_length)" in size. ++// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. ++// REQUIRES: "table_size" is a power of two ++// ++// Returns an "end" pointer into "op" buffer. ++// "end - op" is the compressed size of "input". ++char* CompressFragment(const char* input, ++ size_t input_length, ++ char* op, ++ uint16* table, ++ const int table_size); ++ ++// Find the largest n such that ++// ++// s1[0,n-1] == s2[0,n-1] ++// and n <= (s2_limit - s2). ++// ++// Return make_pair(n, n < 8). ++// Does not read *s2_limit or beyond. ++// Does not read *(s1 + (s2_limit - s2)) or beyond. ++// Requires that s2_limit >= s2. ++// ++// Separate implementation for 64-bit, little-endian cpus. ++#if !defined(SNAPPY_IS_BIG_ENDIAN) && \ ++ (defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)) ++static inline std::pair FindMatchLength(const char* s1, ++ const char* s2, ++ const char* s2_limit) { ++ assert(s2_limit >= s2); ++ size_t matched = 0; ++ ++ // This block isn't necessary for correctness; we could just start looping ++ // immediately. As an optimization though, it is useful. It creates some not ++ // uncommon code paths that determine, without extra effort, whether the match ++ // length is less than 8. In short, we are hoping to avoid a conditional ++ // branch, and perhaps get better code layout from the C++ compiler. ++ if (SNAPPY_PREDICT_TRUE(s2 <= s2_limit - 8)) { ++ uint64 a1 = UNALIGNED_LOAD64(s1); ++ uint64 a2 = UNALIGNED_LOAD64(s2); ++ if (a1 != a2) { ++ return std::pair(Bits::FindLSBSetNonZero64(a1 ^ a2) >> 3, ++ true); ++ } else { ++ matched = 8; ++ s2 += 8; ++ } ++ } ++ ++ // Find out how long the match is. We loop over the data 64 bits at a ++ // time until we find a 64-bit block that doesn't match; then we find ++ // the first non-matching bit and use that to calculate the total ++ // length of the match. ++ while (SNAPPY_PREDICT_TRUE(s2 <= s2_limit - 8)) { ++ if (UNALIGNED_LOAD64(s2) == UNALIGNED_LOAD64(s1 + matched)) { ++ s2 += 8; ++ matched += 8; ++ } else { ++ uint64 x = UNALIGNED_LOAD64(s2) ^ UNALIGNED_LOAD64(s1 + matched); ++ int matching_bits = Bits::FindLSBSetNonZero64(x); ++ matched += matching_bits >> 3; ++ assert(matched >= 8); ++ return std::pair(matched, false); ++ } ++ } ++ while (SNAPPY_PREDICT_TRUE(s2 < s2_limit)) { ++ if (s1[matched] == *s2) { ++ ++s2; ++ ++matched; ++ } else { ++ return std::pair(matched, matched < 8); ++ } ++ } ++ return std::pair(matched, matched < 8); ++} ++#else ++static inline std::pair FindMatchLength(const char* s1, ++ const char* s2, ++ const char* s2_limit) { ++ // Implementation based on the x86-64 version, above. ++ assert(s2_limit >= s2); ++ int matched = 0; ++ ++ while (s2 <= s2_limit - 4 && ++ UNALIGNED_LOAD32(s2) == UNALIGNED_LOAD32(s1 + matched)) { ++ s2 += 4; ++ matched += 4; ++ } ++ if (LittleEndian::IsLittleEndian() && s2 <= s2_limit - 4) { ++ uint32 x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched); ++ int matching_bits = Bits::FindLSBSetNonZero(x); ++ matched += matching_bits >> 3; ++ } else { ++ while ((s2 < s2_limit) && (s1[matched] == *s2)) { ++ ++s2; ++ ++matched; ++ } ++ } ++ return std::pair(matched, matched < 8); ++} ++#endif ++ ++// Lookup tables for decompression code. Give --snappy_dump_decompression_table ++// to the unit test to recompute char_table. ++ ++enum { ++ LITERAL = 0, ++ COPY_1_BYTE_OFFSET = 1, // 3 bit length + 3 bits of offset in opcode ++ COPY_2_BYTE_OFFSET = 2, ++ COPY_4_BYTE_OFFSET = 3 ++}; ++static const int kMaximumTagLength = 5; // COPY_4_BYTE_OFFSET plus the actual offset. ++ ++// Data stored per entry in lookup table: ++// Range Bits-used Description ++// ------------------------------------ ++// 1..64 0..7 Literal/copy length encoded in opcode byte ++// 0..7 8..10 Copy offset encoded in opcode byte / 256 ++// 0..4 11..13 Extra bytes after opcode ++// ++// We use eight bits for the length even though 7 would have sufficed ++// because of efficiency reasons: ++// (1) Extracting a byte is faster than a bit-field ++// (2) It properly aligns copy offset so we do not need a <<8 ++static const uint16 char_table[256] = { ++ 0x0001, 0x0804, 0x1001, 0x2001, 0x0002, 0x0805, 0x1002, 0x2002, ++ 0x0003, 0x0806, 0x1003, 0x2003, 0x0004, 0x0807, 0x1004, 0x2004, ++ 0x0005, 0x0808, 0x1005, 0x2005, 0x0006, 0x0809, 0x1006, 0x2006, ++ 0x0007, 0x080a, 0x1007, 0x2007, 0x0008, 0x080b, 0x1008, 0x2008, ++ 0x0009, 0x0904, 0x1009, 0x2009, 0x000a, 0x0905, 0x100a, 0x200a, ++ 0x000b, 0x0906, 0x100b, 0x200b, 0x000c, 0x0907, 0x100c, 0x200c, ++ 0x000d, 0x0908, 0x100d, 0x200d, 0x000e, 0x0909, 0x100e, 0x200e, ++ 0x000f, 0x090a, 0x100f, 0x200f, 0x0010, 0x090b, 0x1010, 0x2010, ++ 0x0011, 0x0a04, 0x1011, 0x2011, 0x0012, 0x0a05, 0x1012, 0x2012, ++ 0x0013, 0x0a06, 0x1013, 0x2013, 0x0014, 0x0a07, 0x1014, 0x2014, ++ 0x0015, 0x0a08, 0x1015, 0x2015, 0x0016, 0x0a09, 0x1016, 0x2016, ++ 0x0017, 0x0a0a, 0x1017, 0x2017, 0x0018, 0x0a0b, 0x1018, 0x2018, ++ 0x0019, 0x0b04, 0x1019, 0x2019, 0x001a, 0x0b05, 0x101a, 0x201a, ++ 0x001b, 0x0b06, 0x101b, 0x201b, 0x001c, 0x0b07, 0x101c, 0x201c, ++ 0x001d, 0x0b08, 0x101d, 0x201d, 0x001e, 0x0b09, 0x101e, 0x201e, ++ 0x001f, 0x0b0a, 0x101f, 0x201f, 0x0020, 0x0b0b, 0x1020, 0x2020, ++ 0x0021, 0x0c04, 0x1021, 0x2021, 0x0022, 0x0c05, 0x1022, 0x2022, ++ 0x0023, 0x0c06, 0x1023, 0x2023, 0x0024, 0x0c07, 0x1024, 0x2024, ++ 0x0025, 0x0c08, 0x1025, 0x2025, 0x0026, 0x0c09, 0x1026, 0x2026, ++ 0x0027, 0x0c0a, 0x1027, 0x2027, 0x0028, 0x0c0b, 0x1028, 0x2028, ++ 0x0029, 0x0d04, 0x1029, 0x2029, 0x002a, 0x0d05, 0x102a, 0x202a, ++ 0x002b, 0x0d06, 0x102b, 0x202b, 0x002c, 0x0d07, 0x102c, 0x202c, ++ 0x002d, 0x0d08, 0x102d, 0x202d, 0x002e, 0x0d09, 0x102e, 0x202e, ++ 0x002f, 0x0d0a, 0x102f, 0x202f, 0x0030, 0x0d0b, 0x1030, 0x2030, ++ 0x0031, 0x0e04, 0x1031, 0x2031, 0x0032, 0x0e05, 0x1032, 0x2032, ++ 0x0033, 0x0e06, 0x1033, 0x2033, 0x0034, 0x0e07, 0x1034, 0x2034, ++ 0x0035, 0x0e08, 0x1035, 0x2035, 0x0036, 0x0e09, 0x1036, 0x2036, ++ 0x0037, 0x0e0a, 0x1037, 0x2037, 0x0038, 0x0e0b, 0x1038, 0x2038, ++ 0x0039, 0x0f04, 0x1039, 0x2039, 0x003a, 0x0f05, 0x103a, 0x203a, ++ 0x003b, 0x0f06, 0x103b, 0x203b, 0x003c, 0x0f07, 0x103c, 0x203c, ++ 0x0801, 0x0f08, 0x103d, 0x203d, 0x1001, 0x0f09, 0x103e, 0x203e, ++ 0x1801, 0x0f0a, 0x103f, 0x203f, 0x2001, 0x0f0b, 0x1040, 0x2040 ++}; ++ ++} // end namespace internal ++} // end namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.cc +new file mode 100644 +index 0000000..369a132 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.cc +@@ -0,0 +1,104 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#include ++ ++#include "snappy-sinksource.h" ++ ++namespace snappy { ++ ++Source::~Source() { } ++ ++Sink::~Sink() { } ++ ++char* Sink::GetAppendBuffer(size_t length, char* scratch) { ++ return scratch; ++} ++ ++char* Sink::GetAppendBufferVariable( ++ size_t min_size, size_t desired_size_hint, char* scratch, ++ size_t scratch_size, size_t* allocated_size) { ++ *allocated_size = scratch_size; ++ return scratch; ++} ++ ++void Sink::AppendAndTakeOwnership( ++ char* bytes, size_t n, ++ void (*deleter)(void*, const char*, size_t), ++ void *deleter_arg) { ++ Append(bytes, n); ++ (*deleter)(deleter_arg, bytes, n); ++} ++ ++ByteArraySource::~ByteArraySource() { } ++ ++size_t ByteArraySource::Available() const { return left_; } ++ ++const char* ByteArraySource::Peek(size_t* len) { ++ *len = left_; ++ return ptr_; ++} ++ ++void ByteArraySource::Skip(size_t n) { ++ left_ -= n; ++ ptr_ += n; ++} ++ ++UncheckedByteArraySink::~UncheckedByteArraySink() { } ++ ++void UncheckedByteArraySink::Append(const char* data, size_t n) { ++ // Do no copying if the caller filled in the result of GetAppendBuffer() ++ if (data != dest_) { ++ memcpy(dest_, data, n); ++ } ++ dest_ += n; ++} ++ ++char* UncheckedByteArraySink::GetAppendBuffer(size_t len, char* scratch) { ++ return dest_; ++} ++ ++void UncheckedByteArraySink::AppendAndTakeOwnership( ++ char* data, size_t n, ++ void (*deleter)(void*, const char*, size_t), ++ void *deleter_arg) { ++ if (data != dest_) { ++ memcpy(dest_, data, n); ++ (*deleter)(deleter_arg, data, n); ++ } ++ dest_ += n; ++} ++ ++char* UncheckedByteArraySink::GetAppendBufferVariable( ++ size_t min_size, size_t desired_size_hint, char* scratch, ++ size_t scratch_size, size_t* allocated_size) { ++ *allocated_size = desired_size_hint; ++ return dest_; ++} ++ ++} // namespace snappy +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.h +new file mode 100644 +index 0000000..8afcdaa +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.h +@@ -0,0 +1,182 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#ifndef THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_ ++#define THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_ ++ ++#include ++ ++namespace snappy { ++ ++// A Sink is an interface that consumes a sequence of bytes. ++class Sink { ++ public: ++ Sink() { } ++ virtual ~Sink(); ++ ++ // Append "bytes[0,n-1]" to this. ++ virtual void Append(const char* bytes, size_t n) = 0; ++ ++ // Returns a writable buffer of the specified length for appending. ++ // May return a pointer to the caller-owned scratch buffer which ++ // must have at least the indicated length. The returned buffer is ++ // only valid until the next operation on this Sink. ++ // ++ // After writing at most "length" bytes, call Append() with the ++ // pointer returned from this function and the number of bytes ++ // written. Many Append() implementations will avoid copying ++ // bytes if this function returned an internal buffer. ++ // ++ // If a non-scratch buffer is returned, the caller may only pass a ++ // prefix of it to Append(). That is, it is not correct to pass an ++ // interior pointer of the returned array to Append(). ++ // ++ // The default implementation always returns the scratch buffer. ++ virtual char* GetAppendBuffer(size_t length, char* scratch); ++ ++ // For higher performance, Sink implementations can provide custom ++ // AppendAndTakeOwnership() and GetAppendBufferVariable() methods. ++ // These methods can reduce the number of copies done during ++ // compression/decompression. ++ ++ // Append "bytes[0,n-1] to the sink. Takes ownership of "bytes" ++ // and calls the deleter function as (*deleter)(deleter_arg, bytes, n) ++ // to free the buffer. deleter function must be non NULL. ++ // ++ // The default implementation just calls Append and frees "bytes". ++ // Other implementations may avoid a copy while appending the buffer. ++ virtual void AppendAndTakeOwnership( ++ char* bytes, size_t n, void (*deleter)(void*, const char*, size_t), ++ void *deleter_arg); ++ ++ // Returns a writable buffer for appending and writes the buffer's capacity to ++ // *allocated_size. Guarantees *allocated_size >= min_size. ++ // May return a pointer to the caller-owned scratch buffer which must have ++ // scratch_size >= min_size. ++ // ++ // The returned buffer is only valid until the next operation ++ // on this ByteSink. ++ // ++ // After writing at most *allocated_size bytes, call Append() with the ++ // pointer returned from this function and the number of bytes written. ++ // Many Append() implementations will avoid copying bytes if this function ++ // returned an internal buffer. ++ // ++ // If the sink implementation allocates or reallocates an internal buffer, ++ // it should use the desired_size_hint if appropriate. If a caller cannot ++ // provide a reasonable guess at the desired capacity, it should set ++ // desired_size_hint = 0. ++ // ++ // If a non-scratch buffer is returned, the caller may only pass ++ // a prefix to it to Append(). That is, it is not correct to pass an ++ // interior pointer to Append(). ++ // ++ // The default implementation always returns the scratch buffer. ++ virtual char* GetAppendBufferVariable( ++ size_t min_size, size_t desired_size_hint, char* scratch, ++ size_t scratch_size, size_t* allocated_size); ++ ++ private: ++ // No copying ++ Sink(const Sink&); ++ void operator=(const Sink&); ++}; ++ ++// A Source is an interface that yields a sequence of bytes ++class Source { ++ public: ++ Source() { } ++ virtual ~Source(); ++ ++ // Return the number of bytes left to read from the source ++ virtual size_t Available() const = 0; ++ ++ // Peek at the next flat region of the source. Does not reposition ++ // the source. The returned region is empty iff Available()==0. ++ // ++ // Returns a pointer to the beginning of the region and store its ++ // length in *len. ++ // ++ // The returned region is valid until the next call to Skip() or ++ // until this object is destroyed, whichever occurs first. ++ // ++ // The returned region may be larger than Available() (for example ++ // if this ByteSource is a view on a substring of a larger source). ++ // The caller is responsible for ensuring that it only reads the ++ // Available() bytes. ++ virtual const char* Peek(size_t* len) = 0; ++ ++ // Skip the next n bytes. Invalidates any buffer returned by ++ // a previous call to Peek(). ++ // REQUIRES: Available() >= n ++ virtual void Skip(size_t n) = 0; ++ ++ private: ++ // No copying ++ Source(const Source&); ++ void operator=(const Source&); ++}; ++ ++// A Source implementation that yields the contents of a flat array ++class ByteArraySource : public Source { ++ public: ++ ByteArraySource(const char* p, size_t n) : ptr_(p), left_(n) { } ++ virtual ~ByteArraySource(); ++ virtual size_t Available() const; ++ virtual const char* Peek(size_t* len); ++ virtual void Skip(size_t n); ++ private: ++ const char* ptr_; ++ size_t left_; ++}; ++ ++// A Sink implementation that writes to a flat array without any bound checks. ++class UncheckedByteArraySink : public Sink { ++ public: ++ explicit UncheckedByteArraySink(char* dest) : dest_(dest) { } ++ virtual ~UncheckedByteArraySink(); ++ virtual void Append(const char* data, size_t n); ++ virtual char* GetAppendBuffer(size_t len, char* scratch); ++ virtual char* GetAppendBufferVariable( ++ size_t min_size, size_t desired_size_hint, char* scratch, ++ size_t scratch_size, size_t* allocated_size); ++ virtual void AppendAndTakeOwnership( ++ char* bytes, size_t n, void (*deleter)(void*, const char*, size_t), ++ void *deleter_arg); ++ ++ // Return the current output pointer so that a caller can see how ++ // many bytes were produced. ++ // Note: this is not a Sink method. ++ char* CurrentDestination() const { return dest_; } ++ private: ++ char* dest_; ++}; ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_SNAPPY_SINKSOURCE_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.cc +new file mode 100644 +index 0000000..6ed3343 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.cc +@@ -0,0 +1,42 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#include ++#include ++ ++#include "snappy-stubs-internal.h" ++ ++namespace snappy { ++ ++void Varint::Append32(string* s, uint32 value) { ++ char buf[Varint::kMax32]; ++ const char* p = Varint::Encode32(buf, value); ++ s->append(buf, p - buf); ++} ++ ++} // namespace snappy +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.h +new file mode 100644 +index 0000000..cb605f8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.h +@@ -0,0 +1,561 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various stubs for the open-source version of Snappy. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ ++ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#include ++ ++#include ++#include ++#include ++ ++#ifdef HAVE_SYS_MMAN_H ++#include ++#endif ++ ++#ifdef HAVE_UNISTD_H ++#include ++#endif ++ ++#if defined(_MSC_VER) ++#include ++#endif // defined(_MSC_VER) ++ ++#include "snappy-stubs-public.h" ++ ++#if defined(__x86_64__) ++ ++// Enable 64-bit optimized versions of some routines. ++#define ARCH_K8 1 ++ ++#elif defined(__ppc64__) ++ ++#define ARCH_PPC 1 ++ ++#elif defined(__aarch64__) ++ ++#define ARCH_ARM 1 ++ ++#endif ++ ++// Needed by OS X, among others. ++#ifndef MAP_ANONYMOUS ++#define MAP_ANONYMOUS MAP_ANON ++#endif ++ ++// The size of an array, if known at compile-time. ++// Will give unexpected results if used on a pointer. ++// We undefine it first, since some compilers already have a definition. ++#ifdef ARRAYSIZE ++#undef ARRAYSIZE ++#endif ++#define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a))) ++ ++// Static prediction hints. ++#ifdef HAVE_BUILTIN_EXPECT ++#define SNAPPY_PREDICT_FALSE(x) (__builtin_expect(x, 0)) ++#define SNAPPY_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) ++#else ++#define SNAPPY_PREDICT_FALSE(x) x ++#define SNAPPY_PREDICT_TRUE(x) x ++#endif ++ ++// This is only used for recomputing the tag byte table used during ++// decompression; for simplicity we just remove it from the open-source ++// version (anyone who wants to regenerate it can just do the call ++// themselves within main()). ++#define DEFINE_bool(flag_name, default_value, description) \ ++ bool FLAGS_ ## flag_name = default_value ++#define DECLARE_bool(flag_name) \ ++ extern bool FLAGS_ ## flag_name ++ ++namespace snappy { ++ ++static const uint32 kuint32max = static_cast(0xFFFFFFFF); ++static const int64 kint64max = static_cast(0x7FFFFFFFFFFFFFFFLL); ++ ++// Potentially unaligned loads and stores. ++ ++// x86, PowerPC, and ARM64 can simply do these loads and stores native. ++ ++#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || \ ++ defined(__aarch64__) ++ ++#define UNALIGNED_LOAD16(_p) (*reinterpret_cast(_p)) ++#define UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) ++#define UNALIGNED_LOAD64(_p) (*reinterpret_cast(_p)) ++ ++#define UNALIGNED_STORE16(_p, _val) (*reinterpret_cast(_p) = (_val)) ++#define UNALIGNED_STORE32(_p, _val) (*reinterpret_cast(_p) = (_val)) ++#define UNALIGNED_STORE64(_p, _val) (*reinterpret_cast(_p) = (_val)) ++ ++// ARMv7 and newer support native unaligned accesses, but only of 16-bit ++// and 32-bit values (not 64-bit); older versions either raise a fatal signal, ++// do an unaligned read and rotate the words around a bit, or do the reads very ++// slowly (trip through kernel mode). There's no simple #define that says just ++// “ARMv7 or higher”, so we have to filter away all ARMv5 and ARMv6 ++// sub-architectures. ++// ++// This is a mess, but there's not much we can do about it. ++// ++// To further complicate matters, only LDR instructions (single reads) are ++// allowed to be unaligned, not LDRD (two reads) or LDM (many reads). Unless we ++// explicitly tell the compiler that these accesses can be unaligned, it can and ++// will combine accesses. On armcc, the way to signal this is done by accessing ++// through the type (uint32 __packed *), but GCC has no such attribute ++// (it ignores __attribute__((packed)) on individual variables). However, ++// we can tell it that a _struct_ is unaligned, which has the same effect, ++// so we do that. ++ ++#elif defined(__arm__) && \ ++ !defined(__ARM_ARCH_4__) && \ ++ !defined(__ARM_ARCH_4T__) && \ ++ !defined(__ARM_ARCH_5__) && \ ++ !defined(__ARM_ARCH_5T__) && \ ++ !defined(__ARM_ARCH_5TE__) && \ ++ !defined(__ARM_ARCH_5TEJ__) && \ ++ !defined(__ARM_ARCH_6__) && \ ++ !defined(__ARM_ARCH_6J__) && \ ++ !defined(__ARM_ARCH_6K__) && \ ++ !defined(__ARM_ARCH_6Z__) && \ ++ !defined(__ARM_ARCH_6ZK__) && \ ++ !defined(__ARM_ARCH_6T2__) ++ ++#if __GNUC__ ++#define ATTRIBUTE_PACKED __attribute__((__packed__)) ++#else ++#define ATTRIBUTE_PACKED ++#endif ++ ++namespace base { ++namespace internal { ++ ++struct Unaligned16Struct { ++ uint16 value; ++ uint8 dummy; // To make the size non-power-of-two. ++} ATTRIBUTE_PACKED; ++ ++struct Unaligned32Struct { ++ uint32 value; ++ uint8 dummy; // To make the size non-power-of-two. ++} ATTRIBUTE_PACKED; ++ ++} // namespace internal ++} // namespace base ++ ++#define UNALIGNED_LOAD16(_p) \ ++ ((reinterpret_cast(_p))->value) ++#define UNALIGNED_LOAD32(_p) \ ++ ((reinterpret_cast(_p))->value) ++ ++#define UNALIGNED_STORE16(_p, _val) \ ++ ((reinterpret_cast< ::snappy::base::internal::Unaligned16Struct *>(_p))->value = \ ++ (_val)) ++#define UNALIGNED_STORE32(_p, _val) \ ++ ((reinterpret_cast< ::snappy::base::internal::Unaligned32Struct *>(_p))->value = \ ++ (_val)) ++ ++// TODO(user): NEON supports unaligned 64-bit loads and stores. ++// See if that would be more efficient on platforms supporting it, ++// at least for copies. ++ ++inline uint64 UNALIGNED_LOAD64(const void *p) { ++ uint64 t; ++ memcpy(&t, p, sizeof t); ++ return t; ++} ++ ++inline void UNALIGNED_STORE64(void *p, uint64 v) { ++ memcpy(p, &v, sizeof v); ++} ++ ++#else ++ ++// These functions are provided for architectures that don't support ++// unaligned loads and stores. ++ ++inline uint16 UNALIGNED_LOAD16(const void *p) { ++ uint16 t; ++ memcpy(&t, p, sizeof t); ++ return t; ++} ++ ++inline uint32 UNALIGNED_LOAD32(const void *p) { ++ uint32 t; ++ memcpy(&t, p, sizeof t); ++ return t; ++} ++ ++inline uint64 UNALIGNED_LOAD64(const void *p) { ++ uint64 t; ++ memcpy(&t, p, sizeof t); ++ return t; ++} ++ ++inline void UNALIGNED_STORE16(void *p, uint16 v) { ++ memcpy(p, &v, sizeof v); ++} ++ ++inline void UNALIGNED_STORE32(void *p, uint32 v) { ++ memcpy(p, &v, sizeof v); ++} ++ ++inline void UNALIGNED_STORE64(void *p, uint64 v) { ++ memcpy(p, &v, sizeof v); ++} ++ ++#endif ++ ++// The following guarantees declaration of the byte swap functions. ++#if defined(SNAPPY_IS_BIG_ENDIAN) ++ ++#ifdef HAVE_SYS_BYTEORDER_H ++#include ++#endif ++ ++#ifdef HAVE_SYS_ENDIAN_H ++#include ++#endif ++ ++#ifdef _MSC_VER ++#include ++#define bswap_16(x) _byteswap_ushort(x) ++#define bswap_32(x) _byteswap_ulong(x) ++#define bswap_64(x) _byteswap_uint64(x) ++ ++#elif defined(__APPLE__) ++// Mac OS X / Darwin features ++#include ++#define bswap_16(x) OSSwapInt16(x) ++#define bswap_32(x) OSSwapInt32(x) ++#define bswap_64(x) OSSwapInt64(x) ++ ++#elif defined(HAVE_BYTESWAP_H) ++#include ++ ++#elif defined(bswap32) ++// FreeBSD defines bswap{16,32,64} in (already #included). ++#define bswap_16(x) bswap16(x) ++#define bswap_32(x) bswap32(x) ++#define bswap_64(x) bswap64(x) ++ ++#elif defined(BSWAP_64) ++// Solaris 10 defines BSWAP_{16,32,64} in (already #included). ++#define bswap_16(x) BSWAP_16(x) ++#define bswap_32(x) BSWAP_32(x) ++#define bswap_64(x) BSWAP_64(x) ++ ++#else ++ ++inline uint16 bswap_16(uint16 x) { ++ return (x << 8) | (x >> 8); ++} ++ ++inline uint32 bswap_32(uint32 x) { ++ x = ((x & 0xff00ff00UL) >> 8) | ((x & 0x00ff00ffUL) << 8); ++ return (x >> 16) | (x << 16); ++} ++ ++inline uint64 bswap_64(uint64 x) { ++ x = ((x & 0xff00ff00ff00ff00ULL) >> 8) | ((x & 0x00ff00ff00ff00ffULL) << 8); ++ x = ((x & 0xffff0000ffff0000ULL) >> 16) | ((x & 0x0000ffff0000ffffULL) << 16); ++ return (x >> 32) | (x << 32); ++} ++ ++#endif ++ ++#endif // defined(SNAPPY_IS_BIG_ENDIAN) ++ ++// Convert to little-endian storage, opposite of network format. ++// Convert x from host to little endian: x = LittleEndian.FromHost(x); ++// convert x from little endian to host: x = LittleEndian.ToHost(x); ++// ++// Store values into unaligned memory converting to little endian order: ++// LittleEndian.Store16(p, x); ++// ++// Load unaligned values stored in little endian converting to host order: ++// x = LittleEndian.Load16(p); ++class LittleEndian { ++ public: ++ // Conversion functions. ++#if defined(SNAPPY_IS_BIG_ENDIAN) ++ ++ static uint16 FromHost16(uint16 x) { return bswap_16(x); } ++ static uint16 ToHost16(uint16 x) { return bswap_16(x); } ++ ++ static uint32 FromHost32(uint32 x) { return bswap_32(x); } ++ static uint32 ToHost32(uint32 x) { return bswap_32(x); } ++ ++ static bool IsLittleEndian() { return false; } ++ ++#else // !defined(SNAPPY_IS_BIG_ENDIAN) ++ ++ static uint16 FromHost16(uint16 x) { return x; } ++ static uint16 ToHost16(uint16 x) { return x; } ++ ++ static uint32 FromHost32(uint32 x) { return x; } ++ static uint32 ToHost32(uint32 x) { return x; } ++ ++ static bool IsLittleEndian() { return true; } ++ ++#endif // !defined(SNAPPY_IS_BIG_ENDIAN) ++ ++ // Functions to do unaligned loads and stores in little-endian order. ++ static uint16 Load16(const void *p) { ++ return ToHost16(UNALIGNED_LOAD16(p)); ++ } ++ ++ static void Store16(void *p, uint16 v) { ++ UNALIGNED_STORE16(p, FromHost16(v)); ++ } ++ ++ static uint32 Load32(const void *p) { ++ return ToHost32(UNALIGNED_LOAD32(p)); ++ } ++ ++ static void Store32(void *p, uint32 v) { ++ UNALIGNED_STORE32(p, FromHost32(v)); ++ } ++}; ++ ++// Some bit-manipulation functions. ++class Bits { ++ public: ++ // Return floor(log2(n)) for positive integer n. Returns -1 iff n == 0. ++ static int Log2Floor(uint32 n); ++ ++ // Return the first set least / most significant bit, 0-indexed. Returns an ++ // undefined value if n == 0. FindLSBSetNonZero() is similar to ffs() except ++ // that it's 0-indexed. ++ static int FindLSBSetNonZero(uint32 n); ++ ++#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++ static int FindLSBSetNonZero64(uint64 n); ++#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++ ++ private: ++ // No copying ++ Bits(const Bits&); ++ void operator=(const Bits&); ++}; ++ ++#ifdef HAVE_BUILTIN_CTZ ++ ++inline int Bits::Log2Floor(uint32 n) { ++ return n == 0 ? -1 : 31 ^ __builtin_clz(n); ++} ++ ++inline int Bits::FindLSBSetNonZero(uint32 n) { ++ return __builtin_ctz(n); ++} ++ ++#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++inline int Bits::FindLSBSetNonZero64(uint64 n) { ++ return __builtin_ctzll(n); ++} ++#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++ ++#elif defined(_MSC_VER) ++ ++inline int Bits::Log2Floor(uint32 n) { ++ unsigned long where; ++ if (_BitScanReverse(&where, n)) { ++ return where; ++ } else { ++ return -1; ++ } ++} ++ ++inline int Bits::FindLSBSetNonZero(uint32 n) { ++ unsigned long where; ++ if (_BitScanForward(&where, n)) return static_cast(where); ++ return 32; ++} ++ ++#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++inline int Bits::FindLSBSetNonZero64(uint64 n) { ++ unsigned long where; ++ if (_BitScanForward64(&where, n)) return static_cast(where); ++ return 64; ++} ++#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++ ++#else // Portable versions. ++ ++inline int Bits::Log2Floor(uint32 n) { ++ if (n == 0) ++ return -1; ++ int log = 0; ++ uint32 value = n; ++ for (int i = 4; i >= 0; --i) { ++ int shift = (1 << i); ++ uint32 x = value >> shift; ++ if (x != 0) { ++ value = x; ++ log += shift; ++ } ++ } ++ assert(value == 1); ++ return log; ++} ++ ++inline int Bits::FindLSBSetNonZero(uint32 n) { ++ int rc = 31; ++ for (int i = 4, shift = 1 << 4; i >= 0; --i) { ++ const uint32 x = n << shift; ++ if (x != 0) { ++ n = x; ++ rc -= shift; ++ } ++ shift >>= 1; ++ } ++ return rc; ++} ++ ++#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++// FindLSBSetNonZero64() is defined in terms of FindLSBSetNonZero(). ++inline int Bits::FindLSBSetNonZero64(uint64 n) { ++ const uint32 bottombits = static_cast(n); ++ if (bottombits == 0) { ++ // Bottom bits are zero, so scan in top bits ++ return 32 + FindLSBSetNonZero(static_cast(n >> 32)); ++ } else { ++ return FindLSBSetNonZero(bottombits); ++ } ++} ++#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM) ++ ++#endif // End portable versions. ++ ++// Variable-length integer encoding. ++class Varint { ++ public: ++ // Maximum lengths of varint encoding of uint32. ++ static const int kMax32 = 5; ++ ++ // Attempts to parse a varint32 from a prefix of the bytes in [ptr,limit-1]. ++ // Never reads a character at or beyond limit. If a valid/terminated varint32 ++ // was found in the range, stores it in *OUTPUT and returns a pointer just ++ // past the last byte of the varint32. Else returns NULL. On success, ++ // "result <= limit". ++ static const char* Parse32WithLimit(const char* ptr, const char* limit, ++ uint32* OUTPUT); ++ ++ // REQUIRES "ptr" points to a buffer of length sufficient to hold "v". ++ // EFFECTS Encodes "v" into "ptr" and returns a pointer to the ++ // byte just past the last encoded byte. ++ static char* Encode32(char* ptr, uint32 v); ++ ++ // EFFECTS Appends the varint representation of "value" to "*s". ++ static void Append32(string* s, uint32 value); ++}; ++ ++inline const char* Varint::Parse32WithLimit(const char* p, ++ const char* l, ++ uint32* OUTPUT) { ++ const unsigned char* ptr = reinterpret_cast(p); ++ const unsigned char* limit = reinterpret_cast(l); ++ uint32 b, result; ++ if (ptr >= limit) return NULL; ++ b = *(ptr++); result = b & 127; if (b < 128) goto done; ++ if (ptr >= limit) return NULL; ++ b = *(ptr++); result |= (b & 127) << 7; if (b < 128) goto done; ++ if (ptr >= limit) return NULL; ++ b = *(ptr++); result |= (b & 127) << 14; if (b < 128) goto done; ++ if (ptr >= limit) return NULL; ++ b = *(ptr++); result |= (b & 127) << 21; if (b < 128) goto done; ++ if (ptr >= limit) return NULL; ++ b = *(ptr++); result |= (b & 127) << 28; if (b < 16) goto done; ++ return NULL; // Value is too long to be a varint32 ++ done: ++ *OUTPUT = result; ++ return reinterpret_cast(ptr); ++} ++ ++inline char* Varint::Encode32(char* sptr, uint32 v) { ++ // Operate on characters as unsigneds ++ unsigned char* ptr = reinterpret_cast(sptr); ++ static const int B = 128; ++ if (v < (1<<7)) { ++ *(ptr++) = v; ++ } else if (v < (1<<14)) { ++ *(ptr++) = v | B; ++ *(ptr++) = v>>7; ++ } else if (v < (1<<21)) { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = v>>14; ++ } else if (v < (1<<28)) { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = (v>>14) | B; ++ *(ptr++) = v>>21; ++ } else { ++ *(ptr++) = v | B; ++ *(ptr++) = (v>>7) | B; ++ *(ptr++) = (v>>14) | B; ++ *(ptr++) = (v>>21) | B; ++ *(ptr++) = v>>28; ++ } ++ return reinterpret_cast(ptr); ++} ++ ++// If you know the internal layout of the std::string in use, you can ++// replace this function with one that resizes the string without ++// filling the new space with zeros (if applicable) -- ++// it will be non-portable but faster. ++inline void STLStringResizeUninitialized(string* s, size_t new_size) { ++ s->resize(new_size); ++} ++ ++// Return a mutable char* pointing to a string's internal buffer, ++// which may not be null-terminated. Writing through this pointer will ++// modify the string. ++// ++// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the ++// next call to a string method that invalidates iterators. ++// ++// As of 2006-04, there is no standard-blessed way of getting a ++// mutable reference to a string's internal buffer. However, issue 530 ++// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#530) ++// proposes this as the method. It will officially be part of the standard ++// for C++0x. This should already work on all current implementations. ++inline char* string_as_array(string* str) { ++ return str->empty() ? NULL : &*str->begin(); ++} ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_INTERNAL_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-public.h.in b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-public.h.in +new file mode 100644 +index 0000000..3fd79bb +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-public.h.in +@@ -0,0 +1,94 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if ${HAVE_STDINT_H_01} // HAVE_STDINT_H ++#include ++#endif // HAVE_STDDEF_H ++ ++#if ${HAVE_STDDEF_H_01} // HAVE_STDDEF_H ++#include ++#endif // HAVE_STDDEF_H ++ ++#if ${HAVE_SYS_UIO_H_01} // HAVE_SYS_UIO_H ++#include ++#endif // HAVE_SYS_UIO_H ++ ++#define SNAPPY_MAJOR ${SNAPPY_MAJOR} ++#define SNAPPY_MINOR ${SNAPPY_MINOR} ++#define SNAPPY_PATCHLEVEL ${SNAPPY_PATCHLEVEL} ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if ${HAVE_STDINT_H_01} // HAVE_STDINT_H ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif // HAVE_STDINT_H ++ ++typedef std::string string; ++ ++#if !${HAVE_SYS_UIO_H_01} // !HAVE_SYS_UIO_H ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif // !HAVE_SYS_UIO_H ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.cc +new file mode 100644 +index 0000000..01d5541 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.cc +@@ -0,0 +1,612 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various stubs for the unit tests for the open-source version of Snappy. ++ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#ifdef HAVE_WINDOWS_H ++// Needed to be able to use std::max without workarounds in the source code. ++// https://support.microsoft.com/en-us/help/143208/prb-using-stl-in-windows-program-can-cause-min-max-conflicts ++#define NOMINMAX ++#include ++#endif ++ ++#include "snappy-test.h" ++ ++#include ++ ++DEFINE_bool(run_microbenchmarks, true, ++ "Run microbenchmarks before doing anything else."); ++ ++namespace snappy { ++ ++string ReadTestDataFile(const string& base, size_t size_limit) { ++ string contents; ++ const char* srcdir = getenv("srcdir"); // This is set by Automake. ++ string prefix; ++ if (srcdir) { ++ prefix = string(srcdir) + "/"; ++ } ++ file::GetContents(prefix + "testdata/" + base, &contents, file::Defaults() ++ ).CheckSuccess(); ++ if (size_limit > 0) { ++ contents = contents.substr(0, size_limit); ++ } ++ return contents; ++} ++ ++string ReadTestDataFile(const string& base) { ++ return ReadTestDataFile(base, 0); ++} ++ ++string StringPrintf(const char* format, ...) { ++ char buf[4096]; ++ va_list ap; ++ va_start(ap, format); ++ vsnprintf(buf, sizeof(buf), format, ap); ++ va_end(ap); ++ return buf; ++} ++ ++bool benchmark_running = false; ++int64 benchmark_real_time_us = 0; ++int64 benchmark_cpu_time_us = 0; ++string *benchmark_label = NULL; ++int64 benchmark_bytes_processed = 0; ++ ++void ResetBenchmarkTiming() { ++ benchmark_real_time_us = 0; ++ benchmark_cpu_time_us = 0; ++} ++ ++#ifdef WIN32 ++LARGE_INTEGER benchmark_start_real; ++FILETIME benchmark_start_cpu; ++#else // WIN32 ++struct timeval benchmark_start_real; ++struct rusage benchmark_start_cpu; ++#endif // WIN32 ++ ++void StartBenchmarkTiming() { ++#ifdef WIN32 ++ QueryPerformanceCounter(&benchmark_start_real); ++ FILETIME dummy; ++ CHECK(GetProcessTimes( ++ GetCurrentProcess(), &dummy, &dummy, &dummy, &benchmark_start_cpu)); ++#else ++ gettimeofday(&benchmark_start_real, NULL); ++ if (getrusage(RUSAGE_SELF, &benchmark_start_cpu) == -1) { ++ perror("getrusage(RUSAGE_SELF)"); ++ exit(1); ++ } ++#endif ++ benchmark_running = true; ++} ++ ++void StopBenchmarkTiming() { ++ if (!benchmark_running) { ++ return; ++ } ++ ++#ifdef WIN32 ++ LARGE_INTEGER benchmark_stop_real; ++ LARGE_INTEGER benchmark_frequency; ++ QueryPerformanceCounter(&benchmark_stop_real); ++ QueryPerformanceFrequency(&benchmark_frequency); ++ ++ double elapsed_real = static_cast( ++ benchmark_stop_real.QuadPart - benchmark_start_real.QuadPart) / ++ benchmark_frequency.QuadPart; ++ benchmark_real_time_us += elapsed_real * 1e6 + 0.5; ++ ++ FILETIME benchmark_stop_cpu, dummy; ++ CHECK(GetProcessTimes( ++ GetCurrentProcess(), &dummy, &dummy, &dummy, &benchmark_stop_cpu)); ++ ++ ULARGE_INTEGER start_ulargeint; ++ start_ulargeint.LowPart = benchmark_start_cpu.dwLowDateTime; ++ start_ulargeint.HighPart = benchmark_start_cpu.dwHighDateTime; ++ ++ ULARGE_INTEGER stop_ulargeint; ++ stop_ulargeint.LowPart = benchmark_stop_cpu.dwLowDateTime; ++ stop_ulargeint.HighPart = benchmark_stop_cpu.dwHighDateTime; ++ ++ benchmark_cpu_time_us += ++ (stop_ulargeint.QuadPart - start_ulargeint.QuadPart + 5) / 10; ++#else // WIN32 ++ struct timeval benchmark_stop_real; ++ gettimeofday(&benchmark_stop_real, NULL); ++ benchmark_real_time_us += ++ 1000000 * (benchmark_stop_real.tv_sec - benchmark_start_real.tv_sec); ++ benchmark_real_time_us += ++ (benchmark_stop_real.tv_usec - benchmark_start_real.tv_usec); ++ ++ struct rusage benchmark_stop_cpu; ++ if (getrusage(RUSAGE_SELF, &benchmark_stop_cpu) == -1) { ++ perror("getrusage(RUSAGE_SELF)"); ++ exit(1); ++ } ++ benchmark_cpu_time_us += 1000000 * (benchmark_stop_cpu.ru_utime.tv_sec - ++ benchmark_start_cpu.ru_utime.tv_sec); ++ benchmark_cpu_time_us += (benchmark_stop_cpu.ru_utime.tv_usec - ++ benchmark_start_cpu.ru_utime.tv_usec); ++#endif // WIN32 ++ ++ benchmark_running = false; ++} ++ ++void SetBenchmarkLabel(const string& str) { ++ if (benchmark_label) { ++ delete benchmark_label; ++ } ++ benchmark_label = new string(str); ++} ++ ++void SetBenchmarkBytesProcessed(int64 bytes) { ++ benchmark_bytes_processed = bytes; ++} ++ ++struct BenchmarkRun { ++ int64 real_time_us; ++ int64 cpu_time_us; ++}; ++ ++struct BenchmarkCompareCPUTime { ++ bool operator() (const BenchmarkRun& a, const BenchmarkRun& b) const { ++ return a.cpu_time_us < b.cpu_time_us; ++ } ++}; ++ ++void Benchmark::Run() { ++ for (int test_case_num = start_; test_case_num <= stop_; ++test_case_num) { ++ // Run a few iterations first to find out approximately how fast ++ // the benchmark is. ++ const int kCalibrateIterations = 100; ++ ResetBenchmarkTiming(); ++ StartBenchmarkTiming(); ++ (*function_)(kCalibrateIterations, test_case_num); ++ StopBenchmarkTiming(); ++ ++ // Let each test case run for about 200ms, but at least as many ++ // as we used to calibrate. ++ // Run five times and pick the median. ++ const int kNumRuns = 5; ++ const int kMedianPos = kNumRuns / 2; ++ int num_iterations = 0; ++ if (benchmark_real_time_us > 0) { ++ num_iterations = 200000 * kCalibrateIterations / benchmark_real_time_us; ++ } ++ num_iterations = std::max(num_iterations, kCalibrateIterations); ++ BenchmarkRun benchmark_runs[kNumRuns]; ++ ++ for (int run = 0; run < kNumRuns; ++run) { ++ ResetBenchmarkTiming(); ++ StartBenchmarkTiming(); ++ (*function_)(num_iterations, test_case_num); ++ StopBenchmarkTiming(); ++ ++ benchmark_runs[run].real_time_us = benchmark_real_time_us; ++ benchmark_runs[run].cpu_time_us = benchmark_cpu_time_us; ++ } ++ ++ string heading = StringPrintf("%s/%d", name_.c_str(), test_case_num); ++ string human_readable_speed; ++ ++ std::nth_element(benchmark_runs, ++ benchmark_runs + kMedianPos, ++ benchmark_runs + kNumRuns, ++ BenchmarkCompareCPUTime()); ++ int64 real_time_us = benchmark_runs[kMedianPos].real_time_us; ++ int64 cpu_time_us = benchmark_runs[kMedianPos].cpu_time_us; ++ if (cpu_time_us <= 0) { ++ human_readable_speed = "?"; ++ } else { ++ int64 bytes_per_second = ++ benchmark_bytes_processed * 1000000 / cpu_time_us; ++ if (bytes_per_second < 1024) { ++ human_readable_speed = StringPrintf("%dB/s", bytes_per_second); ++ } else if (bytes_per_second < 1024 * 1024) { ++ human_readable_speed = StringPrintf( ++ "%.1fkB/s", bytes_per_second / 1024.0f); ++ } else if (bytes_per_second < 1024 * 1024 * 1024) { ++ human_readable_speed = StringPrintf( ++ "%.1fMB/s", bytes_per_second / (1024.0f * 1024.0f)); ++ } else { ++ human_readable_speed = StringPrintf( ++ "%.1fGB/s", bytes_per_second / (1024.0f * 1024.0f * 1024.0f)); ++ } ++ } ++ ++ fprintf(stderr, ++#ifdef WIN32 ++ "%-18s %10I64d %10I64d %10d %s %s\n", ++#else ++ "%-18s %10lld %10lld %10d %s %s\n", ++#endif ++ heading.c_str(), ++ static_cast(real_time_us * 1000 / num_iterations), ++ static_cast(cpu_time_us * 1000 / num_iterations), ++ num_iterations, ++ human_readable_speed.c_str(), ++ benchmark_label->c_str()); ++ } ++} ++ ++#ifdef HAVE_LIBZ ++ ++ZLib::ZLib() ++ : comp_init_(false), ++ uncomp_init_(false) { ++ Reinit(); ++} ++ ++ZLib::~ZLib() { ++ if (comp_init_) { deflateEnd(&comp_stream_); } ++ if (uncomp_init_) { inflateEnd(&uncomp_stream_); } ++} ++ ++void ZLib::Reinit() { ++ compression_level_ = Z_DEFAULT_COMPRESSION; ++ window_bits_ = MAX_WBITS; ++ mem_level_ = 8; // DEF_MEM_LEVEL ++ if (comp_init_) { ++ deflateEnd(&comp_stream_); ++ comp_init_ = false; ++ } ++ if (uncomp_init_) { ++ inflateEnd(&uncomp_stream_); ++ uncomp_init_ = false; ++ } ++ first_chunk_ = true; ++} ++ ++void ZLib::Reset() { ++ first_chunk_ = true; ++} ++ ++// --------- COMPRESS MODE ++ ++// Initialization method to be called if we hit an error while ++// compressing. On hitting an error, call this method before returning ++// the error. ++void ZLib::CompressErrorInit() { ++ deflateEnd(&comp_stream_); ++ comp_init_ = false; ++ Reset(); ++} ++ ++int ZLib::DeflateInit() { ++ return deflateInit2(&comp_stream_, ++ compression_level_, ++ Z_DEFLATED, ++ window_bits_, ++ mem_level_, ++ Z_DEFAULT_STRATEGY); ++} ++ ++int ZLib::CompressInit(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen) { ++ int err; ++ ++ comp_stream_.next_in = (Bytef*)source; ++ comp_stream_.avail_in = (uInt)*sourceLen; ++ if ((uLong)comp_stream_.avail_in != *sourceLen) return Z_BUF_ERROR; ++ comp_stream_.next_out = dest; ++ comp_stream_.avail_out = (uInt)*destLen; ++ if ((uLong)comp_stream_.avail_out != *destLen) return Z_BUF_ERROR; ++ ++ if ( !first_chunk_ ) // only need to set up stream the first time through ++ return Z_OK; ++ ++ if (comp_init_) { // we've already initted it ++ err = deflateReset(&comp_stream_); ++ if (err != Z_OK) { ++ LOG(WARNING) << "ERROR: Can't reset compress object; creating a new one"; ++ deflateEnd(&comp_stream_); ++ comp_init_ = false; ++ } ++ } ++ if (!comp_init_) { // first use ++ comp_stream_.zalloc = (alloc_func)0; ++ comp_stream_.zfree = (free_func)0; ++ comp_stream_.opaque = (voidpf)0; ++ err = DeflateInit(); ++ if (err != Z_OK) return err; ++ comp_init_ = true; ++ } ++ return Z_OK; ++} ++ ++// In a perfect world we'd always have the full buffer to compress ++// when the time came, and we could just call Compress(). Alas, we ++// want to do chunked compression on our webserver. In this ++// application, we compress the header, send it off, then compress the ++// results, send them off, then compress the footer. Thus we need to ++// use the chunked compression features of zlib. ++int ZLib::CompressAtMostOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen, ++ int flush_mode) { // Z_FULL_FLUSH or Z_FINISH ++ int err; ++ ++ if ( (err=CompressInit(dest, destLen, source, sourceLen)) != Z_OK ) ++ return err; ++ ++ // This is used to figure out how many bytes we wrote *this chunk* ++ int compressed_size = comp_stream_.total_out; ++ ++ // Some setup happens only for the first chunk we compress in a run ++ if ( first_chunk_ ) { ++ first_chunk_ = false; ++ } ++ ++ // flush_mode is Z_FINISH for all mode, Z_SYNC_FLUSH for incremental ++ // compression. ++ err = deflate(&comp_stream_, flush_mode); ++ ++ *sourceLen = comp_stream_.avail_in; ++ ++ if ((err == Z_STREAM_END || err == Z_OK) ++ && comp_stream_.avail_in == 0 ++ && comp_stream_.avail_out != 0 ) { ++ // we processed everything ok and the output buffer was large enough. ++ ; ++ } else if (err == Z_STREAM_END && comp_stream_.avail_in > 0) { ++ return Z_BUF_ERROR; // should never happen ++ } else if (err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR) { ++ // an error happened ++ CompressErrorInit(); ++ return err; ++ } else if (comp_stream_.avail_out == 0) { // not enough space ++ err = Z_BUF_ERROR; ++ } ++ ++ assert(err == Z_OK || err == Z_STREAM_END || err == Z_BUF_ERROR); ++ if (err == Z_STREAM_END) ++ err = Z_OK; ++ ++ // update the crc and other metadata ++ compressed_size = comp_stream_.total_out - compressed_size; // delta ++ *destLen = compressed_size; ++ ++ return err; ++} ++ ++int ZLib::CompressChunkOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen, ++ int flush_mode) { // Z_FULL_FLUSH or Z_FINISH ++ const int ret = ++ CompressAtMostOrAll(dest, destLen, source, &sourceLen, flush_mode); ++ if (ret == Z_BUF_ERROR) ++ CompressErrorInit(); ++ return ret; ++} ++ ++// This routine only initializes the compression stream once. Thereafter, it ++// just does a deflateReset on the stream, which should be faster. ++int ZLib::Compress(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen) { ++ int err; ++ if ( (err=CompressChunkOrAll(dest, destLen, source, sourceLen, ++ Z_FINISH)) != Z_OK ) ++ return err; ++ Reset(); // reset for next call to Compress ++ ++ return Z_OK; ++} ++ ++ ++// --------- UNCOMPRESS MODE ++ ++int ZLib::InflateInit() { ++ return inflateInit2(&uncomp_stream_, MAX_WBITS); ++} ++ ++// Initialization method to be called if we hit an error while ++// uncompressing. On hitting an error, call this method before ++// returning the error. ++void ZLib::UncompressErrorInit() { ++ inflateEnd(&uncomp_stream_); ++ uncomp_init_ = false; ++ Reset(); ++} ++ ++int ZLib::UncompressInit(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen) { ++ int err; ++ ++ uncomp_stream_.next_in = (Bytef*)source; ++ uncomp_stream_.avail_in = (uInt)*sourceLen; ++ // Check for source > 64K on 16-bit machine: ++ if ((uLong)uncomp_stream_.avail_in != *sourceLen) return Z_BUF_ERROR; ++ ++ uncomp_stream_.next_out = dest; ++ uncomp_stream_.avail_out = (uInt)*destLen; ++ if ((uLong)uncomp_stream_.avail_out != *destLen) return Z_BUF_ERROR; ++ ++ if ( !first_chunk_ ) // only need to set up stream the first time through ++ return Z_OK; ++ ++ if (uncomp_init_) { // we've already initted it ++ err = inflateReset(&uncomp_stream_); ++ if (err != Z_OK) { ++ LOG(WARNING) ++ << "ERROR: Can't reset uncompress object; creating a new one"; ++ UncompressErrorInit(); ++ } ++ } ++ if (!uncomp_init_) { ++ uncomp_stream_.zalloc = (alloc_func)0; ++ uncomp_stream_.zfree = (free_func)0; ++ uncomp_stream_.opaque = (voidpf)0; ++ err = InflateInit(); ++ if (err != Z_OK) return err; ++ uncomp_init_ = true; ++ } ++ return Z_OK; ++} ++ ++// If you compressed your data a chunk at a time, with CompressChunk, ++// you can uncompress it a chunk at a time with UncompressChunk. ++// Only difference bewteen chunked and unchunked uncompression ++// is the flush mode we use: Z_SYNC_FLUSH (chunked) or Z_FINISH (unchunked). ++int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen, ++ int flush_mode) { // Z_SYNC_FLUSH or Z_FINISH ++ int err = Z_OK; ++ ++ if ( (err=UncompressInit(dest, destLen, source, sourceLen)) != Z_OK ) { ++ LOG(WARNING) << "UncompressInit: Error: " << err << " SourceLen: " ++ << *sourceLen; ++ return err; ++ } ++ ++ // This is used to figure out how many output bytes we wrote *this chunk*: ++ const uLong old_total_out = uncomp_stream_.total_out; ++ ++ // This is used to figure out how many input bytes we read *this chunk*: ++ const uLong old_total_in = uncomp_stream_.total_in; ++ ++ // Some setup happens only for the first chunk we compress in a run ++ if ( first_chunk_ ) { ++ first_chunk_ = false; // so we don't do this again ++ ++ // For the first chunk *only* (to avoid infinite troubles), we let ++ // there be no actual data to uncompress. This sometimes triggers ++ // when the input is only the gzip header, say. ++ if ( *sourceLen == 0 ) { ++ *destLen = 0; ++ return Z_OK; ++ } ++ } ++ ++ // We'll uncompress as much as we can. If we end OK great, otherwise ++ // if we get an error that seems to be the gzip footer, we store the ++ // gzip footer and return OK, otherwise we return the error. ++ ++ // flush_mode is Z_SYNC_FLUSH for chunked mode, Z_FINISH for all mode. ++ err = inflate(&uncomp_stream_, flush_mode); ++ ++ // Figure out how many bytes of the input zlib slurped up: ++ const uLong bytes_read = uncomp_stream_.total_in - old_total_in; ++ CHECK_LE(source + bytes_read, source + *sourceLen); ++ *sourceLen = uncomp_stream_.avail_in; ++ ++ if ((err == Z_STREAM_END || err == Z_OK) // everything went ok ++ && uncomp_stream_.avail_in == 0) { // and we read it all ++ ; ++ } else if (err == Z_STREAM_END && uncomp_stream_.avail_in > 0) { ++ LOG(WARNING) ++ << "UncompressChunkOrAll: Received some extra data, bytes total: " ++ << uncomp_stream_.avail_in << " bytes: " ++ << std::string(reinterpret_cast(uncomp_stream_.next_in), ++ std::min(int(uncomp_stream_.avail_in), 20)); ++ UncompressErrorInit(); ++ return Z_DATA_ERROR; // what's the extra data for? ++ } else if (err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR) { ++ // an error happened ++ LOG(WARNING) << "UncompressChunkOrAll: Error: " << err ++ << " avail_out: " << uncomp_stream_.avail_out; ++ UncompressErrorInit(); ++ return err; ++ } else if (uncomp_stream_.avail_out == 0) { ++ err = Z_BUF_ERROR; ++ } ++ ++ assert(err == Z_OK || err == Z_BUF_ERROR || err == Z_STREAM_END); ++ if (err == Z_STREAM_END) ++ err = Z_OK; ++ ++ *destLen = uncomp_stream_.total_out - old_total_out; // size for this call ++ ++ return err; ++} ++ ++int ZLib::UncompressChunkOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen, ++ int flush_mode) { // Z_SYNC_FLUSH or Z_FINISH ++ const int ret = ++ UncompressAtMostOrAll(dest, destLen, source, &sourceLen, flush_mode); ++ if (ret == Z_BUF_ERROR) ++ UncompressErrorInit(); ++ return ret; ++} ++ ++int ZLib::UncompressAtMost(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen) { ++ return UncompressAtMostOrAll(dest, destLen, source, sourceLen, Z_SYNC_FLUSH); ++} ++ ++// We make sure we've uncompressed everything, that is, the current ++// uncompress stream is at a compressed-buffer-EOF boundary. In gzip ++// mode, we also check the gzip footer to make sure we pass the gzip ++// consistency checks. We RETURN true iff both types of checks pass. ++bool ZLib::UncompressChunkDone() { ++ assert(!first_chunk_ && uncomp_init_); ++ // Make sure we're at the end-of-compressed-data point. This means ++ // if we call inflate with Z_FINISH we won't consume any input or ++ // write any output ++ Bytef dummyin, dummyout; ++ uLongf dummylen = 0; ++ if ( UncompressChunkOrAll(&dummyout, &dummylen, &dummyin, 0, Z_FINISH) ++ != Z_OK ) { ++ return false; ++ } ++ ++ // Make sure that when we exit, we can start a new round of chunks later ++ Reset(); ++ ++ return true; ++} ++ ++// Uncompresses the source buffer into the destination buffer. ++// The destination buffer must be long enough to hold the entire ++// decompressed contents. ++// ++// We only initialize the uncomp_stream once. Thereafter, we use ++// inflateReset, which should be faster. ++// ++// Returns Z_OK on success, otherwise, it returns a zlib error code. ++int ZLib::Uncompress(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen) { ++ int err; ++ if ( (err=UncompressChunkOrAll(dest, destLen, source, sourceLen, ++ Z_FINISH)) != Z_OK ) { ++ Reset(); // let us try to compress again ++ return err; ++ } ++ if ( !UncompressChunkDone() ) // calls Reset() ++ return Z_DATA_ERROR; ++ return Z_OK; // stream_end is ok ++} ++ ++#endif // HAVE_LIBZ ++ ++} // namespace snappy +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.h +new file mode 100644 +index 0000000..078f321 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.h +@@ -0,0 +1,573 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various stubs for the unit tests for the open-source version of Snappy. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_TEST_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_TEST_H_ ++ ++#include ++#include ++ ++#include "snappy-stubs-internal.h" ++ ++#include ++#include ++ ++#ifdef HAVE_SYS_MMAN_H ++#include ++#endif ++ ++#ifdef HAVE_SYS_RESOURCE_H ++#include ++#endif ++ ++#ifdef HAVE_SYS_TIME_H ++#include ++#endif ++ ++#ifdef HAVE_WINDOWS_H ++#include ++#endif ++ ++#include ++ ++#ifdef HAVE_GTEST ++ ++#include ++#undef TYPED_TEST ++#define TYPED_TEST TEST ++#define INIT_GTEST(argc, argv) ::testing::InitGoogleTest(argc, *argv) ++ ++#else ++ ++// Stubs for if the user doesn't have Google Test installed. ++ ++#define TEST(test_case, test_subcase) \ ++ void Test_ ## test_case ## _ ## test_subcase() ++#define INIT_GTEST(argc, argv) ++ ++#define TYPED_TEST TEST ++#define EXPECT_EQ CHECK_EQ ++#define EXPECT_NE CHECK_NE ++#define EXPECT_FALSE(cond) CHECK(!(cond)) ++ ++#endif ++ ++#ifdef HAVE_GFLAGS ++ ++#include ++ ++// This is tricky; both gflags and Google Test want to look at the command line ++// arguments. Google Test seems to be the most happy with unknown arguments, ++// though, so we call it first and hope for the best. ++#define InitGoogle(argv0, argc, argv, remove_flags) \ ++ INIT_GTEST(argc, argv); \ ++ google::ParseCommandLineFlags(argc, argv, remove_flags); ++ ++#else ++ ++// If we don't have the gflags package installed, these can only be ++// changed at compile time. ++#define DEFINE_int32(flag_name, default_value, description) \ ++ static int FLAGS_ ## flag_name = default_value; ++ ++#define InitGoogle(argv0, argc, argv, remove_flags) \ ++ INIT_GTEST(argc, argv) ++ ++#endif ++ ++#ifdef HAVE_LIBZ ++#include "zlib.h" ++#endif ++ ++#ifdef HAVE_LIBLZO2 ++#include "lzo/lzo1x.h" ++#endif ++ ++namespace { ++ ++namespace file { ++ int Defaults() { return 0; } ++ ++ class DummyStatus { ++ public: ++ void CheckSuccess() { } ++ }; ++ ++ DummyStatus GetContents( ++ const std::string& filename, std::string* data, int unused) { ++ FILE* fp = fopen(filename.c_str(), "rb"); ++ if (fp == NULL) { ++ perror(filename.c_str()); ++ exit(1); ++ } ++ ++ data->clear(); ++ while (!feof(fp)) { ++ char buf[4096]; ++ size_t ret = fread(buf, 1, 4096, fp); ++ if (ret == 0 && ferror(fp)) { ++ perror("fread"); ++ exit(1); ++ } ++ data->append(std::string(buf, ret)); ++ } ++ ++ fclose(fp); ++ ++ return DummyStatus(); ++ } ++ ++ inline DummyStatus SetContents( ++ const std::string& filename, const std::string& str, int unused) { ++ FILE* fp = fopen(filename.c_str(), "wb"); ++ if (fp == NULL) { ++ perror(filename.c_str()); ++ exit(1); ++ } ++ ++ int ret = fwrite(str.data(), str.size(), 1, fp); ++ if (ret != 1) { ++ perror("fwrite"); ++ exit(1); ++ } ++ ++ fclose(fp); ++ ++ return DummyStatus(); ++ } ++} // namespace file ++ ++} // namespace ++ ++namespace snappy { ++ ++#define FLAGS_test_random_seed 301 ++typedef string TypeParam; ++ ++void Test_CorruptedTest_VerifyCorrupted(); ++void Test_Snappy_SimpleTests(); ++void Test_Snappy_MaxBlowup(); ++void Test_Snappy_RandomData(); ++void Test_Snappy_FourByteOffset(); ++void Test_SnappyCorruption_TruncatedVarint(); ++void Test_SnappyCorruption_UnterminatedVarint(); ++void Test_SnappyCorruption_OverflowingVarint(); ++void Test_Snappy_ReadPastEndOfBuffer(); ++void Test_Snappy_FindMatchLength(); ++void Test_Snappy_FindMatchLengthRandom(); ++ ++string ReadTestDataFile(const string& base, size_t size_limit); ++ ++string ReadTestDataFile(const string& base); ++ ++// A sprintf() variant that returns a std::string. ++// Not safe for general use due to truncation issues. ++string StringPrintf(const char* format, ...); ++ ++// A simple, non-cryptographically-secure random generator. ++class ACMRandom { ++ public: ++ explicit ACMRandom(uint32 seed) : seed_(seed) {} ++ ++ int32 Next(); ++ ++ int32 Uniform(int32 n) { ++ return Next() % n; ++ } ++ uint8 Rand8() { ++ return static_cast((Next() >> 1) & 0x000000ff); ++ } ++ bool OneIn(int X) { return Uniform(X) == 0; } ++ ++ // Skewed: pick "base" uniformly from range [0,max_log] and then ++ // return "base" random bits. The effect is to pick a number in the ++ // range [0,2^max_log-1] with bias towards smaller numbers. ++ int32 Skewed(int max_log); ++ ++ private: ++ static const uint32 M = 2147483647L; // 2^31-1 ++ uint32 seed_; ++}; ++ ++inline int32 ACMRandom::Next() { ++ static const uint64 A = 16807; // bits 14, 8, 7, 5, 2, 1, 0 ++ // We are computing ++ // seed_ = (seed_ * A) % M, where M = 2^31-1 ++ // ++ // seed_ must not be zero or M, or else all subsequent computed values ++ // will be zero or M respectively. For all other values, seed_ will end ++ // up cycling through every number in [1,M-1] ++ uint64 product = seed_ * A; ++ ++ // Compute (product % M) using the fact that ((x << 31) % M) == x. ++ seed_ = (product >> 31) + (product & M); ++ // The first reduction may overflow by 1 bit, so we may need to repeat. ++ // mod == M is not possible; using > allows the faster sign-bit-based test. ++ if (seed_ > M) { ++ seed_ -= M; ++ } ++ return seed_; ++} ++ ++inline int32 ACMRandom::Skewed(int max_log) { ++ const int32 base = (Next() - 1) % (max_log+1); ++ return (Next() - 1) & ((1u << base)-1); ++} ++ ++// A wall-time clock. This stub is not super-accurate, nor resistant to the ++// system time changing. ++class CycleTimer { ++ public: ++ CycleTimer() : real_time_us_(0) {} ++ ++ void Start() { ++#ifdef WIN32 ++ QueryPerformanceCounter(&start_); ++#else ++ gettimeofday(&start_, NULL); ++#endif ++ } ++ ++ void Stop() { ++#ifdef WIN32 ++ LARGE_INTEGER stop; ++ LARGE_INTEGER frequency; ++ QueryPerformanceCounter(&stop); ++ QueryPerformanceFrequency(&frequency); ++ ++ double elapsed = static_cast(stop.QuadPart - start_.QuadPart) / ++ frequency.QuadPart; ++ real_time_us_ += elapsed * 1e6 + 0.5; ++#else ++ struct timeval stop; ++ gettimeofday(&stop, NULL); ++ ++ real_time_us_ += 1000000 * (stop.tv_sec - start_.tv_sec); ++ real_time_us_ += (stop.tv_usec - start_.tv_usec); ++#endif ++ } ++ ++ double Get() { ++ return real_time_us_ * 1e-6; ++ } ++ ++ private: ++ int64 real_time_us_; ++#ifdef WIN32 ++ LARGE_INTEGER start_; ++#else ++ struct timeval start_; ++#endif ++}; ++ ++// Minimalistic microbenchmark framework. ++ ++typedef void (*BenchmarkFunction)(int, int); ++ ++class Benchmark { ++ public: ++ Benchmark(const string& name, BenchmarkFunction function) : ++ name_(name), function_(function) {} ++ ++ Benchmark* DenseRange(int start, int stop) { ++ start_ = start; ++ stop_ = stop; ++ return this; ++ } ++ ++ void Run(); ++ ++ private: ++ const string name_; ++ const BenchmarkFunction function_; ++ int start_, stop_; ++}; ++#define BENCHMARK(benchmark_name) \ ++ Benchmark* Benchmark_ ## benchmark_name = \ ++ (new Benchmark(#benchmark_name, benchmark_name)) ++ ++extern Benchmark* Benchmark_BM_UFlat; ++extern Benchmark* Benchmark_BM_UIOVec; ++extern Benchmark* Benchmark_BM_UValidate; ++extern Benchmark* Benchmark_BM_ZFlat; ++ ++void ResetBenchmarkTiming(); ++void StartBenchmarkTiming(); ++void StopBenchmarkTiming(); ++void SetBenchmarkLabel(const string& str); ++void SetBenchmarkBytesProcessed(int64 bytes); ++ ++#ifdef HAVE_LIBZ ++ ++// Object-oriented wrapper around zlib. ++class ZLib { ++ public: ++ ZLib(); ++ ~ZLib(); ++ ++ // Wipe a ZLib object to a virgin state. This differs from Reset() ++ // in that it also breaks any state. ++ void Reinit(); ++ ++ // Call this to make a zlib buffer as good as new. Here's the only ++ // case where they differ: ++ // CompressChunk(a); CompressChunk(b); CompressChunkDone(); vs ++ // CompressChunk(a); Reset(); CompressChunk(b); CompressChunkDone(); ++ // You'll want to use Reset(), then, when you interrupt a compress ++ // (or uncompress) in the middle of a chunk and want to start over. ++ void Reset(); ++ ++ // According to the zlib manual, when you Compress, the destination ++ // buffer must have size at least src + .1%*src + 12. This function ++ // helps you calculate that. Augment this to account for a potential ++ // gzip header and footer, plus a few bytes of slack. ++ static int MinCompressbufSize(int uncompress_size) { ++ return uncompress_size + uncompress_size/1000 + 40; ++ } ++ ++ // Compresses the source buffer into the destination buffer. ++ // sourceLen is the byte length of the source buffer. ++ // Upon entry, destLen is the total size of the destination buffer, ++ // which must be of size at least MinCompressbufSize(sourceLen). ++ // Upon exit, destLen is the actual size of the compressed buffer. ++ // ++ // This function can be used to compress a whole file at once if the ++ // input file is mmap'ed. ++ // ++ // Returns Z_OK if success, Z_MEM_ERROR if there was not ++ // enough memory, Z_BUF_ERROR if there was not enough room in the ++ // output buffer. Note that if the output buffer is exactly the same ++ // size as the compressed result, we still return Z_BUF_ERROR. ++ // (check CL#1936076) ++ int Compress(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen); ++ ++ // Uncompresses the source buffer into the destination buffer. ++ // The destination buffer must be long enough to hold the entire ++ // decompressed contents. ++ // ++ // Returns Z_OK on success, otherwise, it returns a zlib error code. ++ int Uncompress(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen); ++ ++ // Uncompress data one chunk at a time -- ie you can call this ++ // more than once. To get this to work you need to call per-chunk ++ // and "done" routines. ++ // ++ // Returns Z_OK if success, Z_MEM_ERROR if there was not ++ // enough memory, Z_BUF_ERROR if there was not enough room in the ++ // output buffer. ++ ++ int UncompressAtMost(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen); ++ ++ // Checks gzip footer information, as needed. Mostly this just ++ // makes sure the checksums match. Whenever you call this, it ++ // will assume the last 8 bytes from the previous UncompressChunk ++ // call are the footer. Returns true iff everything looks ok. ++ bool UncompressChunkDone(); ++ ++ private: ++ int InflateInit(); // sets up the zlib inflate structure ++ int DeflateInit(); // sets up the zlib deflate structure ++ ++ // These init the zlib data structures for compressing/uncompressing ++ int CompressInit(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen); ++ int UncompressInit(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen); ++ // Initialization method to be called if we hit an error while ++ // uncompressing. On hitting an error, call this method before ++ // returning the error. ++ void UncompressErrorInit(); ++ ++ // Helper function for Compress ++ int CompressChunkOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen, ++ int flush_mode); ++ int CompressAtMostOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen, ++ int flush_mode); ++ ++ // Likewise for UncompressAndUncompressChunk ++ int UncompressChunkOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen, ++ int flush_mode); ++ ++ int UncompressAtMostOrAll(Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong *sourceLen, ++ int flush_mode); ++ ++ // Initialization method to be called if we hit an error while ++ // compressing. On hitting an error, call this method before ++ // returning the error. ++ void CompressErrorInit(); ++ ++ int compression_level_; // compression level ++ int window_bits_; // log base 2 of the window size used in compression ++ int mem_level_; // specifies the amount of memory to be used by ++ // compressor (1-9) ++ z_stream comp_stream_; // Zlib stream data structure ++ bool comp_init_; // True if we have initialized comp_stream_ ++ z_stream uncomp_stream_; // Zlib stream data structure ++ bool uncomp_init_; // True if we have initialized uncomp_stream_ ++ ++ // These are used only with chunked compression. ++ bool first_chunk_; // true if we need to emit headers with this chunk ++}; ++ ++#endif // HAVE_LIBZ ++ ++} // namespace snappy ++ ++DECLARE_bool(run_microbenchmarks); ++ ++static inline void RunSpecifiedBenchmarks() { ++ if (!FLAGS_run_microbenchmarks) { ++ return; ++ } ++ ++ fprintf(stderr, "Running microbenchmarks.\n"); ++#ifndef NDEBUG ++ fprintf(stderr, "WARNING: Compiled with assertions enabled, will be slow.\n"); ++#endif ++#ifndef __OPTIMIZE__ ++ fprintf(stderr, "WARNING: Compiled without optimization, will be slow.\n"); ++#endif ++ fprintf(stderr, "Benchmark Time(ns) CPU(ns) Iterations\n"); ++ fprintf(stderr, "---------------------------------------------------\n"); ++ ++ snappy::Benchmark_BM_UFlat->Run(); ++ snappy::Benchmark_BM_UIOVec->Run(); ++ snappy::Benchmark_BM_UValidate->Run(); ++ snappy::Benchmark_BM_ZFlat->Run(); ++ ++ fprintf(stderr, "\n"); ++} ++ ++#ifndef HAVE_GTEST ++ ++static inline int RUN_ALL_TESTS() { ++ fprintf(stderr, "Running correctness tests.\n"); ++ snappy::Test_CorruptedTest_VerifyCorrupted(); ++ snappy::Test_Snappy_SimpleTests(); ++ snappy::Test_Snappy_MaxBlowup(); ++ snappy::Test_Snappy_RandomData(); ++ snappy::Test_Snappy_FourByteOffset(); ++ snappy::Test_SnappyCorruption_TruncatedVarint(); ++ snappy::Test_SnappyCorruption_UnterminatedVarint(); ++ snappy::Test_SnappyCorruption_OverflowingVarint(); ++ snappy::Test_Snappy_ReadPastEndOfBuffer(); ++ snappy::Test_Snappy_FindMatchLength(); ++ snappy::Test_Snappy_FindMatchLengthRandom(); ++ fprintf(stderr, "All tests passed.\n"); ++ ++ return 0; ++} ++ ++#endif // HAVE_GTEST ++ ++// For main(). ++namespace snappy { ++ ++// Logging. ++ ++#define LOG(level) LogMessage() ++#define VLOG(level) true ? (void)0 : \ ++ snappy::LogMessageVoidify() & snappy::LogMessage() ++ ++class LogMessage { ++ public: ++ LogMessage() { } ++ ~LogMessage() { ++ std::cerr << std::endl; ++ } ++ ++ LogMessage& operator<<(const std::string& msg) { ++ std::cerr << msg; ++ return *this; ++ } ++ LogMessage& operator<<(int x) { ++ std::cerr << x; ++ return *this; ++ } ++}; ++ ++// Asserts, both versions activated in debug mode only, ++// and ones that are always active. ++ ++#define CRASH_UNLESS(condition) \ ++ SNAPPY_PREDICT_TRUE(condition) ? (void)0 : \ ++ snappy::LogMessageVoidify() & snappy::LogMessageCrash() ++ ++#ifdef _MSC_VER ++// ~LogMessageCrash calls abort() and therefore never exits. This is by design ++// so temporarily disable warning C4722. ++#pragma warning(push) ++#pragma warning(disable:4722) ++#endif ++ ++class LogMessageCrash : public LogMessage { ++ public: ++ LogMessageCrash() { } ++ ~LogMessageCrash() { ++ std::cerr << std::endl; ++ abort(); ++ } ++}; ++ ++#ifdef _MSC_VER ++#pragma warning(pop) ++#endif ++ ++// This class is used to explicitly ignore values in the conditional ++// logging macros. This avoids compiler warnings like "value computed ++// is not used" and "statement has no effect". ++ ++class LogMessageVoidify { ++ public: ++ LogMessageVoidify() { } ++ // This has to be an operator with a precedence lower than << but ++ // higher than ?: ++ void operator&(const LogMessage&) { } ++}; ++ ++#define CHECK(cond) CRASH_UNLESS(cond) ++#define CHECK_LE(a, b) CRASH_UNLESS((a) <= (b)) ++#define CHECK_GE(a, b) CRASH_UNLESS((a) >= (b)) ++#define CHECK_EQ(a, b) CRASH_UNLESS((a) == (b)) ++#define CHECK_NE(a, b) CRASH_UNLESS((a) != (b)) ++#define CHECK_LT(a, b) CRASH_UNLESS((a) < (b)) ++#define CHECK_GT(a, b) CRASH_UNLESS((a) > (b)) ++#define CHECK_OK(cond) (cond).CheckSuccess() ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_TEST_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.cc +new file mode 100644 +index 0000000..fd519e5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.cc +@@ -0,0 +1,1515 @@ ++// Copyright 2005 Google Inc. All Rights Reserved. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#include "snappy.h" ++#include "snappy-internal.h" ++#include "snappy-sinksource.h" ++ ++#ifndef SNAPPY_HAVE_SSE2 ++#if defined(__SSE2__) || defined(_M_X64) || \ ++ (defined(_M_IX86_FP) && _M_IX86_FP >= 2) ++#define SNAPPY_HAVE_SSE2 1 ++#else ++#define SNAPPY_HAVE_SSE2 0 ++#endif ++#endif ++ ++#if SNAPPY_HAVE_SSE2 ++#include ++#endif ++#include ++ ++#include ++#include ++#include ++ ++ ++namespace snappy { ++ ++using internal::COPY_1_BYTE_OFFSET; ++using internal::COPY_2_BYTE_OFFSET; ++using internal::LITERAL; ++using internal::char_table; ++using internal::kMaximumTagLength; ++ ++// Any hash function will produce a valid compressed bitstream, but a good ++// hash function reduces the number of collisions and thus yields better ++// compression for compressible input, and more speed for incompressible ++// input. Of course, it doesn't hurt if the hash function is reasonably fast ++// either, as it gets called a lot. ++static inline uint32 HashBytes(uint32 bytes, int shift) { ++ uint32 kMul = 0x1e35a7bd; ++ return (bytes * kMul) >> shift; ++} ++static inline uint32 Hash(const char* p, int shift) { ++ return HashBytes(UNALIGNED_LOAD32(p), shift); ++} ++ ++size_t MaxCompressedLength(size_t source_len) { ++ // Compressed data can be defined as: ++ // compressed := item* literal* ++ // item := literal* copy ++ // ++ // The trailing literal sequence has a space blowup of at most 62/60 ++ // since a literal of length 60 needs one tag byte + one extra byte ++ // for length information. ++ // ++ // Item blowup is trickier to measure. Suppose the "copy" op copies ++ // 4 bytes of data. Because of a special check in the encoding code, ++ // we produce a 4-byte copy only if the offset is < 65536. Therefore ++ // the copy op takes 3 bytes to encode, and this type of item leads ++ // to at most the 62/60 blowup for representing literals. ++ // ++ // Suppose the "copy" op copies 5 bytes of data. If the offset is big ++ // enough, it will take 5 bytes to encode the copy op. Therefore the ++ // worst case here is a one-byte literal followed by a five-byte copy. ++ // I.e., 6 bytes of input turn into 7 bytes of "compressed" data. ++ // ++ // This last factor dominates the blowup, so the final estimate is: ++ return 32 + source_len + source_len/6; ++} ++ ++namespace { ++ ++void UnalignedCopy64(const void* src, void* dst) { ++ char tmp[8]; ++ memcpy(tmp, src, 8); ++ memcpy(dst, tmp, 8); ++} ++ ++void UnalignedCopy128(const void* src, void* dst) { ++ // TODO(alkis): Remove this when we upgrade to a recent compiler that emits ++ // SSE2 moves for memcpy(dst, src, 16). ++#if SNAPPY_HAVE_SSE2 ++ __m128i x = _mm_loadu_si128(static_cast(src)); ++ _mm_storeu_si128(static_cast<__m128i*>(dst), x); ++#else ++ char tmp[16]; ++ memcpy(tmp, src, 16); ++ memcpy(dst, tmp, 16); ++#endif ++} ++ ++// Copy [src, src+(op_limit-op)) to [op, (op_limit-op)) a byte at a time. Used ++// for handling COPY operations where the input and output regions may overlap. ++// For example, suppose: ++// src == "ab" ++// op == src + 2 ++// op_limit == op + 20 ++// After IncrementalCopySlow(src, op, op_limit), the result will have eleven ++// copies of "ab" ++// ababababababababababab ++// Note that this does not match the semantics of either memcpy() or memmove(). ++inline char* IncrementalCopySlow(const char* src, char* op, ++ char* const op_limit) { ++ while (op < op_limit) { ++ *op++ = *src++; ++ } ++ return op_limit; ++} ++ ++// Copy [src, src+(op_limit-op)) to [op, (op_limit-op)) but faster than ++// IncrementalCopySlow. buf_limit is the address past the end of the writable ++// region of the buffer. ++inline char* IncrementalCopy(const char* src, char* op, char* const op_limit, ++ char* const buf_limit) { ++ // Terminology: ++ // ++ // slop = buf_limit - op ++ // pat = op - src ++ // len = limit - op ++ assert(src < op); ++ assert(op_limit <= buf_limit); ++ // NOTE: The compressor always emits 4 <= len <= 64. It is ok to assume that ++ // to optimize this function but we have to also handle these cases in case ++ // the input does not satisfy these conditions. ++ ++ size_t pattern_size = op - src; ++ // The cases are split into different branches to allow the branch predictor, ++ // FDO, and static prediction hints to work better. For each input we list the ++ // ratio of invocations that match each condition. ++ // ++ // input slop < 16 pat < 8 len > 16 ++ // ------------------------------------------ ++ // html|html4|cp 0% 1.01% 27.73% ++ // urls 0% 0.88% 14.79% ++ // jpg 0% 64.29% 7.14% ++ // pdf 0% 2.56% 58.06% ++ // txt[1-4] 0% 0.23% 0.97% ++ // pb 0% 0.96% 13.88% ++ // bin 0.01% 22.27% 41.17% ++ // ++ // It is very rare that we don't have enough slop for doing block copies. It ++ // is also rare that we need to expand a pattern. Small patterns are common ++ // for incompressible formats and for those we are plenty fast already. ++ // Lengths are normally not greater than 16 but they vary depending on the ++ // input. In general if we always predict len <= 16 it would be an ok ++ // prediction. ++ // ++ // In order to be fast we want a pattern >= 8 bytes and an unrolled loop ++ // copying 2x 8 bytes at a time. ++ ++ // Handle the uncommon case where pattern is less than 8 bytes. ++ if (SNAPPY_PREDICT_FALSE(pattern_size < 8)) { ++ // Expand pattern to at least 8 bytes. The worse case scenario in terms of ++ // buffer usage is when the pattern is size 3. ^ is the original position ++ // of op. x are irrelevant bytes copied by the last UnalignedCopy64. ++ // ++ // abc ++ // abcabcxxxxx ++ // abcabcabcabcxxxxx ++ // ^ ++ // The last x is 14 bytes after ^. ++ if (SNAPPY_PREDICT_TRUE(op <= buf_limit - 14)) { ++ while (pattern_size < 8) { ++ UnalignedCopy64(src, op); ++ op += pattern_size; ++ pattern_size *= 2; ++ } ++ if (SNAPPY_PREDICT_TRUE(op >= op_limit)) return op_limit; ++ } else { ++ return IncrementalCopySlow(src, op, op_limit); ++ } ++ } ++ assert(pattern_size >= 8); ++ ++ // Copy 2x 8 bytes at a time. Because op - src can be < 16, a single ++ // UnalignedCopy128 might overwrite data in op. UnalignedCopy64 is safe ++ // because expanding the pattern to at least 8 bytes guarantees that ++ // op - src >= 8. ++ while (op <= buf_limit - 16) { ++ UnalignedCopy64(src, op); ++ UnalignedCopy64(src + 8, op + 8); ++ src += 16; ++ op += 16; ++ if (SNAPPY_PREDICT_TRUE(op >= op_limit)) return op_limit; ++ } ++ // We only take this branch if we didn't have enough slop and we can do a ++ // single 8 byte copy. ++ if (SNAPPY_PREDICT_FALSE(op <= buf_limit - 8)) { ++ UnalignedCopy64(src, op); ++ src += 8; ++ op += 8; ++ } ++ return IncrementalCopySlow(src, op, op_limit); ++} ++ ++} // namespace ++ ++static inline char* EmitLiteral(char* op, ++ const char* literal, ++ int len, ++ bool allow_fast_path) { ++ // The vast majority of copies are below 16 bytes, for which a ++ // call to memcpy is overkill. This fast path can sometimes ++ // copy up to 15 bytes too much, but that is okay in the ++ // main loop, since we have a bit to go on for both sides: ++ // ++ // - The input will always have kInputMarginBytes = 15 extra ++ // available bytes, as long as we're in the main loop, and ++ // if not, allow_fast_path = false. ++ // - The output will always have 32 spare bytes (see ++ // MaxCompressedLength). ++ assert(len > 0); // Zero-length literals are disallowed ++ int n = len - 1; ++ if (allow_fast_path && len <= 16) { ++ // Fits in tag byte ++ *op++ = LITERAL | (n << 2); ++ ++ UnalignedCopy128(literal, op); ++ return op + len; ++ } ++ ++ if (n < 60) { ++ // Fits in tag byte ++ *op++ = LITERAL | (n << 2); ++ } else { ++ // Encode in upcoming bytes ++ char* base = op; ++ int count = 0; ++ op++; ++ while (n > 0) { ++ *op++ = n & 0xff; ++ n >>= 8; ++ count++; ++ } ++ assert(count >= 1); ++ assert(count <= 4); ++ *base = LITERAL | ((59+count) << 2); ++ } ++ memcpy(op, literal, len); ++ return op + len; ++} ++ ++static inline char* EmitCopyAtMost64(char* op, size_t offset, size_t len, ++ bool len_less_than_12) { ++ assert(len <= 64); ++ assert(len >= 4); ++ assert(offset < 65536); ++ assert(len_less_than_12 == (len < 12)); ++ ++ if (len_less_than_12 && SNAPPY_PREDICT_TRUE(offset < 2048)) { ++ // offset fits in 11 bits. The 3 highest go in the top of the first byte, ++ // and the rest go in the second byte. ++ *op++ = COPY_1_BYTE_OFFSET + ((len - 4) << 2) + ((offset >> 3) & 0xe0); ++ *op++ = offset & 0xff; ++ } else { ++ // Write 4 bytes, though we only care about 3 of them. The output buffer ++ // is required to have some slack, so the extra byte won't overrun it. ++ uint32 u = COPY_2_BYTE_OFFSET + ((len - 1) << 2) + (offset << 8); ++ LittleEndian::Store32(op, u); ++ op += 3; ++ } ++ return op; ++} ++ ++static inline char* EmitCopy(char* op, size_t offset, size_t len, ++ bool len_less_than_12) { ++ assert(len_less_than_12 == (len < 12)); ++ if (len_less_than_12) { ++ return EmitCopyAtMost64(op, offset, len, true); ++ } else { ++ // A special case for len <= 64 might help, but so far measurements suggest ++ // it's in the noise. ++ ++ // Emit 64 byte copies but make sure to keep at least four bytes reserved. ++ while (SNAPPY_PREDICT_FALSE(len >= 68)) { ++ op = EmitCopyAtMost64(op, offset, 64, false); ++ len -= 64; ++ } ++ ++ // One or two copies will now finish the job. ++ if (len > 64) { ++ op = EmitCopyAtMost64(op, offset, 60, false); ++ len -= 60; ++ } ++ ++ // Emit remainder. ++ op = EmitCopyAtMost64(op, offset, len, len < 12); ++ return op; ++ } ++} ++ ++bool GetUncompressedLength(const char* start, size_t n, size_t* result) { ++ uint32 v = 0; ++ const char* limit = start + n; ++ if (Varint::Parse32WithLimit(start, limit, &v) != NULL) { ++ *result = v; ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++namespace internal { ++uint16* WorkingMemory::GetHashTable(size_t input_size, int* table_size) { ++ // Use smaller hash table when input.size() is smaller, since we ++ // fill the table, incurring O(hash table size) overhead for ++ // compression, and if the input is short, we won't need that ++ // many hash table entries anyway. ++ assert(kMaxHashTableSize >= 256); ++ size_t htsize = 256; ++ while (htsize < kMaxHashTableSize && htsize < input_size) { ++ htsize <<= 1; ++ } ++ ++ uint16* table; ++ if (htsize <= ARRAYSIZE(small_table_)) { ++ table = small_table_; ++ } else { ++ if (large_table_ == NULL) { ++ large_table_ = new uint16[kMaxHashTableSize]; ++ } ++ table = large_table_; ++ } ++ ++ *table_size = htsize; ++ memset(table, 0, htsize * sizeof(*table)); ++ return table; ++} ++} // end namespace internal ++ ++// For 0 <= offset <= 4, GetUint32AtOffset(GetEightBytesAt(p), offset) will ++// equal UNALIGNED_LOAD32(p + offset). Motivation: On x86-64 hardware we have ++// empirically found that overlapping loads such as ++// UNALIGNED_LOAD32(p) ... UNALIGNED_LOAD32(p+1) ... UNALIGNED_LOAD32(p+2) ++// are slower than UNALIGNED_LOAD64(p) followed by shifts and casts to uint32. ++// ++// We have different versions for 64- and 32-bit; ideally we would avoid the ++// two functions and just inline the UNALIGNED_LOAD64 call into ++// GetUint32AtOffset, but GCC (at least not as of 4.6) is seemingly not clever ++// enough to avoid loading the value multiple times then. For 64-bit, the load ++// is done when GetEightBytesAt() is called, whereas for 32-bit, the load is ++// done at GetUint32AtOffset() time. ++ ++#ifdef ARCH_K8 ++ ++typedef uint64 EightBytesReference; ++ ++static inline EightBytesReference GetEightBytesAt(const char* ptr) { ++ return UNALIGNED_LOAD64(ptr); ++} ++ ++static inline uint32 GetUint32AtOffset(uint64 v, int offset) { ++ assert(offset >= 0); ++ assert(offset <= 4); ++ return v >> (LittleEndian::IsLittleEndian() ? 8 * offset : 32 - 8 * offset); ++} ++ ++#else ++ ++typedef const char* EightBytesReference; ++ ++static inline EightBytesReference GetEightBytesAt(const char* ptr) { ++ return ptr; ++} ++ ++static inline uint32 GetUint32AtOffset(const char* v, int offset) { ++ assert(offset >= 0); ++ assert(offset <= 4); ++ return UNALIGNED_LOAD32(v + offset); ++} ++ ++#endif ++ ++// Flat array compression that does not emit the "uncompressed length" ++// prefix. Compresses "input" string to the "*op" buffer. ++// ++// REQUIRES: "input" is at most "kBlockSize" bytes long. ++// REQUIRES: "op" points to an array of memory that is at least ++// "MaxCompressedLength(input.size())" in size. ++// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. ++// REQUIRES: "table_size" is a power of two ++// ++// Returns an "end" pointer into "op" buffer. ++// "end - op" is the compressed size of "input". ++namespace internal { ++char* CompressFragment(const char* input, ++ size_t input_size, ++ char* op, ++ uint16* table, ++ const int table_size) { ++ // "ip" is the input pointer, and "op" is the output pointer. ++ const char* ip = input; ++ assert(input_size <= kBlockSize); ++ assert((table_size & (table_size - 1)) == 0); // table must be power of two ++ const int shift = 32 - Bits::Log2Floor(table_size); ++ assert(static_cast(kuint32max >> shift) == table_size - 1); ++ const char* ip_end = input + input_size; ++ const char* base_ip = ip; ++ // Bytes in [next_emit, ip) will be emitted as literal bytes. Or ++ // [next_emit, ip_end) after the main loop. ++ const char* next_emit = ip; ++ ++ const size_t kInputMarginBytes = 15; ++ if (SNAPPY_PREDICT_TRUE(input_size >= kInputMarginBytes)) { ++ const char* ip_limit = input + input_size - kInputMarginBytes; ++ ++ for (uint32 next_hash = Hash(++ip, shift); ; ) { ++ assert(next_emit < ip); ++ // The body of this loop calls EmitLiteral once and then EmitCopy one or ++ // more times. (The exception is that when we're close to exhausting ++ // the input we goto emit_remainder.) ++ // ++ // In the first iteration of this loop we're just starting, so ++ // there's nothing to copy, so calling EmitLiteral once is ++ // necessary. And we only start a new iteration when the ++ // current iteration has determined that a call to EmitLiteral will ++ // precede the next call to EmitCopy (if any). ++ // ++ // Step 1: Scan forward in the input looking for a 4-byte-long match. ++ // If we get close to exhausting the input then goto emit_remainder. ++ // ++ // Heuristic match skipping: If 32 bytes are scanned with no matches ++ // found, start looking only at every other byte. If 32 more bytes are ++ // scanned (or skipped), look at every third byte, etc.. When a match is ++ // found, immediately go back to looking at every byte. This is a small ++ // loss (~5% performance, ~0.1% density) for compressible data due to more ++ // bookkeeping, but for non-compressible data (such as JPEG) it's a huge ++ // win since the compressor quickly "realizes" the data is incompressible ++ // and doesn't bother looking for matches everywhere. ++ // ++ // The "skip" variable keeps track of how many bytes there are since the ++ // last match; dividing it by 32 (ie. right-shifting by five) gives the ++ // number of bytes to move ahead for each iteration. ++ uint32 skip = 32; ++ ++ const char* next_ip = ip; ++ const char* candidate; ++ do { ++ ip = next_ip; ++ uint32 hash = next_hash; ++ assert(hash == Hash(ip, shift)); ++ uint32 bytes_between_hash_lookups = skip >> 5; ++ skip += bytes_between_hash_lookups; ++ next_ip = ip + bytes_between_hash_lookups; ++ if (SNAPPY_PREDICT_FALSE(next_ip > ip_limit)) { ++ goto emit_remainder; ++ } ++ next_hash = Hash(next_ip, shift); ++ candidate = base_ip + table[hash]; ++ assert(candidate >= base_ip); ++ assert(candidate < ip); ++ ++ table[hash] = ip - base_ip; ++ } while (SNAPPY_PREDICT_TRUE(UNALIGNED_LOAD32(ip) != ++ UNALIGNED_LOAD32(candidate))); ++ ++ // Step 2: A 4-byte match has been found. We'll later see if more ++ // than 4 bytes match. But, prior to the match, input ++ // bytes [next_emit, ip) are unmatched. Emit them as "literal bytes." ++ assert(next_emit + 16 <= ip_end); ++ op = EmitLiteral(op, next_emit, ip - next_emit, true); ++ ++ // Step 3: Call EmitCopy, and then see if another EmitCopy could ++ // be our next move. Repeat until we find no match for the ++ // input immediately after what was consumed by the last EmitCopy call. ++ // ++ // If we exit this loop normally then we need to call EmitLiteral next, ++ // though we don't yet know how big the literal will be. We handle that ++ // by proceeding to the next iteration of the main loop. We also can exit ++ // this loop via goto if we get close to exhausting the input. ++ EightBytesReference input_bytes; ++ uint32 candidate_bytes = 0; ++ ++ do { ++ // We have a 4-byte match at ip, and no need to emit any ++ // "literal bytes" prior to ip. ++ const char* base = ip; ++ std::pair p = ++ FindMatchLength(candidate + 4, ip + 4, ip_end); ++ size_t matched = 4 + p.first; ++ ip += matched; ++ size_t offset = base - candidate; ++ assert(0 == memcmp(base, candidate, matched)); ++ op = EmitCopy(op, offset, matched, p.second); ++ next_emit = ip; ++ if (SNAPPY_PREDICT_FALSE(ip >= ip_limit)) { ++ goto emit_remainder; ++ } ++ // We are now looking for a 4-byte match again. We read ++ // table[Hash(ip, shift)] for that. To improve compression, ++ // we also update table[Hash(ip - 1, shift)] and table[Hash(ip, shift)]. ++ input_bytes = GetEightBytesAt(ip - 1); ++ uint32 prev_hash = HashBytes(GetUint32AtOffset(input_bytes, 0), shift); ++ table[prev_hash] = ip - base_ip - 1; ++ uint32 cur_hash = HashBytes(GetUint32AtOffset(input_bytes, 1), shift); ++ candidate = base_ip + table[cur_hash]; ++ candidate_bytes = UNALIGNED_LOAD32(candidate); ++ table[cur_hash] = ip - base_ip; ++ } while (GetUint32AtOffset(input_bytes, 1) == candidate_bytes); ++ ++ next_hash = HashBytes(GetUint32AtOffset(input_bytes, 2), shift); ++ ++ip; ++ } ++ } ++ ++ emit_remainder: ++ // Emit the remaining bytes as a literal ++ if (next_emit < ip_end) { ++ op = EmitLiteral(op, next_emit, ip_end - next_emit, false); ++ } ++ ++ return op; ++} ++} // end namespace internal ++ ++// Called back at avery compression call to trace parameters and sizes. ++static inline void Report(const char *algorithm, size_t compressed_size, ++ size_t uncompressed_size) {} ++ ++// Signature of output types needed by decompression code. ++// The decompression code is templatized on a type that obeys this ++// signature so that we do not pay virtual function call overhead in ++// the middle of a tight decompression loop. ++// ++// class DecompressionWriter { ++// public: ++// // Called before decompression ++// void SetExpectedLength(size_t length); ++// ++// // Called after decompression ++// bool CheckLength() const; ++// ++// // Called repeatedly during decompression ++// bool Append(const char* ip, size_t length); ++// bool AppendFromSelf(uint32 offset, size_t length); ++// ++// // The rules for how TryFastAppend differs from Append are somewhat ++// // convoluted: ++// // ++// // - TryFastAppend is allowed to decline (return false) at any ++// // time, for any reason -- just "return false" would be ++// // a perfectly legal implementation of TryFastAppend. ++// // The intention is for TryFastAppend to allow a fast path ++// // in the common case of a small append. ++// // - TryFastAppend is allowed to read up to bytes ++// // from the input buffer, whereas Append is allowed to read ++// // . However, if it returns true, it must leave ++// // at least five (kMaximumTagLength) bytes in the input buffer ++// // afterwards, so that there is always enough space to read the ++// // next tag without checking for a refill. ++// // - TryFastAppend must always return decline (return false) ++// // if is 61 or more, as in this case the literal length is not ++// // decoded fully. In practice, this should not be a big problem, ++// // as it is unlikely that one would implement a fast path accepting ++// // this much data. ++// // ++// bool TryFastAppend(const char* ip, size_t available, size_t length); ++// }; ++ ++namespace internal { ++ ++// Mapping from i in range [0,4] to a mask to extract the bottom 8*i bits ++static const uint32 wordmask[] = { ++ 0u, 0xffu, 0xffffu, 0xffffffu, 0xffffffffu ++}; ++ ++} // end namespace internal ++ ++// Helper class for decompression ++class SnappyDecompressor { ++ private: ++ Source* reader_; // Underlying source of bytes to decompress ++ const char* ip_; // Points to next buffered byte ++ const char* ip_limit_; // Points just past buffered bytes ++ uint32 peeked_; // Bytes peeked from reader (need to skip) ++ bool eof_; // Hit end of input without an error? ++ char scratch_[kMaximumTagLength]; // See RefillTag(). ++ ++ // Ensure that all of the tag metadata for the next tag is available ++ // in [ip_..ip_limit_-1]. Also ensures that [ip,ip+4] is readable even ++ // if (ip_limit_ - ip_ < 5). ++ // ++ // Returns true on success, false on error or end of input. ++ bool RefillTag(); ++ ++ public: ++ explicit SnappyDecompressor(Source* reader) ++ : reader_(reader), ++ ip_(NULL), ++ ip_limit_(NULL), ++ peeked_(0), ++ eof_(false) { ++ } ++ ++ ~SnappyDecompressor() { ++ // Advance past any bytes we peeked at from the reader ++ reader_->Skip(peeked_); ++ } ++ ++ // Returns true iff we have hit the end of the input without an error. ++ bool eof() const { ++ return eof_; ++ } ++ ++ // Read the uncompressed length stored at the start of the compressed data. ++ // On succcess, stores the length in *result and returns true. ++ // On failure, returns false. ++ bool ReadUncompressedLength(uint32* result) { ++ assert(ip_ == NULL); // Must not have read anything yet ++ // Length is encoded in 1..5 bytes ++ *result = 0; ++ uint32 shift = 0; ++ while (true) { ++ if (shift >= 32) return false; ++ size_t n; ++ const char* ip = reader_->Peek(&n); ++ if (n == 0) return false; ++ const unsigned char c = *(reinterpret_cast(ip)); ++ reader_->Skip(1); ++ uint32 val = c & 0x7f; ++ if (((val << shift) >> shift) != val) return false; ++ *result |= val << shift; ++ if (c < 128) { ++ break; ++ } ++ shift += 7; ++ } ++ return true; ++ } ++ ++ // Process the next item found in the input. ++ // Returns true if successful, false on error or end of input. ++ template ++ void DecompressAllTags(Writer* writer) { ++ const char* ip = ip_; ++ // For position-independent executables, accessing global arrays can be ++ // slow. Move wordmask array onto the stack to mitigate this. ++ uint32 wordmask[sizeof(internal::wordmask)/sizeof(uint32)]; ++ // Do not use memcpy to copy internal::wordmask to ++ // wordmask. LLVM converts stack arrays to global arrays if it detects ++ // const stack arrays and this hurts the performance of position ++ // independent code. This change is temporary and can be reverted when ++ // https://reviews.llvm.org/D30759 is approved. ++ wordmask[0] = internal::wordmask[0]; ++ wordmask[1] = internal::wordmask[1]; ++ wordmask[2] = internal::wordmask[2]; ++ wordmask[3] = internal::wordmask[3]; ++ wordmask[4] = internal::wordmask[4]; ++ ++ // We could have put this refill fragment only at the beginning of the loop. ++ // However, duplicating it at the end of each branch gives the compiler more ++ // scope to optimize the expression based on the local ++ // context, which overall increases speed. ++ #define MAYBE_REFILL() \ ++ if (ip_limit_ - ip < kMaximumTagLength) { \ ++ ip_ = ip; \ ++ if (!RefillTag()) return; \ ++ ip = ip_; \ ++ } ++ ++ MAYBE_REFILL(); ++ // Add loop alignment directive. Without this directive, we observed ++ // significant performance degradation on several intel architectures ++ // in snappy benchmark built with LLVM. The degradation was caused by ++ // increased branch miss prediction. ++#if defined(__clang__) && defined(__x86_64__) ++ asm volatile (".p2align 5"); ++#endif ++ for ( ;; ) { ++ const unsigned char c = *(reinterpret_cast(ip++)); ++ ++ // Ratio of iterations that have LITERAL vs non-LITERAL for different ++ // inputs. ++ // ++ // input LITERAL NON_LITERAL ++ // ----------------------------------- ++ // html|html4|cp 23% 77% ++ // urls 36% 64% ++ // jpg 47% 53% ++ // pdf 19% 81% ++ // txt[1-4] 25% 75% ++ // pb 24% 76% ++ // bin 24% 76% ++ if (SNAPPY_PREDICT_FALSE((c & 0x3) == LITERAL)) { ++ size_t literal_length = (c >> 2) + 1u; ++ if (writer->TryFastAppend(ip, ip_limit_ - ip, literal_length)) { ++ assert(literal_length < 61); ++ ip += literal_length; ++ // NOTE(user): There is no MAYBE_REFILL() here, as TryFastAppend() ++ // will not return true unless there's already at least five spare ++ // bytes in addition to the literal. ++ continue; ++ } ++ if (SNAPPY_PREDICT_FALSE(literal_length >= 61)) { ++ // Long literal. ++ const size_t literal_length_length = literal_length - 60; ++ literal_length = ++ (LittleEndian::Load32(ip) & wordmask[literal_length_length]) + 1; ++ ip += literal_length_length; ++ } ++ ++ size_t avail = ip_limit_ - ip; ++ while (avail < literal_length) { ++ if (!writer->Append(ip, avail)) return; ++ literal_length -= avail; ++ reader_->Skip(peeked_); ++ size_t n; ++ ip = reader_->Peek(&n); ++ avail = n; ++ peeked_ = avail; ++ if (avail == 0) return; // Premature end of input ++ ip_limit_ = ip + avail; ++ } ++ if (!writer->Append(ip, literal_length)) { ++ return; ++ } ++ ip += literal_length; ++ MAYBE_REFILL(); ++ } else { ++ const size_t entry = char_table[c]; ++ const size_t trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11]; ++ const size_t length = entry & 0xff; ++ ip += entry >> 11; ++ ++ // copy_offset/256 is encoded in bits 8..10. By just fetching ++ // those bits, we get copy_offset (since the bit-field starts at ++ // bit 8). ++ const size_t copy_offset = entry & 0x700; ++ if (!writer->AppendFromSelf(copy_offset + trailer, length)) { ++ return; ++ } ++ MAYBE_REFILL(); ++ } ++ } ++ ++#undef MAYBE_REFILL ++ } ++}; ++ ++bool SnappyDecompressor::RefillTag() { ++ const char* ip = ip_; ++ if (ip == ip_limit_) { ++ // Fetch a new fragment from the reader ++ reader_->Skip(peeked_); // All peeked bytes are used up ++ size_t n; ++ ip = reader_->Peek(&n); ++ peeked_ = n; ++ eof_ = (n == 0); ++ if (eof_) return false; ++ ip_limit_ = ip + n; ++ } ++ ++ // Read the tag character ++ assert(ip < ip_limit_); ++ const unsigned char c = *(reinterpret_cast(ip)); ++ const uint32 entry = char_table[c]; ++ const uint32 needed = (entry >> 11) + 1; // +1 byte for 'c' ++ assert(needed <= sizeof(scratch_)); ++ ++ // Read more bytes from reader if needed ++ uint32 nbuf = ip_limit_ - ip; ++ if (nbuf < needed) { ++ // Stitch together bytes from ip and reader to form the word ++ // contents. We store the needed bytes in "scratch_". They ++ // will be consumed immediately by the caller since we do not ++ // read more than we need. ++ memmove(scratch_, ip, nbuf); ++ reader_->Skip(peeked_); // All peeked bytes are used up ++ peeked_ = 0; ++ while (nbuf < needed) { ++ size_t length; ++ const char* src = reader_->Peek(&length); ++ if (length == 0) return false; ++ uint32 to_add = std::min(needed - nbuf, length); ++ memcpy(scratch_ + nbuf, src, to_add); ++ nbuf += to_add; ++ reader_->Skip(to_add); ++ } ++ assert(nbuf == needed); ++ ip_ = scratch_; ++ ip_limit_ = scratch_ + needed; ++ } else if (nbuf < kMaximumTagLength) { ++ // Have enough bytes, but move into scratch_ so that we do not ++ // read past end of input ++ memmove(scratch_, ip, nbuf); ++ reader_->Skip(peeked_); // All peeked bytes are used up ++ peeked_ = 0; ++ ip_ = scratch_; ++ ip_limit_ = scratch_ + nbuf; ++ } else { ++ // Pass pointer to buffer returned by reader_. ++ ip_ = ip; ++ } ++ return true; ++} ++ ++template ++static bool InternalUncompress(Source* r, Writer* writer) { ++ // Read the uncompressed length from the front of the compressed input ++ SnappyDecompressor decompressor(r); ++ uint32 uncompressed_len = 0; ++ if (!decompressor.ReadUncompressedLength(&uncompressed_len)) return false; ++ ++ return InternalUncompressAllTags(&decompressor, writer, r->Available(), ++ uncompressed_len); ++} ++ ++template ++static bool InternalUncompressAllTags(SnappyDecompressor* decompressor, ++ Writer* writer, ++ uint32 compressed_len, ++ uint32 uncompressed_len) { ++ Report("snappy_uncompress", compressed_len, uncompressed_len); ++ ++ writer->SetExpectedLength(uncompressed_len); ++ ++ // Process the entire input ++ decompressor->DecompressAllTags(writer); ++ writer->Flush(); ++ return (decompressor->eof() && writer->CheckLength()); ++} ++ ++bool GetUncompressedLength(Source* source, uint32* result) { ++ SnappyDecompressor decompressor(source); ++ return decompressor.ReadUncompressedLength(result); ++} ++ ++size_t Compress(Source* reader, Sink* writer) { ++ size_t written = 0; ++ size_t N = reader->Available(); ++ const size_t uncompressed_size = N; ++ char ulength[Varint::kMax32]; ++ char* p = Varint::Encode32(ulength, N); ++ writer->Append(ulength, p-ulength); ++ written += (p - ulength); ++ ++ internal::WorkingMemory wmem; ++ char* scratch = NULL; ++ char* scratch_output = NULL; ++ ++ while (N > 0) { ++ // Get next block to compress (without copying if possible) ++ size_t fragment_size; ++ const char* fragment = reader->Peek(&fragment_size); ++ assert(fragment_size != 0); // premature end of input ++ const size_t num_to_read = std::min(N, kBlockSize); ++ size_t bytes_read = fragment_size; ++ ++ size_t pending_advance = 0; ++ if (bytes_read >= num_to_read) { ++ // Buffer returned by reader is large enough ++ pending_advance = num_to_read; ++ fragment_size = num_to_read; ++ } else { ++ // Read into scratch buffer ++ if (scratch == NULL) { ++ // If this is the last iteration, we want to allocate N bytes ++ // of space, otherwise the max possible kBlockSize space. ++ // num_to_read contains exactly the correct value ++ scratch = new char[num_to_read]; ++ } ++ memcpy(scratch, fragment, bytes_read); ++ reader->Skip(bytes_read); ++ ++ while (bytes_read < num_to_read) { ++ fragment = reader->Peek(&fragment_size); ++ size_t n = std::min(fragment_size, num_to_read - bytes_read); ++ memcpy(scratch + bytes_read, fragment, n); ++ bytes_read += n; ++ reader->Skip(n); ++ } ++ assert(bytes_read == num_to_read); ++ fragment = scratch; ++ fragment_size = num_to_read; ++ } ++ assert(fragment_size == num_to_read); ++ ++ // Get encoding table for compression ++ int table_size; ++ uint16* table = wmem.GetHashTable(num_to_read, &table_size); ++ ++ // Compress input_fragment and append to dest ++ const int max_output = MaxCompressedLength(num_to_read); ++ ++ // Need a scratch buffer for the output, in case the byte sink doesn't ++ // have room for us directly. ++ if (scratch_output == NULL) { ++ scratch_output = new char[max_output]; ++ } else { ++ // Since we encode kBlockSize regions followed by a region ++ // which is <= kBlockSize in length, a previously allocated ++ // scratch_output[] region is big enough for this iteration. ++ } ++ char* dest = writer->GetAppendBuffer(max_output, scratch_output); ++ char* end = internal::CompressFragment(fragment, fragment_size, ++ dest, table, table_size); ++ writer->Append(dest, end - dest); ++ written += (end - dest); ++ ++ N -= num_to_read; ++ reader->Skip(pending_advance); ++ } ++ ++ Report("snappy_compress", written, uncompressed_size); ++ ++ delete[] scratch; ++ delete[] scratch_output; ++ ++ return written; ++} ++ ++// ----------------------------------------------------------------------- ++// IOVec interfaces ++// ----------------------------------------------------------------------- ++ ++// A type that writes to an iovec. ++// Note that this is not a "ByteSink", but a type that matches the ++// Writer template argument to SnappyDecompressor::DecompressAllTags(). ++class SnappyIOVecWriter { ++ private: ++ const struct iovec* output_iov_; ++ const size_t output_iov_count_; ++ ++ // We are currently writing into output_iov_[curr_iov_index_]. ++ size_t curr_iov_index_; ++ ++ // Bytes written to output_iov_[curr_iov_index_] so far. ++ size_t curr_iov_written_; ++ ++ // Total bytes decompressed into output_iov_ so far. ++ size_t total_written_; ++ ++ // Maximum number of bytes that will be decompressed into output_iov_. ++ size_t output_limit_; ++ ++ inline char* GetIOVecPointer(size_t index, size_t offset) { ++ return reinterpret_cast(output_iov_[index].iov_base) + ++ offset; ++ } ++ ++ public: ++ // Does not take ownership of iov. iov must be valid during the ++ // entire lifetime of the SnappyIOVecWriter. ++ inline SnappyIOVecWriter(const struct iovec* iov, size_t iov_count) ++ : output_iov_(iov), ++ output_iov_count_(iov_count), ++ curr_iov_index_(0), ++ curr_iov_written_(0), ++ total_written_(0), ++ output_limit_(-1) { ++ } ++ ++ inline void SetExpectedLength(size_t len) { ++ output_limit_ = len; ++ } ++ ++ inline bool CheckLength() const { ++ return total_written_ == output_limit_; ++ } ++ ++ inline bool Append(const char* ip, size_t len) { ++ if (total_written_ + len > output_limit_) { ++ return false; ++ } ++ ++ while (len > 0) { ++ assert(curr_iov_written_ <= output_iov_[curr_iov_index_].iov_len); ++ if (curr_iov_written_ >= output_iov_[curr_iov_index_].iov_len) { ++ // This iovec is full. Go to the next one. ++ if (curr_iov_index_ + 1 >= output_iov_count_) { ++ return false; ++ } ++ curr_iov_written_ = 0; ++ ++curr_iov_index_; ++ } ++ ++ const size_t to_write = std::min( ++ len, output_iov_[curr_iov_index_].iov_len - curr_iov_written_); ++ memcpy(GetIOVecPointer(curr_iov_index_, curr_iov_written_), ++ ip, ++ to_write); ++ curr_iov_written_ += to_write; ++ total_written_ += to_write; ++ ip += to_write; ++ len -= to_write; ++ } ++ ++ return true; ++ } ++ ++ inline bool TryFastAppend(const char* ip, size_t available, size_t len) { ++ const size_t space_left = output_limit_ - total_written_; ++ if (len <= 16 && available >= 16 + kMaximumTagLength && space_left >= 16 && ++ output_iov_[curr_iov_index_].iov_len - curr_iov_written_ >= 16) { ++ // Fast path, used for the majority (about 95%) of invocations. ++ char* ptr = GetIOVecPointer(curr_iov_index_, curr_iov_written_); ++ UnalignedCopy128(ip, ptr); ++ curr_iov_written_ += len; ++ total_written_ += len; ++ return true; ++ } ++ ++ return false; ++ } ++ ++ inline bool AppendFromSelf(size_t offset, size_t len) { ++ if (offset > total_written_ || offset == 0) { ++ return false; ++ } ++ const size_t space_left = output_limit_ - total_written_; ++ if (len > space_left) { ++ return false; ++ } ++ ++ // Locate the iovec from which we need to start the copy. ++ size_t from_iov_index = curr_iov_index_; ++ size_t from_iov_offset = curr_iov_written_; ++ while (offset > 0) { ++ if (from_iov_offset >= offset) { ++ from_iov_offset -= offset; ++ break; ++ } ++ ++ offset -= from_iov_offset; ++ assert(from_iov_index > 0); ++ --from_iov_index; ++ from_iov_offset = output_iov_[from_iov_index].iov_len; ++ } ++ ++ // Copy bytes starting from the iovec pointed to by from_iov_index to ++ // the current iovec. ++ while (len > 0) { ++ assert(from_iov_index <= curr_iov_index_); ++ if (from_iov_index != curr_iov_index_) { ++ const size_t to_copy = std::min( ++ output_iov_[from_iov_index].iov_len - from_iov_offset, ++ len); ++ Append(GetIOVecPointer(from_iov_index, from_iov_offset), to_copy); ++ len -= to_copy; ++ if (len > 0) { ++ ++from_iov_index; ++ from_iov_offset = 0; ++ } ++ } else { ++ assert(curr_iov_written_ <= output_iov_[curr_iov_index_].iov_len); ++ size_t to_copy = std::min(output_iov_[curr_iov_index_].iov_len - ++ curr_iov_written_, ++ len); ++ if (to_copy == 0) { ++ // This iovec is full. Go to the next one. ++ if (curr_iov_index_ + 1 >= output_iov_count_) { ++ return false; ++ } ++ ++curr_iov_index_; ++ curr_iov_written_ = 0; ++ continue; ++ } ++ if (to_copy > len) { ++ to_copy = len; ++ } ++ IncrementalCopySlow( ++ GetIOVecPointer(from_iov_index, from_iov_offset), ++ GetIOVecPointer(curr_iov_index_, curr_iov_written_), ++ GetIOVecPointer(curr_iov_index_, curr_iov_written_) + to_copy); ++ curr_iov_written_ += to_copy; ++ from_iov_offset += to_copy; ++ total_written_ += to_copy; ++ len -= to_copy; ++ } ++ } ++ ++ return true; ++ } ++ ++ inline void Flush() {} ++}; ++ ++bool RawUncompressToIOVec(const char* compressed, size_t compressed_length, ++ const struct iovec* iov, size_t iov_cnt) { ++ ByteArraySource reader(compressed, compressed_length); ++ return RawUncompressToIOVec(&reader, iov, iov_cnt); ++} ++ ++bool RawUncompressToIOVec(Source* compressed, const struct iovec* iov, ++ size_t iov_cnt) { ++ SnappyIOVecWriter output(iov, iov_cnt); ++ return InternalUncompress(compressed, &output); ++} ++ ++// ----------------------------------------------------------------------- ++// Flat array interfaces ++// ----------------------------------------------------------------------- ++ ++// A type that writes to a flat array. ++// Note that this is not a "ByteSink", but a type that matches the ++// Writer template argument to SnappyDecompressor::DecompressAllTags(). ++class SnappyArrayWriter { ++ private: ++ char* base_; ++ char* op_; ++ char* op_limit_; ++ ++ public: ++ inline explicit SnappyArrayWriter(char* dst) ++ : base_(dst), ++ op_(dst), ++ op_limit_(dst) { ++ } ++ ++ inline void SetExpectedLength(size_t len) { ++ op_limit_ = op_ + len; ++ } ++ ++ inline bool CheckLength() const { ++ return op_ == op_limit_; ++ } ++ ++ inline bool Append(const char* ip, size_t len) { ++ char* op = op_; ++ const size_t space_left = op_limit_ - op; ++ if (space_left < len) { ++ return false; ++ } ++ memcpy(op, ip, len); ++ op_ = op + len; ++ return true; ++ } ++ ++ inline bool TryFastAppend(const char* ip, size_t available, size_t len) { ++ char* op = op_; ++ const size_t space_left = op_limit_ - op; ++ if (len <= 16 && available >= 16 + kMaximumTagLength && space_left >= 16) { ++ // Fast path, used for the majority (about 95%) of invocations. ++ UnalignedCopy128(ip, op); ++ op_ = op + len; ++ return true; ++ } else { ++ return false; ++ } ++ } ++ ++ inline bool AppendFromSelf(size_t offset, size_t len) { ++ char* const op_end = op_ + len; ++ ++ // Check if we try to append from before the start of the buffer. ++ // Normally this would just be a check for "produced < offset", ++ // but "produced <= offset - 1u" is equivalent for every case ++ // except the one where offset==0, where the right side will wrap around ++ // to a very big number. This is convenient, as offset==0 is another ++ // invalid case that we also want to catch, so that we do not go ++ // into an infinite loop. ++ if (Produced() <= offset - 1u || op_end > op_limit_) return false; ++ op_ = IncrementalCopy(op_ - offset, op_, op_end, op_limit_); ++ ++ return true; ++ } ++ inline size_t Produced() const { ++ assert(op_ >= base_); ++ return op_ - base_; ++ } ++ inline void Flush() {} ++}; ++ ++bool RawUncompress(const char* compressed, size_t n, char* uncompressed) { ++ ByteArraySource reader(compressed, n); ++ return RawUncompress(&reader, uncompressed); ++} ++ ++bool RawUncompress(Source* compressed, char* uncompressed) { ++ SnappyArrayWriter output(uncompressed); ++ return InternalUncompress(compressed, &output); ++} ++ ++bool Uncompress(const char* compressed, size_t n, string* uncompressed) { ++ size_t ulength; ++ if (!GetUncompressedLength(compressed, n, &ulength)) { ++ return false; ++ } ++ // On 32-bit builds: max_size() < kuint32max. Check for that instead ++ // of crashing (e.g., consider externally specified compressed data). ++ if (ulength > uncompressed->max_size()) { ++ return false; ++ } ++ STLStringResizeUninitialized(uncompressed, ulength); ++ return RawUncompress(compressed, n, string_as_array(uncompressed)); ++} ++ ++// A Writer that drops everything on the floor and just does validation ++class SnappyDecompressionValidator { ++ private: ++ size_t expected_; ++ size_t produced_; ++ ++ public: ++ inline SnappyDecompressionValidator() : expected_(0), produced_(0) { } ++ inline void SetExpectedLength(size_t len) { ++ expected_ = len; ++ } ++ inline bool CheckLength() const { ++ return expected_ == produced_; ++ } ++ inline bool Append(const char* ip, size_t len) { ++ produced_ += len; ++ return produced_ <= expected_; ++ } ++ inline bool TryFastAppend(const char* ip, size_t available, size_t length) { ++ return false; ++ } ++ inline bool AppendFromSelf(size_t offset, size_t len) { ++ // See SnappyArrayWriter::AppendFromSelf for an explanation of ++ // the "offset - 1u" trick. ++ if (produced_ <= offset - 1u) return false; ++ produced_ += len; ++ return produced_ <= expected_; ++ } ++ inline void Flush() {} ++}; ++ ++bool IsValidCompressedBuffer(const char* compressed, size_t n) { ++ ByteArraySource reader(compressed, n); ++ SnappyDecompressionValidator writer; ++ return InternalUncompress(&reader, &writer); ++} ++ ++bool IsValidCompressed(Source* compressed) { ++ SnappyDecompressionValidator writer; ++ return InternalUncompress(compressed, &writer); ++} ++ ++void RawCompress(const char* input, ++ size_t input_length, ++ char* compressed, ++ size_t* compressed_length) { ++ ByteArraySource reader(input, input_length); ++ UncheckedByteArraySink writer(compressed); ++ Compress(&reader, &writer); ++ ++ // Compute how many bytes were added ++ *compressed_length = (writer.CurrentDestination() - compressed); ++} ++ ++size_t Compress(const char* input, size_t input_length, string* compressed) { ++ // Pre-grow the buffer to the max length of the compressed output ++ STLStringResizeUninitialized(compressed, MaxCompressedLength(input_length)); ++ ++ size_t compressed_length; ++ RawCompress(input, input_length, string_as_array(compressed), ++ &compressed_length); ++ compressed->resize(compressed_length); ++ return compressed_length; ++} ++ ++// ----------------------------------------------------------------------- ++// Sink interface ++// ----------------------------------------------------------------------- ++ ++// A type that decompresses into a Sink. The template parameter ++// Allocator must export one method "char* Allocate(int size);", which ++// allocates a buffer of "size" and appends that to the destination. ++template ++class SnappyScatteredWriter { ++ Allocator allocator_; ++ ++ // We need random access into the data generated so far. Therefore ++ // we keep track of all of the generated data as an array of blocks. ++ // All of the blocks except the last have length kBlockSize. ++ std::vector blocks_; ++ size_t expected_; ++ ++ // Total size of all fully generated blocks so far ++ size_t full_size_; ++ ++ // Pointer into current output block ++ char* op_base_; // Base of output block ++ char* op_ptr_; // Pointer to next unfilled byte in block ++ char* op_limit_; // Pointer just past block ++ ++ inline size_t Size() const { ++ return full_size_ + (op_ptr_ - op_base_); ++ } ++ ++ bool SlowAppend(const char* ip, size_t len); ++ bool SlowAppendFromSelf(size_t offset, size_t len); ++ ++ public: ++ inline explicit SnappyScatteredWriter(const Allocator& allocator) ++ : allocator_(allocator), ++ full_size_(0), ++ op_base_(NULL), ++ op_ptr_(NULL), ++ op_limit_(NULL) { ++ } ++ ++ inline void SetExpectedLength(size_t len) { ++ assert(blocks_.empty()); ++ expected_ = len; ++ } ++ ++ inline bool CheckLength() const { ++ return Size() == expected_; ++ } ++ ++ // Return the number of bytes actually uncompressed so far ++ inline size_t Produced() const { ++ return Size(); ++ } ++ ++ inline bool Append(const char* ip, size_t len) { ++ size_t avail = op_limit_ - op_ptr_; ++ if (len <= avail) { ++ // Fast path ++ memcpy(op_ptr_, ip, len); ++ op_ptr_ += len; ++ return true; ++ } else { ++ return SlowAppend(ip, len); ++ } ++ } ++ ++ inline bool TryFastAppend(const char* ip, size_t available, size_t length) { ++ char* op = op_ptr_; ++ const int space_left = op_limit_ - op; ++ if (length <= 16 && available >= 16 + kMaximumTagLength && ++ space_left >= 16) { ++ // Fast path, used for the majority (about 95%) of invocations. ++ UnalignedCopy128(ip, op); ++ op_ptr_ = op + length; ++ return true; ++ } else { ++ return false; ++ } ++ } ++ ++ inline bool AppendFromSelf(size_t offset, size_t len) { ++ char* const op_end = op_ptr_ + len; ++ // See SnappyArrayWriter::AppendFromSelf for an explanation of ++ // the "offset - 1u" trick. ++ if (SNAPPY_PREDICT_TRUE(offset - 1u < op_ptr_ - op_base_ && ++ op_end <= op_limit_)) { ++ // Fast path: src and dst in current block. ++ op_ptr_ = IncrementalCopy(op_ptr_ - offset, op_ptr_, op_end, op_limit_); ++ return true; ++ } ++ return SlowAppendFromSelf(offset, len); ++ } ++ ++ // Called at the end of the decompress. We ask the allocator ++ // write all blocks to the sink. ++ inline void Flush() { allocator_.Flush(Produced()); } ++}; ++ ++template ++bool SnappyScatteredWriter::SlowAppend(const char* ip, size_t len) { ++ size_t avail = op_limit_ - op_ptr_; ++ while (len > avail) { ++ // Completely fill this block ++ memcpy(op_ptr_, ip, avail); ++ op_ptr_ += avail; ++ assert(op_limit_ - op_ptr_ == 0); ++ full_size_ += (op_ptr_ - op_base_); ++ len -= avail; ++ ip += avail; ++ ++ // Bounds check ++ if (full_size_ + len > expected_) { ++ return false; ++ } ++ ++ // Make new block ++ size_t bsize = std::min(kBlockSize, expected_ - full_size_); ++ op_base_ = allocator_.Allocate(bsize); ++ op_ptr_ = op_base_; ++ op_limit_ = op_base_ + bsize; ++ blocks_.push_back(op_base_); ++ avail = bsize; ++ } ++ ++ memcpy(op_ptr_, ip, len); ++ op_ptr_ += len; ++ return true; ++} ++ ++template ++bool SnappyScatteredWriter::SlowAppendFromSelf(size_t offset, ++ size_t len) { ++ // Overflow check ++ // See SnappyArrayWriter::AppendFromSelf for an explanation of ++ // the "offset - 1u" trick. ++ const size_t cur = Size(); ++ if (offset - 1u >= cur) return false; ++ if (expected_ - cur < len) return false; ++ ++ // Currently we shouldn't ever hit this path because Compress() chops the ++ // input into blocks and does not create cross-block copies. However, it is ++ // nice if we do not rely on that, since we can get better compression if we ++ // allow cross-block copies and thus might want to change the compressor in ++ // the future. ++ size_t src = cur - offset; ++ while (len-- > 0) { ++ char c = blocks_[src >> kBlockLog][src & (kBlockSize-1)]; ++ Append(&c, 1); ++ src++; ++ } ++ return true; ++} ++ ++class SnappySinkAllocator { ++ public: ++ explicit SnappySinkAllocator(Sink* dest): dest_(dest) {} ++ ~SnappySinkAllocator() {} ++ ++ char* Allocate(int size) { ++ Datablock block(new char[size], size); ++ blocks_.push_back(block); ++ return block.data; ++ } ++ ++ // We flush only at the end, because the writer wants ++ // random access to the blocks and once we hand the ++ // block over to the sink, we can't access it anymore. ++ // Also we don't write more than has been actually written ++ // to the blocks. ++ void Flush(size_t size) { ++ size_t size_written = 0; ++ size_t block_size; ++ for (int i = 0; i < blocks_.size(); ++i) { ++ block_size = std::min(blocks_[i].size, size - size_written); ++ dest_->AppendAndTakeOwnership(blocks_[i].data, block_size, ++ &SnappySinkAllocator::Deleter, NULL); ++ size_written += block_size; ++ } ++ blocks_.clear(); ++ } ++ ++ private: ++ struct Datablock { ++ char* data; ++ size_t size; ++ Datablock(char* p, size_t s) : data(p), size(s) {} ++ }; ++ ++ static void Deleter(void* arg, const char* bytes, size_t size) { ++ delete[] bytes; ++ } ++ ++ Sink* dest_; ++ std::vector blocks_; ++ ++ // Note: copying this object is allowed ++}; ++ ++size_t UncompressAsMuchAsPossible(Source* compressed, Sink* uncompressed) { ++ SnappySinkAllocator allocator(uncompressed); ++ SnappyScatteredWriter writer(allocator); ++ InternalUncompress(compressed, &writer); ++ return writer.Produced(); ++} ++ ++bool Uncompress(Source* compressed, Sink* uncompressed) { ++ // Read the uncompressed length from the front of the compressed input ++ SnappyDecompressor decompressor(compressed); ++ uint32 uncompressed_len = 0; ++ if (!decompressor.ReadUncompressedLength(&uncompressed_len)) { ++ return false; ++ } ++ ++ char c; ++ size_t allocated_size; ++ char* buf = uncompressed->GetAppendBufferVariable( ++ 1, uncompressed_len, &c, 1, &allocated_size); ++ ++ const size_t compressed_len = compressed->Available(); ++ // If we can get a flat buffer, then use it, otherwise do block by block ++ // uncompression ++ if (allocated_size >= uncompressed_len) { ++ SnappyArrayWriter writer(buf); ++ bool result = InternalUncompressAllTags(&decompressor, &writer, ++ compressed_len, uncompressed_len); ++ uncompressed->Append(buf, writer.Produced()); ++ return result; ++ } else { ++ SnappySinkAllocator allocator(uncompressed); ++ SnappyScatteredWriter writer(allocator); ++ return InternalUncompressAllTags(&decompressor, &writer, compressed_len, ++ uncompressed_len); ++ } ++} ++ ++} // end namespace snappy +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.h +new file mode 100644 +index 0000000..4568db8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.h +@@ -0,0 +1,203 @@ ++// Copyright 2005 and onwards Google Inc. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// A light-weight compression algorithm. It is designed for speed of ++// compression and decompression, rather than for the utmost in space ++// savings. ++// ++// For getting better compression ratios when you are compressing data ++// with long repeated sequences or compressing data that is similar to ++// other data, while still compressing fast, you might look at first ++// using BMDiff and then compressing the output of BMDiff with ++// Snappy. ++ ++#ifndef THIRD_PARTY_SNAPPY_SNAPPY_H__ ++#define THIRD_PARTY_SNAPPY_SNAPPY_H__ ++ ++#include ++#include ++ ++#include "snappy-stubs-public.h" ++ ++namespace snappy { ++ class Source; ++ class Sink; ++ ++ // ------------------------------------------------------------------------ ++ // Generic compression/decompression routines. ++ // ------------------------------------------------------------------------ ++ ++ // Compress the bytes read from "*source" and append to "*sink". Return the ++ // number of bytes written. ++ size_t Compress(Source* source, Sink* sink); ++ ++ // Find the uncompressed length of the given stream, as given by the header. ++ // Note that the true length could deviate from this; the stream could e.g. ++ // be truncated. ++ // ++ // Also note that this leaves "*source" in a state that is unsuitable for ++ // further operations, such as RawUncompress(). You will need to rewind ++ // or recreate the source yourself before attempting any further calls. ++ bool GetUncompressedLength(Source* source, uint32* result); ++ ++ // ------------------------------------------------------------------------ ++ // Higher-level string based routines (should be sufficient for most users) ++ // ------------------------------------------------------------------------ ++ ++ // Sets "*output" to the compressed version of "input[0,input_length-1]". ++ // Original contents of *output are lost. ++ // ++ // REQUIRES: "input[]" is not an alias of "*output". ++ size_t Compress(const char* input, size_t input_length, string* output); ++ ++ // Decompresses "compressed[0,compressed_length-1]" to "*uncompressed". ++ // Original contents of "*uncompressed" are lost. ++ // ++ // REQUIRES: "compressed[]" is not an alias of "*uncompressed". ++ // ++ // returns false if the message is corrupted and could not be decompressed ++ bool Uncompress(const char* compressed, size_t compressed_length, ++ string* uncompressed); ++ ++ // Decompresses "compressed" to "*uncompressed". ++ // ++ // returns false if the message is corrupted and could not be decompressed ++ bool Uncompress(Source* compressed, Sink* uncompressed); ++ ++ // This routine uncompresses as much of the "compressed" as possible ++ // into sink. It returns the number of valid bytes added to sink ++ // (extra invalid bytes may have been added due to errors; the caller ++ // should ignore those). The emitted data typically has length ++ // GetUncompressedLength(), but may be shorter if an error is ++ // encountered. ++ size_t UncompressAsMuchAsPossible(Source* compressed, Sink* uncompressed); ++ ++ // ------------------------------------------------------------------------ ++ // Lower-level character array based routines. May be useful for ++ // efficiency reasons in certain circumstances. ++ // ------------------------------------------------------------------------ ++ ++ // REQUIRES: "compressed" must point to an area of memory that is at ++ // least "MaxCompressedLength(input_length)" bytes in length. ++ // ++ // Takes the data stored in "input[0..input_length]" and stores ++ // it in the array pointed to by "compressed". ++ // ++ // "*compressed_length" is set to the length of the compressed output. ++ // ++ // Example: ++ // char* output = new char[snappy::MaxCompressedLength(input_length)]; ++ // size_t output_length; ++ // RawCompress(input, input_length, output, &output_length); ++ // ... Process(output, output_length) ... ++ // delete [] output; ++ void RawCompress(const char* input, ++ size_t input_length, ++ char* compressed, ++ size_t* compressed_length); ++ ++ // Given data in "compressed[0..compressed_length-1]" generated by ++ // calling the Snappy::Compress routine, this routine ++ // stores the uncompressed data to ++ // uncompressed[0..GetUncompressedLength(compressed)-1] ++ // returns false if the message is corrupted and could not be decrypted ++ bool RawUncompress(const char* compressed, size_t compressed_length, ++ char* uncompressed); ++ ++ // Given data from the byte source 'compressed' generated by calling ++ // the Snappy::Compress routine, this routine stores the uncompressed ++ // data to ++ // uncompressed[0..GetUncompressedLength(compressed,compressed_length)-1] ++ // returns false if the message is corrupted and could not be decrypted ++ bool RawUncompress(Source* compressed, char* uncompressed); ++ ++ // Given data in "compressed[0..compressed_length-1]" generated by ++ // calling the Snappy::Compress routine, this routine ++ // stores the uncompressed data to the iovec "iov". The number of physical ++ // buffers in "iov" is given by iov_cnt and their cumulative size ++ // must be at least GetUncompressedLength(compressed). The individual buffers ++ // in "iov" must not overlap with each other. ++ // ++ // returns false if the message is corrupted and could not be decrypted ++ bool RawUncompressToIOVec(const char* compressed, size_t compressed_length, ++ const struct iovec* iov, size_t iov_cnt); ++ ++ // Given data from the byte source 'compressed' generated by calling ++ // the Snappy::Compress routine, this routine stores the uncompressed ++ // data to the iovec "iov". The number of physical ++ // buffers in "iov" is given by iov_cnt and their cumulative size ++ // must be at least GetUncompressedLength(compressed). The individual buffers ++ // in "iov" must not overlap with each other. ++ // ++ // returns false if the message is corrupted and could not be decrypted ++ bool RawUncompressToIOVec(Source* compressed, const struct iovec* iov, ++ size_t iov_cnt); ++ ++ // Returns the maximal size of the compressed representation of ++ // input data that is "source_bytes" bytes in length; ++ size_t MaxCompressedLength(size_t source_bytes); ++ ++ // REQUIRES: "compressed[]" was produced by RawCompress() or Compress() ++ // Returns true and stores the length of the uncompressed data in ++ // *result normally. Returns false on parsing error. ++ // This operation takes O(1) time. ++ bool GetUncompressedLength(const char* compressed, size_t compressed_length, ++ size_t* result); ++ ++ // Returns true iff the contents of "compressed[]" can be uncompressed ++ // successfully. Does not return the uncompressed data. Takes ++ // time proportional to compressed_length, but is usually at least ++ // a factor of four faster than actual decompression. ++ bool IsValidCompressedBuffer(const char* compressed, ++ size_t compressed_length); ++ ++ // Returns true iff the contents of "compressed" can be uncompressed ++ // successfully. Does not return the uncompressed data. Takes ++ // time proportional to *compressed length, but is usually at least ++ // a factor of four faster than actual decompression. ++ // On success, consumes all of *compressed. On failure, consumes an ++ // unspecified prefix of *compressed. ++ bool IsValidCompressed(Source* compressed); ++ ++ // The size of a compression block. Note that many parts of the compression ++ // code assumes that kBlockSize <= 65536; in particular, the hash table ++ // can only store 16-bit offsets, and EmitCopy() also assumes the offset ++ // is 65535 bytes or less. Note also that if you change this, it will ++ // affect the framing format (see framing_format.txt). ++ // ++ // Note that there might be older data around that is compressed with larger ++ // block sizes, so the decompression code should not rely on the ++ // non-existence of long backreferences. ++ static const int kBlockLog = 16; ++ static const size_t kBlockSize = 1 << kBlockLog; ++ ++ static const int kMaxHashTableBits = 14; ++ static const size_t kMaxHashTableSize = 1 << kMaxHashTableBits; ++} // end namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_SNAPPY_H__ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy_unittest.cc b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy_unittest.cc +new file mode 100644 +index 0000000..fcb3261 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy_unittest.cc +@@ -0,0 +1,1410 @@ ++// Copyright 2005 and onwards Google Inc. ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++#include ++#include ++ ++ ++#include ++#include ++#include ++#include ++ ++#include "snappy.h" ++#include "snappy-internal.h" ++#include "snappy-test.h" ++#include "snappy-sinksource.h" ++ ++DEFINE_int32(start_len, -1, ++ "Starting prefix size for testing (-1: just full file contents)"); ++DEFINE_int32(end_len, -1, ++ "Starting prefix size for testing (-1: just full file contents)"); ++DEFINE_int32(bytes, 10485760, ++ "How many bytes to compress/uncompress per file for timing"); ++ ++DEFINE_bool(zlib, false, ++ "Run zlib compression (http://www.zlib.net)"); ++DEFINE_bool(lzo, false, ++ "Run LZO compression (http://www.oberhumer.com/opensource/lzo/)"); ++DEFINE_bool(snappy, true, "Run snappy compression"); ++ ++DEFINE_bool(write_compressed, false, ++ "Write compressed versions of each file to .comp"); ++DEFINE_bool(write_uncompressed, false, ++ "Write uncompressed versions of each file to .uncomp"); ++ ++DEFINE_bool(snappy_dump_decompression_table, false, ++ "If true, we print the decompression table during tests."); ++ ++namespace snappy { ++ ++#if defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF) ++ ++// To test against code that reads beyond its input, this class copies a ++// string to a newly allocated group of pages, the last of which ++// is made unreadable via mprotect. Note that we need to allocate the ++// memory with mmap(), as POSIX allows mprotect() only on memory allocated ++// with mmap(), and some malloc/posix_memalign implementations expect to ++// be able to read previously allocated memory while doing heap allocations. ++class DataEndingAtUnreadablePage { ++ public: ++ explicit DataEndingAtUnreadablePage(const string& s) { ++ const size_t page_size = sysconf(_SC_PAGESIZE); ++ const size_t size = s.size(); ++ // Round up space for string to a multiple of page_size. ++ size_t space_for_string = (size + page_size - 1) & ~(page_size - 1); ++ alloc_size_ = space_for_string + page_size; ++ mem_ = mmap(NULL, alloc_size_, ++ PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ CHECK_NE(MAP_FAILED, mem_); ++ protected_page_ = reinterpret_cast(mem_) + space_for_string; ++ char* dst = protected_page_ - size; ++ memcpy(dst, s.data(), size); ++ data_ = dst; ++ size_ = size; ++ // Make guard page unreadable. ++ CHECK_EQ(0, mprotect(protected_page_, page_size, PROT_NONE)); ++ } ++ ++ ~DataEndingAtUnreadablePage() { ++ const size_t page_size = sysconf(_SC_PAGESIZE); ++ // Undo the mprotect. ++ CHECK_EQ(0, mprotect(protected_page_, page_size, PROT_READ|PROT_WRITE)); ++ CHECK_EQ(0, munmap(mem_, alloc_size_)); ++ } ++ ++ const char* data() const { return data_; } ++ size_t size() const { return size_; } ++ ++ private: ++ size_t alloc_size_; ++ void* mem_; ++ char* protected_page_; ++ const char* data_; ++ size_t size_; ++}; ++ ++#else // defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF) ++ ++// Fallback for systems without mmap. ++typedef string DataEndingAtUnreadablePage; ++ ++#endif ++ ++enum CompressorType { ++ ZLIB, LZO, SNAPPY ++}; ++ ++const char* names[] = { ++ "ZLIB", "LZO", "SNAPPY" ++}; ++ ++static size_t MinimumRequiredOutputSpace(size_t input_size, ++ CompressorType comp) { ++ switch (comp) { ++#ifdef ZLIB_VERSION ++ case ZLIB: ++ return ZLib::MinCompressbufSize(input_size); ++#endif // ZLIB_VERSION ++ ++#ifdef LZO_VERSION ++ case LZO: ++ return input_size + input_size/64 + 16 + 3; ++#endif // LZO_VERSION ++ ++ case SNAPPY: ++ return snappy::MaxCompressedLength(input_size); ++ ++ default: ++ LOG(FATAL) << "Unknown compression type number " << comp; ++ return 0; ++ } ++} ++ ++// Returns true if we successfully compressed, false otherwise. ++// ++// If compressed_is_preallocated is set, do not resize the compressed buffer. ++// This is typically what you want for a benchmark, in order to not spend ++// time in the memory allocator. If you do set this flag, however, ++// "compressed" must be preinitialized to at least MinCompressbufSize(comp) ++// number of bytes, and may contain junk bytes at the end after return. ++static bool Compress(const char* input, size_t input_size, CompressorType comp, ++ string* compressed, bool compressed_is_preallocated) { ++ if (!compressed_is_preallocated) { ++ compressed->resize(MinimumRequiredOutputSpace(input_size, comp)); ++ } ++ ++ switch (comp) { ++#ifdef ZLIB_VERSION ++ case ZLIB: { ++ ZLib zlib; ++ uLongf destlen = compressed->size(); ++ int ret = zlib.Compress( ++ reinterpret_cast(string_as_array(compressed)), ++ &destlen, ++ reinterpret_cast(input), ++ input_size); ++ CHECK_EQ(Z_OK, ret); ++ if (!compressed_is_preallocated) { ++ compressed->resize(destlen); ++ } ++ return true; ++ } ++#endif // ZLIB_VERSION ++ ++#ifdef LZO_VERSION ++ case LZO: { ++ unsigned char* mem = new unsigned char[LZO1X_1_15_MEM_COMPRESS]; ++ lzo_uint destlen; ++ int ret = lzo1x_1_15_compress( ++ reinterpret_cast(input), ++ input_size, ++ reinterpret_cast(string_as_array(compressed)), ++ &destlen, ++ mem); ++ CHECK_EQ(LZO_E_OK, ret); ++ delete[] mem; ++ if (!compressed_is_preallocated) { ++ compressed->resize(destlen); ++ } ++ break; ++ } ++#endif // LZO_VERSION ++ ++ case SNAPPY: { ++ size_t destlen; ++ snappy::RawCompress(input, input_size, ++ string_as_array(compressed), ++ &destlen); ++ CHECK_LE(destlen, snappy::MaxCompressedLength(input_size)); ++ if (!compressed_is_preallocated) { ++ compressed->resize(destlen); ++ } ++ break; ++ } ++ ++ default: { ++ return false; // the asked-for library wasn't compiled in ++ } ++ } ++ return true; ++} ++ ++static bool Uncompress(const string& compressed, CompressorType comp, ++ int size, string* output) { ++ switch (comp) { ++#ifdef ZLIB_VERSION ++ case ZLIB: { ++ output->resize(size); ++ ZLib zlib; ++ uLongf destlen = output->size(); ++ int ret = zlib.Uncompress( ++ reinterpret_cast(string_as_array(output)), ++ &destlen, ++ reinterpret_cast(compressed.data()), ++ compressed.size()); ++ CHECK_EQ(Z_OK, ret); ++ CHECK_EQ(static_cast(size), destlen); ++ break; ++ } ++#endif // ZLIB_VERSION ++ ++#ifdef LZO_VERSION ++ case LZO: { ++ output->resize(size); ++ lzo_uint destlen; ++ int ret = lzo1x_decompress( ++ reinterpret_cast(compressed.data()), ++ compressed.size(), ++ reinterpret_cast(string_as_array(output)), ++ &destlen, ++ NULL); ++ CHECK_EQ(LZO_E_OK, ret); ++ CHECK_EQ(static_cast(size), destlen); ++ break; ++ } ++#endif // LZO_VERSION ++ ++ case SNAPPY: { ++ snappy::RawUncompress(compressed.data(), compressed.size(), ++ string_as_array(output)); ++ break; ++ } ++ ++ default: { ++ return false; // the asked-for library wasn't compiled in ++ } ++ } ++ return true; ++} ++ ++static void Measure(const char* data, ++ size_t length, ++ CompressorType comp, ++ int repeats, ++ int block_size) { ++ // Run tests a few time and pick median running times ++ static const int kRuns = 5; ++ double ctime[kRuns]; ++ double utime[kRuns]; ++ int compressed_size = 0; ++ ++ { ++ // Chop the input into blocks ++ int num_blocks = (length + block_size - 1) / block_size; ++ std::vector input(num_blocks); ++ std::vector input_length(num_blocks); ++ std::vector compressed(num_blocks); ++ std::vector output(num_blocks); ++ for (int b = 0; b < num_blocks; b++) { ++ int input_start = b * block_size; ++ int input_limit = std::min((b+1)*block_size, length); ++ input[b] = data+input_start; ++ input_length[b] = input_limit-input_start; ++ ++ // Pre-grow the output buffer so we don't measure string append time. ++ compressed[b].resize(MinimumRequiredOutputSpace(block_size, comp)); ++ } ++ ++ // First, try one trial compression to make sure the code is compiled in ++ if (!Compress(input[0], input_length[0], comp, &compressed[0], true)) { ++ LOG(WARNING) << "Skipping " << names[comp] << ": " ++ << "library not compiled in"; ++ return; ++ } ++ ++ for (int run = 0; run < kRuns; run++) { ++ CycleTimer ctimer, utimer; ++ ++ for (int b = 0; b < num_blocks; b++) { ++ // Pre-grow the output buffer so we don't measure string append time. ++ compressed[b].resize(MinimumRequiredOutputSpace(block_size, comp)); ++ } ++ ++ ctimer.Start(); ++ for (int b = 0; b < num_blocks; b++) ++ for (int i = 0; i < repeats; i++) ++ Compress(input[b], input_length[b], comp, &compressed[b], true); ++ ctimer.Stop(); ++ ++ // Compress once more, with resizing, so we don't leave junk ++ // at the end that will confuse the decompressor. ++ for (int b = 0; b < num_blocks; b++) { ++ Compress(input[b], input_length[b], comp, &compressed[b], false); ++ } ++ ++ for (int b = 0; b < num_blocks; b++) { ++ output[b].resize(input_length[b]); ++ } ++ ++ utimer.Start(); ++ for (int i = 0; i < repeats; i++) ++ for (int b = 0; b < num_blocks; b++) ++ Uncompress(compressed[b], comp, input_length[b], &output[b]); ++ utimer.Stop(); ++ ++ ctime[run] = ctimer.Get(); ++ utime[run] = utimer.Get(); ++ } ++ ++ compressed_size = 0; ++ for (size_t i = 0; i < compressed.size(); i++) { ++ compressed_size += compressed[i].size(); ++ } ++ } ++ ++ std::sort(ctime, ctime + kRuns); ++ std::sort(utime, utime + kRuns); ++ const int med = kRuns/2; ++ ++ float comp_rate = (length / ctime[med]) * repeats / 1048576.0; ++ float uncomp_rate = (length / utime[med]) * repeats / 1048576.0; ++ string x = names[comp]; ++ x += ":"; ++ string urate = (uncomp_rate >= 0) ++ ? StringPrintf("%.1f", uncomp_rate) ++ : string("?"); ++ printf("%-7s [b %dM] bytes %6d -> %6d %4.1f%% " ++ "comp %5.1f MB/s uncomp %5s MB/s\n", ++ x.c_str(), ++ block_size/(1<<20), ++ static_cast(length), static_cast(compressed_size), ++ (compressed_size * 100.0) / std::max(1, length), ++ comp_rate, ++ urate.c_str()); ++} ++ ++static int VerifyString(const string& input) { ++ string compressed; ++ DataEndingAtUnreadablePage i(input); ++ const size_t written = snappy::Compress(i.data(), i.size(), &compressed); ++ CHECK_EQ(written, compressed.size()); ++ CHECK_LE(compressed.size(), ++ snappy::MaxCompressedLength(input.size())); ++ CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ ++ string uncompressed; ++ DataEndingAtUnreadablePage c(compressed); ++ CHECK(snappy::Uncompress(c.data(), c.size(), &uncompressed)); ++ CHECK_EQ(uncompressed, input); ++ return uncompressed.size(); ++} ++ ++static void VerifyStringSink(const string& input) { ++ string compressed; ++ DataEndingAtUnreadablePage i(input); ++ const size_t written = snappy::Compress(i.data(), i.size(), &compressed); ++ CHECK_EQ(written, compressed.size()); ++ CHECK_LE(compressed.size(), ++ snappy::MaxCompressedLength(input.size())); ++ CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ ++ string uncompressed; ++ uncompressed.resize(input.size()); ++ snappy::UncheckedByteArraySink sink(string_as_array(&uncompressed)); ++ DataEndingAtUnreadablePage c(compressed); ++ snappy::ByteArraySource source(c.data(), c.size()); ++ CHECK(snappy::Uncompress(&source, &sink)); ++ CHECK_EQ(uncompressed, input); ++} ++ ++static void VerifyIOVec(const string& input) { ++ string compressed; ++ DataEndingAtUnreadablePage i(input); ++ const size_t written = snappy::Compress(i.data(), i.size(), &compressed); ++ CHECK_EQ(written, compressed.size()); ++ CHECK_LE(compressed.size(), ++ snappy::MaxCompressedLength(input.size())); ++ CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ ++ // Try uncompressing into an iovec containing a random number of entries ++ // ranging from 1 to 10. ++ char* buf = new char[input.size()]; ++ ACMRandom rnd(input.size()); ++ size_t num = rnd.Next() % 10 + 1; ++ if (input.size() < num) { ++ num = input.size(); ++ } ++ struct iovec* iov = new iovec[num]; ++ int used_so_far = 0; ++ for (size_t i = 0; i < num; ++i) { ++ iov[i].iov_base = buf + used_so_far; ++ if (i == num - 1) { ++ iov[i].iov_len = input.size() - used_so_far; ++ } else { ++ // Randomly choose to insert a 0 byte entry. ++ if (rnd.OneIn(5)) { ++ iov[i].iov_len = 0; ++ } else { ++ iov[i].iov_len = rnd.Uniform(input.size()); ++ } ++ } ++ used_so_far += iov[i].iov_len; ++ } ++ CHECK(snappy::RawUncompressToIOVec( ++ compressed.data(), compressed.size(), iov, num)); ++ CHECK(!memcmp(buf, input.data(), input.size())); ++ delete[] iov; ++ delete[] buf; ++} ++ ++// Test that data compressed by a compressor that does not ++// obey block sizes is uncompressed properly. ++static void VerifyNonBlockedCompression(const string& input) { ++ if (input.length() > snappy::kBlockSize) { ++ // We cannot test larger blocks than the maximum block size, obviously. ++ return; ++ } ++ ++ string prefix; ++ Varint::Append32(&prefix, input.size()); ++ ++ // Setup compression table ++ snappy::internal::WorkingMemory wmem; ++ int table_size; ++ uint16* table = wmem.GetHashTable(input.size(), &table_size); ++ ++ // Compress entire input in one shot ++ string compressed; ++ compressed += prefix; ++ compressed.resize(prefix.size()+snappy::MaxCompressedLength(input.size())); ++ char* dest = string_as_array(&compressed) + prefix.size(); ++ char* end = snappy::internal::CompressFragment(input.data(), input.size(), ++ dest, table, table_size); ++ compressed.resize(end - compressed.data()); ++ ++ // Uncompress into string ++ string uncomp_str; ++ CHECK(snappy::Uncompress(compressed.data(), compressed.size(), &uncomp_str)); ++ CHECK_EQ(uncomp_str, input); ++ ++ // Uncompress using source/sink ++ string uncomp_str2; ++ uncomp_str2.resize(input.size()); ++ snappy::UncheckedByteArraySink sink(string_as_array(&uncomp_str2)); ++ snappy::ByteArraySource source(compressed.data(), compressed.size()); ++ CHECK(snappy::Uncompress(&source, &sink)); ++ CHECK_EQ(uncomp_str2, input); ++ ++ // Uncompress into iovec ++ { ++ static const int kNumBlocks = 10; ++ struct iovec vec[kNumBlocks]; ++ const int block_size = 1 + input.size() / kNumBlocks; ++ string iovec_data(block_size * kNumBlocks, 'x'); ++ for (int i = 0; i < kNumBlocks; i++) { ++ vec[i].iov_base = string_as_array(&iovec_data) + i * block_size; ++ vec[i].iov_len = block_size; ++ } ++ CHECK(snappy::RawUncompressToIOVec(compressed.data(), compressed.size(), ++ vec, kNumBlocks)); ++ CHECK_EQ(string(iovec_data.data(), input.size()), input); ++ } ++} ++ ++// Expand the input so that it is at least K times as big as block size ++static string Expand(const string& input) { ++ static const int K = 3; ++ string data = input; ++ while (data.size() < K * snappy::kBlockSize) { ++ data += input; ++ } ++ return data; ++} ++ ++static int Verify(const string& input) { ++ VLOG(1) << "Verifying input of size " << input.size(); ++ ++ // Compress using string based routines ++ const int result = VerifyString(input); ++ ++ // Verify using sink based routines ++ VerifyStringSink(input); ++ ++ VerifyNonBlockedCompression(input); ++ VerifyIOVec(input); ++ if (!input.empty()) { ++ const string expanded = Expand(input); ++ VerifyNonBlockedCompression(expanded); ++ VerifyIOVec(input); ++ } ++ ++ return result; ++} ++ ++ ++static bool IsValidCompressedBuffer(const string& c) { ++ return snappy::IsValidCompressedBuffer(c.data(), c.size()); ++} ++static bool Uncompress(const string& c, string* u) { ++ return snappy::Uncompress(c.data(), c.size(), u); ++} ++ ++// This test checks to ensure that snappy doesn't coredump if it gets ++// corrupted data. ++TEST(CorruptedTest, VerifyCorrupted) { ++ string source = "making sure we don't crash with corrupted input"; ++ VLOG(1) << source; ++ string dest; ++ string uncmp; ++ snappy::Compress(source.data(), source.size(), &dest); ++ ++ // Mess around with the data. It's hard to simulate all possible ++ // corruptions; this is just one example ... ++ CHECK_GT(dest.size(), 3); ++ dest[1]--; ++ dest[3]++; ++ // this really ought to fail. ++ CHECK(!IsValidCompressedBuffer(dest)); ++ CHECK(!Uncompress(dest, &uncmp)); ++ ++ // This is testing for a security bug - a buffer that decompresses to 100k ++ // but we lie in the snappy header and only reserve 0 bytes of memory :) ++ source.resize(100000); ++ for (size_t i = 0; i < source.length(); ++i) { ++ source[i] = 'A'; ++ } ++ snappy::Compress(source.data(), source.size(), &dest); ++ dest[0] = dest[1] = dest[2] = dest[3] = 0; ++ CHECK(!IsValidCompressedBuffer(dest)); ++ CHECK(!Uncompress(dest, &uncmp)); ++ ++ if (sizeof(void *) == 4) { ++ // Another security check; check a crazy big length can't DoS us with an ++ // over-allocation. ++ // Currently this is done only for 32-bit builds. On 64-bit builds, ++ // where 3 GB might be an acceptable allocation size, Uncompress() ++ // attempts to decompress, and sometimes causes the test to run out of ++ // memory. ++ dest[0] = dest[1] = dest[2] = dest[3] = '\xff'; ++ // This decodes to a really large size, i.e., about 3 GB. ++ dest[4] = 'k'; ++ CHECK(!IsValidCompressedBuffer(dest)); ++ CHECK(!Uncompress(dest, &uncmp)); ++ } else { ++ LOG(WARNING) << "Crazy decompression lengths not checked on 64-bit build"; ++ } ++ ++ // This decodes to about 2 MB; much smaller, but should still fail. ++ dest[0] = dest[1] = dest[2] = '\xff'; ++ dest[3] = 0x00; ++ CHECK(!IsValidCompressedBuffer(dest)); ++ CHECK(!Uncompress(dest, &uncmp)); ++ ++ // try reading stuff in from a bad file. ++ for (int i = 1; i <= 3; ++i) { ++ string data = ReadTestDataFile(StringPrintf("baddata%d.snappy", i).c_str(), ++ 0); ++ string uncmp; ++ // check that we don't return a crazy length ++ size_t ulen; ++ CHECK(!snappy::GetUncompressedLength(data.data(), data.size(), &ulen) ++ || (ulen < (1<<20))); ++ uint32 ulen2; ++ snappy::ByteArraySource source(data.data(), data.size()); ++ CHECK(!snappy::GetUncompressedLength(&source, &ulen2) || ++ (ulen2 < (1<<20))); ++ CHECK(!IsValidCompressedBuffer(data)); ++ CHECK(!Uncompress(data, &uncmp)); ++ } ++} ++ ++// Helper routines to construct arbitrary compressed strings. ++// These mirror the compression code in snappy.cc, but are copied ++// here so that we can bypass some limitations in the how snappy.cc ++// invokes these routines. ++static void AppendLiteral(string* dst, const string& literal) { ++ if (literal.empty()) return; ++ int n = literal.size() - 1; ++ if (n < 60) { ++ // Fit length in tag byte ++ dst->push_back(0 | (n << 2)); ++ } else { ++ // Encode in upcoming bytes ++ char number[4]; ++ int count = 0; ++ while (n > 0) { ++ number[count++] = n & 0xff; ++ n >>= 8; ++ } ++ dst->push_back(0 | ((59+count) << 2)); ++ *dst += string(number, count); ++ } ++ *dst += literal; ++} ++ ++static void AppendCopy(string* dst, int offset, int length) { ++ while (length > 0) { ++ // Figure out how much to copy in one shot ++ int to_copy; ++ if (length >= 68) { ++ to_copy = 64; ++ } else if (length > 64) { ++ to_copy = 60; ++ } else { ++ to_copy = length; ++ } ++ length -= to_copy; ++ ++ if ((to_copy >= 4) && (to_copy < 12) && (offset < 2048)) { ++ assert(to_copy-4 < 8); // Must fit in 3 bits ++ dst->push_back(1 | ((to_copy-4) << 2) | ((offset >> 8) << 5)); ++ dst->push_back(offset & 0xff); ++ } else if (offset < 65536) { ++ dst->push_back(2 | ((to_copy-1) << 2)); ++ dst->push_back(offset & 0xff); ++ dst->push_back(offset >> 8); ++ } else { ++ dst->push_back(3 | ((to_copy-1) << 2)); ++ dst->push_back(offset & 0xff); ++ dst->push_back((offset >> 8) & 0xff); ++ dst->push_back((offset >> 16) & 0xff); ++ dst->push_back((offset >> 24) & 0xff); ++ } ++ } ++} ++ ++TEST(Snappy, SimpleTests) { ++ Verify(""); ++ Verify("a"); ++ Verify("ab"); ++ Verify("abc"); ++ ++ Verify("aaaaaaa" + string(16, 'b') + string("aaaaa") + "abc"); ++ Verify("aaaaaaa" + string(256, 'b') + string("aaaaa") + "abc"); ++ Verify("aaaaaaa" + string(2047, 'b') + string("aaaaa") + "abc"); ++ Verify("aaaaaaa" + string(65536, 'b') + string("aaaaa") + "abc"); ++ Verify("abcaaaaaaa" + string(65536, 'b') + string("aaaaa") + "abc"); ++} ++ ++// Verify max blowup (lots of four-byte copies) ++TEST(Snappy, MaxBlowup) { ++ string input; ++ for (int i = 0; i < 20000; i++) { ++ ACMRandom rnd(i); ++ uint32 bytes = static_cast(rnd.Next()); ++ input.append(reinterpret_cast(&bytes), sizeof(bytes)); ++ } ++ for (int i = 19999; i >= 0; i--) { ++ ACMRandom rnd(i); ++ uint32 bytes = static_cast(rnd.Next()); ++ input.append(reinterpret_cast(&bytes), sizeof(bytes)); ++ } ++ Verify(input); ++} ++ ++TEST(Snappy, RandomData) { ++ ACMRandom rnd(FLAGS_test_random_seed); ++ ++ const int num_ops = 20000; ++ for (int i = 0; i < num_ops; i++) { ++ if ((i % 1000) == 0) { ++ VLOG(0) << "Random op " << i << " of " << num_ops; ++ } ++ ++ string x; ++ size_t len = rnd.Uniform(4096); ++ if (i < 100) { ++ len = 65536 + rnd.Uniform(65536); ++ } ++ while (x.size() < len) { ++ int run_len = 1; ++ if (rnd.OneIn(10)) { ++ run_len = rnd.Skewed(8); ++ } ++ char c = (i < 100) ? rnd.Uniform(256) : rnd.Skewed(3); ++ while (run_len-- > 0 && x.size() < len) { ++ x += c; ++ } ++ } ++ ++ Verify(x); ++ } ++} ++ ++TEST(Snappy, FourByteOffset) { ++ // The new compressor cannot generate four-byte offsets since ++ // it chops up the input into 32KB pieces. So we hand-emit the ++ // copy manually. ++ ++ // The two fragments that make up the input string. ++ string fragment1 = "012345689abcdefghijklmnopqrstuvwxyz"; ++ string fragment2 = "some other string"; ++ ++ // How many times each fragment is emitted. ++ const int n1 = 2; ++ const int n2 = 100000 / fragment2.size(); ++ const int length = n1 * fragment1.size() + n2 * fragment2.size(); ++ ++ string compressed; ++ Varint::Append32(&compressed, length); ++ ++ AppendLiteral(&compressed, fragment1); ++ string src = fragment1; ++ for (int i = 0; i < n2; i++) { ++ AppendLiteral(&compressed, fragment2); ++ src += fragment2; ++ } ++ AppendCopy(&compressed, src.size(), fragment1.size()); ++ src += fragment1; ++ CHECK_EQ(length, src.size()); ++ ++ string uncompressed; ++ CHECK(snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ CHECK(snappy::Uncompress(compressed.data(), compressed.size(), ++ &uncompressed)); ++ CHECK_EQ(uncompressed, src); ++} ++ ++TEST(Snappy, IOVecEdgeCases) { ++ // Test some tricky edge cases in the iovec output that are not necessarily ++ // exercised by random tests. ++ ++ // Our output blocks look like this initially (the last iovec is bigger ++ // than depicted): ++ // [ ] [ ] [ ] [ ] [ ] ++ static const int kLengths[] = { 2, 1, 4, 8, 128 }; ++ ++ struct iovec iov[ARRAYSIZE(kLengths)]; ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ iov[i].iov_base = new char[kLengths[i]]; ++ iov[i].iov_len = kLengths[i]; ++ } ++ ++ string compressed; ++ Varint::Append32(&compressed, 22); ++ ++ // A literal whose output crosses three blocks. ++ // [ab] [c] [123 ] [ ] [ ] ++ AppendLiteral(&compressed, "abc123"); ++ ++ // A copy whose output crosses two blocks (source and destination ++ // segments marked). ++ // [ab] [c] [1231] [23 ] [ ] ++ // ^--^ -- ++ AppendCopy(&compressed, 3, 3); ++ ++ // A copy where the input is, at first, in the block before the output: ++ // ++ // [ab] [c] [1231] [231231 ] [ ] ++ // ^--- ^--- ++ // Then during the copy, the pointers move such that the input and ++ // output pointers are in the same block: ++ // ++ // [ab] [c] [1231] [23123123] [ ] ++ // ^- ^- ++ // And then they move again, so that the output pointer is no longer ++ // in the same block as the input pointer: ++ // [ab] [c] [1231] [23123123] [123 ] ++ // ^-- ^-- ++ AppendCopy(&compressed, 6, 9); ++ ++ // Finally, a copy where the input is from several blocks back, ++ // and it also crosses three blocks: ++ // ++ // [ab] [c] [1231] [23123123] [123b ] ++ // ^ ^ ++ // [ab] [c] [1231] [23123123] [123bc ] ++ // ^ ^ ++ // [ab] [c] [1231] [23123123] [123bc12 ] ++ // ^- ^- ++ AppendCopy(&compressed, 17, 4); ++ ++ CHECK(snappy::RawUncompressToIOVec( ++ compressed.data(), compressed.size(), iov, ARRAYSIZE(iov))); ++ CHECK_EQ(0, memcmp(iov[0].iov_base, "ab", 2)); ++ CHECK_EQ(0, memcmp(iov[1].iov_base, "c", 1)); ++ CHECK_EQ(0, memcmp(iov[2].iov_base, "1231", 4)); ++ CHECK_EQ(0, memcmp(iov[3].iov_base, "23123123", 8)); ++ CHECK_EQ(0, memcmp(iov[4].iov_base, "123bc12", 7)); ++ ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ delete[] reinterpret_cast(iov[i].iov_base); ++ } ++} ++ ++TEST(Snappy, IOVecLiteralOverflow) { ++ static const int kLengths[] = { 3, 4 }; ++ ++ struct iovec iov[ARRAYSIZE(kLengths)]; ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ iov[i].iov_base = new char[kLengths[i]]; ++ iov[i].iov_len = kLengths[i]; ++ } ++ ++ string compressed; ++ Varint::Append32(&compressed, 8); ++ ++ AppendLiteral(&compressed, "12345678"); ++ ++ CHECK(!snappy::RawUncompressToIOVec( ++ compressed.data(), compressed.size(), iov, ARRAYSIZE(iov))); ++ ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ delete[] reinterpret_cast(iov[i].iov_base); ++ } ++} ++ ++TEST(Snappy, IOVecCopyOverflow) { ++ static const int kLengths[] = { 3, 4 }; ++ ++ struct iovec iov[ARRAYSIZE(kLengths)]; ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ iov[i].iov_base = new char[kLengths[i]]; ++ iov[i].iov_len = kLengths[i]; ++ } ++ ++ string compressed; ++ Varint::Append32(&compressed, 8); ++ ++ AppendLiteral(&compressed, "123"); ++ AppendCopy(&compressed, 3, 5); ++ ++ CHECK(!snappy::RawUncompressToIOVec( ++ compressed.data(), compressed.size(), iov, ARRAYSIZE(iov))); ++ ++ for (int i = 0; i < ARRAYSIZE(kLengths); ++i) { ++ delete[] reinterpret_cast(iov[i].iov_base); ++ } ++} ++ ++static bool CheckUncompressedLength(const string& compressed, ++ size_t* ulength) { ++ const bool result1 = snappy::GetUncompressedLength(compressed.data(), ++ compressed.size(), ++ ulength); ++ ++ snappy::ByteArraySource source(compressed.data(), compressed.size()); ++ uint32 length; ++ const bool result2 = snappy::GetUncompressedLength(&source, &length); ++ CHECK_EQ(result1, result2); ++ return result1; ++} ++ ++TEST(SnappyCorruption, TruncatedVarint) { ++ string compressed, uncompressed; ++ size_t ulength; ++ compressed.push_back('\xf0'); ++ CHECK(!CheckUncompressedLength(compressed, &ulength)); ++ CHECK(!snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ CHECK(!snappy::Uncompress(compressed.data(), compressed.size(), ++ &uncompressed)); ++} ++ ++TEST(SnappyCorruption, UnterminatedVarint) { ++ string compressed, uncompressed; ++ size_t ulength; ++ compressed.push_back('\x80'); ++ compressed.push_back('\x80'); ++ compressed.push_back('\x80'); ++ compressed.push_back('\x80'); ++ compressed.push_back('\x80'); ++ compressed.push_back(10); ++ CHECK(!CheckUncompressedLength(compressed, &ulength)); ++ CHECK(!snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ CHECK(!snappy::Uncompress(compressed.data(), compressed.size(), ++ &uncompressed)); ++} ++ ++TEST(SnappyCorruption, OverflowingVarint) { ++ string compressed, uncompressed; ++ size_t ulength; ++ compressed.push_back('\xfb'); ++ compressed.push_back('\xff'); ++ compressed.push_back('\xff'); ++ compressed.push_back('\xff'); ++ compressed.push_back('\x7f'); ++ CHECK(!CheckUncompressedLength(compressed, &ulength)); ++ CHECK(!snappy::IsValidCompressedBuffer(compressed.data(), compressed.size())); ++ CHECK(!snappy::Uncompress(compressed.data(), compressed.size(), ++ &uncompressed)); ++} ++ ++TEST(Snappy, ReadPastEndOfBuffer) { ++ // Check that we do not read past end of input ++ ++ // Make a compressed string that ends with a single-byte literal ++ string compressed; ++ Varint::Append32(&compressed, 1); ++ AppendLiteral(&compressed, "x"); ++ ++ string uncompressed; ++ DataEndingAtUnreadablePage c(compressed); ++ CHECK(snappy::Uncompress(c.data(), c.size(), &uncompressed)); ++ CHECK_EQ(uncompressed, string("x")); ++} ++ ++// Check for an infinite loop caused by a copy with offset==0 ++TEST(Snappy, ZeroOffsetCopy) { ++ const char* compressed = "\x40\x12\x00\x00"; ++ // \x40 Length (must be > kMaxIncrementCopyOverflow) ++ // \x12\x00\x00 Copy with offset==0, length==5 ++ char uncompressed[100]; ++ EXPECT_FALSE(snappy::RawUncompress(compressed, 4, uncompressed)); ++} ++ ++TEST(Snappy, ZeroOffsetCopyValidation) { ++ const char* compressed = "\x05\x12\x00\x00"; ++ // \x05 Length ++ // \x12\x00\x00 Copy with offset==0, length==5 ++ EXPECT_FALSE(snappy::IsValidCompressedBuffer(compressed, 4)); ++} ++ ++namespace { ++ ++int TestFindMatchLength(const char* s1, const char *s2, unsigned length) { ++ std::pair p = ++ snappy::internal::FindMatchLength(s1, s2, s2 + length); ++ CHECK_EQ(p.first < 8, p.second); ++ return p.first; ++} ++ ++} // namespace ++ ++TEST(Snappy, FindMatchLength) { ++ // Exercise all different code paths through the function. ++ // 64-bit version: ++ ++ // Hit s1_limit in 64-bit loop, hit s1_limit in single-character loop. ++ EXPECT_EQ(6, TestFindMatchLength("012345", "012345", 6)); ++ EXPECT_EQ(11, TestFindMatchLength("01234567abc", "01234567abc", 11)); ++ ++ // Hit s1_limit in 64-bit loop, find a non-match in single-character loop. ++ EXPECT_EQ(9, TestFindMatchLength("01234567abc", "01234567axc", 9)); ++ ++ // Same, but edge cases. ++ EXPECT_EQ(11, TestFindMatchLength("01234567abc!", "01234567abc!", 11)); ++ EXPECT_EQ(11, TestFindMatchLength("01234567abc!", "01234567abc?", 11)); ++ ++ // Find non-match at once in first loop. ++ EXPECT_EQ(0, TestFindMatchLength("01234567xxxxxxxx", "?1234567xxxxxxxx", 16)); ++ EXPECT_EQ(1, TestFindMatchLength("01234567xxxxxxxx", "0?234567xxxxxxxx", 16)); ++ EXPECT_EQ(4, TestFindMatchLength("01234567xxxxxxxx", "01237654xxxxxxxx", 16)); ++ EXPECT_EQ(7, TestFindMatchLength("01234567xxxxxxxx", "0123456?xxxxxxxx", 16)); ++ ++ // Find non-match in first loop after one block. ++ EXPECT_EQ(8, TestFindMatchLength("abcdefgh01234567xxxxxxxx", ++ "abcdefgh?1234567xxxxxxxx", 24)); ++ EXPECT_EQ(9, TestFindMatchLength("abcdefgh01234567xxxxxxxx", ++ "abcdefgh0?234567xxxxxxxx", 24)); ++ EXPECT_EQ(12, TestFindMatchLength("abcdefgh01234567xxxxxxxx", ++ "abcdefgh01237654xxxxxxxx", 24)); ++ EXPECT_EQ(15, TestFindMatchLength("abcdefgh01234567xxxxxxxx", ++ "abcdefgh0123456?xxxxxxxx", 24)); ++ ++ // 32-bit version: ++ ++ // Short matches. ++ EXPECT_EQ(0, TestFindMatchLength("01234567", "?1234567", 8)); ++ EXPECT_EQ(1, TestFindMatchLength("01234567", "0?234567", 8)); ++ EXPECT_EQ(2, TestFindMatchLength("01234567", "01?34567", 8)); ++ EXPECT_EQ(3, TestFindMatchLength("01234567", "012?4567", 8)); ++ EXPECT_EQ(4, TestFindMatchLength("01234567", "0123?567", 8)); ++ EXPECT_EQ(5, TestFindMatchLength("01234567", "01234?67", 8)); ++ EXPECT_EQ(6, TestFindMatchLength("01234567", "012345?7", 8)); ++ EXPECT_EQ(7, TestFindMatchLength("01234567", "0123456?", 8)); ++ EXPECT_EQ(7, TestFindMatchLength("01234567", "0123456?", 7)); ++ EXPECT_EQ(7, TestFindMatchLength("01234567!", "0123456??", 7)); ++ ++ // Hit s1_limit in 32-bit loop, hit s1_limit in single-character loop. ++ EXPECT_EQ(10, TestFindMatchLength("xxxxxxabcd", "xxxxxxabcd", 10)); ++ EXPECT_EQ(10, TestFindMatchLength("xxxxxxabcd?", "xxxxxxabcd?", 10)); ++ EXPECT_EQ(13, TestFindMatchLength("xxxxxxabcdef", "xxxxxxabcdef", 13)); ++ ++ // Same, but edge cases. ++ EXPECT_EQ(12, TestFindMatchLength("xxxxxx0123abc!", "xxxxxx0123abc!", 12)); ++ EXPECT_EQ(12, TestFindMatchLength("xxxxxx0123abc!", "xxxxxx0123abc?", 12)); ++ ++ // Hit s1_limit in 32-bit loop, find a non-match in single-character loop. ++ EXPECT_EQ(11, TestFindMatchLength("xxxxxx0123abc", "xxxxxx0123axc", 13)); ++ ++ // Find non-match at once in first loop. ++ EXPECT_EQ(6, TestFindMatchLength("xxxxxx0123xxxxxxxx", ++ "xxxxxx?123xxxxxxxx", 18)); ++ EXPECT_EQ(7, TestFindMatchLength("xxxxxx0123xxxxxxxx", ++ "xxxxxx0?23xxxxxxxx", 18)); ++ EXPECT_EQ(8, TestFindMatchLength("xxxxxx0123xxxxxxxx", ++ "xxxxxx0132xxxxxxxx", 18)); ++ EXPECT_EQ(9, TestFindMatchLength("xxxxxx0123xxxxxxxx", ++ "xxxxxx012?xxxxxxxx", 18)); ++ ++ // Same, but edge cases. ++ EXPECT_EQ(6, TestFindMatchLength("xxxxxx0123", "xxxxxx?123", 10)); ++ EXPECT_EQ(7, TestFindMatchLength("xxxxxx0123", "xxxxxx0?23", 10)); ++ EXPECT_EQ(8, TestFindMatchLength("xxxxxx0123", "xxxxxx0132", 10)); ++ EXPECT_EQ(9, TestFindMatchLength("xxxxxx0123", "xxxxxx012?", 10)); ++ ++ // Find non-match in first loop after one block. ++ EXPECT_EQ(10, TestFindMatchLength("xxxxxxabcd0123xx", ++ "xxxxxxabcd?123xx", 16)); ++ EXPECT_EQ(11, TestFindMatchLength("xxxxxxabcd0123xx", ++ "xxxxxxabcd0?23xx", 16)); ++ EXPECT_EQ(12, TestFindMatchLength("xxxxxxabcd0123xx", ++ "xxxxxxabcd0132xx", 16)); ++ EXPECT_EQ(13, TestFindMatchLength("xxxxxxabcd0123xx", ++ "xxxxxxabcd012?xx", 16)); ++ ++ // Same, but edge cases. ++ EXPECT_EQ(10, TestFindMatchLength("xxxxxxabcd0123", "xxxxxxabcd?123", 14)); ++ EXPECT_EQ(11, TestFindMatchLength("xxxxxxabcd0123", "xxxxxxabcd0?23", 14)); ++ EXPECT_EQ(12, TestFindMatchLength("xxxxxxabcd0123", "xxxxxxabcd0132", 14)); ++ EXPECT_EQ(13, TestFindMatchLength("xxxxxxabcd0123", "xxxxxxabcd012?", 14)); ++} ++ ++TEST(Snappy, FindMatchLengthRandom) { ++ const int kNumTrials = 10000; ++ const int kTypicalLength = 10; ++ ACMRandom rnd(FLAGS_test_random_seed); ++ ++ for (int i = 0; i < kNumTrials; i++) { ++ string s, t; ++ char a = rnd.Rand8(); ++ char b = rnd.Rand8(); ++ while (!rnd.OneIn(kTypicalLength)) { ++ s.push_back(rnd.OneIn(2) ? a : b); ++ t.push_back(rnd.OneIn(2) ? a : b); ++ } ++ DataEndingAtUnreadablePage u(s); ++ DataEndingAtUnreadablePage v(t); ++ int matched = TestFindMatchLength(u.data(), v.data(), t.size()); ++ if (matched == t.size()) { ++ EXPECT_EQ(s, t); ++ } else { ++ EXPECT_NE(s[matched], t[matched]); ++ for (int j = 0; j < matched; j++) { ++ EXPECT_EQ(s[j], t[j]); ++ } ++ } ++ } ++} ++ ++static uint16 MakeEntry(unsigned int extra, ++ unsigned int len, ++ unsigned int copy_offset) { ++ // Check that all of the fields fit within the allocated space ++ assert(extra == (extra & 0x7)); // At most 3 bits ++ assert(copy_offset == (copy_offset & 0x7)); // At most 3 bits ++ assert(len == (len & 0x7f)); // At most 7 bits ++ return len | (copy_offset << 8) | (extra << 11); ++} ++ ++// Check that the decompression table is correct, and optionally print out ++// the computed one. ++TEST(Snappy, VerifyCharTable) { ++ using snappy::internal::LITERAL; ++ using snappy::internal::COPY_1_BYTE_OFFSET; ++ using snappy::internal::COPY_2_BYTE_OFFSET; ++ using snappy::internal::COPY_4_BYTE_OFFSET; ++ using snappy::internal::char_table; ++ ++ uint16 dst[256]; ++ ++ // Place invalid entries in all places to detect missing initialization ++ int assigned = 0; ++ for (int i = 0; i < 256; i++) { ++ dst[i] = 0xffff; ++ } ++ ++ // Small LITERAL entries. We store (len-1) in the top 6 bits. ++ for (unsigned int len = 1; len <= 60; len++) { ++ dst[LITERAL | ((len-1) << 2)] = MakeEntry(0, len, 0); ++ assigned++; ++ } ++ ++ // Large LITERAL entries. We use 60..63 in the high 6 bits to ++ // encode the number of bytes of length info that follow the opcode. ++ for (unsigned int extra_bytes = 1; extra_bytes <= 4; extra_bytes++) { ++ // We set the length field in the lookup table to 1 because extra ++ // bytes encode len-1. ++ dst[LITERAL | ((extra_bytes+59) << 2)] = MakeEntry(extra_bytes, 1, 0); ++ assigned++; ++ } ++ ++ // COPY_1_BYTE_OFFSET. ++ // ++ // The tag byte in the compressed data stores len-4 in 3 bits, and ++ // offset/256 in 5 bits. offset%256 is stored in the next byte. ++ // ++ // This format is used for length in range [4..11] and offset in ++ // range [0..2047] ++ for (unsigned int len = 4; len < 12; len++) { ++ for (unsigned int offset = 0; offset < 2048; offset += 256) { ++ dst[COPY_1_BYTE_OFFSET | ((len-4)<<2) | ((offset>>8)<<5)] = ++ MakeEntry(1, len, offset>>8); ++ assigned++; ++ } ++ } ++ ++ // COPY_2_BYTE_OFFSET. ++ // Tag contains len-1 in top 6 bits, and offset in next two bytes. ++ for (unsigned int len = 1; len <= 64; len++) { ++ dst[COPY_2_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(2, len, 0); ++ assigned++; ++ } ++ ++ // COPY_4_BYTE_OFFSET. ++ // Tag contents len-1 in top 6 bits, and offset in next four bytes. ++ for (unsigned int len = 1; len <= 64; len++) { ++ dst[COPY_4_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(4, len, 0); ++ assigned++; ++ } ++ ++ // Check that each entry was initialized exactly once. ++ EXPECT_EQ(256, assigned) << "Assigned only " << assigned << " of 256"; ++ for (int i = 0; i < 256; i++) { ++ EXPECT_NE(0xffff, dst[i]) << "Did not assign byte " << i; ++ } ++ ++ if (FLAGS_snappy_dump_decompression_table) { ++ printf("static const uint16 char_table[256] = {\n "); ++ for (int i = 0; i < 256; i++) { ++ printf("0x%04x%s", ++ dst[i], ++ ((i == 255) ? "\n" : (((i%8) == 7) ? ",\n " : ", "))); ++ } ++ printf("};\n"); ++ } ++ ++ // Check that computed table matched recorded table. ++ for (int i = 0; i < 256; i++) { ++ EXPECT_EQ(dst[i], char_table[i]) << "Mismatch in byte " << i; ++ } ++} ++ ++static void CompressFile(const char* fname) { ++ string fullinput; ++ CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults())); ++ ++ string compressed; ++ Compress(fullinput.data(), fullinput.size(), SNAPPY, &compressed, false); ++ ++ CHECK_OK(file::SetContents(string(fname).append(".comp"), compressed, ++ file::Defaults())); ++} ++ ++static void UncompressFile(const char* fname) { ++ string fullinput; ++ CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults())); ++ ++ size_t uncompLength; ++ CHECK(CheckUncompressedLength(fullinput, &uncompLength)); ++ ++ string uncompressed; ++ uncompressed.resize(uncompLength); ++ CHECK(snappy::Uncompress(fullinput.data(), fullinput.size(), &uncompressed)); ++ ++ CHECK_OK(file::SetContents(string(fname).append(".uncomp"), uncompressed, ++ file::Defaults())); ++} ++ ++static void MeasureFile(const char* fname) { ++ string fullinput; ++ CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults())); ++ printf("%-40s :\n", fname); ++ ++ int start_len = (FLAGS_start_len < 0) ? fullinput.size() : FLAGS_start_len; ++ int end_len = fullinput.size(); ++ if (FLAGS_end_len >= 0) { ++ end_len = std::min(fullinput.size(), FLAGS_end_len); ++ } ++ for (int len = start_len; len <= end_len; len++) { ++ const char* const input = fullinput.data(); ++ int repeats = (FLAGS_bytes + len) / (len + 1); ++ if (FLAGS_zlib) Measure(input, len, ZLIB, repeats, 1024<<10); ++ if (FLAGS_lzo) Measure(input, len, LZO, repeats, 1024<<10); ++ if (FLAGS_snappy) Measure(input, len, SNAPPY, repeats, 4096<<10); ++ ++ // For block-size based measurements ++ if (0 && FLAGS_snappy) { ++ Measure(input, len, SNAPPY, repeats, 8<<10); ++ Measure(input, len, SNAPPY, repeats, 16<<10); ++ Measure(input, len, SNAPPY, repeats, 32<<10); ++ Measure(input, len, SNAPPY, repeats, 64<<10); ++ Measure(input, len, SNAPPY, repeats, 256<<10); ++ Measure(input, len, SNAPPY, repeats, 1024<<10); ++ } ++ } ++} ++ ++static struct { ++ const char* label; ++ const char* filename; ++ size_t size_limit; ++} files[] = { ++ { "html", "html", 0 }, ++ { "urls", "urls.10K", 0 }, ++ { "jpg", "fireworks.jpeg", 0 }, ++ { "jpg_200", "fireworks.jpeg", 200 }, ++ { "pdf", "paper-100k.pdf", 0 }, ++ { "html4", "html_x_4", 0 }, ++ { "txt1", "alice29.txt", 0 }, ++ { "txt2", "asyoulik.txt", 0 }, ++ { "txt3", "lcet10.txt", 0 }, ++ { "txt4", "plrabn12.txt", 0 }, ++ { "pb", "geo.protodata", 0 }, ++ { "gaviota", "kppkn.gtb", 0 }, ++}; ++ ++static void BM_UFlat(int iters, int arg) { ++ StopBenchmarkTiming(); ++ ++ // Pick file to process based on "arg" ++ CHECK_GE(arg, 0); ++ CHECK_LT(arg, ARRAYSIZE(files)); ++ string contents = ReadTestDataFile(files[arg].filename, ++ files[arg].size_limit); ++ ++ string zcontents; ++ snappy::Compress(contents.data(), contents.size(), &zcontents); ++ char* dst = new char[contents.size()]; ++ ++ SetBenchmarkBytesProcessed(static_cast(iters) * ++ static_cast(contents.size())); ++ SetBenchmarkLabel(files[arg].label); ++ StartBenchmarkTiming(); ++ while (iters-- > 0) { ++ CHECK(snappy::RawUncompress(zcontents.data(), zcontents.size(), dst)); ++ } ++ StopBenchmarkTiming(); ++ ++ delete[] dst; ++} ++BENCHMARK(BM_UFlat)->DenseRange(0, ARRAYSIZE(files) - 1); ++ ++static void BM_UValidate(int iters, int arg) { ++ StopBenchmarkTiming(); ++ ++ // Pick file to process based on "arg" ++ CHECK_GE(arg, 0); ++ CHECK_LT(arg, ARRAYSIZE(files)); ++ string contents = ReadTestDataFile(files[arg].filename, ++ files[arg].size_limit); ++ ++ string zcontents; ++ snappy::Compress(contents.data(), contents.size(), &zcontents); ++ ++ SetBenchmarkBytesProcessed(static_cast(iters) * ++ static_cast(contents.size())); ++ SetBenchmarkLabel(files[arg].label); ++ StartBenchmarkTiming(); ++ while (iters-- > 0) { ++ CHECK(snappy::IsValidCompressedBuffer(zcontents.data(), zcontents.size())); ++ } ++ StopBenchmarkTiming(); ++} ++BENCHMARK(BM_UValidate)->DenseRange(0, 4); ++ ++static void BM_UIOVec(int iters, int arg) { ++ StopBenchmarkTiming(); ++ ++ // Pick file to process based on "arg" ++ CHECK_GE(arg, 0); ++ CHECK_LT(arg, ARRAYSIZE(files)); ++ string contents = ReadTestDataFile(files[arg].filename, ++ files[arg].size_limit); ++ ++ string zcontents; ++ snappy::Compress(contents.data(), contents.size(), &zcontents); ++ ++ // Uncompress into an iovec containing ten entries. ++ const int kNumEntries = 10; ++ struct iovec iov[kNumEntries]; ++ char *dst = new char[contents.size()]; ++ int used_so_far = 0; ++ for (int i = 0; i < kNumEntries; ++i) { ++ iov[i].iov_base = dst + used_so_far; ++ if (used_so_far == contents.size()) { ++ iov[i].iov_len = 0; ++ continue; ++ } ++ ++ if (i == kNumEntries - 1) { ++ iov[i].iov_len = contents.size() - used_so_far; ++ } else { ++ iov[i].iov_len = contents.size() / kNumEntries; ++ } ++ used_so_far += iov[i].iov_len; ++ } ++ ++ SetBenchmarkBytesProcessed(static_cast(iters) * ++ static_cast(contents.size())); ++ SetBenchmarkLabel(files[arg].label); ++ StartBenchmarkTiming(); ++ while (iters-- > 0) { ++ CHECK(snappy::RawUncompressToIOVec(zcontents.data(), zcontents.size(), iov, ++ kNumEntries)); ++ } ++ StopBenchmarkTiming(); ++ ++ delete[] dst; ++} ++BENCHMARK(BM_UIOVec)->DenseRange(0, 4); ++ ++static void BM_UFlatSink(int iters, int arg) { ++ StopBenchmarkTiming(); ++ ++ // Pick file to process based on "arg" ++ CHECK_GE(arg, 0); ++ CHECK_LT(arg, ARRAYSIZE(files)); ++ string contents = ReadTestDataFile(files[arg].filename, ++ files[arg].size_limit); ++ ++ string zcontents; ++ snappy::Compress(contents.data(), contents.size(), &zcontents); ++ char* dst = new char[contents.size()]; ++ ++ SetBenchmarkBytesProcessed(static_cast(iters) * ++ static_cast(contents.size())); ++ SetBenchmarkLabel(files[arg].label); ++ StartBenchmarkTiming(); ++ while (iters-- > 0) { ++ snappy::ByteArraySource source(zcontents.data(), zcontents.size()); ++ snappy::UncheckedByteArraySink sink(dst); ++ CHECK(snappy::Uncompress(&source, &sink)); ++ } ++ StopBenchmarkTiming(); ++ ++ string s(dst, contents.size()); ++ CHECK_EQ(contents, s); ++ ++ delete[] dst; ++} ++ ++BENCHMARK(BM_UFlatSink)->DenseRange(0, ARRAYSIZE(files) - 1); ++ ++static void BM_ZFlat(int iters, int arg) { ++ StopBenchmarkTiming(); ++ ++ // Pick file to process based on "arg" ++ CHECK_GE(arg, 0); ++ CHECK_LT(arg, ARRAYSIZE(files)); ++ string contents = ReadTestDataFile(files[arg].filename, ++ files[arg].size_limit); ++ ++ char* dst = new char[snappy::MaxCompressedLength(contents.size())]; ++ ++ SetBenchmarkBytesProcessed(static_cast(iters) * ++ static_cast(contents.size())); ++ StartBenchmarkTiming(); ++ ++ size_t zsize = 0; ++ while (iters-- > 0) { ++ snappy::RawCompress(contents.data(), contents.size(), dst, &zsize); ++ } ++ StopBenchmarkTiming(); ++ const double compression_ratio = ++ static_cast(zsize) / std::max(1, contents.size()); ++ SetBenchmarkLabel(StringPrintf("%s (%.2f %%)", ++ files[arg].label, 100.0 * compression_ratio)); ++ VLOG(0) << StringPrintf("compression for %s: %zd -> %zd bytes", ++ files[arg].label, contents.size(), zsize); ++ delete[] dst; ++} ++BENCHMARK(BM_ZFlat)->DenseRange(0, ARRAYSIZE(files) - 1); ++ ++} // namespace snappy ++ ++int main(int argc, char** argv) { ++ InitGoogle(argv[0], &argc, &argv, true); ++ RunSpecifiedBenchmarks(); ++ ++ if (argc >= 2) { ++ for (int arg = 1; arg < argc; arg++) { ++ if (FLAGS_write_compressed) { ++ snappy::CompressFile(argv[arg]); ++ } else if (FLAGS_write_uncompressed) { ++ snappy::UncompressFile(argv[arg]); ++ } else { ++ snappy::MeasureFile(argv[arg]); ++ } ++ } ++ return 0; ++ } ++ ++ return RUN_ALL_TESTS(); ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/config.h +new file mode 100644 +index 0000000..6cbbeb7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/config.h +@@ -0,0 +1,135 @@ ++/* config.h. Generated from config.h.in by configure. */ ++/* config.h.in. Generated from configure.ac by autoheader. */ ++ ++/* Define if building universal (internal helper macro) */ ++/* #undef AC_APPLE_UNIVERSAL_BUILD */ ++ ++/* Define to 1 if the compiler supports __builtin_ctz and friends. */ ++#define HAVE_BUILTIN_CTZ 1 ++ ++/* Define to 1 if the compiler supports __builtin_expect. */ ++#define HAVE_BUILTIN_EXPECT 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_DLFCN_H 1 ++ ++/* Use the gflags package for command-line parsing. */ ++/* #undef HAVE_GFLAGS */ ++ ++/* Defined when Google Test is available. */ ++/* #undef HAVE_GTEST */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_INTTYPES_H 1 ++ ++/* Define to 1 if you have the `fastlz' library (-lfastlz). */ ++/* #undef HAVE_LIBFASTLZ */ ++ ++/* Define to 1 if you have the `lzf' library (-llzf). */ ++/* #undef HAVE_LIBLZF */ ++ ++/* Define to 1 if you have the `lzo2' library (-llzo2). */ ++#define HAVE_LIBLZO2 1 ++ ++/* Define to 1 if you have the `quicklz' library (-lquicklz). */ ++/* #undef HAVE_LIBQUICKLZ */ ++ ++/* Define to 1 if you have the `z' library (-lz). */ ++#define HAVE_LIBZ 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_MEMORY_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDDEF_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDINT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STDLIB_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRINGS_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_STRING_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_BYTESWAP_H */ ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_SYS_ENDIAN_H */ ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_MMAN_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_RESOURCE_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_STAT_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TIME_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_TYPES_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_SYS_UIO_H 1 ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_UNISTD_H 1 ++ ++/* Define to 1 if you have the header file. */ ++/* #undef HAVE_WINDOWS_H */ ++ ++/* Define to the sub-directory in which libtool stores uninstalled libraries. ++ */ ++#define LT_OBJDIR ".libs/" ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" ++ ++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most ++ significant byte first (like Motorola and SPARC, unlike Intel). */ ++#if defined AC_APPLE_UNIVERSAL_BUILD ++# if defined __BIG_ENDIAN__ ++# define WORDS_BIGENDIAN 1 ++# endif ++#else ++# ifndef WORDS_BIGENDIAN ++/* # undef WORDS_BIGENDIAN */ ++# endif ++#endif ++ ++/* Define to `unsigned int' if does not define. */ ++/* #undef size_t */ ++ ++/* Define to `int' if does not define. */ ++/* #undef ssize_t */ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/snappy-stubs-public.h +new file mode 100644 +index 0000000..3ce2b59 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/solaris/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 1 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !1 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/config.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/config.h +new file mode 100644 +index 0000000..bf444ec +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/config.h +@@ -0,0 +1,29 @@ ++#include ++typedef SSIZE_T ssize_t; ++ ++/* Define to 1 if you have the header file. */ ++#define HAVE_WINDOWS_H 1 ++ ++/* Name of package */ ++#define PACKAGE "snappy" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "snappy" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "snappy 1.1.4" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "snappy" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "1.1.4" ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Version number of package */ ++#define VERSION "1.1.4" +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/snappy-stubs-public.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/snappy-stubs-public.h +new file mode 100644 +index 0000000..4d64d46 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/deps/snappy/win32/snappy-stubs-public.h +@@ -0,0 +1,100 @@ ++// Copyright 2011 Google Inc. All Rights Reserved. ++// Author: sesse@google.com (Steinar H. Gunderson) ++// ++// Redistribution and use in source and binary forms, with or without ++// modification, are permitted provided that the following conditions are ++// met: ++// ++// * Redistributions of source code must retain the above copyright ++// notice, this list of conditions and the following disclaimer. ++// * Redistributions in binary form must reproduce the above ++// copyright notice, this list of conditions and the following disclaimer ++// in the documentation and/or other materials provided with the ++// distribution. ++// * Neither the name of Google Inc. nor the names of its ++// contributors may be used to endorse or promote products derived from ++// this software without specific prior written permission. ++// ++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++// ++// Various type stubs for the open-source version of Snappy. ++// ++// This file cannot include config.h, as it is included from snappy.h, ++// which is a public header. Instead, snappy-stubs-public.h is generated by ++// from snappy-stubs-public.h.in at configure time. ++ ++#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ ++ ++#if 0 ++#include ++#endif ++ ++#if 1 ++#include ++#endif ++ ++#if 0 ++#include ++#endif ++ ++#define SNAPPY_MAJOR 1 ++#define SNAPPY_MINOR 1 ++#define SNAPPY_PATCHLEVEL 4 ++#define SNAPPY_VERSION \ ++ ((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL) ++ ++#include ++ ++namespace snappy { ++ ++#if 0 ++typedef int8_t int8; ++typedef uint8_t uint8; ++typedef int16_t int16; ++typedef uint16_t uint16; ++typedef int32_t int32; ++typedef uint32_t uint32; ++typedef int64_t int64; ++typedef uint64_t uint64; ++#else ++typedef signed char int8; ++typedef unsigned char uint8; ++typedef short int16; ++typedef unsigned short uint16; ++typedef int int32; ++typedef unsigned int uint32; ++typedef long long int64; ++typedef unsigned long long uint64; ++#endif ++ ++typedef std::string string; ++ ++#ifndef DISALLOW_COPY_AND_ASSIGN ++#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ ++ TypeName(const TypeName&); \ ++ void operator=(const TypeName&) ++#endif ++ ++#if !0 ++// Windows does not have an iovec type, yet the concept is universally useful. ++// It is simple to define it ourselves, so we put it inside our own namespace. ++struct iovec { ++ void* iov_base; ++ size_t iov_len; ++}; ++#endif ++ ++} // namespace snappy ++ ++#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/iterator.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/iterator.js +new file mode 100644 +index 0000000..2115eef +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/iterator.js +@@ -0,0 +1,50 @@ ++const util = require('util') ++const AbstractIterator = require('abstract-leveldown').AbstractIterator ++const binding = require('./binding') ++ ++function Iterator (db, options) { ++ AbstractIterator.call(this, db) ++ ++ this.context = binding.iterator_init(db.context, options) ++ this.cache = null ++ this.finished = false ++} ++ ++util.inherits(Iterator, AbstractIterator) ++ ++Iterator.prototype._seek = function (target) { ++ if (target.length === 0) { ++ throw new Error('cannot seek() to an empty target') ++ } ++ ++ this.cache = null ++ binding.iterator_seek(this.context, target) ++ this.finished = false ++} ++ ++Iterator.prototype._next = function (callback) { ++ var that = this ++ ++ if (this.cache && this.cache.length) { ++ process.nextTick(callback, null, this.cache.pop(), this.cache.pop()) ++ } else if (this.finished) { ++ process.nextTick(callback) ++ } else { ++ binding.iterator_next(this.context, function (err, array, finished) { ++ if (err) return callback(err) ++ ++ that.cache = array ++ that.finished = finished ++ that._next(callback) ++ }) ++ } ++ ++ return this ++} ++ ++Iterator.prototype._end = function (callback) { ++ delete this.cache ++ binding.iterator_end(this.context, callback) ++} ++ ++module.exports = Iterator +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/leveldown.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/leveldown.js +new file mode 100644 +index 0000000..efb31f6 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/leveldown.js +@@ -0,0 +1,153 @@ ++const util = require('util') ++const AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN ++const binding = require('./binding') ++const ChainedBatch = require('./chained-batch') ++const Iterator = require('./iterator') ++ ++function LevelDOWN (location) { ++ if (!(this instanceof LevelDOWN)) { ++ return new LevelDOWN(location) ++ } ++ ++ if (typeof location !== 'string') { ++ throw new Error('constructor requires a location string argument') ++ } ++ ++ AbstractLevelDOWN.call(this, { ++ bufferKeys: true, ++ snapshots: true, ++ permanence: true, ++ seek: true, ++ clear: true, ++ createIfMissing: true, ++ errorIfExists: true, ++ additionalMethods: { ++ approximateSize: true, ++ compactRange: true ++ } ++ }) ++ ++ this.location = location ++ this.context = binding.db_init() ++} ++ ++util.inherits(LevelDOWN, AbstractLevelDOWN) ++ ++LevelDOWN.prototype._open = function (options, callback) { ++ binding.db_open(this.context, this.location, options, callback) ++} ++ ++LevelDOWN.prototype._close = function (callback) { ++ binding.db_close(this.context, callback) ++} ++ ++LevelDOWN.prototype._serializeKey = function (key) { ++ return Buffer.isBuffer(key) ? key : String(key) ++} ++ ++LevelDOWN.prototype._serializeValue = function (value) { ++ return Buffer.isBuffer(value) ? value : String(value) ++} ++ ++LevelDOWN.prototype._put = function (key, value, options, callback) { ++ binding.db_put(this.context, key, value, options, callback) ++} ++ ++LevelDOWN.prototype._get = function (key, options, callback) { ++ binding.db_get(this.context, key, options, callback) ++} ++ ++LevelDOWN.prototype._del = function (key, options, callback) { ++ binding.db_del(this.context, key, options, callback) ++} ++ ++LevelDOWN.prototype._chainedBatch = function () { ++ return new ChainedBatch(this) ++} ++ ++LevelDOWN.prototype._batch = function (operations, options, callback) { ++ binding.batch_do(this.context, operations, options, callback) ++} ++ ++LevelDOWN.prototype.approximateSize = function (start, end, callback) { ++ if (start == null || ++ end == null || ++ typeof start === 'function' || ++ typeof end === 'function') { ++ throw new Error('approximateSize() requires valid `start` and `end` arguments') ++ } ++ ++ if (typeof callback !== 'function') { ++ throw new Error('approximateSize() requires a callback argument') ++ } ++ ++ start = this._serializeKey(start) ++ end = this._serializeKey(end) ++ ++ binding.db_approximate_size(this.context, start, end, callback) ++} ++ ++LevelDOWN.prototype.compactRange = function (start, end, callback) { ++ if (start == null || ++ end == null || ++ typeof start === 'function' || ++ typeof end === 'function') { ++ throw new Error('compactRange() requires valid `start` and `end` arguments') ++ } ++ ++ if (typeof callback !== 'function') { ++ throw new Error('compactRange() requires a callback argument') ++ } ++ ++ start = this._serializeKey(start) ++ end = this._serializeKey(end) ++ ++ binding.db_compact_range(this.context, start, end, callback) ++} ++ ++LevelDOWN.prototype.getProperty = function (property) { ++ if (typeof property !== 'string') { ++ throw new Error('getProperty() requires a valid `property` argument') ++ } ++ ++ return binding.db_get_property(this.context, property) ++} ++ ++LevelDOWN.prototype._iterator = function (options) { ++ if (this.status !== 'open') { ++ // Prevent segfault ++ throw new Error('cannot call iterator() before open()') ++ } ++ ++ return new Iterator(this, options) ++} ++ ++LevelDOWN.destroy = function (location, callback) { ++ if (arguments.length < 2) { ++ throw new Error('destroy() requires `location` and `callback` arguments') ++ } ++ if (typeof location !== 'string') { ++ throw new Error('destroy() requires a location string argument') ++ } ++ if (typeof callback !== 'function') { ++ throw new Error('destroy() requires a callback function argument') ++ } ++ ++ binding.destroy_db(location, callback) ++} ++ ++LevelDOWN.repair = function (location, callback) { ++ if (arguments.length < 2) { ++ throw new Error('repair() requires `location` and `callback` arguments') ++ } ++ if (typeof location !== 'string') { ++ throw new Error('repair() requires a location string argument') ++ } ++ if (typeof callback !== 'function') { ++ throw new Error('repair() requires a callback function argument') ++ } ++ ++ binding.repair_db(location, callback) ++} ++ ++module.exports = LevelDOWN.default = LevelDOWN +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CHANGELOG.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CHANGELOG.md +new file mode 100644 +index 0000000..99953c9 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CHANGELOG.md +@@ -0,0 +1,962 @@ ++# Changelog ++ ++_**If you are upgrading:** please see [`UPGRADING.md`](UPGRADING.md)._ ++ ++## [6.2.3] - 2020-04-03 ++ ++### Changed ++ ++- Upgrade `airtap` devDependency from `^2.0.0` to `^3.0.0` ([#360](https://github.com/Level/abstract-leveldown/issues/360)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Add `buffer` and `immediate` for browsers ([#355](https://github.com/Level/abstract-leveldown/issues/355), [#362](https://github.com/Level/abstract-leveldown/issues/362), [#363](https://github.com/Level/abstract-leveldown/issues/363)) ([**@Raynos**](https://github.com/Raynos), [**@hugomrdias**](https://github.com/hugomrdias), [**@vweevers**](https://github.com/vweevers)) ++ ++## [6.2.2] - 2019-10-21 ++ ++### Added ++ ++- Add more range tests ([#353](https://github.com/Level/abstract-leveldown/issues/353)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.2.1] - 2019-10-01 ++ ++### Fixed ++ ++- Fix `manifest-test` to open & close its db ([#352](https://github.com/Level/abstract-leveldown/issues/352)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.2.0] - 2019-09-30 ++ ++### Changed ++ ++- Upgrade `hallmark` devDependency from `^1.0.0` to `^2.0.0` ([#349](https://github.com/Level/abstract-leveldown/issues/349)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `standard` devDependency from `^13.0.1` to `^14.0.0` ([#348](https://github.com/Level/abstract-leveldown/issues/348)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add manifest ([Level/community#83](https://github.com/Level/community/issues/83)) ([#351](https://github.com/Level/abstract-leveldown/issues/351)) ([**@vweevers**](https://github.com/vweevers)) ++- Document mandatory methods ([#350](https://github.com/Level/abstract-leveldown/issues/350)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.1.1] - 2019-08-18 ++ ++### Fixed ++ ++- Remove `process.emitWarning` because it breaks AppVeyor builds ([`8e963c3`](https://github.com/Level/abstract-leveldown/commit/8e963c3)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.1.0] - 2019-08-18 ++ ++### Changed ++ ++- Upgrade `hallmark` devDependency from `^0.1.0` to `^1.0.0` ([#343](https://github.com/Level/abstract-leveldown/issues/343)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `standard` devDependency from `^12.0.0` to `^13.0.1` ([#341](https://github.com/Level/abstract-leveldown/issues/341)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add `clear()` method to delete all entries or a range ([#310](https://github.com/Level/abstract-leveldown/issues/310)) ([**@vweevers**](https://github.com/vweevers)). ++ ++**Historical Note** The `clear()` method is experimental and optional for the time being. Please see the [README](https://github.com/Level/abstract-leveldown) for details. ++ ++## [6.0.3] - 2019-04-26 ++ ++### Changed ++ ++- Upgrade `nyc` devDependency from `^13.2.0` to `^14.0.0` ([#334](https://github.com/Level/abstract-leveldown/issues/334)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Fix and test asynchronicity of empty batch ([#337](https://github.com/Level/abstract-leveldown/issues/337)) ([**@vweevers**](https://github.com/vweevers)) ++- Fix Level badge ([`8993257`](https://github.com/Level/abstract-leveldown/commit/8993257)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove link to dead website ([`c0abe28`](https://github.com/Level/abstract-leveldown/commit/c0abe28)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.0.2] - 2019-03-30 ++ ++### Changed ++ ++- Upgrade `sinon` devDependency from `^6.0.0` to `^7.2.4` ([#330](https://github.com/Level/abstract-leveldown/issues/330)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade `nyc` devDependency from `^12.0.2` to `^13.2.0` ([#327](https://github.com/Level/abstract-leveldown/issues/327)) ([**@vweevers**](https://github.com/vweevers)) ++- Upgrade `airtap` devDependency from `0.1.0` to `^2.0.0` ([#323](https://github.com/Level/abstract-leveldown/issues/323)) ([**@vweevers**](https://github.com/vweevers)) ++- Apply common project tweaks ([#324](https://github.com/Level/abstract-leveldown/issues/324), [#325](https://github.com/Level/abstract-leveldown/issues/325)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Fix subtests by adding `t.plan()` ([#329](https://github.com/Level/abstract-leveldown/issues/329)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.0.1] - 2018-12-27 ++ ++### Changed ++ ++- Upgrade `hallmark` devDependency from `0.0.2` to `0.1.0` ([#316](https://github.com/level/abstract-leveldown/issues/316)) ([**@vweevers**](https://github.com/vweevers)) ++- Split v6 upgrade guide into sections for consumers and implementors ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Remove range tests that assumed zero-length strings or Buffers meant "not defined" ([#319](https://github.com/level/abstract-leveldown/issues/319)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [6.0.0] - 2018-10-20 ++ ++_If you are upgrading, please consult the [Upgrade Guide](UPGRADING.md#v6)._ ++ ++### Changed ++ ++- Upgrade `airtap` devDependency from `0.0.5` to `0.1.0` ([#229](https://github.com/level/abstract-leveldown/issues/229), [#231](https://github.com/level/abstract-leveldown/issues/231), [#245](https://github.com/level/abstract-leveldown/issues/245), [`029f56a`](https://github.com/level/abstract-leveldown/commit/029f56a), [#252](https://github.com/level/abstract-leveldown/issues/252)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade `sinon` devDependency from `^5.0.0` to `^6.0.0` ([#232](https://github.com/level/abstract-leveldown/issues/232)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Upgrade `standard` devDependency from `^11.0.0` to `^12.0.0` ([#303](https://github.com/level/abstract-leveldown/issues/303)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Reject nullish values ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Make default `_serializeKey` and `_serializeValue` identity functions ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Don't coerce keys to strings to check if they're empty, instead check arrays explicitly ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Make `db` property mandatory and public on iterator and chained batch ([#257](https://github.com/level/abstract-leveldown/issues/257), [#309](https://github.com/level/abstract-leveldown/issues/309)) ([**@vweevers**](https://github.com/vweevers)) ++- Align `AbstractChainedBatch#_clear` with `_put` and `_del` ([#257](https://github.com/level/abstract-leveldown/issues/257)) ([**@vweevers**](https://github.com/vweevers)) ++- Add `AbstractChainedBatch#_write` with options ([#257](https://github.com/level/abstract-leveldown/issues/257)) ([**@vweevers**](https://github.com/vweevers)) ++- Use `level-concat-iterator` instead of `collectEntries` ([#246](https://github.com/level/abstract-leveldown/issues/246)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Document API and test suite ([#251](https://github.com/level/abstract-leveldown/issues/251), [#290](https://github.com/level/abstract-leveldown/issues/290), [#295](https://github.com/level/abstract-leveldown/issues/295), [#296](https://github.com/level/abstract-leveldown/issues/296), [#305](https://github.com/level/abstract-leveldown/issues/305)) ([**@vweevers**](https://github.com/vweevers)) ++- Export test suite as a single function ([#271](https://github.com/level/abstract-leveldown/issues/271), [#293](https://github.com/level/abstract-leveldown/issues/293), [#297](https://github.com/level/abstract-leveldown/issues/297)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use factory function to create `db` instances in test suite ([#258](https://github.com/level/abstract-leveldown/issues/258), [#268](https://github.com/level/abstract-leveldown/issues/268), [#282](https://github.com/level/abstract-leveldown/issues/282)) ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ++- Isolate snapshot tests so that they can be skipped ([#239](https://github.com/level/abstract-leveldown/issues/239), [#274](https://github.com/level/abstract-leveldown/issues/274)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Isolate openAdvanced tests so that they can be skipped ([#271](https://github.com/level/abstract-leveldown/issues/271)) ([**@vweevers**](https://github.com/vweevers)) ++- Rename `abstract/` to `test/` ([#253](https://github.com/level/abstract-leveldown/issues/253)) ([**@vweevers**](https://github.com/vweevers)) ++- Refactor internal test methods to have the same signature `(test, testCommon)` ([#268](https://github.com/level/abstract-leveldown/issues/268), [#275](https://github.com/level/abstract-leveldown/issues/275)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Prefer `exports.*` over `module.exports.*` ([#276](https://github.com/level/abstract-leveldown/issues/276)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Tweak copyright years for less maintenance ([`0b2949a`](https://github.com/level/abstract-leveldown/commit/0b2949a)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Add `iterator#seek()` ([#237](https://github.com/level/abstract-leveldown/issues/237), [#302](https://github.com/level/abstract-leveldown/issues/302), [#307](https://github.com/level/abstract-leveldown/issues/307)) ([**@vweevers**](https://github.com/vweevers), [**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add `nyc` and `coveralls` devDependencies for code coverage ([#253](https://github.com/level/abstract-leveldown/issues/253)) ([**@vweevers**](https://github.com/vweevers)) ++- Add `setUp` and `tearDown` to all sub tests ([#279](https://github.com/level/abstract-leveldown/issues/279), [#289](https://github.com/level/abstract-leveldown/issues/289)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add test for implementations that cannot support snapshots ([#239](https://github.com/level/abstract-leveldown/issues/239)) ([**@vweevers**](https://github.com/vweevers)) ++- Add `hallmark` devDependency for Markdown style and contributors ([#312](https://github.com/level/abstract-leveldown/issues/312)) ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove `location` ([#258](https://github.com/level/abstract-leveldown/issues/258)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove `lastLocation`, `cleanup`, `rimraf` ([#249](https://github.com/level/abstract-leveldown/issues/249)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove IE10 from Sauce Labs test matrix ([#312](https://github.com/level/abstract-leveldown/issues/312)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove node 9 from Travis ([`0b52395`](https://github.com/level/abstract-leveldown/commit/0b52395)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove tests that assumed support of boolean and NaN keys ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove range tests that assumed `null` meant "not defined" ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove sync test from `test/put-test.js` ([#300](https://github.com/level/abstract-leveldown/issues/300)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove empty `errorValues()` test ([#273](https://github.com/level/abstract-leveldown/issues/273)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove default `testCommon` parameter ([#264](https://github.com/level/abstract-leveldown/issues/264), [#271](https://github.com/level/abstract-leveldown/issues/271)) ([**@vweevers**](https://github.com/vweevers)) ++- Remove `contributors` from `package.json` ([`542f350`](https://github.com/level/abstract-leveldown/commit/542f350)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove copyright headers from code ([`a36c04f`](https://github.com/level/abstract-leveldown/commit/a36c04f)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Make sure all `t.throw` tests check error messages correctly ([#286](https://github.com/level/abstract-leveldown/issues/286)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Check options objects properly for `null` ([#257](https://github.com/level/abstract-leveldown/issues/257), [#288](https://github.com/level/abstract-leveldown/issues/288)) ([**@ralphtheninja**](https://github.com/ralphtheninja), [**@vweevers**](https://github.com/vweevers)) ++- Serialize range options same as keys ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++- Allow nullish and empty range options ([#277](https://github.com/level/abstract-leveldown/issues/277)) ([**@vweevers**](https://github.com/vweevers)) ++ ++## [5.0.0] - 2018-05-22 ++ ++### Changed ++ ++- Upgrade `sinon` to `^5.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Tweak README ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Replace `const` with `var` to support IE10 ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add node 10 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add `airtap` for browser tests ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove node 4, 5 and 7 from Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove TypeScript tests ([**@vweevers**](https://github.com/vweevers)) ++- Remove TypeScript typings ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [4.0.3] - 2018-02-21 ++ ++### Changed ++ ++- Upgrade `ts-node` to `^5.0.0` ([**@zixia**](https://github.com/zixia)) ++- Upgrade `standard` to `^11.0.0` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Remove invalid TypeScript from `Batch` ([**@Tapppi**](https://github.com/Tapppi)) ++- Add JSDoc to incorrectly inferred TypeScript types ([**@Tapppi**](https://github.com/Tapppi)) ++ ++## [4.0.2] - 2018-02-09 ++ ++### Fixed ++ ++- Fix `iterator#next` to return `this` ([**@vweevers**](https://github.com/vweevers)) ++ ++## [4.0.1] - 2018-02-09 ++ ++### Added ++ ++- Run test suite in TypeScript in addition to Node.js ([**@vweevers**](https://github.com/vweevers)) ++- Add TypeScript smoke test ([**@vweevers**](https://github.com/vweevers)) ++- Add TypeScript readme section with stability badge ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Remove obsolete parameters from tests ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Update TypeScript typings for v4 ([**@vweevers**](https://github.com/vweevers)) ++- Use ES6 classes in tests to please TypeScript ([**@vweevers**](https://github.com/vweevers)) ++- Define default methods on prototype to please TypeScript ([**@vweevers**](https://github.com/vweevers)) ++ ++**Historical Note** This was released as a patch because it only changed tests ++and TypeScript typings (which are marked experimental and don't follow semver). ++ ++## [4.0.0] - 2018-01-20 ++ ++### Changed ++ ++- Ignore empty range options in `AbstractLevelDOWN#_setupIteratorOptions` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Make `testCommon.js` the default value for `testCommon` parameter ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Use `Buffer.isBuffer()` instead of `AbstractLevelDOWN#isBuffer` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Cleanup iterator tests ([#161](https://github.com/level/abstract-leveldown/issues/161)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Pass test function as a parameter instead of setting local global ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Assert batch type is `'put'` or `'del'` ([**@vweevers**](https://github.com/vweevers)) ++- Assert batch array elements are objects ([**@vweevers**](https://github.com/vweevers)) ++ ++### Added ++ ++- Add `standard` for linting ([#150](https://github.com/level/abstract-leveldown/issues/150)) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Test that callbacks are called asynchronously ([**@vweevers**](https://github.com/vweevers)) ++- Test serialization extensibility ([**@vweevers**](https://github.com/vweevers)) ++- Add [**@vweevers**](https://github.com/vweevers) to contributors ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add upgrade guide in `UPGRADING.md` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add node 9 to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Remove `isLevelDOWN` function and corresponding tests ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove `AbstractLevelDOWN#approximateSize` method and corresponding tests ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove `testBuffer` in `abstract/put-get-del-test.js` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Remove object value test in `abstract/put-test.js` ([**@vweevers**](https://github.com/vweevers)) ++- Remove serialize buffer tests ([**@vweevers**](https://github.com/vweevers)) ++- Remove serialize object tests ([**@vweevers**](https://github.com/vweevers)) ++- Remove `BufferType` parameter in `abstract/put-get-del-test.js`, use `Buffer` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Ensure stores are closed properly (fixes problems on Windows) ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Call back errors on next tick to avoid `zalgo` ([**@vweevers**](https://github.com/vweevers)) ++ ++## [3.0.0] - 2017-11-04 ++ ++### Added ++ ++- Add node version badge ([**@vweevers**](https://github.com/vweevers)) ++ ++### Removed ++ ++- Drop support for `0.12`. Cause for new major version! ([**@vweevers**](https://github.com/vweevers)) ++ ++### Fixed ++ ++- Fix errors in `index.d.ts` ([**@sandersn**](https://github.com/sandersn)) ++ ++## [2.7.2] - 2017-10-11 ++ ++### Changed ++ ++- Update `README` with new style ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.7.1] - 2017-09-30 ++ ++### Changed ++ ++- Refactor typings as ES2015 module ([**@MeirionHughes**](https://github.com/MeirionHughes)) ++ ++## [2.7.0] - 2017-09-12 ++ ++### Added ++ ++- Add `TypeScript` definitions in `index.d.ts` ([**@MeirionHughes**](https://github.com/MeirionHughes)) ++ ++## [2.6.3] - 2017-09-05 ++ ++### Changed ++ ++- Upgrade dependencies ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Convert nullish values to empty strings ([**@bigeasy**](https://github.com/bigeasy)) ++- Use `t.equal(a, b)` instead of `t.ok(a === b)` ([**@bigeasy**](https://github.com/bigeasy)) ++- Relax tests for serializing object in `abstract/chained-batch-test.js` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Add `GreenKeeper` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Test key/value serialization ([**@bigeasy**](https://github.com/bigeasy)) ++- Test `undefined` value serializing to empty string ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Document `.status` property ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.6.2] - 2017-07-30 ++ ++### Changed ++ ++- Upgrade dependencies and float `devDependencies` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update copyright years ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Update node versions on Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Test serialization extensibility ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Fixed ++ ++- Fix put test on object serialization ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [2.6.1] - 2016-09-12 ++ ++### Fixed ++ ++- Fix `null` case in default value serializer (fixes problems in `2.6.0`) ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [2.6.0] - 2016-03-10 ++ ++### Changed ++ ++- Use proto delegation to patch methods on db ([**@deanlandolt**](https://github.com/deanlandolt)) ++- Allow serialization functions to return buffers ([**@deanlandolt**](https://github.com/deanlandolt)) ++ ++### Added ++ ++- Add `collectBatchOps` function to buffer `_put` and `_del` inputs in `abstract/chained-batch-test.js` ([**@deanlandolt**](https://github.com/deanlandolt)) ++ ++### Removed ++ ++- Remove unnecessary initialization hackery in `abstract/chained-batch-test.js` ([**@deanlandolt**](https://github.com/deanlandolt)) ++ ++**Historical Note** This release was a breaking change. See [**@juliangruber**](https://github.com/juliangruber)'s [comment](https://github.com/Level/abstract-leveldown/pull/85#issuecomment-246980978) for more information. ++ ++## [2.5.0] - 2016-05-01 ++ ++### Changed ++ ++- Upgrade dependencies and add more node versions to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Add dependency badge to `README` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add `AbstractLevelDOWN#_serializeKey` ([**@juliangruber**](https://github.com/juliangruber)) ++- Add `AbstractLevelDOWN#_serializeValue` ([**@juliangruber**](https://github.com/juliangruber)) ++- Add `AbstractChainedBatch#_serializeKey` ([**@juliangruber**](https://github.com/juliangruber)) ++- Add `AbstractChainedBatch#_serializeValue` ([**@juliangruber**](https://github.com/juliangruber)) ++- Test `_serialize` with object and buffer ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Removed ++ ++- Remove stringification of keys and values ([**@juliangruber**](https://github.com/juliangruber)) ++- Remove `.toBuffer` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Fixed ++ ++- Update `memdown` url ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- `AbstractLevelDOWN#._checkKey` does not take three parameters ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Only show build status for the master branch ([**@watson**](https://github.com/watson)) ++- Fix minor typos in `README` ([**@timkuijsten**](https://github.com/timkuijsten)) ++ ++## [2.4.1] - 2015-08-29 ++ ++### Fixed ++ ++- Remove use of `const` ([**@nolanlawson**](https://github.com/nolanlawson)) ++ ++## [2.4.0] - 2015-05-19 ++ ++### Added ++ ++- Add `.status` property to `AbstractLevelDOWN` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [2.3.1] - 2015-05-18 ++ ++### Added ++ ++- Link to `level/community` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Removed ++ ++- Extract `Contributors` section from `README` into `level/community` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Document `isLevelDown` function ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.3.0] - 2015-05-18 ++ ++### Changed ++ ++- Use `t.equal(a, b)` instead of `t.ok(a === b)` ([**@juliangruber**](https://github.com/juliangruber)) ++- Export API from `index.js` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Import `isLevelDOWN` function to `is-leveldown.js` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.2.2] - 2015-05-13 ++ ++### Fixed ++ ++- Revert changes to `location` in `2.2.1` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [2.2.1] - 2015-05-12 ++ ++### Fixed ++ ++- Copy paste error gave wrong test description ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- `t.throws()` is different for `tape` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Assert `location` is not an empty string ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.2.0] - 2015-05-10 ++ ++### Added ++ ++- Test `{ sync: true }` option in `abstract/put-test.js` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++## [2.1.4] - 2015-04-28 ++ ++### Fixed ++ ++- Use `t.equal()` with `tape` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.1.3] - 2015-04-28 ++ ++### Changed ++ ++- Change from `tap` to `tape` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.1.2] - 2015-04-27 ++ ++### Changed ++ ++- Convert buffer to string so we can compare ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.1.1] - 2015-04-27 ++ ++### Changed ++ ++- Update logo and copyright ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Added ++ ++- Add [**@ralphtheninja**](https://github.com/ralphtheninja) to contributors ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Add `0.12` and `iojs` to Travis ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++### Fixed ++ ++- Include `.nonErrorValues()` test in `abstract/put-get-del-test.js` ([**@hden**](https://github.com/hden)) ++- `rvagg/node-abstract-leveldown` moved to `level/abstract-leveldown` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++- Fix Travis for `0.8` ([**@ralphtheninja**](https://github.com/ralphtheninja)) ++ ++## [2.1.0] - 2014-11-09 ++ ++### Changed ++ ++- Use `setTimeout` instead of `process.nextTick` ([**@bigeasy**](https://github.com/bigeasy)) ++ ++### Added ++ ++- Add [**@watson**](https://github.com/watson) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Don't fail if no value is returned by `._get` ([**@watson**](https://github.com/watson)) ++- Use `error` test function when testing for errors ([**@watson**](https://github.com/watson)) ++ ++## [2.0.3] - 2014-10-02 ++ ++No change. ++ ++## [2.0.2] - 2014-10-02 ++ ++### Added ++ ++- Test atomic batch operations ([**@calvinmetcalf**](https://github.com/calvinmetcalf)) ++ ++## [2.0.1] - 2014-09-01 ++ ++### Changed ++ ++- Set default values for options to `.open`, `.get`, `.put`, `.del` and `.batch` ([**@watson**](https://github.com/watson)) ++- Update pattern for setting default options for the iterator ([**@watson**](https://github.com/watson)) ++- Allow boolean options to be falsy/truthy ([**@watson**](https://github.com/watson)) ++ ++### Removed ++ ++- Remove default options that are too `LevelDOWN` specific ([**@watson**](https://github.com/watson)) ++ ++## [2.0.0] - 2014-08-26 ++ ++### Changed ++ ++- Switch to allowing writes of empty values, `null`, `undefined`, `''`, `[]` and empty buffer ([**@juliangruber**](https://github.com/juliangruber)) ++- Rename `AbstractLevelDOWN#_checkKeyValue` to `AbstractLevelDOWN#_checkKey` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [1.0.0] - 2014-08-24 ++ ++### Changed ++ ++- Ensure `Boolean` iterator options are `Boolean` ([**@watson**](https://github.com/watson)) ++ ++### Added ++ ++- Test that an error is thrown when location isn't a string ([**@calvinmetcalf**](https://github.com/calvinmetcalf)) ++- Test opening and closing the store ([**@calvinmetcalf**](https://github.com/calvinmetcalf)) ++- Test iterator with `limit` set to `0` ([**@watson**](https://github.com/watson)) ++- Add more tests to `abstract/batch-test.js` ([**@calvinmetcalf**](https://github.com/calvinmetcalf)) ++- Set default values of iterator options ([**@watson**](https://github.com/watson)) ++- Account for batch options that are `null` ([**@calvinmetcalf**](https://github.com/calvinmetcalf)) ++ ++### Removed ++ ++- Remove options.start hackery ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.12.4] - 2014-08-20 ++ ++### Changed ++ ++- Change license to plain MIT ([**@andrewrk**](https://github.com/andrewrk)) ++ ++### Added ++ ++- Test that `simple-iterator` returns buffers ([**@kesla**](https://github.com/kesla)) ++- Test implicit snapshots ([**@kesla**](https://github.com/kesla)) ++ ++## [0.12.3] - 2014-06-27 ++ ++### Changed ++ ++- Upgrade `xtend` dependency ([**@andrewrk**](https://github.com/andrewrk)) ++ ++## [0.12.2] - 2014-04-26 ++ ++### Changed ++ ++- Have `isTypedArray` check for existence of `ArrayBuffer` and `Uint8Array` constructors before usage ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.12.1] - 2014-04-26 ++ ++### Changed ++ ++- Set default `BufferType` in `abstract/put-get-del-test.js` to `Buffer` instead of `ArrayBuffer` ([**@maxogden**](https://github.com/maxogden)) ++ ++## [0.12.0] - 2014-03-12 ++ ++### Changed ++ ++- Revert to pure `Buffer` and remove usage of `Uint16Array` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.11.4] - 2014-03-11 ++ ++### Removed ++ ++- Remove duplicate call to `t.end()` ([**@maxogden**](https://github.com/maxogden)) ++ ++## [0.11.3] - 2014-01-26 ++ ++### Changed ++ ++- Loosen the buffer type check ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.11.2] - 2013-12-05 ++ ++### Added ++ ++- Add npm badges ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix iterator tests in `test.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.11.1] - 2013-11-15 ++ ++### Changed ++ ++- Adjust `abstract/approximate-size-test.js` to account for snappy compression ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.11.0] - 2013-10-14 ++ ++### Added ++ ++- Normalize `iterator()` options with `AbstractLevelDOWN#_setupIteratorOptions` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.10.2] - 2013-09-06 ++ ++### Changed ++ ++- Refactor duplicated versions of `isTypedArray` into `abstract/util.js` ([**@rvagg**](https://github.com/rvagg)) ++- Refactor duplicated versions of `'NotFound'` checks into `abstract/util.js`, fixed too-strict version in `get-test.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.10.1] - 2013-08-29 ++ ++### Changed ++ ++- Relax check for `Not Found` error message to be case insensitive in `get-test.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++### Added ++ ++- Add [**@substack**](https://github.com/substack) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.10.0] - 2013-08-19 ++ ++### Added ++ ++- Test `gt`, `gte`, `lt` and `lte` ranges ([**@dominictarr**](https://github.com/dominictarr)) ++ ++## [0.9.0] - 2013-08-11 ++ ++### Changed ++ ++- Make `AbstractChainedBatch` extensible ([**@kesla**](https://github.com/kesla)) ++- Export `AbstractChainedBatch` from `abstract-leveldown.js` ([**@kesla**](https://github.com/kesla)) ++ ++### Added ++ ++- Test simultaneous get's ([**@kesla**](https://github.com/kesla)) ++- Test `AbstractChainedBatch` extensibility ([**@kesla**](https://github.com/kesla)) ++ ++### Fixed ++ ++- Fix broken test assertion in `abstract/get-test.js` ([**@rvagg**](https://github.com/rvagg)) ++- Fix tests that weren't running properly ([**@kesla**](https://github.com/kesla)) ++ ++## [0.8.2] - 2013-08-02 ++ ++No changes. Merely published changes made in `0.8.1`. ++ ++## [0.8.1] - 2013-08-02 ++ ++### Changed ++ ++- Remove use of `const` in `testCommon.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++**Historical Note** The version in `package.json` was changed from `0.7.4` to `0.8.1`. The `0.8.1` tag exists but this version was never published to npm. ++ ++## [0.8.0] - 2013-08-02 ++ ++### Changed ++ ++- Use `process.browser` check instead of `process.title == 'browser'` ([**@rvagg**](https://github.com/rvagg)) ++ ++### Added ++ ++- Add `BufferType` parameter to `abstract/put-get-del-test.js` for `bops` support ([**@rvagg**](https://github.com/rvagg)) ++- Add `isTypedArray` function which checks `ArrayBuffer` or `Uint8Array` for `bops` support ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix `cleanup` function not calling back when browserified ([**@rvagg**](https://github.com/rvagg)) ++ ++**Historical Note** It seems the version in `package.json` was never changed to `0.8.0` in the git history, even though the `0.8.0` tag exists. Most likely `package.json` was modified locally during `npm publish` but was never committed. ++ ++## [0.7.4] - 2013-08-02 ++ ++### Fixed ++ ++- Fix problems related to `browserify` and `rimraf` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.7.3] - 2013-07-26 ++ ++### Added ++ ++- Add [**@pgte**](https://github.com/pgte) to contributors ([**@rvagg**](https://github.com/rvagg)) ++- Test iterator with `limit` set to `-1` ([**@kesla**](https://github.com/kesla)) ++ ++## [0.7.2] - 2013-07-08 ++ ++### Changed ++ ++- Freeze chained batch state after `.write()` has been called ([**@rvagg**](https://github.com/rvagg)) ++- Make `NotFound` error case insensitive ([**@rvagg**](https://github.com/rvagg)) ++- Use `self` rather than binding functions to `this` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Added ++ ++- Add `AbstractChainedBatch#_checkWritten` ([**@rvagg**](https://github.com/rvagg)) ++- Test delete on non-existent key ([**@rvagg**](https://github.com/rvagg)) ++- Test iterator with `start` after database `end` ([**@juliangruber**](https://github.com/juliangruber)) ++ ++### Fixed ++ ++- Don't coerce values to strings in browser ([**@maxogden**](https://github.com/maxogden)) ++- Make tests work in node and browser ([**@maxogden**](https://github.com/maxogden)) ++ ++## [0.7.1] - 2013-05-15 ++ ++### Changed ++ ++- Adjust tests to be browserable ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.7.0] - 2013-05-14 ++ ++### Added ++ ++- Add `AbstractChainedBatch#clear` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.6.1] - 2013-05-14 ++ ++### Changed ++ ++- Make `AbstractIterator` call back with an error instead of throwing on nexting and ending ([**@mcollina**](https://github.com/mcollina)) ++ ++## [0.6.0] - 2013-05-14 ++ ++### Changed ++ ++- Split `t.deepEqual()` into multiple `t.equal()` in `abstract/iterator-test.js` ([**@rvagg**](https://github.com/rvagg)) ++- Make `AbstractIterator` call back with an error instead of throwing on nexting and ending ([**@mcollina**](https://github.com/mcollina)) ++ ++## [0.5.0] - 2013-05-14 ++ ++### Changed ++ ++- Make `iterator.end(cb)` and `iterator.next(cb)` call back with an error instead of throwing ([**@mcollina**](https://github.com/mcollina)) ++ ++## [0.4.0] - 2013-05-14 ++ ++### Changed ++ ++- Move `AbstractIterator` from `abstract-leveldown.js` to `abstract-iterator.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++### Added ++ ++- Add `AbstractChainedBatch` ([**@rvagg**](https://github.com/rvagg)) ++- Add `AbstractLevelDOWN#_chainedBatch` ([**@rvagg**](https://github.com/rvagg)) ++- Add `abstract/batch-test.js` and `abstract/chained-batch-test.js` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.4.0-1] - 2013-05-14 ++ ++### Added ++ ++- Add [**@No9**](https://github.com/No9) and [**@mcollina**](https://github.com/mcollina) to contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.3.0] - 2013-05-04 ++ ++### Changed ++ ++- Use `this._checkKeyValue()` instead of local function ([**@rvagg**](https://github.com/rvagg)) ++- Use `this._isBuffer()` instead of `Buffer.isBuffer()` ([**@rvagg**](https://github.com/rvagg)) ++ ++### Added ++ ++- Restore test for opening the database without options ([**@rvagg**](https://github.com/rvagg)) ++- Add `AbstractLevelDOWN#_isBuffer` so it can be overridden ([**@rvagg**](https://github.com/rvagg)) ++- Add `AbstractLevelDOWN#_checkKeyValue` so it can be overridden ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.2.3] - 2013-05-04 ++ ++### Removed ++ ++- Remove test for opening the database without options ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.2.2] - 2013-05-04 ++ ++### Changed ++ ++- Split `.open()` tests into `.open()` and `.openAdvanced()` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.2.1] - 2013-05-04 ++ ++### Changed ++ ++- Convert values to `string` in `abstract/put-get-del-test.js` if `Buffer` is `undefined` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.2.0] - 2013-05-04 ++ ++### Changed ++ ++- Convert values to `string` in `abstract/get-test.js` if `Buffer` is `undefined` ([**@rvagg**](https://github.com/rvagg)) ++- Don't stringify keys and values in `abstract/iterator-test.js` ([**@maxogden**](https://github.com/maxogden)) ++ ++### Added ++ ++- Add `process.browser` check for `start` and `end` keys in browser ([**@maxogden**](https://github.com/maxogden)) ++- Add `levelup` contributors ([**@rvagg**](https://github.com/rvagg)) ++ ++### Fixed ++ ++- Fix `tape` compatibility issues ([**@maxogden**](https://github.com/maxogden)) ++ ++## [0.1.0] - 2013-04-23 ++ ++### Added ++ ++- Import abstract tests from `leveldown` ([**@maxogden**](https://github.com/maxogden)) ++ ++### Fixed ++ ++- Clarify `README` ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.0.2] - 2013-03-18 ++ ++### Changed ++ ++- Export `checkKeyValue` ([**@rvagg**](https://github.com/rvagg)) ++ ++### Added ++ ++- Add node 0.10 to Travis ([**@rvagg**](https://github.com/rvagg)) ++- Add `Buffer.isBuffer()` checks to keys and values ([**@rvagg**](https://github.com/rvagg)) ++ ++## [0.0.1] - 2013-03-18 ++ ++### Added ++ ++- Add `checkKeyValue` function for more complete error checking ([**@rvagg**](https://github.com/rvagg)) ++ ++## 0.0.0 - 2013-03-15 ++ ++First release. :seedling: ++ ++[6.2.3]: https://github.com/Level/abstract-leveldown/compare/v6.2.2...v6.2.3 ++ ++[6.2.2]: https://github.com/Level/abstract-leveldown/compare/v6.2.1...v6.2.2 ++ ++[6.2.1]: https://github.com/Level/abstract-leveldown/compare/v6.2.0...v6.2.1 ++ ++[6.2.0]: https://github.com/Level/abstract-leveldown/compare/v6.1.1...v6.2.0 ++ ++[6.1.1]: https://github.com/Level/abstract-leveldown/compare/v6.1.0...v6.1.1 ++ ++[6.1.0]: https://github.com/Level/abstract-leveldown/compare/v6.0.3...v6.1.0 ++ ++[6.0.3]: https://github.com/Level/abstract-leveldown/compare/v6.0.2...v6.0.3 ++ ++[6.0.2]: https://github.com/Level/abstract-leveldown/compare/v6.0.1...v6.0.2 ++ ++[6.0.1]: https://github.com/Level/abstract-leveldown/compare/v6.0.0...v6.0.1 ++ ++[6.0.0]: https://github.com/Level/abstract-leveldown/compare/v5.0.0...v6.0.0 ++ ++[5.0.0]: https://github.com/Level/abstract-leveldown/compare/v4.0.3...v5.0.0 ++ ++[4.0.3]: https://github.com/Level/abstract-leveldown/compare/v4.0.2...v4.0.3 ++ ++[4.0.2]: https://github.com/Level/abstract-leveldown/compare/v4.0.1...v4.0.2 ++ ++[4.0.1]: https://github.com/Level/abstract-leveldown/compare/v4.0.0...v4.0.1 ++ ++[4.0.0]: https://github.com/Level/abstract-leveldown/compare/v3.0.0...v4.0.0 ++ ++[3.0.0]: https://github.com/Level/abstract-leveldown/compare/v2.7.2...v3.0.0 ++ ++[2.7.2]: https://github.com/Level/abstract-leveldown/compare/v2.7.1...v2.7.2 ++ ++[2.7.1]: https://github.com/Level/abstract-leveldown/compare/v2.7.0...v2.7.1 ++ ++[2.7.0]: https://github.com/Level/abstract-leveldown/compare/v2.6.3...v2.7.0 ++ ++[2.6.3]: https://github.com/Level/abstract-leveldown/compare/v2.6.2...v2.6.3 ++ ++[2.6.2]: https://github.com/Level/abstract-leveldown/compare/v2.6.1...v2.6.2 ++ ++[2.6.1]: https://github.com/Level/abstract-leveldown/compare/v2.6.0...v2.6.1 ++ ++[2.6.0]: https://github.com/Level/abstract-leveldown/compare/v2.5.0...v2.6.0 ++ ++[2.5.0]: https://github.com/Level/abstract-leveldown/compare/v2.4.1...v2.5.0 ++ ++[2.4.1]: https://github.com/Level/abstract-leveldown/compare/v2.4.0...v2.4.1 ++ ++[2.4.0]: https://github.com/Level/abstract-leveldown/compare/v2.3.1...v2.4.0 ++ ++[2.3.1]: https://github.com/Level/abstract-leveldown/compare/v2.3.0...v2.3.1 ++ ++[2.3.0]: https://github.com/Level/abstract-leveldown/compare/v2.2.2...v2.3.0 ++ ++[2.2.2]: https://github.com/Level/abstract-leveldown/compare/v2.2.1...v2.2.2 ++ ++[2.2.1]: https://github.com/Level/abstract-leveldown/compare/v2.2.0...v2.2.1 ++ ++[2.2.0]: https://github.com/Level/abstract-leveldown/compare/v2.1.4...v2.2.0 ++ ++[2.1.4]: https://github.com/Level/abstract-leveldown/compare/v2.1.3...v2.1.4 ++ ++[2.1.3]: https://github.com/Level/abstract-leveldown/compare/v2.1.2...v2.1.3 ++ ++[2.1.2]: https://github.com/Level/abstract-leveldown/compare/v2.1.1...v2.1.2 ++ ++[2.1.1]: https://github.com/Level/abstract-leveldown/compare/v2.1.0...v2.1.1 ++ ++[2.1.0]: https://github.com/Level/abstract-leveldown/compare/v2.0.3...v2.1.0 ++ ++[2.0.3]: https://github.com/Level/abstract-leveldown/compare/v2.0.2...v2.0.3 ++ ++[2.0.2]: https://github.com/Level/abstract-leveldown/compare/v2.0.1...v2.0.2 ++ ++[2.0.1]: https://github.com/Level/abstract-leveldown/compare/v2.0.0...v2.0.1 ++ ++[2.0.0]: https://github.com/Level/abstract-leveldown/compare/v1.0.0...v2.0.0 ++ ++[1.0.0]: https://github.com/Level/abstract-leveldown/compare/v0.12.4...v1.0.0 ++ ++[0.12.4]: https://github.com/Level/abstract-leveldown/compare/v0.12.3...v0.12.4 ++ ++[0.12.3]: https://github.com/Level/abstract-leveldown/compare/v0.12.2...v0.12.3 ++ ++[0.12.2]: https://github.com/Level/abstract-leveldown/compare/v0.12.1...v0.12.2 ++ ++[0.12.1]: https://github.com/Level/abstract-leveldown/compare/v0.12.0...v0.12.1 ++ ++[0.12.0]: https://github.com/Level/abstract-leveldown/compare/v0.11.4...v0.12.0 ++ ++[0.11.4]: https://github.com/Level/abstract-leveldown/compare/v0.11.3...v0.11.4 ++ ++[0.11.3]: https://github.com/Level/abstract-leveldown/compare/v0.11.2...v0.11.3 ++ ++[0.11.2]: https://github.com/Level/abstract-leveldown/compare/0.11.1...v0.11.2 ++ ++[0.11.1]: https://github.com/Level/abstract-leveldown/compare/0.11.0...0.11.1 ++ ++[0.11.0]: https://github.com/Level/abstract-leveldown/compare/0.10.2...0.11.0 ++ ++[0.10.2]: https://github.com/Level/abstract-leveldown/compare/0.10.1...0.10.2 ++ ++[0.10.1]: https://github.com/Level/abstract-leveldown/compare/0.10.0...0.10.1 ++ ++[0.10.0]: https://github.com/Level/abstract-leveldown/compare/0.9.0...0.10.0 ++ ++[0.9.0]: https://github.com/Level/abstract-leveldown/compare/0.8.2...0.9.0 ++ ++[0.8.2]: https://github.com/Level/abstract-leveldown/compare/0.8.1...0.8.2 ++ ++[0.8.1]: https://github.com/Level/abstract-leveldown/compare/0.8.0...0.8.1 ++ ++[0.8.0]: https://github.com/Level/abstract-leveldown/compare/0.7.4...0.8.0 ++ ++[0.7.4]: https://github.com/Level/abstract-leveldown/compare/0.7.3...0.7.4 ++ ++[0.7.3]: https://github.com/Level/abstract-leveldown/compare/0.7.2...0.7.3 ++ ++[0.7.2]: https://github.com/Level/abstract-leveldown/compare/0.7.1...0.7.2 ++ ++[0.7.1]: https://github.com/Level/abstract-leveldown/compare/0.7.0...0.7.1 ++ ++[0.7.0]: https://github.com/Level/abstract-leveldown/compare/0.6.1...0.7.0 ++ ++[0.6.1]: https://github.com/Level/abstract-leveldown/compare/0.6.0...0.6.1 ++ ++[0.6.0]: https://github.com/Level/abstract-leveldown/compare/0.5.0...0.6.0 ++ ++[0.5.0]: https://github.com/Level/abstract-leveldown/compare/0.4.0...0.5.0 ++ ++[0.4.0]: https://github.com/Level/abstract-leveldown/compare/0.4.0-1...0.4.0 ++ ++[0.4.0-1]: https://github.com/Level/abstract-leveldown/compare/0.3.0...0.4.0-1 ++ ++[0.3.0]: https://github.com/Level/abstract-leveldown/compare/0.2.3...0.3.0 ++ ++[0.2.3]: https://github.com/Level/abstract-leveldown/compare/0.2.2...0.2.3 ++ ++[0.2.2]: https://github.com/Level/abstract-leveldown/compare/0.2.1...0.2.2 ++ ++[0.2.1]: https://github.com/Level/abstract-leveldown/compare/0.2.0...0.2.1 ++ ++[0.2.0]: https://github.com/Level/abstract-leveldown/compare/0.1.0...0.2.0 ++ ++[0.1.0]: https://github.com/Level/abstract-leveldown/compare/0.0.2...0.1.0 ++ ++[0.0.2]: https://github.com/Level/abstract-leveldown/compare/0.0.1...0.0.2 ++ ++[0.0.1]: https://github.com/Level/abstract-leveldown/compare/0.0.0...0.0.1 +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CONTRIBUTORS.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CONTRIBUTORS.md +new file mode 100644 +index 0000000..a7b60a7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CONTRIBUTORS.md +@@ -0,0 +1,27 @@ ++# Contributors ++ ++| Name | GitHub | Social | ++| :------------------------- | :----------------------------------------------------- | :----------------------------------------------------------------------- | ++| **Rod Vagg** | [**@rvagg**](https://github.com/rvagg) | [**@rvagg@twitter**](https://twitter.com/rvagg) | ++| **Vincent Weevers** | [**@vweevers**](https://github.com/vweevers) | [**@vweevers@twitter**](https://twitter.com/vweevers) | ++| **Lars-Magnus Skog** | [**@ralphtheninja**](https://github.com/ralphtheninja) | [**@ralph@social.weho.st**](https://social.weho.st/@ralph) | ++| **Julian Gruber** | [**@juliangruber**](https://github.com/juliangruber) | [**@juliangruber@twitter**](https://twitter.com/juliangruber) | ++| **David Björklund** | [**@kesla**](https://github.com/kesla) | [**@david_bjorklund@twitter**](https://twitter.com/david_bjorklund) | ++| **Max Ogden** | [**@maxogden**](https://github.com/maxogden) | [**@maxogden@twitter**](https://twitter.com/maxogden) | ++| **Thomas Watson Steen** | | | ++| **Alan Gutierrez** | [**@bigeasy**](https://github.com/bigeasy) | [**@bigeasy@twitter**](https://twitter.com/bigeasy) | ++| **Dean Landolt** | [**@deanlandolt**](https://github.com/deanlandolt) | | ++| **Calvin Metcalf** | [**@calvinmetcalf**](https://github.com/calvinmetcalf) | | ++| **Meirion Hughes** | [**@MeirionHughes**](https://github.com/MeirionHughes) | | ++| **Matteo Collina** | [**@mcollina**](https://github.com/mcollina) | [**@matteocollina@twitter**](https://twitter.com/matteocollina) | ++| **Andrew Kelley** | [**@andrewrk**](https://github.com/andrewrk) | | ++| **Tapani Moilanen** | [**@Tapppi**](https://github.com/Tapppi) | | ++| **Dominic Tarr** | [**@dominictarr**](https://github.com/dominictarr) | [**@dominictarr@twitter**](https://twitter.com/dominictarr) | ++| **Hao-kang Den** | | | ++| **Hugo Dias** | | | ++| **Jake Verbaten** | [**@Raynos**](https://github.com/Raynos) | [**@raynos@twitter**](https://twitter.com/raynos) | ++| **Kyle Robinson Young** | [**@shama**](https://github.com/shama) | [**@shamakry@twitter**](https://twitter.com/shamakry) | ++| **Nathan Shively-Sanders** | [**@sandersn**](https://github.com/sandersn) | | ++| **Nolan Lawson** | [**@nolanlawson**](https://github.com/nolanlawson) | [**@nolan@toot.cafe**](https://toot.cafe/@nolan) | ++| **Tim Kuijsten** | [**@timkuijsten**](https://github.com/timkuijsten) | [**@timkuijsten@mastodon.social**](https://mastodon.social/@timkuijsten) | ++| **Tim Oxley** | [**@timoxley**](https://github.com/timoxley) | [**@secoif@twitter**](https://twitter.com/secoif) | +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/LICENSE.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/LICENSE.md +new file mode 100644 +index 0000000..1e78cf8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/LICENSE.md +@@ -0,0 +1,21 @@ ++# The MIT License (MIT) ++ ++**Copyright © 2013-present Rod Vagg and [Contributors](CONTRIBUTORS.md).** ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in all ++copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++SOFTWARE. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/README.md +new file mode 100644 +index 0000000..1955327 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/README.md +@@ -0,0 +1,629 @@ ++# abstract-leveldown ++ ++> An abstract prototype matching the [`leveldown`][leveldown] API. Useful for extending [`levelup`](https://github.com/Level/levelup) functionality by providing a replacement to `leveldown`. ++ ++[![level badge][level-badge]](https://github.com/Level/awesome) ++[![npm](https://img.shields.io/npm/v/abstract-leveldown.svg?label=&logo=npm)](https://www.npmjs.com/package/abstract-leveldown) ++[![Node version](https://img.shields.io/node/v/abstract-leveldown.svg)](https://www.npmjs.com/package/abstract-leveldown) ++[![Travis](https://img.shields.io/travis/com/Level/abstract-leveldown.svg?logo=travis&label=)](https://travis-ci.com/Level/abstract-leveldown) ++[![Coverage Status](https://coveralls.io/repos/github/Level/abstract-leveldown/badge.svg)](https://coveralls.io/github/Level/abstract-leveldown) ++[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) ++[![npm](https://img.shields.io/npm/dm/abstract-leveldown.svg?label=dl)](https://www.npmjs.com/package/abstract-leveldown) ++[![Backers on Open Collective](https://opencollective.com/level/backers/badge.svg?color=orange)](#backers) ++[![Sponsors on Open Collective](https://opencollective.com/level/sponsors/badge.svg?color=orange)](#sponsors) ++ ++## Table of Contents ++ ++
Click to expand ++ ++- [Background](#background) ++- [Example](#example) ++- [Browser Support](#browser-support) ++- [Public API For Consumers](#public-api-for-consumers) ++- [Private API For Implementors](#private-api-for-implementors) ++- [Test Suite](#test-suite) ++- [Spread The Word](#spread-the-word) ++- [Install](#install) ++- [Contributing](#contributing) ++- [Big Thanks](#big-thanks) ++- [Donate](#donate) ++- [License](#license) ++ ++
++ ++## Background ++ ++This module provides a simple base prototype for a key-value store. It has a public API for consumers and a private API for implementors. To implement a `abstract-leveldown` compliant store, extend its prototype and override the private underscore versions of the methods. For example, to implement `put()`, override `_put()` on your prototype. ++ ++Where possible, the default private methods have sensible _noop_ defaults that essentially do nothing. For example, `_open(callback)` will invoke `callback` on a next tick. Other methods like `_clear(..)` have functional defaults. Each method listed below documents whether implementing it is mandatory. ++ ++The private methods are always provided with consistent arguments, regardless of what is passed in through the public API. All public methods provide argument checking: if a consumer calls `open()` without a callback argument they'll get an `Error('open() requires a callback argument')`. ++ ++Where optional arguments are involved, private methods receive sensible defaults: a `get(key, callback)` call translates to `_get(key, options, callback)` where the `options` argument is an empty object. These arguments are documented below. ++ ++**If you are upgrading:** please see [UPGRADING.md](UPGRADING.md). ++ ++## Example ++ ++Let's implement a simplistic in-memory [`leveldown`][leveldown] replacement: ++ ++```js ++var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN ++var util = require('util') ++ ++// Constructor ++function FakeLevelDOWN () { ++ AbstractLevelDOWN.call(this) ++} ++ ++// Our new prototype inherits from AbstractLevelDOWN ++util.inherits(FakeLevelDOWN, AbstractLevelDOWN) ++ ++FakeLevelDOWN.prototype._open = function (options, callback) { ++ // Initialize a memory storage object ++ this._store = {} ++ ++ // Use nextTick to be a nice async citizen ++ process.nextTick(callback) ++} ++ ++FakeLevelDOWN.prototype._serializeKey = function (key) { ++ // As an example, prefix all input keys with an exclamation mark. ++ // Below methods will receive serialized keys in their arguments. ++ return '!' + key ++} ++ ++FakeLevelDOWN.prototype._put = function (key, value, options, callback) { ++ this._store[key] = value ++ process.nextTick(callback) ++} ++ ++FakeLevelDOWN.prototype._get = function (key, options, callback) { ++ var value = this._store[key] ++ ++ if (value === undefined) { ++ // 'NotFound' error, consistent with LevelDOWN API ++ return process.nextTick(callback, new Error('NotFound')) ++ } ++ ++ process.nextTick(callback, null, value) ++} ++ ++FakeLevelDOWN.prototype._del = function (key, options, callback) { ++ delete this._store[key] ++ process.nextTick(callback) ++} ++``` ++ ++Now we can use our implementation with `levelup`: ++ ++```js ++var levelup = require('levelup') ++ ++var db = levelup(new FakeLevelDOWN()) ++ ++db.put('foo', 'bar', function (err) { ++ if (err) throw err ++ ++ db.get('foo', function (err, value) { ++ if (err) throw err ++ ++ console.log(value) // 'bar' ++ }) ++}) ++``` ++ ++See [`memdown`](https://github.com/Level/memdown/) if you are looking for a complete in-memory replacement for `leveldown`. ++ ++## Browser Support ++ ++[![Sauce Test Status](https://saucelabs.com/browser-matrix/abstract-leveldown.svg)](https://saucelabs.com/u/abstract-leveldown) ++ ++## Public API For Consumers ++ ++### `db = constructor(..)` ++ ++Constructors typically take a `location` argument pointing to a location on disk where the data will be stored. Since not all implementations are disk-based and some are non-persistent, implementors are free to take zero or more arguments in their constructor. ++ ++### `db.status` ++ ++A read-only property. An `abstract-leveldown` compliant store can be in one of the following states: ++ ++- `'new'` - newly created, not opened or closed ++- `'opening'` - waiting for the store to be opened ++- `'open'` - successfully opened the store, available for use ++- `'closing'` - waiting for the store to be closed ++- `'closed'` - store has been successfully closed, should not be used. ++ ++### `db.supports` ++ ++A read-only [manifest](https://github.com/Level/supports). Might be used like so: ++ ++```js ++if (!db.supports.permanence) { ++ throw new Error('Persistent storage is required') ++} ++ ++if (db.supports.bufferKeys && db.supports.promises) { ++ await db.put(Buffer.from('key'), 'value') ++} ++``` ++ ++### `db.open([options, ]callback)` ++ ++Open the store. The `callback` function will be called with no arguments when the store has been successfully opened, or with a single error argument if the open operation failed for any reason. ++ ++The optional `options` argument may contain: ++ ++- `createIfMissing` _(boolean, default: `true`)_: If `true` and the store doesn't exist it will be created. If `false` and the store doesn't exist, `callback` will receive an error. ++- `errorIfExists` _(boolean, default: `false`)_: If `true` and the store exists, `callback` will receive an error. ++ ++Not all implementations support the above options. ++ ++### `db.close(callback)` ++ ++Close the store. The `callback` function will be called with no arguments if the operation is successful or with a single `error` argument if closing failed for any reason. ++ ++### `db.get(key[, options], callback)` ++ ++Get a value from the store by `key`. The optional `options` object may contain: ++ ++- `asBuffer` _(boolean, default: `true`)_: Whether to return the `value` as a Buffer. If `false`, the returned type depends on the implementation. ++ ++The `callback` function will be called with an `Error` if the operation failed for any reason. If successful the first argument will be `null` and the second argument will be the value. ++ ++### `db.put(key, value[, options], callback)` ++ ++Store a new entry or overwrite an existing entry. There are no `options` by default but implementations may add theirs. The `callback` function will be called with no arguments if the operation is successful or with an `Error` if putting failed for any reason. ++ ++### `db.del(key[, options], callback)` ++ ++Delete an entry. There are no `options` by default but implementations may add theirs. The `callback` function will be called with no arguments if the operation is successful or with an `Error` if deletion failed for any reason. ++ ++### `db.batch(operations[, options], callback)` ++ ++Perform multiple _put_ and/or _del_ operations in bulk. The `operations` argument must be an `Array` containing a list of operations to be executed sequentially, although as a whole they are performed as an atomic operation. ++ ++Each operation is contained in an object having the following properties: `type`, `key`, `value`, where the `type` is either `'put'` or `'del'`. In the case of `'del'` the `value` property is ignored. ++ ++There are no `options` by default but implementations may add theirs. The `callback` function will be called with no arguments if the batch is successful or with an `Error` if the batch failed for any reason. ++ ++### `db.batch()` ++ ++Returns a [`chainedBatch`](#chainedbatch). ++ ++### `db.iterator([options])` ++ ++Returns an [`iterator`](#iterator). Accepts the following range options: ++ ++- `gt` (greater than), `gte` (greater than or equal) define the lower bound of the range to be iterated. Only entries where the key is greater than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries iterated will be the same. ++- `lt` (less than), `lte` (less than or equal) define the higher bound of the range to be iterated. Only entries where the key is less than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries iterated will be the same. ++- `reverse` _(boolean, default: `false`)_: iterate entries in reverse order. Beware that a reverse seek can be slower than a forward seek. ++- `limit` _(number, default: `-1`)_: limit the number of entries collected by this iterator. This number represents a _maximum_ number of entries and may not be reached if you get to the end of the range first. A value of `-1` means there is no limit. When `reverse=true` the entries with the highest keys will be returned instead of the lowest keys. ++ ++Legacy options: ++ ++- `start`: instead use `gte` ++- `end`: instead use `lte`. ++ ++**Note** Zero-length strings, buffers and arrays as well as `null` and `undefined` are invalid as keys, yet valid as range options. These types are significant in encodings like [`bytewise`](https://github.com/deanlandolt/bytewise) and [`charwise`](https://github.com/dominictarr/charwise) as well as some underlying stores like IndexedDB. Consumers of an implementation should assume that `{ gt: undefined }` is _not_ the same as `{}`. An implementation can choose to: ++ ++- [_Serialize_](#db_serializekeykey) or [_encode_][encoding-down] these types to make them meaningful ++- Have no defined behavior (moving the concern to a higher level) ++- Delegate to an underlying store (moving the concern to a lower level). ++ ++If you are an implementor, a final note: the [abstract test suite](#test-suite) does not test these types. Whether they are supported or how they sort is up to you; add custom tests accordingly. ++ ++In addition to range options, `iterator()` takes the following options: ++ ++- `keys` _(boolean, default: `true`)_: whether to return the key of each entry. If set to `false`, calls to `iterator.next(callback)` will yield keys with a value of `undefined`. ++- `values` _(boolean, default: `true`)_: whether to return the value of each entry. If set to `false`, calls to `iterator.next(callback)` will yield values with a value of `undefined`. ++- `keyAsBuffer` _(boolean, default: `true`)_: Whether to return the key of each entry as a Buffer. If `false`, the returned type depends on the implementation. ++- `valueAsBuffer` _(boolean, default: `true`)_: Whether to return the value of each entry as a Buffer. ++ ++Lastly, an implementation is free to add its own options. ++ ++### `db.clear([options, ]callback)` ++ ++**This method is experimental. Not all implementations support it yet.** ++ ++Delete all entries or a range. Not guaranteed to be atomic. Accepts the following range options (with the same rules as on iterators): ++ ++- `gt` (greater than), `gte` (greater than or equal) define the lower bound of the range to be deleted. Only entries where the key is greater than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries deleted will be the same. ++- `lt` (less than), `lte` (less than or equal) define the higher bound of the range to be deleted. Only entries where the key is less than (or equal to) this option will be included in the range. When `reverse=true` the order will be reversed, but the entries deleted will be the same. ++- `reverse` _(boolean, default: `false`)_: delete entries in reverse order. Only effective in combination with `limit`, to remove the last N records. ++- `limit` _(number, default: `-1`)_: limit the number of entries to be deleted. This number represents a _maximum_ number of entries and may not be reached if you get to the end of the range first. A value of `-1` means there is no limit. When `reverse=true` the entries with the highest keys will be deleted instead of the lowest keys. ++ ++If no options are provided, all entries will be deleted. The `callback` function will be called with no arguments if the operation was successful or with an `Error` if it failed for any reason. ++ ++### `chainedBatch` ++ ++#### `chainedBatch.put(key, value)` ++ ++Queue a `put` operation on this batch. This may throw if `key` or `value` is invalid. ++ ++#### `chainedBatch.del(key)` ++ ++Queue a `del` operation on this batch. This may throw if `key` is invalid. ++ ++#### `chainedBatch.clear()` ++ ++Clear all queued operations on this batch. ++ ++#### `chainedBatch.write([options, ]callback)` ++ ++Commit the queued operations for this batch. All operations will be written atomically, that is, they will either all succeed or fail with no partial commits. ++ ++There are no `options` by default but implementations may add theirs. The `callback` function will be called with no arguments if the batch is successful or with an `Error` if the batch failed for any reason. ++ ++After `write` has been called, no further operations are allowed. ++ ++#### `chainedBatch.db` ++ ++A reference to the `db` that created this chained batch. ++ ++### `iterator` ++ ++An iterator allows you to _iterate_ the entire store or a range. It operates on a snapshot of the store, created at the time `db.iterator()` was called. This means reads on the iterator are unaffected by simultaneous writes. Most but not all implementations can offer this guarantee. ++ ++An iterator keeps track of when a `next()` is in progress and when an `end()` has been called so it doesn't allow concurrent `next()` calls, it does allow `end()` while a `next()` is in progress and it doesn't allow either `next()` or `end()` after `end()` has been called. ++ ++#### `iterator.next(callback)` ++ ++Advance the iterator and yield the entry at that key. If an error occurs, the `callback` function will be called with an `Error`. Otherwise, the `callback` receives `null`, a `key` and a `value`. The type of `key` and `value` depends on the options passed to `db.iterator()`. ++ ++If the iterator has reached its end, both `key` and `value` will be `undefined`. This happens in the following situations: ++ ++- The end of the store has been reached ++- The end of the range has been reached ++- The last `iterator.seek()` was out of range. ++ ++**Note:** Don't forget to call `iterator.end()`, even if you received an error. ++ ++#### `iterator.seek(target)` ++ ++Seek the iterator to a given key or the closest key. Subsequent calls to `iterator.next()` will yield entries with keys equal to or larger than `target`, or equal to or smaller than `target` if the `reverse` option passed to `db.iterator()` was true. ++ ++If range options like `gt` were passed to `db.iterator()` and `target` does not fall within that range, the iterator will reach its end. ++ ++**Note:** At the time of writing, [`leveldown`][leveldown] is the only known implementation to support `seek()`. In other implementations, it is a noop. ++ ++#### `iterator.end(callback)` ++ ++End iteration and free up underlying resources. The `callback` function will be called with no arguments on success or with an `Error` if ending failed for any reason. ++ ++#### `iterator.db` ++ ++A reference to the `db` that created this iterator. ++ ++### Type Support ++ ++The following applies to any method above that takes a `key` argument or option: all implementations _must_ support a `key` of type String and _should_ support a `key` of type Buffer. A `key` may not be `null`, `undefined`, a zero-length Buffer, zero-length string or zero-length array. ++ ++The following applies to any method above that takes a `value` argument or option: all implementations _must_ support a `value` of type String or Buffer. A `value` may not be `null` or `undefined` due to preexisting significance in streams and iterators. ++ ++Support of other key and value types depends on the implementation as well as its underlying storage. See also [`db._serializeKey`](#db_serializekeykey) and [`db._serializeValue`](#db_serializevaluevalue). ++ ++## Private API For Implementors ++ ++Each of these methods will receive exactly the number and order of arguments described. Optional arguments will receive sensible defaults. All callbacks are error-first and must be asynchronous. ++ ++If an operation within your implementation is synchronous, be sure to invoke the callback on a next tick using `process.nextTick` or some other means of microtask scheduling. For convenience, the prototypes of `AbstractLevelDOWN`, `AbstractIterator` and `AbstractChainedBatch` include a `_nextTick` method that is compatible with node and browsers. ++ ++### `db = AbstractLevelDOWN([manifest])` ++ ++The constructor. Sets the `.status` to `'new'`. Optionally takes a [manifest](https://github.com/Level/supports) object which `abstract-leveldown` will enrich: ++ ++```js ++AbstractLevelDOWN.call(this, { ++ bufferKeys: true, ++ snapshots: true, ++ // .. ++}) ++``` ++ ++### `db._open(options, callback)` ++ ++Open the store. The `options` object will always have the following properties: `createIfMissing`, `errorIfExists`. If opening failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_open()` is a sensible noop and invokes `callback` on a next tick. ++ ++### `db._close(callback)` ++ ++Close the store. If closing failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_close()` is a sensible noop and invokes `callback` on a next tick. ++ ++### `db._serializeKey(key)` ++ ++Convert a `key` to a type supported by the underlying storage. All methods below that take a `key` argument or option - including `db._iterator()` with its range options and `iterator._seek()` with its `target` argument - will receive serialized keys. For example, if `_serializeKey` is implemented as: ++ ++```js ++FakeLevelDOWN.prototype._serializeKey = function (key) { ++ return Buffer.isBuffer(key) ? key : String(key) ++} ++``` ++ ++Then `db.get(2, callback)` translates into `db._get('2', options, callback)`. Similarly, `db.iterator({ gt: 2 })` translates into `db._iterator({ gt: '2', ... })` and `iterator.seek(2)` translates into `iterator._seek('2')`. ++ ++If the underlying storage supports any JavaScript type or if your implementation wraps another implementation, it is recommended to make `_serializeKey` an identity function (returning the key as-is). Serialization is irreversible, unlike _encoding_ as performed by implementations like [`encoding-down`][encoding-down]. This also applies to `_serializeValue`. ++ ++The default `_serializeKey()` is an identity function. ++ ++### `db._serializeValue(value)` ++ ++Convert a `value` to a type supported by the underlying storage. All methods below that take a `value` argument or option will receive serialized values. For example, if `_serializeValue` is implemented as: ++ ++```js ++FakeLevelDOWN.prototype._serializeValue = function (value) { ++ return Buffer.isBuffer(value) ? value : String(value) ++} ++``` ++ ++Then `db.put(key, 2, callback)` translates into `db._put(key, '2', options, callback)`. ++ ++The default `_serializeValue()` is an identity function. ++ ++### `db._get(key, options, callback)` ++ ++Get a value by `key`. The `options` object will always have the following properties: `asBuffer`. If the key does not exist, call the `callback` function with a `new Error('NotFound')`. Otherwise call `callback` with `null` as the first argument and the value as the second. ++ ++The default `_get()` invokes `callback` on a next tick with a `NotFound` error. It must be overridden. ++ ++### `db._put(key, value, options, callback)` ++ ++Store a new entry or overwrite an existing entry. There are no default options but `options` will always be an object. If putting failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_put()` invokes `callback` on a next tick. It must be overridden. ++ ++### `db._del(key, options, callback)` ++ ++Delete an entry. There are no default options but `options` will always be an object. If deletion failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_del()` invokes `callback` on a next tick. It must be overridden. ++ ++### `db._batch(operations, options, callback)` ++ ++Perform multiple _put_ and/or _del_ operations in bulk. The `operations` argument is always an `Array` containing a list of operations to be executed sequentially, although as a whole they should be performed as an atomic operation. Each operation is guaranteed to have at least `type` and `key` properties. There are no default options but `options` will always be an object. If the batch failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_batch()` invokes `callback` on a next tick. It must be overridden. ++ ++### `db._chainedBatch()` ++ ++The default `_chainedBatch()` returns a functional `AbstractChainedBatch` instance that uses `db._batch(array, options, callback)` under the hood. The prototype is available on the main exports for you to extend. If you want to implement chainable batch operations in a different manner then you should extend `AbstractChainedBatch` and return an instance of this prototype in the `_chainedBatch()` method: ++ ++```js ++var AbstractChainedBatch = require('abstract-leveldown').AbstractChainedBatch ++var inherits = require('util').inherits ++ ++function ChainedBatch (db) { ++ AbstractChainedBatch.call(this, db) ++} ++ ++inherits(ChainedBatch, AbstractChainedBatch) ++ ++FakeLevelDOWN.prototype._chainedBatch = function () { ++ return new ChainedBatch(this) ++} ++``` ++ ++### `db._iterator(options)` ++ ++The default `_iterator()` returns a noop `AbstractIterator` instance. It must be overridden, by extending `AbstractIterator` (available on the main module exports) and returning an instance of this prototype in the `_iterator(options)` method. ++ ++The `options` object will always have the following properties: `reverse`, `keys`, `values`, `limit`, `keyAsBuffer` and `valueAsBuffer`. ++ ++### `db._clear(options, callback)` ++ ++**This method is experimental and optional for the time being. To enable its tests, set the [`clear` option of the test suite](#excluding-tests) to `true`.** ++ ++Delete all entries or a range. Does not have to be atomic. It is recommended (and possibly mandatory in the future) to operate on a snapshot so that writes scheduled after a call to `clear()` will not be affected. ++ ++The default `_clear()` uses `_iterator()` and `_del()` to provide a reasonable fallback, but requires binary key support. It is _recommended_ to implement `_clear()` with more performant primitives than `_iterator()` and `_del()` if the underlying storage has such primitives. Implementations that don't support binary keys _must_ implement their own `_clear()`. ++ ++Implementations that wrap another `db` can typically forward the `_clear()` call to that `db`, having transformed range options if necessary. ++ ++The `options` object will always have the following properties: `reverse` and `limit`. ++ ++### `iterator = AbstractIterator(db)` ++ ++The first argument to this constructor must be an instance of your `AbstractLevelDOWN` implementation. The constructor will set `iterator.db` which is used to access `db._serialize*` and ensures that `db` will not be garbage collected in case there are no other references to it. ++ ++#### `iterator._next(callback)` ++ ++Advance the iterator and yield the entry at that key. If nexting failed, call the `callback` function with an `Error`. Otherwise, call `callback` with `null`, a `key` and a `value`. ++ ++The default `_next()` invokes `callback` on a next tick. It must be overridden. ++ ++#### `iterator._seek(target)` ++ ++Seek the iterator to a given key or the closest key. This method is optional. ++ ++#### `iterator._end(callback)` ++ ++Free up underlying resources. This method is guaranteed to only be called once. If ending failed, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++The default `_end()` invokes `callback` on a next tick. Overriding is optional. ++ ++### `chainedBatch = AbstractChainedBatch(db)` ++ ++The first argument to this constructor must be an instance of your `AbstractLevelDOWN` implementation. The constructor will set `chainedBatch.db` which is used to access `db._serialize*` and ensures that `db` will not be garbage collected in case there are no other references to it. ++ ++#### `chainedBatch._put(key, value)` ++ ++Queue a `put` operation on this batch. ++ ++#### `chainedBatch._del(key)` ++ ++Queue a `del` operation on this batch. ++ ++#### `chainedBatch._clear()` ++ ++Clear all queued operations on this batch. ++ ++#### `chainedBatch._write(options, callback)` ++ ++The default `_write` method uses `db._batch`. If the `_write` method is overridden it must atomically commit the queued operations. There are no default options but `options` will always be an object. If committing fails, call the `callback` function with an `Error`. Otherwise call `callback` without any arguments. ++ ++## Test Suite ++ ++To prove that your implementation is `abstract-leveldown` compliant, include the abstract test suite in your `test.js` (or similar): ++ ++```js ++const test = require('tape') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++suite({ ++ test: test, ++ factory: function () { ++ return new YourDOWN() ++ } ++}) ++``` ++ ++This is the most minimal setup. The `test` option _must_ be a function that is API-compatible with `tape`. The `factory` option _must_ be a function that returns a unique and isolated database instance. The factory will be called many times by the test suite. ++ ++If your implementation is disk-based we recommend using [`tempy`](https://github.com/sindresorhus/tempy) (or similar) to create unique temporary directories. Your setup could look something like: ++ ++```js ++const test = require('tape') ++const tempy = require('tempy') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++suite({ ++ test: test, ++ factory: function () { ++ return new YourDOWN(tempy.directory()) ++ } ++}) ++``` ++ ++### Excluding tests ++ ++As not every implementation can be fully compliant due to limitations of its underlying storage, some tests may be skipped. For example, to skip snapshot tests: ++ ++```js ++suite({ ++ // .. ++ snapshots: false ++}) ++``` ++ ++This also serves as a signal to users of your implementation. The following options are available: ++ ++- `bufferKeys`: set to `false` if binary keys are not supported by the underlying storage ++- `seek`: set to `false` if your `iterator` does not implement `_seek` ++- `clear`: defaults to `false` until a next major release. Set to `true` if your implementation either implements `_clear()` itself or is suitable to use the default implementation of `_clear()` (which requires binary key support). ++- `snapshots`: set to `false` if any of the following is true: ++ - Reads don't operate on a [snapshot](#iterator) ++ - Snapshots are created asynchronously ++- `createIfMissing` and `errorIfExists`: set to `false` if `db._open()` does not support these options. ++ ++This metadata will be moved to manifests (`db.supports`) in the future. ++ ++### Setup and teardown ++ ++To perform (a)synchronous work before or after each test, you may define `setUp` and `tearDown` functions: ++ ++```js ++suite({ ++ // .. ++ setUp: function (t) { ++ t.end() ++ }, ++ tearDown: function (t) { ++ t.end() ++ } ++}) ++``` ++ ++### Reusing `testCommon` ++ ++The input to the test suite is a `testCommon` object. Should you need to reuse `testCommon` for your own (additional) tests, use the included utility to create a `testCommon` with defaults: ++ ++```js ++const test = require('tape') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++const testCommon = suite.common({ ++ test: test, ++ factory: function () { ++ return new YourDOWN() ++ } ++}) ++ ++suite(testCommon) ++``` ++ ++The `testCommon` object will have all the properties describe above: `test`, `factory`, `setUp`, `tearDown` and the skip options. You might use it like so: ++ ++```js ++test('setUp', testCommon.setUp) ++ ++test('custom test', function (t) { ++ var db = testCommon.factory() ++ // .. ++}) ++ ++test('another custom test', function (t) { ++ var db = testCommon.factory() ++ // .. ++}) ++ ++test('tearDown', testCommon.tearDown) ++``` ++ ++## Spread The Word ++ ++If you'd like to share your awesome implementation with the world, here's what you might want to do: ++ ++- Add an awesome badge to your `README`: `![level badge](https://leveljs.org/img/badge.svg)` ++- Publish your awesome module to [npm](https://npmjs.org) ++- Send a Pull Request to [Level/awesome](https://github.com/Level/awesome) to advertise your work! ++ ++## Install ++ ++With [npm](https://npmjs.org) do: ++ ++``` ++npm install abstract-leveldown ++``` ++ ++## Contributing ++ ++[`Level/abstract-leveldown`](https://github.com/Level/abstract-leveldown) is an **OPEN Open Source Project**. This means that: ++ ++> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. ++ ++See the [Contribution Guide](https://github.com/Level/community/blob/master/CONTRIBUTING.md) for more details. ++ ++## Big Thanks ++ ++Cross-browser Testing Platform and Open Source ♥ Provided by [Sauce Labs](https://saucelabs.com). ++ ++[![Sauce Labs logo](./sauce-labs.svg)](https://saucelabs.com) ++ ++## Donate ++ ++To sustain [`Level`](https://github.com/Level) and its activities, become a backer or sponsor on [Open Collective](https://opencollective.com/level). Your logo or avatar will be displayed on our 28+ [GitHub repositories](https://github.com/Level) and [npm](https://www.npmjs.com/) packages. 💖 ++ ++### Backers ++ ++[![Open Collective backers](https://opencollective.com/level/backers.svg?width=890)](https://opencollective.com/level) ++ ++### Sponsors ++ ++[![Open Collective sponsors](https://opencollective.com/level/sponsors.svg?width=890)](https://opencollective.com/level) ++ ++## License ++ ++[MIT](LICENSE.md) © 2013-present Rod Vagg and [Contributors](CONTRIBUTORS.md). ++ ++[level-badge]: https://leveljs.org/img/badge.svg ++ ++[encoding-down]: https://github.com/Level/encoding-down ++ ++[leveldown]: https://github.com/Level/leveldown +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/UPGRADING.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/UPGRADING.md +new file mode 100644 +index 0000000..e19c647 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/UPGRADING.md +@@ -0,0 +1,322 @@ ++# Upgrade Guide ++ ++This document describes breaking changes and how to upgrade. For a complete list of changes including minor and patch releases, please refer to the [changelog](CHANGELOG.md). ++ ++## Table of Contents ++ ++
Click to expand ++ ++- [v6](#v6) ++- [v5](#v5) ++- [v4](#v4) ++- [v3](#v3) ++ ++
++ ++## v6 ++ ++This release brings a major refactoring of the test suite, decouples `abstract-leveldown` from disk-based implementations and solves long-standing issues around serialization and type support. Because the changes are substantial, this guide has two sections: ++ ++1. **Changes to public API** - for consumers of any implementation. ++2. **Changes to private API** - intended for implementors. ++ ++### Changes to public API ++ ++#### Nullish values are rejected ++ ++In addition to rejecting `null` and `undefined` as _keys_, `abstract-leveldown` now also rejects these types as _values_, due to preexisting significance in streams and iterators. ++ ++Before this, the behavior of these types depended on a large number of factors: `_serializeValue` and type support of the underlying storage, whether `get()`, `iterator()` or a stream was used to retrieve values, the `keys` and `asBuffer` options of `iterator()` and finally, which encoding was selected. ++ ++#### Range options are serialized ++ ++Previously, range options like `lt` were passed through as-is, unlike keys. ++ ++#### The rules for range options have been relaxed ++ ++Because `null`, `undefined`, zero-length strings and zero-length buffers are significant types in encodings like `bytewise` and `charwise`, they became valid as range options. In fact, any type is now valid. This means `db.iterator({ gt: undefined })` is not the same as `db.iterator({})`. ++ ++Furthermore, `abstract-leveldown` makes no assumptions about the meaning of these types. Range tests that assumed `null` meant "not defined" have been removed. ++ ++#### Zero-length array keys are rejected ++ ++Though this was already the case because `_checkKey` stringified its input before checking the length, that behavior has been replaced with an explicit `Array.isArray()` check and a new error message. ++ ++#### No longer assumes support of boolean and `NaN` keys ++ ++A test that asserted boolean and `NaN` keys were valid has been removed. ++ ++#### Browser support ++ ++IE10 has been dropped. ++ ++### Changes to private API ++ ++#### `location` was removed ++ ++`AbstractLevelDOWN` is no longer associated with a `location`. It's up to the implementation to handle it if it's required. ++ ++If your implementation has a `location` and you previously did: ++ ++```js ++function YourDOWN (location) { ++ AbstractLevelDOWN.call(this, location) ++} ++``` ++ ++You must now do: ++ ++```js ++function YourDOWN (location) { ++ this.location = location ++ AbstractLevelDOWN.call(this) ++} ++``` ++ ++Be sure to include appropriate type checks. If you relied on the default `AbstractLevelDOWN` behavior that would be: ++ ++```js ++if (typeof location !== 'string') { ++ throw new Error('constructor requires a location string argument') ++} ++``` ++ ++#### Abstract test suite has moved to a single entry point ++ ++Instead of including test files individually, you can and should include the test suite with one `require()` statement. If you previously did: ++ ++```js ++const test = require('tape') ++const testCommon = require('abstract-leveldown/testCommon') ++const YourDOWN = require('.') ++ ++require('abstract-leveldown/abstract/get-test').all(YourDOWN, test, testCommon) ++require('abstract-leveldown/abstract/put-test').all(YourDOWN, test, testCommon) ++ ++// etc ++``` ++ ++You must now do: ++ ++```js ++const test = require('tape') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++suite({ ++ test: test, ++ factory: function () { ++ return new YourDOWN() ++ } ++}) ++``` ++ ++The input to the test suite is a new form of `testCommon`. Should you need to reuse `testCommon` for your own (additional) tests, use the included utility to create a `testCommon` with defaults: ++ ++```js ++const test = require('tape') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++const testCommon = suite.common({ ++ test: test, ++ factory: function () { ++ return new YourDOWN() ++ } ++}) ++ ++suite(testCommon) ++``` ++ ++As part of removing `location`, the abstract tests no longer use `testCommon.location()`. Instead an implementation _must_ implement `factory()` which _must_ return a unique and isolated database instance. This allows implementations to pass options to their constructor. ++ ++The `testCommon.cleanup` method has been removed. Because `factory()` returns a unique database instance, cleanup should no longer be necessary. The `testCommon.lastLocation` method has also been removed as there is no remaining use of it in abstract tests. ++ ++Previously, implementations using the default `testCommon` had to include `rimraf` in their `devDependencies` and browser-based implementations had to exclude `rimraf` from browserify builds. This is no longer the case. ++ ++If your implementation is disk-based we recommend using [`tempy`](https://github.com/sindresorhus/tempy) (or similar) to create unique temporary directories. Together with `factory()` your setup could now look something like: ++ ++```js ++const test = require('tape') ++const tempy = require('tempy') ++const suite = require('abstract-leveldown/test') ++const YourDOWN = require('.') ++ ++suite({ ++ test: test, ++ factory: function () { ++ return new YourDOWN(tempy.directory()) ++ } ++}) ++``` ++ ++#### The `collectEntries` utility has moved ++ ++The `testCommon.collectEntries` method has moved to the npm package `level-concat-iterator`. If your (additional) tests depend on `collectEntries` and you previously did: ++ ++```js ++testCommon.collectEntries(iterator, function (err, entries) {}) ++``` ++ ++You must now do: ++ ++```js ++const concat = require('level-concat-iterator') ++concat(iterator, function (err, entries) {}) ++``` ++ ++#### Setup and teardown became noops ++ ++Because cleanup is no longer necessary, the `testCommon.setUp` and `testCommon.tearDown` methods are now noops by default. If you do need to perform (a)synchronous work before or after each test, `setUp` and `tearDown` can be overridden: ++ ++```js ++suite({ ++ // .. ++ setUp: function (t) { ++ t.end() ++ }, ++ tearDown: function (t) { ++ t.end() ++ } ++}) ++``` ++ ++#### Optional tests have been separated ++ ++If your implementation does not support snapshots or other optional features, the relevant tests may be skipped. For example: ++ ++```js ++suite({ ++ // .. ++ snapshots: false ++}) ++``` ++ ++Please see the [README](README.md) for a list of options. Note that some of these have replaced `process.browser` checks. ++ ++#### Iterator must have a `db` reference ++ ++The `db` argument of the `AbstractIterator` constructor became mandatory, as well as a public `db` property on the instance. Its existence is not new; the test suite now asserts that your implementation also has it. ++ ++#### Seeking became part of official API ++ ++If your implementation previously defined the public `iterator.seek(target)`, it must now define the private `iterator._seek(target)`. The new public API is equal to the reference implementation of `leveldown` except for two differences: ++ ++- The `target` argument is not type checked, this is up to the implementation. ++- The `target` argument is passed through `db._serializeKey`. ++ ++Please see the [README](README.md) for details. ++ ++#### Chained batch has been refactored ++ ++- The default `_clear` method is no longer a noop; instead it clears the operations queued by `_put` and/or `_del` ++- The `_write` method now takes an `options` object as its first argument ++- The `db` argument of the `AbstractChainedBatch` constructor became mandatory, as well as a public `db` property on the instance, which was previously named `_db`. ++ ++#### Default `_serializeKey` and `_serializeValue` became identity functions ++ ++They return whatever is given. Previously they were opinionated and mostly geared towards string- and Buffer-based storages. Implementations that didn't already define their own serialization should now do so, according to the types that they support. Please refer to the [README](README.md) for recommended behavior. ++ ++## v5 ++ ++Dropped support for node 4. No other breaking changes. ++ ++## v4 ++ ++#### default `testCommon` parameter ++ ++The `testCommon` parameter will now default to `abstract-leveldown/testCommon.js`. You can omit this parameter, unless your implementation needs a custom version. ++ ++If your code today looks something like: ++ ++```js ++const test = require('tape') ++const testCommon = require('abstract-leveldown/testCommon') ++const leveldown = require('./your-leveldown') ++const abstract = require('abstract-leveldown/abstract/get-test') ++ ++abstract.all(leveldown, test, testCommon) ++``` ++ ++You can simplify it to: ++ ++```js ++const test = require('tape') ++const leveldown = require('./your-leveldown') ++const abstract = require('abstract-leveldown/abstract/get-test') ++ ++abstract.all(leveldown, test) ++``` ++ ++#### `testBuffer` parameter removed ++ ++The `abstract/put-get-del-test.js` previously took a custom `testBuffer` parameter. After an [analysis](https://github.com/Level/abstract-leveldown/pull/175#issuecomment-353867144) of various implementations we came to the conclusion that the parameter has no use. ++ ++If your implementation is using this abstract test, change from: ++ ++```js ++const test = require('tape') ++const testCommon = require('abstract-leveldown/testCommon') ++const leveldown = require('./your-leveldown') ++const fs = require('fs') ++const path = require('path') ++const testBuffer = fs.readFileSync(path.join(__dirname, 'data/testdata.bin')) ++const abstract = require('abstract-leveldown/abstract/put-get-del-test') ++ ++abstract.all(leveldown, test, testBuffer, testCommon) ++``` ++ ++to: ++ ++```js ++const test = require('tape') ++const testCommon = require('abstract-leveldown/testCommon') ++const leveldown = require('./your-leveldown') ++const abstract = require('abstract-leveldown/abstract/put-get-del-test') ++ ++abstract.all(leveldown, test, testCommon) ++``` ++ ++or if `testCommon` is also redundant, to: ++ ++```js ++const test = require('tape') ++const leveldown = require('./your-leveldown') ++const abstract = require('abstract-leveldown/abstract/put-get-del-test') ++ ++abstract.all(leveldown, test) ++``` ++ ++#### `.approximateSize` method removed ++ ++The `.approximateSize` method has been removed from the public API. It is heavily related to `LevelDB` and more often than not, other stores lack the native primitives to implement this. If you did implement the internal `_approximateSize` method, that is now dead code. To preserve the method in your public API, rename it to `approximateSize` and also take care of the initialization code. Look to `leveldown` for inspiration. ++ ++Also, the corresponding abstract tests have been removed, so your implementation can no longer require `abstract/approximate-size-test`. ++ ++#### `._isBuffer` method removed ++ ++Because `Buffer` is available in all environments nowadays, there is no need for alternatives like typed arrays. It is preferred to use `Buffer` and `Buffer.isBuffer()` directly. ++ ++#### `isLevelDOWN` function removed ++ ++This was a legacy function. ++ ++#### `ranges-test.js` renamed ++ ++We have refactored a lot of the tests. Specifically the iterator tests were split in two and in that process we renamed `ranges-test.js` to `iterator-range-test.js`. ++ ++If your implementation is using these tests then change from: ++ ++```js ++const abstract = require('abstract-leveldown/abstract/ranges-test') ++``` ++ ++to: ++ ++```js ++const abstract = require('abstract-leveldown/abstract/iterator-range-test') ++``` ++ ++## v3 ++ ++No changes to the API. New major version because support for node 0.12 was dropped. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js +new file mode 100644 +index 0000000..bcdb9fa +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js +@@ -0,0 +1,86 @@ ++var nextTick = require('./next-tick') ++ ++function AbstractChainedBatch (db) { ++ if (typeof db !== 'object' || db === null) { ++ throw new TypeError('First argument must be an abstract-leveldown compliant store') ++ } ++ ++ this.db = db ++ this._operations = [] ++ this._written = false ++} ++ ++AbstractChainedBatch.prototype._checkWritten = function () { ++ if (this._written) { ++ throw new Error('write() already called on this batch') ++ } ++} ++ ++AbstractChainedBatch.prototype.put = function (key, value) { ++ this._checkWritten() ++ ++ var err = this.db._checkKey(key) || this.db._checkValue(value) ++ if (err) throw err ++ ++ key = this.db._serializeKey(key) ++ value = this.db._serializeValue(value) ++ ++ this._put(key, value) ++ ++ return this ++} ++ ++AbstractChainedBatch.prototype._put = function (key, value) { ++ this._operations.push({ type: 'put', key: key, value: value }) ++} ++ ++AbstractChainedBatch.prototype.del = function (key) { ++ this._checkWritten() ++ ++ var err = this.db._checkKey(key) ++ if (err) throw err ++ ++ key = this.db._serializeKey(key) ++ this._del(key) ++ ++ return this ++} ++ ++AbstractChainedBatch.prototype._del = function (key) { ++ this._operations.push({ type: 'del', key: key }) ++} ++ ++AbstractChainedBatch.prototype.clear = function () { ++ this._checkWritten() ++ this._clear() ++ ++ return this ++} ++ ++AbstractChainedBatch.prototype._clear = function () { ++ this._operations = [] ++} ++ ++AbstractChainedBatch.prototype.write = function (options, callback) { ++ this._checkWritten() ++ ++ if (typeof options === 'function') { callback = options } ++ if (typeof callback !== 'function') { ++ throw new Error('write() requires a callback argument') ++ } ++ if (typeof options !== 'object' || options === null) { ++ options = {} ++ } ++ ++ this._written = true ++ this._write(options, callback) ++} ++ ++AbstractChainedBatch.prototype._write = function (options, callback) { ++ this.db._batch(this._operations, options, callback) ++} ++ ++// Expose browser-compatible nextTick for dependents ++AbstractChainedBatch.prototype._nextTick = nextTick ++ ++module.exports = AbstractChainedBatch +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js +new file mode 100644 +index 0000000..8fb0f9c +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js +@@ -0,0 +1,77 @@ ++var nextTick = require('./next-tick') ++ ++function AbstractIterator (db) { ++ if (typeof db !== 'object' || db === null) { ++ throw new TypeError('First argument must be an abstract-leveldown compliant store') ++ } ++ ++ this.db = db ++ this._ended = false ++ this._nexting = false ++} ++ ++AbstractIterator.prototype.next = function (callback) { ++ var self = this ++ ++ if (typeof callback !== 'function') { ++ throw new Error('next() requires a callback argument') ++ } ++ ++ if (self._ended) { ++ nextTick(callback, new Error('cannot call next() after end()')) ++ return self ++ } ++ ++ if (self._nexting) { ++ nextTick(callback, new Error('cannot call next() before previous next() has completed')) ++ return self ++ } ++ ++ self._nexting = true ++ self._next(function () { ++ self._nexting = false ++ callback.apply(null, arguments) ++ }) ++ ++ return self ++} ++ ++AbstractIterator.prototype._next = function (callback) { ++ nextTick(callback) ++} ++ ++AbstractIterator.prototype.seek = function (target) { ++ if (this._ended) { ++ throw new Error('cannot call seek() after end()') ++ } ++ if (this._nexting) { ++ throw new Error('cannot call seek() before next() has completed') ++ } ++ ++ target = this.db._serializeKey(target) ++ this._seek(target) ++} ++ ++AbstractIterator.prototype._seek = function (target) {} ++ ++AbstractIterator.prototype.end = function (callback) { ++ if (typeof callback !== 'function') { ++ throw new Error('end() requires a callback argument') ++ } ++ ++ if (this._ended) { ++ return nextTick(callback, new Error('end() already called on iterator')) ++ } ++ ++ this._ended = true ++ this._end(callback) ++} ++ ++AbstractIterator.prototype._end = function (callback) { ++ nextTick(callback) ++} ++ ++// Expose browser-compatible nextTick for dependents ++AbstractIterator.prototype._nextTick = nextTick ++ ++module.exports = AbstractIterator +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js +new file mode 100644 +index 0000000..5039cf3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js +@@ -0,0 +1,320 @@ ++var xtend = require('xtend') ++var supports = require('level-supports') ++var Buffer = require('buffer').Buffer ++var AbstractIterator = require('./abstract-iterator') ++var AbstractChainedBatch = require('./abstract-chained-batch') ++var nextTick = require('./next-tick') ++var hasOwnProperty = Object.prototype.hasOwnProperty ++var rangeOptions = 'start end gt gte lt lte'.split(' ') ++ ++function AbstractLevelDOWN (manifest) { ++ this.status = 'new' ++ ++ // TODO (next major): make this mandatory ++ this.supports = supports(manifest, { ++ status: true ++ }) ++} ++ ++AbstractLevelDOWN.prototype.open = function (options, callback) { ++ var self = this ++ var oldStatus = this.status ++ ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('open() requires a callback argument') ++ } ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ options.createIfMissing = options.createIfMissing !== false ++ options.errorIfExists = !!options.errorIfExists ++ ++ this.status = 'opening' ++ this._open(options, function (err) { ++ if (err) { ++ self.status = oldStatus ++ return callback(err) ++ } ++ self.status = 'open' ++ callback() ++ }) ++} ++ ++AbstractLevelDOWN.prototype._open = function (options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.close = function (callback) { ++ var self = this ++ var oldStatus = this.status ++ ++ if (typeof callback !== 'function') { ++ throw new Error('close() requires a callback argument') ++ } ++ ++ this.status = 'closing' ++ this._close(function (err) { ++ if (err) { ++ self.status = oldStatus ++ return callback(err) ++ } ++ self.status = 'closed' ++ callback() ++ }) ++} ++ ++AbstractLevelDOWN.prototype._close = function (callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.get = function (key, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('get() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ options.asBuffer = options.asBuffer !== false ++ ++ this._get(key, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._get = function (key, options, callback) { ++ nextTick(function () { callback(new Error('NotFound')) }) ++} ++ ++AbstractLevelDOWN.prototype.put = function (key, value, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('put() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) || this._checkValue(value) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ value = this._serializeValue(value) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ this._put(key, value, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._put = function (key, value, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.del = function (key, options, callback) { ++ if (typeof options === 'function') callback = options ++ ++ if (typeof callback !== 'function') { ++ throw new Error('del() requires a callback argument') ++ } ++ ++ var err = this._checkKey(key) ++ if (err) return nextTick(callback, err) ++ ++ key = this._serializeKey(key) ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ this._del(key, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._del = function (key, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.batch = function (array, options, callback) { ++ if (!arguments.length) return this._chainedBatch() ++ ++ if (typeof options === 'function') callback = options ++ ++ if (typeof array === 'function') callback = array ++ ++ if (typeof callback !== 'function') { ++ throw new Error('batch(array) requires a callback argument') ++ } ++ ++ if (!Array.isArray(array)) { ++ return nextTick(callback, new Error('batch(array) requires an array argument')) ++ } ++ ++ if (array.length === 0) { ++ return nextTick(callback) ++ } ++ ++ if (typeof options !== 'object' || options === null) options = {} ++ ++ var serialized = new Array(array.length) ++ ++ for (var i = 0; i < array.length; i++) { ++ if (typeof array[i] !== 'object' || array[i] === null) { ++ return nextTick(callback, new Error('batch(array) element must be an object and not `null`')) ++ } ++ ++ var e = xtend(array[i]) ++ ++ if (e.type !== 'put' && e.type !== 'del') { ++ return nextTick(callback, new Error("`type` must be 'put' or 'del'")) ++ } ++ ++ var err = this._checkKey(e.key) ++ if (err) return nextTick(callback, err) ++ ++ e.key = this._serializeKey(e.key) ++ ++ if (e.type === 'put') { ++ var valueErr = this._checkValue(e.value) ++ if (valueErr) return nextTick(callback, valueErr) ++ ++ e.value = this._serializeValue(e.value) ++ } ++ ++ serialized[i] = e ++ } ++ ++ this._batch(serialized, options, callback) ++} ++ ++AbstractLevelDOWN.prototype._batch = function (array, options, callback) { ++ nextTick(callback) ++} ++ ++AbstractLevelDOWN.prototype.clear = function (options, callback) { ++ if (typeof options === 'function') { ++ callback = options ++ } else if (typeof callback !== 'function') { ++ throw new Error('clear() requires a callback argument') ++ } ++ ++ options = cleanRangeOptions(this, options) ++ options.reverse = !!options.reverse ++ options.limit = 'limit' in options ? options.limit : -1 ++ ++ this._clear(options, callback) ++} ++ ++AbstractLevelDOWN.prototype._clear = function (options, callback) { ++ // Avoid setupIteratorOptions, would serialize range options a second time. ++ options.keys = true ++ options.values = false ++ options.keyAsBuffer = true ++ options.valueAsBuffer = true ++ ++ var iterator = this._iterator(options) ++ var emptyOptions = {} ++ var self = this ++ ++ var next = function (err) { ++ if (err) { ++ return iterator.end(function () { ++ callback(err) ++ }) ++ } ++ ++ iterator.next(function (err, key) { ++ if (err) return next(err) ++ if (key === undefined) return iterator.end(callback) ++ ++ // This could be optimized by using a batch, but the default _clear ++ // is not meant to be fast. Implementations have more room to optimize ++ // if they override _clear. Note: using _del bypasses key serialization. ++ self._del(key, emptyOptions, next) ++ }) ++ } ++ ++ next() ++} ++ ++AbstractLevelDOWN.prototype._setupIteratorOptions = function (options) { ++ options = cleanRangeOptions(this, options) ++ ++ options.reverse = !!options.reverse ++ options.keys = options.keys !== false ++ options.values = options.values !== false ++ options.limit = 'limit' in options ? options.limit : -1 ++ options.keyAsBuffer = options.keyAsBuffer !== false ++ options.valueAsBuffer = options.valueAsBuffer !== false ++ ++ return options ++} ++ ++function cleanRangeOptions (db, options) { ++ var result = {} ++ ++ for (var k in options) { ++ if (!hasOwnProperty.call(options, k)) continue ++ ++ var opt = options[k] ++ ++ if (isRangeOption(k)) { ++ // Note that we don't reject nullish and empty options here. While ++ // those types are invalid as keys, they are valid as range options. ++ opt = db._serializeKey(opt) ++ } ++ ++ result[k] = opt ++ } ++ ++ return result ++} ++ ++function isRangeOption (k) { ++ return rangeOptions.indexOf(k) !== -1 ++} ++ ++AbstractLevelDOWN.prototype.iterator = function (options) { ++ if (typeof options !== 'object' || options === null) options = {} ++ options = this._setupIteratorOptions(options) ++ return this._iterator(options) ++} ++ ++AbstractLevelDOWN.prototype._iterator = function (options) { ++ return new AbstractIterator(this) ++} ++ ++AbstractLevelDOWN.prototype._chainedBatch = function () { ++ return new AbstractChainedBatch(this) ++} ++ ++AbstractLevelDOWN.prototype._serializeKey = function (key) { ++ return key ++} ++ ++AbstractLevelDOWN.prototype._serializeValue = function (value) { ++ return value ++} ++ ++AbstractLevelDOWN.prototype._checkKey = function (key) { ++ if (key === null || key === undefined) { ++ return new Error('key cannot be `null` or `undefined`') ++ } else if (Buffer.isBuffer(key) && key.length === 0) { ++ return new Error('key cannot be an empty Buffer') ++ } else if (key === '') { ++ return new Error('key cannot be an empty String') ++ } else if (Array.isArray(key) && key.length === 0) { ++ return new Error('key cannot be an empty Array') ++ } ++} ++ ++AbstractLevelDOWN.prototype._checkValue = function (value) { ++ if (value === null || value === undefined) { ++ return new Error('value cannot be `null` or `undefined`') ++ } ++} ++ ++// Expose browser-compatible nextTick for dependents ++AbstractLevelDOWN.prototype._nextTick = nextTick ++ ++module.exports = AbstractLevelDOWN +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/index.js +new file mode 100644 +index 0000000..682a79a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/index.js +@@ -0,0 +1,3 @@ ++exports.AbstractLevelDOWN = require('./abstract-leveldown') ++exports.AbstractIterator = require('./abstract-iterator') ++exports.AbstractChainedBatch = require('./abstract-chained-batch') +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick-browser.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick-browser.js +new file mode 100644 +index 0000000..3e424be +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick-browser.js +@@ -0,0 +1 @@ ++module.exports = require('immediate') +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js +new file mode 100644 +index 0000000..32b4093 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js +@@ -0,0 +1 @@ ++module.exports = process.nextTick +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/sauce-labs.svg b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/sauce-labs.svg +new file mode 100644 +index 0000000..574cf16 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/sauce-labs.svg +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ Sauce Labs ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/batch-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/batch-test.js +new file mode 100644 +index 0000000..4b2a471 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/batch-test.js +@@ -0,0 +1,318 @@ ++var db ++var verifyNotFoundError = require('./util').verifyNotFoundError ++var isTypedArray = require('./util').isTypedArray ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test callback-less, 2-arg, batch() throws', function (t) { ++ t.throws( ++ db.batch.bind(db, 'foo', {}), ++ /Error: batch\(array\) requires a callback argument/, ++ 'callback-less, 2-arg batch() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test batch() with missing `value`', function (t) { ++ db.batch([{ type: 'put', key: 'foo1' }], function (err) { ++ t.is(err.message, 'value cannot be `null` or `undefined`', 'correct error message') ++ t.end() ++ }) ++ }) ++ ++ test('test batch() with null or undefined `value`', function (t) { ++ var illegalValues = [null, undefined] ++ ++ t.plan(illegalValues.length) ++ ++ illegalValues.forEach(function (value) { ++ db.batch([{ type: 'put', key: 'foo1', value: value }], function (err) { ++ t.is(err.message, 'value cannot be `null` or `undefined`', 'correct error message') ++ }) ++ }) ++ }) ++ ++ test('test batch() with missing `key`', function (t) { ++ var async = false ++ ++ db.batch([{ type: 'put', value: 'foo1' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with null or undefined `key`', function (t) { ++ var illegalKeys = [null, undefined] ++ ++ t.plan(illegalKeys.length * 3) ++ ++ illegalKeys.forEach(function (key) { ++ var async = false ++ ++ db.batch([{ type: 'put', key: key, value: 'foo1' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ }) ++ ++ async = true ++ }) ++ }) ++ ++ test('test batch() with empty `key`', function (t) { ++ var illegalKeys = [ ++ { type: 'String', key: '' }, ++ { type: 'Buffer', key: Buffer.alloc(0) }, ++ { type: 'Array', key: [] } ++ ] ++ ++ t.plan(illegalKeys.length * 3) ++ ++ illegalKeys.forEach(function (item) { ++ var async = false ++ ++ db.batch([{ type: 'put', key: item.key, value: 'foo1' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'key cannot be an empty ' + item.type, 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ }) ++ ++ async = true ++ }) ++ }) ++ ++ test('test batch() with missing `key` and `value`', function (t) { ++ var async = false ++ ++ db.batch([{ type: 'put' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with missing `type`', function (t) { ++ var async = false ++ ++ db.batch([{ key: 'key', value: 'value' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, "`type` must be 'put' or 'del'", 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with wrong `type`', function (t) { ++ var async = false ++ ++ db.batch([{ key: 'key', value: 'value', type: 'foo' }], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, "`type` must be 'put' or 'del'", 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with missing array', function (t) { ++ var async = false ++ ++ db.batch(function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'batch(array) requires an array argument', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with undefined array', function (t) { ++ var async = false ++ ++ db.batch(undefined, function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'batch(array) requires an array argument', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with null array', function (t) { ++ var async = false ++ ++ db.batch(null, function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'batch(array) requires an array argument', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test batch() with null options', function (t) { ++ db.batch([], null, function (err) { ++ t.error(err) ++ t.end() ++ }) ++ }) ++ ++ ;[null, undefined, 1, true].forEach(function (element) { ++ var type = element === null ? 'null' : typeof element ++ ++ test('test batch() with ' + type + ' element', function (t) { ++ var async = false ++ ++ db.batch([element], function (err) { ++ t.ok(err, 'got error') ++ t.equal(err.message, 'batch(array) element must be an object and not `null`', 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ }) ++ ++ test('test batch() with empty array', function (t) { ++ var async = false ++ ++ db.batch([], function (err) { ++ t.error(err, 'no error from batch()') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++} ++ ++exports.batch = function (test, testCommon) { ++ test('test simple batch()', function (t) { ++ db.batch([{ type: 'put', key: 'foo', value: 'bar' }], function (err) { ++ t.error(err) ++ ++ db.get('foo', function (err, value) { ++ t.error(err) ++ var result ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) ++ } else { ++ t.ok(typeof Buffer !== 'undefined' && value instanceof Buffer) ++ result = value.toString() ++ } ++ t.equal(result, 'bar') ++ t.end() ++ }) ++ }) ++ }) ++ ++ test('test multiple batch()', function (t) { ++ db.batch([ ++ { type: 'put', key: 'foobatch1', value: 'bar1' }, ++ { type: 'put', key: 'foobatch2', value: 'bar2' }, ++ { type: 'put', key: 'foobatch3', value: 'bar3' }, ++ { type: 'del', key: 'foobatch2' } ++ ], function (err) { ++ t.error(err) ++ ++ var r = 0 ++ var done = function () { ++ if (++r === 3) { t.end() } ++ } ++ ++ db.get('foobatch1', function (err, value) { ++ t.error(err) ++ var result ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) ++ } else { ++ t.ok(typeof Buffer !== 'undefined' && value instanceof Buffer) ++ result = value.toString() ++ } ++ t.equal(result, 'bar1') ++ done() ++ }) ++ ++ db.get('foobatch2', function (err, value) { ++ t.ok(err, 'entry not found') ++ t.ok(typeof value === 'undefined', 'value is undefined') ++ t.ok(verifyNotFoundError(err), 'NotFound error') ++ done() ++ }) ++ ++ db.get('foobatch3', function (err, value) { ++ t.error(err) ++ var result ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) ++ } else { ++ t.ok(typeof Buffer !== 'undefined' && value instanceof Buffer) ++ result = value.toString() ++ } ++ t.equal(result, 'bar3') ++ done() ++ }) ++ }) ++ }) ++} ++ ++exports.atomic = function (test, testCommon) { ++ test('test multiple batch()', function (t) { ++ t.plan(4) ++ ++ var async = false ++ ++ db.batch([ ++ { type: 'put', key: 'foobah1', value: 'bar1' }, ++ { type: 'put', value: 'bar2' }, ++ { type: 'put', key: 'foobah3', value: 'bar3' } ++ ], function (err) { ++ t.ok(err, 'should error') ++ t.ok(async, 'callback is asynchronous') ++ ++ db.get('foobah1', function (err) { ++ t.ok(err, 'should not be found') ++ }) ++ db.get('foobah3', function (err) { ++ t.ok(err, 'should not be found') ++ }) ++ }) ++ ++ async = true ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.batch(test, testCommon) ++ exports.atomic(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/chained-batch-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/chained-batch-test.js +new file mode 100644 +index 0000000..6bb2adf +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/chained-batch-test.js +@@ -0,0 +1,298 @@ ++var collectEntries = require('level-concat-iterator') ++ ++var db ++ ++function collectBatchOps (batch) { ++ var _put = batch._put ++ var _del = batch._del ++ var _operations = [] ++ ++ if (typeof _put !== 'function' || typeof _del !== 'function') { ++ return batch._operations ++ } ++ ++ batch._put = function (key, value) { ++ _operations.push({ type: 'put', key: key, value: value }) ++ return _put.apply(this, arguments) ++ } ++ ++ batch._del = function (key) { ++ _operations.push({ type: 'del', key: key }) ++ return _del.apply(this, arguments) ++ } ++ ++ return _operations ++} ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test batch has db reference', function (t) { ++ t.ok(db.batch().db === db) ++ t.end() ++ }) ++ ++ test('test batch#put() with missing `value`', function (t) { ++ t.plan(1) ++ ++ try { ++ db.batch().put('foo1') ++ } catch (err) { ++ t.is(err.message, 'value cannot be `null` or `undefined`', 'correct error message') ++ } ++ }) ++ ++ test('test batch#put() with missing `key`', function (t) { ++ try { ++ db.batch().put(undefined, 'foo1') ++ } catch (err) { ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#put() with null `key`', function (t) { ++ try { ++ db.batch().put(null, 'foo1') ++ } catch (err) { ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#put() with missing `key` and `value`', function (t) { ++ try { ++ db.batch().put() ++ } catch (err) { ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#put() with null or undefined `value`', function (t) { ++ var illegalValues = [null, undefined] ++ t.plan(illegalValues.length) ++ ++ illegalValues.forEach(function (value) { ++ try { ++ db.batch().put('key', value) ++ } catch (err) { ++ t.is(err.message, 'value cannot be `null` or `undefined`', 'correct error message') ++ } ++ }) ++ }) ++ ++ test('test batch#del() with missing `key`', function (t) { ++ try { ++ db.batch().del() ++ } catch (err) { ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#del() with null or undefined `key`', function (t) { ++ var illegalKeys = [null, undefined] ++ t.plan(illegalKeys.length) ++ ++ illegalKeys.forEach(function (key) { ++ try { ++ db.batch().del(key) ++ } catch (err) { ++ t.equal(err.message, 'key cannot be `null` or `undefined`', 'correct error message') ++ } ++ }) ++ }) ++ ++ test('test batch#clear() doesn\'t throw', function (t) { ++ db.batch().clear() ++ t.end() ++ }) ++ ++ test('test batch#write() with no callback', function (t) { ++ try { ++ db.batch().write() ++ } catch (err) { ++ t.equal(err.message, 'write() requires a callback argument', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#put() after write()', function (t) { ++ var batch = db.batch().put('foo', 'bar') ++ batch.write(function () {}) ++ try { ++ batch.put('boom', 'bang') ++ } catch (err) { ++ t.equal(err.message, 'write() already called on this batch', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#del() after write()', function (t) { ++ var batch = db.batch().put('foo', 'bar') ++ batch.write(function () {}) ++ try { ++ batch.del('foo') ++ } catch (err) { ++ t.equal(err.message, 'write() already called on this batch', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#clear() after write()', function (t) { ++ var batch = db.batch().put('foo', 'bar') ++ batch.write(function () {}) ++ try { ++ batch.clear() ++ } catch (err) { ++ t.equal(err.message, 'write() already called on this batch', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test batch#write() after write()', function (t) { ++ var batch = db.batch().put('foo', 'bar') ++ batch.write(function () {}) ++ try { ++ batch.write(function () {}) ++ } catch (err) { ++ t.equal(err.message, 'write() already called on this batch', 'correct error message') ++ return t.end() ++ } ++ t.fail('should have thrown') ++ t.end() ++ }) ++ ++ test('test serialize object', function (t) { ++ var batch = db.batch() ++ var ops = collectBatchOps(batch) ++ ++ batch ++ .put({ foo: 'bar' }, { beep: 'boop' }) ++ .del({ bar: 'baz' }) ++ ops.forEach(function (op) { ++ t.ok(op.key, '.key is set for .put and .del operations') ++ if (op.type === 'put') { ++ t.ok(op.value, '.value is set for .put operation') ++ } ++ }) ++ t.end() ++ }) ++ ++ test('test custom _serialize*', function (t) { ++ t.plan(4) ++ ++ var _db = Object.create(db) ++ var batch = _db.batch() ++ var ops = collectBatchOps(batch) ++ ++ _db._serializeKey = function (key) { ++ t.same(key, { foo: 'bar' }) ++ return 'key1' ++ } ++ ++ _db._serializeValue = function (value) { ++ t.same(value, { beep: 'boop' }) ++ return 'value1' ++ } ++ ++ batch.put({ foo: 'bar' }, { beep: 'boop' }) ++ ++ _db._serializeKey = function (key) { ++ t.same(key, { bar: 'baz' }) ++ return 'key2' ++ } ++ ++ batch.del({ bar: 'baz' }) ++ ++ t.deepEqual(ops, [ ++ { type: 'put', key: 'key1', value: 'value1' }, ++ { type: 'del', key: 'key2' } ++ ]) ++ }) ++ ++ test('test batch#write() with no operations', function (t) { ++ var async = false ++ ++ db.batch().write(function (err) { ++ t.ifError(err, 'no error from write()') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++} ++ ++exports.batch = function (test, testCommon) { ++ test('test basic batch', function (t) { ++ db.batch([ ++ { type: 'put', key: 'one', value: '1' }, ++ { type: 'put', key: 'two', value: '2' }, ++ { type: 'put', key: 'three', value: '3' } ++ ], function (err) { ++ t.error(err) ++ db.batch() ++ .put('1', 'one') ++ .del('2', 'two') ++ .put('3', 'three') ++ .clear() ++ .put('one', 'I') ++ .put('two', 'II') ++ .del('three') ++ .put('foo', 'bar') ++ .write(function (err) { ++ t.error(err) ++ collectEntries( ++ db.iterator({ keyAsBuffer: false, valueAsBuffer: false }), function (err, data) { ++ t.error(err) ++ t.equal(data.length, 3, 'correct number of entries') ++ var expected = [ ++ { key: 'foo', value: 'bar' }, ++ { key: 'one', value: 'I' }, ++ { key: 'two', value: 'II' } ++ ] ++ t.deepEqual(data, expected) ++ t.end() ++ } ++ ) ++ }) ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.batch(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-range-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-range-test.js +new file mode 100644 +index 0000000..2158631 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-range-test.js +@@ -0,0 +1,258 @@ ++var concat = require('level-concat-iterator') ++ ++var data = (function () { ++ var d = [] ++ var i = 0 ++ var k ++ for (; i < 100; i++) { ++ k = (i < 10 ? '0' : '') + i ++ d.push({ ++ key: k, ++ value: String(Math.random()) ++ }) ++ } ++ return d ++}()) ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++} ++ ++exports.range = function (test, testCommon) { ++ function rangeTest (name, opts, expected) { ++ test('db#clear() with ' + name, function (t) { ++ prepare(t, function (db) { ++ db.clear(opts, function (err) { ++ t.ifError(err, 'no clear error') ++ verify(t, db, expected) ++ }) ++ }) ++ }) ++ } ++ ++ function prepare (t, callback) { ++ var db = testCommon.factory() ++ ++ db.open(function (err) { ++ t.ifError(err, 'no open error') ++ ++ db.batch(data.map(function (d) { ++ return { ++ type: 'put', ++ key: d.key, ++ value: d.value ++ } ++ }), function (err) { ++ t.ifError(err, 'no batch error') ++ callback(db) ++ }) ++ }) ++ } ++ ++ function verify (t, db, expected) { ++ var it = db.iterator({ keyAsBuffer: false, valueAsBuffer: false }) ++ ++ concat(it, function (err, result) { ++ t.ifError(err, 'no concat error') ++ t.is(result.length, expected.length, 'correct number of entries') ++ t.same(result, expected) ++ ++ db.close(t.end.bind(t)) ++ }) ++ } ++ ++ function exclude (data, start, end, expectedLength) { ++ data = data.slice() ++ var removed = data.splice(start, end - start + 1) // Inclusive ++ if (expectedLength != null) checkLength(removed, expectedLength) ++ return data ++ } ++ ++ // For sanity checks on test arguments ++ function checkLength (arr, length) { ++ if (arr.length !== length) { ++ throw new RangeError('Expected ' + length + ' elements, got ' + arr.length) ++ } ++ ++ return arr ++ } ++ ++ rangeTest('full range', {}, []) ++ ++ // Reversing has no effect without limit ++ rangeTest('reverse=true', { ++ reverse: true ++ }, []) ++ ++ rangeTest('gte=00', { ++ gte: '00' ++ }, []) ++ ++ rangeTest('gte=50', { ++ gte: '50' ++ }, data.slice(0, 50)) ++ ++ rangeTest('lte=50 and reverse=true', { ++ lte: '50', ++ reverse: true ++ }, data.slice(51)) ++ ++ rangeTest('gte=49.5 (midway)', { ++ gte: '49.5' ++ }, data.slice(0, 50)) ++ ++ rangeTest('gte=49999 (midway)', { ++ gte: '49999' ++ }, data.slice(0, 50)) ++ ++ rangeTest('lte=49.5 (midway) and reverse=true', { ++ lte: '49.5', ++ reverse: true ++ }, data.slice(50)) ++ ++ rangeTest('lt=49.5 (midway) and reverse=true', { ++ lt: '49.5', ++ reverse: true ++ }, data.slice(50)) ++ ++ rangeTest('lt=50 and reverse=true', { ++ lt: '50', ++ reverse: true ++ }, data.slice(50)) ++ ++ rangeTest('lte=50', { ++ lte: '50' ++ }, data.slice(51)) ++ ++ rangeTest('lte=50.5 (midway)', { ++ lte: '50.5' ++ }, data.slice(51)) ++ ++ rangeTest('lte=50555 (midway)', { ++ lte: '50555' ++ }, data.slice(51)) ++ ++ rangeTest('lt=50555 (midway)', { ++ lt: '50555' ++ }, data.slice(51)) ++ ++ rangeTest('gte=50.5 (midway) and reverse=true', { ++ gte: '50.5', ++ reverse: true ++ }, data.slice(0, 51)) ++ ++ rangeTest('gt=50.5 (midway) and reverse=true', { ++ gt: '50.5', ++ reverse: true ++ }, data.slice(0, 51)) ++ ++ rangeTest('gt=50 and reverse=true', { ++ gt: '50', ++ reverse: true ++ }, data.slice(0, 51)) ++ ++ // Starting key is actually '00' so it should avoid it ++ rangeTest('lte=0', { ++ lte: '0' ++ }, data) ++ ++ // Starting key is actually '00' so it should avoid it ++ rangeTest('lt=0', { ++ lt: '0' ++ }, data) ++ ++ rangeTest('gte=30 and lte=70', { ++ gte: '30', ++ lte: '70' ++ }, exclude(data, 30, 70)) ++ ++ rangeTest('gt=29 and lt=71', { ++ gt: '29', ++ lt: '71' ++ }, exclude(data, 30, 70)) ++ ++ rangeTest('gte=30 and lte=70 and reverse=true', { ++ lte: '70', ++ gte: '30', ++ reverse: true ++ }, exclude(data, 30, 70)) ++ ++ rangeTest('gt=29 and lt=71 and reverse=true', { ++ lt: '71', ++ gt: '29', ++ reverse: true ++ }, exclude(data, 30, 70)) ++ ++ rangeTest('limit=20', { ++ limit: 20 ++ }, data.slice(20)) ++ ++ rangeTest('limit=20 and gte=20', { ++ limit: 20, ++ gte: '20' ++ }, exclude(data, 20, 39, 20)) ++ ++ rangeTest('limit=20 and reverse=true', { ++ limit: 20, ++ reverse: true ++ }, data.slice(0, -20)) ++ ++ rangeTest('limit=20 and lte=79 and reverse=true', { ++ limit: 20, ++ lte: '79', ++ reverse: true ++ }, exclude(data, 60, 79, 20)) ++ ++ rangeTest('limit=-1 should clear whole database', { ++ limit: -1 ++ }, []) ++ ++ rangeTest('limit=0 should not clear anything', { ++ limit: 0 ++ }, data) ++ ++ rangeTest('lte after limit', { ++ limit: 20, ++ lte: '50' ++ }, data.slice(20)) ++ ++ rangeTest('lte before limit', { ++ limit: 50, ++ lte: '19' ++ }, data.slice(20)) ++ ++ rangeTest('gte after database end', { ++ gte: '9a' ++ }, data) ++ ++ rangeTest('gt after database end', { ++ gt: '9a' ++ }, data) ++ ++ rangeTest('lte after database end and reverse=true', { ++ lte: '9a', ++ reverse: true ++ }, []) ++ ++ rangeTest('lte and gte after database and reverse=true', { ++ lte: '9b', ++ gte: '9a', ++ reverse: true ++ }, data) ++ ++ rangeTest('lt and gt after database and reverse=true', { ++ lt: '9b', ++ gt: '9a', ++ reverse: true ++ }, data) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.range(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-test.js +new file mode 100644 +index 0000000..d338cad +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-test.js +@@ -0,0 +1,83 @@ ++var concat = require('level-concat-iterator') ++var db ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test argument-less clear() throws', function (t) { ++ t.throws( ++ db.clear.bind(db), ++ /Error: clear\(\) requires a callback argument/, ++ 'no-arg clear() throws' ++ ) ++ t.end() ++ }) ++} ++ ++exports.clear = function (test, testCommon) { ++ makeTest('string', ['a', 'b']) ++ ++ if (testCommon.bufferKeys) { ++ makeTest('buffer', [Buffer.from('a'), Buffer.from('b')]) ++ makeTest('mixed', [Buffer.from('a'), 'b']) ++ ++ // These keys would be equal when compared as utf8 strings ++ makeTest('non-utf8 buffer', [Buffer.from('80', 'hex'), Buffer.from('c0', 'hex')]) ++ } ++ ++ function makeTest (type, keys) { ++ test('test simple clear() on ' + type + ' keys', function (t) { ++ t.plan(8) ++ ++ var db = testCommon.factory() ++ var ops = keys.map(function (key) { ++ return { type: 'put', key: key, value: 'foo' } ++ }) ++ ++ db.open(function (err) { ++ t.ifError(err, 'no open error') ++ ++ db.batch(ops, function (err) { ++ t.ifError(err, 'no batch error') ++ ++ concat(db.iterator(), function (err, entries) { ++ t.ifError(err, 'no concat error') ++ t.is(entries.length, keys.length, 'has entries') ++ ++ db.clear(function (err) { ++ t.ifError(err, 'no clear error') ++ ++ concat(db.iterator(), function (err, entries) { ++ t.ifError(err, 'no concat error') ++ t.is(entries.length, 0, 'has no entries') ++ ++ db.close(function (err) { ++ t.ifError(err, 'no close error') ++ }) ++ }) ++ }) ++ }) ++ }) ++ }) ++ }) ++ } ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.clear(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/close-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/close-test.js +new file mode 100644 +index 0000000..d70a06f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/close-test.js +@@ -0,0 +1,39 @@ ++var db ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.close = function (test, testCommon) { ++ test('test close()', function (t) { ++ t.throws( ++ db.close.bind(db), ++ /Error: close\(\) requires a callback argument/, ++ 'no-arg close() throws' ++ ) ++ t.throws( ++ db.close.bind(db, 'foo'), ++ /Error: close\(\) requires a callback argument/, ++ 'non-callback close() throws' ++ ) ++ ++ db.close(function (err) { ++ t.error(err) ++ t.end() ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.close(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/common.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/common.js +new file mode 100644 +index 0000000..cdc216b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/common.js +@@ -0,0 +1,37 @@ ++function testCommon (options) { ++ var factory = options.factory ++ var test = options.test ++ ++ if (typeof factory !== 'function') { ++ throw new TypeError('factory must be a function') ++ } ++ ++ if (typeof test !== 'function') { ++ throw new TypeError('test must be a function') ++ } ++ ++ return { ++ test: test, ++ factory: factory, ++ ++ // TODO (next major): remove ++ setUp: options.setUp || noopTest(), ++ tearDown: options.tearDown || noopTest(), ++ ++ // TODO (next major): use db.supports instead ++ bufferKeys: options.bufferKeys !== false, ++ createIfMissing: options.createIfMissing !== false, ++ errorIfExists: options.errorIfExists !== false, ++ snapshots: options.snapshots !== false, ++ seek: options.seek !== false, ++ clear: !!options.clear ++ } ++} ++ ++function noopTest () { ++ return function (t) { ++ t.end() ++ } ++} ++ ++module.exports = testCommon +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/del-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/del-test.js +new file mode 100644 +index 0000000..9dbea61 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/del-test.js +@@ -0,0 +1,92 @@ ++var db ++var verifyNotFoundError = require('./util').verifyNotFoundError ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test argument-less del() throws', function (t) { ++ t.throws( ++ db.del.bind(db), ++ /Error: del\(\) requires a callback argument/, ++ 'no-arg del() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 1-arg, del() throws', function (t) { ++ t.throws( ++ db.del.bind(db, 'foo'), ++ /Error: del\(\) requires a callback argument/, ++ 'callback-less, 1-arg del() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 3-arg, del() throws', function (t) { ++ t.throws( ++ db.del.bind(db, 'foo', {}), ++ /Error: del\(\) requires a callback argument/, ++ 'callback-less, 2-arg del() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test custom _serialize*', function (t) { ++ t.plan(3) ++ var db = testCommon.factory() ++ db._serializeKey = function (data) { return data } ++ db._del = function (key, options, callback) { ++ t.deepEqual(key, { foo: 'bar' }) ++ process.nextTick(callback) ++ } ++ db.open(function () { ++ db.del({ foo: 'bar' }, function (err) { ++ t.error(err) ++ db.close(t.error.bind(t)) ++ }) ++ }) ++ }) ++} ++ ++exports.del = function (test, testCommon) { ++ test('test simple del()', function (t) { ++ db.put('foo', 'bar', function (err) { ++ t.error(err) ++ db.del('foo', function (err) { ++ t.error(err) ++ db.get('foo', function (err, value) { ++ t.ok(err, 'entry properly deleted') ++ t.ok(typeof value === 'undefined', 'value is undefined') ++ t.ok(verifyNotFoundError(err), 'NotFound error') ++ t.end() ++ }) ++ }) ++ }) ++ }) ++ ++ test('test del on non-existent key', function (t) { ++ db.del('blargh', function (err) { ++ t.error(err) ++ t.end() ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.del(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/factory-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/factory-test.js +new file mode 100644 +index 0000000..4e1413f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/factory-test.js +@@ -0,0 +1,37 @@ ++var concat = require('level-concat-iterator') ++ ++module.exports = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ ++ test('testCommon.factory() returns a unique database', function (t) { ++ var db1 = testCommon.factory() ++ var db2 = testCommon.factory() ++ ++ function close () { ++ db1.close(function (err) { ++ t.error(err, 'no error while closing db1') ++ db2.close(function (err) { ++ t.error(err, 'no error while closing db2') ++ t.end() ++ }) ++ }) ++ } ++ ++ db1.open(function (err) { ++ t.error(err, 'no error while opening db1') ++ db2.open(function (err) { ++ t.error(err, 'no error while opening db2') ++ db1.put('key', 'value', function (err) { ++ t.error(err, 'put key in db1') ++ concat(db2.iterator(), function (err, entries) { ++ t.error(err, 'got items from db2') ++ t.same(entries, [], 'db2 should be empty') ++ close() ++ }) ++ }) ++ }) ++ }) ++ }) ++ ++ test('tearDown', testCommon.tearDown) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/get-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/get-test.js +new file mode 100644 +index 0000000..8b5190f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/get-test.js +@@ -0,0 +1,169 @@ ++var db ++var verifyNotFoundError = require('./util').verifyNotFoundError ++var isTypedArray = require('./util').isTypedArray ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test argument-less get() throws', function (t) { ++ t.throws( ++ db.get.bind(db), ++ /Error: get\(\) requires a callback argument/, ++ 'no-arg get() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 1-arg, get() throws', function (t) { ++ t.throws( ++ db.get.bind(db, 'foo'), ++ /Error: get\(\) requires a callback argument/, ++ 'callback-less, 1-arg get() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 3-arg, get() throws', function (t) { ++ t.throws( ++ db.get.bind(db, 'foo', {}), ++ /Error: get\(\) requires a callback argument/, ++ 'callback-less, 2-arg get() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test custom _serialize*', function (t) { ++ t.plan(3) ++ var db = testCommon.factory() ++ db._serializeKey = function (data) { return data } ++ db._get = function (key, options, callback) { ++ t.deepEqual(key, { foo: 'bar' }) ++ process.nextTick(callback) ++ } ++ db.open(function () { ++ db.get({ foo: 'bar' }, function (err) { ++ t.error(err) ++ db.close(t.error.bind(t)) ++ }) ++ }) ++ }) ++} ++ ++exports.get = function (test, testCommon) { ++ test('test simple get()', function (t) { ++ db.put('foo', 'bar', function (err) { ++ t.error(err) ++ db.get('foo', function (err, value) { ++ t.error(err) ++ t.ok(typeof value !== 'string', 'should not be string by default') ++ ++ var result ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) ++ } else { ++ t.ok(typeof Buffer !== 'undefined' && value instanceof Buffer) ++ try { ++ result = value.toString() ++ } catch (e) { ++ t.error(e, 'should not throw when converting value to a string') ++ } ++ } ++ ++ t.equal(result, 'bar') ++ ++ db.get('foo', {}, function (err, value) { // same but with {} ++ t.error(err) ++ t.ok(typeof value !== 'string', 'should not be string by default') ++ ++ var result ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) ++ } else { ++ t.ok(typeof Buffer !== 'undefined' && value instanceof Buffer) ++ try { ++ result = value.toString() ++ } catch (e) { ++ t.error(e, 'should not throw when converting value to a string') ++ } ++ } ++ ++ t.equal(result, 'bar') ++ ++ db.get('foo', { asBuffer: false }, function (err, value) { ++ t.error(err) ++ t.ok(typeof value === 'string', 'should be string if not buffer') ++ t.equal(value, 'bar') ++ t.end() ++ }) ++ }) ++ }) ++ }) ++ }) ++ ++ test('test simultaniously get()', function (t) { ++ db.put('hello', 'world', function (err) { ++ t.error(err) ++ var r = 0 ++ var done = function () { ++ if (++r === 20) { t.end() } ++ } ++ var i = 0 ++ var j = 0 ++ ++ for (; i < 10; ++i) { ++ db.get('hello', function (err, value) { ++ t.error(err) ++ t.equal(value.toString(), 'world') ++ done() ++ }) ++ } ++ ++ for (; j < 10; ++j) { ++ db.get('not found', function (err, value) { ++ t.ok(err, 'should error') ++ t.ok(verifyNotFoundError(err), 'should have correct error message') ++ t.ok(typeof value === 'undefined', 'value is undefined') ++ done() ++ }) ++ } ++ }) ++ }) ++ ++ test('test get() not found error is asynchronous', function (t) { ++ t.plan(5) ++ ++ db.put('hello', 'world', function (err) { ++ t.error(err) ++ ++ var async = false ++ ++ db.get('not found', function (err, value) { ++ t.ok(err, 'should error') ++ t.ok(verifyNotFoundError(err), 'should have correct error message') ++ t.ok(typeof value === 'undefined', 'value is undefined') ++ t.ok(async, 'callback is asynchronous') ++ }) ++ ++ async = true ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.get(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/index.js +new file mode 100644 +index 0000000..1ef97af +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/index.js +@@ -0,0 +1,50 @@ ++var common = require('./common') ++ ++function suite (options) { ++ var testCommon = common(options) ++ var test = testCommon.test ++ ++ require('./factory-test')(test, testCommon) ++ require('./manifest-test')(test, testCommon) ++ ++ require('./leveldown-test')(test, testCommon) ++ require('./open-test').all(test, testCommon) ++ require('./close-test').all(test, testCommon) ++ ++ if (testCommon.createIfMissing) { ++ require('./open-create-if-missing-test').all(test, testCommon) ++ } ++ ++ if (testCommon.errorIfExists) { ++ require('./open-error-if-exists-test').all(test, testCommon) ++ } ++ ++ require('./put-test').all(test, testCommon) ++ require('./get-test').all(test, testCommon) ++ require('./del-test').all(test, testCommon) ++ require('./put-get-del-test').all(test, testCommon) ++ ++ require('./batch-test').all(test, testCommon) ++ require('./chained-batch-test').all(test, testCommon) ++ ++ require('./iterator-test').all(test, testCommon) ++ require('./iterator-range-test').all(test, testCommon) ++ ++ if (testCommon.seek) { ++ require('./iterator-seek-test').all(test, testCommon) ++ } ++ ++ if (testCommon.snapshots) { ++ require('./iterator-snapshot-test').all(test, testCommon) ++ } else { ++ require('./iterator-no-snapshot-test').all(test, testCommon) ++ } ++ ++ if (testCommon.clear) { ++ require('./clear-test').all(test, testCommon) ++ require('./clear-range-test').all(test, testCommon) ++ } ++} ++ ++suite.common = common ++module.exports = suite +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-no-snapshot-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-no-snapshot-test.js +new file mode 100644 +index 0000000..c90df90 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-no-snapshot-test.js +@@ -0,0 +1,72 @@ ++var collectEntries = require('level-concat-iterator') ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++} ++ ++exports.noSnapshot = function (test, testCommon) { ++ function make (run) { ++ return function (t) { ++ var db = testCommon.factory() ++ var operations = [ ++ { type: 'put', key: 'a', value: 'a' }, ++ { type: 'put', key: 'b', value: 'b' }, ++ { type: 'put', key: 'c', value: 'c' } ++ ] ++ ++ db.open(function (err) { ++ t.ifError(err, 'no open error') ++ ++ db.batch(operations, function (err) { ++ t.ifError(err, 'no batch error') ++ ++ // For this test it is important that we don't read eagerly. ++ // NOTE: highWaterMark is not an abstract option atm, but ++ // it is supported by leveldown, rocksdb and others. ++ var it = db.iterator({ highWaterMark: 0 }) ++ ++ run(db, function (err) { ++ t.ifError(err, 'no run error') ++ verify(t, it, db) ++ }) ++ }) ++ }) ++ } ++ } ++ ++ function verify (t, it, db) { ++ collectEntries(it, function (err, entries) { ++ t.ifError(err, 'no iterator error') ++ ++ var kv = entries.map(function (entry) { ++ return entry.key.toString() + entry.value.toString() ++ }) ++ ++ if (kv.length === 3) { ++ t.same(kv, ['aa', 'bb', 'cc'], 'maybe supports snapshots') ++ } else { ++ t.same(kv, ['aa', 'cc'], 'ignores keys that have been deleted in the mean time') ++ } ++ ++ db.close(t.end.bind(t)) ++ }) ++ } ++ ++ test('delete key after creating iterator', make(function (db, done) { ++ db.del('b', done) ++ })) ++ ++ test('batch delete key after creating iterator', make(function (db, done) { ++ db.batch([{ type: 'del', key: 'b' }], done) ++ })) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.noSnapshot(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-range-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-range-test.js +new file mode 100644 +index 0000000..3d5c090 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-range-test.js +@@ -0,0 +1,381 @@ ++var collectEntries = require('level-concat-iterator') ++var xtend = require('xtend') ++ ++var db ++ ++var data = (function () { ++ var d = [] ++ var i = 0 ++ var k ++ for (; i < 100; i++) { ++ k = (i < 10 ? '0' : '') + i ++ d.push({ ++ key: k, ++ value: String(Math.random()) ++ }) ++ } ++ return d ++}()) ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(function () { ++ db.batch(data.map(function (d) { ++ return { ++ type: 'put', ++ key: d.key, ++ value: d.value ++ } ++ }), t.end.bind(t)) ++ }) ++ }) ++} ++ ++exports.range = function (test, testCommon) { ++ function rangeTest (name, opts, expected) { ++ opts.keyAsBuffer = false ++ opts.valueAsBuffer = false ++ test(name, function (t) { ++ collectEntries(db.iterator(opts), function (err, result) { ++ t.error(err) ++ t.is(result.length, expected.length, 'correct number of entries') ++ t.same(result, expected) ++ t.end() ++ }) ++ }) ++ ++ // Test the documented promise that in reverse mode, ++ // "the returned entries are the same, but in reverse". ++ if (!opts.reverse && !('limit' in opts)) { ++ var reverseOpts = xtend(opts, { reverse: true }) ++ ++ // Swap start & end options ++ if (('start' in opts) && ('end' in opts)) { ++ reverseOpts.end = opts.start ++ reverseOpts.start = opts.end ++ } else if ('start' in opts) { ++ reverseOpts.end = opts.start ++ delete reverseOpts.start ++ } else if ('end' in opts) { ++ reverseOpts.start = opts.end ++ delete reverseOpts.end ++ } ++ ++ rangeTest( ++ name + ' (flipped)', ++ reverseOpts, ++ expected.slice().reverse() ++ ) ++ } ++ } ++ ++ rangeTest('test full data collection', {}, data) ++ ++ rangeTest('test iterator with reverse=true', { ++ reverse: true ++ }, data.slice().reverse()) ++ ++ rangeTest('test iterator with gte=00', { ++ gte: '00' ++ }, data) ++ ++ rangeTest('test iterator with start=00 - legacy', { ++ start: '00' ++ }, data) ++ ++ rangeTest('test iterator with gte=50', { ++ gte: '50' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with start=50 - legacy', { ++ start: '50' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with lte=50 and reverse=true', { ++ lte: '50', ++ reverse: true ++ }, data.slice().reverse().slice(49)) ++ ++ rangeTest('test iterator with start=50 and reverse=true - legacy', { ++ start: '50', ++ reverse: true ++ }, data.slice().reverse().slice(49)) ++ ++ rangeTest('test iterator with gte=49.5 (midway)', { ++ gte: '49.5' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with start=49.5 (midway) - legacy', { ++ start: '49.5' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with gte=49999 (midway)', { ++ gte: '49999' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with start=49999 (midway) - legacy', { ++ start: '49999' ++ }, data.slice(50)) ++ ++ rangeTest('test iterator with lte=49.5 (midway) and reverse=true', { ++ lte: '49.5', ++ reverse: true ++ }, data.slice().reverse().slice(50)) ++ ++ rangeTest('test iterator with lt=49.5 (midway) and reverse=true', { ++ lt: '49.5', ++ reverse: true ++ }, data.slice().reverse().slice(50)) ++ ++ rangeTest('test iterator with lt=50 and reverse=true', { ++ lt: '50', ++ reverse: true ++ }, data.slice().reverse().slice(50)) ++ ++ rangeTest('test iterator with start=49.5 (midway) and reverse=true - legacy', { ++ start: '49.5', ++ reverse: true ++ }, data.slice().reverse().slice(50)) ++ ++ rangeTest('test iterator with lte=50', { ++ lte: '50' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with end=50 - legacy', { ++ end: '50' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with lte=50.5 (midway)', { ++ lte: '50.5' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with end=50.5 (midway) - legacy', { ++ end: '50.5' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with lte=50555 (midway)', { ++ lte: '50555' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with lt=50555 (midway)', { ++ lt: '50555' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with end=50555 (midway) - legacy', { ++ end: '50555' ++ }, data.slice(0, 51)) ++ ++ rangeTest('test iterator with gte=50.5 (midway) and reverse=true', { ++ gte: '50.5', ++ reverse: true ++ }, data.slice().reverse().slice(0, 49)) ++ ++ rangeTest('test iterator with gt=50.5 (midway) and reverse=true', { ++ gt: '50.5', ++ reverse: true ++ }, data.slice().reverse().slice(0, 49)) ++ ++ rangeTest('test iterator with end=50.5 (midway) and reverse=true - legacy', { ++ end: '50.5', ++ reverse: true ++ }, data.slice().reverse().slice(0, 49)) ++ ++ rangeTest('test iterator with gt=50 and reverse=true', { ++ gt: '50', ++ reverse: true ++ }, data.slice().reverse().slice(0, 49)) ++ ++ // end='0', starting key is actually '00' so it should avoid it ++ rangeTest('test iterator with lte=0', { ++ lte: '0' ++ }, []) ++ ++ // end='0', starting key is actually '00' so it should avoid it ++ rangeTest('test iterator with lt=0', { ++ lt: '0' ++ }, []) ++ ++ // end='0', starting key is actually '00' so it should avoid it ++ rangeTest('test iterator with end=0 - legacy', { ++ end: '0' ++ }, []) ++ ++ rangeTest('test iterator with gte=30 and lte=70', { ++ gte: '30', ++ lte: '70' ++ }, data.slice(30, 71)) ++ ++ rangeTest('test iterator with gt=29 and lt=71', { ++ gt: '29', ++ lt: '71' ++ }, data.slice(30, 71)) ++ ++ rangeTest('test iterator with start=30 and end=70 - legacy', { ++ start: '30', ++ end: '70' ++ }, data.slice(30, 71)) ++ ++ rangeTest('test iterator with gte=30 and lte=70 and reverse=true', { ++ lte: '70', ++ gte: '30', ++ reverse: true ++ }, data.slice().reverse().slice(29, 70)) ++ ++ rangeTest('test iterator with gt=29 and lt=71 and reverse=true', { ++ lt: '71', ++ gt: '29', ++ reverse: true ++ }, data.slice().reverse().slice(29, 70)) ++ ++ rangeTest('test iterator with start=70 and end=30 and reverse=true - legacy', { ++ start: '70', ++ end: '30', ++ reverse: true ++ }, data.slice().reverse().slice(29, 70)) ++ ++ rangeTest('test iterator with limit=20', { ++ limit: 20 ++ }, data.slice(0, 20)) ++ ++ rangeTest('test iterator with limit=20 and gte=20', { ++ limit: 20, ++ gte: '20' ++ }, data.slice(20, 40)) ++ ++ rangeTest('test iterator with limit=20 and start=20 - legacy', { ++ limit: 20, ++ start: '20' ++ }, data.slice(20, 40)) ++ ++ rangeTest('test iterator with limit=20 and reverse=true', { ++ limit: 20, ++ reverse: true ++ }, data.slice().reverse().slice(0, 20)) ++ ++ rangeTest('test iterator with limit=20 and lte=79 and reverse=true', { ++ limit: 20, ++ lte: '79', ++ reverse: true ++ }, data.slice().reverse().slice(20, 40)) ++ ++ rangeTest('test iterator with limit=20 and start=79 and reverse=true - legacy', { ++ limit: 20, ++ start: '79', ++ reverse: true ++ }, data.slice().reverse().slice(20, 40)) ++ ++ // the default limit value from levelup is -1 ++ rangeTest('test iterator with limit=-1 should iterate over whole database', { ++ limit: -1 ++ }, data) ++ ++ rangeTest('test iterator with limit=0 should not iterate over anything', { ++ limit: 0 ++ }, []) ++ ++ rangeTest('test iterator with lte after limit', { ++ limit: 20, ++ lte: '50' ++ }, data.slice(0, 20)) ++ ++ rangeTest('test iterator with end after limit - legacy', { ++ limit: 20, ++ end: '50' ++ }, data.slice(0, 20)) ++ ++ rangeTest('test iterator with lte before limit', { ++ limit: 50, ++ lte: '19' ++ }, data.slice(0, 20)) ++ ++ rangeTest('test iterator with end before limit - legacy', { ++ limit: 50, ++ end: '19' ++ }, data.slice(0, 20)) ++ ++ rangeTest('test iterator with gte after database end', { ++ gte: '9a' ++ }, []) ++ ++ rangeTest('test iterator with gt after database end', { ++ gt: '9a' ++ }, []) ++ ++ rangeTest('test iterator with start after database end - legacy', { ++ start: '9a' ++ }, []) ++ ++ rangeTest('test iterator with lte after database end and reverse=true', { ++ lte: '9a', ++ reverse: true ++ }, data.slice().reverse()) ++ ++ rangeTest('test iterator with start after database end and reverse=true - legacy', { ++ start: '9a', ++ reverse: true ++ }, data.slice().reverse()) ++ ++ rangeTest('test iterator with lt after database end', { ++ lt: 'a' ++ }, data.slice()) ++ ++ rangeTest('test iterator with end after database end - legacy', { ++ end: 'a' ++ }, data.slice()) ++ ++ rangeTest('test iterator with lt at database end', { ++ lt: data[data.length - 1].key ++ }, data.slice(0, -1)) ++ ++ rangeTest('test iterator with lte at database end', { ++ lte: data[data.length - 1].key ++ }, data.slice()) ++ ++ rangeTest('test iterator with end at database end - legacy', { ++ end: data[data.length - 1].key ++ }, data.slice()) ++ ++ rangeTest('test iterator with lt before database end', { ++ lt: data[data.length - 2].key ++ }, data.slice(0, -2)) ++ ++ rangeTest('test iterator with lte before database end', { ++ lte: data[data.length - 2].key ++ }, data.slice(0, -1)) ++ ++ rangeTest('test iterator with end before database end - legacy', { ++ end: data[data.length - 2].key ++ }, data.slice(0, -1)) ++ ++ rangeTest('test iterator with lte and gte after database and reverse=true', { ++ lte: '9b', ++ gte: '9a', ++ reverse: true ++ }, []) ++ ++ rangeTest('test iterator with lt and gt after database and reverse=true', { ++ lt: '9b', ++ gt: '9a', ++ reverse: true ++ }, []) ++ ++ rangeTest('test iterator with start and end after database and reverse=true - legacy', { ++ start: '9b', ++ end: '9a', ++ reverse: true ++ }, []) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.range(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-seek-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-seek-test.js +new file mode 100644 +index 0000000..d153c9a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-seek-test.js +@@ -0,0 +1,281 @@ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.sequence(test, testCommon) ++ exports.seek(test, testCommon) ++ exports.tearDown(test, testCommon) ++} ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++} ++ ++exports.sequence = function (test, testCommon) { ++ function make (name, testFn) { ++ test(name, function (t) { ++ var db = testCommon.factory() ++ var done = function (err) { ++ t.error(err, 'no error from done()') ++ ++ db.close(function (err) { ++ t.error(err, 'no error from close()') ++ t.end() ++ }) ++ } ++ ++ db.open(function (err) { ++ t.error(err, 'no error from open()') ++ testFn(db, t, done) ++ }) ++ }) ++ } ++ ++ make('iterator#seek() throws if next() has not completed', function (db, t, done) { ++ var ite = db.iterator() ++ var error ++ var async = false ++ ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error from next()') ++ t.ok(async, 'next is asynchronous') ++ ite.end(done) ++ }) ++ ++ async = true ++ ++ try { ++ ite.seek('two') ++ } catch (err) { ++ error = err.message ++ } ++ ++ t.is(error, 'cannot call seek() before next() has completed', 'got error') ++ }) ++ ++ make('iterator#seek() throws after end()', function (db, t, done) { ++ var ite = db.iterator() ++ ++ // TODO: why call next? Can't we end immediately? ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error from next()') ++ ++ ite.end(function (err) { ++ t.error(err, 'no error from end()') ++ var error ++ ++ try { ++ ite.seek('two') ++ } catch (err) { ++ error = err.message ++ } ++ ++ t.is(error, 'cannot call seek() after end()', 'got error') ++ done() ++ }) ++ }) ++ }) ++} ++ ++exports.seek = function (test, testCommon) { ++ function make (name, testFn) { ++ test(name, function (t) { ++ var db = testCommon.factory() ++ var done = function (err) { ++ t.error(err, 'no error from done()') ++ ++ db.close(function (err) { ++ t.error(err, 'no error from close()') ++ t.end() ++ }) ++ } ++ ++ db.open(function (err) { ++ t.error(err, 'no error from open()') ++ ++ db.batch([ ++ { type: 'put', key: 'one', value: '1' }, ++ { type: 'put', key: 'two', value: '2' }, ++ { type: 'put', key: 'three', value: '3' } ++ ], function (err) { ++ t.error(err, 'no error from batch()') ++ testFn(db, t, done) ++ }) ++ }) ++ }) ++ } ++ ++ make('iterator#seek() to string target', function (db, t, done) { ++ var ite = db.iterator() ++ ite.seek('two') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error') ++ t.same(key.toString(), 'two', 'key matches') ++ t.same(value.toString(), '2', 'value matches') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error') ++ t.same(key, undefined, 'end of iterator') ++ t.same(value, undefined, 'end of iterator') ++ ite.end(done) ++ }) ++ }) ++ }) ++ ++ if (testCommon.bufferKeys) { ++ make('iterator#seek() to buffer target', function (db, t, done) { ++ var ite = db.iterator() ++ ite.seek(Buffer.from('two')) ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error from next()') ++ t.equal(key.toString(), 'two', 'key matches') ++ t.equal(value.toString(), '2', 'value matches') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error from next()') ++ t.equal(key, undefined, 'end of iterator') ++ t.equal(value, undefined, 'end of iterator') ++ ite.end(done) ++ }) ++ }) ++ }) ++ } ++ ++ make('iterator#seek() on reverse iterator', function (db, t, done) { ++ var ite = db.iterator({ reverse: true, limit: 1 }) ++ ite.seek('three!') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error') ++ t.same(key.toString(), 'three', 'key matches') ++ t.same(value.toString(), '3', 'value matches') ++ ite.end(done) ++ }) ++ }) ++ ++ make('iterator#seek() to out of range target', function (db, t, done) { ++ var ite = db.iterator() ++ ite.seek('zzz') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error') ++ t.same(key, undefined, 'end of iterator') ++ t.same(value, undefined, 'end of iterator') ++ ite.end(done) ++ }) ++ }) ++ ++ make('iterator#seek() on reverse iterator to out of range target', function (db, t, done) { ++ var ite = db.iterator({ reverse: true }) ++ ite.seek('zzz') ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error') ++ t.same(key.toString(), 'two') ++ t.same(value.toString(), '2') ++ ite.end(done) ++ }) ++ }) ++ ++ test('iterator#seek() respects range', function (t) { ++ var db = testCommon.factory() ++ ++ db.open(function (err) { ++ t.error(err, 'no error from open()') ++ ++ // Can't use Array.fill() because IE ++ var ops = [] ++ ++ for (var i = 0; i < 10; i++) { ++ ops.push({ type: 'put', key: String(i), value: String(i) }) ++ } ++ ++ db.batch(ops, function (err) { ++ t.error(err, 'no error from batch()') ++ ++ var pending = 0 ++ ++ expect({ gt: '5' }, '4', undefined) ++ expect({ gt: '5' }, '5', undefined) ++ expect({ gt: '5' }, '6', '6') ++ ++ expect({ gte: '5' }, '4', undefined) ++ expect({ gte: '5' }, '5', '5') ++ expect({ gte: '5' }, '6', '6') ++ ++ expect({ start: '5' }, '4', undefined) ++ expect({ start: '5' }, '5', '5') ++ expect({ start: '5' }, '6', '6') ++ ++ expect({ lt: '5' }, '4', '4') ++ expect({ lt: '5' }, '5', undefined) ++ expect({ lt: '5' }, '6', undefined) ++ ++ expect({ lte: '5' }, '4', '4') ++ expect({ lte: '5' }, '5', '5') ++ expect({ lte: '5' }, '6', undefined) ++ ++ expect({ end: '5' }, '4', '4') ++ expect({ end: '5' }, '5', '5') ++ expect({ end: '5' }, '6', undefined) ++ ++ expect({ lt: '5', reverse: true }, '4', '4') ++ expect({ lt: '5', reverse: true }, '5', undefined) ++ expect({ lt: '5', reverse: true }, '6', undefined) ++ ++ expect({ lte: '5', reverse: true }, '4', '4') ++ expect({ lte: '5', reverse: true }, '5', '5') ++ expect({ lte: '5', reverse: true }, '6', undefined) ++ ++ expect({ start: '5', reverse: true }, '4', '4') ++ expect({ start: '5', reverse: true }, '5', '5') ++ expect({ start: '5', reverse: true }, '6', undefined) ++ ++ expect({ gt: '5', reverse: true }, '4', undefined) ++ expect({ gt: '5', reverse: true }, '5', undefined) ++ expect({ gt: '5', reverse: true }, '6', '6') ++ ++ expect({ gte: '5', reverse: true }, '4', undefined) ++ expect({ gte: '5', reverse: true }, '5', '5') ++ expect({ gte: '5', reverse: true }, '6', '6') ++ ++ expect({ end: '5', reverse: true }, '4', undefined) ++ expect({ end: '5', reverse: true }, '5', '5') ++ expect({ end: '5', reverse: true }, '6', '6') ++ ++ expect({ gt: '7', lt: '8' }, '7', undefined) ++ expect({ gte: '7', lt: '8' }, '7', '7') ++ expect({ gte: '7', lt: '8' }, '8', undefined) ++ expect({ gt: '7', lte: '8' }, '8', '8') ++ ++ function expect (range, target, expected) { ++ pending++ ++ var ite = db.iterator(range) ++ ++ ite.seek(target) ++ ite.next(function (err, key, value) { ++ t.error(err, 'no error from next()') ++ ++ var json = JSON.stringify(range) ++ var msg = 'seek(' + target + ') on ' + json + ' yields ' + expected ++ ++ if (expected === undefined) { ++ t.equal(value, undefined, msg) ++ } else { ++ t.equal(value.toString(), expected, msg) ++ } ++ ++ ite.end(function (err) { ++ t.error(err, 'no error from end()') ++ if (!--pending) done() ++ }) ++ }) ++ } ++ ++ function done () { ++ db.close(function (err) { ++ t.error(err, 'no error from close()') ++ t.end() ++ }) ++ } ++ }) ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-snapshot-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-snapshot-test.js +new file mode 100644 +index 0000000..7c022b0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-snapshot-test.js +@@ -0,0 +1,89 @@ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++} ++ ++exports.snapshot = function (test, testCommon) { ++ function make (run) { ++ return function (t) { ++ var db = testCommon.factory() ++ ++ db.open(function (err) { ++ t.ifError(err, 'no open error') ++ ++ db.put('z', 'from snapshot', function (err) { ++ t.ifError(err, 'no put error') ++ ++ // For this test it is important that we don't read eagerly. ++ // NOTE: highWaterMark is not an abstract option atm, but ++ // it is supported by leveldown, rocksdb and others. ++ var it = db.iterator({ highWaterMark: 0 }) ++ ++ run(t, db, it, function end (err) { ++ t.ifError(err, 'no run error') ++ ++ it.end(function (err) { ++ t.ifError(err, 'no iterator end error') ++ db.close(t.end.bind(t)) ++ }) ++ }) ++ }) ++ }) ++ } ++ } ++ ++ test('delete key after snapshotting', make(function (t, db, it, end) { ++ db.del('z', function (err) { ++ t.ifError(err, 'no del error') ++ ++ it.next(function (err, key, value) { ++ t.ifError(err, 'no next error') ++ t.ok(key, 'got a key') ++ t.is(key.toString(), 'z', 'correct key') ++ t.is(value.toString(), 'from snapshot', 'correct value') ++ ++ end() ++ }) ++ }) ++ })) ++ ++ test('overwrite key after snapshotting', make(function (t, db, it, end) { ++ db.put('z', 'not from snapshot', function (err) { ++ t.ifError(err, 'no put error') ++ ++ it.next(function (err, key, value) { ++ t.ifError(err, 'no next error') ++ t.ok(key, 'got a key') ++ t.is(key.toString(), 'z', 'correct key') ++ t.is(value.toString(), 'from snapshot', 'correct value') ++ ++ end() ++ }) ++ }) ++ })) ++ ++ test('add key after snapshotting that sorts first', make(function (t, db, it, end) { ++ db.put('a', 'not from snapshot', function (err) { ++ t.ifError(err, 'no put error') ++ ++ it.next(function (err, key, value) { ++ t.ifError(err, 'no next error') ++ ++ t.ok(key, 'got a key') ++ t.is(key.toString(), 'z', 'correct key') ++ t.is(value.toString(), 'from snapshot', 'correct value') ++ ++ end() ++ }) ++ }) ++ })) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.snapshot(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-test.js +new file mode 100644 +index 0000000..8b82ff4 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-test.js +@@ -0,0 +1,172 @@ ++var db ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test iterator has db reference', function (t) { ++ var iterator = db.iterator() ++ t.ok(iterator.db === db) ++ iterator.end(t.end.bind(t)) ++ }) ++ ++ test('test argument-less iterator#next() throws', function (t) { ++ var iterator = db.iterator() ++ t.throws( ++ iterator.next.bind(iterator), ++ /Error: next\(\) requires a callback argument/, ++ 'no-arg iterator#next() throws' ++ ) ++ iterator.end(t.end.bind(t)) ++ }) ++ ++ test('test argument-less iterator#end() after next() throws', function (t) { ++ var iterator = db.iterator() ++ iterator.next(function () { ++ t.throws( ++ iterator.end.bind(iterator), ++ /Error: end\(\) requires a callback argument/, ++ 'no-arg iterator#end() throws' ++ ) ++ iterator.end(t.end.bind(t)) ++ }) ++ }) ++ ++ test('test argument-less iterator#end() throws', function (t) { ++ var iterator = db.iterator() ++ t.throws( ++ iterator.end.bind(iterator), ++ /Error: end\(\) requires a callback argument/, ++ 'no-arg iterator#end() throws' ++ ) ++ iterator.end(t.end.bind(t)) ++ }) ++ ++ test('test iterator#next returns this', function (t) { ++ var iterator = db.iterator() ++ var self = iterator.next(function () {}) ++ t.ok(iterator === self) ++ iterator.end(t.end.bind(t)) ++ }) ++} ++ ++exports.sequence = function (test, testCommon) { ++ test('test twice iterator#end() callback with error', function (t) { ++ var iterator = db.iterator() ++ iterator.end(function (err) { ++ t.error(err) ++ ++ var async = false ++ ++ iterator.end(function (err2) { ++ t.ok(err2, 'returned error') ++ t.is(err2.name, 'Error', 'correct error') ++ t.is(err2.message, 'end() already called on iterator') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ }) ++ ++ test('test iterator#next after iterator#end() callback with error', function (t) { ++ var iterator = db.iterator() ++ iterator.end(function (err) { ++ t.error(err) ++ ++ var async = false ++ ++ iterator.next(function (err2) { ++ t.ok(err2, 'returned error') ++ t.is(err2.name, 'Error', 'correct error') ++ t.is(err2.message, 'cannot call next() after end()', 'correct message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ }) ++ ++ test('test twice iterator#next() throws', function (t) { ++ var iterator = db.iterator() ++ iterator.next(function (err) { ++ t.error(err) ++ iterator.end(function (err) { ++ t.error(err) ++ t.end() ++ }) ++ }) ++ ++ var async = false ++ ++ iterator.next(function (err) { ++ t.ok(err, 'returned error') ++ t.is(err.name, 'Error', 'correct error') ++ t.is(err.message, 'cannot call next() before previous next() has completed') ++ t.ok(async, 'callback is asynchronous') ++ }) ++ ++ async = true ++ }) ++} ++ ++exports.iterator = function (test, testCommon) { ++ test('test simple iterator()', function (t) { ++ var data = [ ++ { type: 'put', key: 'foobatch1', value: 'bar1' }, ++ { type: 'put', key: 'foobatch2', value: 'bar2' }, ++ { type: 'put', key: 'foobatch3', value: 'bar3' } ++ ] ++ var idx = 0 ++ ++ db.batch(data, function (err) { ++ t.error(err) ++ var iterator = db.iterator() ++ var fn = function (err, key, value) { ++ t.error(err) ++ if (key && value) { ++ t.ok(Buffer.isBuffer(key), 'key argument is a Buffer') ++ t.ok(Buffer.isBuffer(value), 'value argument is a Buffer') ++ t.is(key.toString(), data[idx].key, 'correct key') ++ t.is(value.toString(), data[idx].value, 'correct value') ++ process.nextTick(next) ++ idx++ ++ } else { // end ++ t.ok(typeof err === 'undefined', 'err argument is undefined') ++ t.ok(typeof key === 'undefined', 'key argument is undefined') ++ t.ok(typeof value === 'undefined', 'value argument is undefined') ++ t.is(idx, data.length, 'correct number of entries') ++ iterator.end(function () { ++ t.end() ++ }) ++ } ++ } ++ var next = function () { ++ iterator.next(fn) ++ } ++ ++ next() ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.sequence(test, testCommon) ++ exports.iterator(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/leveldown-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/leveldown-test.js +new file mode 100644 +index 0000000..a640768 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/leveldown-test.js +@@ -0,0 +1,12 @@ ++module.exports = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ ++ test('test database open method exists', function (t) { ++ var db = testCommon.factory() ++ t.ok(db, 'database object returned') ++ t.ok(typeof db.open === 'function', 'open() function exists') ++ t.end() ++ }) ++ ++ test('tearDown', testCommon.tearDown) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/manifest-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/manifest-test.js +new file mode 100644 +index 0000000..104c843 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/manifest-test.js +@@ -0,0 +1,21 @@ ++var suite = require('level-supports/test') ++ ++module.exports = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ ++ suite(test, testCommon) ++ ++ test('manifest has status', function (t) { ++ var db = testCommon.factory() ++ t.is(db.supports.status, true) ++ ++ // The semantics of not opening or closing a new db are unclear ++ // atm, so let's open it before closing, like every other test. ++ db.open(function (err) { ++ t.ifError(err, 'no open error') ++ db.close(t.end.bind(t)) ++ }) ++ }) ++ ++ test('tearDown', testCommon.tearDown) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-create-if-missing-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-create-if-missing-test.js +new file mode 100644 +index 0000000..388281a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-create-if-missing-test.js +@@ -0,0 +1,29 @@ ++exports.setUp = function (test, testCommon) { ++ test('setUp', testCommon.setUp) ++} ++ ++exports.createIfMissing = function (test, testCommon) { ++ test('test database open createIfMissing:false', function (t) { ++ var db = testCommon.factory() ++ var async = false ++ ++ db.open({ createIfMissing: false }, function (err) { ++ t.ok(err, 'error') ++ t.ok(/does not exist/.test(err.message), 'error is about dir not existing') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.createIfMissing(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-error-if-exists-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-error-if-exists-test.js +new file mode 100644 +index 0000000..96d3cd1 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-error-if-exists-test.js +@@ -0,0 +1,37 @@ ++exports.setUp = function (test, testCommon) { ++ test('setUp', testCommon.setUp) ++} ++ ++exports.errorIfExists = function (test, testCommon) { ++ test('test database open errorIfExists:true', function (t) { ++ var db = testCommon.factory() ++ ++ db.open({}, function (err) { ++ t.error(err) ++ db.close(function (err) { ++ t.error(err) ++ ++ var async = false ++ ++ db.open({ createIfMissing: false, errorIfExists: true }, function (err) { ++ t.ok(err, 'error') ++ t.ok(/exists/.test(err.message), 'error is about already existing') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.errorIfExists(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-test.js +new file mode 100644 +index 0000000..9d7ef2b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-test.js +@@ -0,0 +1,79 @@ ++exports.setUp = function (test, testCommon) { ++ test('setUp', testCommon.setUp) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test database open no-arg throws', function (t) { ++ var db = testCommon.factory() ++ t.throws( ++ db.open.bind(db), ++ /Error: open\(\) requires a callback argument/, ++ 'no-arg open() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 1-arg, open() throws', function (t) { ++ var db = testCommon.factory() ++ t.throws( ++ db.open.bind(db, {}), ++ /Error: open\(\) requires a callback argument/, ++ 'callback-less, 1-arg open() throws' ++ ) ++ t.end() ++ }) ++} ++ ++exports.open = function (test, testCommon) { ++ test('test database open, no options', function (t) { ++ var db = testCommon.factory() ++ ++ // default createIfMissing=true, errorIfExists=false ++ db.open(function (err) { ++ t.error(err) ++ db.close(function () { ++ t.end() ++ }) ++ }) ++ }) ++ ++ test('test database open, options and callback', function (t) { ++ var db = testCommon.factory() ++ ++ // default createIfMissing=true, errorIfExists=false ++ db.open({}, function (err) { ++ t.error(err) ++ db.close(function () { ++ t.end() ++ }) ++ }) ++ }) ++ ++ test('test database open, close and open', function (t) { ++ var db = testCommon.factory() ++ ++ db.open(function (err) { ++ t.error(err) ++ db.close(function (err) { ++ t.error(err) ++ db.open(function (err) { ++ t.error(err) ++ db.close(function () { ++ t.end() ++ }) ++ }) ++ }) ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', testCommon.tearDown) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.open(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-get-del-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-get-del-test.js +new file mode 100644 +index 0000000..b8fc3ee +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-get-del-test.js +@@ -0,0 +1,176 @@ ++'use strict' ++ ++var db ++var verifyNotFoundError = require('./util').verifyNotFoundError ++var testBuffer = Buffer.from('testbuffer') ++ ++function makeGetDelErrorTests (test, type, key, expectedError) { ++ test('test get() with ' + type + ' causes error', function (t) { ++ var async = false ++ ++ db.get(key, function (err) { ++ t.ok(err, 'has error') ++ t.ok(err instanceof Error) ++ t.ok(err.message.match(expectedError), 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ ++ test('test del() with ' + type + ' causes error', function (t) { ++ var async = false ++ ++ db.del(key, function (err) { ++ t.ok(err, 'has error') ++ t.ok(err instanceof Error) ++ t.ok(err.message.match(expectedError), 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++} ++ ++function makePutErrorTest (test, type, key, value, expectedError) { ++ test('test put() with ' + type + ' causes error', function (t) { ++ var async = false ++ ++ db.put(key, value, function (err) { ++ t.ok(err, 'has error') ++ t.ok(err instanceof Error) ++ t.ok(err.message.match(expectedError), 'correct error message') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++} ++ ++function makePutGetDelSuccessfulTest (test, type, key, value, expectedResult) { ++ var hasExpectedResult = arguments.length === 5 ++ test('test put()/get()/del() with ' + type, function (t) { ++ db.put(key, value, function (err) { ++ t.error(err) ++ db.get(key, function (err, _value) { ++ t.error(err, 'no error, has key/value for `' + type + '`') ++ t.ok(Buffer.isBuffer(_value), 'is a Buffer') ++ var result = _value ++ if (hasExpectedResult) { ++ t.equal(result.toString(), expectedResult) ++ } else { ++ if (result != null) { result = _value.toString() } ++ if (value != null) { value = value.toString() } ++ t.equals(result, value) ++ } ++ db.del(key, function (err) { ++ t.error(err, 'no error, deleted key/value for `' + type + '`') ++ ++ var async = false ++ ++ db.get(key, function (err, value) { ++ t.ok(err, 'entry properly deleted') ++ t.ok(verifyNotFoundError(err), 'should have correct error message') ++ t.equal(typeof value, 'undefined', 'value is undefined') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++ }) ++ }) ++ }) ++ }) ++} ++ ++function makeErrorKeyTest (test, type, key, expectedError) { ++ makeGetDelErrorTests(test, type, key, expectedError) ++ makePutErrorTest(test, type, key, 'foo', expectedError) ++} ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.errorKeys = function (test, testCommon) { ++ makeErrorKeyTest(test, 'null key', null, /key cannot be `null` or `undefined`/) ++ makeErrorKeyTest(test, 'undefined key', undefined, /key cannot be `null` or `undefined`/) ++ makeErrorKeyTest(test, 'empty String key', '', /key cannot be an empty String/) ++ makeErrorKeyTest(test, 'empty Buffer key', Buffer.alloc(0), /key cannot be an empty \w*Buffer/) ++ makeErrorKeyTest(test, 'empty Array key', [], /key cannot be an empty Array/) ++} ++ ++exports.errorValues = function (test, testCommon) { ++ makePutErrorTest(test, 'null value', 'key', null, /value cannot be `null` or `undefined`/) ++ makePutErrorTest(test, 'undefined value', 'key', undefined, /value cannot be `null` or `undefined`/) ++} ++ ++exports.nonErrorKeys = function (test, testCommon) { ++ // valid falsey keys ++ makePutGetDelSuccessfulTest(test, '`0` key', 0, 'foo 0') ++ ++ // standard String key ++ makePutGetDelSuccessfulTest( ++ test ++ , 'long String key' ++ , 'some long string that I\'m using as a key for this unit test, cross your fingers human, we\'re going in!' ++ , 'foo' ++ ) ++ ++ if (testCommon.bufferKeys) { ++ makePutGetDelSuccessfulTest(test, 'Buffer key', testBuffer, 'foo') ++ } ++ ++ // non-empty Array as a value ++ makePutGetDelSuccessfulTest(test, 'Array value', 'foo', [1, 2, 3, 4]) ++} ++ ++exports.nonErrorValues = function (test, testCommon) { ++ // valid falsey values ++ makePutGetDelSuccessfulTest(test, '`false` value', 'foo false', false) ++ makePutGetDelSuccessfulTest(test, '`0` value', 'foo 0', 0) ++ makePutGetDelSuccessfulTest(test, '`NaN` value', 'foo NaN', NaN) ++ ++ // all of the following result in an empty-string value: ++ makePutGetDelSuccessfulTest(test, 'empty String value', 'foo', '', '') ++ makePutGetDelSuccessfulTest(test, 'empty Buffer value', 'foo', Buffer.alloc(0), '') ++ ++ // note that an implementation may return the value as an array ++ makePutGetDelSuccessfulTest(test, 'empty Array value', 'foo', [], '') ++ ++ // standard String value ++ makePutGetDelSuccessfulTest( ++ test ++ , 'long String value' ++ , 'foo' ++ , 'some long string that I\'m using as a key for this unit test, cross your fingers human, we\'re going in!' ++ ) ++ ++ // standard Buffer value ++ makePutGetDelSuccessfulTest(test, 'Buffer value', 'foo', testBuffer) ++ ++ // non-empty Array as a key ++ makePutGetDelSuccessfulTest(test, 'Array key', [1, 2, 3, 4], 'foo') ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.errorKeys(test, testCommon) ++ exports.errorValues(test, testCommon) ++ exports.nonErrorKeys(test, testCommon) ++ exports.nonErrorValues(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-test.js +new file mode 100644 +index 0000000..bc77206 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-test.js +@@ -0,0 +1,108 @@ ++var db ++var isTypedArray = require('./util').isTypedArray ++ ++exports.setUp = function (test, testCommon) { ++ test('setUp common', testCommon.setUp) ++ test('setUp db', function (t) { ++ db = testCommon.factory() ++ db.open(t.end.bind(t)) ++ }) ++} ++ ++exports.args = function (test, testCommon) { ++ test('test argument-less put() throws', function (t) { ++ t.throws( ++ db.put.bind(db), ++ /Error: put\(\) requires a callback argument/, ++ 'no-arg put() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 1-arg, put() throws', function (t) { ++ t.throws( ++ db.put.bind(db, 'foo'), ++ /Error: put\(\) requires a callback argument/, ++ 'callback-less, 1-arg put() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 2-arg, put() throws', function (t) { ++ t.throws( ++ db.put.bind(db, 'foo', 'bar'), ++ /Error: put\(\) requires a callback argument/, ++ 'callback-less, 2-arg put() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test callback-less, 3-arg, put() throws', function (t) { ++ t.throws( ++ db.put.bind(db, 'foo', 'bar', {}), ++ /Error: put\(\) requires a callback argument/, ++ 'callback-less, 3-arg put() throws' ++ ) ++ t.end() ++ }) ++ ++ test('test _serialize object', function (t) { ++ t.plan(3) ++ var db = testCommon.factory() ++ db._put = function (key, value, opts, callback) { ++ t.ok(key) ++ t.ok(value) ++ process.nextTick(callback) ++ } ++ db.put({}, {}, function (err, val) { ++ t.error(err) ++ }) ++ }) ++ ++ test('test custom _serialize*', function (t) { ++ t.plan(4) ++ var db = testCommon.factory() ++ db._serializeKey = db._serializeValue = function (data) { return data } ++ db._put = function (key, value, options, callback) { ++ t.deepEqual(key, { foo: 'bar' }) ++ t.deepEqual(value, { beep: 'boop' }) ++ process.nextTick(callback) ++ } ++ db.open(function () { ++ db.put({ foo: 'bar' }, { beep: 'boop' }, function (err) { ++ t.error(err) ++ db.close(t.error.bind(t)) ++ }) ++ }) ++ }) ++} ++ ++exports.put = function (test, testCommon) { ++ test('test simple put()', function (t) { ++ db.put('foo', 'bar', function (err) { ++ t.error(err) ++ db.get('foo', function (err, value) { ++ t.error(err) ++ var result = value.toString() ++ if (isTypedArray(value)) { ++ result = String.fromCharCode.apply(null, new Uint16Array(value)) + } ++ t.equal(result, 'bar') ++ t.end() ++ }) ++ }) ++ }) ++} ++ ++exports.tearDown = function (test, testCommon) { ++ test('tearDown', function (t) { ++ db.close(testCommon.tearDown.bind(null, t)) ++ }) ++} ++ ++exports.all = function (test, testCommon) { ++ exports.setUp(test, testCommon) ++ exports.args(test, testCommon) ++ exports.put(test, testCommon) ++ exports.tearDown(test, testCommon) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/self.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/self.js +new file mode 100644 +index 0000000..8dfc625 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/self.js +@@ -0,0 +1,1017 @@ ++'use strict' ++ ++var test = require('tape') ++var sinon = require('sinon') ++var inherits = require('util').inherits ++var AbstractLevelDOWN = require('../').AbstractLevelDOWN ++var AbstractIterator = require('../').AbstractIterator ++var AbstractChainedBatch = require('../').AbstractChainedBatch ++ ++var testCommon = require('./common')({ ++ test: test, ++ clear: true, ++ factory: function () { ++ return new AbstractLevelDOWN() ++ } ++}) ++ ++var rangeOptions = ['gt', 'gte', 'lt', 'lte'] ++var legacyRangeOptions = ['start', 'end'] ++ ++// Test the suite itself as well as the default implementation, ++// excluding noop operations that can't pass the test suite. ++ ++require('./leveldown-test')(test, testCommon) ++require('./manifest-test')(test, testCommon) ++require('./open-test').all(test, testCommon) ++ ++require('./open-create-if-missing-test').setUp(test, testCommon) ++require('./open-create-if-missing-test').tearDown(test, testCommon) ++ ++require('./open-error-if-exists-test').setUp(test, testCommon) ++require('./open-error-if-exists-test').tearDown(test, testCommon) ++ ++require('./del-test').setUp(test, testCommon) ++require('./del-test').args(test, testCommon) ++ ++require('./get-test').setUp(test, testCommon) ++require('./get-test').args(test, testCommon) ++ ++require('./put-test').setUp(test, testCommon) ++require('./put-test').args(test, testCommon) ++ ++require('./put-get-del-test').setUp(test, testCommon) ++require('./put-get-del-test').errorKeys(test, testCommon) ++require('./put-get-del-test').tearDown(test, testCommon) ++ ++require('./batch-test').setUp(test, testCommon) ++require('./batch-test').args(test, testCommon) ++ ++require('./chained-batch-test').setUp(test, testCommon) ++require('./chained-batch-test').args(test, testCommon) ++require('./chained-batch-test').tearDown(test, testCommon) ++ ++require('./close-test').all(test, testCommon) ++ ++require('./iterator-test').setUp(test, testCommon) ++require('./iterator-test').args(test, testCommon) ++require('./iterator-test').sequence(test, testCommon) ++require('./iterator-test').tearDown(test, testCommon) ++ ++require('./iterator-range-test').setUp(test, testCommon) ++require('./iterator-range-test').tearDown(test, testCommon) ++ ++require('./iterator-snapshot-test').setUp(test, testCommon) ++require('./iterator-snapshot-test').tearDown(test, testCommon) ++ ++require('./iterator-no-snapshot-test').setUp(test, testCommon) ++require('./iterator-no-snapshot-test').tearDown(test, testCommon) ++ ++require('./iterator-seek-test').setUp(test, testCommon) ++require('./iterator-seek-test').sequence(test, testCommon) ++require('./iterator-seek-test').tearDown(test, testCommon) ++ ++require('./clear-test').setUp(test, testCommon) ++require('./clear-test').args(test, testCommon) ++require('./clear-test').tearDown(test, testCommon) ++ ++require('./clear-range-test').setUp(test, testCommon) ++require('./clear-range-test').tearDown(test, testCommon) ++ ++function implement (ctor, methods) { ++ function Test () { ++ ctor.apply(this, arguments) ++ } ++ ++ inherits(Test, ctor) ++ ++ for (var k in methods) { ++ Test.prototype[k] = methods[k] ++ } ++ ++ return Test ++} ++ ++/** ++ * Extensibility ++ */ ++ ++test('test core extensibility', function (t) { ++ var Test = implement(AbstractLevelDOWN) ++ var test = new Test() ++ t.equal(test.status, 'new', 'status is new') ++ t.end() ++}) ++ ++test('test key/value serialization', function (t) { ++ var Test = implement(AbstractLevelDOWN) ++ var test = new Test() ++ ++ ;['', {}, null, undefined, Buffer.alloc(0)].forEach(function (v) { ++ t.ok(test._serializeKey(v) === v, '_serializeKey is an identity function') ++ t.ok(test._serializeValue(v) === v, '_serializeValue is an identity function') ++ }) ++ ++ t.end() ++}) ++ ++test('test open() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { createIfMissing: true, errorIfExists: false } ++ var Test = implement(AbstractLevelDOWN, { _open: spy }) ++ var test = new Test('foobar') ++ ++ test.open(expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _open() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _open() was correct') ++ t.equal(spy.getCall(0).args.length, 2, 'got two arguments') ++ t.deepEqual(spy.getCall(0).args[0], expectedOptions, 'got default options argument') ++ ++ test.open({ options: 1 }, expectedCb) ++ ++ expectedOptions.options = 1 ++ ++ t.equal(spy.callCount, 2, 'got _open() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _open() was correct') ++ t.equal(spy.getCall(1).args.length, 2, 'got two arguments') ++ t.deepEqual(spy.getCall(1).args[0], expectedOptions, 'got expected options argument') ++ t.end() ++}) ++ ++test('test close() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var Test = implement(AbstractLevelDOWN, { _close: spy }) ++ var test = new Test('foobar') ++ ++ test.close(expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _close() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _close() was correct') ++ t.equal(spy.getCall(0).args.length, 1, 'got one arguments') ++ t.end() ++}) ++ ++test('test get() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { asBuffer: true } ++ var expectedKey = 'a key' ++ var Test = implement(AbstractLevelDOWN, { _get: spy }) ++ var test = new Test('foobar') ++ ++ test.get(expectedKey, expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _get() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _get() was correct') ++ t.equal(spy.getCall(0).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') ++ t.deepEqual(spy.getCall(0).args[1], expectedOptions, 'got default options argument') ++ t.equal(spy.getCall(0).args[2], expectedCb, 'got expected cb argument') ++ ++ test.get(expectedKey, { options: 1 }, expectedCb) ++ ++ expectedOptions.options = 1 ++ ++ t.equal(spy.callCount, 2, 'got _get() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _get() was correct') ++ t.equal(spy.getCall(1).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') ++ t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') ++ t.equal(spy.getCall(1).args[2], expectedCb, 'got expected cb argument') ++ t.end() ++}) ++ ++test('test del() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { options: 1 } ++ var expectedKey = 'a key' ++ var Test = implement(AbstractLevelDOWN, { _del: spy }) ++ var test = new Test('foobar') ++ ++ test.del(expectedKey, expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _del() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _del() was correct') ++ t.equal(spy.getCall(0).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') ++ t.deepEqual(spy.getCall(0).args[1], {}, 'got blank options argument') ++ t.equal(spy.getCall(0).args[2], expectedCb, 'got expected cb argument') ++ ++ test.del(expectedKey, expectedOptions, expectedCb) ++ ++ t.equal(spy.callCount, 2, 'got _del() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _del() was correct') ++ t.equal(spy.getCall(1).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') ++ t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') ++ t.equal(spy.getCall(1).args[2], expectedCb, 'got expected cb argument') ++ t.end() ++}) ++ ++test('test put() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { options: 1 } ++ var expectedKey = 'a key' ++ var expectedValue = 'a value' ++ var Test = implement(AbstractLevelDOWN, { _put: spy }) ++ var test = new Test('foobar') ++ ++ test.put(expectedKey, expectedValue, expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _put() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _put() was correct') ++ t.equal(spy.getCall(0).args.length, 4, 'got four arguments') ++ t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') ++ t.equal(spy.getCall(0).args[1], expectedValue, 'got expected value argument') ++ t.deepEqual(spy.getCall(0).args[2], {}, 'got blank options argument') ++ t.equal(spy.getCall(0).args[3], expectedCb, 'got expected cb argument') ++ ++ test.put(expectedKey, expectedValue, expectedOptions, expectedCb) ++ ++ t.equal(spy.callCount, 2, 'got _put() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _put() was correct') ++ t.equal(spy.getCall(1).args.length, 4, 'got four arguments') ++ t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') ++ t.equal(spy.getCall(1).args[1], expectedValue, 'got expected value argument') ++ t.deepEqual(spy.getCall(1).args[2], expectedOptions, 'got blank options argument') ++ t.equal(spy.getCall(1).args[3], expectedCb, 'got expected cb argument') ++ t.end() ++}) ++ ++test('test batch([]) (array-form) extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { options: 1 } ++ var expectedArray = [ ++ { type: 'put', key: '1', value: '1' }, ++ { type: 'del', key: '2' } ++ ] ++ var Test = implement(AbstractLevelDOWN, { _batch: spy }) ++ var test = new Test('foobar') ++ ++ test.batch(expectedArray, expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _batch() was correct') ++ t.equal(spy.getCall(0).args.length, 3, 'got three arguments') ++ t.deepEqual(spy.getCall(0).args[0], expectedArray, 'got expected array argument') ++ t.deepEqual(spy.getCall(0).args[1], {}, 'got expected options argument') ++ t.equal(spy.getCall(0).args[2], expectedCb, 'got expected callback argument') ++ ++ test.batch(expectedArray, expectedOptions, expectedCb) ++ ++ t.equal(spy.callCount, 2, 'got _batch() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _batch() was correct') ++ t.equal(spy.getCall(1).args.length, 3, 'got three arguments') ++ t.deepEqual(spy.getCall(1).args[0], expectedArray, 'got expected array argument') ++ t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') ++ t.equal(spy.getCall(1).args[2], expectedCb, 'got expected callback argument') ++ ++ test.batch(expectedArray, null, expectedCb) ++ ++ t.equal(spy.callCount, 3, 'got _batch() call') ++ t.equal(spy.getCall(2).thisValue, test, '`this` on _batch() was correct') ++ t.equal(spy.getCall(2).args.length, 3, 'got three arguments') ++ t.deepEqual(spy.getCall(2).args[0], expectedArray, 'got expected array argument') ++ t.ok(spy.getCall(2).args[1], 'options should not be null') ++ t.equal(spy.getCall(2).args[2], expectedCb, 'got expected callback argument') ++ t.end() ++}) ++ ++test('test batch([]) (array-form) with empty array is asynchronous', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { _batch: spy }) ++ var test = new Test() ++ var async = false ++ ++ test.batch([], function (err) { ++ t.ifError(err, 'no error') ++ t.ok(async, 'callback is asynchronous') ++ ++ // Assert that asynchronicity is provided by batch() rather than _batch() ++ t.is(spy.callCount, 0, '_batch() call was bypassed') ++ t.end() ++ }) ++ ++ async = true ++}) ++ ++test('test chained batch() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var expectedOptions = { options: 1 } ++ var Test = implement(AbstractLevelDOWN, { _batch: spy }) ++ var test = new Test('foobar') ++ ++ test.batch().put('foo', 'bar').del('bang').write(expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _batch() was correct') ++ t.equal(spy.getCall(0).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(0).args[0].length, 2, 'got expected array argument') ++ t.deepEqual(spy.getCall(0).args[0][0], { type: 'put', key: 'foo', value: 'bar' }, 'got expected array argument[0]') ++ t.deepEqual(spy.getCall(0).args[0][1], { type: 'del', key: 'bang' }, 'got expected array argument[1]') ++ t.deepEqual(spy.getCall(0).args[1], {}, 'got expected options argument') ++ t.equal(spy.getCall(0).args[2], expectedCb, 'got expected callback argument') ++ ++ test.batch().put('foo', 'bar').del('bang').write(expectedOptions, expectedCb) ++ ++ t.equal(spy.callCount, 2, 'got _batch() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _batch() was correct') ++ t.equal(spy.getCall(1).args.length, 3, 'got three arguments') ++ t.equal(spy.getCall(1).args[0].length, 2, 'got expected array argument') ++ t.deepEqual(spy.getCall(1).args[0][0], { type: 'put', key: 'foo', value: 'bar' }, 'got expected array argument[0]') ++ t.deepEqual(spy.getCall(1).args[0][1], { type: 'del', key: 'bang' }, 'got expected array argument[1]') ++ t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') ++ t.equal(spy.getCall(1).args[2], expectedCb, 'got expected callback argument') ++ ++ t.end() ++}) ++ ++test('test chained batch() with no operations is asynchronous', function (t) { ++ var Test = implement(AbstractLevelDOWN, {}) ++ var test = new Test() ++ var async = false ++ ++ test.batch().write(function (err) { ++ t.ifError(err, 'no error') ++ t.ok(async, 'callback is asynchronous') ++ t.end() ++ }) ++ ++ async = true ++}) ++ ++test('test chained batch() (custom _chainedBatch) extensibility', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { _chainedBatch: spy }) ++ var test = new Test('foobar') ++ ++ test.batch() ++ ++ t.equal(spy.callCount, 1, 'got _chainedBatch() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _chainedBatch() was correct') ++ ++ test.batch() ++ ++ t.equal(spy.callCount, 2, 'got _chainedBatch() call') ++ t.equal(spy.getCall(1).thisValue, test, '`this` on _chainedBatch() was correct') ++ ++ t.end() ++}) ++ ++test('test AbstractChainedBatch extensibility', function (t) { ++ var Test = implement(AbstractChainedBatch) ++ var db = {} ++ var test = new Test(db) ++ t.ok(test.db === db, 'instance has db reference') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch expects a db', function (t) { ++ t.plan(1) ++ ++ var Test = implement(AbstractChainedBatch) ++ ++ try { ++ Test() ++ } catch (err) { ++ t.is(err.message, 'First argument must be an abstract-leveldown compliant store') ++ } ++}) ++ ++test('test AbstractChainedBatch#write() extensibility', function (t) { ++ var spy = sinon.spy() ++ var spycb = sinon.spy() ++ var Test = implement(AbstractChainedBatch, { _write: spy }) ++ var test = new Test({ test: true }) ++ ++ test.write(spycb) ++ ++ t.equal(spy.callCount, 1, 'got _write() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _write() was correct') ++ t.equal(spy.getCall(0).args.length, 2, 'got two arguments') ++ t.same(spy.getCall(0).args[0], {}, 'got options') ++ // awkward here cause of nextTick & an internal wrapped cb ++ t.equal(typeof spy.getCall(0).args[1], 'function', 'got a callback function') ++ t.equal(spycb.callCount, 0, 'spycb not called') ++ spy.getCall(0).args[1]() ++ t.equal(spycb.callCount, 1, 'spycb called, i.e. was our cb argument') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch#write() extensibility with null options', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractChainedBatch, { _write: spy }) ++ var test = new Test({ test: true }) ++ ++ test.write(null, function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _write() call') ++ t.same(spy.getCall(0).args[0], {}, 'got options') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch#write() extensibility with options', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractChainedBatch, { _write: spy }) ++ var test = new Test({ test: true }) ++ ++ test.write({ test: true }, function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _write() call') ++ t.same(spy.getCall(0).args[0], { test: true }, 'got options') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch#put() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedKey = 'key' ++ var expectedValue = 'value' ++ var Test = implement(AbstractChainedBatch, { _put: spy }) ++ var test = new Test(testCommon.factory()) ++ var returnValue = test.put(expectedKey, expectedValue) ++ ++ t.equal(spy.callCount, 1, 'got _put call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _put() was correct') ++ t.equal(spy.getCall(0).args.length, 2, 'got two arguments') ++ t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') ++ t.equal(spy.getCall(0).args[1], expectedValue, 'got expected value argument') ++ t.equal(returnValue, test, 'get expected return value') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch#del() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedKey = 'key' ++ var Test = implement(AbstractChainedBatch, { _del: spy }) ++ var test = new Test(testCommon.factory()) ++ var returnValue = test.del(expectedKey) ++ ++ t.equal(spy.callCount, 1, 'got _del call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _del() was correct') ++ t.equal(spy.getCall(0).args.length, 1, 'got one argument') ++ t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') ++ t.equal(returnValue, test, 'get expected return value') ++ t.end() ++}) ++ ++test('test AbstractChainedBatch#clear() extensibility', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractChainedBatch, { _clear: spy }) ++ var test = new Test(testCommon.factory()) ++ var returnValue = test.clear() ++ ++ t.equal(spy.callCount, 1, 'got _clear call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _clear() was correct') ++ t.equal(spy.getCall(0).args.length, 0, 'got zero arguments') ++ t.equal(returnValue, test, 'get expected return value') ++ t.end() ++}) ++ ++test('test iterator() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedOptions = { ++ options: 1, ++ reverse: false, ++ keys: true, ++ values: true, ++ limit: -1, ++ keyAsBuffer: true, ++ valueAsBuffer: true ++ } ++ var Test = implement(AbstractLevelDOWN, { _iterator: spy }) ++ var test = new Test('foobar') ++ ++ test.iterator({ options: 1 }) ++ ++ t.equal(spy.callCount, 1, 'got _iterator() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _iterator() was correct') ++ t.equal(spy.getCall(0).args.length, 1, 'got one arguments') ++ t.deepEqual(spy.getCall(0).args[0], expectedOptions, 'got expected options argument') ++ t.end() ++}) ++ ++test('test AbstractIterator extensibility', function (t) { ++ var Test = implement(AbstractIterator) ++ var db = {} ++ var test = new Test(db) ++ t.ok(test.db === db, 'instance has db reference') ++ t.end() ++}) ++ ++test('test AbstractIterator#next() extensibility', function (t) { ++ var spy = sinon.spy() ++ var spycb = sinon.spy() ++ var Test = implement(AbstractIterator, { _next: spy }) ++ var test = new Test({}) ++ ++ test.next(spycb) ++ ++ t.equal(spy.callCount, 1, 'got _next() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _next() was correct') ++ t.equal(spy.getCall(0).args.length, 1, 'got one arguments') ++ // awkward here cause of nextTick & an internal wrapped cb ++ t.equal(typeof spy.getCall(0).args[0], 'function', 'got a callback function') ++ t.equal(spycb.callCount, 0, 'spycb not called') ++ spy.getCall(0).args[0]() ++ t.equal(spycb.callCount, 1, 'spycb called, i.e. was our cb argument') ++ t.end() ++}) ++ ++test('test AbstractIterator#end() extensibility', function (t) { ++ var spy = sinon.spy() ++ var expectedCb = function () {} ++ var Test = implement(AbstractIterator, { _end: spy }) ++ var test = new Test({}) ++ ++ test.end(expectedCb) ++ ++ t.equal(spy.callCount, 1, 'got _end() call') ++ t.equal(spy.getCall(0).thisValue, test, '`this` on _end() was correct') ++ t.equal(spy.getCall(0).args.length, 1, 'got one arguments') ++ t.equal(spy.getCall(0).args[0], expectedCb, 'got expected cb argument') ++ t.end() ++}) ++ ++test('test clear() extensibility', function (t) { ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { _clear: spy }) ++ var db = new Test() ++ var callback = function () {} ++ ++ call([callback], { reverse: false, limit: -1 }) ++ call([null, callback], { reverse: false, limit: -1 }) ++ call([undefined, callback], { reverse: false, limit: -1 }) ++ call([{ custom: 1 }, callback], { custom: 1, reverse: false, limit: -1 }) ++ call([{ reverse: true, limit: 0 }, callback], { reverse: true, limit: 0 }) ++ call([{ reverse: 1 }, callback], { reverse: true, limit: -1 }) ++ call([{ reverse: null }, callback], { reverse: false, limit: -1 }) ++ ++ function call (args, expectedOptions) { ++ db.clear.apply(db, args) ++ ++ t.is(spy.callCount, 1, 'got _clear() call') ++ t.is(spy.getCall(0).thisValue, db, '`this` on _clear() was correct') ++ t.is(spy.getCall(0).args.length, 2, 'got two arguments') ++ t.same(spy.getCall(0).args[0], expectedOptions, 'got expected options argument') ++ t.is(spy.getCall(0).args[1], callback, 'got expected callback argument') ++ ++ spy.resetHistory() ++ } ++ ++ t.end() ++}) ++ ++test('test serialization extensibility (put)', function (t) { ++ t.plan(5) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _put: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ ++ _serializeValue: function (value) { ++ t.equal(value, 'nope') ++ return 'bar' ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.put('no', 'nope', function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _put() call') ++ t.equal(spy.getCall(0).args[0], 'foo', 'got expected key argument') ++ t.equal(spy.getCall(0).args[1], 'bar', 'got expected value argument') ++}) ++ ++test('test serialization extensibility (del)', function (t) { ++ t.plan(3) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _del: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.fail('should not be called') ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.del('no', function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _del() call') ++ t.equal(spy.getCall(0).args[0], 'foo', 'got expected key argument') ++ ++ t.end() ++}) ++ ++test('test serialization extensibility (batch array put)', function (t) { ++ t.plan(5) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _batch: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.equal(value, 'nope') ++ return 'bar' ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.batch([{ type: 'put', key: 'no', value: 'nope' }], function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).args[0][0].key, 'foo', 'got expected key') ++ t.equal(spy.getCall(0).args[0][0].value, 'bar', 'got expected value') ++}) ++ ++test('test serialization extensibility (batch chain put)', function (t) { ++ t.plan(5) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _batch: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.equal(value, 'nope') ++ return 'bar' ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.batch().put('no', 'nope').write(function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).args[0][0].key, 'foo', 'got expected key') ++ t.equal(spy.getCall(0).args[0][0].value, 'bar', 'got expected value') ++}) ++ ++test('test serialization extensibility (batch array del)', function (t) { ++ t.plan(3) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _batch: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.fail('should not be called') ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.batch([{ type: 'del', key: 'no' }], function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).args[0][0].key, 'foo', 'got expected key') ++}) ++ ++test('test serialization extensibility (batch chain del)', function (t) { ++ t.plan(3) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _batch: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.fail('should not be called') ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.batch().del('no').write(function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).args[0][0].key, 'foo', 'got expected key') ++}) ++ ++test('test serialization extensibility (batch array is not mutated)', function (t) { ++ t.plan(7) ++ ++ var spy = sinon.spy() ++ var Test = implement(AbstractLevelDOWN, { ++ _batch: spy, ++ _serializeKey: function (key) { ++ t.equal(key, 'no') ++ return 'foo' ++ }, ++ _serializeValue: function (value) { ++ t.equal(value, 'nope') ++ return 'bar' ++ } ++ }) ++ ++ var test = new Test('foobar') ++ var op = { type: 'put', key: 'no', value: 'nope' } ++ ++ test.batch([op], function () {}) ++ ++ t.equal(spy.callCount, 1, 'got _batch() call') ++ t.equal(spy.getCall(0).args[0][0].key, 'foo', 'got expected key') ++ t.equal(spy.getCall(0).args[0][0].value, 'bar', 'got expected value') ++ ++ t.equal(op.key, 'no', 'did not mutate input key') ++ t.equal(op.value, 'nope', 'did not mutate input value') ++}) ++ ++test('test serialization extensibility (iterator range options)', function (t) { ++ t.plan(2) ++ ++ function Test () { ++ AbstractLevelDOWN.call(this) ++ } ++ ++ inherits(Test, AbstractLevelDOWN) ++ ++ Test.prototype._serializeKey = function (key) { ++ t.is(key, 'input') ++ return 'output' ++ } ++ ++ Test.prototype._iterator = function (options) { ++ return new Iterator(this, options) ++ } ++ ++ function Iterator (db, options) { ++ AbstractIterator.call(this, db) ++ t.is(options.gt, 'output') ++ } ++ ++ inherits(Iterator, AbstractIterator) ++ ++ var test = new Test() ++ test.iterator({ gt: 'input' }) ++}) ++ ++test('test serialization extensibility (iterator seek)', function (t) { ++ t.plan(3) ++ ++ var spy = sinon.spy() ++ var TestIterator = implement(AbstractIterator, { _seek: spy }) ++ ++ var Test = implement(AbstractLevelDOWN, { ++ _iterator: function () { ++ return new TestIterator(this) ++ }, ++ _serializeKey: function (key) { ++ t.equal(key, 'target') ++ return 'serialized' ++ } ++ }) ++ ++ var test = new Test('foobar') ++ var it = test.iterator() ++ ++ it.seek('target') ++ ++ t.equal(spy.callCount, 1, 'got _seek() call') ++ t.equal(spy.getCall(0).args[0], 'serialized', 'got expected target argument') ++}) ++ ++test('test serialization extensibility (clear range options)', function (t) { ++ t.plan(rangeOptions.length * 2) ++ ++ rangeOptions.forEach(function (key) { ++ var Test = implement(AbstractLevelDOWN, { ++ _serializeKey: function (key) { ++ t.is(key, 'input') ++ return 'output' ++ }, ++ _clear: function (options, callback) { ++ t.is(options[key], 'output') ++ } ++ }) ++ ++ var db = new Test() ++ var options = {} ++ ++ options[key] = 'input' ++ db.clear(options, function () {}) ++ }) ++}) ++ ++test('clear() does not delete empty or nullish range options', function (t) { ++ var rangeValues = [Buffer.alloc(0), '', null, undefined] ++ ++ t.plan(rangeOptions.length * rangeValues.length) ++ ++ rangeValues.forEach(function (value) { ++ var Test = implement(AbstractLevelDOWN, { ++ _clear: function (options, callback) { ++ rangeOptions.forEach(function (key) { ++ t.ok(key in options, key + ' option should not be deleted') ++ }) ++ } ++ }) ++ ++ var db = new Test() ++ var options = {} ++ ++ rangeOptions.forEach(function (key) { ++ options[key] = value ++ }) ++ ++ db.clear(options, function () {}) ++ }) ++}) ++ ++test('.status', function (t) { ++ t.plan(5) ++ ++ t.test('empty prototype', function (t) { ++ var Test = implement(AbstractLevelDOWN) ++ var test = new Test('foobar') ++ ++ t.equal(test.status, 'new') ++ ++ test.open(function (err) { ++ t.error(err) ++ t.equal(test.status, 'open') ++ ++ test.close(function (err) { ++ t.error(err) ++ t.equal(test.status, 'closed') ++ t.end() ++ }) ++ }) ++ }) ++ ++ t.test('open error', function (t) { ++ var Test = implement(AbstractLevelDOWN, { ++ _open: function (options, cb) { ++ cb(new Error()) ++ } ++ }) ++ ++ var test = new Test('foobar') ++ ++ test.open(function (err) { ++ t.ok(err) ++ t.equal(test.status, 'new') ++ t.end() ++ }) ++ }) ++ ++ t.test('close error', function (t) { ++ var Test = implement(AbstractLevelDOWN, { ++ _close: function (cb) { ++ cb(new Error()) ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.open(function () { ++ test.close(function (err) { ++ t.ok(err) ++ t.equal(test.status, 'open') ++ t.end() ++ }) ++ }) ++ }) ++ ++ t.test('open', function (t) { ++ var Test = implement(AbstractLevelDOWN, { ++ _open: function (options, cb) { ++ process.nextTick(cb) ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.open(function (err) { ++ t.error(err) ++ t.equal(test.status, 'open') ++ t.end() ++ }) ++ t.equal(test.status, 'opening') ++ }) ++ ++ t.test('close', function (t) { ++ var Test = implement(AbstractLevelDOWN, { ++ _close: function (cb) { ++ process.nextTick(cb) ++ } ++ }) ++ ++ var test = new Test('foobar') ++ test.open(function (err) { ++ t.error(err) ++ test.close(function (err) { ++ t.error(err) ++ t.equal(test.status, 'closed') ++ t.end() ++ }) ++ t.equal(test.status, 'closing') ++ }) ++ }) ++}) ++ ++test('_setupIteratorOptions', function (t) { ++ var keys = legacyRangeOptions.concat(rangeOptions) ++ var db = new AbstractLevelDOWN() ++ ++ function setupOptions (constrFn) { ++ var options = {} ++ keys.forEach(function (key) { ++ options[key] = constrFn() ++ }) ++ return options ++ } ++ ++ function verifyOptions (t, options) { ++ keys.forEach(function (key) { ++ t.ok(key in options, key + ' option should not be deleted') ++ }) ++ t.end() ++ } ++ ++ t.plan(6) ++ ++ t.test('default options', function (t) { ++ t.same(db._setupIteratorOptions(), { ++ reverse: false, ++ keys: true, ++ values: true, ++ limit: -1, ++ keyAsBuffer: true, ++ valueAsBuffer: true ++ }, 'correct defaults') ++ t.end() ++ }) ++ ++ t.test('set options', function (t) { ++ t.same(db._setupIteratorOptions({ ++ reverse: false, ++ keys: false, ++ values: false, ++ limit: 20, ++ keyAsBuffer: false, ++ valueAsBuffer: false ++ }), { ++ reverse: false, ++ keys: false, ++ values: false, ++ limit: 20, ++ keyAsBuffer: false, ++ valueAsBuffer: false ++ }, 'options set correctly') ++ t.end() ++ }) ++ ++ t.test('does not delete empty buffers', function (t) { ++ var options = setupOptions(function () { return Buffer.from('') }) ++ keys.forEach(function (key) { ++ t.is(Buffer.isBuffer(options[key]), true, 'should be buffer') ++ t.is(options[key].length, 0, 'should be empty') ++ }) ++ verifyOptions(t, db._setupIteratorOptions(options)) ++ }) ++ ++ t.test('does not delete empty strings', function (t) { ++ var options = setupOptions(function () { return '' }) ++ keys.forEach(function (key) { ++ t.is(typeof options[key], 'string', 'should be string') ++ t.is(options[key].length, 0, 'should be empty') ++ }) ++ verifyOptions(t, db._setupIteratorOptions(options)) ++ }) ++ ++ t.test('does not delete null', function (t) { ++ var options = setupOptions(function () { return null }) ++ keys.forEach(function (key) { ++ t.is(options[key], null, 'should be null') ++ }) ++ verifyOptions(t, db._setupIteratorOptions(options)) ++ }) ++ ++ t.test('does not delete undefined', function (t) { ++ var options = setupOptions(function () { return undefined }) ++ keys.forEach(function (key) { ++ t.is(options[key], undefined, 'should be undefined') ++ }) ++ verifyOptions(t, db._setupIteratorOptions(options)) ++ }) ++}) +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/util.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/util.js +new file mode 100644 +index 0000000..db65626 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/util.js +@@ -0,0 +1,10 @@ ++var nfre = /NotFound/i ++ ++exports.verifyNotFoundError = function verifyNotFoundError (err) { ++ return nfre.test(err.message) || nfre.test(err.name) ++} ++ ++exports.isTypedArray = function isTypedArray (value) { ++ return (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) || ++ (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/LICENSE b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/LICENSE +new file mode 100644 +index 0000000..56fce08 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/LICENSE +@@ -0,0 +1,21 @@ ++The MIT License (MIT) ++ ++Copyright (c) 2017 Mathias Buus ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++THE SOFTWARE. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/README.md +new file mode 100644 +index 0000000..99944b7 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/README.md +@@ -0,0 +1,56 @@ ++# node-gyp-build ++ ++> Build tool and bindings loader for [`node-gyp`][node-gyp] that supports prebuilds. ++ ++``` ++npm install node-gyp-build ++``` ++ ++[![Build Status](https://travis-ci.org/prebuild/node-gyp-build.svg?branch=master)](https://travis-ci.org/prebuild/node-gyp-build) ++ ++Use together with [`prebuildify`][prebuildify] to easily support prebuilds for your native modules. ++ ++## Usage ++ ++> **Note.** Prebuild names have changed in [`prebuildify@3`][prebuildify] and `node-gyp-build@4`. Please see the documentation below. ++ ++`node-gyp-build` works similar to [`node-gyp build`][node-gyp] except that it will check if a build or prebuild is present before rebuilding your project. ++ ++It's main intended use is as an npm install script and bindings loader for native modules that bundle prebuilds using [`prebuildify`][prebuildify]. ++ ++First add `node-gyp-build` as an install script to your native project ++ ++``` js ++{ ++ ... ++ "scripts": { ++ "install": "node-gyp-build" ++ } ++} ++``` ++ ++Then in your `index.js`, instead of using the [`bindings`](https://www.npmjs.com/package/bindings) module use `node-gyp-build` to load your binding. ++ ++``` js ++var binding = require('node-gyp-build')(__dirname) ++``` ++ ++If you do these two things and bundle prebuilds with [`prebuildify`][prebuildify] your native module will work for most platforms ++without having to compile on install time AND will work in both node and electron without the need to recompile between usage. ++ ++Users can override `node-gyp-build` and force compiling by doing `npm install --build-from-source`. ++ ++## Supported prebuild names ++ ++If so desired you can bundle more specific flavors, for example `musl` builds to support Alpine, or targeting a numbered ARM architecture version. ++ ++These prebuilds can be bundled in addition to generic prebuilds; `node-gyp-build` will try to find the most specific flavor first. Prebuild filenames are composed of _tags_. The runtime tag takes precedence, as does an `abi` tag over `napi`. For more details on tags, please see [`prebuildify`][prebuildify]. ++ ++Values for the `libc` and `armv` tags are auto-detected but can be overridden through the `LIBC` and `ARM_VERSION` environment variables, respectively. ++ ++## License ++ ++MIT ++ ++[prebuildify]: https://github.com/prebuild/prebuildify ++[node-gyp]: https://www.npmjs.com/package/node-gyp +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/bin.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/bin.js +new file mode 100755 +index 0000000..bb322d4 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/bin.js +@@ -0,0 +1,75 @@ ++#!/usr/bin/env node ++ ++var proc = require('child_process') ++var os = require('os') ++var path = require('path') ++ ++if (!buildFromSource()) { ++ proc.exec('node-gyp-build-test', function (err, stdout, stderr) { ++ if (err) { ++ if (verbose()) console.error(stderr) ++ preinstall() ++ } ++ }) ++} else { ++ preinstall() ++} ++ ++function build () { ++ var args = [os.platform() === 'win32' ? 'node-gyp.cmd' : 'node-gyp', 'rebuild'] ++ ++ try { ++ args = [ ++ process.execPath, ++ path.join(require.resolve('node-gyp/package.json'), '..', require('node-gyp/package.json').bin['node-gyp']), ++ 'rebuild' ++ ] ++ } catch (_) {} ++ ++ proc.spawn(args[0], args.slice(1), { stdio: 'inherit' }).on('exit', function (code) { ++ if (code || !process.argv[3]) process.exit(code) ++ exec(process.argv[3]).on('exit', function (code) { ++ process.exit(code) ++ }) ++ }) ++} ++ ++function preinstall () { ++ if (!process.argv[2]) return build() ++ exec(process.argv[2]).on('exit', function (code) { ++ if (code) process.exit(code) ++ build() ++ }) ++} ++ ++function exec (cmd) { ++ if (process.platform !== 'win32') { ++ var shell = os.platform() === 'android' ? 'sh' : '/bin/sh' ++ return proc.spawn(shell, ['-c', '--', cmd], { ++ stdio: 'inherit' ++ }) ++ } ++ ++ return proc.spawn(process.env.comspec || 'cmd.exe', ['/s', '/c', '"' + cmd + '"'], { ++ windowsVerbatimArguments: true, ++ stdio: 'inherit' ++ }) ++} ++ ++function buildFromSource () { ++ return hasFlag('--build-from-source') ++} ++ ++function verbose () { ++ return hasFlag('--verbose') ++} ++ ++function hasFlag (flag) { ++ if (!process.env.npm_config_argv) return false ++ ++ try { ++ return JSON.parse(process.env.npm_config_argv).original.indexOf(flag) !== -1 ++ } catch (_) { ++ return false ++ } ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/build-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/build-test.js +new file mode 100755 +index 0000000..b6622a5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/build-test.js +@@ -0,0 +1,19 @@ ++#!/usr/bin/env node ++ ++process.env.NODE_ENV = 'test' ++ ++var path = require('path') ++var test = null ++ ++try { ++ var pkg = require(path.join(process.cwd(), 'package.json')) ++ if (pkg.name && process.env[pkg.name.toUpperCase().replace(/-/g, '_')]) { ++ process.exit(0) ++ } ++ test = pkg.prebuild.test ++} catch (err) { ++ // do nothing ++} ++ ++if (test) require(path.join(process.cwd(), test)) ++else require('./')() +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/index.js +new file mode 100644 +index 0000000..cd189dd +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/index.js +@@ -0,0 +1,154 @@ ++var fs = require('fs') ++var path = require('path') ++var os = require('os') ++ ++// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' ++var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line ++ ++var prebuildsOnly = !!process.env.PREBUILDS_ONLY ++var abi = process.versions.modules // TODO: support old node where this is undef ++var runtime = isElectron() ? 'electron' : 'node' ++var arch = os.arch() ++var platform = os.platform() ++var libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc') ++var armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : process.config.variables.arm_version) || '' ++var uv = (process.versions.uv || '').split('.')[0] ++ ++module.exports = load ++ ++function load (dir) { ++ return runtimeRequire(load.path(dir)) ++} ++ ++load.path = function (dir) { ++ dir = path.resolve(dir || '.') ++ ++ try { ++ var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_') ++ if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD'] ++ } catch (err) {} ++ ++ if (!prebuildsOnly) { ++ var release = getFirst(path.join(dir, 'build/Release'), matchBuild) ++ if (release) return release ++ ++ var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild) ++ if (debug) return debug ++ } ++ ++ // Find most specific flavor first ++ var prebuilds = path.join(dir, 'prebuilds', platform + '-' + arch) ++ var parsed = readdirSync(prebuilds).map(parseTags) ++ var candidates = parsed.filter(matchTags(runtime, abi)) ++ var winner = candidates.sort(compareTags(runtime))[0] ++ if (winner) return path.join(prebuilds, winner.file) ++ ++ var target = [ ++ 'platform=' + platform, ++ 'arch=' + arch, ++ 'runtime=' + runtime, ++ 'abi=' + abi, ++ 'uv=' + uv, ++ armv ? 'armv=' + armv : '', ++ 'libc=' + libc ++ ].filter(Boolean).join(' ') ++ ++ throw new Error('No native build was found for ' + target) ++} ++ ++function readdirSync (dir) { ++ try { ++ return fs.readdirSync(dir) ++ } catch (err) { ++ return [] ++ } ++} ++ ++function getFirst (dir, filter) { ++ var files = readdirSync(dir).filter(filter) ++ return files[0] && path.join(dir, files[0]) ++} ++ ++function matchBuild (name) { ++ return /\.node$/.test(name) ++} ++ ++function parseTags (file) { ++ var arr = file.split('.') ++ var extension = arr.pop() ++ var tags = { file: file, specificity: 0 } ++ ++ if (extension !== 'node') return ++ ++ for (var i = 0; i < arr.length; i++) { ++ var tag = arr[i] ++ ++ if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') { ++ tags.runtime = tag ++ } else if (tag === 'napi') { ++ tags.napi = true ++ } else if (tag.slice(0, 3) === 'abi') { ++ tags.abi = tag.slice(3) ++ } else if (tag.slice(0, 2) === 'uv') { ++ tags.uv = tag.slice(2) ++ } else if (tag.slice(0, 4) === 'armv') { ++ tags.armv = tag.slice(4) ++ } else if (tag === 'glibc' || tag === 'musl') { ++ tags.libc = tag ++ } else { ++ continue ++ } ++ ++ tags.specificity++ ++ } ++ ++ return tags ++} ++ ++function matchTags (runtime, abi) { ++ return function (tags) { ++ if (tags == null) return false ++ if (tags.runtime !== runtime && !runtimeAgnostic(tags)) return false ++ if (tags.abi !== abi && !tags.napi) return false ++ if (tags.uv && tags.uv !== uv) return false ++ if (tags.armv && tags.armv !== armv) return false ++ if (tags.libc && tags.libc !== libc) return false ++ ++ return true ++ } ++} ++ ++function runtimeAgnostic (tags) { ++ return tags.runtime === 'node' && tags.napi ++} ++ ++function compareTags (runtime) { ++ // Precedence: non-agnostic runtime, abi over napi, then by specificity. ++ return function (a, b) { ++ if (a.runtime !== b.runtime) { ++ return a.runtime === runtime ? -1 : 1 ++ } else if (a.abi !== b.abi) { ++ return a.abi ? -1 : 1 ++ } else if (a.specificity !== b.specificity) { ++ return a.specificity > b.specificity ? -1 : 1 ++ } else { ++ return 0 ++ } ++ } ++} ++ ++function isElectron () { ++ if (process.versions && process.versions.electron) return true ++ if (process.env.ELECTRON_RUN_AS_NODE) return true ++ return typeof window !== 'undefined' && window.process && window.process.type === 'renderer' ++} ++ ++function isAlpine (platform) { ++ return platform === 'linux' && fs.existsSync('/etc/alpine-release') ++} ++ ++// Exposed for unit tests ++// TODO: move to lib ++load.parseTags = parseTags ++load.matchTags = matchTags ++load.compareTags = compareTags +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/optional.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/optional.js +new file mode 100755 +index 0000000..8daa04a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/optional.js +@@ -0,0 +1,7 @@ ++#!/usr/bin/env node ++ ++/* ++I am only useful as an install script to make node-gyp not compile for purely optional native deps ++*/ ++ ++process.exit(0) +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/LICENSE b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/LICENSE +new file mode 100644 +index 0000000..cb757e5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/LICENSE +@@ -0,0 +1,21 @@ ++The MIT License (MIT) ++ ++Copyright (c) 2018 Mathias Buus ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++THE SOFTWARE. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/README.md +new file mode 100644 +index 0000000..1691845 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/README.md +@@ -0,0 +1,277 @@ ++# napi-macros ++ ++Set of utility macros to make writing [N-API](https://nodejs.org/dist/latest-v9.x/docs/api/n-api.html) modules a little easier. ++ ++``` ++npm install napi-macros ++``` + - String ndk_bundle_path = android.ndkDirectory -- String standalone_toolchain = "${rootProject.buildDir}/standalone-toolchains/${temp_toolchain_name}" -- String npm_toolchain_add_to_path = "${rootProject.buildDir}/bin" -- String npm_toolchain_ar = "${standalone_toolchain}/bin/${temp_suffix}-ar" -- String npm_toolchain_cc = "${standalone_toolchain}/bin/${temp_suffix}-clang" -- String npm_toolchain_cxx = "${standalone_toolchain}/bin/${temp_suffix}-clang++" -- String npm_toolchain_link = "${standalone_toolchain}/bin/${temp_suffix}-clang++" -+ String toolchain_path = "${ndk_bundle_path}/toolchains/llvm/prebuilt/${temp_host_tag}" -+ String npm_toolchain_ar = "${toolchain_path}/bin/${temp_binutils_prefix}-ar" -+ String npm_toolchain_cc = "${toolchain_path}/bin/${temp_compiler_prefix}-clang" -+ String npm_toolchain_cxx = "${toolchain_path}/bin/${temp_compiler_prefix}-clang++" -+ String npm_toolchain_link = "${toolchain_path}/bin/${temp_compiler_prefix}-clang++" - String cargo_target_triple = cargo_build_target.toUpperCase().replaceAll('-', '_') - - String npm_gyp_defines = "target_arch=${temp_arch}" -@@ -358,16 +367,8 @@ if ("1".equals(shouldRebuildNativeModules)) { - } - } - -- task "MakeToolchain${abi_name}" (type:Exec) { -- description = "Building a native toolchain to compile nodejs-mobile native modules for ${abi_name}." -- executable = "${ndk_bundle_path}/build/tools/make-standalone-toolchain.sh" -- args "--toolchain=${temp_toolchain_name}-${temp_cc_ver}", "--arch=${temp_arch}", "--install-dir=${standalone_toolchain}", "--stl=libc++", "--force", "--platform=android-${_compileNativeModulesSdkVersion}" -- outputs.dir "${standalone_toolchain}" -- } -- - task "BuildNpmModules${abi_name}" (type:Exec) { - dependsOn "CopyNodeProjectAssets${abi_name}" -- dependsOn "MakeToolchain${abi_name}" - description = "Building native modules for ${abi_name}." - inputs.file "${rootProject.buildDir}/nodejs-native-assets-temp-build/nodejs-native-assets-${abi_name}/copy.timestamp" - outputs.dir "${rootProject.buildDir}/nodejs-native-assets-temp-build/nodejs-native-assets-${abi_name}/nodejs-project/" -@@ -398,7 +399,7 @@ if ("1".equals(shouldRebuildNativeModules)) { - environment ("CARGO_TARGET_${cargo_target_triple}_AR", "${npm_toolchain_ar}") - environment ("CARGO_TARGET_${cargo_target_triple}_LINKER", "${npm_toolchain_link}") - -- environment ('TOOLCHAIN',"${standalone_toolchain}") -+ environment ('TOOLCHAIN',"${toolchain_path}") - environment ('AR',"${npm_toolchain_ar}") - environment ('CC',"${npm_toolchain_cc}") - environment ('CXX',"${npm_toolchain_cxx}") ++Then add the following to your target in your binding.gyp file ++ ++``` ++"include_dirs": [ ++ " ++#include ++ ++NAPI_METHOD(times_two) { ++ NAPI_ARGV(1) ++ NAPI_ARGV_INT32(number, 0) ++ ++ number *= 2; ++ ++ NAPI_RETURN_INT32(number) ++} ++ ++NAPI_INIT() { ++ NAPI_EXPORT_FUNCTION(times_two) ++} ++``` ++ ++Full working example can be found in the [example/](https://github.com/mafintosh/napi-macros/tree/master/example) folder. ++ ++## API ++ ++#### `NAPI_INIT()` ++ ++Setup init boilerplate. Pass the function body after. ++ ++``` c ++static char *my_string = "hello"; ++ ++NAPI_INIT() { ++ EXPORT_STRING(my_string) ++} ++``` ++ ++#### `NAPI_METHOD(name)` ++ ++Setup method boilerplate. Pass the function body after. ++ ++``` c ++NAPI_METHOD(add) { ++ NAPI_ARGV(2) ++ NAPI_ARGV_INT32(a, 0) ++ NAPI_ARGV_INT32(b, 1) ++ ++ a = a + b ++ ++ NAPI_RETURN_INT32(a) ++} ++``` ++ ++#### `NAPI_ARGV(n)` ++ ++Setup up argv boilerplate. `n` is how many arguments you are expecting. ++Expects the `napi_env` to be in scope as `env` and the `napi_callback_info` to be in scope as `info`. ++ ++#### `NAPI_ARGV_BUFFER(name, index)` ++ ++Get a buffer out of the arguments at the corresponding index. ++Sets `char *name` and `size_t name_len` with the buffer and buffer length. ++ ++#### `NAPI_ARGV_BUFFER_CAST(type, name, index)` ++ ++Get a buffer out and cast the pointer to the specified type. ++Note that the type should include the pointer star, i.e. ++ ++``` c ++NAPI_ARGV_BUFFER_CAST(uv_udp_t *, handle, 0) ++``` ++ ++Will cast the 1st argument as `uv_udp_t` pointer. ++ ++#### `NAPI_ARGV_UINT32(name, index)` ++ ++Get an argument as a uint32. ++Will throw if argument is not the right type. ++ ++#### `NAPI_ARGV_INT32(name, index)` ++ ++Get an argument as an int32. ++Will throw if argument is not the right type. ++ ++#### `NAPI_ARGV_UTF8(name, length, index)` ++ ++Get an argument as a utf8 string. ++ ++`name` will be a `char[length]` array. ++ ++Will throw if argument is not the right type. ++ ++#### `NAPI_ARGV_UTF8_MALLOC(name, index)` ++ ++Get an argument as a utf8 string. ++ ++`name` will be a `char*`. ++ ++Like `NAPI_ARGV_UTF8()` but allocates `name` on the heap using `malloc()`, which should be `free()`'d after usage. ++ ++#### `NAPI_BUFFER_CAST(type, name, var)` ++ ++Same as `NAPI_ARGV_BUFFER_CAST` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_BUFFER(name, var)` ++ ++Same as `NAPI_ARGV_BUFFER` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_UTF8(name, size, var)` ++ ++Same as `NAPI_ARGV_UTF8` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_UTF8_MALLOC(name, var)` ++ ++Same as `NAPI_ARGV_UTF8_MALLOC` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_UINT32(name, var)` ++ ++Same as `NAPI_ARGV_UINT32` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_INT32(name, var)` ++ ++Same as `NAPI_ARGV_INT32` but takes a generic `napi_value` variable instead of an argv index. ++ ++#### `NAPI_EXPORT_FUNCTION(fn)` ++ ++Will export a function in the Init method. Expects the env and `exports` to be in scope. ++The name of the exported function is the same name as the c function. ++ ++#### `NAPI_EXPORT_SIZEOF(struct)` ++ ++Export the size of a strict. The exported name is `sizeof_{struct-name}`. ++ ++#### `NAPI_EXPORT_UINT32(name)` ++ ++Export a uint32. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_INT32(name)` ++ ++Export an int32. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_UTF8(name, len)` ++ ++Export a utf8 string. `len` should be the length of the string. ++The name of the exported string is the same name as the c variable. ++ ++#### `NAPI_EXPORT_STRING(name)` ++ ++Export a null terminated string. ++The name of the exported string is the same name as the c variable. ++ ++#### `NAPI_EXPORT_SIZEOF(type)` ++ ++Exports `sizeof(type)`. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_SIZEOF_STRUCT(structName)` ++ ++Exports `sizeof(struct structName)`. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_ALIGNMENTOF(type)` ++ ++Exports the byte alignment of `type`. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_ALIGNMENTOF_STRUCT(structName)` ++ ++Exports the byte alignment of `struct structName`. ++The name of the exported number is the same name as the c variable. ++ ++#### `NAPI_EXPORT_OFFSETOF(type, name)` ++ ++Exports the byte offset of `name` within `type`. ++The name of the exported number is the same name as the c variables. ++ ++#### `NAPI_EXPORT_OFFSETOF_STRUCT(structName, name)` ++ ++Exports the byte offset of `name` within `struct structName`. ++The name of the exported number is the same name as the c variables. ++ ++#### `NAPI_FOR_EACH(array, element)` ++ ++Iterate over an array. `array` should be a `napi_value` containing a javascript array ++and `element` is the variable name an element will be exposed as. Expects the loop body ++to be passed after. ++ ++``` c ++napi_value buffers = argv[0] // first argument is a js array ++NAPI_FOR_EACH(buffers, buffer) { ++ NAPI_BUFFER(cbuf, buffer) ++ printf("cbuf is now a char * pointer: %s\n", cbuf); ++} ++``` ++ ++#### `NAPI_RETURN_UINT32(name)` ++ ++Returns a uint32. ++ ++#### `NAPI_RETURN_INT32(name)` ++ ++Returns an int32. ++ ++#### `NAPI_RETURN_UTF8(name, len)` ++ ++Return a utf8 string. `len` should be the length of the string. ++ ++#### `NAPI_RETURN_STRING(name)` ++ ++Return a null terminated string. ++ ++#### `NAPI_STATUS_THROWS(call)` ++ ++Checks the return status of any `napi_*` function returning a `napi_status` type. This simplifies using a `napi_status` variable and comparing the result with `napi_ok`. It's used internally but can be used stand alone as well. ++ ++```c ++NAPI_STATUS_THROWS( ++ napi_create_threadsafe_function( ++ NULL, ++ callback, ++ 0, ++ async_resource_name, ++ 0, ++ 3, ++ 0, ++ my_finalize, ++ NULL, ++ my_callback, ++ &threadsafe_function ++ ) ++); ++``` ++ ++Above example will fail because the first `env` parameter is `NULL` and throw the following error: ++ ++``` ++Error: napi_create_threadsafe_function(NULL, callback, 0, async_resource_name, 0, 3, 0, my_finalize, \ ++NULL, my_callback, &threadsafe_function) failed! ++``` ++ ++#### `NAPI_UV_THROWS(err, fn)` ++ ++Checks if a libuv call fails and if so, throws an error. ++ ++``` c ++int err; ++NAPI_UV_THROWS(err, uv_ip4_addr((char *) &ip, port, &addr)) ++``` ++ ++#### `NAPI_MAKE_CALLBACK(env, async_ctx, ctx, func, argc, argv, result)` ++ ++Same as `napi_make_callback` except it checks if the JS function throw an exception ++and triggers a `process.on('uncaughtException')` if so. ++ ++## License ++ ++MIT +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/example/binding.gyp b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/example/binding.gyp +new file mode 100644 +index 0000000..375536d +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/example/binding.gyp +@@ -0,0 +1,9 @@ ++{ ++ "targets": [{ ++ "target_name": "napi_macros_example", ++ "include_dirs": [ ++ " ++#include ++ ++NAPI_METHOD(times_two) { ++ NAPI_ARGV(1) ++ NAPI_ARGV_INT32(number, 0) ++ ++ number *= 2; ++ ++ NAPI_RETURN_INT32(number) ++} ++ ++NAPI_INIT() { ++ NAPI_EXPORT_FUNCTION(times_two) ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/index.js +new file mode 100644 +index 0000000..29c169e +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/index.js +@@ -0,0 +1 @@ ++console.log(require('path').relative('.', __dirname)) +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/napi-macros.h b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/napi-macros.h +new file mode 100644 +index 0000000..90f6e0f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/napi-macros/napi-macros.h +@@ -0,0 +1,217 @@ ++#ifndef NAPI_MACROS ++#define NAPI_MACROS ++ ++#define NAPI_INIT() \ ++ static void napi_macros_init(napi_env env, napi_value exports); \ ++ napi_value napi_macros_init_wrap (napi_env env, napi_value exports) { \ ++ napi_macros_init(env, exports); \ ++ return exports; \ ++ } \ ++ NAPI_MODULE(NODE_GYP_MODULE_NAME, napi_macros_init_wrap) \ ++ static void napi_macros_init (napi_env env, napi_value exports) ++ ++#define NAPI_MAKE_CALLBACK(env, nil, ctx, cb, n, argv, res) \ ++ if (napi_make_callback(env, nil, ctx, cb, n, argv, res) == napi_pending_exception) { \ ++ napi_value fatal_exception; \ ++ napi_get_and_clear_last_exception(env, &fatal_exception); \ ++ napi_fatal_exception(env, fatal_exception); \ ++ } ++ ++#define NAPI_STATUS_THROWS_VOID(call) \ ++ if ((call) != napi_ok) { \ ++ napi_throw_error(env, NULL, #call " failed!"); \ ++ return; \ ++ } ++ ++#define NAPI_STATUS_THROWS(call) \ ++ if ((call) != napi_ok) { \ ++ napi_throw_error(env, NULL, #call " failed!"); \ ++ return NULL; \ ++ } ++ ++#define NAPI_METHOD(name) \ ++ napi_value name (napi_env env, napi_callback_info info) ++ ++#define NAPI_UV_THROWS(err, fn) \ ++ err = fn; \ ++ if (err < 0) { \ ++ napi_throw_error(env, uv_err_name(err), uv_strerror(err)); \ ++ return NULL; \ ++ } ++ ++#define NAPI_EXPORT_OFFSETOF(type, name) \ ++ { \ ++ napi_value name##_offsetof; \ ++ type tmp; \ ++ void *ptr = &(tmp.name); \ ++ void *ptr_base = &tmp; \ ++ int offset = (char *) ptr - (char *) ptr_base; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, offset, &name##_offsetof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "offsetof_" #type "_" #name, name##_offsetof)) \ ++ } ++ ++#define NAPI_EXPORT_OFFSETOF_STRUCT(type, name) \ ++ { \ ++ napi_value name##_offsetof; \ ++ struct type tmp; \ ++ void *ptr = &(tmp.name); \ ++ void *ptr_base = &tmp; \ ++ int offset = (char *) ptr - (char *) ptr_base; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, offset, &name##_offsetof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "offsetof_struct_" #type "_" #name, name##_offsetof)) \ ++ } ++ ++ ++#define NAPI_EXPORT_ALIGNMENTOF(name) \ ++ { \ ++ napi_value name##_alignmentof; \ ++ struct tmp { \ ++ char a; \ ++ name b; \ ++ }; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, sizeof(struct tmp) - sizeof(name), &name##_alignmentof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "alignmentof_" #name, name##_alignmentof)) \ ++ } ++ ++#define NAPI_EXPORT_ALIGNMENTOF_STRUCT(name) \ ++ { \ ++ napi_value name##_alignmentof; \ ++ struct tmp { \ ++ char a; \ ++ struct name b; \ ++ }; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, sizeof(struct tmp) - sizeof(struct name), &name##_alignmentof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "alignmentof_" #name, name##_alignmentof)) \ ++ } ++ ++#define NAPI_EXPORT_SIZEOF(name) \ ++ { \ ++ napi_value name##_sizeof; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, sizeof(name), &name##_sizeof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "sizeof_" #name, name##_sizeof)) \ ++ } ++ ++#define NAPI_EXPORT_SIZEOF_STRUCT(name) \ ++ { \ ++ napi_value name##_sizeof; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, sizeof(struct name), &name##_sizeof)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, "sizeof_" #name, name##_sizeof)) \ ++ } ++ ++#define NAPI_EXPORT_UINT32(name) \ ++ { \ ++ napi_value name##_uint32; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_uint32(env, name, &name##_uint32)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, #name, name##_uint32)) \ ++ } ++ ++#define NAPI_EXPORT_INT32(name) \ ++ { \ ++ napi_value name##_int32; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_int32(env, name, &name##_int32)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, #name, name##_int32)) \ ++ } ++ ++#define NAPI_EXPORT_FUNCTION(name) \ ++ { \ ++ napi_value name##_fn; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_function(env, NULL, 0, name, NULL, &name##_fn)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, #name, name##_fn)) \ ++ } ++ ++#define NAPI_EXPORT_UTF8(name, len) \ ++ { \ ++ napi_value name##_utf8; \ ++ NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env, name, len, &name##_utf8)) \ ++ NAPI_STATUS_THROWS_VOID(napi_set_named_property(env, exports, #name, name##_utf8)) \ ++ } ++ ++#define NAPI_EXPORT_STRING(name) \ ++ NAPI_EXPORT_UTF8(name, NAPI_AUTO_LENGTH) ++ ++#define NAPI_RETURN_INT32(name) \ ++ napi_value return_int32; \ ++ NAPI_STATUS_THROWS(napi_create_int32(env, name, &return_int32)) \ ++ return return_int32; ++ ++#define NAPI_RETURN_UINT32(name) \ ++ napi_value return_uint32; \ ++ NAPI_STATUS_THROWS(napi_create_uint32(env, name, &return_uint32)) \ ++ return return_uint32; ++ ++#define NAPI_RETURN_UTF8(name, len) \ ++ napi_value return_utf8; \ ++ NAPI_STATUS_THROWS(napi_create_string_utf8(env, name, len, &return_utf8)) \ ++ return return_utf8; ++ ++#define NAPI_RETURN_STRING(name) \ ++ NAPI_RETURN_UTF8(name, NAPI_AUTO_LENGTH) ++ ++#define NAPI_UTF8(name, size, val) \ ++ char name[size]; \ ++ size_t name##_len; \ ++ if (napi_get_value_string_utf8(env, val, (char *) &name, size, &name##_len) != napi_ok) { \ ++ napi_throw_error(env, "EINVAL", "Expected string"); \ ++ return NULL; \ ++ } ++ ++#define NAPI_UTF8_MALLOC(name, val) \ ++ size_t name##_size = 0; \ ++ NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, val, NULL, 0, &name##_size)) \ ++ char* name = (char*)malloc((name##_size + 1) * sizeof(char)); \ ++ size_t name##_len; \ ++ NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, val, name, name##_size + 1, &name##_len)) \ ++ name[name##_size] = '\0'; ++ ++#define NAPI_UINT32(name, val) \ ++ uint32_t name; \ ++ if (napi_get_value_uint32(env, val, &name) != napi_ok) { \ ++ napi_throw_error(env, "EINVAL", "Expected unsigned number"); \ ++ return NULL; \ ++ } ++ ++#define NAPI_INT32(name, val) \ ++ int32_t name; \ ++ if (napi_get_value_int32(env, val, &name) != napi_ok) { \ ++ napi_throw_error(env, "EINVAL", "Expected number"); \ ++ return NULL; \ ++ } ++ ++#define NAPI_BUFFER_CAST(type, name, val) \ ++ type name; \ ++ size_t name##_len; \ ++ NAPI_STATUS_THROWS(napi_get_buffer_info(env, val, (void **) &name, &name##_len)) ++ ++#define NAPI_BUFFER(name, val) \ ++ NAPI_BUFFER_CAST(char *, name, val) ++ ++#define NAPI_FOR_EACH(arr, element) \ ++ uint32_t arr##_len; \ ++ napi_get_array_length(env, arr, &arr##_len); \ ++ napi_value element; \ ++ for (uint32_t i = 0; i < arr##_len && napi_get_element(env, arr, i, &element) == napi_ok; i++) ++ ++#define NAPI_ARGV(n) \ ++ napi_value argv[n]; \ ++ size_t argc = n; \ ++ NAPI_STATUS_THROWS(napi_get_cb_info(env, info, &argc, argv, NULL, NULL)) ++ ++#define NAPI_ARGV_UTF8(name, size, i) \ ++ NAPI_UTF8(name, size, argv[i]) ++ ++#define NAPI_ARGV_UTF8_MALLOC(name, i) \ ++ NAPI_UTF8_MALLOC(name, argv[i]) ++ ++#define NAPI_ARGV_UINT32(name, i) \ ++ NAPI_UINT32(name, argv[i]) ++ ++#define NAPI_ARGV_INT32(name, i) \ ++ NAPI_INT32(name, argv[i]) ++ ++#define NAPI_ARGV_BUFFER_CAST(type, name, i) \ ++ NAPI_BUFFER_CAST(type, name, argv[i]) ++ ++#define NAPI_ARGV_BUFFER(name, i) \ ++ NAPI_ARGV_BUFFER_CAST(char *, name, i) ++ ++#endif +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/LICENSE b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/LICENSE +new file mode 100644 +index 0000000..56fce08 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/LICENSE +@@ -0,0 +1,21 @@ ++The MIT License (MIT) ++ ++Copyright (c) 2017 Mathias Buus ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy ++of this software and associated documentation files (the "Software"), to deal ++in the Software without restriction, including without limitation the rights ++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++copies of the Software, and to permit persons to whom the Software is ++furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++THE SOFTWARE. +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/README.md b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/README.md +new file mode 100644 +index 0000000..820dd16 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/README.md +@@ -0,0 +1,58 @@ ++# node-gyp-build ++ ++> Build tool and bindings loader for [`node-gyp`][node-gyp] that supports prebuilds. ++ ++``` ++npm install node-gyp-build ++``` ++ ++[![Build Status](https://travis-ci.org/prebuild/node-gyp-build.svg?branch=master)](https://travis-ci.org/prebuild/node-gyp-build) ++ ++Use together with [`prebuildify`][prebuildify] to easily support prebuilds for your native modules. ++ ++## Usage ++ ++> **Note.** Prebuild names have changed in [`prebuildify@3`][prebuildify] and `node-gyp-build@4`. Please see the documentation below. ++ ++`node-gyp-build` works similar to [`node-gyp build`][node-gyp] except that it will check if a build or prebuild is present before rebuilding your project. ++ ++It's main intended use is as an npm install script and bindings loader for native modules that bundle prebuilds using [`prebuildify`][prebuildify]. ++ ++First add `node-gyp-build` as an install script to your native project ++ ++``` js ++{ ++ ... ++ "scripts": { ++ "install": "node-gyp-build" ++ } ++} ++``` ++ ++Then in your `index.js`, instead of using the [`bindings`](https://www.npmjs.com/package/bindings) module use `node-gyp-build` to load your binding. ++ ++``` js ++var binding = require('node-gyp-build')(__dirname) ++``` ++ ++If you do these two things and bundle prebuilds with [`prebuildify`][prebuildify] your native module will work for most platforms ++without having to compile on install time AND will work in both node and electron without the need to recompile between usage. ++ ++Users can override `node-gyp-build` and force compiling by doing `npm install --build-from-source`. ++ ++Prebuilds will be attempted loaded from `MODULE_PATH/prebuilds/...` and then next `EXEC_PATH/prebuilds/...` (the latter allowing use with `zeit/pkg`) ++ ++## Supported prebuild names ++ ++If so desired you can bundle more specific flavors, for example `musl` builds to support Alpine, or targeting a numbered ARM architecture version. ++ ++These prebuilds can be bundled in addition to generic prebuilds; `node-gyp-build` will try to find the most specific flavor first. Prebuild filenames are composed of _tags_. The runtime tag takes precedence, as does an `abi` tag over `napi`. For more details on tags, please see [`prebuildify`][prebuildify]. ++ ++Values for the `libc` and `armv` tags are auto-detected but can be overridden through the `LIBC` and `ARM_VERSION` environment variables, respectively. ++ ++## License ++ ++MIT ++ ++[prebuildify]: https://github.com/prebuild/prebuildify ++[node-gyp]: https://www.npmjs.com/package/node-gyp +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/bin.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/bin.js +new file mode 100755 +index 0000000..36bd515 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/bin.js +@@ -0,0 +1,77 @@ ++#!/usr/bin/env node ++ ++var proc = require('child_process') ++var os = require('os') ++var path = require('path') ++ ++if (!buildFromSource()) { ++ proc.exec('node-gyp-build-test', function (err, stdout, stderr) { ++ if (err) { ++ if (verbose()) console.error(stderr) ++ preinstall() ++ } ++ }) ++} else { ++ preinstall() ++} ++ ++function build () { ++ var args = [os.platform() === 'win32' ? 'node-gyp.cmd' : 'node-gyp', 'rebuild'] ++ ++ try { ++ args = [ ++ process.execPath, ++ path.join(require.resolve('node-gyp/package.json'), '..', require('node-gyp/package.json').bin['node-gyp']), ++ 'rebuild' ++ ] ++ } catch (_) {} ++ ++ proc.spawn(args[0], args.slice(1), { stdio: 'inherit' }).on('exit', function (code) { ++ if (code || !process.argv[3]) process.exit(code) ++ exec(process.argv[3]).on('exit', function (code) { ++ process.exit(code) ++ }) ++ }) ++} ++ ++function preinstall () { ++ if (!process.argv[2]) return build() ++ exec(process.argv[2]).on('exit', function (code) { ++ if (code) process.exit(code) ++ build() ++ }) ++} ++ ++function exec (cmd) { ++ if (process.platform !== 'win32') { ++ var shell = os.platform() === 'android' ? 'sh' : '/bin/sh' ++ return proc.spawn(shell, ['-c', '--', cmd], { ++ stdio: 'inherit' ++ }) ++ } ++ ++ return proc.spawn(process.env.comspec || 'cmd.exe', ['/s', '/c', '"' + cmd + '"'], { ++ windowsVerbatimArguments: true, ++ stdio: 'inherit' ++ }) ++} ++ ++function buildFromSource () { ++ return hasFlag('--build-from-source') || process.env.npm_config_build_from_source === 'true' ++} ++ ++function verbose () { ++ return hasFlag('--verbose') || process.env.npm_config_loglevel === 'verbose' ++} ++ ++// TODO (next major): remove in favor of env.npm_config_* which works since npm ++// 0.1.8 while npm_config_argv will stop working in npm 7. See npm/rfcs#90 ++function hasFlag (flag) { ++ if (!process.env.npm_config_argv) return false ++ ++ try { ++ return JSON.parse(process.env.npm_config_argv).original.indexOf(flag) !== -1 ++ } catch (_) { ++ return false ++ } ++} +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/build-test.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/build-test.js +new file mode 100755 +index 0000000..b6622a5 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/build-test.js +@@ -0,0 +1,19 @@ ++#!/usr/bin/env node ++ ++process.env.NODE_ENV = 'test' ++ ++var path = require('path') ++var test = null ++ ++try { ++ var pkg = require(path.join(process.cwd(), 'package.json')) ++ if (pkg.name && process.env[pkg.name.toUpperCase().replace(/-/g, '_')]) { ++ process.exit(0) ++ } ++ test = pkg.prebuild.test ++} catch (err) { ++ // do nothing ++} ++ ++if (test) require(path.join(process.cwd(), test)) ++else require('./')() +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/index.js +new file mode 100644 +index 0000000..b5096ed +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/index.js +@@ -0,0 +1,166 @@ ++var fs = require('fs') ++var path = require('path') ++var os = require('os') ++ ++// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' ++var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line ++ ++var vars = (process.config && process.config.variables) || {} ++var prebuildsOnly = !!process.env.PREBUILDS_ONLY ++var abi = process.versions.modules // TODO: support old node where this is undef ++var runtime = isElectron() ? 'electron' : 'node' ++var arch = os.arch() ++var platform = os.platform() ++var libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc') ++var armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || '' ++var uv = (process.versions.uv || '').split('.')[0] ++ ++module.exports = load ++ ++function load (dir) { ++ return runtimeRequire(load.path(dir)) ++} ++ ++load.path = function (dir) { ++ dir = path.resolve(dir || '.') ++ ++ try { ++ var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_') ++ if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD'] ++ } catch (err) {} ++ ++ if (!prebuildsOnly) { ++ var release = getFirst(path.join(dir, 'build/Release'), matchBuild) ++ if (release) return release ++ ++ var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild) ++ if (debug) return debug ++ } ++ ++ var prebuild = resolve(dir) ++ if (prebuild) return prebuild ++ ++ var nearby = resolve(path.dirname(process.execPath)) ++ if (nearby) return nearby ++ ++ var target = [ ++ 'platform=' + platform, ++ 'arch=' + arch, ++ 'runtime=' + runtime, ++ 'abi=' + abi, ++ 'uv=' + uv, ++ armv ? 'armv=' + armv : '', ++ 'libc=' + libc, ++ 'node=' + process.versions.node, ++ (process.versions && process.versions.electron) ? 'electron=' + process.versions.electron : '', ++ typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line ++ ].filter(Boolean).join(' ') ++ ++ throw new Error('No native build was found for ' + target + '\n loaded from: ' + dir + '\n') ++ ++ function resolve (dir) { ++ // Find most specific flavor first ++ var prebuilds = path.join(dir, 'prebuilds', platform + '-' + arch) ++ var parsed = readdirSync(prebuilds).map(parseTags) ++ var candidates = parsed.filter(matchTags(runtime, abi)) ++ var winner = candidates.sort(compareTags(runtime))[0] ++ if (winner) return path.join(prebuilds, winner.file) ++ } ++} ++ ++function readdirSync (dir) { ++ try { ++ return fs.readdirSync(dir) ++ } catch (err) { ++ return [] ++ } ++} ++ ++function getFirst (dir, filter) { ++ var files = readdirSync(dir).filter(filter) ++ return files[0] && path.join(dir, files[0]) ++} ++ ++function matchBuild (name) { ++ return /\.node$/.test(name) ++} ++ ++function parseTags (file) { ++ var arr = file.split('.') ++ var extension = arr.pop() ++ var tags = { file: file, specificity: 0 } ++ ++ if (extension !== 'node') return ++ ++ for (var i = 0; i < arr.length; i++) { ++ var tag = arr[i] ++ ++ if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') { ++ tags.runtime = tag ++ } else if (tag === 'napi') { ++ tags.napi = true ++ } else if (tag.slice(0, 3) === 'abi') { ++ tags.abi = tag.slice(3) ++ } else if (tag.slice(0, 2) === 'uv') { ++ tags.uv = tag.slice(2) ++ } else if (tag.slice(0, 4) === 'armv') { ++ tags.armv = tag.slice(4) ++ } else if (tag === 'glibc' || tag === 'musl') { ++ tags.libc = tag ++ } else { ++ continue ++ } ++ ++ tags.specificity++ ++ } ++ ++ return tags ++} ++ ++function matchTags (runtime, abi) { ++ return function (tags) { ++ if (tags == null) return false ++ if (tags.runtime !== runtime && !runtimeAgnostic(tags)) return false ++ if (tags.abi !== abi && !tags.napi) return false ++ if (tags.uv && tags.uv !== uv) return false ++ if (tags.armv && tags.armv !== armv) return false ++ if (tags.libc && tags.libc !== libc) return false ++ ++ return true ++ } ++} ++ ++function runtimeAgnostic (tags) { ++ return tags.runtime === 'node' && tags.napi ++} ++ ++function compareTags (runtime) { ++ // Precedence: non-agnostic runtime, abi over napi, then by specificity. ++ return function (a, b) { ++ if (a.runtime !== b.runtime) { ++ return a.runtime === runtime ? -1 : 1 ++ } else if (a.abi !== b.abi) { ++ return a.abi ? -1 : 1 ++ } else if (a.specificity !== b.specificity) { ++ return a.specificity > b.specificity ? -1 : 1 ++ } else { ++ return 0 ++ } ++ } ++} ++ ++function isElectron () { ++ if (process.versions && process.versions.electron) return true ++ if (process.env.ELECTRON_RUN_AS_NODE) return true ++ return typeof window !== 'undefined' && window.process && window.process.type === 'renderer' ++} ++ ++function isAlpine (platform) { ++ return platform === 'linux' && fs.existsSync('/etc/alpine-release') ++} ++ ++// Exposed for unit tests ++// TODO: move to lib ++load.parseTags = parseTags ++load.matchTags = matchTags ++load.compareTags = compareTags +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/optional.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/optional.js +new file mode 100755 +index 0000000..8daa04a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/node_modules/node-gyp-build/optional.js +@@ -0,0 +1,7 @@ ++#!/usr/bin/env node ++ ++/* ++I am only useful as an install script to make node-gyp not compile for purely optional native deps ++*/ ++ ++process.exit(0) +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_manifest/debug/AndroidManifest.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_manifest/debug/AndroidManifest.xml +new file mode 100644 +index 0000000..351e4a3 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_manifest/debug/AndroidManifest.xml +@@ -0,0 +1,11 @@ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/R-def.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +new file mode 100644 +index 0000000..78ac5b8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +@@ -0,0 +1,2 @@ ++R_DEF: Internal format may change without notice ++local +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/parseDebugLibraryResources/R-def.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/parseDebugLibraryResources/R-def.txt +new file mode 100644 +index 0000000..78ac5b8 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/local_only_symbol_list/debug/parseDebugLibraryResources/R-def.txt +@@ -0,0 +1,2 @@ ++R_DEF: Internal format may change without notice ++local +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +new file mode 100644 +index 0000000..ebe56ff +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +@@ -0,0 +1,11 @@ ++1 ++2 ++4 ++5 /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++7 android:targetSdkVersion="30" /> ++7-->/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++8 ++9 +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/arm64-v8a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/arm64-v8a/libnode.so +new file mode 100755 +index 0000000..aa7e91f +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/arm64-v8a/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/armeabi-v7a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/armeabi-v7a/libnode.so +new file mode 100755 +index 0000000..16a9ae6 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/armeabi-v7a/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86/libnode.so +new file mode 100755 +index 0000000..c52a7b2 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86_64/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86_64/libnode.so +new file mode 100755 +index 0000000..57b9ae2 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_jni_libs/debug/out/x86_64/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +new file mode 100644 +index 0000000..f24cf43 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +@@ -0,0 +1,9 @@ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifests/debug/output.json b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifests/debug/output.json +new file mode 100644 +index 0000000..94bce33 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_manifests/debug/output.json +@@ -0,0 +1 @@ ++[{"outputType":{"type":"MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"nodejs-mobile-react-native-debug.aar","fullName":"debug","baseName":"debug"},"path":"../../library_manifest/debug/AndroidManifest.xml","properties":{"packageId":"com.janeasystems.rn_nodejs_mobile","split":""}}] +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so +new file mode 100644 +index 0000000..2edaaba +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/navigation_json/debug/navigation.json b/node_modules/nodejs-mobile-react-native/android/build/intermediates/navigation_json/debug/navigation.json +new file mode 100644 +index 0000000..0637a08 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/navigation_json/debug/navigation.json +@@ -0,0 +1 @@ ++[] +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/packaged_manifests/debug/output-metadata.json b/node_modules/nodejs-mobile-react-native/android/build/intermediates/packaged_manifests/debug/output-metadata.json +new file mode 100644 +index 0000000..c08598f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/packaged_manifests/debug/output-metadata.json +@@ -0,0 +1,16 @@ ++{ ++ "version": 2, ++ "artifactType": { ++ "type": "PACKAGED_MANIFESTS", ++ "kind": "Directory" ++ }, ++ "applicationId": "com.janeasystems.rn_nodejs_mobile", ++ "variantName": "debug", ++ "elements": [ ++ { ++ "type": "SINGLE", ++ "filters": [], ++ "outputFile": "../../merged_manifest/debug/AndroidManifest.xml" ++ } ++ ] ++} +\ No newline at end of file +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +new file mode 100644 +index 0000000..ac3054a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +@@ -0,0 +1,1318 @@ ++com.janeasystems.rn_nodejs_mobile ++anim abc_fade_in ++anim abc_fade_out ++anim abc_grow_fade_in_from_bottom ++anim abc_popup_enter ++anim abc_popup_exit ++anim abc_shrink_fade_out_from_bottom ++anim abc_slide_in_bottom ++anim abc_slide_in_top ++anim abc_slide_out_bottom ++anim abc_slide_out_top ++anim abc_tooltip_enter ++anim abc_tooltip_exit ++anim catalyst_fade_in ++anim catalyst_fade_out ++anim catalyst_push_up_in ++anim catalyst_push_up_out ++anim catalyst_slide_down ++anim catalyst_slide_up ++attr actionBarDivider ++attr actionBarItemBackground ++attr actionBarPopupTheme ++attr actionBarSize ++attr actionBarSplitStyle ++attr actionBarStyle ++attr actionBarTabBarStyle ++attr actionBarTabStyle ++attr actionBarTabTextStyle ++attr actionBarTheme ++attr actionBarWidgetTheme ++attr actionButtonStyle ++attr actionDropDownStyle ++attr actionLayout ++attr actionMenuTextAppearance ++attr actionMenuTextColor ++attr actionModeBackground ++attr actionModeCloseButtonStyle ++attr actionModeCloseDrawable ++attr actionModeCopyDrawable ++attr actionModeCutDrawable ++attr actionModeFindDrawable ++attr actionModePasteDrawable ++attr actionModePopupWindowStyle ++attr actionModeSelectAllDrawable ++attr actionModeShareDrawable ++attr actionModeSplitBackground ++attr actionModeStyle ++attr actionModeWebSearchDrawable ++attr actionOverflowButtonStyle ++attr actionOverflowMenuStyle ++attr actionProviderClass ++attr actionViewClass ++attr activityChooserViewStyle ++attr actualImageResource ++attr actualImageScaleType ++attr actualImageUri ++attr alertDialogButtonGroupStyle ++attr alertDialogCenterButtons ++attr alertDialogStyle ++attr alertDialogTheme ++attr allowStacking ++attr alpha ++attr alphabeticModifiers ++attr arrowHeadLength ++attr arrowShaftLength ++attr autoCompleteTextViewStyle ++attr autoSizeMaxTextSize ++attr autoSizeMinTextSize ++attr autoSizePresetSizes ++attr autoSizeStepGranularity ++attr autoSizeTextType ++attr background ++attr backgroundImage ++attr backgroundSplit ++attr backgroundStacked ++attr backgroundTint ++attr backgroundTintMode ++attr barLength ++attr borderlessButtonStyle ++attr buttonBarButtonStyle ++attr buttonBarNegativeButtonStyle ++attr buttonBarNeutralButtonStyle ++attr buttonBarPositiveButtonStyle ++attr buttonBarStyle ++attr buttonGravity ++attr buttonIconDimen ++attr buttonPanelSideLayout ++attr buttonStyle ++attr buttonStyleSmall ++attr buttonTint ++attr buttonTintMode ++attr checkboxStyle ++attr checkedTextViewStyle ++attr closeIcon ++attr closeItemLayout ++attr collapseContentDescription ++attr collapseIcon ++attr color ++attr colorAccent ++attr colorBackgroundFloating ++attr colorButtonNormal ++attr colorControlActivated ++attr colorControlHighlight ++attr colorControlNormal ++attr colorError ++attr colorPrimary ++attr colorPrimaryDark ++attr colorSwitchThumbNormal ++attr commitIcon ++attr contentDescription ++attr contentInsetEnd ++attr contentInsetEndWithActions ++attr contentInsetLeft ++attr contentInsetRight ++attr contentInsetStart ++attr contentInsetStartWithNavigation ++attr controlBackground ++attr coordinatorLayoutStyle ++attr customNavigationLayout ++attr defaultQueryHint ++attr dialogCornerRadius ++attr dialogPreferredPadding ++attr dialogTheme ++attr displayOptions ++attr divider ++attr dividerHorizontal ++attr dividerPadding ++attr dividerVertical ++attr drawableSize ++attr drawerArrowStyle ++attr dropDownListViewStyle ++attr dropdownListPreferredItemHeight ++attr editTextBackground ++attr editTextColor ++attr editTextStyle ++attr elevation ++attr expandActivityOverflowButtonDrawable ++attr fadeDuration ++attr failureImage ++attr failureImageScaleType ++attr firstBaselineToTopHeight ++attr font ++attr fontFamily ++attr fontProviderAuthority ++attr fontProviderCerts ++attr fontProviderFetchStrategy ++attr fontProviderFetchTimeout ++attr fontProviderPackage ++attr fontProviderQuery ++attr fontStyle ++attr fontVariationSettings ++attr fontWeight ++attr gapBetweenBars ++attr goIcon ++attr height ++attr hideOnContentScroll ++attr homeAsUpIndicator ++attr homeLayout ++attr icon ++attr iconTint ++attr iconTintMode ++attr iconifiedByDefault ++attr imageButtonStyle ++attr indeterminateProgressStyle ++attr initialActivityCount ++attr isLightTheme ++attr itemPadding ++attr keylines ++attr lastBaselineToBottomHeight ++attr layout ++attr layout_anchor ++attr layout_anchorGravity ++attr layout_behavior ++attr layout_dodgeInsetEdges ++attr layout_insetEdge ++attr layout_keyline ++attr lineHeight ++attr listChoiceBackgroundIndicator ++attr listDividerAlertDialog ++attr listItemLayout ++attr listLayout ++attr listMenuViewStyle ++attr listPopupWindowStyle ++attr listPreferredItemHeight ++attr listPreferredItemHeightLarge ++attr listPreferredItemHeightSmall ++attr listPreferredItemPaddingLeft ++attr listPreferredItemPaddingRight ++attr logo ++attr logoDescription ++attr maxButtonHeight ++attr measureWithLargestChild ++attr multiChoiceItemLayout ++attr navigationContentDescription ++attr navigationIcon ++attr navigationMode ++attr numericModifiers ++attr overlapAnchor ++attr overlayImage ++attr paddingBottomNoButtons ++attr paddingEnd ++attr paddingStart ++attr paddingTopNoTitle ++attr panelBackground ++attr panelMenuListTheme ++attr panelMenuListWidth ++attr placeholderImage ++attr placeholderImageScaleType ++attr popupMenuStyle ++attr popupTheme ++attr popupWindowStyle ++attr preserveIconSpacing ++attr pressedStateOverlayImage ++attr progressBarAutoRotateInterval ++attr progressBarImage ++attr progressBarImageScaleType ++attr progressBarPadding ++attr progressBarStyle ++attr queryBackground ++attr queryHint ++attr radioButtonStyle ++attr ratingBarStyle ++attr ratingBarStyleIndicator ++attr ratingBarStyleSmall ++attr retryImage ++attr retryImageScaleType ++attr roundAsCircle ++attr roundBottomEnd ++attr roundBottomLeft ++attr roundBottomRight ++attr roundBottomStart ++attr roundTopEnd ++attr roundTopLeft ++attr roundTopRight ++attr roundTopStart ++attr roundWithOverlayColor ++attr roundedCornerRadius ++attr roundingBorderColor ++attr roundingBorderPadding ++attr roundingBorderWidth ++attr searchHintIcon ++attr searchIcon ++attr searchViewStyle ++attr seekBarStyle ++attr selectableItemBackground ++attr selectableItemBackgroundBorderless ++attr showAsAction ++attr showDividers ++attr showText ++attr showTitle ++attr singleChoiceItemLayout ++attr spinBars ++attr spinnerDropDownItemStyle ++attr spinnerStyle ++attr splitTrack ++attr srcCompat ++attr state_above_anchor ++attr statusBarBackground ++attr subMenuArrow ++attr submitBackground ++attr subtitle ++attr subtitleTextAppearance ++attr subtitleTextColor ++attr subtitleTextStyle ++attr suggestionRowLayout ++attr switchMinWidth ++attr switchPadding ++attr switchStyle ++attr switchTextAppearance ++attr textAllCaps ++attr textAppearanceLargePopupMenu ++attr textAppearanceListItem ++attr textAppearanceListItemSecondary ++attr textAppearanceListItemSmall ++attr textAppearancePopupMenuHeader ++attr textAppearanceSearchResultSubtitle ++attr textAppearanceSearchResultTitle ++attr textAppearanceSmallPopupMenu ++attr textColorAlertDialogListItem ++attr textColorSearchUrl ++attr theme ++attr thickness ++attr thumbTextPadding ++attr thumbTint ++attr thumbTintMode ++attr tickMark ++attr tickMarkTint ++attr tickMarkTintMode ++attr tint ++attr tintMode ++attr title ++attr titleMargin ++attr titleMarginBottom ++attr titleMarginEnd ++attr titleMarginStart ++attr titleMarginTop ++attr titleMargins ++attr titleTextAppearance ++attr titleTextColor ++attr titleTextStyle ++attr toolbarNavigationButtonStyle ++attr toolbarStyle ++attr tooltipForegroundColor ++attr tooltipFrameBackground ++attr tooltipText ++attr track ++attr trackTint ++attr trackTintMode ++attr ttcIndex ++attr viewAspectRatio ++attr viewInflaterClass ++attr voiceIcon ++attr windowActionBar ++attr windowActionBarOverlay ++attr windowActionModeOverlay ++attr windowFixedHeightMajor ++attr windowFixedHeightMinor ++attr windowFixedWidthMajor ++attr windowFixedWidthMinor ++attr windowMinWidthMajor ++attr windowMinWidthMinor ++attr windowNoTitle ++bool abc_action_bar_embed_tabs ++bool abc_allow_stacked_button_bar ++bool abc_config_actionMenuItemAllCaps ++color abc_background_cache_hint_selector_material_dark ++color abc_background_cache_hint_selector_material_light ++color abc_btn_colored_borderless_text_material ++color abc_btn_colored_text_material ++color abc_color_highlight_material ++color abc_hint_foreground_material_dark ++color abc_hint_foreground_material_light ++color abc_input_method_navigation_guard ++color abc_primary_text_disable_only_material_dark ++color abc_primary_text_disable_only_material_light ++color abc_primary_text_material_dark ++color abc_primary_text_material_light ++color abc_search_url_text ++color abc_search_url_text_normal ++color abc_search_url_text_pressed ++color abc_search_url_text_selected ++color abc_secondary_text_material_dark ++color abc_secondary_text_material_light ++color abc_tint_btn_checkable ++color abc_tint_default ++color abc_tint_edittext ++color abc_tint_seek_thumb ++color abc_tint_spinner ++color abc_tint_switch_track ++color accent_material_dark ++color accent_material_light ++color background_floating_material_dark ++color background_floating_material_light ++color background_material_dark ++color background_material_light ++color bright_foreground_disabled_material_dark ++color bright_foreground_disabled_material_light ++color bright_foreground_inverse_material_dark ++color bright_foreground_inverse_material_light ++color bright_foreground_material_dark ++color bright_foreground_material_light ++color button_material_dark ++color button_material_light ++color catalyst_logbox_background ++color catalyst_redbox_background ++color dim_foreground_disabled_material_dark ++color dim_foreground_disabled_material_light ++color dim_foreground_material_dark ++color dim_foreground_material_light ++color error_color_material_dark ++color error_color_material_light ++color foreground_material_dark ++color foreground_material_light ++color highlighted_text_material_dark ++color highlighted_text_material_light ++color material_blue_grey_800 ++color material_blue_grey_900 ++color material_blue_grey_950 ++color material_deep_teal_200 ++color material_deep_teal_500 ++color material_grey_100 ++color material_grey_300 ++color material_grey_50 ++color material_grey_600 ++color material_grey_800 ++color material_grey_850 ++color material_grey_900 ++color notification_action_color_filter ++color notification_icon_bg_color ++color primary_dark_material_dark ++color primary_dark_material_light ++color primary_material_dark ++color primary_material_light ++color primary_text_default_material_dark ++color primary_text_default_material_light ++color primary_text_disabled_material_dark ++color primary_text_disabled_material_light ++color ripple_material_dark ++color ripple_material_light ++color secondary_text_default_material_dark ++color secondary_text_default_material_light ++color secondary_text_disabled_material_dark ++color secondary_text_disabled_material_light ++color switch_thumb_disabled_material_dark ++color switch_thumb_disabled_material_light ++color switch_thumb_material_dark ++color switch_thumb_material_light ++color switch_thumb_normal_material_dark ++color switch_thumb_normal_material_light ++color tooltip_background_dark ++color tooltip_background_light ++dimen abc_action_bar_content_inset_material ++dimen abc_action_bar_content_inset_with_nav ++dimen abc_action_bar_default_height_material ++dimen abc_action_bar_default_padding_end_material ++dimen abc_action_bar_default_padding_start_material ++dimen abc_action_bar_elevation_material ++dimen abc_action_bar_icon_vertical_padding_material ++dimen abc_action_bar_overflow_padding_end_material ++dimen abc_action_bar_overflow_padding_start_material ++dimen abc_action_bar_stacked_max_height ++dimen abc_action_bar_stacked_tab_max_width ++dimen abc_action_bar_subtitle_bottom_margin_material ++dimen abc_action_bar_subtitle_top_margin_material ++dimen abc_action_button_min_height_material ++dimen abc_action_button_min_width_material ++dimen abc_action_button_min_width_overflow_material ++dimen abc_alert_dialog_button_bar_height ++dimen abc_alert_dialog_button_dimen ++dimen abc_button_inset_horizontal_material ++dimen abc_button_inset_vertical_material ++dimen abc_button_padding_horizontal_material ++dimen abc_button_padding_vertical_material ++dimen abc_cascading_menus_min_smallest_width ++dimen abc_config_prefDialogWidth ++dimen abc_control_corner_material ++dimen abc_control_inset_material ++dimen abc_control_padding_material ++dimen abc_dialog_corner_radius_material ++dimen abc_dialog_fixed_height_major ++dimen abc_dialog_fixed_height_minor ++dimen abc_dialog_fixed_width_major ++dimen abc_dialog_fixed_width_minor ++dimen abc_dialog_list_padding_bottom_no_buttons ++dimen abc_dialog_list_padding_top_no_title ++dimen abc_dialog_min_width_major ++dimen abc_dialog_min_width_minor ++dimen abc_dialog_padding_material ++dimen abc_dialog_padding_top_material ++dimen abc_dialog_title_divider_material ++dimen abc_disabled_alpha_material_dark ++dimen abc_disabled_alpha_material_light ++dimen abc_dropdownitem_icon_width ++dimen abc_dropdownitem_text_padding_left ++dimen abc_dropdownitem_text_padding_right ++dimen abc_edit_text_inset_bottom_material ++dimen abc_edit_text_inset_horizontal_material ++dimen abc_edit_text_inset_top_material ++dimen abc_floating_window_z ++dimen abc_list_item_padding_horizontal_material ++dimen abc_panel_menu_list_width ++dimen abc_progress_bar_height_material ++dimen abc_search_view_preferred_height ++dimen abc_search_view_preferred_width ++dimen abc_seekbar_track_background_height_material ++dimen abc_seekbar_track_progress_height_material ++dimen abc_select_dialog_padding_start_material ++dimen abc_switch_padding ++dimen abc_text_size_body_1_material ++dimen abc_text_size_body_2_material ++dimen abc_text_size_button_material ++dimen abc_text_size_caption_material ++dimen abc_text_size_display_1_material ++dimen abc_text_size_display_2_material ++dimen abc_text_size_display_3_material ++dimen abc_text_size_display_4_material ++dimen abc_text_size_headline_material ++dimen abc_text_size_large_material ++dimen abc_text_size_medium_material ++dimen abc_text_size_menu_header_material ++dimen abc_text_size_menu_material ++dimen abc_text_size_small_material ++dimen abc_text_size_subhead_material ++dimen abc_text_size_subtitle_material_toolbar ++dimen abc_text_size_title_material ++dimen abc_text_size_title_material_toolbar ++dimen compat_button_inset_horizontal_material ++dimen compat_button_inset_vertical_material ++dimen compat_button_padding_horizontal_material ++dimen compat_button_padding_vertical_material ++dimen compat_control_corner_material ++dimen compat_notification_large_icon_max_height ++dimen compat_notification_large_icon_max_width ++dimen disabled_alpha_material_dark ++dimen disabled_alpha_material_light ++dimen highlight_alpha_material_colored ++dimen highlight_alpha_material_dark ++dimen highlight_alpha_material_light ++dimen hint_alpha_material_dark ++dimen hint_alpha_material_light ++dimen hint_pressed_alpha_material_dark ++dimen hint_pressed_alpha_material_light ++dimen notification_action_icon_size ++dimen notification_action_text_size ++dimen notification_big_circle_margin ++dimen notification_content_margin_start ++dimen notification_large_icon_height ++dimen notification_large_icon_width ++dimen notification_main_column_padding_top ++dimen notification_media_narrow_margin ++dimen notification_right_icon_size ++dimen notification_right_side_padding_top ++dimen notification_small_icon_background_padding ++dimen notification_small_icon_size_as_large ++dimen notification_subtext_size ++dimen notification_top_pad ++dimen notification_top_pad_large_text ++dimen tooltip_corner_radius ++dimen tooltip_horizontal_padding ++dimen tooltip_margin ++dimen tooltip_precise_anchor_extra_offset ++dimen tooltip_precise_anchor_threshold ++dimen tooltip_vertical_padding ++dimen tooltip_y_offset_non_touch ++dimen tooltip_y_offset_touch ++drawable abc_ab_share_pack_mtrl_alpha ++drawable abc_action_bar_item_background_material ++drawable abc_btn_borderless_material ++drawable abc_btn_check_material ++drawable abc_btn_check_to_on_mtrl_000 ++drawable abc_btn_check_to_on_mtrl_015 ++drawable abc_btn_colored_material ++drawable abc_btn_default_mtrl_shape ++drawable abc_btn_radio_material ++drawable abc_btn_radio_to_on_mtrl_000 ++drawable abc_btn_radio_to_on_mtrl_015 ++drawable abc_btn_switch_to_on_mtrl_00001 ++drawable abc_btn_switch_to_on_mtrl_00012 ++drawable abc_cab_background_internal_bg ++drawable abc_cab_background_top_material ++drawable abc_cab_background_top_mtrl_alpha ++drawable abc_control_background_material ++drawable abc_dialog_material_background ++drawable abc_edit_text_material ++drawable abc_ic_ab_back_material ++drawable abc_ic_arrow_drop_right_black_24dp ++drawable abc_ic_clear_material ++drawable abc_ic_commit_search_api_mtrl_alpha ++drawable abc_ic_go_search_api_material ++drawable abc_ic_menu_copy_mtrl_am_alpha ++drawable abc_ic_menu_cut_mtrl_alpha ++drawable abc_ic_menu_overflow_material ++drawable abc_ic_menu_paste_mtrl_am_alpha ++drawable abc_ic_menu_selectall_mtrl_alpha ++drawable abc_ic_menu_share_mtrl_alpha ++drawable abc_ic_search_api_material ++drawable abc_ic_star_black_16dp ++drawable abc_ic_star_black_36dp ++drawable abc_ic_star_black_48dp ++drawable abc_ic_star_half_black_16dp ++drawable abc_ic_star_half_black_36dp ++drawable abc_ic_star_half_black_48dp ++drawable abc_ic_voice_search_api_material ++drawable abc_item_background_holo_dark ++drawable abc_item_background_holo_light ++drawable abc_list_divider_material ++drawable abc_list_divider_mtrl_alpha ++drawable abc_list_focused_holo ++drawable abc_list_longpressed_holo ++drawable abc_list_pressed_holo_dark ++drawable abc_list_pressed_holo_light ++drawable abc_list_selector_background_transition_holo_dark ++drawable abc_list_selector_background_transition_holo_light ++drawable abc_list_selector_disabled_holo_dark ++drawable abc_list_selector_disabled_holo_light ++drawable abc_list_selector_holo_dark ++drawable abc_list_selector_holo_light ++drawable abc_menu_hardkey_panel_mtrl_mult ++drawable abc_popup_background_mtrl_mult ++drawable abc_ratingbar_indicator_material ++drawable abc_ratingbar_material ++drawable abc_ratingbar_small_material ++drawable abc_scrubber_control_off_mtrl_alpha ++drawable abc_scrubber_control_to_pressed_mtrl_000 ++drawable abc_scrubber_control_to_pressed_mtrl_005 ++drawable abc_scrubber_primary_mtrl_alpha ++drawable abc_scrubber_track_mtrl_alpha ++drawable abc_seekbar_thumb_material ++drawable abc_seekbar_tick_mark_material ++drawable abc_seekbar_track_material ++drawable abc_spinner_mtrl_am_alpha ++drawable abc_spinner_textfield_background_material ++drawable abc_switch_thumb_material ++drawable abc_switch_track_mtrl_alpha ++drawable abc_tab_indicator_material ++drawable abc_tab_indicator_mtrl_alpha ++drawable abc_text_cursor_material ++drawable abc_text_select_handle_left_mtrl_dark ++drawable abc_text_select_handle_left_mtrl_light ++drawable abc_text_select_handle_middle_mtrl_dark ++drawable abc_text_select_handle_middle_mtrl_light ++drawable abc_text_select_handle_right_mtrl_dark ++drawable abc_text_select_handle_right_mtrl_light ++drawable abc_textfield_activated_mtrl_alpha ++drawable abc_textfield_default_mtrl_alpha ++drawable abc_textfield_search_activated_mtrl_alpha ++drawable abc_textfield_search_default_mtrl_alpha ++drawable abc_textfield_search_material ++drawable abc_vector_test ++drawable notification_action_background ++drawable notification_bg ++drawable notification_bg_low ++drawable notification_bg_low_normal ++drawable notification_bg_low_pressed ++drawable notification_bg_normal ++drawable notification_bg_normal_pressed ++drawable notification_icon_background ++drawable notification_template_icon_bg ++drawable notification_template_icon_low_bg ++drawable notification_tile_bg ++drawable notify_panel_notification_icon_bg ++drawable redbox_top_border_background ++drawable tooltip_frame_dark ++drawable tooltip_frame_light ++id accessibility_actions ++id accessibility_hint ++id accessibility_label ++id accessibility_role ++id accessibility_state ++id accessibility_value ++id action_bar ++id action_bar_activity_content ++id action_bar_container ++id action_bar_root ++id action_bar_spinner ++id action_bar_subtitle ++id action_bar_title ++id action_container ++id action_context_bar ++id action_divider ++id action_image ++id action_menu_divider ++id action_menu_presenter ++id action_mode_bar ++id action_mode_bar_stub ++id action_mode_close_button ++id action_text ++id actions ++id activity_chooser_view_content ++id add ++id alertTitle ++id async ++id blocking ++id bottom ++id buttonPanel ++id catalyst_redbox_title ++id center ++id centerCrop ++id centerInside ++id checkbox ++id chronometer ++id content ++id contentPanel ++id custom ++id customPanel ++id decor_content_parent ++id default_activity_button ++id edit_query ++id end ++id expand_activities_button ++id expanded_menu ++id fitBottomStart ++id fitCenter ++id fitEnd ++id fitStart ++id fitXY ++id focusCrop ++id forever ++id fps_text ++id group_divider ++id home ++id icon ++id icon_group ++id image ++id info ++id italic ++id left ++id line1 ++id line3 ++id listMode ++id list_item ++id message ++id multiply ++id none ++id normal ++id notification_background ++id notification_main_column ++id notification_main_column_container ++id parentPanel ++id progress_circular ++id progress_horizontal ++id radio ++id react_test_id ++id right ++id right_icon ++id right_side ++id rn_frame_file ++id rn_frame_method ++id rn_redbox_dismiss_button ++id rn_redbox_line_separator ++id rn_redbox_loading_indicator ++id rn_redbox_reload_button ++id rn_redbox_report_button ++id rn_redbox_report_label ++id rn_redbox_stack ++id screen ++id scrollIndicatorDown ++id scrollIndicatorUp ++id scrollView ++id search_badge ++id search_bar ++id search_button ++id search_close_btn ++id search_edit_frame ++id search_go_btn ++id search_mag_icon ++id search_plate ++id search_src_text ++id search_voice_btn ++id select_dialog_listview ++id shortcut ++id spacer ++id split_action_bar ++id src_atop ++id src_in ++id src_over ++id start ++id submenuarrow ++id submit_area ++id tabMode ++id tag_transition_group ++id tag_unhandled_key_event_manager ++id tag_unhandled_key_listeners ++id text ++id text2 ++id textSpacerNoButtons ++id textSpacerNoTitle ++id time ++id title ++id titleDividerNoCustom ++id title_template ++id top ++id topPanel ++id uniform ++id up ++id view_tag_instance_handle ++id view_tag_native_id ++id wrap_content ++integer abc_config_activityDefaultDur ++integer abc_config_activityShortDur ++integer cancel_button_image_alpha ++integer config_tooltipAnimTime ++integer react_native_dev_server_port ++integer react_native_inspector_proxy_port ++integer status_bar_notification_info_maxnum ++layout abc_action_bar_title_item ++layout abc_action_bar_up_container ++layout abc_action_menu_item_layout ++layout abc_action_menu_layout ++layout abc_action_mode_bar ++layout abc_action_mode_close_item_material ++layout abc_activity_chooser_view ++layout abc_activity_chooser_view_list_item ++layout abc_alert_dialog_button_bar_material ++layout abc_alert_dialog_material ++layout abc_alert_dialog_title_material ++layout abc_cascading_menu_item_layout ++layout abc_dialog_title_material ++layout abc_expanded_menu_layout ++layout abc_list_menu_item_checkbox ++layout abc_list_menu_item_icon ++layout abc_list_menu_item_layout ++layout abc_list_menu_item_radio ++layout abc_popup_menu_header_item_layout ++layout abc_popup_menu_item_layout ++layout abc_screen_content_include ++layout abc_screen_simple ++layout abc_screen_simple_overlay_action_mode ++layout abc_screen_toolbar ++layout abc_search_dropdown_item_icons_2line ++layout abc_search_view ++layout abc_select_dialog_material ++layout abc_tooltip ++layout dev_loading_view ++layout fps_view ++layout notification_action ++layout notification_action_tombstone ++layout notification_template_custom_big ++layout notification_template_icon_group ++layout notification_template_part_chronometer ++layout notification_template_part_time ++layout redbox_item_frame ++layout redbox_item_title ++layout redbox_view ++layout select_dialog_item_material ++layout select_dialog_multichoice_material ++layout select_dialog_singlechoice_material ++layout support_simple_spinner_dropdown_item ++string abc_action_bar_home_description ++string abc_action_bar_up_description ++string abc_action_menu_overflow_description ++string abc_action_mode_done ++string abc_activity_chooser_view_see_all ++string abc_activitychooserview_choose_application ++string abc_capital_off ++string abc_capital_on ++string abc_font_family_body_1_material ++string abc_font_family_body_2_material ++string abc_font_family_button_material ++string abc_font_family_caption_material ++string abc_font_family_display_1_material ++string abc_font_family_display_2_material ++string abc_font_family_display_3_material ++string abc_font_family_display_4_material ++string abc_font_family_headline_material ++string abc_font_family_menu_material ++string abc_font_family_subhead_material ++string abc_font_family_title_material ++string abc_menu_alt_shortcut_label ++string abc_menu_ctrl_shortcut_label ++string abc_menu_delete_shortcut_label ++string abc_menu_enter_shortcut_label ++string abc_menu_function_shortcut_label ++string abc_menu_meta_shortcut_label ++string abc_menu_shift_shortcut_label ++string abc_menu_space_shortcut_label ++string abc_menu_sym_shortcut_label ++string abc_prepend_shortcut_label ++string abc_search_hint ++string abc_searchview_description_clear ++string abc_searchview_description_query ++string abc_searchview_description_search ++string abc_searchview_description_submit ++string abc_searchview_description_voice ++string abc_shareactionprovider_share_with ++string abc_shareactionprovider_share_with_application ++string abc_toolbar_collapse_description ++string alert_description ++string button_description ++string catalyst_change_bundle_location ++string catalyst_copy_button ++string catalyst_debug ++string catalyst_debug_chrome ++string catalyst_debug_chrome_stop ++string catalyst_debug_connecting ++string catalyst_debug_error ++string catalyst_debug_nuclide ++string catalyst_debug_nuclide_error ++string catalyst_debug_stop ++string catalyst_dismiss_button ++string catalyst_heap_capture ++string catalyst_hot_reloading ++string catalyst_hot_reloading_auto_disable ++string catalyst_hot_reloading_auto_enable ++string catalyst_hot_reloading_stop ++string catalyst_inspector ++string catalyst_loading_from_url ++string catalyst_perf_monitor ++string catalyst_perf_monitor_stop ++string catalyst_reload ++string catalyst_reload_button ++string catalyst_reload_error ++string catalyst_report_button ++string catalyst_sample_profiler_disable ++string catalyst_sample_profiler_enable ++string catalyst_settings ++string catalyst_settings_title ++string combobox_description ++string header_description ++string image_description ++string imagebutton_description ++string link_description ++string menu_description ++string menubar_description ++string menuitem_description ++string progressbar_description ++string radiogroup_description ++string rn_tab_description ++string scrollbar_description ++string search_description ++string search_menu_title ++string spinbutton_description ++string state_busy_description ++string state_collapsed_description ++string state_expanded_description ++string state_mixed_description ++string state_off_description ++string state_on_description ++string status_bar_notification_info_overflow ++string summary_description ++string tablist_description ++string timer_description ++string toolbar_description ++style AlertDialog_AppCompat ++style AlertDialog_AppCompat_Light ++style Animation_AppCompat_Dialog ++style Animation_AppCompat_DropDownUp ++style Animation_AppCompat_Tooltip ++style Animation_Catalyst_LogBox ++style Animation_Catalyst_RedBox ++style Base_AlertDialog_AppCompat ++style Base_AlertDialog_AppCompat_Light ++style Base_Animation_AppCompat_Dialog ++style Base_Animation_AppCompat_DropDownUp ++style Base_Animation_AppCompat_Tooltip ++style Base_DialogWindowTitleBackground_AppCompat ++style Base_DialogWindowTitle_AppCompat ++style Base_TextAppearance_AppCompat ++style Base_TextAppearance_AppCompat_Body1 ++style Base_TextAppearance_AppCompat_Body2 ++style Base_TextAppearance_AppCompat_Button ++style Base_TextAppearance_AppCompat_Caption ++style Base_TextAppearance_AppCompat_Display1 ++style Base_TextAppearance_AppCompat_Display2 ++style Base_TextAppearance_AppCompat_Display3 ++style Base_TextAppearance_AppCompat_Display4 ++style Base_TextAppearance_AppCompat_Headline ++style Base_TextAppearance_AppCompat_Inverse ++style Base_TextAppearance_AppCompat_Large ++style Base_TextAppearance_AppCompat_Large_Inverse ++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large ++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small ++style Base_TextAppearance_AppCompat_Medium ++style Base_TextAppearance_AppCompat_Medium_Inverse ++style Base_TextAppearance_AppCompat_Menu ++style Base_TextAppearance_AppCompat_SearchResult ++style Base_TextAppearance_AppCompat_SearchResult_Subtitle ++style Base_TextAppearance_AppCompat_SearchResult_Title ++style Base_TextAppearance_AppCompat_Small ++style Base_TextAppearance_AppCompat_Small_Inverse ++style Base_TextAppearance_AppCompat_Subhead ++style Base_TextAppearance_AppCompat_Subhead_Inverse ++style Base_TextAppearance_AppCompat_Title ++style Base_TextAppearance_AppCompat_Title_Inverse ++style Base_TextAppearance_AppCompat_Tooltip ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse ++style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle ++style Base_TextAppearance_AppCompat_Widget_ActionMode_Title ++style Base_TextAppearance_AppCompat_Widget_Button ++style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored ++style Base_TextAppearance_AppCompat_Widget_Button_Colored ++style Base_TextAppearance_AppCompat_Widget_Button_Inverse ++style Base_TextAppearance_AppCompat_Widget_DropDownItem ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small ++style Base_TextAppearance_AppCompat_Widget_Switch ++style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem ++style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item ++style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle ++style Base_TextAppearance_Widget_AppCompat_Toolbar_Title ++style Base_ThemeOverlay_AppCompat ++style Base_ThemeOverlay_AppCompat_ActionBar ++style Base_ThemeOverlay_AppCompat_Dark ++style Base_ThemeOverlay_AppCompat_Dark_ActionBar ++style Base_ThemeOverlay_AppCompat_Dialog ++style Base_ThemeOverlay_AppCompat_Dialog_Alert ++style Base_ThemeOverlay_AppCompat_Light ++style Base_Theme_AppCompat ++style Base_Theme_AppCompat_CompactMenu ++style Base_Theme_AppCompat_Dialog ++style Base_Theme_AppCompat_DialogWhenLarge ++style Base_Theme_AppCompat_Dialog_Alert ++style Base_Theme_AppCompat_Dialog_FixedSize ++style Base_Theme_AppCompat_Dialog_MinWidth ++style Base_Theme_AppCompat_Light ++style Base_Theme_AppCompat_Light_DarkActionBar ++style Base_Theme_AppCompat_Light_Dialog ++style Base_Theme_AppCompat_Light_DialogWhenLarge ++style Base_Theme_AppCompat_Light_Dialog_Alert ++style Base_Theme_AppCompat_Light_Dialog_FixedSize ++style Base_Theme_AppCompat_Light_Dialog_MinWidth ++style Base_V21_ThemeOverlay_AppCompat_Dialog ++style Base_V21_Theme_AppCompat ++style Base_V21_Theme_AppCompat_Dialog ++style Base_V21_Theme_AppCompat_Light ++style Base_V21_Theme_AppCompat_Light_Dialog ++style Base_V22_Theme_AppCompat ++style Base_V22_Theme_AppCompat_Light ++style Base_V23_Theme_AppCompat ++style Base_V23_Theme_AppCompat_Light ++style Base_V26_Theme_AppCompat ++style Base_V26_Theme_AppCompat_Light ++style Base_V26_Widget_AppCompat_Toolbar ++style Base_V28_Theme_AppCompat ++style Base_V28_Theme_AppCompat_Light ++style Base_V7_ThemeOverlay_AppCompat_Dialog ++style Base_V7_Theme_AppCompat ++style Base_V7_Theme_AppCompat_Dialog ++style Base_V7_Theme_AppCompat_Light ++style Base_V7_Theme_AppCompat_Light_Dialog ++style Base_V7_Widget_AppCompat_AutoCompleteTextView ++style Base_V7_Widget_AppCompat_EditText ++style Base_V7_Widget_AppCompat_Toolbar ++style Base_Widget_AppCompat_ActionBar ++style Base_Widget_AppCompat_ActionBar_Solid ++style Base_Widget_AppCompat_ActionBar_TabBar ++style Base_Widget_AppCompat_ActionBar_TabText ++style Base_Widget_AppCompat_ActionBar_TabView ++style Base_Widget_AppCompat_ActionButton ++style Base_Widget_AppCompat_ActionButton_CloseMode ++style Base_Widget_AppCompat_ActionButton_Overflow ++style Base_Widget_AppCompat_ActionMode ++style Base_Widget_AppCompat_ActivityChooserView ++style Base_Widget_AppCompat_AutoCompleteTextView ++style Base_Widget_AppCompat_Button ++style Base_Widget_AppCompat_ButtonBar ++style Base_Widget_AppCompat_ButtonBar_AlertDialog ++style Base_Widget_AppCompat_Button_Borderless ++style Base_Widget_AppCompat_Button_Borderless_Colored ++style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog ++style Base_Widget_AppCompat_Button_Colored ++style Base_Widget_AppCompat_Button_Small ++style Base_Widget_AppCompat_CompoundButton_CheckBox ++style Base_Widget_AppCompat_CompoundButton_RadioButton ++style Base_Widget_AppCompat_CompoundButton_Switch ++style Base_Widget_AppCompat_DrawerArrowToggle ++style Base_Widget_AppCompat_DrawerArrowToggle_Common ++style Base_Widget_AppCompat_DropDownItem_Spinner ++style Base_Widget_AppCompat_EditText ++style Base_Widget_AppCompat_ImageButton ++style Base_Widget_AppCompat_Light_ActionBar ++style Base_Widget_AppCompat_Light_ActionBar_Solid ++style Base_Widget_AppCompat_Light_ActionBar_TabBar ++style Base_Widget_AppCompat_Light_ActionBar_TabText ++style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse ++style Base_Widget_AppCompat_Light_ActionBar_TabView ++style Base_Widget_AppCompat_Light_PopupMenu ++style Base_Widget_AppCompat_Light_PopupMenu_Overflow ++style Base_Widget_AppCompat_ListMenuView ++style Base_Widget_AppCompat_ListPopupWindow ++style Base_Widget_AppCompat_ListView ++style Base_Widget_AppCompat_ListView_DropDown ++style Base_Widget_AppCompat_ListView_Menu ++style Base_Widget_AppCompat_PopupMenu ++style Base_Widget_AppCompat_PopupMenu_Overflow ++style Base_Widget_AppCompat_PopupWindow ++style Base_Widget_AppCompat_ProgressBar ++style Base_Widget_AppCompat_ProgressBar_Horizontal ++style Base_Widget_AppCompat_RatingBar ++style Base_Widget_AppCompat_RatingBar_Indicator ++style Base_Widget_AppCompat_RatingBar_Small ++style Base_Widget_AppCompat_SearchView ++style Base_Widget_AppCompat_SearchView_ActionBar ++style Base_Widget_AppCompat_SeekBar ++style Base_Widget_AppCompat_SeekBar_Discrete ++style Base_Widget_AppCompat_Spinner ++style Base_Widget_AppCompat_Spinner_Underlined ++style Base_Widget_AppCompat_TextView_SpinnerItem ++style Base_Widget_AppCompat_Toolbar ++style Base_Widget_AppCompat_Toolbar_Button_Navigation ++style CalendarDatePickerDialog ++style CalendarDatePickerStyle ++style ClockTimePickerDialog ++style ClockTimePickerStyle ++style DialogAnimationFade ++style DialogAnimationSlide ++style Platform_AppCompat ++style Platform_AppCompat_Light ++style Platform_ThemeOverlay_AppCompat ++style Platform_ThemeOverlay_AppCompat_Dark ++style Platform_ThemeOverlay_AppCompat_Light ++style Platform_V21_AppCompat ++style Platform_V21_AppCompat_Light ++style Platform_V25_AppCompat ++style Platform_V25_AppCompat_Light ++style Platform_Widget_AppCompat_Spinner ++style RtlOverlay_DialogWindowTitle_AppCompat ++style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem ++style RtlOverlay_Widget_AppCompat_DialogTitle_Icon ++style RtlOverlay_Widget_AppCompat_PopupMenuItem ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title ++style RtlOverlay_Widget_AppCompat_SearchView_MagIcon ++style RtlOverlay_Widget_AppCompat_Search_DropDown ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Query ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Text ++style RtlUnderlay_Widget_AppCompat_ActionButton ++style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow ++style SpinnerDatePickerDialog ++style SpinnerDatePickerStyle ++style SpinnerTimePickerDialog ++style SpinnerTimePickerStyle ++style TextAppearance_AppCompat ++style TextAppearance_AppCompat_Body1 ++style TextAppearance_AppCompat_Body2 ++style TextAppearance_AppCompat_Button ++style TextAppearance_AppCompat_Caption ++style TextAppearance_AppCompat_Display1 ++style TextAppearance_AppCompat_Display2 ++style TextAppearance_AppCompat_Display3 ++style TextAppearance_AppCompat_Display4 ++style TextAppearance_AppCompat_Headline ++style TextAppearance_AppCompat_Inverse ++style TextAppearance_AppCompat_Large ++style TextAppearance_AppCompat_Large_Inverse ++style TextAppearance_AppCompat_Light_SearchResult_Subtitle ++style TextAppearance_AppCompat_Light_SearchResult_Title ++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large ++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small ++style TextAppearance_AppCompat_Medium ++style TextAppearance_AppCompat_Medium_Inverse ++style TextAppearance_AppCompat_Menu ++style TextAppearance_AppCompat_SearchResult_Subtitle ++style TextAppearance_AppCompat_SearchResult_Title ++style TextAppearance_AppCompat_Small ++style TextAppearance_AppCompat_Small_Inverse ++style TextAppearance_AppCompat_Subhead ++style TextAppearance_AppCompat_Subhead_Inverse ++style TextAppearance_AppCompat_Title ++style TextAppearance_AppCompat_Title_Inverse ++style TextAppearance_AppCompat_Tooltip ++style TextAppearance_AppCompat_Widget_ActionBar_Menu ++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle ++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse ++style TextAppearance_AppCompat_Widget_ActionBar_Title ++style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse ++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle ++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse ++style TextAppearance_AppCompat_Widget_ActionMode_Title ++style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse ++style TextAppearance_AppCompat_Widget_Button ++style TextAppearance_AppCompat_Widget_Button_Borderless_Colored ++style TextAppearance_AppCompat_Widget_Button_Colored ++style TextAppearance_AppCompat_Widget_Button_Inverse ++style TextAppearance_AppCompat_Widget_DropDownItem ++style TextAppearance_AppCompat_Widget_PopupMenu_Header ++style TextAppearance_AppCompat_Widget_PopupMenu_Large ++style TextAppearance_AppCompat_Widget_PopupMenu_Small ++style TextAppearance_AppCompat_Widget_Switch ++style TextAppearance_AppCompat_Widget_TextView_SpinnerItem ++style TextAppearance_Compat_Notification ++style TextAppearance_Compat_Notification_Info ++style TextAppearance_Compat_Notification_Line2 ++style TextAppearance_Compat_Notification_Time ++style TextAppearance_Compat_Notification_Title ++style TextAppearance_Widget_AppCompat_ExpandedMenu_Item ++style TextAppearance_Widget_AppCompat_Toolbar_Subtitle ++style TextAppearance_Widget_AppCompat_Toolbar_Title ++style Theme ++style ThemeOverlay_AppCompat ++style ThemeOverlay_AppCompat_ActionBar ++style ThemeOverlay_AppCompat_Dark ++style ThemeOverlay_AppCompat_Dark_ActionBar ++style ThemeOverlay_AppCompat_Dialog ++style ThemeOverlay_AppCompat_Dialog_Alert ++style ThemeOverlay_AppCompat_Light ++style Theme_AppCompat ++style Theme_AppCompat_CompactMenu ++style Theme_AppCompat_DayNight ++style Theme_AppCompat_DayNight_DarkActionBar ++style Theme_AppCompat_DayNight_Dialog ++style Theme_AppCompat_DayNight_DialogWhenLarge ++style Theme_AppCompat_DayNight_Dialog_Alert ++style Theme_AppCompat_DayNight_Dialog_MinWidth ++style Theme_AppCompat_DayNight_NoActionBar ++style Theme_AppCompat_Dialog ++style Theme_AppCompat_DialogWhenLarge ++style Theme_AppCompat_Dialog_Alert ++style Theme_AppCompat_Dialog_MinWidth ++style Theme_AppCompat_Light ++style Theme_AppCompat_Light_DarkActionBar ++style Theme_AppCompat_Light_Dialog ++style Theme_AppCompat_Light_DialogWhenLarge ++style Theme_AppCompat_Light_Dialog_Alert ++style Theme_AppCompat_Light_Dialog_MinWidth ++style Theme_AppCompat_Light_NoActionBar ++style Theme_AppCompat_NoActionBar ++style Theme_Catalyst ++style Theme_Catalyst_LogBox ++style Theme_Catalyst_RedBox ++style Theme_FullScreenDialog ++style Theme_FullScreenDialogAnimatedFade ++style Theme_FullScreenDialogAnimatedSlide ++style Theme_ReactNative_AppCompat_Light ++style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen ++style Widget_AppCompat_ActionBar ++style Widget_AppCompat_ActionBar_Solid ++style Widget_AppCompat_ActionBar_TabBar ++style Widget_AppCompat_ActionBar_TabText ++style Widget_AppCompat_ActionBar_TabView ++style Widget_AppCompat_ActionButton ++style Widget_AppCompat_ActionButton_CloseMode ++style Widget_AppCompat_ActionButton_Overflow ++style Widget_AppCompat_ActionMode ++style Widget_AppCompat_ActivityChooserView ++style Widget_AppCompat_AutoCompleteTextView ++style Widget_AppCompat_Button ++style Widget_AppCompat_ButtonBar ++style Widget_AppCompat_ButtonBar_AlertDialog ++style Widget_AppCompat_Button_Borderless ++style Widget_AppCompat_Button_Borderless_Colored ++style Widget_AppCompat_Button_ButtonBar_AlertDialog ++style Widget_AppCompat_Button_Colored ++style Widget_AppCompat_Button_Small ++style Widget_AppCompat_CompoundButton_CheckBox ++style Widget_AppCompat_CompoundButton_RadioButton ++style Widget_AppCompat_CompoundButton_Switch ++style Widget_AppCompat_DrawerArrowToggle ++style Widget_AppCompat_DropDownItem_Spinner ++style Widget_AppCompat_EditText ++style Widget_AppCompat_ImageButton ++style Widget_AppCompat_Light_ActionBar ++style Widget_AppCompat_Light_ActionBar_Solid ++style Widget_AppCompat_Light_ActionBar_Solid_Inverse ++style Widget_AppCompat_Light_ActionBar_TabBar ++style Widget_AppCompat_Light_ActionBar_TabBar_Inverse ++style Widget_AppCompat_Light_ActionBar_TabText ++style Widget_AppCompat_Light_ActionBar_TabText_Inverse ++style Widget_AppCompat_Light_ActionBar_TabView ++style Widget_AppCompat_Light_ActionBar_TabView_Inverse ++style Widget_AppCompat_Light_ActionButton ++style Widget_AppCompat_Light_ActionButton_CloseMode ++style Widget_AppCompat_Light_ActionButton_Overflow ++style Widget_AppCompat_Light_ActionMode_Inverse ++style Widget_AppCompat_Light_ActivityChooserView ++style Widget_AppCompat_Light_AutoCompleteTextView ++style Widget_AppCompat_Light_DropDownItem_Spinner ++style Widget_AppCompat_Light_ListPopupWindow ++style Widget_AppCompat_Light_ListView_DropDown ++style Widget_AppCompat_Light_PopupMenu ++style Widget_AppCompat_Light_PopupMenu_Overflow ++style Widget_AppCompat_Light_SearchView ++style Widget_AppCompat_Light_Spinner_DropDown_ActionBar ++style Widget_AppCompat_ListMenuView ++style Widget_AppCompat_ListPopupWindow ++style Widget_AppCompat_ListView ++style Widget_AppCompat_ListView_DropDown ++style Widget_AppCompat_ListView_Menu ++style Widget_AppCompat_PopupMenu ++style Widget_AppCompat_PopupMenu_Overflow ++style Widget_AppCompat_PopupWindow ++style Widget_AppCompat_ProgressBar ++style Widget_AppCompat_ProgressBar_Horizontal ++style Widget_AppCompat_RatingBar ++style Widget_AppCompat_RatingBar_Indicator ++style Widget_AppCompat_RatingBar_Small ++style Widget_AppCompat_SearchView ++style Widget_AppCompat_SearchView_ActionBar ++style Widget_AppCompat_SeekBar ++style Widget_AppCompat_SeekBar_Discrete ++style Widget_AppCompat_Spinner ++style Widget_AppCompat_Spinner_DropDown ++style Widget_AppCompat_Spinner_DropDown_ActionBar ++style Widget_AppCompat_Spinner_Underlined ++style Widget_AppCompat_TextView_SpinnerItem ++style Widget_AppCompat_Toolbar ++style Widget_AppCompat_Toolbar_Button_Navigation ++style Widget_Compat_NotificationActionContainer ++style Widget_Compat_NotificationActionText ++style Widget_Support_CoordinatorLayout ++style redboxButton ++styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle ++styleable ActionBarLayout android_layout_gravity ++styleable ActionMenuItemView android_minWidth ++styleable ActionMenuView ++styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle ++styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount ++styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout ++styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible ++styleable AnimatedStateListDrawableItem android_drawable android_id ++styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId ++styleable AppCompatImageView android_src srcCompat tint tintMode ++styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode ++styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance ++styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps ++styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle ++styleable ButtonBarLayout allowStacking ++styleable ColorStateListItem alpha android_alpha android_color ++styleable CompoundButton android_button buttonTint buttonTintMode ++styleable CoordinatorLayout keylines statusBarBackground ++styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline ++styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness ++styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery ++styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex ++styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio ++styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type ++styleable GradientColorItem android_color android_offset ++styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers ++styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width ++styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset ++styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible ++styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText ++styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow ++styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor ++styleable PopupWindowBackgroundState state_above_anchor ++styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle ++styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon ++styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio ++styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme ++styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible ++styleable StateListDrawableItem android_drawable ++styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode ++styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textSize android_textStyle android_typeface fontFamily textAllCaps ++styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor ++styleable View android_focusable android_theme paddingEnd paddingStart theme ++styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode ++styleable ViewStubCompat android_id android_inflatedId android_layout ++xml rn_dev_preferences +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes/debug/classes.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes/debug/classes.jar +new file mode 100644 +index 0000000..7a8a4c7 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes/debug/classes.jar differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +new file mode 100644 +index 0000000..b3a1e4f +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnode.so +new file mode 100755 +index 0000000..6a654b1 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnodejs-mobile-react-native-native-lib.so +new file mode 100755 +index 0000000..5c8930f +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnodejs-mobile-react-native-native-lib.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnode.so +new file mode 100755 +index 0000000..e3186b4 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so +new file mode 100755 +index 0000000..56eb18b +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnode.so +new file mode 100755 +index 0000000..e9181b4 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnodejs-mobile-react-native-native-lib.so +new file mode 100755 +index 0000000..585bfcd +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnodejs-mobile-react-native-native-lib.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnode.so +new file mode 100755 +index 0000000..d912b55 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnode.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnodejs-mobile-react-native-native-lib.so +new file mode 100755 +index 0000000..3b868a2 +Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnodejs-mobile-react-native-native-lib.so differ +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +new file mode 100644 +index 0000000..ac3054a +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +@@ -0,0 +1,1318 @@ ++com.janeasystems.rn_nodejs_mobile ++anim abc_fade_in ++anim abc_fade_out ++anim abc_grow_fade_in_from_bottom ++anim abc_popup_enter ++anim abc_popup_exit ++anim abc_shrink_fade_out_from_bottom ++anim abc_slide_in_bottom ++anim abc_slide_in_top ++anim abc_slide_out_bottom ++anim abc_slide_out_top ++anim abc_tooltip_enter ++anim abc_tooltip_exit ++anim catalyst_fade_in ++anim catalyst_fade_out ++anim catalyst_push_up_in ++anim catalyst_push_up_out ++anim catalyst_slide_down ++anim catalyst_slide_up ++attr actionBarDivider ++attr actionBarItemBackground ++attr actionBarPopupTheme ++attr actionBarSize ++attr actionBarSplitStyle ++attr actionBarStyle ++attr actionBarTabBarStyle ++attr actionBarTabStyle ++attr actionBarTabTextStyle ++attr actionBarTheme ++attr actionBarWidgetTheme ++attr actionButtonStyle ++attr actionDropDownStyle ++attr actionLayout ++attr actionMenuTextAppearance ++attr actionMenuTextColor ++attr actionModeBackground ++attr actionModeCloseButtonStyle ++attr actionModeCloseDrawable ++attr actionModeCopyDrawable ++attr actionModeCutDrawable ++attr actionModeFindDrawable ++attr actionModePasteDrawable ++attr actionModePopupWindowStyle ++attr actionModeSelectAllDrawable ++attr actionModeShareDrawable ++attr actionModeSplitBackground ++attr actionModeStyle ++attr actionModeWebSearchDrawable ++attr actionOverflowButtonStyle ++attr actionOverflowMenuStyle ++attr actionProviderClass ++attr actionViewClass ++attr activityChooserViewStyle ++attr actualImageResource ++attr actualImageScaleType ++attr actualImageUri ++attr alertDialogButtonGroupStyle ++attr alertDialogCenterButtons ++attr alertDialogStyle ++attr alertDialogTheme ++attr allowStacking ++attr alpha ++attr alphabeticModifiers ++attr arrowHeadLength ++attr arrowShaftLength ++attr autoCompleteTextViewStyle ++attr autoSizeMaxTextSize ++attr autoSizeMinTextSize ++attr autoSizePresetSizes ++attr autoSizeStepGranularity ++attr autoSizeTextType ++attr background ++attr backgroundImage ++attr backgroundSplit ++attr backgroundStacked ++attr backgroundTint ++attr backgroundTintMode ++attr barLength ++attr borderlessButtonStyle ++attr buttonBarButtonStyle ++attr buttonBarNegativeButtonStyle ++attr buttonBarNeutralButtonStyle ++attr buttonBarPositiveButtonStyle ++attr buttonBarStyle ++attr buttonGravity ++attr buttonIconDimen ++attr buttonPanelSideLayout ++attr buttonStyle ++attr buttonStyleSmall ++attr buttonTint ++attr buttonTintMode ++attr checkboxStyle ++attr checkedTextViewStyle ++attr closeIcon ++attr closeItemLayout ++attr collapseContentDescription ++attr collapseIcon ++attr color ++attr colorAccent ++attr colorBackgroundFloating ++attr colorButtonNormal ++attr colorControlActivated ++attr colorControlHighlight ++attr colorControlNormal ++attr colorError ++attr colorPrimary ++attr colorPrimaryDark ++attr colorSwitchThumbNormal ++attr commitIcon ++attr contentDescription ++attr contentInsetEnd ++attr contentInsetEndWithActions ++attr contentInsetLeft ++attr contentInsetRight ++attr contentInsetStart ++attr contentInsetStartWithNavigation ++attr controlBackground ++attr coordinatorLayoutStyle ++attr customNavigationLayout ++attr defaultQueryHint ++attr dialogCornerRadius ++attr dialogPreferredPadding ++attr dialogTheme ++attr displayOptions ++attr divider ++attr dividerHorizontal ++attr dividerPadding ++attr dividerVertical ++attr drawableSize ++attr drawerArrowStyle ++attr dropDownListViewStyle ++attr dropdownListPreferredItemHeight ++attr editTextBackground ++attr editTextColor ++attr editTextStyle ++attr elevation ++attr expandActivityOverflowButtonDrawable ++attr fadeDuration ++attr failureImage ++attr failureImageScaleType ++attr firstBaselineToTopHeight ++attr font ++attr fontFamily ++attr fontProviderAuthority ++attr fontProviderCerts ++attr fontProviderFetchStrategy ++attr fontProviderFetchTimeout ++attr fontProviderPackage ++attr fontProviderQuery ++attr fontStyle ++attr fontVariationSettings ++attr fontWeight ++attr gapBetweenBars ++attr goIcon ++attr height ++attr hideOnContentScroll ++attr homeAsUpIndicator ++attr homeLayout ++attr icon ++attr iconTint ++attr iconTintMode ++attr iconifiedByDefault ++attr imageButtonStyle ++attr indeterminateProgressStyle ++attr initialActivityCount ++attr isLightTheme ++attr itemPadding ++attr keylines ++attr lastBaselineToBottomHeight ++attr layout ++attr layout_anchor ++attr layout_anchorGravity ++attr layout_behavior ++attr layout_dodgeInsetEdges ++attr layout_insetEdge ++attr layout_keyline ++attr lineHeight ++attr listChoiceBackgroundIndicator ++attr listDividerAlertDialog ++attr listItemLayout ++attr listLayout ++attr listMenuViewStyle ++attr listPopupWindowStyle ++attr listPreferredItemHeight ++attr listPreferredItemHeightLarge ++attr listPreferredItemHeightSmall ++attr listPreferredItemPaddingLeft ++attr listPreferredItemPaddingRight ++attr logo ++attr logoDescription ++attr maxButtonHeight ++attr measureWithLargestChild ++attr multiChoiceItemLayout ++attr navigationContentDescription ++attr navigationIcon ++attr navigationMode ++attr numericModifiers ++attr overlapAnchor ++attr overlayImage ++attr paddingBottomNoButtons ++attr paddingEnd ++attr paddingStart ++attr paddingTopNoTitle ++attr panelBackground ++attr panelMenuListTheme ++attr panelMenuListWidth ++attr placeholderImage ++attr placeholderImageScaleType ++attr popupMenuStyle ++attr popupTheme ++attr popupWindowStyle ++attr preserveIconSpacing ++attr pressedStateOverlayImage ++attr progressBarAutoRotateInterval ++attr progressBarImage ++attr progressBarImageScaleType ++attr progressBarPadding ++attr progressBarStyle ++attr queryBackground ++attr queryHint ++attr radioButtonStyle ++attr ratingBarStyle ++attr ratingBarStyleIndicator ++attr ratingBarStyleSmall ++attr retryImage ++attr retryImageScaleType ++attr roundAsCircle ++attr roundBottomEnd ++attr roundBottomLeft ++attr roundBottomRight ++attr roundBottomStart ++attr roundTopEnd ++attr roundTopLeft ++attr roundTopRight ++attr roundTopStart ++attr roundWithOverlayColor ++attr roundedCornerRadius ++attr roundingBorderColor ++attr roundingBorderPadding ++attr roundingBorderWidth ++attr searchHintIcon ++attr searchIcon ++attr searchViewStyle ++attr seekBarStyle ++attr selectableItemBackground ++attr selectableItemBackgroundBorderless ++attr showAsAction ++attr showDividers ++attr showText ++attr showTitle ++attr singleChoiceItemLayout ++attr spinBars ++attr spinnerDropDownItemStyle ++attr spinnerStyle ++attr splitTrack ++attr srcCompat ++attr state_above_anchor ++attr statusBarBackground ++attr subMenuArrow ++attr submitBackground ++attr subtitle ++attr subtitleTextAppearance ++attr subtitleTextColor ++attr subtitleTextStyle ++attr suggestionRowLayout ++attr switchMinWidth ++attr switchPadding ++attr switchStyle ++attr switchTextAppearance ++attr textAllCaps ++attr textAppearanceLargePopupMenu ++attr textAppearanceListItem ++attr textAppearanceListItemSecondary ++attr textAppearanceListItemSmall ++attr textAppearancePopupMenuHeader ++attr textAppearanceSearchResultSubtitle ++attr textAppearanceSearchResultTitle ++attr textAppearanceSmallPopupMenu ++attr textColorAlertDialogListItem ++attr textColorSearchUrl ++attr theme ++attr thickness ++attr thumbTextPadding ++attr thumbTint ++attr thumbTintMode ++attr tickMark ++attr tickMarkTint ++attr tickMarkTintMode ++attr tint ++attr tintMode ++attr title ++attr titleMargin ++attr titleMarginBottom ++attr titleMarginEnd ++attr titleMarginStart ++attr titleMarginTop ++attr titleMargins ++attr titleTextAppearance ++attr titleTextColor ++attr titleTextStyle ++attr toolbarNavigationButtonStyle ++attr toolbarStyle ++attr tooltipForegroundColor ++attr tooltipFrameBackground ++attr tooltipText ++attr track ++attr trackTint ++attr trackTintMode ++attr ttcIndex ++attr viewAspectRatio ++attr viewInflaterClass ++attr voiceIcon ++attr windowActionBar ++attr windowActionBarOverlay ++attr windowActionModeOverlay ++attr windowFixedHeightMajor ++attr windowFixedHeightMinor ++attr windowFixedWidthMajor ++attr windowFixedWidthMinor ++attr windowMinWidthMajor ++attr windowMinWidthMinor ++attr windowNoTitle ++bool abc_action_bar_embed_tabs ++bool abc_allow_stacked_button_bar ++bool abc_config_actionMenuItemAllCaps ++color abc_background_cache_hint_selector_material_dark ++color abc_background_cache_hint_selector_material_light ++color abc_btn_colored_borderless_text_material ++color abc_btn_colored_text_material ++color abc_color_highlight_material ++color abc_hint_foreground_material_dark ++color abc_hint_foreground_material_light ++color abc_input_method_navigation_guard ++color abc_primary_text_disable_only_material_dark ++color abc_primary_text_disable_only_material_light ++color abc_primary_text_material_dark ++color abc_primary_text_material_light ++color abc_search_url_text ++color abc_search_url_text_normal ++color abc_search_url_text_pressed ++color abc_search_url_text_selected ++color abc_secondary_text_material_dark ++color abc_secondary_text_material_light ++color abc_tint_btn_checkable ++color abc_tint_default ++color abc_tint_edittext ++color abc_tint_seek_thumb ++color abc_tint_spinner ++color abc_tint_switch_track ++color accent_material_dark ++color accent_material_light ++color background_floating_material_dark ++color background_floating_material_light ++color background_material_dark ++color background_material_light ++color bright_foreground_disabled_material_dark ++color bright_foreground_disabled_material_light ++color bright_foreground_inverse_material_dark ++color bright_foreground_inverse_material_light ++color bright_foreground_material_dark ++color bright_foreground_material_light ++color button_material_dark ++color button_material_light ++color catalyst_logbox_background ++color catalyst_redbox_background ++color dim_foreground_disabled_material_dark ++color dim_foreground_disabled_material_light ++color dim_foreground_material_dark ++color dim_foreground_material_light ++color error_color_material_dark ++color error_color_material_light ++color foreground_material_dark ++color foreground_material_light ++color highlighted_text_material_dark ++color highlighted_text_material_light ++color material_blue_grey_800 ++color material_blue_grey_900 ++color material_blue_grey_950 ++color material_deep_teal_200 ++color material_deep_teal_500 ++color material_grey_100 ++color material_grey_300 ++color material_grey_50 ++color material_grey_600 ++color material_grey_800 ++color material_grey_850 ++color material_grey_900 ++color notification_action_color_filter ++color notification_icon_bg_color ++color primary_dark_material_dark ++color primary_dark_material_light ++color primary_material_dark ++color primary_material_light ++color primary_text_default_material_dark ++color primary_text_default_material_light ++color primary_text_disabled_material_dark ++color primary_text_disabled_material_light ++color ripple_material_dark ++color ripple_material_light ++color secondary_text_default_material_dark ++color secondary_text_default_material_light ++color secondary_text_disabled_material_dark ++color secondary_text_disabled_material_light ++color switch_thumb_disabled_material_dark ++color switch_thumb_disabled_material_light ++color switch_thumb_material_dark ++color switch_thumb_material_light ++color switch_thumb_normal_material_dark ++color switch_thumb_normal_material_light ++color tooltip_background_dark ++color tooltip_background_light ++dimen abc_action_bar_content_inset_material ++dimen abc_action_bar_content_inset_with_nav ++dimen abc_action_bar_default_height_material ++dimen abc_action_bar_default_padding_end_material ++dimen abc_action_bar_default_padding_start_material ++dimen abc_action_bar_elevation_material ++dimen abc_action_bar_icon_vertical_padding_material ++dimen abc_action_bar_overflow_padding_end_material ++dimen abc_action_bar_overflow_padding_start_material ++dimen abc_action_bar_stacked_max_height ++dimen abc_action_bar_stacked_tab_max_width ++dimen abc_action_bar_subtitle_bottom_margin_material ++dimen abc_action_bar_subtitle_top_margin_material ++dimen abc_action_button_min_height_material ++dimen abc_action_button_min_width_material ++dimen abc_action_button_min_width_overflow_material ++dimen abc_alert_dialog_button_bar_height ++dimen abc_alert_dialog_button_dimen ++dimen abc_button_inset_horizontal_material ++dimen abc_button_inset_vertical_material ++dimen abc_button_padding_horizontal_material ++dimen abc_button_padding_vertical_material ++dimen abc_cascading_menus_min_smallest_width ++dimen abc_config_prefDialogWidth ++dimen abc_control_corner_material ++dimen abc_control_inset_material ++dimen abc_control_padding_material ++dimen abc_dialog_corner_radius_material ++dimen abc_dialog_fixed_height_major ++dimen abc_dialog_fixed_height_minor ++dimen abc_dialog_fixed_width_major ++dimen abc_dialog_fixed_width_minor ++dimen abc_dialog_list_padding_bottom_no_buttons ++dimen abc_dialog_list_padding_top_no_title ++dimen abc_dialog_min_width_major ++dimen abc_dialog_min_width_minor ++dimen abc_dialog_padding_material ++dimen abc_dialog_padding_top_material ++dimen abc_dialog_title_divider_material ++dimen abc_disabled_alpha_material_dark ++dimen abc_disabled_alpha_material_light ++dimen abc_dropdownitem_icon_width ++dimen abc_dropdownitem_text_padding_left ++dimen abc_dropdownitem_text_padding_right ++dimen abc_edit_text_inset_bottom_material ++dimen abc_edit_text_inset_horizontal_material ++dimen abc_edit_text_inset_top_material ++dimen abc_floating_window_z ++dimen abc_list_item_padding_horizontal_material ++dimen abc_panel_menu_list_width ++dimen abc_progress_bar_height_material ++dimen abc_search_view_preferred_height ++dimen abc_search_view_preferred_width ++dimen abc_seekbar_track_background_height_material ++dimen abc_seekbar_track_progress_height_material ++dimen abc_select_dialog_padding_start_material ++dimen abc_switch_padding ++dimen abc_text_size_body_1_material ++dimen abc_text_size_body_2_material ++dimen abc_text_size_button_material ++dimen abc_text_size_caption_material ++dimen abc_text_size_display_1_material ++dimen abc_text_size_display_2_material ++dimen abc_text_size_display_3_material ++dimen abc_text_size_display_4_material ++dimen abc_text_size_headline_material ++dimen abc_text_size_large_material ++dimen abc_text_size_medium_material ++dimen abc_text_size_menu_header_material ++dimen abc_text_size_menu_material ++dimen abc_text_size_small_material ++dimen abc_text_size_subhead_material ++dimen abc_text_size_subtitle_material_toolbar ++dimen abc_text_size_title_material ++dimen abc_text_size_title_material_toolbar ++dimen compat_button_inset_horizontal_material ++dimen compat_button_inset_vertical_material ++dimen compat_button_padding_horizontal_material ++dimen compat_button_padding_vertical_material ++dimen compat_control_corner_material ++dimen compat_notification_large_icon_max_height ++dimen compat_notification_large_icon_max_width ++dimen disabled_alpha_material_dark ++dimen disabled_alpha_material_light ++dimen highlight_alpha_material_colored ++dimen highlight_alpha_material_dark ++dimen highlight_alpha_material_light ++dimen hint_alpha_material_dark ++dimen hint_alpha_material_light ++dimen hint_pressed_alpha_material_dark ++dimen hint_pressed_alpha_material_light ++dimen notification_action_icon_size ++dimen notification_action_text_size ++dimen notification_big_circle_margin ++dimen notification_content_margin_start ++dimen notification_large_icon_height ++dimen notification_large_icon_width ++dimen notification_main_column_padding_top ++dimen notification_media_narrow_margin ++dimen notification_right_icon_size ++dimen notification_right_side_padding_top ++dimen notification_small_icon_background_padding ++dimen notification_small_icon_size_as_large ++dimen notification_subtext_size ++dimen notification_top_pad ++dimen notification_top_pad_large_text ++dimen tooltip_corner_radius ++dimen tooltip_horizontal_padding ++dimen tooltip_margin ++dimen tooltip_precise_anchor_extra_offset ++dimen tooltip_precise_anchor_threshold ++dimen tooltip_vertical_padding ++dimen tooltip_y_offset_non_touch ++dimen tooltip_y_offset_touch ++drawable abc_ab_share_pack_mtrl_alpha ++drawable abc_action_bar_item_background_material ++drawable abc_btn_borderless_material ++drawable abc_btn_check_material ++drawable abc_btn_check_to_on_mtrl_000 ++drawable abc_btn_check_to_on_mtrl_015 ++drawable abc_btn_colored_material ++drawable abc_btn_default_mtrl_shape ++drawable abc_btn_radio_material ++drawable abc_btn_radio_to_on_mtrl_000 ++drawable abc_btn_radio_to_on_mtrl_015 ++drawable abc_btn_switch_to_on_mtrl_00001 ++drawable abc_btn_switch_to_on_mtrl_00012 ++drawable abc_cab_background_internal_bg ++drawable abc_cab_background_top_material ++drawable abc_cab_background_top_mtrl_alpha ++drawable abc_control_background_material ++drawable abc_dialog_material_background ++drawable abc_edit_text_material ++drawable abc_ic_ab_back_material ++drawable abc_ic_arrow_drop_right_black_24dp ++drawable abc_ic_clear_material ++drawable abc_ic_commit_search_api_mtrl_alpha ++drawable abc_ic_go_search_api_material ++drawable abc_ic_menu_copy_mtrl_am_alpha ++drawable abc_ic_menu_cut_mtrl_alpha ++drawable abc_ic_menu_overflow_material ++drawable abc_ic_menu_paste_mtrl_am_alpha ++drawable abc_ic_menu_selectall_mtrl_alpha ++drawable abc_ic_menu_share_mtrl_alpha ++drawable abc_ic_search_api_material ++drawable abc_ic_star_black_16dp ++drawable abc_ic_star_black_36dp ++drawable abc_ic_star_black_48dp ++drawable abc_ic_star_half_black_16dp ++drawable abc_ic_star_half_black_36dp ++drawable abc_ic_star_half_black_48dp ++drawable abc_ic_voice_search_api_material ++drawable abc_item_background_holo_dark ++drawable abc_item_background_holo_light ++drawable abc_list_divider_material ++drawable abc_list_divider_mtrl_alpha ++drawable abc_list_focused_holo ++drawable abc_list_longpressed_holo ++drawable abc_list_pressed_holo_dark ++drawable abc_list_pressed_holo_light ++drawable abc_list_selector_background_transition_holo_dark ++drawable abc_list_selector_background_transition_holo_light ++drawable abc_list_selector_disabled_holo_dark ++drawable abc_list_selector_disabled_holo_light ++drawable abc_list_selector_holo_dark ++drawable abc_list_selector_holo_light ++drawable abc_menu_hardkey_panel_mtrl_mult ++drawable abc_popup_background_mtrl_mult ++drawable abc_ratingbar_indicator_material ++drawable abc_ratingbar_material ++drawable abc_ratingbar_small_material ++drawable abc_scrubber_control_off_mtrl_alpha ++drawable abc_scrubber_control_to_pressed_mtrl_000 ++drawable abc_scrubber_control_to_pressed_mtrl_005 ++drawable abc_scrubber_primary_mtrl_alpha ++drawable abc_scrubber_track_mtrl_alpha ++drawable abc_seekbar_thumb_material ++drawable abc_seekbar_tick_mark_material ++drawable abc_seekbar_track_material ++drawable abc_spinner_mtrl_am_alpha ++drawable abc_spinner_textfield_background_material ++drawable abc_switch_thumb_material ++drawable abc_switch_track_mtrl_alpha ++drawable abc_tab_indicator_material ++drawable abc_tab_indicator_mtrl_alpha ++drawable abc_text_cursor_material ++drawable abc_text_select_handle_left_mtrl_dark ++drawable abc_text_select_handle_left_mtrl_light ++drawable abc_text_select_handle_middle_mtrl_dark ++drawable abc_text_select_handle_middle_mtrl_light ++drawable abc_text_select_handle_right_mtrl_dark ++drawable abc_text_select_handle_right_mtrl_light ++drawable abc_textfield_activated_mtrl_alpha ++drawable abc_textfield_default_mtrl_alpha ++drawable abc_textfield_search_activated_mtrl_alpha ++drawable abc_textfield_search_default_mtrl_alpha ++drawable abc_textfield_search_material ++drawable abc_vector_test ++drawable notification_action_background ++drawable notification_bg ++drawable notification_bg_low ++drawable notification_bg_low_normal ++drawable notification_bg_low_pressed ++drawable notification_bg_normal ++drawable notification_bg_normal_pressed ++drawable notification_icon_background ++drawable notification_template_icon_bg ++drawable notification_template_icon_low_bg ++drawable notification_tile_bg ++drawable notify_panel_notification_icon_bg ++drawable redbox_top_border_background ++drawable tooltip_frame_dark ++drawable tooltip_frame_light ++id accessibility_actions ++id accessibility_hint ++id accessibility_label ++id accessibility_role ++id accessibility_state ++id accessibility_value ++id action_bar ++id action_bar_activity_content ++id action_bar_container ++id action_bar_root ++id action_bar_spinner ++id action_bar_subtitle ++id action_bar_title ++id action_container ++id action_context_bar ++id action_divider ++id action_image ++id action_menu_divider ++id action_menu_presenter ++id action_mode_bar ++id action_mode_bar_stub ++id action_mode_close_button ++id action_text ++id actions ++id activity_chooser_view_content ++id add ++id alertTitle ++id async ++id blocking ++id bottom ++id buttonPanel ++id catalyst_redbox_title ++id center ++id centerCrop ++id centerInside ++id checkbox ++id chronometer ++id content ++id contentPanel ++id custom ++id customPanel ++id decor_content_parent ++id default_activity_button ++id edit_query ++id end ++id expand_activities_button ++id expanded_menu ++id fitBottomStart ++id fitCenter ++id fitEnd ++id fitStart ++id fitXY ++id focusCrop ++id forever ++id fps_text ++id group_divider ++id home ++id icon ++id icon_group ++id image ++id info ++id italic ++id left ++id line1 ++id line3 ++id listMode ++id list_item ++id message ++id multiply ++id none ++id normal ++id notification_background ++id notification_main_column ++id notification_main_column_container ++id parentPanel ++id progress_circular ++id progress_horizontal ++id radio ++id react_test_id ++id right ++id right_icon ++id right_side ++id rn_frame_file ++id rn_frame_method ++id rn_redbox_dismiss_button ++id rn_redbox_line_separator ++id rn_redbox_loading_indicator ++id rn_redbox_reload_button ++id rn_redbox_report_button ++id rn_redbox_report_label ++id rn_redbox_stack ++id screen ++id scrollIndicatorDown ++id scrollIndicatorUp ++id scrollView ++id search_badge ++id search_bar ++id search_button ++id search_close_btn ++id search_edit_frame ++id search_go_btn ++id search_mag_icon ++id search_plate ++id search_src_text ++id search_voice_btn ++id select_dialog_listview ++id shortcut ++id spacer ++id split_action_bar ++id src_atop ++id src_in ++id src_over ++id start ++id submenuarrow ++id submit_area ++id tabMode ++id tag_transition_group ++id tag_unhandled_key_event_manager ++id tag_unhandled_key_listeners ++id text ++id text2 ++id textSpacerNoButtons ++id textSpacerNoTitle ++id time ++id title ++id titleDividerNoCustom ++id title_template ++id top ++id topPanel ++id uniform ++id up ++id view_tag_instance_handle ++id view_tag_native_id ++id wrap_content ++integer abc_config_activityDefaultDur ++integer abc_config_activityShortDur ++integer cancel_button_image_alpha ++integer config_tooltipAnimTime ++integer react_native_dev_server_port ++integer react_native_inspector_proxy_port ++integer status_bar_notification_info_maxnum ++layout abc_action_bar_title_item ++layout abc_action_bar_up_container ++layout abc_action_menu_item_layout ++layout abc_action_menu_layout ++layout abc_action_mode_bar ++layout abc_action_mode_close_item_material ++layout abc_activity_chooser_view ++layout abc_activity_chooser_view_list_item ++layout abc_alert_dialog_button_bar_material ++layout abc_alert_dialog_material ++layout abc_alert_dialog_title_material ++layout abc_cascading_menu_item_layout ++layout abc_dialog_title_material ++layout abc_expanded_menu_layout ++layout abc_list_menu_item_checkbox ++layout abc_list_menu_item_icon ++layout abc_list_menu_item_layout ++layout abc_list_menu_item_radio ++layout abc_popup_menu_header_item_layout ++layout abc_popup_menu_item_layout ++layout abc_screen_content_include ++layout abc_screen_simple ++layout abc_screen_simple_overlay_action_mode ++layout abc_screen_toolbar ++layout abc_search_dropdown_item_icons_2line ++layout abc_search_view ++layout abc_select_dialog_material ++layout abc_tooltip ++layout dev_loading_view ++layout fps_view ++layout notification_action ++layout notification_action_tombstone ++layout notification_template_custom_big ++layout notification_template_icon_group ++layout notification_template_part_chronometer ++layout notification_template_part_time ++layout redbox_item_frame ++layout redbox_item_title ++layout redbox_view ++layout select_dialog_item_material ++layout select_dialog_multichoice_material ++layout select_dialog_singlechoice_material ++layout support_simple_spinner_dropdown_item ++string abc_action_bar_home_description ++string abc_action_bar_up_description ++string abc_action_menu_overflow_description ++string abc_action_mode_done ++string abc_activity_chooser_view_see_all ++string abc_activitychooserview_choose_application ++string abc_capital_off ++string abc_capital_on ++string abc_font_family_body_1_material ++string abc_font_family_body_2_material ++string abc_font_family_button_material ++string abc_font_family_caption_material ++string abc_font_family_display_1_material ++string abc_font_family_display_2_material ++string abc_font_family_display_3_material ++string abc_font_family_display_4_material ++string abc_font_family_headline_material ++string abc_font_family_menu_material ++string abc_font_family_subhead_material ++string abc_font_family_title_material ++string abc_menu_alt_shortcut_label ++string abc_menu_ctrl_shortcut_label ++string abc_menu_delete_shortcut_label ++string abc_menu_enter_shortcut_label ++string abc_menu_function_shortcut_label ++string abc_menu_meta_shortcut_label ++string abc_menu_shift_shortcut_label ++string abc_menu_space_shortcut_label ++string abc_menu_sym_shortcut_label ++string abc_prepend_shortcut_label ++string abc_search_hint ++string abc_searchview_description_clear ++string abc_searchview_description_query ++string abc_searchview_description_search ++string abc_searchview_description_submit ++string abc_searchview_description_voice ++string abc_shareactionprovider_share_with ++string abc_shareactionprovider_share_with_application ++string abc_toolbar_collapse_description ++string alert_description ++string button_description ++string catalyst_change_bundle_location ++string catalyst_copy_button ++string catalyst_debug ++string catalyst_debug_chrome ++string catalyst_debug_chrome_stop ++string catalyst_debug_connecting ++string catalyst_debug_error ++string catalyst_debug_nuclide ++string catalyst_debug_nuclide_error ++string catalyst_debug_stop ++string catalyst_dismiss_button ++string catalyst_heap_capture ++string catalyst_hot_reloading ++string catalyst_hot_reloading_auto_disable ++string catalyst_hot_reloading_auto_enable ++string catalyst_hot_reloading_stop ++string catalyst_inspector ++string catalyst_loading_from_url ++string catalyst_perf_monitor ++string catalyst_perf_monitor_stop ++string catalyst_reload ++string catalyst_reload_button ++string catalyst_reload_error ++string catalyst_report_button ++string catalyst_sample_profiler_disable ++string catalyst_sample_profiler_enable ++string catalyst_settings ++string catalyst_settings_title ++string combobox_description ++string header_description ++string image_description ++string imagebutton_description ++string link_description ++string menu_description ++string menubar_description ++string menuitem_description ++string progressbar_description ++string radiogroup_description ++string rn_tab_description ++string scrollbar_description ++string search_description ++string search_menu_title ++string spinbutton_description ++string state_busy_description ++string state_collapsed_description ++string state_expanded_description ++string state_mixed_description ++string state_off_description ++string state_on_description ++string status_bar_notification_info_overflow ++string summary_description ++string tablist_description ++string timer_description ++string toolbar_description ++style AlertDialog_AppCompat ++style AlertDialog_AppCompat_Light ++style Animation_AppCompat_Dialog ++style Animation_AppCompat_DropDownUp ++style Animation_AppCompat_Tooltip ++style Animation_Catalyst_LogBox ++style Animation_Catalyst_RedBox ++style Base_AlertDialog_AppCompat ++style Base_AlertDialog_AppCompat_Light ++style Base_Animation_AppCompat_Dialog ++style Base_Animation_AppCompat_DropDownUp ++style Base_Animation_AppCompat_Tooltip ++style Base_DialogWindowTitleBackground_AppCompat ++style Base_DialogWindowTitle_AppCompat ++style Base_TextAppearance_AppCompat ++style Base_TextAppearance_AppCompat_Body1 ++style Base_TextAppearance_AppCompat_Body2 ++style Base_TextAppearance_AppCompat_Button ++style Base_TextAppearance_AppCompat_Caption ++style Base_TextAppearance_AppCompat_Display1 ++style Base_TextAppearance_AppCompat_Display2 ++style Base_TextAppearance_AppCompat_Display3 ++style Base_TextAppearance_AppCompat_Display4 ++style Base_TextAppearance_AppCompat_Headline ++style Base_TextAppearance_AppCompat_Inverse ++style Base_TextAppearance_AppCompat_Large ++style Base_TextAppearance_AppCompat_Large_Inverse ++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large ++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small ++style Base_TextAppearance_AppCompat_Medium ++style Base_TextAppearance_AppCompat_Medium_Inverse ++style Base_TextAppearance_AppCompat_Menu ++style Base_TextAppearance_AppCompat_SearchResult ++style Base_TextAppearance_AppCompat_SearchResult_Subtitle ++style Base_TextAppearance_AppCompat_SearchResult_Title ++style Base_TextAppearance_AppCompat_Small ++style Base_TextAppearance_AppCompat_Small_Inverse ++style Base_TextAppearance_AppCompat_Subhead ++style Base_TextAppearance_AppCompat_Subhead_Inverse ++style Base_TextAppearance_AppCompat_Title ++style Base_TextAppearance_AppCompat_Title_Inverse ++style Base_TextAppearance_AppCompat_Tooltip ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title ++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse ++style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle ++style Base_TextAppearance_AppCompat_Widget_ActionMode_Title ++style Base_TextAppearance_AppCompat_Widget_Button ++style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored ++style Base_TextAppearance_AppCompat_Widget_Button_Colored ++style Base_TextAppearance_AppCompat_Widget_Button_Inverse ++style Base_TextAppearance_AppCompat_Widget_DropDownItem ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large ++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small ++style Base_TextAppearance_AppCompat_Widget_Switch ++style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem ++style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item ++style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle ++style Base_TextAppearance_Widget_AppCompat_Toolbar_Title ++style Base_ThemeOverlay_AppCompat ++style Base_ThemeOverlay_AppCompat_ActionBar ++style Base_ThemeOverlay_AppCompat_Dark ++style Base_ThemeOverlay_AppCompat_Dark_ActionBar ++style Base_ThemeOverlay_AppCompat_Dialog ++style Base_ThemeOverlay_AppCompat_Dialog_Alert ++style Base_ThemeOverlay_AppCompat_Light ++style Base_Theme_AppCompat ++style Base_Theme_AppCompat_CompactMenu ++style Base_Theme_AppCompat_Dialog ++style Base_Theme_AppCompat_DialogWhenLarge ++style Base_Theme_AppCompat_Dialog_Alert ++style Base_Theme_AppCompat_Dialog_FixedSize ++style Base_Theme_AppCompat_Dialog_MinWidth ++style Base_Theme_AppCompat_Light ++style Base_Theme_AppCompat_Light_DarkActionBar ++style Base_Theme_AppCompat_Light_Dialog ++style Base_Theme_AppCompat_Light_DialogWhenLarge ++style Base_Theme_AppCompat_Light_Dialog_Alert ++style Base_Theme_AppCompat_Light_Dialog_FixedSize ++style Base_Theme_AppCompat_Light_Dialog_MinWidth ++style Base_V21_ThemeOverlay_AppCompat_Dialog ++style Base_V21_Theme_AppCompat ++style Base_V21_Theme_AppCompat_Dialog ++style Base_V21_Theme_AppCompat_Light ++style Base_V21_Theme_AppCompat_Light_Dialog ++style Base_V22_Theme_AppCompat ++style Base_V22_Theme_AppCompat_Light ++style Base_V23_Theme_AppCompat ++style Base_V23_Theme_AppCompat_Light ++style Base_V26_Theme_AppCompat ++style Base_V26_Theme_AppCompat_Light ++style Base_V26_Widget_AppCompat_Toolbar ++style Base_V28_Theme_AppCompat ++style Base_V28_Theme_AppCompat_Light ++style Base_V7_ThemeOverlay_AppCompat_Dialog ++style Base_V7_Theme_AppCompat ++style Base_V7_Theme_AppCompat_Dialog ++style Base_V7_Theme_AppCompat_Light ++style Base_V7_Theme_AppCompat_Light_Dialog ++style Base_V7_Widget_AppCompat_AutoCompleteTextView ++style Base_V7_Widget_AppCompat_EditText ++style Base_V7_Widget_AppCompat_Toolbar ++style Base_Widget_AppCompat_ActionBar ++style Base_Widget_AppCompat_ActionBar_Solid ++style Base_Widget_AppCompat_ActionBar_TabBar ++style Base_Widget_AppCompat_ActionBar_TabText ++style Base_Widget_AppCompat_ActionBar_TabView ++style Base_Widget_AppCompat_ActionButton ++style Base_Widget_AppCompat_ActionButton_CloseMode ++style Base_Widget_AppCompat_ActionButton_Overflow ++style Base_Widget_AppCompat_ActionMode ++style Base_Widget_AppCompat_ActivityChooserView ++style Base_Widget_AppCompat_AutoCompleteTextView ++style Base_Widget_AppCompat_Button ++style Base_Widget_AppCompat_ButtonBar ++style Base_Widget_AppCompat_ButtonBar_AlertDialog ++style Base_Widget_AppCompat_Button_Borderless ++style Base_Widget_AppCompat_Button_Borderless_Colored ++style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog ++style Base_Widget_AppCompat_Button_Colored ++style Base_Widget_AppCompat_Button_Small ++style Base_Widget_AppCompat_CompoundButton_CheckBox ++style Base_Widget_AppCompat_CompoundButton_RadioButton ++style Base_Widget_AppCompat_CompoundButton_Switch ++style Base_Widget_AppCompat_DrawerArrowToggle ++style Base_Widget_AppCompat_DrawerArrowToggle_Common ++style Base_Widget_AppCompat_DropDownItem_Spinner ++style Base_Widget_AppCompat_EditText ++style Base_Widget_AppCompat_ImageButton ++style Base_Widget_AppCompat_Light_ActionBar ++style Base_Widget_AppCompat_Light_ActionBar_Solid ++style Base_Widget_AppCompat_Light_ActionBar_TabBar ++style Base_Widget_AppCompat_Light_ActionBar_TabText ++style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse ++style Base_Widget_AppCompat_Light_ActionBar_TabView ++style Base_Widget_AppCompat_Light_PopupMenu ++style Base_Widget_AppCompat_Light_PopupMenu_Overflow ++style Base_Widget_AppCompat_ListMenuView ++style Base_Widget_AppCompat_ListPopupWindow ++style Base_Widget_AppCompat_ListView ++style Base_Widget_AppCompat_ListView_DropDown ++style Base_Widget_AppCompat_ListView_Menu ++style Base_Widget_AppCompat_PopupMenu ++style Base_Widget_AppCompat_PopupMenu_Overflow ++style Base_Widget_AppCompat_PopupWindow ++style Base_Widget_AppCompat_ProgressBar ++style Base_Widget_AppCompat_ProgressBar_Horizontal ++style Base_Widget_AppCompat_RatingBar ++style Base_Widget_AppCompat_RatingBar_Indicator ++style Base_Widget_AppCompat_RatingBar_Small ++style Base_Widget_AppCompat_SearchView ++style Base_Widget_AppCompat_SearchView_ActionBar ++style Base_Widget_AppCompat_SeekBar ++style Base_Widget_AppCompat_SeekBar_Discrete ++style Base_Widget_AppCompat_Spinner ++style Base_Widget_AppCompat_Spinner_Underlined ++style Base_Widget_AppCompat_TextView_SpinnerItem ++style Base_Widget_AppCompat_Toolbar ++style Base_Widget_AppCompat_Toolbar_Button_Navigation ++style CalendarDatePickerDialog ++style CalendarDatePickerStyle ++style ClockTimePickerDialog ++style ClockTimePickerStyle ++style DialogAnimationFade ++style DialogAnimationSlide ++style Platform_AppCompat ++style Platform_AppCompat_Light ++style Platform_ThemeOverlay_AppCompat ++style Platform_ThemeOverlay_AppCompat_Dark ++style Platform_ThemeOverlay_AppCompat_Light ++style Platform_V21_AppCompat ++style Platform_V21_AppCompat_Light ++style Platform_V25_AppCompat ++style Platform_V25_AppCompat_Light ++style Platform_Widget_AppCompat_Spinner ++style RtlOverlay_DialogWindowTitle_AppCompat ++style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem ++style RtlOverlay_Widget_AppCompat_DialogTitle_Icon ++style RtlOverlay_Widget_AppCompat_PopupMenuItem ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text ++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title ++style RtlOverlay_Widget_AppCompat_SearchView_MagIcon ++style RtlOverlay_Widget_AppCompat_Search_DropDown ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Query ++style RtlOverlay_Widget_AppCompat_Search_DropDown_Text ++style RtlUnderlay_Widget_AppCompat_ActionButton ++style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow ++style SpinnerDatePickerDialog ++style SpinnerDatePickerStyle ++style SpinnerTimePickerDialog ++style SpinnerTimePickerStyle ++style TextAppearance_AppCompat ++style TextAppearance_AppCompat_Body1 ++style TextAppearance_AppCompat_Body2 ++style TextAppearance_AppCompat_Button ++style TextAppearance_AppCompat_Caption ++style TextAppearance_AppCompat_Display1 ++style TextAppearance_AppCompat_Display2 ++style TextAppearance_AppCompat_Display3 ++style TextAppearance_AppCompat_Display4 ++style TextAppearance_AppCompat_Headline ++style TextAppearance_AppCompat_Inverse ++style TextAppearance_AppCompat_Large ++style TextAppearance_AppCompat_Large_Inverse ++style TextAppearance_AppCompat_Light_SearchResult_Subtitle ++style TextAppearance_AppCompat_Light_SearchResult_Title ++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large ++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small ++style TextAppearance_AppCompat_Medium ++style TextAppearance_AppCompat_Medium_Inverse ++style TextAppearance_AppCompat_Menu ++style TextAppearance_AppCompat_SearchResult_Subtitle ++style TextAppearance_AppCompat_SearchResult_Title ++style TextAppearance_AppCompat_Small ++style TextAppearance_AppCompat_Small_Inverse ++style TextAppearance_AppCompat_Subhead ++style TextAppearance_AppCompat_Subhead_Inverse ++style TextAppearance_AppCompat_Title ++style TextAppearance_AppCompat_Title_Inverse ++style TextAppearance_AppCompat_Tooltip ++style TextAppearance_AppCompat_Widget_ActionBar_Menu ++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle ++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse ++style TextAppearance_AppCompat_Widget_ActionBar_Title ++style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse ++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle ++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse ++style TextAppearance_AppCompat_Widget_ActionMode_Title ++style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse ++style TextAppearance_AppCompat_Widget_Button ++style TextAppearance_AppCompat_Widget_Button_Borderless_Colored ++style TextAppearance_AppCompat_Widget_Button_Colored ++style TextAppearance_AppCompat_Widget_Button_Inverse ++style TextAppearance_AppCompat_Widget_DropDownItem ++style TextAppearance_AppCompat_Widget_PopupMenu_Header ++style TextAppearance_AppCompat_Widget_PopupMenu_Large ++style TextAppearance_AppCompat_Widget_PopupMenu_Small ++style TextAppearance_AppCompat_Widget_Switch ++style TextAppearance_AppCompat_Widget_TextView_SpinnerItem ++style TextAppearance_Compat_Notification ++style TextAppearance_Compat_Notification_Info ++style TextAppearance_Compat_Notification_Line2 ++style TextAppearance_Compat_Notification_Time ++style TextAppearance_Compat_Notification_Title ++style TextAppearance_Widget_AppCompat_ExpandedMenu_Item ++style TextAppearance_Widget_AppCompat_Toolbar_Subtitle ++style TextAppearance_Widget_AppCompat_Toolbar_Title ++style Theme ++style ThemeOverlay_AppCompat ++style ThemeOverlay_AppCompat_ActionBar ++style ThemeOverlay_AppCompat_Dark ++style ThemeOverlay_AppCompat_Dark_ActionBar ++style ThemeOverlay_AppCompat_Dialog ++style ThemeOverlay_AppCompat_Dialog_Alert ++style ThemeOverlay_AppCompat_Light ++style Theme_AppCompat ++style Theme_AppCompat_CompactMenu ++style Theme_AppCompat_DayNight ++style Theme_AppCompat_DayNight_DarkActionBar ++style Theme_AppCompat_DayNight_Dialog ++style Theme_AppCompat_DayNight_DialogWhenLarge ++style Theme_AppCompat_DayNight_Dialog_Alert ++style Theme_AppCompat_DayNight_Dialog_MinWidth ++style Theme_AppCompat_DayNight_NoActionBar ++style Theme_AppCompat_Dialog ++style Theme_AppCompat_DialogWhenLarge ++style Theme_AppCompat_Dialog_Alert ++style Theme_AppCompat_Dialog_MinWidth ++style Theme_AppCompat_Light ++style Theme_AppCompat_Light_DarkActionBar ++style Theme_AppCompat_Light_Dialog ++style Theme_AppCompat_Light_DialogWhenLarge ++style Theme_AppCompat_Light_Dialog_Alert ++style Theme_AppCompat_Light_Dialog_MinWidth ++style Theme_AppCompat_Light_NoActionBar ++style Theme_AppCompat_NoActionBar ++style Theme_Catalyst ++style Theme_Catalyst_LogBox ++style Theme_Catalyst_RedBox ++style Theme_FullScreenDialog ++style Theme_FullScreenDialogAnimatedFade ++style Theme_FullScreenDialogAnimatedSlide ++style Theme_ReactNative_AppCompat_Light ++style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen ++style Widget_AppCompat_ActionBar ++style Widget_AppCompat_ActionBar_Solid ++style Widget_AppCompat_ActionBar_TabBar ++style Widget_AppCompat_ActionBar_TabText ++style Widget_AppCompat_ActionBar_TabView ++style Widget_AppCompat_ActionButton ++style Widget_AppCompat_ActionButton_CloseMode ++style Widget_AppCompat_ActionButton_Overflow ++style Widget_AppCompat_ActionMode ++style Widget_AppCompat_ActivityChooserView ++style Widget_AppCompat_AutoCompleteTextView ++style Widget_AppCompat_Button ++style Widget_AppCompat_ButtonBar ++style Widget_AppCompat_ButtonBar_AlertDialog ++style Widget_AppCompat_Button_Borderless ++style Widget_AppCompat_Button_Borderless_Colored ++style Widget_AppCompat_Button_ButtonBar_AlertDialog ++style Widget_AppCompat_Button_Colored ++style Widget_AppCompat_Button_Small ++style Widget_AppCompat_CompoundButton_CheckBox ++style Widget_AppCompat_CompoundButton_RadioButton ++style Widget_AppCompat_CompoundButton_Switch ++style Widget_AppCompat_DrawerArrowToggle ++style Widget_AppCompat_DropDownItem_Spinner ++style Widget_AppCompat_EditText ++style Widget_AppCompat_ImageButton ++style Widget_AppCompat_Light_ActionBar ++style Widget_AppCompat_Light_ActionBar_Solid ++style Widget_AppCompat_Light_ActionBar_Solid_Inverse ++style Widget_AppCompat_Light_ActionBar_TabBar ++style Widget_AppCompat_Light_ActionBar_TabBar_Inverse ++style Widget_AppCompat_Light_ActionBar_TabText ++style Widget_AppCompat_Light_ActionBar_TabText_Inverse ++style Widget_AppCompat_Light_ActionBar_TabView ++style Widget_AppCompat_Light_ActionBar_TabView_Inverse ++style Widget_AppCompat_Light_ActionButton ++style Widget_AppCompat_Light_ActionButton_CloseMode ++style Widget_AppCompat_Light_ActionButton_Overflow ++style Widget_AppCompat_Light_ActionMode_Inverse ++style Widget_AppCompat_Light_ActivityChooserView ++style Widget_AppCompat_Light_AutoCompleteTextView ++style Widget_AppCompat_Light_DropDownItem_Spinner ++style Widget_AppCompat_Light_ListPopupWindow ++style Widget_AppCompat_Light_ListView_DropDown ++style Widget_AppCompat_Light_PopupMenu ++style Widget_AppCompat_Light_PopupMenu_Overflow ++style Widget_AppCompat_Light_SearchView ++style Widget_AppCompat_Light_Spinner_DropDown_ActionBar ++style Widget_AppCompat_ListMenuView ++style Widget_AppCompat_ListPopupWindow ++style Widget_AppCompat_ListView ++style Widget_AppCompat_ListView_DropDown ++style Widget_AppCompat_ListView_Menu ++style Widget_AppCompat_PopupMenu ++style Widget_AppCompat_PopupMenu_Overflow ++style Widget_AppCompat_PopupWindow ++style Widget_AppCompat_ProgressBar ++style Widget_AppCompat_ProgressBar_Horizontal ++style Widget_AppCompat_RatingBar ++style Widget_AppCompat_RatingBar_Indicator ++style Widget_AppCompat_RatingBar_Small ++style Widget_AppCompat_SearchView ++style Widget_AppCompat_SearchView_ActionBar ++style Widget_AppCompat_SeekBar ++style Widget_AppCompat_SeekBar_Discrete ++style Widget_AppCompat_Spinner ++style Widget_AppCompat_Spinner_DropDown ++style Widget_AppCompat_Spinner_DropDown_ActionBar ++style Widget_AppCompat_Spinner_Underlined ++style Widget_AppCompat_TextView_SpinnerItem ++style Widget_AppCompat_Toolbar ++style Widget_AppCompat_Toolbar_Button_Navigation ++style Widget_Compat_NotificationActionContainer ++style Widget_Compat_NotificationActionText ++style Widget_Support_CoordinatorLayout ++style redboxButton ++styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle ++styleable ActionBarLayout android_layout_gravity ++styleable ActionMenuItemView android_minWidth ++styleable ActionMenuView ++styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle ++styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount ++styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout ++styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible ++styleable AnimatedStateListDrawableItem android_drawable android_id ++styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId ++styleable AppCompatImageView android_src srcCompat tint tintMode ++styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode ++styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance ++styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType firstBaselineToTopHeight fontFamily lastBaselineToBottomHeight lineHeight textAllCaps ++styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingLeft listPreferredItemPaddingRight panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle ++styleable ButtonBarLayout allowStacking ++styleable ColorStateListItem alpha android_alpha android_color ++styleable CompoundButton android_button buttonTint buttonTintMode ++styleable CoordinatorLayout keylines statusBarBackground ++styleable CoordinatorLayout_Layout android_layout_gravity layout_anchor layout_anchorGravity layout_behavior layout_dodgeInsetEdges layout_insetEdge layout_keyline ++styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness ++styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery ++styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex ++styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio ++styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type ++styleable GradientColorItem android_color android_offset ++styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers ++styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width ++styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset ++styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible ++styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText ++styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow ++styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor ++styleable PopupWindowBackgroundState state_above_anchor ++styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle ++styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon ++styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio ++styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme ++styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible ++styleable StateListDrawableItem android_drawable ++styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode ++styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textSize android_textStyle android_typeface fontFamily textAllCaps ++styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor ++styleable View android_focusable android_theme paddingEnd paddingStart theme ++styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode ++styleable ViewStubCompat android_id android_inflatedId android_layout ++xml rn_dev_preferences +diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbols/debug/R.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbols/debug/R.txt +new file mode 100644 +index 0000000..96651c0 +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/symbols/debug/R.txt +@@ -0,0 +1,1792 @@ ++int anim abc_fade_in 0x7f010001 ++int anim abc_fade_out 0x7f010002 ++int anim abc_grow_fade_in_from_bottom 0x7f010003 ++int anim abc_popup_enter 0x7f010004 ++int anim abc_popup_exit 0x7f010005 ++int anim abc_shrink_fade_out_from_bottom 0x7f010006 ++int anim abc_slide_in_bottom 0x7f010007 ++int anim abc_slide_in_top 0x7f010008 ++int anim abc_slide_out_bottom 0x7f010009 ++int anim abc_slide_out_top 0x7f01000a ++int anim abc_tooltip_enter 0x7f01000b ++int anim abc_tooltip_exit 0x7f01000c ++int anim catalyst_fade_in 0x7f01000d ++int anim catalyst_fade_out 0x7f01000e ++int anim catalyst_push_up_in 0x7f01000f ++int anim catalyst_push_up_out 0x7f010010 ++int anim catalyst_slide_down 0x7f010011 ++int anim catalyst_slide_up 0x7f010012 ++int attr actionBarDivider 0x7f040001 ++int attr actionBarItemBackground 0x7f040002 ++int attr actionBarPopupTheme 0x7f040003 ++int attr actionBarSize 0x7f040004 ++int attr actionBarSplitStyle 0x7f040005 ++int attr actionBarStyle 0x7f040006 ++int attr actionBarTabBarStyle 0x7f040007 ++int attr actionBarTabStyle 0x7f040008 ++int attr actionBarTabTextStyle 0x7f040009 ++int attr actionBarTheme 0x7f04000a ++int attr actionBarWidgetTheme 0x7f04000b ++int attr actionButtonStyle 0x7f04000c ++int attr actionDropDownStyle 0x7f04000d ++int attr actionLayout 0x7f04000e ++int attr actionMenuTextAppearance 0x7f04000f ++int attr actionMenuTextColor 0x7f040010 ++int attr actionModeBackground 0x7f040011 ++int attr actionModeCloseButtonStyle 0x7f040012 ++int attr actionModeCloseDrawable 0x7f040013 ++int attr actionModeCopyDrawable 0x7f040014 ++int attr actionModeCutDrawable 0x7f040015 ++int attr actionModeFindDrawable 0x7f040016 ++int attr actionModePasteDrawable 0x7f040017 ++int attr actionModePopupWindowStyle 0x7f040018 ++int attr actionModeSelectAllDrawable 0x7f040019 ++int attr actionModeShareDrawable 0x7f04001a ++int attr actionModeSplitBackground 0x7f04001b ++int attr actionModeStyle 0x7f04001c ++int attr actionModeWebSearchDrawable 0x7f04001d ++int attr actionOverflowButtonStyle 0x7f04001e ++int attr actionOverflowMenuStyle 0x7f04001f ++int attr actionProviderClass 0x7f040020 ++int attr actionViewClass 0x7f040021 ++int attr activityChooserViewStyle 0x7f040022 ++int attr actualImageResource 0x7f040023 ++int attr actualImageScaleType 0x7f040024 ++int attr actualImageUri 0x7f040025 ++int attr alertDialogButtonGroupStyle 0x7f040026 ++int attr alertDialogCenterButtons 0x7f040027 ++int attr alertDialogStyle 0x7f040028 ++int attr alertDialogTheme 0x7f040029 ++int attr allowStacking 0x7f04002a ++int attr alpha 0x7f04002b ++int attr alphabeticModifiers 0x7f04002c ++int attr arrowHeadLength 0x7f04002d ++int attr arrowShaftLength 0x7f04002e ++int attr autoCompleteTextViewStyle 0x7f04002f ++int attr autoSizeMaxTextSize 0x7f040030 ++int attr autoSizeMinTextSize 0x7f040031 ++int attr autoSizePresetSizes 0x7f040032 ++int attr autoSizeStepGranularity 0x7f040033 ++int attr autoSizeTextType 0x7f040034 ++int attr background 0x7f040035 ++int attr backgroundImage 0x7f040036 ++int attr backgroundSplit 0x7f040037 ++int attr backgroundStacked 0x7f040038 ++int attr backgroundTint 0x7f040039 ++int attr backgroundTintMode 0x7f04003a ++int attr barLength 0x7f04003b ++int attr borderlessButtonStyle 0x7f04003c ++int attr buttonBarButtonStyle 0x7f04003d ++int attr buttonBarNegativeButtonStyle 0x7f04003e ++int attr buttonBarNeutralButtonStyle 0x7f04003f ++int attr buttonBarPositiveButtonStyle 0x7f040040 ++int attr buttonBarStyle 0x7f040041 ++int attr buttonGravity 0x7f040042 ++int attr buttonIconDimen 0x7f040043 ++int attr buttonPanelSideLayout 0x7f040044 ++int attr buttonStyle 0x7f040045 ++int attr buttonStyleSmall 0x7f040046 ++int attr buttonTint 0x7f040047 ++int attr buttonTintMode 0x7f040048 ++int attr checkboxStyle 0x7f040049 ++int attr checkedTextViewStyle 0x7f04004a ++int attr closeIcon 0x7f04004b ++int attr closeItemLayout 0x7f04004c ++int attr collapseContentDescription 0x7f04004d ++int attr collapseIcon 0x7f04004e ++int attr color 0x7f04004f ++int attr colorAccent 0x7f040050 ++int attr colorBackgroundFloating 0x7f040051 ++int attr colorButtonNormal 0x7f040052 ++int attr colorControlActivated 0x7f040053 ++int attr colorControlHighlight 0x7f040054 ++int attr colorControlNormal 0x7f040055 ++int attr colorError 0x7f040056 ++int attr colorPrimary 0x7f040057 ++int attr colorPrimaryDark 0x7f040058 ++int attr colorSwitchThumbNormal 0x7f040059 ++int attr commitIcon 0x7f04005a ++int attr contentDescription 0x7f04005b ++int attr contentInsetEnd 0x7f04005c ++int attr contentInsetEndWithActions 0x7f04005d ++int attr contentInsetLeft 0x7f04005e ++int attr contentInsetRight 0x7f04005f ++int attr contentInsetStart 0x7f040060 ++int attr contentInsetStartWithNavigation 0x7f040061 ++int attr controlBackground 0x7f040062 ++int attr coordinatorLayoutStyle 0x7f040063 ++int attr customNavigationLayout 0x7f040064 ++int attr defaultQueryHint 0x7f040065 ++int attr dialogCornerRadius 0x7f040066 ++int attr dialogPreferredPadding 0x7f040067 ++int attr dialogTheme 0x7f040068 ++int attr displayOptions 0x7f040069 ++int attr divider 0x7f04006a ++int attr dividerHorizontal 0x7f04006b ++int attr dividerPadding 0x7f04006c ++int attr dividerVertical 0x7f04006d ++int attr drawableSize 0x7f04006e ++int attr drawerArrowStyle 0x7f04006f ++int attr dropDownListViewStyle 0x7f040070 ++int attr dropdownListPreferredItemHeight 0x7f040071 ++int attr editTextBackground 0x7f040072 ++int attr editTextColor 0x7f040073 ++int attr editTextStyle 0x7f040074 ++int attr elevation 0x7f040075 ++int attr expandActivityOverflowButtonDrawable 0x7f040076 ++int attr fadeDuration 0x7f040077 ++int attr failureImage 0x7f040078 ++int attr failureImageScaleType 0x7f040079 ++int attr firstBaselineToTopHeight 0x7f04007a ++int attr font 0x7f04007b ++int attr fontFamily 0x7f04007c ++int attr fontProviderAuthority 0x7f04007d ++int attr fontProviderCerts 0x7f04007e ++int attr fontProviderFetchStrategy 0x7f04007f ++int attr fontProviderFetchTimeout 0x7f040080 ++int attr fontProviderPackage 0x7f040081 ++int attr fontProviderQuery 0x7f040082 ++int attr fontStyle 0x7f040083 ++int attr fontVariationSettings 0x7f040084 ++int attr fontWeight 0x7f040085 ++int attr gapBetweenBars 0x7f040086 ++int attr goIcon 0x7f040087 ++int attr height 0x7f040088 ++int attr hideOnContentScroll 0x7f040089 ++int attr homeAsUpIndicator 0x7f04008a ++int attr homeLayout 0x7f04008b ++int attr icon 0x7f04008c ++int attr iconTint 0x7f04008d ++int attr iconTintMode 0x7f04008e ++int attr iconifiedByDefault 0x7f04008f ++int attr imageButtonStyle 0x7f040090 ++int attr indeterminateProgressStyle 0x7f040091 ++int attr initialActivityCount 0x7f040092 ++int attr isLightTheme 0x7f040093 ++int attr itemPadding 0x7f040094 ++int attr keylines 0x7f040095 ++int attr lastBaselineToBottomHeight 0x7f040096 ++int attr layout 0x7f040097 ++int attr layout_anchor 0x7f040098 ++int attr layout_anchorGravity 0x7f040099 ++int attr layout_behavior 0x7f04009a ++int attr layout_dodgeInsetEdges 0x7f04009b ++int attr layout_insetEdge 0x7f04009c ++int attr layout_keyline 0x7f04009d ++int attr lineHeight 0x7f04009e ++int attr listChoiceBackgroundIndicator 0x7f04009f ++int attr listDividerAlertDialog 0x7f0400a0 ++int attr listItemLayout 0x7f0400a1 ++int attr listLayout 0x7f0400a2 ++int attr listMenuViewStyle 0x7f0400a3 ++int attr listPopupWindowStyle 0x7f0400a4 ++int attr listPreferredItemHeight 0x7f0400a5 ++int attr listPreferredItemHeightLarge 0x7f0400a6 ++int attr listPreferredItemHeightSmall 0x7f0400a7 ++int attr listPreferredItemPaddingLeft 0x7f0400a8 ++int attr listPreferredItemPaddingRight 0x7f0400a9 ++int attr logo 0x7f0400aa ++int attr logoDescription 0x7f0400ab ++int attr maxButtonHeight 0x7f0400ac ++int attr measureWithLargestChild 0x7f0400ad ++int attr multiChoiceItemLayout 0x7f0400ae ++int attr navigationContentDescription 0x7f0400af ++int attr navigationIcon 0x7f0400b0 ++int attr navigationMode 0x7f0400b1 ++int attr numericModifiers 0x7f0400b2 ++int attr overlapAnchor 0x7f0400b3 ++int attr overlayImage 0x7f0400b4 ++int attr paddingBottomNoButtons 0x7f0400b5 ++int attr paddingEnd 0x7f0400b6 ++int attr paddingStart 0x7f0400b7 ++int attr paddingTopNoTitle 0x7f0400b8 ++int attr panelBackground 0x7f0400b9 ++int attr panelMenuListTheme 0x7f0400ba ++int attr panelMenuListWidth 0x7f0400bb ++int attr placeholderImage 0x7f0400bc ++int attr placeholderImageScaleType 0x7f0400bd ++int attr popupMenuStyle 0x7f0400be ++int attr popupTheme 0x7f0400bf ++int attr popupWindowStyle 0x7f0400c0 ++int attr preserveIconSpacing 0x7f0400c1 ++int attr pressedStateOverlayImage 0x7f0400c2 ++int attr progressBarAutoRotateInterval 0x7f0400c3 ++int attr progressBarImage 0x7f0400c4 ++int attr progressBarImageScaleType 0x7f0400c5 ++int attr progressBarPadding 0x7f0400c6 ++int attr progressBarStyle 0x7f0400c7 ++int attr queryBackground 0x7f0400c8 ++int attr queryHint 0x7f0400c9 ++int attr radioButtonStyle 0x7f0400ca ++int attr ratingBarStyle 0x7f0400cb ++int attr ratingBarStyleIndicator 0x7f0400cc ++int attr ratingBarStyleSmall 0x7f0400cd ++int attr retryImage 0x7f0400ce ++int attr retryImageScaleType 0x7f0400cf ++int attr roundAsCircle 0x7f0400d0 ++int attr roundBottomEnd 0x7f0400d1 ++int attr roundBottomLeft 0x7f0400d2 ++int attr roundBottomRight 0x7f0400d3 ++int attr roundBottomStart 0x7f0400d4 ++int attr roundTopEnd 0x7f0400d5 ++int attr roundTopLeft 0x7f0400d6 ++int attr roundTopRight 0x7f0400d7 ++int attr roundTopStart 0x7f0400d8 ++int attr roundWithOverlayColor 0x7f0400d9 ++int attr roundedCornerRadius 0x7f0400da ++int attr roundingBorderColor 0x7f0400db ++int attr roundingBorderPadding 0x7f0400dc ++int attr roundingBorderWidth 0x7f0400dd ++int attr searchHintIcon 0x7f0400de ++int attr searchIcon 0x7f0400df ++int attr searchViewStyle 0x7f0400e0 ++int attr seekBarStyle 0x7f0400e1 ++int attr selectableItemBackground 0x7f0400e2 ++int attr selectableItemBackgroundBorderless 0x7f0400e3 ++int attr showAsAction 0x7f0400e4 ++int attr showDividers 0x7f0400e5 ++int attr showText 0x7f0400e6 ++int attr showTitle 0x7f0400e7 ++int attr singleChoiceItemLayout 0x7f0400e8 ++int attr spinBars 0x7f0400e9 ++int attr spinnerDropDownItemStyle 0x7f0400ea ++int attr spinnerStyle 0x7f0400eb ++int attr splitTrack 0x7f0400ec ++int attr srcCompat 0x7f0400ed ++int attr state_above_anchor 0x7f0400ee ++int attr statusBarBackground 0x7f0400ef ++int attr subMenuArrow 0x7f0400f0 ++int attr submitBackground 0x7f0400f1 ++int attr subtitle 0x7f0400f2 ++int attr subtitleTextAppearance 0x7f0400f3 ++int attr subtitleTextColor 0x7f0400f4 ++int attr subtitleTextStyle 0x7f0400f5 ++int attr suggestionRowLayout 0x7f0400f6 ++int attr switchMinWidth 0x7f0400f7 ++int attr switchPadding 0x7f0400f8 ++int attr switchStyle 0x7f0400f9 ++int attr switchTextAppearance 0x7f0400fa ++int attr textAllCaps 0x7f0400fb ++int attr textAppearanceLargePopupMenu 0x7f0400fc ++int attr textAppearanceListItem 0x7f0400fd ++int attr textAppearanceListItemSecondary 0x7f0400fe ++int attr textAppearanceListItemSmall 0x7f0400ff ++int attr textAppearancePopupMenuHeader 0x7f040100 ++int attr textAppearanceSearchResultSubtitle 0x7f040101 ++int attr textAppearanceSearchResultTitle 0x7f040102 ++int attr textAppearanceSmallPopupMenu 0x7f040103 ++int attr textColorAlertDialogListItem 0x7f040104 ++int attr textColorSearchUrl 0x7f040105 ++int attr theme 0x7f040106 ++int attr thickness 0x7f040107 ++int attr thumbTextPadding 0x7f040108 ++int attr thumbTint 0x7f040109 ++int attr thumbTintMode 0x7f04010a ++int attr tickMark 0x7f04010b ++int attr tickMarkTint 0x7f04010c ++int attr tickMarkTintMode 0x7f04010d ++int attr tint 0x7f04010e ++int attr tintMode 0x7f04010f ++int attr title 0x7f040110 ++int attr titleMargin 0x7f040111 ++int attr titleMarginBottom 0x7f040112 ++int attr titleMarginEnd 0x7f040113 ++int attr titleMarginStart 0x7f040114 ++int attr titleMarginTop 0x7f040115 ++int attr titleMargins 0x7f040116 ++int attr titleTextAppearance 0x7f040117 ++int attr titleTextColor 0x7f040118 ++int attr titleTextStyle 0x7f040119 ++int attr toolbarNavigationButtonStyle 0x7f04011a ++int attr toolbarStyle 0x7f04011b ++int attr tooltipForegroundColor 0x7f04011c ++int attr tooltipFrameBackground 0x7f04011d ++int attr tooltipText 0x7f04011e ++int attr track 0x7f04011f ++int attr trackTint 0x7f040120 ++int attr trackTintMode 0x7f040121 ++int attr ttcIndex 0x7f040122 ++int attr viewAspectRatio 0x7f040123 ++int attr viewInflaterClass 0x7f040124 ++int attr voiceIcon 0x7f040125 ++int attr windowActionBar 0x7f040126 ++int attr windowActionBarOverlay 0x7f040127 ++int attr windowActionModeOverlay 0x7f040128 ++int attr windowFixedHeightMajor 0x7f040129 ++int attr windowFixedHeightMinor 0x7f04012a ++int attr windowFixedWidthMajor 0x7f04012b ++int attr windowFixedWidthMinor 0x7f04012c ++int attr windowMinWidthMajor 0x7f04012d ++int attr windowMinWidthMinor 0x7f04012e ++int attr windowNoTitle 0x7f04012f ++int bool abc_action_bar_embed_tabs 0x7f050001 ++int bool abc_allow_stacked_button_bar 0x7f050002 ++int bool abc_config_actionMenuItemAllCaps 0x7f050003 ++int color abc_background_cache_hint_selector_material_dark 0x7f060001 ++int color abc_background_cache_hint_selector_material_light 0x7f060002 ++int color abc_btn_colored_borderless_text_material 0x7f060003 ++int color abc_btn_colored_text_material 0x7f060004 ++int color abc_color_highlight_material 0x7f060005 ++int color abc_hint_foreground_material_dark 0x7f060006 ++int color abc_hint_foreground_material_light 0x7f060007 ++int color abc_input_method_navigation_guard 0x7f060008 ++int color abc_primary_text_disable_only_material_dark 0x7f060009 ++int color abc_primary_text_disable_only_material_light 0x7f06000a ++int color abc_primary_text_material_dark 0x7f06000b ++int color abc_primary_text_material_light 0x7f06000c ++int color abc_search_url_text 0x7f06000d ++int color abc_search_url_text_normal 0x7f06000e ++int color abc_search_url_text_pressed 0x7f06000f ++int color abc_search_url_text_selected 0x7f060010 ++int color abc_secondary_text_material_dark 0x7f060011 ++int color abc_secondary_text_material_light 0x7f060012 ++int color abc_tint_btn_checkable 0x7f060013 ++int color abc_tint_default 0x7f060014 ++int color abc_tint_edittext 0x7f060015 ++int color abc_tint_seek_thumb 0x7f060016 ++int color abc_tint_spinner 0x7f060017 ++int color abc_tint_switch_track 0x7f060018 ++int color accent_material_dark 0x7f060019 ++int color accent_material_light 0x7f06001a ++int color background_floating_material_dark 0x7f06001b ++int color background_floating_material_light 0x7f06001c ++int color background_material_dark 0x7f06001d ++int color background_material_light 0x7f06001e ++int color bright_foreground_disabled_material_dark 0x7f06001f ++int color bright_foreground_disabled_material_light 0x7f060020 ++int color bright_foreground_inverse_material_dark 0x7f060021 ++int color bright_foreground_inverse_material_light 0x7f060022 ++int color bright_foreground_material_dark 0x7f060023 ++int color bright_foreground_material_light 0x7f060024 ++int color button_material_dark 0x7f060025 ++int color button_material_light 0x7f060026 ++int color catalyst_logbox_background 0x7f060027 ++int color catalyst_redbox_background 0x7f060028 ++int color dim_foreground_disabled_material_dark 0x7f060029 ++int color dim_foreground_disabled_material_light 0x7f06002a ++int color dim_foreground_material_dark 0x7f06002b ++int color dim_foreground_material_light 0x7f06002c ++int color error_color_material_dark 0x7f06002d ++int color error_color_material_light 0x7f06002e ++int color foreground_material_dark 0x7f06002f ++int color foreground_material_light 0x7f060030 ++int color highlighted_text_material_dark 0x7f060031 ++int color highlighted_text_material_light 0x7f060032 ++int color material_blue_grey_800 0x7f060033 ++int color material_blue_grey_900 0x7f060034 ++int color material_blue_grey_950 0x7f060035 ++int color material_deep_teal_200 0x7f060036 ++int color material_deep_teal_500 0x7f060037 ++int color material_grey_100 0x7f060038 ++int color material_grey_300 0x7f060039 ++int color material_grey_50 0x7f06003a ++int color material_grey_600 0x7f06003b ++int color material_grey_800 0x7f06003c ++int color material_grey_850 0x7f06003d ++int color material_grey_900 0x7f06003e ++int color notification_action_color_filter 0x7f06003f ++int color notification_icon_bg_color 0x7f060040 ++int color primary_dark_material_dark 0x7f060041 ++int color primary_dark_material_light 0x7f060042 ++int color primary_material_dark 0x7f060043 ++int color primary_material_light 0x7f060044 ++int color primary_text_default_material_dark 0x7f060045 ++int color primary_text_default_material_light 0x7f060046 ++int color primary_text_disabled_material_dark 0x7f060047 ++int color primary_text_disabled_material_light 0x7f060048 ++int color ripple_material_dark 0x7f060049 ++int color ripple_material_light 0x7f06004a ++int color secondary_text_default_material_dark 0x7f06004b ++int color secondary_text_default_material_light 0x7f06004c ++int color secondary_text_disabled_material_dark 0x7f06004d ++int color secondary_text_disabled_material_light 0x7f06004e ++int color switch_thumb_disabled_material_dark 0x7f06004f ++int color switch_thumb_disabled_material_light 0x7f060050 ++int color switch_thumb_material_dark 0x7f060051 ++int color switch_thumb_material_light 0x7f060052 ++int color switch_thumb_normal_material_dark 0x7f060053 ++int color switch_thumb_normal_material_light 0x7f060054 ++int color tooltip_background_dark 0x7f060055 ++int color tooltip_background_light 0x7f060056 ++int dimen abc_action_bar_content_inset_material 0x7f070001 ++int dimen abc_action_bar_content_inset_with_nav 0x7f070002 ++int dimen abc_action_bar_default_height_material 0x7f070003 ++int dimen abc_action_bar_default_padding_end_material 0x7f070004 ++int dimen abc_action_bar_default_padding_start_material 0x7f070005 ++int dimen abc_action_bar_elevation_material 0x7f070006 ++int dimen abc_action_bar_icon_vertical_padding_material 0x7f070007 ++int dimen abc_action_bar_overflow_padding_end_material 0x7f070008 ++int dimen abc_action_bar_overflow_padding_start_material 0x7f070009 ++int dimen abc_action_bar_stacked_max_height 0x7f07000a ++int dimen abc_action_bar_stacked_tab_max_width 0x7f07000b ++int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f07000c ++int dimen abc_action_bar_subtitle_top_margin_material 0x7f07000d ++int dimen abc_action_button_min_height_material 0x7f07000e ++int dimen abc_action_button_min_width_material 0x7f07000f ++int dimen abc_action_button_min_width_overflow_material 0x7f070010 ++int dimen abc_alert_dialog_button_bar_height 0x7f070011 ++int dimen abc_alert_dialog_button_dimen 0x7f070012 ++int dimen abc_button_inset_horizontal_material 0x7f070013 ++int dimen abc_button_inset_vertical_material 0x7f070014 ++int dimen abc_button_padding_horizontal_material 0x7f070015 ++int dimen abc_button_padding_vertical_material 0x7f070016 ++int dimen abc_cascading_menus_min_smallest_width 0x7f070017 ++int dimen abc_config_prefDialogWidth 0x7f070018 ++int dimen abc_control_corner_material 0x7f070019 ++int dimen abc_control_inset_material 0x7f07001a ++int dimen abc_control_padding_material 0x7f07001b ++int dimen abc_dialog_corner_radius_material 0x7f07001c ++int dimen abc_dialog_fixed_height_major 0x7f07001d ++int dimen abc_dialog_fixed_height_minor 0x7f07001e ++int dimen abc_dialog_fixed_width_major 0x7f07001f ++int dimen abc_dialog_fixed_width_minor 0x7f070020 ++int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f070021 ++int dimen abc_dialog_list_padding_top_no_title 0x7f070022 ++int dimen abc_dialog_min_width_major 0x7f070023 ++int dimen abc_dialog_min_width_minor 0x7f070024 ++int dimen abc_dialog_padding_material 0x7f070025 ++int dimen abc_dialog_padding_top_material 0x7f070026 ++int dimen abc_dialog_title_divider_material 0x7f070027 ++int dimen abc_disabled_alpha_material_dark 0x7f070028 ++int dimen abc_disabled_alpha_material_light 0x7f070029 ++int dimen abc_dropdownitem_icon_width 0x7f07002a ++int dimen abc_dropdownitem_text_padding_left 0x7f07002b ++int dimen abc_dropdownitem_text_padding_right 0x7f07002c ++int dimen abc_edit_text_inset_bottom_material 0x7f07002d ++int dimen abc_edit_text_inset_horizontal_material 0x7f07002e ++int dimen abc_edit_text_inset_top_material 0x7f07002f ++int dimen abc_floating_window_z 0x7f070030 ++int dimen abc_list_item_padding_horizontal_material 0x7f070031 ++int dimen abc_panel_menu_list_width 0x7f070032 ++int dimen abc_progress_bar_height_material 0x7f070033 ++int dimen abc_search_view_preferred_height 0x7f070034 ++int dimen abc_search_view_preferred_width 0x7f070035 ++int dimen abc_seekbar_track_background_height_material 0x7f070036 ++int dimen abc_seekbar_track_progress_height_material 0x7f070037 ++int dimen abc_select_dialog_padding_start_material 0x7f070038 ++int dimen abc_switch_padding 0x7f070039 ++int dimen abc_text_size_body_1_material 0x7f07003a ++int dimen abc_text_size_body_2_material 0x7f07003b ++int dimen abc_text_size_button_material 0x7f07003c ++int dimen abc_text_size_caption_material 0x7f07003d ++int dimen abc_text_size_display_1_material 0x7f07003e ++int dimen abc_text_size_display_2_material 0x7f07003f ++int dimen abc_text_size_display_3_material 0x7f070040 ++int dimen abc_text_size_display_4_material 0x7f070041 ++int dimen abc_text_size_headline_material 0x7f070042 ++int dimen abc_text_size_large_material 0x7f070043 ++int dimen abc_text_size_medium_material 0x7f070044 ++int dimen abc_text_size_menu_header_material 0x7f070045 ++int dimen abc_text_size_menu_material 0x7f070046 ++int dimen abc_text_size_small_material 0x7f070047 ++int dimen abc_text_size_subhead_material 0x7f070048 ++int dimen abc_text_size_subtitle_material_toolbar 0x7f070049 ++int dimen abc_text_size_title_material 0x7f07004a ++int dimen abc_text_size_title_material_toolbar 0x7f07004b ++int dimen compat_button_inset_horizontal_material 0x7f07004c ++int dimen compat_button_inset_vertical_material 0x7f07004d ++int dimen compat_button_padding_horizontal_material 0x7f07004e ++int dimen compat_button_padding_vertical_material 0x7f07004f ++int dimen compat_control_corner_material 0x7f070050 ++int dimen compat_notification_large_icon_max_height 0x7f070051 ++int dimen compat_notification_large_icon_max_width 0x7f070052 ++int dimen disabled_alpha_material_dark 0x7f070053 ++int dimen disabled_alpha_material_light 0x7f070054 ++int dimen highlight_alpha_material_colored 0x7f070055 ++int dimen highlight_alpha_material_dark 0x7f070056 ++int dimen highlight_alpha_material_light 0x7f070057 ++int dimen hint_alpha_material_dark 0x7f070058 ++int dimen hint_alpha_material_light 0x7f070059 ++int dimen hint_pressed_alpha_material_dark 0x7f07005a ++int dimen hint_pressed_alpha_material_light 0x7f07005b ++int dimen notification_action_icon_size 0x7f07005c ++int dimen notification_action_text_size 0x7f07005d ++int dimen notification_big_circle_margin 0x7f07005e ++int dimen notification_content_margin_start 0x7f07005f ++int dimen notification_large_icon_height 0x7f070060 ++int dimen notification_large_icon_width 0x7f070061 ++int dimen notification_main_column_padding_top 0x7f070062 ++int dimen notification_media_narrow_margin 0x7f070063 ++int dimen notification_right_icon_size 0x7f070064 ++int dimen notification_right_side_padding_top 0x7f070065 ++int dimen notification_small_icon_background_padding 0x7f070066 ++int dimen notification_small_icon_size_as_large 0x7f070067 ++int dimen notification_subtext_size 0x7f070068 ++int dimen notification_top_pad 0x7f070069 ++int dimen notification_top_pad_large_text 0x7f07006a ++int dimen tooltip_corner_radius 0x7f07006b ++int dimen tooltip_horizontal_padding 0x7f07006c ++int dimen tooltip_margin 0x7f07006d ++int dimen tooltip_precise_anchor_extra_offset 0x7f07006e ++int dimen tooltip_precise_anchor_threshold 0x7f07006f ++int dimen tooltip_vertical_padding 0x7f070070 ++int dimen tooltip_y_offset_non_touch 0x7f070071 ++int dimen tooltip_y_offset_touch 0x7f070072 ++int drawable abc_ab_share_pack_mtrl_alpha 0x7f080001 ++int drawable abc_action_bar_item_background_material 0x7f080002 ++int drawable abc_btn_borderless_material 0x7f080003 ++int drawable abc_btn_check_material 0x7f080004 ++int drawable abc_btn_check_to_on_mtrl_000 0x7f080005 ++int drawable abc_btn_check_to_on_mtrl_015 0x7f080006 ++int drawable abc_btn_colored_material 0x7f080007 ++int drawable abc_btn_default_mtrl_shape 0x7f080008 ++int drawable abc_btn_radio_material 0x7f080009 ++int drawable abc_btn_radio_to_on_mtrl_000 0x7f08000a ++int drawable abc_btn_radio_to_on_mtrl_015 0x7f08000b ++int drawable abc_btn_switch_to_on_mtrl_00001 0x7f08000c ++int drawable abc_btn_switch_to_on_mtrl_00012 0x7f08000d ++int drawable abc_cab_background_internal_bg 0x7f08000e ++int drawable abc_cab_background_top_material 0x7f08000f ++int drawable abc_cab_background_top_mtrl_alpha 0x7f080010 ++int drawable abc_control_background_material 0x7f080011 ++int drawable abc_dialog_material_background 0x7f080012 ++int drawable abc_edit_text_material 0x7f080013 ++int drawable abc_ic_ab_back_material 0x7f080014 ++int drawable abc_ic_arrow_drop_right_black_24dp 0x7f080015 ++int drawable abc_ic_clear_material 0x7f080016 ++int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f080017 ++int drawable abc_ic_go_search_api_material 0x7f080018 ++int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f080019 ++int drawable abc_ic_menu_cut_mtrl_alpha 0x7f08001a ++int drawable abc_ic_menu_overflow_material 0x7f08001b ++int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f08001c ++int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f08001d ++int drawable abc_ic_menu_share_mtrl_alpha 0x7f08001e ++int drawable abc_ic_search_api_material 0x7f08001f ++int drawable abc_ic_star_black_16dp 0x7f080020 ++int drawable abc_ic_star_black_36dp 0x7f080021 ++int drawable abc_ic_star_black_48dp 0x7f080022 ++int drawable abc_ic_star_half_black_16dp 0x7f080023 ++int drawable abc_ic_star_half_black_36dp 0x7f080024 ++int drawable abc_ic_star_half_black_48dp 0x7f080025 ++int drawable abc_ic_voice_search_api_material 0x7f080026 ++int drawable abc_item_background_holo_dark 0x7f080027 ++int drawable abc_item_background_holo_light 0x7f080028 ++int drawable abc_list_divider_material 0x7f080029 ++int drawable abc_list_divider_mtrl_alpha 0x7f08002a ++int drawable abc_list_focused_holo 0x7f08002b ++int drawable abc_list_longpressed_holo 0x7f08002c ++int drawable abc_list_pressed_holo_dark 0x7f08002d ++int drawable abc_list_pressed_holo_light 0x7f08002e ++int drawable abc_list_selector_background_transition_holo_dark 0x7f08002f ++int drawable abc_list_selector_background_transition_holo_light 0x7f080030 ++int drawable abc_list_selector_disabled_holo_dark 0x7f080031 ++int drawable abc_list_selector_disabled_holo_light 0x7f080032 ++int drawable abc_list_selector_holo_dark 0x7f080033 ++int drawable abc_list_selector_holo_light 0x7f080034 ++int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f080035 ++int drawable abc_popup_background_mtrl_mult 0x7f080036 ++int drawable abc_ratingbar_indicator_material 0x7f080037 ++int drawable abc_ratingbar_material 0x7f080038 ++int drawable abc_ratingbar_small_material 0x7f080039 ++int drawable abc_scrubber_control_off_mtrl_alpha 0x7f08003a ++int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f08003b ++int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f08003c ++int drawable abc_scrubber_primary_mtrl_alpha 0x7f08003d ++int drawable abc_scrubber_track_mtrl_alpha 0x7f08003e ++int drawable abc_seekbar_thumb_material 0x7f08003f ++int drawable abc_seekbar_tick_mark_material 0x7f080040 ++int drawable abc_seekbar_track_material 0x7f080041 ++int drawable abc_spinner_mtrl_am_alpha 0x7f080042 ++int drawable abc_spinner_textfield_background_material 0x7f080043 ++int drawable abc_switch_thumb_material 0x7f080044 ++int drawable abc_switch_track_mtrl_alpha 0x7f080045 ++int drawable abc_tab_indicator_material 0x7f080046 ++int drawable abc_tab_indicator_mtrl_alpha 0x7f080047 ++int drawable abc_text_cursor_material 0x7f080048 ++int drawable abc_text_select_handle_left_mtrl_dark 0x7f080049 ++int drawable abc_text_select_handle_left_mtrl_light 0x7f08004a ++int drawable abc_text_select_handle_middle_mtrl_dark 0x7f08004b ++int drawable abc_text_select_handle_middle_mtrl_light 0x7f08004c ++int drawable abc_text_select_handle_right_mtrl_dark 0x7f08004d ++int drawable abc_text_select_handle_right_mtrl_light 0x7f08004e ++int drawable abc_textfield_activated_mtrl_alpha 0x7f08004f ++int drawable abc_textfield_default_mtrl_alpha 0x7f080050 ++int drawable abc_textfield_search_activated_mtrl_alpha 0x7f080051 ++int drawable abc_textfield_search_default_mtrl_alpha 0x7f080052 ++int drawable abc_textfield_search_material 0x7f080053 ++int drawable abc_vector_test 0x7f080054 ++int drawable notification_action_background 0x7f080055 ++int drawable notification_bg 0x7f080056 ++int drawable notification_bg_low 0x7f080057 ++int drawable notification_bg_low_normal 0x7f080058 ++int drawable notification_bg_low_pressed 0x7f080059 ++int drawable notification_bg_normal 0x7f08005a ++int drawable notification_bg_normal_pressed 0x7f08005b ++int drawable notification_icon_background 0x7f08005c ++int drawable notification_template_icon_bg 0x7f08005d ++int drawable notification_template_icon_low_bg 0x7f08005e ++int drawable notification_tile_bg 0x7f08005f ++int drawable notify_panel_notification_icon_bg 0x7f080060 ++int drawable redbox_top_border_background 0x7f080061 ++int drawable tooltip_frame_dark 0x7f080062 ++int drawable tooltip_frame_light 0x7f080063 ++int id accessibility_actions 0x7f0b0001 ++int id accessibility_hint 0x7f0b0002 ++int id accessibility_label 0x7f0b0003 ++int id accessibility_role 0x7f0b0004 ++int id accessibility_state 0x7f0b0005 ++int id accessibility_value 0x7f0b0006 ++int id action_bar 0x7f0b0007 ++int id action_bar_activity_content 0x7f0b0008 ++int id action_bar_container 0x7f0b0009 ++int id action_bar_root 0x7f0b000a ++int id action_bar_spinner 0x7f0b000b ++int id action_bar_subtitle 0x7f0b000c ++int id action_bar_title 0x7f0b000d ++int id action_container 0x7f0b000e ++int id action_context_bar 0x7f0b000f ++int id action_divider 0x7f0b0010 ++int id action_image 0x7f0b0011 ++int id action_menu_divider 0x7f0b0012 ++int id action_menu_presenter 0x7f0b0013 ++int id action_mode_bar 0x7f0b0014 ++int id action_mode_bar_stub 0x7f0b0015 ++int id action_mode_close_button 0x7f0b0016 ++int id action_text 0x7f0b0017 ++int id actions 0x7f0b0018 ++int id activity_chooser_view_content 0x7f0b0019 ++int id add 0x7f0b001a ++int id alertTitle 0x7f0b001b ++int id async 0x7f0b001c ++int id blocking 0x7f0b001d ++int id bottom 0x7f0b001e ++int id buttonPanel 0x7f0b001f ++int id catalyst_redbox_title 0x7f0b0020 ++int id center 0x7f0b0021 ++int id centerCrop 0x7f0b0022 ++int id centerInside 0x7f0b0023 ++int id checkbox 0x7f0b0024 ++int id chronometer 0x7f0b0025 ++int id content 0x7f0b0026 ++int id contentPanel 0x7f0b0027 ++int id custom 0x7f0b0028 ++int id customPanel 0x7f0b0029 ++int id decor_content_parent 0x7f0b002a ++int id default_activity_button 0x7f0b002b ++int id edit_query 0x7f0b002c ++int id end 0x7f0b002d ++int id expand_activities_button 0x7f0b002e ++int id expanded_menu 0x7f0b002f ++int id fitBottomStart 0x7f0b0030 ++int id fitCenter 0x7f0b0031 ++int id fitEnd 0x7f0b0032 ++int id fitStart 0x7f0b0033 ++int id fitXY 0x7f0b0034 ++int id focusCrop 0x7f0b0035 ++int id forever 0x7f0b0036 ++int id fps_text 0x7f0b0037 ++int id group_divider 0x7f0b0038 ++int id home 0x7f0b0039 ++int id icon 0x7f0b003a ++int id icon_group 0x7f0b003b ++int id image 0x7f0b003c ++int id info 0x7f0b003d ++int id italic 0x7f0b003e ++int id left 0x7f0b003f ++int id line1 0x7f0b0040 ++int id line3 0x7f0b0041 ++int id listMode 0x7f0b0042 ++int id list_item 0x7f0b0043 ++int id message 0x7f0b0044 ++int id multiply 0x7f0b0045 ++int id none 0x7f0b0046 ++int id normal 0x7f0b0047 ++int id notification_background 0x7f0b0048 ++int id notification_main_column 0x7f0b0049 ++int id notification_main_column_container 0x7f0b004a ++int id parentPanel 0x7f0b004b ++int id progress_circular 0x7f0b004c ++int id progress_horizontal 0x7f0b004d ++int id radio 0x7f0b004e ++int id react_test_id 0x7f0b004f ++int id right 0x7f0b0050 ++int id right_icon 0x7f0b0051 ++int id right_side 0x7f0b0052 ++int id rn_frame_file 0x7f0b0053 ++int id rn_frame_method 0x7f0b0054 ++int id rn_redbox_dismiss_button 0x7f0b0055 ++int id rn_redbox_line_separator 0x7f0b0056 ++int id rn_redbox_loading_indicator 0x7f0b0057 ++int id rn_redbox_reload_button 0x7f0b0058 ++int id rn_redbox_report_button 0x7f0b0059 ++int id rn_redbox_report_label 0x7f0b005a ++int id rn_redbox_stack 0x7f0b005b ++int id screen 0x7f0b005c ++int id scrollIndicatorDown 0x7f0b005d ++int id scrollIndicatorUp 0x7f0b005e ++int id scrollView 0x7f0b005f ++int id search_badge 0x7f0b0060 ++int id search_bar 0x7f0b0061 ++int id search_button 0x7f0b0062 ++int id search_close_btn 0x7f0b0063 ++int id search_edit_frame 0x7f0b0064 ++int id search_go_btn 0x7f0b0065 ++int id search_mag_icon 0x7f0b0066 ++int id search_plate 0x7f0b0067 ++int id search_src_text 0x7f0b0068 ++int id search_voice_btn 0x7f0b0069 ++int id select_dialog_listview 0x7f0b006a ++int id shortcut 0x7f0b006b ++int id spacer 0x7f0b006c ++int id split_action_bar 0x7f0b006d ++int id src_atop 0x7f0b006e ++int id src_in 0x7f0b006f ++int id src_over 0x7f0b0070 ++int id start 0x7f0b0071 ++int id submenuarrow 0x7f0b0072 ++int id submit_area 0x7f0b0073 ++int id tabMode 0x7f0b0074 ++int id tag_transition_group 0x7f0b0075 ++int id tag_unhandled_key_event_manager 0x7f0b0076 ++int id tag_unhandled_key_listeners 0x7f0b0077 ++int id text 0x7f0b0078 ++int id text2 0x7f0b0079 ++int id textSpacerNoButtons 0x7f0b007a ++int id textSpacerNoTitle 0x7f0b007b ++int id time 0x7f0b007c ++int id title 0x7f0b007d ++int id titleDividerNoCustom 0x7f0b007e ++int id title_template 0x7f0b007f ++int id top 0x7f0b0080 ++int id topPanel 0x7f0b0081 ++int id uniform 0x7f0b0082 ++int id up 0x7f0b0083 ++int id view_tag_instance_handle 0x7f0b0084 ++int id view_tag_native_id 0x7f0b0085 ++int id wrap_content 0x7f0b0086 ++int integer abc_config_activityDefaultDur 0x7f0c0001 ++int integer abc_config_activityShortDur 0x7f0c0002 ++int integer cancel_button_image_alpha 0x7f0c0003 ++int integer config_tooltipAnimTime 0x7f0c0004 ++int integer react_native_dev_server_port 0x7f0c0005 ++int integer react_native_inspector_proxy_port 0x7f0c0006 ++int integer status_bar_notification_info_maxnum 0x7f0c0007 ++int layout abc_action_bar_title_item 0x7f0e0001 ++int layout abc_action_bar_up_container 0x7f0e0002 ++int layout abc_action_menu_item_layout 0x7f0e0003 ++int layout abc_action_menu_layout 0x7f0e0004 ++int layout abc_action_mode_bar 0x7f0e0005 ++int layout abc_action_mode_close_item_material 0x7f0e0006 ++int layout abc_activity_chooser_view 0x7f0e0007 ++int layout abc_activity_chooser_view_list_item 0x7f0e0008 ++int layout abc_alert_dialog_button_bar_material 0x7f0e0009 ++int layout abc_alert_dialog_material 0x7f0e000a ++int layout abc_alert_dialog_title_material 0x7f0e000b ++int layout abc_cascading_menu_item_layout 0x7f0e000c ++int layout abc_dialog_title_material 0x7f0e000d ++int layout abc_expanded_menu_layout 0x7f0e000e ++int layout abc_list_menu_item_checkbox 0x7f0e000f ++int layout abc_list_menu_item_icon 0x7f0e0010 ++int layout abc_list_menu_item_layout 0x7f0e0011 ++int layout abc_list_menu_item_radio 0x7f0e0012 ++int layout abc_popup_menu_header_item_layout 0x7f0e0013 ++int layout abc_popup_menu_item_layout 0x7f0e0014 ++int layout abc_screen_content_include 0x7f0e0015 ++int layout abc_screen_simple 0x7f0e0016 ++int layout abc_screen_simple_overlay_action_mode 0x7f0e0017 ++int layout abc_screen_toolbar 0x7f0e0018 ++int layout abc_search_dropdown_item_icons_2line 0x7f0e0019 ++int layout abc_search_view 0x7f0e001a ++int layout abc_select_dialog_material 0x7f0e001b ++int layout abc_tooltip 0x7f0e001c ++int layout dev_loading_view 0x7f0e001d ++int layout fps_view 0x7f0e001e ++int layout notification_action 0x7f0e001f ++int layout notification_action_tombstone 0x7f0e0020 ++int layout notification_template_custom_big 0x7f0e0021 ++int layout notification_template_icon_group 0x7f0e0022 ++int layout notification_template_part_chronometer 0x7f0e0023 ++int layout notification_template_part_time 0x7f0e0024 ++int layout redbox_item_frame 0x7f0e0025 ++int layout redbox_item_title 0x7f0e0026 ++int layout redbox_view 0x7f0e0027 ++int layout select_dialog_item_material 0x7f0e0028 ++int layout select_dialog_multichoice_material 0x7f0e0029 ++int layout select_dialog_singlechoice_material 0x7f0e002a ++int layout support_simple_spinner_dropdown_item 0x7f0e002b ++int string abc_action_bar_home_description 0x7f140001 ++int string abc_action_bar_up_description 0x7f140002 ++int string abc_action_menu_overflow_description 0x7f140003 ++int string abc_action_mode_done 0x7f140004 ++int string abc_activity_chooser_view_see_all 0x7f140005 ++int string abc_activitychooserview_choose_application 0x7f140006 ++int string abc_capital_off 0x7f140007 ++int string abc_capital_on 0x7f140008 ++int string abc_font_family_body_1_material 0x7f140009 ++int string abc_font_family_body_2_material 0x7f14000a ++int string abc_font_family_button_material 0x7f14000b ++int string abc_font_family_caption_material 0x7f14000c ++int string abc_font_family_display_1_material 0x7f14000d ++int string abc_font_family_display_2_material 0x7f14000e ++int string abc_font_family_display_3_material 0x7f14000f ++int string abc_font_family_display_4_material 0x7f140010 ++int string abc_font_family_headline_material 0x7f140011 ++int string abc_font_family_menu_material 0x7f140012 ++int string abc_font_family_subhead_material 0x7f140013 ++int string abc_font_family_title_material 0x7f140014 ++int string abc_menu_alt_shortcut_label 0x7f140015 ++int string abc_menu_ctrl_shortcut_label 0x7f140016 ++int string abc_menu_delete_shortcut_label 0x7f140017 ++int string abc_menu_enter_shortcut_label 0x7f140018 ++int string abc_menu_function_shortcut_label 0x7f140019 ++int string abc_menu_meta_shortcut_label 0x7f14001a ++int string abc_menu_shift_shortcut_label 0x7f14001b ++int string abc_menu_space_shortcut_label 0x7f14001c ++int string abc_menu_sym_shortcut_label 0x7f14001d ++int string abc_prepend_shortcut_label 0x7f14001e ++int string abc_search_hint 0x7f14001f ++int string abc_searchview_description_clear 0x7f140020 ++int string abc_searchview_description_query 0x7f140021 ++int string abc_searchview_description_search 0x7f140022 ++int string abc_searchview_description_submit 0x7f140023 ++int string abc_searchview_description_voice 0x7f140024 ++int string abc_shareactionprovider_share_with 0x7f140025 ++int string abc_shareactionprovider_share_with_application 0x7f140026 ++int string abc_toolbar_collapse_description 0x7f140027 ++int string alert_description 0x7f140028 ++int string button_description 0x7f140029 ++int string catalyst_change_bundle_location 0x7f14002a ++int string catalyst_copy_button 0x7f14002b ++int string catalyst_debug 0x7f14002c ++int string catalyst_debug_chrome 0x7f14002d ++int string catalyst_debug_chrome_stop 0x7f14002e ++int string catalyst_debug_connecting 0x7f14002f ++int string catalyst_debug_error 0x7f140030 ++int string catalyst_debug_nuclide 0x7f140031 ++int string catalyst_debug_nuclide_error 0x7f140032 ++int string catalyst_debug_stop 0x7f140033 ++int string catalyst_dismiss_button 0x7f140034 ++int string catalyst_heap_capture 0x7f140035 ++int string catalyst_hot_reloading 0x7f140036 ++int string catalyst_hot_reloading_auto_disable 0x7f140037 ++int string catalyst_hot_reloading_auto_enable 0x7f140038 ++int string catalyst_hot_reloading_stop 0x7f140039 ++int string catalyst_inspector 0x7f14003a ++int string catalyst_loading_from_url 0x7f14003b ++int string catalyst_perf_monitor 0x7f14003c ++int string catalyst_perf_monitor_stop 0x7f14003d ++int string catalyst_reload 0x7f14003e ++int string catalyst_reload_button 0x7f14003f ++int string catalyst_reload_error 0x7f140040 ++int string catalyst_report_button 0x7f140041 ++int string catalyst_sample_profiler_disable 0x7f140042 ++int string catalyst_sample_profiler_enable 0x7f140043 ++int string catalyst_settings 0x7f140044 ++int string catalyst_settings_title 0x7f140045 ++int string combobox_description 0x7f140046 ++int string header_description 0x7f140047 ++int string image_description 0x7f140048 ++int string imagebutton_description 0x7f140049 ++int string link_description 0x7f14004a ++int string menu_description 0x7f14004b ++int string menubar_description 0x7f14004c ++int string menuitem_description 0x7f14004d ++int string progressbar_description 0x7f14004e ++int string radiogroup_description 0x7f14004f ++int string rn_tab_description 0x7f140050 ++int string scrollbar_description 0x7f140051 ++int string search_description 0x7f140052 ++int string search_menu_title 0x7f140053 ++int string spinbutton_description 0x7f140054 ++int string state_busy_description 0x7f140055 ++int string state_collapsed_description 0x7f140056 ++int string state_expanded_description 0x7f140057 ++int string state_mixed_description 0x7f140058 ++int string state_off_description 0x7f140059 ++int string state_on_description 0x7f14005a ++int string status_bar_notification_info_overflow 0x7f14005b ++int string summary_description 0x7f14005c ++int string tablist_description 0x7f14005d ++int string timer_description 0x7f14005e ++int string toolbar_description 0x7f14005f ++int style AlertDialog_AppCompat 0x7f150001 ++int style AlertDialog_AppCompat_Light 0x7f150002 ++int style Animation_AppCompat_Dialog 0x7f150003 ++int style Animation_AppCompat_DropDownUp 0x7f150004 ++int style Animation_AppCompat_Tooltip 0x7f150005 ++int style Animation_Catalyst_LogBox 0x7f150006 ++int style Animation_Catalyst_RedBox 0x7f150007 ++int style Base_AlertDialog_AppCompat 0x7f150008 ++int style Base_AlertDialog_AppCompat_Light 0x7f150009 ++int style Base_Animation_AppCompat_Dialog 0x7f15000a ++int style Base_Animation_AppCompat_DropDownUp 0x7f15000b ++int style Base_Animation_AppCompat_Tooltip 0x7f15000c ++int style Base_DialogWindowTitleBackground_AppCompat 0x7f15000d ++int style Base_DialogWindowTitle_AppCompat 0x7f15000e ++int style Base_TextAppearance_AppCompat 0x7f15000f ++int style Base_TextAppearance_AppCompat_Body1 0x7f150010 ++int style Base_TextAppearance_AppCompat_Body2 0x7f150011 ++int style Base_TextAppearance_AppCompat_Button 0x7f150012 ++int style Base_TextAppearance_AppCompat_Caption 0x7f150013 ++int style Base_TextAppearance_AppCompat_Display1 0x7f150014 ++int style Base_TextAppearance_AppCompat_Display2 0x7f150015 ++int style Base_TextAppearance_AppCompat_Display3 0x7f150016 ++int style Base_TextAppearance_AppCompat_Display4 0x7f150017 ++int style Base_TextAppearance_AppCompat_Headline 0x7f150018 ++int style Base_TextAppearance_AppCompat_Inverse 0x7f150019 ++int style Base_TextAppearance_AppCompat_Large 0x7f15001a ++int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f15001b ++int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f15001c ++int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f15001d ++int style Base_TextAppearance_AppCompat_Medium 0x7f15001e ++int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f15001f ++int style Base_TextAppearance_AppCompat_Menu 0x7f150020 ++int style Base_TextAppearance_AppCompat_SearchResult 0x7f150021 ++int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f150022 ++int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f150023 ++int style Base_TextAppearance_AppCompat_Small 0x7f150024 ++int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f150025 ++int style Base_TextAppearance_AppCompat_Subhead 0x7f150026 ++int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f150027 ++int style Base_TextAppearance_AppCompat_Title 0x7f150028 ++int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f150029 ++int style Base_TextAppearance_AppCompat_Tooltip 0x7f15002a ++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f15002b ++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f15002c ++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f15002d ++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f15002e ++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f15002f ++int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f150030 ++int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f150031 ++int style Base_TextAppearance_AppCompat_Widget_Button 0x7f150032 ++int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f150033 ++int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f150034 ++int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f150035 ++int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f150036 ++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f150037 ++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f150038 ++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f150039 ++int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f15003a ++int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f15003b ++int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f15003c ++int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f15003d ++int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f15003e ++int style Base_ThemeOverlay_AppCompat 0x7f15003f ++int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f150040 ++int style Base_ThemeOverlay_AppCompat_Dark 0x7f150041 ++int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150042 ++int style Base_ThemeOverlay_AppCompat_Dialog 0x7f150043 ++int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f150044 ++int style Base_ThemeOverlay_AppCompat_Light 0x7f150045 ++int style Base_Theme_AppCompat 0x7f150046 ++int style Base_Theme_AppCompat_CompactMenu 0x7f150047 ++int style Base_Theme_AppCompat_Dialog 0x7f150048 ++int style Base_Theme_AppCompat_DialogWhenLarge 0x7f150049 ++int style Base_Theme_AppCompat_Dialog_Alert 0x7f15004a ++int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f15004b ++int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f15004c ++int style Base_Theme_AppCompat_Light 0x7f15004d ++int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f15004e ++int style Base_Theme_AppCompat_Light_Dialog 0x7f15004f ++int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f150050 ++int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f150051 ++int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f150052 ++int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f150053 ++int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f150054 ++int style Base_V21_Theme_AppCompat 0x7f150055 ++int style Base_V21_Theme_AppCompat_Dialog 0x7f150056 ++int style Base_V21_Theme_AppCompat_Light 0x7f150057 ++int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f150058 ++int style Base_V22_Theme_AppCompat 0x7f150059 ++int style Base_V22_Theme_AppCompat_Light 0x7f15005a ++int style Base_V23_Theme_AppCompat 0x7f15005b ++int style Base_V23_Theme_AppCompat_Light 0x7f15005c ++int style Base_V26_Theme_AppCompat 0x7f15005d ++int style Base_V26_Theme_AppCompat_Light 0x7f15005e ++int style Base_V26_Widget_AppCompat_Toolbar 0x7f15005f ++int style Base_V28_Theme_AppCompat 0x7f150060 ++int style Base_V28_Theme_AppCompat_Light 0x7f150061 ++int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f150062 ++int style Base_V7_Theme_AppCompat 0x7f150063 ++int style Base_V7_Theme_AppCompat_Dialog 0x7f150064 ++int style Base_V7_Theme_AppCompat_Light 0x7f150065 ++int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f150066 ++int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f150067 ++int style Base_V7_Widget_AppCompat_EditText 0x7f150068 ++int style Base_V7_Widget_AppCompat_Toolbar 0x7f150069 ++int style Base_Widget_AppCompat_ActionBar 0x7f15006a ++int style Base_Widget_AppCompat_ActionBar_Solid 0x7f15006b ++int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f15006c ++int style Base_Widget_AppCompat_ActionBar_TabText 0x7f15006d ++int style Base_Widget_AppCompat_ActionBar_TabView 0x7f15006e ++int style Base_Widget_AppCompat_ActionButton 0x7f15006f ++int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f150070 ++int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f150071 ++int style Base_Widget_AppCompat_ActionMode 0x7f150072 ++int style Base_Widget_AppCompat_ActivityChooserView 0x7f150073 ++int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f150074 ++int style Base_Widget_AppCompat_Button 0x7f150075 ++int style Base_Widget_AppCompat_ButtonBar 0x7f150076 ++int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f150077 ++int style Base_Widget_AppCompat_Button_Borderless 0x7f150078 ++int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f150079 ++int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f15007a ++int style Base_Widget_AppCompat_Button_Colored 0x7f15007b ++int style Base_Widget_AppCompat_Button_Small 0x7f15007c ++int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f15007d ++int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f15007e ++int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f15007f ++int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f150080 ++int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f150081 ++int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f150082 ++int style Base_Widget_AppCompat_EditText 0x7f150083 ++int style Base_Widget_AppCompat_ImageButton 0x7f150084 ++int style Base_Widget_AppCompat_Light_ActionBar 0x7f150085 ++int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f150086 ++int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f150087 ++int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f150088 ++int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150089 ++int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f15008a ++int style Base_Widget_AppCompat_Light_PopupMenu 0x7f15008b ++int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f15008c ++int style Base_Widget_AppCompat_ListMenuView 0x7f15008d ++int style Base_Widget_AppCompat_ListPopupWindow 0x7f15008e ++int style Base_Widget_AppCompat_ListView 0x7f15008f ++int style Base_Widget_AppCompat_ListView_DropDown 0x7f150090 ++int style Base_Widget_AppCompat_ListView_Menu 0x7f150091 ++int style Base_Widget_AppCompat_PopupMenu 0x7f150092 ++int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f150093 ++int style Base_Widget_AppCompat_PopupWindow 0x7f150094 ++int style Base_Widget_AppCompat_ProgressBar 0x7f150095 ++int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f150096 ++int style Base_Widget_AppCompat_RatingBar 0x7f150097 ++int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f150098 ++int style Base_Widget_AppCompat_RatingBar_Small 0x7f150099 ++int style Base_Widget_AppCompat_SearchView 0x7f15009a ++int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f15009b ++int style Base_Widget_AppCompat_SeekBar 0x7f15009c ++int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f15009d ++int style Base_Widget_AppCompat_Spinner 0x7f15009e ++int style Base_Widget_AppCompat_Spinner_Underlined 0x7f15009f ++int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f1500a0 ++int style Base_Widget_AppCompat_Toolbar 0x7f1500a1 ++int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f1500a2 ++int style CalendarDatePickerDialog 0x7f1500a3 ++int style CalendarDatePickerStyle 0x7f1500a4 ++int style ClockTimePickerDialog 0x7f1500a5 ++int style ClockTimePickerStyle 0x7f1500a6 ++int style DialogAnimationFade 0x7f1500a7 ++int style DialogAnimationSlide 0x7f1500a8 ++int style Platform_AppCompat 0x7f1500a9 ++int style Platform_AppCompat_Light 0x7f1500aa ++int style Platform_ThemeOverlay_AppCompat 0x7f1500ab ++int style Platform_ThemeOverlay_AppCompat_Dark 0x7f1500ac ++int style Platform_ThemeOverlay_AppCompat_Light 0x7f1500ad ++int style Platform_V21_AppCompat 0x7f1500ae ++int style Platform_V21_AppCompat_Light 0x7f1500af ++int style Platform_V25_AppCompat 0x7f1500b0 ++int style Platform_V25_AppCompat_Light 0x7f1500b1 ++int style Platform_Widget_AppCompat_Spinner 0x7f1500b2 ++int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f1500b3 ++int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f1500b4 ++int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f1500b5 ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f1500b6 ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f1500b7 ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f1500b8 ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f1500b9 ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f1500ba ++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f1500bb ++int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f1500bc ++int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f1500bd ++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f1500be ++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f1500bf ++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f1500c0 ++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f1500c1 ++int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f1500c2 ++int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f1500c3 ++int style SpinnerDatePickerDialog 0x7f1500c4 ++int style SpinnerDatePickerStyle 0x7f1500c5 ++int style SpinnerTimePickerDialog 0x7f1500c6 ++int style SpinnerTimePickerStyle 0x7f1500c7 ++int style TextAppearance_AppCompat 0x7f1500c8 ++int style TextAppearance_AppCompat_Body1 0x7f1500c9 ++int style TextAppearance_AppCompat_Body2 0x7f1500ca ++int style TextAppearance_AppCompat_Button 0x7f1500cb ++int style TextAppearance_AppCompat_Caption 0x7f1500cc ++int style TextAppearance_AppCompat_Display1 0x7f1500cd ++int style TextAppearance_AppCompat_Display2 0x7f1500ce ++int style TextAppearance_AppCompat_Display3 0x7f1500cf ++int style TextAppearance_AppCompat_Display4 0x7f1500d0 ++int style TextAppearance_AppCompat_Headline 0x7f1500d1 ++int style TextAppearance_AppCompat_Inverse 0x7f1500d2 ++int style TextAppearance_AppCompat_Large 0x7f1500d3 ++int style TextAppearance_AppCompat_Large_Inverse 0x7f1500d4 ++int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f1500d5 ++int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f1500d6 ++int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f1500d7 ++int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f1500d8 ++int style TextAppearance_AppCompat_Medium 0x7f1500d9 ++int style TextAppearance_AppCompat_Medium_Inverse 0x7f1500da ++int style TextAppearance_AppCompat_Menu 0x7f1500db ++int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f1500dc ++int style TextAppearance_AppCompat_SearchResult_Title 0x7f1500dd ++int style TextAppearance_AppCompat_Small 0x7f1500de ++int style TextAppearance_AppCompat_Small_Inverse 0x7f1500df ++int style TextAppearance_AppCompat_Subhead 0x7f1500e0 ++int style TextAppearance_AppCompat_Subhead_Inverse 0x7f1500e1 ++int style TextAppearance_AppCompat_Title 0x7f1500e2 ++int style TextAppearance_AppCompat_Title_Inverse 0x7f1500e3 ++int style TextAppearance_AppCompat_Tooltip 0x7f1500e4 ++int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f1500e5 ++int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f1500e6 ++int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f1500e7 ++int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f1500e8 ++int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f1500e9 ++int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f1500ea ++int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f1500eb ++int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f1500ec ++int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f1500ed ++int style TextAppearance_AppCompat_Widget_Button 0x7f1500ee ++int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f1500ef ++int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f1500f0 ++int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f1500f1 ++int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f1500f2 ++int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f1500f3 ++int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f1500f4 ++int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f1500f5 ++int style TextAppearance_AppCompat_Widget_Switch 0x7f1500f6 ++int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f1500f7 ++int style TextAppearance_Compat_Notification 0x7f1500f8 ++int style TextAppearance_Compat_Notification_Info 0x7f1500f9 ++int style TextAppearance_Compat_Notification_Line2 0x7f1500fa ++int style TextAppearance_Compat_Notification_Time 0x7f1500fb ++int style TextAppearance_Compat_Notification_Title 0x7f1500fc ++int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f1500fd ++int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f1500fe ++int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f1500ff ++int style Theme 0x7f150100 ++int style ThemeOverlay_AppCompat 0x7f150101 ++int style ThemeOverlay_AppCompat_ActionBar 0x7f150102 ++int style ThemeOverlay_AppCompat_Dark 0x7f150103 ++int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f150104 ++int style ThemeOverlay_AppCompat_Dialog 0x7f150105 ++int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f150106 ++int style ThemeOverlay_AppCompat_Light 0x7f150107 ++int style Theme_AppCompat 0x7f150108 ++int style Theme_AppCompat_CompactMenu 0x7f150109 ++int style Theme_AppCompat_DayNight 0x7f15010a ++int style Theme_AppCompat_DayNight_DarkActionBar 0x7f15010b ++int style Theme_AppCompat_DayNight_Dialog 0x7f15010c ++int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f15010d ++int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f15010e ++int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f15010f ++int style Theme_AppCompat_DayNight_NoActionBar 0x7f150110 ++int style Theme_AppCompat_Dialog 0x7f150111 ++int style Theme_AppCompat_DialogWhenLarge 0x7f150112 ++int style Theme_AppCompat_Dialog_Alert 0x7f150113 ++int style Theme_AppCompat_Dialog_MinWidth 0x7f150114 ++int style Theme_AppCompat_Light 0x7f150115 ++int style Theme_AppCompat_Light_DarkActionBar 0x7f150116 ++int style Theme_AppCompat_Light_Dialog 0x7f150117 ++int style Theme_AppCompat_Light_DialogWhenLarge 0x7f150118 ++int style Theme_AppCompat_Light_Dialog_Alert 0x7f150119 ++int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f15011a ++int style Theme_AppCompat_Light_NoActionBar 0x7f15011b ++int style Theme_AppCompat_NoActionBar 0x7f15011c ++int style Theme_Catalyst 0x7f15011d ++int style Theme_Catalyst_LogBox 0x7f15011e ++int style Theme_Catalyst_RedBox 0x7f15011f ++int style Theme_FullScreenDialog 0x7f150120 ++int style Theme_FullScreenDialogAnimatedFade 0x7f150121 ++int style Theme_FullScreenDialogAnimatedSlide 0x7f150122 ++int style Theme_ReactNative_AppCompat_Light 0x7f150123 ++int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x7f150124 ++int style Widget_AppCompat_ActionBar 0x7f150125 ++int style Widget_AppCompat_ActionBar_Solid 0x7f150126 ++int style Widget_AppCompat_ActionBar_TabBar 0x7f150127 ++int style Widget_AppCompat_ActionBar_TabText 0x7f150128 ++int style Widget_AppCompat_ActionBar_TabView 0x7f150129 ++int style Widget_AppCompat_ActionButton 0x7f15012a ++int style Widget_AppCompat_ActionButton_CloseMode 0x7f15012b ++int style Widget_AppCompat_ActionButton_Overflow 0x7f15012c ++int style Widget_AppCompat_ActionMode 0x7f15012d ++int style Widget_AppCompat_ActivityChooserView 0x7f15012e ++int style Widget_AppCompat_AutoCompleteTextView 0x7f15012f ++int style Widget_AppCompat_Button 0x7f150130 ++int style Widget_AppCompat_ButtonBar 0x7f150131 ++int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f150132 ++int style Widget_AppCompat_Button_Borderless 0x7f150133 ++int style Widget_AppCompat_Button_Borderless_Colored 0x7f150134 ++int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f150135 ++int style Widget_AppCompat_Button_Colored 0x7f150136 ++int style Widget_AppCompat_Button_Small 0x7f150137 ++int style Widget_AppCompat_CompoundButton_CheckBox 0x7f150138 ++int style Widget_AppCompat_CompoundButton_RadioButton 0x7f150139 ++int style Widget_AppCompat_CompoundButton_Switch 0x7f15013a ++int style Widget_AppCompat_DrawerArrowToggle 0x7f15013b ++int style Widget_AppCompat_DropDownItem_Spinner 0x7f15013c ++int style Widget_AppCompat_EditText 0x7f15013d ++int style Widget_AppCompat_ImageButton 0x7f15013e ++int style Widget_AppCompat_Light_ActionBar 0x7f15013f ++int style Widget_AppCompat_Light_ActionBar_Solid 0x7f150140 ++int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f150141 ++int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f150142 ++int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f150143 ++int style Widget_AppCompat_Light_ActionBar_TabText 0x7f150144 ++int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f150145 ++int style Widget_AppCompat_Light_ActionBar_TabView 0x7f150146 ++int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f150147 ++int style Widget_AppCompat_Light_ActionButton 0x7f150148 ++int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f150149 ++int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f15014a ++int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f15014b ++int style Widget_AppCompat_Light_ActivityChooserView 0x7f15014c ++int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f15014d ++int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f15014e ++int style Widget_AppCompat_Light_ListPopupWindow 0x7f15014f ++int style Widget_AppCompat_Light_ListView_DropDown 0x7f150150 ++int style Widget_AppCompat_Light_PopupMenu 0x7f150151 ++int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f150152 ++int style Widget_AppCompat_Light_SearchView 0x7f150153 ++int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f150154 ++int style Widget_AppCompat_ListMenuView 0x7f150155 ++int style Widget_AppCompat_ListPopupWindow 0x7f150156 ++int style Widget_AppCompat_ListView 0x7f150157 ++int style Widget_AppCompat_ListView_DropDown 0x7f150158 ++int style Widget_AppCompat_ListView_Menu 0x7f150159 ++int style Widget_AppCompat_PopupMenu 0x7f15015a ++int style Widget_AppCompat_PopupMenu_Overflow 0x7f15015b ++int style Widget_AppCompat_PopupWindow 0x7f15015c ++int style Widget_AppCompat_ProgressBar 0x7f15015d ++int style Widget_AppCompat_ProgressBar_Horizontal 0x7f15015e ++int style Widget_AppCompat_RatingBar 0x7f15015f ++int style Widget_AppCompat_RatingBar_Indicator 0x7f150160 ++int style Widget_AppCompat_RatingBar_Small 0x7f150161 ++int style Widget_AppCompat_SearchView 0x7f150162 ++int style Widget_AppCompat_SearchView_ActionBar 0x7f150163 ++int style Widget_AppCompat_SeekBar 0x7f150164 ++int style Widget_AppCompat_SeekBar_Discrete 0x7f150165 ++int style Widget_AppCompat_Spinner 0x7f150166 ++int style Widget_AppCompat_Spinner_DropDown 0x7f150167 ++int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f150168 ++int style Widget_AppCompat_Spinner_Underlined 0x7f150169 ++int style Widget_AppCompat_TextView_SpinnerItem 0x7f15016a ++int style Widget_AppCompat_Toolbar 0x7f15016b ++int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f15016c ++int style Widget_Compat_NotificationActionContainer 0x7f15016d ++int style Widget_Compat_NotificationActionText 0x7f15016e ++int style Widget_Support_CoordinatorLayout 0x7f15016f ++int style redboxButton 0x7f150170 ++int[] styleable ActionBar { 0x7f040035, 0x7f040037, 0x7f040038, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f040064, 0x7f040069, 0x7f04006a, 0x7f040075, 0x7f040088, 0x7f040089, 0x7f04008a, 0x7f04008b, 0x7f04008c, 0x7f040091, 0x7f040094, 0x7f0400aa, 0x7f0400b1, 0x7f0400bf, 0x7f0400c6, 0x7f0400c7, 0x7f0400f2, 0x7f0400f5, 0x7f040110, 0x7f040119 } ++int styleable ActionBar_background 0 ++int styleable ActionBar_backgroundSplit 1 ++int styleable ActionBar_backgroundStacked 2 ++int styleable ActionBar_contentInsetEnd 3 ++int styleable ActionBar_contentInsetEndWithActions 4 ++int styleable ActionBar_contentInsetLeft 5 ++int styleable ActionBar_contentInsetRight 6 ++int styleable ActionBar_contentInsetStart 7 ++int styleable ActionBar_contentInsetStartWithNavigation 8 ++int styleable ActionBar_customNavigationLayout 9 ++int styleable ActionBar_displayOptions 10 ++int styleable ActionBar_divider 11 ++int styleable ActionBar_elevation 12 ++int styleable ActionBar_height 13 ++int styleable ActionBar_hideOnContentScroll 14 ++int styleable ActionBar_homeAsUpIndicator 15 ++int styleable ActionBar_homeLayout 16 ++int styleable ActionBar_icon 17 ++int styleable ActionBar_indeterminateProgressStyle 18 ++int styleable ActionBar_itemPadding 19 ++int styleable ActionBar_logo 20 ++int styleable ActionBar_navigationMode 21 ++int styleable ActionBar_popupTheme 22 ++int styleable ActionBar_progressBarPadding 23 ++int styleable ActionBar_progressBarStyle 24 ++int styleable ActionBar_subtitle 25 ++int styleable ActionBar_subtitleTextStyle 26 ++int styleable ActionBar_title 27 ++int styleable ActionBar_titleTextStyle 28 ++int[] styleable ActionBarLayout { 0x10100b3 } ++int styleable ActionBarLayout_android_layout_gravity 0 ++int[] styleable ActionMenuItemView { 0x101013f } ++int styleable ActionMenuItemView_android_minWidth 0 ++int[] styleable ActionMenuView { } ++int[] styleable ActionMode { 0x7f040035, 0x7f040037, 0x7f04004c, 0x7f040088, 0x7f0400f5, 0x7f040119 } ++int styleable ActionMode_background 0 ++int styleable ActionMode_backgroundSplit 1 ++int styleable ActionMode_closeItemLayout 2 ++int styleable ActionMode_height 3 ++int styleable ActionMode_subtitleTextStyle 4 ++int styleable ActionMode_titleTextStyle 5 ++int[] styleable ActivityChooserView { 0x7f040076, 0x7f040092 } ++int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 ++int styleable ActivityChooserView_initialActivityCount 1 ++int[] styleable AlertDialog { 0x10100f2, 0x7f040043, 0x7f040044, 0x7f0400a1, 0x7f0400a2, 0x7f0400ae, 0x7f0400e7, 0x7f0400e8 } ++int styleable AlertDialog_android_layout 0 ++int styleable AlertDialog_buttonIconDimen 1 ++int styleable AlertDialog_buttonPanelSideLayout 2 ++int styleable AlertDialog_listItemLayout 3 ++int styleable AlertDialog_listLayout 4 ++int styleable AlertDialog_multiChoiceItemLayout 5 ++int styleable AlertDialog_showTitle 6 ++int styleable AlertDialog_singleChoiceItemLayout 7 ++int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } ++int styleable AnimatedStateListDrawableCompat_android_constantSize 0 ++int styleable AnimatedStateListDrawableCompat_android_dither 1 ++int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2 ++int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3 ++int styleable AnimatedStateListDrawableCompat_android_variablePadding 4 ++int styleable AnimatedStateListDrawableCompat_android_visible 5 ++int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 } ++int styleable AnimatedStateListDrawableItem_android_drawable 0 ++int styleable AnimatedStateListDrawableItem_android_id 1 ++int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 } ++int styleable AnimatedStateListDrawableTransition_android_drawable 0 ++int styleable AnimatedStateListDrawableTransition_android_fromId 1 ++int styleable AnimatedStateListDrawableTransition_android_reversible 2 ++int styleable AnimatedStateListDrawableTransition_android_toId 3 ++int[] styleable AppCompatImageView { 0x1010119, 0x7f0400ed, 0x7f04010e, 0x7f04010f } ++int styleable AppCompatImageView_android_src 0 ++int styleable AppCompatImageView_srcCompat 1 ++int styleable AppCompatImageView_tint 2 ++int styleable AppCompatImageView_tintMode 3 ++int[] styleable AppCompatSeekBar { 0x1010142, 0x7f04010b, 0x7f04010c, 0x7f04010d } ++int styleable AppCompatSeekBar_android_thumb 0 ++int styleable AppCompatSeekBar_tickMark 1 ++int styleable AppCompatSeekBar_tickMarkTint 2 ++int styleable AppCompatSeekBar_tickMarkTintMode 3 ++int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 } ++int styleable AppCompatTextHelper_android_drawableBottom 0 ++int styleable AppCompatTextHelper_android_drawableEnd 1 ++int styleable AppCompatTextHelper_android_drawableLeft 2 ++int styleable AppCompatTextHelper_android_drawableRight 3 ++int styleable AppCompatTextHelper_android_drawableStart 4 ++int styleable AppCompatTextHelper_android_drawableTop 5 ++int styleable AppCompatTextHelper_android_textAppearance 6 ++int[] styleable AppCompatTextView { 0x1010034, 0x7f040030, 0x7f040031, 0x7f040032, 0x7f040033, 0x7f040034, 0x7f04007a, 0x7f04007c, 0x7f040096, 0x7f04009e, 0x7f0400fb } ++int styleable AppCompatTextView_android_textAppearance 0 ++int styleable AppCompatTextView_autoSizeMaxTextSize 1 ++int styleable AppCompatTextView_autoSizeMinTextSize 2 ++int styleable AppCompatTextView_autoSizePresetSizes 3 ++int styleable AppCompatTextView_autoSizeStepGranularity 4 ++int styleable AppCompatTextView_autoSizeTextType 5 ++int styleable AppCompatTextView_firstBaselineToTopHeight 6 ++int styleable AppCompatTextView_fontFamily 7 ++int styleable AppCompatTextView_lastBaselineToBottomHeight 8 ++int styleable AppCompatTextView_lineHeight 9 ++int styleable AppCompatTextView_textAllCaps 10 ++int[] styleable AppCompatTheme { 0x7f040001, 0x7f040002, 0x7f040003, 0x7f040004, 0x7f040005, 0x7f040006, 0x7f040007, 0x7f040008, 0x7f040009, 0x7f04000a, 0x7f04000b, 0x7f04000c, 0x7f04000d, 0x7f04000f, 0x7f040010, 0x7f040011, 0x7f040012, 0x7f040013, 0x7f040014, 0x7f040015, 0x7f040016, 0x7f040017, 0x7f040018, 0x7f040019, 0x7f04001a, 0x7f04001b, 0x7f04001c, 0x7f04001d, 0x7f04001e, 0x7f04001f, 0x7f040022, 0x7f040026, 0x7f040027, 0x7f040028, 0x7f040029, 0x10100ae, 0x1010057, 0x7f04002f, 0x7f04003c, 0x7f04003d, 0x7f04003e, 0x7f04003f, 0x7f040040, 0x7f040041, 0x7f040045, 0x7f040046, 0x7f040049, 0x7f04004a, 0x7f040050, 0x7f040051, 0x7f040052, 0x7f040053, 0x7f040054, 0x7f040055, 0x7f040056, 0x7f040057, 0x7f040058, 0x7f040059, 0x7f040062, 0x7f040066, 0x7f040067, 0x7f040068, 0x7f04006b, 0x7f04006d, 0x7f040070, 0x7f040071, 0x7f040072, 0x7f040073, 0x7f040074, 0x7f04008a, 0x7f040090, 0x7f04009f, 0x7f0400a0, 0x7f0400a3, 0x7f0400a4, 0x7f0400a5, 0x7f0400a6, 0x7f0400a7, 0x7f0400a8, 0x7f0400a9, 0x7f0400b9, 0x7f0400ba, 0x7f0400bb, 0x7f0400be, 0x7f0400c0, 0x7f0400ca, 0x7f0400cb, 0x7f0400cc, 0x7f0400cd, 0x7f0400e0, 0x7f0400e1, 0x7f0400e2, 0x7f0400e3, 0x7f0400ea, 0x7f0400eb, 0x7f0400f9, 0x7f0400fc, 0x7f0400fd, 0x7f0400fe, 0x7f0400ff, 0x7f040100, 0x7f040101, 0x7f040102, 0x7f040103, 0x7f040104, 0x7f040105, 0x7f04011a, 0x7f04011b, 0x7f04011c, 0x7f04011d, 0x7f040124, 0x7f040126, 0x7f040127, 0x7f040128, 0x7f040129, 0x7f04012a, 0x7f04012b, 0x7f04012c, 0x7f04012d, 0x7f04012e, 0x7f04012f } ++int styleable AppCompatTheme_actionBarDivider 0 ++int styleable AppCompatTheme_actionBarItemBackground 1 ++int styleable AppCompatTheme_actionBarPopupTheme 2 ++int styleable AppCompatTheme_actionBarSize 3 ++int styleable AppCompatTheme_actionBarSplitStyle 4 ++int styleable AppCompatTheme_actionBarStyle 5 ++int styleable AppCompatTheme_actionBarTabBarStyle 6 ++int styleable AppCompatTheme_actionBarTabStyle 7 ++int styleable AppCompatTheme_actionBarTabTextStyle 8 ++int styleable AppCompatTheme_actionBarTheme 9 ++int styleable AppCompatTheme_actionBarWidgetTheme 10 ++int styleable AppCompatTheme_actionButtonStyle 11 ++int styleable AppCompatTheme_actionDropDownStyle 12 ++int styleable AppCompatTheme_actionMenuTextAppearance 13 ++int styleable AppCompatTheme_actionMenuTextColor 14 ++int styleable AppCompatTheme_actionModeBackground 15 ++int styleable AppCompatTheme_actionModeCloseButtonStyle 16 ++int styleable AppCompatTheme_actionModeCloseDrawable 17 ++int styleable AppCompatTheme_actionModeCopyDrawable 18 ++int styleable AppCompatTheme_actionModeCutDrawable 19 ++int styleable AppCompatTheme_actionModeFindDrawable 20 ++int styleable AppCompatTheme_actionModePasteDrawable 21 ++int styleable AppCompatTheme_actionModePopupWindowStyle 22 ++int styleable AppCompatTheme_actionModeSelectAllDrawable 23 ++int styleable AppCompatTheme_actionModeShareDrawable 24 ++int styleable AppCompatTheme_actionModeSplitBackground 25 ++int styleable AppCompatTheme_actionModeStyle 26 ++int styleable AppCompatTheme_actionModeWebSearchDrawable 27 ++int styleable AppCompatTheme_actionOverflowButtonStyle 28 ++int styleable AppCompatTheme_actionOverflowMenuStyle 29 ++int styleable AppCompatTheme_activityChooserViewStyle 30 ++int styleable AppCompatTheme_alertDialogButtonGroupStyle 31 ++int styleable AppCompatTheme_alertDialogCenterButtons 32 ++int styleable AppCompatTheme_alertDialogStyle 33 ++int styleable AppCompatTheme_alertDialogTheme 34 ++int styleable AppCompatTheme_android_windowAnimationStyle 35 ++int styleable AppCompatTheme_android_windowIsFloating 36 ++int styleable AppCompatTheme_autoCompleteTextViewStyle 37 ++int styleable AppCompatTheme_borderlessButtonStyle 38 ++int styleable AppCompatTheme_buttonBarButtonStyle 39 ++int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 ++int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 ++int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 ++int styleable AppCompatTheme_buttonBarStyle 43 ++int styleable AppCompatTheme_buttonStyle 44 ++int styleable AppCompatTheme_buttonStyleSmall 45 ++int styleable AppCompatTheme_checkboxStyle 46 ++int styleable AppCompatTheme_checkedTextViewStyle 47 ++int styleable AppCompatTheme_colorAccent 48 ++int styleable AppCompatTheme_colorBackgroundFloating 49 ++int styleable AppCompatTheme_colorButtonNormal 50 ++int styleable AppCompatTheme_colorControlActivated 51 ++int styleable AppCompatTheme_colorControlHighlight 52 ++int styleable AppCompatTheme_colorControlNormal 53 ++int styleable AppCompatTheme_colorError 54 ++int styleable AppCompatTheme_colorPrimary 55 ++int styleable AppCompatTheme_colorPrimaryDark 56 ++int styleable AppCompatTheme_colorSwitchThumbNormal 57 ++int styleable AppCompatTheme_controlBackground 58 ++int styleable AppCompatTheme_dialogCornerRadius 59 ++int styleable AppCompatTheme_dialogPreferredPadding 60 ++int styleable AppCompatTheme_dialogTheme 61 ++int styleable AppCompatTheme_dividerHorizontal 62 ++int styleable AppCompatTheme_dividerVertical 63 ++int styleable AppCompatTheme_dropDownListViewStyle 64 ++int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 ++int styleable AppCompatTheme_editTextBackground 66 ++int styleable AppCompatTheme_editTextColor 67 ++int styleable AppCompatTheme_editTextStyle 68 ++int styleable AppCompatTheme_homeAsUpIndicator 69 ++int styleable AppCompatTheme_imageButtonStyle 70 ++int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 ++int styleable AppCompatTheme_listDividerAlertDialog 72 ++int styleable AppCompatTheme_listMenuViewStyle 73 ++int styleable AppCompatTheme_listPopupWindowStyle 74 ++int styleable AppCompatTheme_listPreferredItemHeight 75 ++int styleable AppCompatTheme_listPreferredItemHeightLarge 76 ++int styleable AppCompatTheme_listPreferredItemHeightSmall 77 ++int styleable AppCompatTheme_listPreferredItemPaddingLeft 78 ++int styleable AppCompatTheme_listPreferredItemPaddingRight 79 ++int styleable AppCompatTheme_panelBackground 80 ++int styleable AppCompatTheme_panelMenuListTheme 81 ++int styleable AppCompatTheme_panelMenuListWidth 82 ++int styleable AppCompatTheme_popupMenuStyle 83 ++int styleable AppCompatTheme_popupWindowStyle 84 ++int styleable AppCompatTheme_radioButtonStyle 85 ++int styleable AppCompatTheme_ratingBarStyle 86 ++int styleable AppCompatTheme_ratingBarStyleIndicator 87 ++int styleable AppCompatTheme_ratingBarStyleSmall 88 ++int styleable AppCompatTheme_searchViewStyle 89 ++int styleable AppCompatTheme_seekBarStyle 90 ++int styleable AppCompatTheme_selectableItemBackground 91 ++int styleable AppCompatTheme_selectableItemBackgroundBorderless 92 ++int styleable AppCompatTheme_spinnerDropDownItemStyle 93 ++int styleable AppCompatTheme_spinnerStyle 94 ++int styleable AppCompatTheme_switchStyle 95 ++int styleable AppCompatTheme_textAppearanceLargePopupMenu 96 ++int styleable AppCompatTheme_textAppearanceListItem 97 ++int styleable AppCompatTheme_textAppearanceListItemSecondary 98 ++int styleable AppCompatTheme_textAppearanceListItemSmall 99 ++int styleable AppCompatTheme_textAppearancePopupMenuHeader 100 ++int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101 ++int styleable AppCompatTheme_textAppearanceSearchResultTitle 102 ++int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103 ++int styleable AppCompatTheme_textColorAlertDialogListItem 104 ++int styleable AppCompatTheme_textColorSearchUrl 105 ++int styleable AppCompatTheme_toolbarNavigationButtonStyle 106 ++int styleable AppCompatTheme_toolbarStyle 107 ++int styleable AppCompatTheme_tooltipForegroundColor 108 ++int styleable AppCompatTheme_tooltipFrameBackground 109 ++int styleable AppCompatTheme_viewInflaterClass 110 ++int styleable AppCompatTheme_windowActionBar 111 ++int styleable AppCompatTheme_windowActionBarOverlay 112 ++int styleable AppCompatTheme_windowActionModeOverlay 113 ++int styleable AppCompatTheme_windowFixedHeightMajor 114 ++int styleable AppCompatTheme_windowFixedHeightMinor 115 ++int styleable AppCompatTheme_windowFixedWidthMajor 116 ++int styleable AppCompatTheme_windowFixedWidthMinor 117 ++int styleable AppCompatTheme_windowMinWidthMajor 118 ++int styleable AppCompatTheme_windowMinWidthMinor 119 ++int styleable AppCompatTheme_windowNoTitle 120 ++int[] styleable ButtonBarLayout { 0x7f04002a } ++int styleable ButtonBarLayout_allowStacking 0 ++int[] styleable ColorStateListItem { 0x7f04002b, 0x101031f, 0x10101a5 } ++int styleable ColorStateListItem_alpha 0 ++int styleable ColorStateListItem_android_alpha 1 ++int styleable ColorStateListItem_android_color 2 ++int[] styleable CompoundButton { 0x1010107, 0x7f040047, 0x7f040048 } ++int styleable CompoundButton_android_button 0 ++int styleable CompoundButton_buttonTint 1 ++int styleable CompoundButton_buttonTintMode 2 ++int[] styleable CoordinatorLayout { 0x7f040095, 0x7f0400ef } ++int styleable CoordinatorLayout_keylines 0 ++int styleable CoordinatorLayout_statusBarBackground 1 ++int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x7f040098, 0x7f040099, 0x7f04009a, 0x7f04009b, 0x7f04009c, 0x7f04009d } ++int styleable CoordinatorLayout_Layout_android_layout_gravity 0 ++int styleable CoordinatorLayout_Layout_layout_anchor 1 ++int styleable CoordinatorLayout_Layout_layout_anchorGravity 2 ++int styleable CoordinatorLayout_Layout_layout_behavior 3 ++int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4 ++int styleable CoordinatorLayout_Layout_layout_insetEdge 5 ++int styleable CoordinatorLayout_Layout_layout_keyline 6 ++int[] styleable DrawerArrowToggle { 0x7f04002d, 0x7f04002e, 0x7f04003b, 0x7f04004f, 0x7f04006e, 0x7f040086, 0x7f0400e9, 0x7f040107 } ++int styleable DrawerArrowToggle_arrowHeadLength 0 ++int styleable DrawerArrowToggle_arrowShaftLength 1 ++int styleable DrawerArrowToggle_barLength 2 ++int styleable DrawerArrowToggle_color 3 ++int styleable DrawerArrowToggle_drawableSize 4 ++int styleable DrawerArrowToggle_gapBetweenBars 5 ++int styleable DrawerArrowToggle_spinBars 6 ++int styleable DrawerArrowToggle_thickness 7 ++int[] styleable FontFamily { 0x7f04007d, 0x7f04007e, 0x7f04007f, 0x7f040080, 0x7f040081, 0x7f040082 } ++int styleable FontFamily_fontProviderAuthority 0 ++int styleable FontFamily_fontProviderCerts 1 ++int styleable FontFamily_fontProviderFetchStrategy 2 ++int styleable FontFamily_fontProviderFetchTimeout 3 ++int styleable FontFamily_fontProviderPackage 4 ++int styleable FontFamily_fontProviderQuery 5 ++int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x7f04007b, 0x7f040083, 0x7f040084, 0x7f040085, 0x7f040122 } ++int styleable FontFamilyFont_android_font 0 ++int styleable FontFamilyFont_android_fontStyle 1 ++int styleable FontFamilyFont_android_fontVariationSettings 2 ++int styleable FontFamilyFont_android_fontWeight 3 ++int styleable FontFamilyFont_android_ttcIndex 4 ++int styleable FontFamilyFont_font 5 ++int styleable FontFamilyFont_fontStyle 6 ++int styleable FontFamilyFont_fontVariationSettings 7 ++int styleable FontFamilyFont_fontWeight 8 ++int styleable FontFamilyFont_ttcIndex 9 ++int[] styleable GenericDraweeHierarchy { 0x7f040024, 0x7f040036, 0x7f040077, 0x7f040078, 0x7f040079, 0x7f0400b4, 0x7f0400bc, 0x7f0400bd, 0x7f0400c2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400ce, 0x7f0400cf, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f040123 } ++int styleable GenericDraweeHierarchy_actualImageScaleType 0 ++int styleable GenericDraweeHierarchy_backgroundImage 1 ++int styleable GenericDraweeHierarchy_fadeDuration 2 ++int styleable GenericDraweeHierarchy_failureImage 3 ++int styleable GenericDraweeHierarchy_failureImageScaleType 4 ++int styleable GenericDraweeHierarchy_overlayImage 5 ++int styleable GenericDraweeHierarchy_placeholderImage 6 ++int styleable GenericDraweeHierarchy_placeholderImageScaleType 7 ++int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8 ++int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9 ++int styleable GenericDraweeHierarchy_progressBarImage 10 ++int styleable GenericDraweeHierarchy_progressBarImageScaleType 11 ++int styleable GenericDraweeHierarchy_retryImage 12 ++int styleable GenericDraweeHierarchy_retryImageScaleType 13 ++int styleable GenericDraweeHierarchy_roundAsCircle 14 ++int styleable GenericDraweeHierarchy_roundBottomEnd 15 ++int styleable GenericDraweeHierarchy_roundBottomLeft 16 ++int styleable GenericDraweeHierarchy_roundBottomRight 17 ++int styleable GenericDraweeHierarchy_roundBottomStart 18 ++int styleable GenericDraweeHierarchy_roundTopEnd 19 ++int styleable GenericDraweeHierarchy_roundTopLeft 20 ++int styleable GenericDraweeHierarchy_roundTopRight 21 ++int styleable GenericDraweeHierarchy_roundTopStart 22 ++int styleable GenericDraweeHierarchy_roundWithOverlayColor 23 ++int styleable GenericDraweeHierarchy_roundedCornerRadius 24 ++int styleable GenericDraweeHierarchy_roundingBorderColor 25 ++int styleable GenericDraweeHierarchy_roundingBorderPadding 26 ++int styleable GenericDraweeHierarchy_roundingBorderWidth 27 ++int styleable GenericDraweeHierarchy_viewAspectRatio 28 ++int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 } ++int styleable GradientColor_android_centerColor 0 ++int styleable GradientColor_android_centerX 1 ++int styleable GradientColor_android_centerY 2 ++int styleable GradientColor_android_endColor 3 ++int styleable GradientColor_android_endX 4 ++int styleable GradientColor_android_endY 5 ++int styleable GradientColor_android_gradientRadius 6 ++int styleable GradientColor_android_startColor 7 ++int styleable GradientColor_android_startX 8 ++int styleable GradientColor_android_startY 9 ++int styleable GradientColor_android_tileMode 10 ++int styleable GradientColor_android_type 11 ++int[] styleable GradientColorItem { 0x10101a5, 0x1010514 } ++int styleable GradientColorItem_android_color 0 ++int styleable GradientColorItem_android_offset 1 ++int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x7f04006a, 0x7f04006c, 0x7f0400ad, 0x7f0400e5 } ++int styleable LinearLayoutCompat_android_baselineAligned 0 ++int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1 ++int styleable LinearLayoutCompat_android_gravity 2 ++int styleable LinearLayoutCompat_android_orientation 3 ++int styleable LinearLayoutCompat_android_weightSum 4 ++int styleable LinearLayoutCompat_divider 5 ++int styleable LinearLayoutCompat_dividerPadding 6 ++int styleable LinearLayoutCompat_measureWithLargestChild 7 ++int styleable LinearLayoutCompat_showDividers 8 ++int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 } ++int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 ++int styleable LinearLayoutCompat_Layout_android_layout_height 1 ++int styleable LinearLayoutCompat_Layout_android_layout_weight 2 ++int styleable LinearLayoutCompat_Layout_android_layout_width 3 ++int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad } ++int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 ++int styleable ListPopupWindow_android_dropDownVerticalOffset 1 ++int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 } ++int styleable MenuGroup_android_checkableBehavior 0 ++int styleable MenuGroup_android_enabled 1 ++int styleable MenuGroup_android_id 2 ++int styleable MenuGroup_android_menuCategory 3 ++int styleable MenuGroup_android_orderInCategory 4 ++int styleable MenuGroup_android_visible 5 ++int[] styleable MenuItem { 0x7f04000e, 0x7f040020, 0x7f040021, 0x7f04002c, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x7f04005b, 0x7f04008d, 0x7f04008e, 0x7f0400b2, 0x7f0400e4, 0x7f04011e } ++int styleable MenuItem_actionLayout 0 ++int styleable MenuItem_actionProviderClass 1 ++int styleable MenuItem_actionViewClass 2 ++int styleable MenuItem_alphabeticModifiers 3 ++int styleable MenuItem_android_alphabeticShortcut 4 ++int styleable MenuItem_android_checkable 5 ++int styleable MenuItem_android_checked 6 ++int styleable MenuItem_android_enabled 7 ++int styleable MenuItem_android_icon 8 ++int styleable MenuItem_android_id 9 ++int styleable MenuItem_android_menuCategory 10 ++int styleable MenuItem_android_numericShortcut 11 ++int styleable MenuItem_android_onClick 12 ++int styleable MenuItem_android_orderInCategory 13 ++int styleable MenuItem_android_title 14 ++int styleable MenuItem_android_titleCondensed 15 ++int styleable MenuItem_android_visible 16 ++int styleable MenuItem_contentDescription 17 ++int styleable MenuItem_iconTint 18 ++int styleable MenuItem_iconTintMode 19 ++int styleable MenuItem_numericModifiers 20 ++int styleable MenuItem_showAsAction 21 ++int styleable MenuItem_tooltipText 22 ++int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x7f0400c1, 0x7f0400f0 } ++int styleable MenuView_android_headerBackground 0 ++int styleable MenuView_android_horizontalDivider 1 ++int styleable MenuView_android_itemBackground 2 ++int styleable MenuView_android_itemIconDisabledAlpha 3 ++int styleable MenuView_android_itemTextAppearance 4 ++int styleable MenuView_android_verticalDivider 5 ++int styleable MenuView_android_windowAnimationStyle 6 ++int styleable MenuView_preserveIconSpacing 7 ++int styleable MenuView_subMenuArrow 8 ++int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x7f0400b3 } ++int styleable PopupWindow_android_popupAnimationStyle 0 ++int styleable PopupWindow_android_popupBackground 1 ++int styleable PopupWindow_overlapAnchor 2 ++int[] styleable PopupWindowBackgroundState { 0x7f0400ee } ++int styleable PopupWindowBackgroundState_state_above_anchor 0 ++int[] styleable RecycleListView { 0x7f0400b5, 0x7f0400b8 } ++int styleable RecycleListView_paddingBottomNoButtons 0 ++int styleable RecycleListView_paddingTopNoTitle 1 ++int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x7f04004b, 0x7f04005a, 0x7f040065, 0x7f040087, 0x7f04008f, 0x7f040097, 0x7f0400c8, 0x7f0400c9, 0x7f0400de, 0x7f0400df, 0x7f0400f1, 0x7f0400f6, 0x7f040125 } ++int styleable SearchView_android_focusable 0 ++int styleable SearchView_android_imeOptions 1 ++int styleable SearchView_android_inputType 2 ++int styleable SearchView_android_maxWidth 3 ++int styleable SearchView_closeIcon 4 ++int styleable SearchView_commitIcon 5 ++int styleable SearchView_defaultQueryHint 6 ++int styleable SearchView_goIcon 7 ++int styleable SearchView_iconifiedByDefault 8 ++int styleable SearchView_layout 9 ++int styleable SearchView_queryBackground 10 ++int styleable SearchView_queryHint 11 ++int styleable SearchView_searchHintIcon 12 ++int styleable SearchView_searchIcon 13 ++int styleable SearchView_submitBackground 14 ++int styleable SearchView_suggestionRowLayout 15 ++int styleable SearchView_voiceIcon 16 ++int[] styleable SimpleDraweeView { 0x7f040023, 0x7f040024, 0x7f040025, 0x7f040036, 0x7f040077, 0x7f040078, 0x7f040079, 0x7f0400b4, 0x7f0400bc, 0x7f0400bd, 0x7f0400c2, 0x7f0400c3, 0x7f0400c4, 0x7f0400c5, 0x7f0400ce, 0x7f0400cf, 0x7f0400d0, 0x7f0400d1, 0x7f0400d2, 0x7f0400d3, 0x7f0400d4, 0x7f0400d5, 0x7f0400d6, 0x7f0400d7, 0x7f0400d8, 0x7f0400d9, 0x7f0400da, 0x7f0400db, 0x7f0400dc, 0x7f0400dd, 0x7f040123 } ++int styleable SimpleDraweeView_actualImageResource 0 ++int styleable SimpleDraweeView_actualImageScaleType 1 ++int styleable SimpleDraweeView_actualImageUri 2 ++int styleable SimpleDraweeView_backgroundImage 3 ++int styleable SimpleDraweeView_fadeDuration 4 ++int styleable SimpleDraweeView_failureImage 5 ++int styleable SimpleDraweeView_failureImageScaleType 6 ++int styleable SimpleDraweeView_overlayImage 7 ++int styleable SimpleDraweeView_placeholderImage 8 ++int styleable SimpleDraweeView_placeholderImageScaleType 9 ++int styleable SimpleDraweeView_pressedStateOverlayImage 10 ++int styleable SimpleDraweeView_progressBarAutoRotateInterval 11 ++int styleable SimpleDraweeView_progressBarImage 12 ++int styleable SimpleDraweeView_progressBarImageScaleType 13 ++int styleable SimpleDraweeView_retryImage 14 ++int styleable SimpleDraweeView_retryImageScaleType 15 ++int styleable SimpleDraweeView_roundAsCircle 16 ++int styleable SimpleDraweeView_roundBottomEnd 17 ++int styleable SimpleDraweeView_roundBottomLeft 18 ++int styleable SimpleDraweeView_roundBottomRight 19 ++int styleable SimpleDraweeView_roundBottomStart 20 ++int styleable SimpleDraweeView_roundTopEnd 21 ++int styleable SimpleDraweeView_roundTopLeft 22 ++int styleable SimpleDraweeView_roundTopRight 23 ++int styleable SimpleDraweeView_roundTopStart 24 ++int styleable SimpleDraweeView_roundWithOverlayColor 25 ++int styleable SimpleDraweeView_roundedCornerRadius 26 ++int styleable SimpleDraweeView_roundingBorderColor 27 ++int styleable SimpleDraweeView_roundingBorderPadding 28 ++int styleable SimpleDraweeView_roundingBorderWidth 29 ++int styleable SimpleDraweeView_viewAspectRatio 30 ++int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x7f0400bf } ++int styleable Spinner_android_dropDownWidth 0 ++int styleable Spinner_android_entries 1 ++int styleable Spinner_android_popupBackground 2 ++int styleable Spinner_android_prompt 3 ++int styleable Spinner_popupTheme 4 ++int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } ++int styleable StateListDrawable_android_constantSize 0 ++int styleable StateListDrawable_android_dither 1 ++int styleable StateListDrawable_android_enterFadeDuration 2 ++int styleable StateListDrawable_android_exitFadeDuration 3 ++int styleable StateListDrawable_android_variablePadding 4 ++int styleable StateListDrawable_android_visible 5 ++int[] styleable StateListDrawableItem { 0x1010199 } ++int styleable StateListDrawableItem_android_drawable 0 ++int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x7f0400e6, 0x7f0400ec, 0x7f0400f7, 0x7f0400f8, 0x7f0400fa, 0x7f040108, 0x7f040109, 0x7f04010a, 0x7f04011f, 0x7f040120, 0x7f040121 } ++int styleable SwitchCompat_android_textOff 0 ++int styleable SwitchCompat_android_textOn 1 ++int styleable SwitchCompat_android_thumb 2 ++int styleable SwitchCompat_showText 3 ++int styleable SwitchCompat_splitTrack 4 ++int styleable SwitchCompat_switchMinWidth 5 ++int styleable SwitchCompat_switchPadding 6 ++int styleable SwitchCompat_switchTextAppearance 7 ++int styleable SwitchCompat_thumbTextPadding 8 ++int styleable SwitchCompat_thumbTint 9 ++int styleable SwitchCompat_thumbTintMode 10 ++int styleable SwitchCompat_track 11 ++int styleable SwitchCompat_trackTint 12 ++int styleable SwitchCompat_trackTintMode 13 ++int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010095, 0x1010097, 0x1010096, 0x7f04007c, 0x7f0400fb } ++int styleable TextAppearance_android_fontFamily 0 ++int styleable TextAppearance_android_shadowColor 1 ++int styleable TextAppearance_android_shadowDx 2 ++int styleable TextAppearance_android_shadowDy 3 ++int styleable TextAppearance_android_shadowRadius 4 ++int styleable TextAppearance_android_textColor 5 ++int styleable TextAppearance_android_textColorHint 6 ++int styleable TextAppearance_android_textColorLink 7 ++int styleable TextAppearance_android_textSize 8 ++int styleable TextAppearance_android_textStyle 9 ++int styleable TextAppearance_android_typeface 10 ++int styleable TextAppearance_fontFamily 11 ++int styleable TextAppearance_textAllCaps 12 ++int[] styleable Toolbar { 0x10100af, 0x1010140, 0x7f040042, 0x7f04004d, 0x7f04004e, 0x7f04005c, 0x7f04005d, 0x7f04005e, 0x7f04005f, 0x7f040060, 0x7f040061, 0x7f0400aa, 0x7f0400ab, 0x7f0400ac, 0x7f0400af, 0x7f0400b0, 0x7f0400bf, 0x7f0400f2, 0x7f0400f3, 0x7f0400f4, 0x7f040110, 0x7f040111, 0x7f040112, 0x7f040113, 0x7f040114, 0x7f040115, 0x7f040116, 0x7f040117, 0x7f040118 } ++int styleable Toolbar_android_gravity 0 ++int styleable Toolbar_android_minHeight 1 ++int styleable Toolbar_buttonGravity 2 ++int styleable Toolbar_collapseContentDescription 3 ++int styleable Toolbar_collapseIcon 4 ++int styleable Toolbar_contentInsetEnd 5 ++int styleable Toolbar_contentInsetEndWithActions 6 ++int styleable Toolbar_contentInsetLeft 7 ++int styleable Toolbar_contentInsetRight 8 ++int styleable Toolbar_contentInsetStart 9 ++int styleable Toolbar_contentInsetStartWithNavigation 10 ++int styleable Toolbar_logo 11 ++int styleable Toolbar_logoDescription 12 ++int styleable Toolbar_maxButtonHeight 13 ++int styleable Toolbar_navigationContentDescription 14 ++int styleable Toolbar_navigationIcon 15 ++int styleable Toolbar_popupTheme 16 ++int styleable Toolbar_subtitle 17 ++int styleable Toolbar_subtitleTextAppearance 18 ++int styleable Toolbar_subtitleTextColor 19 ++int styleable Toolbar_title 20 ++int styleable Toolbar_titleMargin 21 ++int styleable Toolbar_titleMarginBottom 22 ++int styleable Toolbar_titleMarginEnd 23 ++int styleable Toolbar_titleMarginStart 24 ++int styleable Toolbar_titleMarginTop 25 ++int styleable Toolbar_titleMargins 26 ++int styleable Toolbar_titleTextAppearance 27 ++int styleable Toolbar_titleTextColor 28 ++int[] styleable View { 0x10100da, 0x1010000, 0x7f0400b6, 0x7f0400b7, 0x7f040106 } ++int styleable View_android_focusable 0 ++int styleable View_android_theme 1 ++int styleable View_paddingEnd 2 ++int styleable View_paddingStart 3 ++int styleable View_theme 4 ++int[] styleable ViewBackgroundHelper { 0x10100d4, 0x7f040039, 0x7f04003a } ++int styleable ViewBackgroundHelper_android_background 0 ++int styleable ViewBackgroundHelper_backgroundTint 1 ++int styleable ViewBackgroundHelper_backgroundTintMode 2 ++int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 } ++int styleable ViewStubCompat_android_id 0 ++int styleable ViewStubCompat_android_inflatedId 1 ++int styleable ViewStubCompat_android_layout 2 ++int xml rn_dev_preferences 0x7f180001 +diff --git a/node_modules/nodejs-mobile-react-native/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/nodejs-mobile-react-native/android/build/outputs/logs/manifest-merger-debug-report.txt +new file mode 100644 +index 0000000..ca41c9b +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/outputs/logs/manifest-merger-debug-report.txt +@@ -0,0 +1,25 @@ ++-- Merging decision tree log --- ++manifest ++ADDED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml:2:1-5:12 ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml:2:1-5:12 ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml:2:1-5:12 ++ package ++ ADDED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml:3:11-54 ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ xmlns:android ++ ADDED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml:2:11-69 ++uses-sdk ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml reason: use-sdk injection requested ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ android:targetSdkVersion ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ ADDED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ android:minSdkVersion ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ ADDED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml ++ INJECTED from /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/AndroidManifest.xml +diff --git a/node_modules/nodejs-mobile-react-native/android/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt b/node_modules/nodejs-mobile-react-native/android/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt +new file mode 100644 +index 0000000..cf1871f +--- /dev/null ++++ b/node_modules/nodejs-mobile-react-native/android/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt +@@ -0,0 +1,10 @@ ++com/janeasystems/rn_nodejs_mobile/RNNodeJsMobilePackage.java ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobilePackage ++com/janeasystems/rn_nodejs_mobile/BuildConfig.java ++ com.janeasystems.rn_nodejs_mobile.BuildConfig ++com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.java ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobileModule ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobileModule$1 ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobileModule$2 ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobileModule$3 ++ com.janeasystems.rn_nodejs_mobile.RNNodeJsMobileModule$4 diff --git a/node_modules/nodejs-mobile-react-native/android/src/main/java/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.java b/node_modules/nodejs-mobile-react-native/android/src/main/java/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.java index e882a0c..d5ed11a 100644 --- a/node_modules/nodejs-mobile-react-native/android/src/main/java/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.java diff --git a/patches/react-native+0.63.2.patch b/patches/react-native+0.66.2.patch similarity index 82% rename from patches/react-native+0.63.2.patch rename to patches/react-native+0.66.2.patch index f75669bb3..9853fb9cf 100644 --- a/patches/react-native+0.63.2.patch +++ b/patches/react-native+0.66.2.patch @@ -1,11 +1,11 @@ diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle -index 6441d93..caa2cda 100644 +index ff46476..c287ee6 100644 --- a/node_modules/react-native/react.gradle +++ b/node_modules/react-native/react.gradle -@@ -167,6 +167,8 @@ afterEvaluate { - extraArgs.add(bundleConfig); +@@ -170,6 +170,8 @@ afterEvaluate { + extraArgs.addAll(config.extraPackagerArgs) } - + + environment("APP_VARIANT", variant.name); + commandLine(*execCommand, bundleCommand, "--platform", "android", "--dev", "${devEnabled}", From 7c3aedda822d0a0c40d5922206569b3b68e5dedb Mon Sep 17 00:00:00 2001 From: achou11 Date: Wed, 10 Nov 2021 09:21:42 -0500 Subject: [PATCH 04/77] Revert some build.gradle changes --- android/app/build.gradle | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 13ff2c20b..a52ccff73 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -140,11 +140,6 @@ def jscFlavor = 'org.webkit:android-jsc:+' */ def enableHermes = project.ext.react.get("enableHermes", false); -/** - * Architectures to build native code for in debug. - */ -def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures") - def loadDotEnv() { def envFile = ".env" @@ -291,10 +286,8 @@ android { signingConfig signingConfigs.debug applicationIdSuffix ".debug" - if (nativeArchitectures) { - ndk { - abiFilters nativeArchitectures.split(',') // "armeabi-v7a", "x86", "arm64-v8a", "x86_64" - } + ndk { + abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } } @@ -317,7 +310,7 @@ android { def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = - defaultConfig.versionCode * 1000 + versionCodes.get(abi) + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } @@ -336,6 +329,12 @@ android { // This is for react-native-v8 exclude "**/libjsc.so" } + + // Use Java 1.8 + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } configurations.all { From 9875757df60e313278f616cd0a3163ed6a1c87cb Mon Sep 17 00:00:00 2001 From: achou11 Date: Wed, 10 Nov 2021 09:23:42 -0500 Subject: [PATCH 05/77] Bump metro-react-native-babel-preset --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ea55efa3e..b650d1ef9 100644 --- a/package.json +++ b/package.json @@ -174,7 +174,7 @@ "jest": "^27.0.6", "jest-cli": "^26.4.2", "jetifier": "^1.6.6", - "metro-react-native-babel-preset": "^0.66.0", + "metro-react-native-babel-preset": "^0.66.2", "mkdirp": "^1.0.4", "prettier": "^2.0.5", "pretty-quick": "^2.0.0", From 8dc79cb1aa9b3f539232b0585bd34196156f2494 Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Wed, 10 Nov 2021 14:40:51 +0000 Subject: [PATCH 06/77] fix: Fix nodejs-mobile patch --- .../nodejs-mobile-react-native+0.6.1.patch | 260701 +-------------- 1 file changed, 116 insertions(+), 260585 deletions(-) diff --git a/patches/nodejs-mobile-react-native+0.6.1.patch b/patches/nodejs-mobile-react-native+0.6.1.patch index b23e9ee46..af1b7bec6 100644 --- a/patches/nodejs-mobile-react-native+0.6.1.patch +++ b/patches/nodejs-mobile-react-native+0.6.1.patch @@ -1,260589 +1,120 @@ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.json b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.json -new file mode 100644 -index 0000000..e542dae ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.json -@@ -0,0 +1,14 @@ -+{ -+ "allAbis": [ -+ "armeabi-v7a", -+ "arm64-v8a", -+ "x86", -+ "x86_64" -+ ], -+ "validAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.log b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.log -new file mode 100644 -index 0000000..0637a08 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572.log -@@ -0,0 +1 @@ -+[] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572_key.json b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572_key.json -new file mode 100644 -index 0000000..2b2c0ca ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_15p1x572_key.json -@@ -0,0 +1,18 @@ -+{ -+ "ndkHandlerSupportedAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkHandlerDefaultAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "externalNativeBuildAbiFilters": [], -+ "ndkConfigAbiFilters": [], -+ "splitsFilterAbis": [], -+ "ideBuildOnlyTargetAbi": true -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.json b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.json -new file mode 100644 -index 0000000..e542dae ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.json -@@ -0,0 +1,14 @@ -+{ -+ "allAbis": [ -+ "armeabi-v7a", -+ "arm64-v8a", -+ "x86", -+ "x86_64" -+ ], -+ "validAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.log b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.log -new file mode 100644 -index 0000000..0637a08 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2.log -@@ -0,0 +1 @@ -+[] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2_key.json b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2_key.json -new file mode 100644 -index 0000000..2b2c0ca ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/abi_configuration_4s14e3o2_key.json -@@ -0,0 +1,18 @@ -+{ -+ "ndkHandlerSupportedAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkHandlerDefaultAbis": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "externalNativeBuildAbiFilters": [], -+ "ndkConfigAbiFilters": [], -+ "splitsFilterAbis": [], -+ "ideBuildOnlyTargetAbi": true -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_deps b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_deps -new file mode 100644 -index 0000000..09c3ce9 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_deps differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_log -new file mode 100644 -index 0000000..6aa54fa ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/.ninja_log -@@ -0,0 +1,4 @@ -+# ninja log v5 -+0 542 1636396588 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o 481ec4d757c02e81 -+0 854 1636396588 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o 1aa8a17a00694f7c -+855 1206 1636396588 ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so b4684e4d1f1d54dc -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeCache.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeCache.txt -new file mode 100644 -index 0000000..31c4df6 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeCache.txt -@@ -0,0 +1,365 @@ -+# This is the CMakeCache file. -+# For build in directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+# It was generated by CMake: /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+# You can edit this file to change values found and used by cmake. -+# If you do not want to change any of the values, simply exit the editor. -+# If you do want to change a value, simply edit, save, and exit the editor. -+# The syntax for the file is as follows: -+# KEY:TYPE=VALUE -+# KEY is the name of a variable in the cache. -+# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -+# VALUE is the current value for the KEY. -+ -+######################## -+# EXTERNAL cache entries -+######################## -+ -+//No help, variable specified on the command line. -+ANDROID_ABI:UNINITIALIZED=arm64-v8a -+ -+//No help, variable specified on the command line. -+ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//No help, variable specified on the command line. -+ANDROID_PLATFORM:UNINITIALIZED=android-21 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//Archiver -+CMAKE_AR:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar -+ -+//Flags used by the compiler during all build types. -+CMAKE_ASM_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_ASM_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds. -+CMAKE_ASM_FLAGS_RELEASE:STRING= -+ -+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -+CMAKE_BUILD_TYPE:STRING=Debug -+ -+//LLVM archiver -+CMAKE_CXX_COMPILER_AR:FILEPATH=CMAKE_CXX_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_CXX_COMPILER_RANLIB:FILEPATH=CMAKE_CXX_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_CXX_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_CXX_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_CXX_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C++ applications. -+CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//LLVM archiver -+CMAKE_C_COMPILER_AR:FILEPATH=CMAKE_C_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_C_COMPILER_RANLIB:FILEPATH=CMAKE_C_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_C_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_C_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_C_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C applications. -+CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//Flags used by the linker. -+CMAKE_EXE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Enable/Disable output of compile commands during generation. -+CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -+ -+//No help, variable specified on the command line. -+CMAKE_FIND_ROOT_PATH:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/arm64-v8a/prefab -+ -+//Install path prefix, prepended onto install directories. -+CMAKE_INSTALL_PREFIX:PATH=/usr/local -+ -+//No help, variable specified on the command line. -+CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a -+ -+//Path to a program. -+CMAKE_LINKER:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ld -+ -+//No help, variable specified on the command line. -+CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+ -+//Flags used by the linker during the creation of modules. -+CMAKE_MODULE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_NM:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-nm -+ -+//Path to a program. -+CMAKE_OBJCOPY:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objcopy -+ -+//Path to a program. -+CMAKE_OBJDUMP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump -+ -+//Value Computed by CMake -+CMAKE_PROJECT_NAME:STATIC=Project -+ -+//Ranlib -+CMAKE_RANLIB:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ranlib -+ -+//No help, variable specified on the command line. -+CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a -+ -+//Flags used by the linker during the creation of dll's. -+CMAKE_SHARED_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//If set, runtime paths are not added when installing shared libraries, -+// but are added when building. -+CMAKE_SKIP_INSTALL_RPATH:BOOL=NO -+ -+//If set, runtime paths are not added when using shared libraries. -+CMAKE_SKIP_RPATH:BOOL=NO -+ -+//Flags used by the linker during the creation of static libraries. -+CMAKE_STATIC_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_STRIP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-strip -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_NAME:UNINITIALIZED=Android -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 -+ -+//The CMake toolchain file -+CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+ -+//If this value is on, makefiles will be generated without the -+// .SILENT directive, and all commands will be echoed to the console -+// during the make. This is useful for debugging only. With Visual -+// Studio IDE projects all commands are done without /nologo. -+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE -+ -+//Value Computed by CMake -+Project_BINARY_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+ -+//Value Computed by CMake -+Project_SOURCE_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+//Path to a library. -+log-lib:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/liblog.so -+ -+//Dependencies for the target -+nodejs-mobile-react-native-native-lib_LIB_DEPENDS:STATIC=general;libnode;general;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/liblog.so; -+ -+ -+######################## -+# INTERNAL cache entries -+######################## -+ -+//ADVANCED property for variable: CMAKE_AR -+CMAKE_AR-ADVANCED:INTERNAL=1 -+//This is the directory where this CMakeCache.txt was created -+CMAKE_CACHEFILE_DIR:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+//Major version of cmake used to create the current loaded cache -+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -+//Minor version of cmake used to create the current loaded cache -+CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 -+//Patch version of cmake used to create the current loaded cache -+CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -+//Path to CMake executable. -+CMAKE_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+//Path to cpack program executable. -+CMAKE_CPACK_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cpack -+//Path to ctest program executable. -+CMAKE_CTEST_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ctest -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -+CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -+CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS -+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -+CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_AR -+CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -+CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS -+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -+CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -+CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -+//Name of external makefile project generator. -+CMAKE_EXTRA_GENERATOR:INTERNAL= -+//Name of generator. -+CMAKE_GENERATOR:INTERNAL=Ninja -+//Name of generator platform. -+CMAKE_GENERATOR_PLATFORM:INTERNAL= -+//Name of generator toolset. -+CMAKE_GENERATOR_TOOLSET:INTERNAL= -+//Source directory with the top level CMakeLists.txt file for this -+// project -+CMAKE_HOME_DIRECTORY:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+//Install .so files without execute permission. -+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -+//ADVANCED property for variable: CMAKE_LINKER -+CMAKE_LINKER-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_NM -+CMAKE_NM-ADVANCED:INTERNAL=1 -+//number of local generators -+CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJCOPY -+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJDUMP -+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -+//Platform information initialized -+CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_RANLIB -+CMAKE_RANLIB-ADVANCED:INTERNAL=1 -+//Path to CMake installation. -+CMAKE_ROOT:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -+CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_RPATH -+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -+CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -+CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -+CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STRIP -+CMAKE_STRIP-ADVANCED:INTERNAL=1 -+//uname command -+CMAKE_UNAME:INTERNAL=/usr/bin/uname -+//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCCompiler.cmake -new file mode 100644 -index 0000000..dcb0f77 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCCompiler.cmake -@@ -0,0 +1,73 @@ -+set(CMAKE_C_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") -+set(CMAKE_C_COMPILER_ARG1 "") -+set(CMAKE_C_COMPILER_ID "Clang") -+set(CMAKE_C_COMPILER_VERSION "9.0") -+set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_C_COMPILER_WRAPPER "") -+set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -+set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -+set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -+set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -+set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -+ -+set(CMAKE_C_PLATFORM_ID "") -+set(CMAKE_C_SIMULATE_ID "") -+set(CMAKE_C_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar") -+set(CMAKE_C_COMPILER_AR "CMAKE_C_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ranlib") -+set(CMAKE_C_COMPILER_RANLIB "CMAKE_C_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCC ) -+set(CMAKE_C_COMPILER_LOADED 1) -+set(CMAKE_C_COMPILER_WORKS TRUE) -+set(CMAKE_C_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_C_COMPILER_ENV_VAR "CC") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_C_COMPILER_ID_RUN 1) -+set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -+set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_C_LINKER_PREFERENCE 10) -+ -+# Save compiler ABI information. -+set(CMAKE_C_SIZEOF_DATA_PTR "8") -+set(CMAKE_C_COMPILER_ABI "ELF") -+set(CMAKE_C_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_C_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_C_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_C_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;dl;c;gcc;dl") -+set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -new file mode 100644 -index 0000000..8edf422 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -@@ -0,0 +1,75 @@ -+set(CMAKE_CXX_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") -+set(CMAKE_CXX_COMPILER_ARG1 "") -+set(CMAKE_CXX_COMPILER_ID "Clang") -+set(CMAKE_CXX_COMPILER_VERSION "9.0") -+set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_CXX_COMPILER_WRAPPER "") -+set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") -+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -+set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -+set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -+ -+set(CMAKE_CXX_PLATFORM_ID "") -+set(CMAKE_CXX_SIMULATE_ID "") -+set(CMAKE_CXX_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar") -+set(CMAKE_CXX_COMPILER_AR "CMAKE_CXX_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ranlib") -+set(CMAKE_CXX_COMPILER_RANLIB "CMAKE_CXX_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCXX ) -+set(CMAKE_CXX_COMPILER_LOADED 1) -+set(CMAKE_CXX_COMPILER_WORKS TRUE) -+set(CMAKE_CXX_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_CXX_COMPILER_ID_RUN 1) -+set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -+set(CMAKE_CXX_LINKER_PREFERENCE 30) -+set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) -+ -+# Save compiler ABI information. -+set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -+set(CMAKE_CXX_COMPILER_ABI "ELF") -+set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_CXX_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_CXX_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_CXX_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;gcc;dl;c;gcc;dl") -+set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin -new file mode 100755 -index 0000000..31d122d -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin -new file mode 100755 -index 0000000..ed5bc23 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeSystem.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeSystem.cmake -new file mode 100644 -index 0000000..20cd52d ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeSystem.cmake -@@ -0,0 +1,15 @@ -+set(CMAKE_HOST_SYSTEM "Darwin-20.6.0") -+set(CMAKE_HOST_SYSTEM_NAME "Darwin") -+set(CMAKE_HOST_SYSTEM_VERSION "20.6.0") -+set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") -+ -+include("/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake") -+ -+set(CMAKE_SYSTEM "Android-1") -+set(CMAKE_SYSTEM_NAME "Android") -+set(CMAKE_SYSTEM_VERSION "1") -+set(CMAKE_SYSTEM_PROCESSOR "aarch64") -+ -+set(CMAKE_CROSSCOMPILING "TRUE") -+ -+set(CMAKE_SYSTEM_LOADED 1) -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeOutput.log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeOutput.log -new file mode 100644 -index 0000000..2ceaa47 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeOutput.log -@@ -0,0 +1,514 @@ -+The target system is: Android - 1 - aarch64 -+The host system is: Darwin - 20.6.0 - x86_64 -+Determining if the C compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_f0ed2" -+[1/2] Building C object CMakeFiles/cmTC_f0ed2.dir/testCCompiler.c.o -+[2/2] Linking C executable cmTC_f0ed2 -+ -+ -+Detecting C compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_bad21" -+[1/2] Building C object CMakeFiles/cmTC_bad21.dir/CMakeCCompilerABI.c.o -+[2/2] Linking C executable cmTC_bad21 -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: aarch64-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -+Candidate multilib: .;@m64 -+Selected multilib: .;@m64 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --fix-cortex-a53-843419 --warn-shared-textrel -z now -z relro -z max-page-size=4096 --hash-style=both --enable-new-dtags --eh-frame-hdr -m aarch64linux -dynamic-linker /system/bin/linker64 -o cmTC_bad21 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_bad21.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o -+ -+ -+Parsed C implicit link information from above output: -+ link line regex: [^( *|.*[/\])(aarch64-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_bad21"] -+ ignore line: [[1/2] Building C object CMakeFiles/cmTC_bad21.dir/CMakeCCompilerABI.c.o] -+ ignore line: [[2/2] Linking C executable cmTC_bad21] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: aarch64-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m64] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m64] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --fix-cortex-a53-843419 --warn-shared-textrel -z now -z relro -z max-page-size=4096 --hash-style=both --enable-new-dtags --eh-frame-hdr -m aarch64linux -dynamic-linker /system/bin/linker64 -o cmTC_bad21 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_bad21.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [-EL] ==> ignore -+ arg [--fix-cortex-a53-843419] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [-zmax-page-size=4096] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [aarch64linux] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker64] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_bad21] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_bad21.dir/CMakeCCompilerABI.c.o] ==> ignore -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting C [-std=c11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_bf063" -+[1/2] Building C object CMakeFiles/cmTC_bf063.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_bf063 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:1c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c99] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_bf80a" -+[1/2] Building C object CMakeFiles/cmTC_bf80a.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_bf80a -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c90] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_ed69d" -+[1/2] Building C object CMakeFiles/cmTC_ed69d.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_ed69d -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:0c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:0c_variadic_macros -+Determining if the CXX compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_fccbf" -+[1/2] Building CXX object CMakeFiles/cmTC_fccbf.dir/testCXXCompiler.cxx.o -+[2/2] Linking CXX executable cmTC_fccbf -+ -+ -+Detecting CXX compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_00b53" -+[1/2] Building CXX object CMakeFiles/cmTC_00b53.dir/CMakeCXXCompilerABI.cpp.o -+[2/2] Linking CXX executable cmTC_00b53 -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: aarch64-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -+Candidate multilib: .;@m64 -+Selected multilib: .;@m64 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --fix-cortex-a53-843419 --warn-shared-textrel -z now -z relro -z max-page-size=4096 --hash-style=both --enable-new-dtags --eh-frame-hdr -m aarch64linux -dynamic-linker /system/bin/linker64 -o cmTC_00b53 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_00b53.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o -+ -+ -+Parsed CXX implicit link information from above output: -+ link line regex: [^( *|.*[/\])(aarch64-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_00b53"] -+ ignore line: [[1/2] Building CXX object CMakeFiles/cmTC_00b53.dir/CMakeCXXCompilerABI.cpp.o] -+ ignore line: [[2/2] Linking CXX executable cmTC_00b53] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: aarch64-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m64] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m64] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --fix-cortex-a53-843419 --warn-shared-textrel -z now -z relro -z max-page-size=4096 --hash-style=both --enable-new-dtags --eh-frame-hdr -m aarch64linux -dynamic-linker /system/bin/linker64 -o cmTC_00b53 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_00b53.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [-EL] ==> ignore -+ arg [--fix-cortex-a53-843419] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [-zmax-page-size=4096] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [aarch64linux] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker64] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_00b53] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_00b53.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore -+ arg [-Bstatic] ==> ignore -+ arg [-lc++] ==> lib [c++] -+ arg [-Bdynamic] ==> ignore -+ arg [-lm] ==> lib [m] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib/../lib64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [c++;m;gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/aarch64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/aarch64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/aarch64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting CXX [-std=c++1z] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_ca22c" -+[1/2] Building CXX object CMakeFiles/cmTC_ca22c.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_ca22c -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++14] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_6d9b1" -+[1/2] Building CXX object CMakeFiles/cmTC_6d9b1.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_6d9b1 -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_8cd51" -+[1/2] Building CXX object CMakeFiles/cmTC_8cd51.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_8cd51 -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++98] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_20864" -+[1/2] Building CXX object CMakeFiles/cmTC_20864.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_20864 -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:0cxx_alias_templates -+ Feature record: CXX_FEATURE:0cxx_alignas -+ Feature record: CXX_FEATURE:0cxx_alignof -+ Feature record: CXX_FEATURE:0cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:0cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:0cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:0cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:0cxx_default_function_template_args -+ Feature record: CXX_FEATURE:0cxx_defaulted_functions -+ Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:0cxx_delegating_constructors -+ Feature record: CXX_FEATURE:0cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:0cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:0cxx_explicit_conversions -+ Feature record: CXX_FEATURE:0cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:0cxx_extern_templates -+ Feature record: CXX_FEATURE:0cxx_final -+ Feature record: CXX_FEATURE:0cxx_func_identifier -+ Feature record: CXX_FEATURE:0cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:0cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:0cxx_inline_namespaces -+ Feature record: CXX_FEATURE:0cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:0cxx_local_type_template_args -+ Feature record: CXX_FEATURE:0cxx_long_long_type -+ Feature record: CXX_FEATURE:0cxx_noexcept -+ Feature record: CXX_FEATURE:0cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:0cxx_nullptr -+ Feature record: CXX_FEATURE:0cxx_override -+ Feature record: CXX_FEATURE:0cxx_range_for -+ Feature record: CXX_FEATURE:0cxx_raw_string_literals -+ Feature record: CXX_FEATURE:0cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:0cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:0cxx_rvalue_references -+ Feature record: CXX_FEATURE:0cxx_sizeof_member -+ Feature record: CXX_FEATURE:0cxx_static_assert -+ Feature record: CXX_FEATURE:0cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:0cxx_thread_local -+ Feature record: CXX_FEATURE:0cxx_trailing_return_types -+ Feature record: CXX_FEATURE:0cxx_unicode_literals -+ Feature record: CXX_FEATURE:0cxx_uniform_initialization -+ Feature record: CXX_FEATURE:0cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:0cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:0cxx_variadic_macros -+ Feature record: CXX_FEATURE:0cxx_variadic_templates -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/TargetDirectories.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/TargetDirectories.txt -new file mode 100644 -index 0000000..5e2bd1f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/TargetDirectories.txt -@@ -0,0 +1,3 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/rebuild_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/edit_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/cmake.check_cache b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/cmake.check_cache -new file mode 100644 -index 0000000..3dccd73 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/cmake.check_cache -@@ -0,0 +1 @@ -+# This file is generated by cmake for dependency checking of the CMakeCache.txt file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.bin -new file mode 100755 -index 0000000..da350a8 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c -new file mode 100644 -index 0000000..90a87b1 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c -@@ -0,0 +1,34 @@ -+ -+ const char features[] = {"\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 -+"1" -+#else -+"0" -+#endif -+"c_function_prototypes\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_restrict\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -+"1" -+#else -+"0" -+#endif -+"c_static_assert\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_variadic_macros\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx -new file mode 100644 -index 0000000..703b335 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx -@@ -0,0 +1,405 @@ -+ -+ const char features[] = {"\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_aggregate_nsdmi) -+"1" -+#else -+"0" -+#endif -+"cxx_aggregate_default_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alias_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_alias_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignof\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_attributes) -+"1" -+#else -+"0" -+#endif -+"cxx_attributes\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_attribute_deprecated\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_auto_type) -+"1" -+#else -+"0" -+#endif -+"cxx_auto_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_binary_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_binary_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_contextual_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_contextual_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_auto\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype_incomplete_return_types) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_incomplete_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_default_function_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_default_function_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_move_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_delegating_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_delegating_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_deleted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_deleted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_digit_separators\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_enum_forward_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_explicit_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_explicit_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extended_friend_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extern_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_final\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_func_identifier\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_generalized_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_generic_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_inheriting_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_inheriting_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_inline_namespaces\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_lambdas) -+"1" -+#else -+"0" -+#endif -+"cxx_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_init_captures) -+"1" -+#else -+"0" -+#endif -+"cxx_lambda_init_captures\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_local_type_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_local_type_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_long_long_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_noexcept) -+"1" -+#else -+"0" -+#endif -+"cxx_noexcept\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nonstatic_member_init) -+"1" -+#else -+"0" -+#endif -+"cxx_nonstatic_member_init\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nullptr) -+"1" -+#else -+"0" -+#endif -+"cxx_nullptr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_override\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_range_for) -+"1" -+#else -+"0" -+#endif -+"cxx_range_for\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_raw_string_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_raw_string_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_reference_qualified_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_reference_qualified_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_relaxed_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_relaxed_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_return_type_deduction) -+"1" -+#else -+"0" -+#endif -+"cxx_return_type_deduction\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_right_angle_brackets\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_rvalue_references) -+"1" -+#else -+"0" -+#endif -+"cxx_rvalue_references\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_sizeof_member\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_static_assert) -+"1" -+#else -+"0" -+#endif -+"cxx_static_assert\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_strong_enums) -+"1" -+#else -+"0" -+#endif -+"cxx_strong_enums\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 199711L -+"1" -+#else -+"0" -+#endif -+"cxx_template_template_parameters\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_thread_local) -+"1" -+#else -+"0" -+#endif -+"cxx_thread_local\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_trailing_return) -+"1" -+#else -+"0" -+#endif -+"cxx_trailing_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unicode_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_unicode_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_uniform_initialization\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unrestricted_unions) -+"1" -+#else -+"0" -+#endif -+"cxx_unrestricted_unions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_user_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_user_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variable_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variable_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_macros\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variadic_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_templates\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -new file mode 100644 -index 0000000..d1a6669 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -new file mode 100644 -index 0000000..cda9126 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build.json -new file mode 100644 -index 0000000..162934f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build.json -@@ -0,0 +1,42 @@ -+{ -+ "stringTable": {}, -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-arm64-v8a": { -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "buildType": "debug", -+ "abi": "arm64-v8a", -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/arm64-v8a/libnode.so" -+ ] -+ } -+ }, -+ "toolchains": {}, -+ "cFileExtensions": [], -+ "cppFileExtensions": [ -+ "cpp" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_arm64-v8a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_arm64-v8a.txt -new file mode 100644 -index 0000000..164f6cd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_arm64-v8a.txt -@@ -0,0 +1,7 @@ -+Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+arguments : -+-C -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+nodejs-mobile-react-native-native-lib -+jvmArgs : -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_mini.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_mini.json -new file mode 100644 -index 0000000..57a87f8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_mini.json -@@ -0,0 +1,35 @@ -+{ -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-arm64-v8a": { -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "abi": "arm64-v8a", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/arm64-v8a/libnode.so" -+ ] -+ } -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_arm64-v8a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_arm64-v8a.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_arm64-v8a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_arm64-v8a.txt -new file mode 100644 -index 0000000..690534c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_arm64-v8a.txt -@@ -0,0 +1,2 @@ -+ninja: Entering directory `/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a' -+ninja: no work to do. -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build.ninja -new file mode 100644 -index 0000000..833b79f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build.ninja -@@ -0,0 +1,134 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the build statements describing the -+# compilation DAG. -+ -+# ============================================================================= -+# Write statements declared in CMakeLists.txt: -+# -+# Which is the root file. -+# ============================================================================= -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+ -+############################################# -+# Minimal version of Ninja required by this file -+ -+ninja_required_version = 1.5 -+ -+# ============================================================================= -+# Include auxiliary files. -+ -+ -+############################################# -+# Include rules file. -+ -+include rules.ninja -+ -+ -+############################################# -+# Utility command for rebuild_cache -+ -+build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+ DESC = Running CMake to regenerate build system... -+ pool = console -+ restat = 1 -+build rebuild_cache: phony CMakeFiles/rebuild_cache.util -+ -+############################################# -+# Utility command for edit_cache -+ -+build CMakeFiles/edit_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -+ DESC = No interactive CMake dialog available... -+ restat = 1 -+build edit_cache: phony CMakeFiles/edit_cache.util -+# ============================================================================= -+# Object build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Order-only phony target for nodejs-mobile-react-native-native-lib -+ -+build cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib: phony -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/rn-bridge.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+ -+# ============================================================================= -+# Link build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Link the shared library ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -+ -+build ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so: CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o | ../../../../libnode/bin/arm64-v8a/libnode.so /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/21/liblog.so -+ LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -+ LINK_FLAGS = -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -+ LINK_LIBRARIES = ../../../../libnode/bin/arm64-v8a/libnode.so -llog -latomic -lm -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ POST_BUILD = : -+ PRE_LINK = : -+ SONAME = libnodejs-mobile-react-native-native-lib.so -+ SONAME_FLAG = -Wl,-soname, -+ TARGET_FILE = ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -+ TARGET_PDB = nodejs-mobile-react-native-native-lib.so.dbg -+# ============================================================================= -+# Target aliases. -+ -+build libnodejs-mobile-react-native-native-lib.so: phony ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -+build nodejs-mobile-react-native-native-lib: phony ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -+# ============================================================================= -+# Folder targets. -+ -+# ============================================================================= -+# ============================================================================= -+# Built-in targets -+ -+ -+############################################# -+# The main all target. -+ -+build all: phony ../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -+ -+############################################# -+# Make the all target the default. -+ -+default all -+ -+############################################# -+# Re-run CMake if any of its inputs changed. -+ -+build build.ninja: RERUN_CMAKE | ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx -+ pool = console -+ -+############################################# -+# A missing CMake input file is not an error. -+ -+build ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx: phony -+ -+############################################# -+# Clean all the built files. -+ -+build clean: CLEAN -+ -+############################################# -+# Print all primary targets available. -+ -+build help: HELP -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_command.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_command.txt -new file mode 100644 -index 0000000..3246162 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_command.txt -@@ -0,0 +1,24 @@ -+ Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+arguments : -+-H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+-DCMAKE_FIND_ROOT_PATH=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/arm64-v8a/prefab -+-DCMAKE_BUILD_TYPE=Debug -+-DCMAKE_TOOLCHAIN_FILE=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+-DANDROID_ABI=arm64-v8a -+-DANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DANDROID_PLATFORM=android-21 -+-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -+-DCMAKE_ANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -+-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a -+-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a -+-DCMAKE_MAKE_PROGRAM=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+-DCMAKE_SYSTEM_NAME=Android -+-DCMAKE_SYSTEM_VERSION=21 -+-B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+-GNinja -+jvmArgs : -+ -+ -+ Build command args: [] -+ Version: 1 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_file_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_file_index.txt -new file mode 100644 -index 0000000..baaf99c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_file_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_model.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_model.json -new file mode 100644 -index 0000000..a03bcd6 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/build_model.json -@@ -0,0 +1,216 @@ -+{ -+ "abi": "ARM64_V8A", -+ "info": { -+ "abi": "ARM64_V8A", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ "originalCxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "cxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "abiPlatformVersion": 21, -+ "cmake": { -+ "cmakeWrappingBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cxx/debug/arm64-v8a", -+ "cmakeArtifactsBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "effectiveConfiguration": { -+ "name": "traditional-android-studio-cmake-environment", -+ "description": "Composite reified CMakeSettings configuration", -+ "generator": "Ninja", -+ "inheritEnvironments": [ -+ "ndk" -+ ], -+ "buildRoot": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "cmakeToolchain": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeExecutable": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "variables": [ -+ { -+ "name": "CMAKE_FIND_ROOT_PATH", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/arm64-v8a/prefab" -+ }, -+ { -+ "name": "CMAKE_BUILD_TYPE", -+ "value": "Debug" -+ }, -+ { -+ "name": "CMAKE_TOOLCHAIN_FILE", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake" -+ }, -+ { -+ "name": "ANDROID_ABI", -+ "value": "arm64-v8a" -+ }, -+ { -+ "name": "ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "ANDROID_PLATFORM", -+ "value": "android-21" -+ }, -+ { -+ "name": "CMAKE_ANDROID_ARCH_ABI", -+ "value": "arm64-v8a" -+ }, -+ { -+ "name": "CMAKE_ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "CMAKE_EXPORT_COMPILE_COMMANDS", -+ "value": "ON" -+ }, -+ { -+ "name": "CMAKE_LIBRARY_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a" -+ }, -+ { -+ "name": "CMAKE_RUNTIME_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a" -+ }, -+ { -+ "name": "CMAKE_MAKE_PROGRAM", -+ "value": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_NAME", -+ "value": "Android" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_VERSION", -+ "value": "21" -+ } -+ ] -+ }, -+ "cmakeServerLogFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_server_log.txt" -+ }, -+ "variant": { -+ "buildSystemArgumentList": [], -+ "cFlagsList": [], -+ "cppFlagsList": [ -+ "" -+ ], -+ "variantName": "debug", -+ "objFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj", -+ "soFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/lib", -+ "isDebuggableEnabled": true, -+ "validAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "buildTargetSet": [], -+ "implicitBuildTargetSet": [], -+ "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", -+ "module": { -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx", -+ "splitsAbiFilterSet": [], -+ "intermediatesFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates", -+ "gradleModulePathName": ":nodejs-mobile-react-native", -+ "moduleRootFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "moduleBuildFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build.gradle", -+ "makeFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "buildSystem": "CMAKE", -+ "ndkFolder": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "ndkVersion": "21.4.7075529", -+ "ndkSupportedAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultStl": "LIBCXX_STATIC", -+ "ndkMetaPlatforms": { -+ "min": 16, -+ "max": 30, -+ "aliases": { -+ "20": 19, -+ "25": 24, -+ "J": 16, -+ "J-MR1": 17, -+ "J-MR2": 18, -+ "K": 19, -+ "L": 21, -+ "L-MR1": 22, -+ "M": 23, -+ "N": 24, -+ "N-MR1": 24, -+ "O": 26, -+ "O-MR1": 27, -+ "P": 28, -+ "Q": 29, -+ "R": 30 -+ } -+ }, -+ "ndkMetaAbiList": [ -+ { -+ "abi": "ARMEABI_V7A", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "ARM64_V8A", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86_64", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ } -+ ], -+ "originalCmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmake": { -+ "isValidCmakeAvailable": true, -+ "cmakeExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "minimumCmakeVersion": "3.10.2", -+ "ninjaExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "isPreferCmakeFileApiEnabled": true -+ }, -+ "stlSharedObjectMap": { -+ "LIBCXX_SHARED": { -+ "ARMEABI_V7A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", -+ "ARM64_V8A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", -+ "X86": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", -+ "X86_64": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" -+ }, -+ "LIBCXX_STATIC": {}, -+ "NONE": {}, -+ "SYSTEM": {} -+ }, -+ "project": { -+ "rootBuildGradleFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android", -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "compilerSettingsCacheFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "isNativeCompilerSettingsCacheEnabled": false, -+ "isBuildOnlyTargetAbiEnabled": true, -+ "isCmakeBuildCohabitationEnabled": false, -+ "isPrefabEnabled": false, -+ "isV2NativeModelEnabled": true -+ }, -+ "nativeBuildOutputLevel": "QUIET" -+ }, -+ "prefabDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab" -+ }, -+ "buildSettings": { -+ "environmentVariables": [] -+ }, -+ "prefabFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/arm64-v8a" -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_install.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_install.cmake -new file mode 100644 -index 0000000..8b02b89 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_install.cmake -@@ -0,0 +1,49 @@ -+# Install script for directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+# Set the install prefix -+if(NOT DEFINED CMAKE_INSTALL_PREFIX) -+ set(CMAKE_INSTALL_PREFIX "/usr/local") -+endif() -+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -+ -+# Set the install configuration name. -+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) -+ if(BUILD_TYPE) -+ string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" -+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") -+ else() -+ set(CMAKE_INSTALL_CONFIG_NAME "Debug") -+ endif() -+ message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -+endif() -+ -+# Set the component getting installed. -+if(NOT CMAKE_INSTALL_COMPONENT) -+ if(COMPONENT) -+ message(STATUS "Install component: \"${COMPONENT}\"") -+ set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") -+ else() -+ set(CMAKE_INSTALL_COMPONENT) -+ endif() -+endif() -+ -+# Install shared libraries without execute permission? -+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) -+ set(CMAKE_INSTALL_SO_NO_EXE "0") -+endif() -+ -+# Is this installation the result of a crosscompile? -+if(NOT DEFINED CMAKE_CROSSCOMPILING) -+ set(CMAKE_CROSSCOMPILING "TRUE") -+endif() -+ -+if(CMAKE_INSTALL_COMPONENT) -+ set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -+else() -+ set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -+endif() -+ -+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT -+ "${CMAKE_INSTALL_MANIFEST_FILES}") -+file(WRITE "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" -+ "${CMAKE_INSTALL_MANIFEST_CONTENT}") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_server_log.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_server_log.txt -new file mode 100644 -index 0000000..bc76e29 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/cmake_server_log.txt -@@ -0,0 +1,351 @@ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "handshake", -+ "cookie": "gradle-cmake-cookie", -+ "protocolVersion": { -+ "isExperimental": true, -+ "major": 1, -+ "minor": 1 -+ }, -+ "sourceDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "buildDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "generator": "Ninja" -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"gradle-cmake-cookie","inReplyTo":"handshake","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "configure", -+ "cacheArguments": [ -+ "", -+ "-DCMAKE_FIND_ROOT_PATH\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/arm64-v8a/prefab", -+ "-DCMAKE_BUILD_TYPE\u003dDebug", -+ "-DCMAKE_TOOLCHAIN_FILE\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "-DANDROID_ABI\u003darm64-v8a", -+ "-DANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DANDROID_PLATFORM\u003dandroid-21", -+ "-DCMAKE_ANDROID_ARCH_ABI\u003darm64-v8a", -+ "-DCMAKE_ANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", -+ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a", -+ "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a", -+ "-DCMAKE_MAKE_PROGRAM\u003d/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-DCMAKE_SYSTEM_NAME\u003dAndroid", -+ "-DCMAKE_SYSTEM_VERSION\u003d21" -+ ] -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":33,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":65,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":96,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":126,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":155,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":184,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":211,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":237,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":262,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":287,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":311,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Configuring done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Configuring done -+CMAKE SERVER: Configuring done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"compute"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Generating","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","message":"Generating done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Generating done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"cmakeInputs"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"buildFiles":[{"isCMake":true,"isTemporary":false,"sources":["/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in"]},{"isCMake":false,"isTemporary":false,"sources":["CMakeLists.txt","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake"]},{"isCMake":false,"isTemporary":true,"sources":[".cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeSystem.cmake",".cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/arm64-v8a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/arm64-v8a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake"]}],"cmakeRootDirectory":"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10","cookie":"","inReplyTo":"cmakeInputs","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"codemodel"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"configurations":[{"name":"Debug","projects":[{"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a","name":"Project","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","targets":[{"artifacts":["/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so"],"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a","fileGroups":[{"compileFlags":"-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC ","defines":["nodejs_mobile_react_native_native_lib_EXPORTS"],"includePath":[{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/include/node"},{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp"}],"isGenerated":false,"language":"CXX","sources":["src/main/cpp/native-lib.cpp","src/main/cpp/rn-bridge.cpp"]}],"fullName":"libnodejs-mobile-react-native-native-lib.so","linkFlags":"-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments","linkLibraries":"../../../../libnode/bin/arm64-v8a/libnode.so -llog -latomic -lm","linkerLanguage":"CXX","name":"nodejs-mobile-react-native-native-lib","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","sysroot":"/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot","type":"SHARED_LIBRARY"}]}]}],"cookie":"","inReplyTo":"codemodel","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json -new file mode 100644 -index 0000000..2e4764f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json -@@ -0,0 +1,13 @@ -+[ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp" -+}, -+ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp" -+} -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json.bin -new file mode 100644 -index 0000000..f2d05d3 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/compile_commands.json.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/json_generation_record.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/json_generation_record.json -new file mode 100644 -index 0000000..b714bd8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/json_generation_record.json -@@ -0,0 +1,23 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "Start JSON generation. Platform version: 21 min SDK version: arm64-v8a", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|arm64-v8a", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON \u0027/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/android_gradle_build.json\u0027 was up-to-date", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|arm64-v8a", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON generation completed without problems", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|arm64-v8a", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/prefab_config.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/prefab_config.json -new file mode 100644 -index 0000000..e799de8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/prefab_config.json -@@ -0,0 +1,4 @@ -+{ -+ "enabled": false, -+ "packages": [] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/rules.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/rules.ninja -new file mode 100644 -index 0000000..75422b0 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/rules.ninja -@@ -0,0 +1,64 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the rules used to get the outputs files -+# built from the input files. -+# It is included in the main 'build.ninja'. -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+# ============================================================================= -+ -+############################################# -+# Rule for running custom commands. -+ -+rule CUSTOM_COMMAND -+ command = $COMMAND -+ description = $DESC -+ -+ -+############################################# -+# Rule for compiling CXX files. -+ -+rule CXX_COMPILER__nodejs-mobile-react-native-native-lib -+ depfile = $DEP_FILE -+ deps = gcc -+ command = /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in -+ description = Building CXX object $out -+ -+ -+############################################# -+# Rule for linking CXX shared library. -+ -+rule CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib -+ command = $PRE_LINK && /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD -+ description = Linking CXX shared library $TARGET_FILE -+ restat = $RESTAT -+ -+ -+############################################# -+# Rule for re-running cmake. -+ -+rule RERUN_CMAKE -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a -+ description = Re-running CMake... -+ generator = 1 -+ -+ -+############################################# -+# Rule for cleaning all built files. -+ -+rule CLEAN -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t clean -+ description = Cleaning all built files... -+ -+ -+############################################# -+# Rule for printing all primary targets available. -+ -+rule HELP -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t targets -+ description = All primary targets available: -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/symbol_folder_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/symbol_folder_index.txt -new file mode 100644 -index 0000000..65ef0ad ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/arm64-v8a/symbol_folder_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_deps b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_deps -new file mode 100644 -index 0000000..b1392ca -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_deps differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_log -new file mode 100644 -index 0000000..0caa44e ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/.ninja_log -@@ -0,0 +1,4 @@ -+# ninja log v5 -+0 768 1636396587 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o 674dec5e180432b0 -+1 1032 1636396587 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o 8716af94f8707396 -+1032 1269 1636396587 ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so aca5b47ee48bf221 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeCache.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeCache.txt -new file mode 100644 -index 0000000..f740aac ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeCache.txt -@@ -0,0 +1,365 @@ -+# This is the CMakeCache file. -+# For build in directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+# It was generated by CMake: /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+# You can edit this file to change values found and used by cmake. -+# If you do not want to change any of the values, simply exit the editor. -+# If you do want to change a value, simply edit, save, and exit the editor. -+# The syntax for the file is as follows: -+# KEY:TYPE=VALUE -+# KEY is the name of a variable in the cache. -+# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -+# VALUE is the current value for the KEY. -+ -+######################## -+# EXTERNAL cache entries -+######################## -+ -+//No help, variable specified on the command line. -+ANDROID_ABI:UNINITIALIZED=armeabi-v7a -+ -+//No help, variable specified on the command line. -+ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//No help, variable specified on the command line. -+ANDROID_PLATFORM:UNINITIALIZED=android-21 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//Archiver -+CMAKE_AR:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar -+ -+//Flags used by the compiler during all build types. -+CMAKE_ASM_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_ASM_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds. -+CMAKE_ASM_FLAGS_RELEASE:STRING= -+ -+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -+CMAKE_BUILD_TYPE:STRING=Debug -+ -+//LLVM archiver -+CMAKE_CXX_COMPILER_AR:FILEPATH=CMAKE_CXX_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_CXX_COMPILER_RANLIB:FILEPATH=CMAKE_CXX_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_CXX_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_CXX_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_CXX_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C++ applications. -+CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//LLVM archiver -+CMAKE_C_COMPILER_AR:FILEPATH=CMAKE_C_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_C_COMPILER_RANLIB:FILEPATH=CMAKE_C_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_C_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_C_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_C_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C applications. -+CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//Flags used by the linker. -+CMAKE_EXE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Enable/Disable output of compile commands during generation. -+CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -+ -+//No help, variable specified on the command line. -+CMAKE_FIND_ROOT_PATH:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/armeabi-v7a/prefab -+ -+//Install path prefix, prepended onto install directories. -+CMAKE_INSTALL_PREFIX:PATH=/usr/local -+ -+//No help, variable specified on the command line. -+CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a -+ -+//Path to a program. -+CMAKE_LINKER:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ld -+ -+//No help, variable specified on the command line. -+CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+ -+//Flags used by the linker during the creation of modules. -+CMAKE_MODULE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_NM:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm -+ -+//Path to a program. -+CMAKE_OBJCOPY:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objcopy -+ -+//Path to a program. -+CMAKE_OBJDUMP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-objdump -+ -+//Value Computed by CMake -+CMAKE_PROJECT_NAME:STATIC=Project -+ -+//Ranlib -+CMAKE_RANLIB:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ranlib -+ -+//No help, variable specified on the command line. -+CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a -+ -+//Flags used by the linker during the creation of dll's. -+CMAKE_SHARED_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//If set, runtime paths are not added when installing shared libraries, -+// but are added when building. -+CMAKE_SKIP_INSTALL_RPATH:BOOL=NO -+ -+//If set, runtime paths are not added when using shared libraries. -+CMAKE_SKIP_RPATH:BOOL=NO -+ -+//Flags used by the linker during the creation of static libraries. -+CMAKE_STATIC_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_STRIP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-strip -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_NAME:UNINITIALIZED=Android -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 -+ -+//The CMake toolchain file -+CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+ -+//If this value is on, makefiles will be generated without the -+// .SILENT directive, and all commands will be echoed to the console -+// during the make. This is useful for debugging only. With Visual -+// Studio IDE projects all commands are done without /nologo. -+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE -+ -+//Value Computed by CMake -+Project_BINARY_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+ -+//Value Computed by CMake -+Project_SOURCE_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+//Path to a library. -+log-lib:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/liblog.so -+ -+//Dependencies for the target -+nodejs-mobile-react-native-native-lib_LIB_DEPENDS:STATIC=general;libnode;general;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/liblog.so; -+ -+ -+######################## -+# INTERNAL cache entries -+######################## -+ -+//ADVANCED property for variable: CMAKE_AR -+CMAKE_AR-ADVANCED:INTERNAL=1 -+//This is the directory where this CMakeCache.txt was created -+CMAKE_CACHEFILE_DIR:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+//Major version of cmake used to create the current loaded cache -+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -+//Minor version of cmake used to create the current loaded cache -+CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 -+//Patch version of cmake used to create the current loaded cache -+CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -+//Path to CMake executable. -+CMAKE_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+//Path to cpack program executable. -+CMAKE_CPACK_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cpack -+//Path to ctest program executable. -+CMAKE_CTEST_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ctest -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -+CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -+CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS -+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -+CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_AR -+CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -+CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS -+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -+CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -+CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -+//Name of external makefile project generator. -+CMAKE_EXTRA_GENERATOR:INTERNAL= -+//Name of generator. -+CMAKE_GENERATOR:INTERNAL=Ninja -+//Name of generator platform. -+CMAKE_GENERATOR_PLATFORM:INTERNAL= -+//Name of generator toolset. -+CMAKE_GENERATOR_TOOLSET:INTERNAL= -+//Source directory with the top level CMakeLists.txt file for this -+// project -+CMAKE_HOME_DIRECTORY:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+//Install .so files without execute permission. -+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -+//ADVANCED property for variable: CMAKE_LINKER -+CMAKE_LINKER-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_NM -+CMAKE_NM-ADVANCED:INTERNAL=1 -+//number of local generators -+CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJCOPY -+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJDUMP -+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -+//Platform information initialized -+CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_RANLIB -+CMAKE_RANLIB-ADVANCED:INTERNAL=1 -+//Path to CMake installation. -+CMAKE_ROOT:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -+CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_RPATH -+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -+CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -+CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -+CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STRIP -+CMAKE_STRIP-ADVANCED:INTERNAL=1 -+//uname command -+CMAKE_UNAME:INTERNAL=/usr/bin/uname -+//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCCompiler.cmake -new file mode 100644 -index 0000000..f60ef5d ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCCompiler.cmake -@@ -0,0 +1,73 @@ -+set(CMAKE_C_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") -+set(CMAKE_C_COMPILER_ARG1 "") -+set(CMAKE_C_COMPILER_ID "Clang") -+set(CMAKE_C_COMPILER_VERSION "9.0") -+set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_C_COMPILER_WRAPPER "") -+set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -+set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -+set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -+set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -+set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -+ -+set(CMAKE_C_PLATFORM_ID "") -+set(CMAKE_C_SIMULATE_ID "") -+set(CMAKE_C_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar") -+set(CMAKE_C_COMPILER_AR "CMAKE_C_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ranlib") -+set(CMAKE_C_COMPILER_RANLIB "CMAKE_C_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ld") -+set(CMAKE_COMPILER_IS_GNUCC ) -+set(CMAKE_C_COMPILER_LOADED 1) -+set(CMAKE_C_COMPILER_WORKS TRUE) -+set(CMAKE_C_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_C_COMPILER_ENV_VAR "CC") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_C_COMPILER_ID_RUN 1) -+set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -+set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_C_LINKER_PREFERENCE 10) -+ -+# Save compiler ABI information. -+set(CMAKE_C_SIZEOF_DATA_PTR "4") -+set(CMAKE_C_COMPILER_ABI "ELF") -+set(CMAKE_C_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_C_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_C_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_C_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;dl;c;gcc;dl") -+set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -new file mode 100644 -index 0000000..7f1bf0a ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -@@ -0,0 +1,75 @@ -+set(CMAKE_CXX_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") -+set(CMAKE_CXX_COMPILER_ARG1 "") -+set(CMAKE_CXX_COMPILER_ID "Clang") -+set(CMAKE_CXX_COMPILER_VERSION "9.0") -+set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_CXX_COMPILER_WRAPPER "") -+set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") -+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -+set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -+set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -+ -+set(CMAKE_CXX_PLATFORM_ID "") -+set(CMAKE_CXX_SIMULATE_ID "") -+set(CMAKE_CXX_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar") -+set(CMAKE_CXX_COMPILER_AR "CMAKE_CXX_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ranlib") -+set(CMAKE_CXX_COMPILER_RANLIB "CMAKE_CXX_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ld") -+set(CMAKE_COMPILER_IS_GNUCXX ) -+set(CMAKE_CXX_COMPILER_LOADED 1) -+set(CMAKE_CXX_COMPILER_WORKS TRUE) -+set(CMAKE_CXX_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_CXX_COMPILER_ID_RUN 1) -+set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -+set(CMAKE_CXX_LINKER_PREFERENCE 30) -+set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) -+ -+# Save compiler ABI information. -+set(CMAKE_CXX_SIZEOF_DATA_PTR "4") -+set(CMAKE_CXX_COMPILER_ABI "ELF") -+set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_CXX_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_CXX_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_CXX_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;gcc;dl;c;gcc;dl") -+set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin -new file mode 100755 -index 0000000..8de43c1 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin -new file mode 100755 -index 0000000..839f197 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeSystem.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeSystem.cmake -new file mode 100644 -index 0000000..36564bf ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeSystem.cmake -@@ -0,0 +1,15 @@ -+set(CMAKE_HOST_SYSTEM "Darwin-20.6.0") -+set(CMAKE_HOST_SYSTEM_NAME "Darwin") -+set(CMAKE_HOST_SYSTEM_VERSION "20.6.0") -+set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") -+ -+include("/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake") -+ -+set(CMAKE_SYSTEM "Android-1") -+set(CMAKE_SYSTEM_NAME "Android") -+set(CMAKE_SYSTEM_VERSION "1") -+set(CMAKE_SYSTEM_PROCESSOR "armv7-a") -+ -+set(CMAKE_CROSSCOMPILING "TRUE") -+ -+set(CMAKE_SYSTEM_LOADED 1) -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeOutput.log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeOutput.log -new file mode 100644 -index 0000000..70e9373 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeOutput.log -@@ -0,0 +1,542 @@ -+The target system is: Android - 1 - armv7-a -+The host system is: Darwin - 20.6.0 - x86_64 -+Determining if the C compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_6124f" -+[1/2] Building C object CMakeFiles/cmTC_6124f.dir/testCCompiler.c.o -+[2/2] Linking C executable cmTC_6124f -+ -+ -+Detecting C compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_95066" -+[1/2] Building C object CMakeFiles/cmTC_95066.dir/CMakeCCompilerABI.c.o -+[2/2] Linking C executable cmTC_95066 -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: armv7-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x -+Candidate multilib: thumb;@mthumb -+Candidate multilib: armv7-a;@march=armv7-a -+Candidate multilib: armv7-a/thumb;@march=armv7-a@mthumb -+Candidate multilib: .; -+Selected multilib: armv7-a/thumb;@march=armv7-a@mthumb -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --warn-shared-textrel -z now -z relro -X --hash-style=both --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o cmTC_95066 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --exclude-libs libunwind.a --no-undefined --gc-sections CMakeFiles/cmTC_95066.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o -+ -+ -+Parsed C implicit link information from above output: -+ link line regex: [^( *|.*[/\])(arm-linux-androideabi-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_95066"] -+ ignore line: [[1/2] Building C object CMakeFiles/cmTC_95066.dir/CMakeCCompilerABI.c.o] -+ ignore line: [[2/2] Linking C executable cmTC_95066] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: armv7-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x] -+ ignore line: [Candidate multilib: thumb] -+ ignore line: [@mthumb] -+ ignore line: [Candidate multilib: armv7-a] -+ ignore line: [@march=armv7-a] -+ ignore line: [Candidate multilib: armv7-a/thumb] -+ ignore line: [@march=armv7-a@mthumb] -+ ignore line: [Candidate multilib: .] -+ ignore line: [] -+ ignore line: [Selected multilib: armv7-a/thumb] -+ ignore line: [@march=armv7-a@mthumb] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --warn-shared-textrel -z now -z relro -X --hash-style=both --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o cmTC_95066 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --exclude-libs libunwind.a --no-undefined --gc-sections CMakeFiles/cmTC_95066.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [-EL] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [-X] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [armelf_linux_eabi] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_95066] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libunwind.a] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_95066.dir/CMakeCCompilerABI.c.o] ==> ignore -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting C [-std=c11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_e8b73" -+[1/2] Building C object CMakeFiles/cmTC_e8b73.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_e8b73 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:1c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c99] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_241d8" -+[1/2] Building C object CMakeFiles/cmTC_241d8.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_241d8 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c90] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_fb4d5" -+[1/2] Building C object CMakeFiles/cmTC_fb4d5.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_fb4d5 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:0c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:0c_variadic_macros -+Determining if the CXX compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_7ffb0" -+[1/2] Building CXX object CMakeFiles/cmTC_7ffb0.dir/testCXXCompiler.cxx.o -+[2/2] Linking CXX executable cmTC_7ffb0 -+ -+ -+Detecting CXX compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_274b0" -+[1/2] Building CXX object CMakeFiles/cmTC_274b0.dir/CMakeCXXCompilerABI.cpp.o -+[2/2] Linking CXX executable cmTC_274b0 -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: armv7-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x -+Candidate multilib: thumb;@mthumb -+Candidate multilib: armv7-a;@march=armv7-a -+Candidate multilib: armv7-a/thumb;@march=armv7-a@mthumb -+Candidate multilib: .; -+Selected multilib: armv7-a/thumb;@march=armv7-a@mthumb -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --warn-shared-textrel -z now -z relro -X --hash-style=both --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o cmTC_274b0 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --exclude-libs libunwind.a --no-undefined --gc-sections CMakeFiles/cmTC_274b0.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o -+ -+ -+Parsed CXX implicit link information from above output: -+ link line regex: [^( *|.*[/\])(arm-linux-androideabi-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_274b0"] -+ ignore line: [[1/2] Building CXX object CMakeFiles/cmTC_274b0.dir/CMakeCXXCompilerABI.cpp.o] -+ ignore line: [[2/2] Linking CXX executable cmTC_274b0] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: armv7-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x] -+ ignore line: [Candidate multilib: thumb] -+ ignore line: [@mthumb] -+ ignore line: [Candidate multilib: armv7-a] -+ ignore line: [@march=armv7-a] -+ ignore line: [Candidate multilib: armv7-a/thumb] -+ ignore line: [@march=armv7-a@mthumb] -+ ignore line: [Candidate multilib: .] -+ ignore line: [] -+ ignore line: [Selected multilib: armv7-a/thumb] -+ ignore line: [@march=armv7-a@mthumb] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack -EL --warn-shared-textrel -z now -z relro -X --hash-style=both --enable-new-dtags --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o cmTC_274b0 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --exclude-libs libunwind.a --no-undefined --gc-sections CMakeFiles/cmTC_274b0.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [-EL] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [-X] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [armelf_linux_eabi] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_274b0] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libunwind.a] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_274b0.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore -+ arg [-Bstatic] ==> ignore -+ arg [-lc++] ==> lib [c++] -+ arg [-Bdynamic] ==> ignore -+ arg [-lm] ==> lib [m] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/../../lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a/thumb] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [c++;m;gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/arm;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/arm-linux-androideabi/lib/armv7-a/thumb;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting CXX [-std=c++1z] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_fb183" -+[1/2] Building CXX object CMakeFiles/cmTC_fb183.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_fb183 -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++14] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_243fa" -+[1/2] Building CXX object CMakeFiles/cmTC_243fa.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_243fa -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_f9863" -+[1/2] Building CXX object CMakeFiles/cmTC_f9863.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_f9863 -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++98] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_1fdca" -+[1/2] Building CXX object CMakeFiles/cmTC_1fdca.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_1fdca -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:0cxx_alias_templates -+ Feature record: CXX_FEATURE:0cxx_alignas -+ Feature record: CXX_FEATURE:0cxx_alignof -+ Feature record: CXX_FEATURE:0cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:0cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:0cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:0cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:0cxx_default_function_template_args -+ Feature record: CXX_FEATURE:0cxx_defaulted_functions -+ Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:0cxx_delegating_constructors -+ Feature record: CXX_FEATURE:0cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:0cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:0cxx_explicit_conversions -+ Feature record: CXX_FEATURE:0cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:0cxx_extern_templates -+ Feature record: CXX_FEATURE:0cxx_final -+ Feature record: CXX_FEATURE:0cxx_func_identifier -+ Feature record: CXX_FEATURE:0cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:0cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:0cxx_inline_namespaces -+ Feature record: CXX_FEATURE:0cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:0cxx_local_type_template_args -+ Feature record: CXX_FEATURE:0cxx_long_long_type -+ Feature record: CXX_FEATURE:0cxx_noexcept -+ Feature record: CXX_FEATURE:0cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:0cxx_nullptr -+ Feature record: CXX_FEATURE:0cxx_override -+ Feature record: CXX_FEATURE:0cxx_range_for -+ Feature record: CXX_FEATURE:0cxx_raw_string_literals -+ Feature record: CXX_FEATURE:0cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:0cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:0cxx_rvalue_references -+ Feature record: CXX_FEATURE:0cxx_sizeof_member -+ Feature record: CXX_FEATURE:0cxx_static_assert -+ Feature record: CXX_FEATURE:0cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:0cxx_thread_local -+ Feature record: CXX_FEATURE:0cxx_trailing_return_types -+ Feature record: CXX_FEATURE:0cxx_unicode_literals -+ Feature record: CXX_FEATURE:0cxx_uniform_initialization -+ Feature record: CXX_FEATURE:0cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:0cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:0cxx_variadic_macros -+ Feature record: CXX_FEATURE:0cxx_variadic_templates -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/TargetDirectories.txt -new file mode 100644 -index 0000000..1e8814d ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/TargetDirectories.txt -@@ -0,0 +1,3 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/rebuild_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/edit_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/cmake.check_cache b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/cmake.check_cache -new file mode 100644 -index 0000000..3dccd73 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/cmake.check_cache -@@ -0,0 +1 @@ -+# This file is generated by cmake for dependency checking of the CMakeCache.txt file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.bin -new file mode 100755 -index 0000000..69fffcc -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c -new file mode 100644 -index 0000000..90a87b1 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c -@@ -0,0 +1,34 @@ -+ -+ const char features[] = {"\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 -+"1" -+#else -+"0" -+#endif -+"c_function_prototypes\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_restrict\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -+"1" -+#else -+"0" -+#endif -+"c_static_assert\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_variadic_macros\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx -new file mode 100644 -index 0000000..703b335 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx -@@ -0,0 +1,405 @@ -+ -+ const char features[] = {"\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_aggregate_nsdmi) -+"1" -+#else -+"0" -+#endif -+"cxx_aggregate_default_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alias_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_alias_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignof\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_attributes) -+"1" -+#else -+"0" -+#endif -+"cxx_attributes\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_attribute_deprecated\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_auto_type) -+"1" -+#else -+"0" -+#endif -+"cxx_auto_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_binary_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_binary_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_contextual_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_contextual_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_auto\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype_incomplete_return_types) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_incomplete_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_default_function_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_default_function_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_move_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_delegating_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_delegating_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_deleted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_deleted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_digit_separators\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_enum_forward_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_explicit_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_explicit_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extended_friend_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extern_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_final\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_func_identifier\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_generalized_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_generic_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_inheriting_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_inheriting_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_inline_namespaces\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_lambdas) -+"1" -+#else -+"0" -+#endif -+"cxx_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_init_captures) -+"1" -+#else -+"0" -+#endif -+"cxx_lambda_init_captures\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_local_type_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_local_type_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_long_long_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_noexcept) -+"1" -+#else -+"0" -+#endif -+"cxx_noexcept\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nonstatic_member_init) -+"1" -+#else -+"0" -+#endif -+"cxx_nonstatic_member_init\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nullptr) -+"1" -+#else -+"0" -+#endif -+"cxx_nullptr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_override\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_range_for) -+"1" -+#else -+"0" -+#endif -+"cxx_range_for\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_raw_string_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_raw_string_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_reference_qualified_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_reference_qualified_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_relaxed_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_relaxed_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_return_type_deduction) -+"1" -+#else -+"0" -+#endif -+"cxx_return_type_deduction\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_right_angle_brackets\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_rvalue_references) -+"1" -+#else -+"0" -+#endif -+"cxx_rvalue_references\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_sizeof_member\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_static_assert) -+"1" -+#else -+"0" -+#endif -+"cxx_static_assert\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_strong_enums) -+"1" -+#else -+"0" -+#endif -+"cxx_strong_enums\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 199711L -+"1" -+#else -+"0" -+#endif -+"cxx_template_template_parameters\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_thread_local) -+"1" -+#else -+"0" -+#endif -+"cxx_thread_local\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_trailing_return) -+"1" -+#else -+"0" -+#endif -+"cxx_trailing_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unicode_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_unicode_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_uniform_initialization\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unrestricted_unions) -+"1" -+#else -+"0" -+#endif -+"cxx_unrestricted_unions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_user_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_user_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variable_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variable_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_macros\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variadic_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_templates\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -new file mode 100644 -index 0000000..1f3d16b -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -new file mode 100644 -index 0000000..39bcebc -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build.json -new file mode 100644 -index 0000000..0123ebd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build.json -@@ -0,0 +1,42 @@ -+{ -+ "stringTable": {}, -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-armeabi-v7a": { -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "buildType": "debug", -+ "abi": "armeabi-v7a", -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/armeabi-v7a/libnode.so" -+ ] -+ } -+ }, -+ "toolchains": {}, -+ "cFileExtensions": [], -+ "cppFileExtensions": [ -+ "cpp" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt -new file mode 100644 -index 0000000..e7e6286 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_command_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt -@@ -0,0 +1,7 @@ -+Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+arguments : -+-C -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+nodejs-mobile-react-native-native-lib -+jvmArgs : -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_mini.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_mini.json -new file mode 100644 -index 0000000..3fd8005 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_mini.json -@@ -0,0 +1,35 @@ -+{ -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-armeabi-v7a": { -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "abi": "armeabi-v7a", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/armeabi-v7a/libnode.so" -+ ] -+ } -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt -new file mode 100644 -index 0000000..5bc4c31 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_armeabi-v7a.txt -@@ -0,0 +1,2 @@ -+ninja: Entering directory `/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a' -+ninja: no work to do. -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build.ninja -new file mode 100644 -index 0000000..20876d2 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build.ninja -@@ -0,0 +1,134 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the build statements describing the -+# compilation DAG. -+ -+# ============================================================================= -+# Write statements declared in CMakeLists.txt: -+# -+# Which is the root file. -+# ============================================================================= -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+ -+############################################# -+# Minimal version of Ninja required by this file -+ -+ninja_required_version = 1.5 -+ -+# ============================================================================= -+# Include auxiliary files. -+ -+ -+############################################# -+# Include rules file. -+ -+include rules.ninja -+ -+ -+############################################# -+# Utility command for rebuild_cache -+ -+build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+ DESC = Running CMake to regenerate build system... -+ pool = console -+ restat = 1 -+build rebuild_cache: phony CMakeFiles/rebuild_cache.util -+ -+############################################# -+# Utility command for edit_cache -+ -+build CMakeFiles/edit_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -+ DESC = No interactive CMake dialog available... -+ restat = 1 -+build edit_cache: phony CMakeFiles/edit_cache.util -+# ============================================================================= -+# Object build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Order-only phony target for nodejs-mobile-react-native-native-lib -+ -+build cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib: phony -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/rn-bridge.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+ -+# ============================================================================= -+# Link build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Link the shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -+ -+build ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so: CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o | ../../../../libnode/bin/armeabi-v7a/libnode.so /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/21/liblog.so -+ LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -+ LINK_FLAGS = -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -+ LINK_LIBRARIES = ../../../../libnode/bin/armeabi-v7a/libnode.so -llog -latomic -lm -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ POST_BUILD = : -+ PRE_LINK = : -+ SONAME = libnodejs-mobile-react-native-native-lib.so -+ SONAME_FLAG = -Wl,-soname, -+ TARGET_FILE = ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -+ TARGET_PDB = nodejs-mobile-react-native-native-lib.so.dbg -+# ============================================================================= -+# Target aliases. -+ -+build libnodejs-mobile-react-native-native-lib.so: phony ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -+build nodejs-mobile-react-native-native-lib: phony ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -+# ============================================================================= -+# Folder targets. -+ -+# ============================================================================= -+# ============================================================================= -+# Built-in targets -+ -+ -+############################################# -+# The main all target. -+ -+build all: phony ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -+ -+############################################# -+# Make the all target the default. -+ -+default all -+ -+############################################# -+# Re-run CMake if any of its inputs changed. -+ -+build build.ninja: RERUN_CMAKE | ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx -+ pool = console -+ -+############################################# -+# A missing CMake input file is not an error. -+ -+build ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx: phony -+ -+############################################# -+# Clean all the built files. -+ -+build clean: CLEAN -+ -+############################################# -+# Print all primary targets available. -+ -+build help: HELP -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_command.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_command.txt -new file mode 100644 -index 0000000..f8297d8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_command.txt -@@ -0,0 +1,24 @@ -+ Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+arguments : -+-H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+-DCMAKE_FIND_ROOT_PATH=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/armeabi-v7a/prefab -+-DCMAKE_BUILD_TYPE=Debug -+-DCMAKE_TOOLCHAIN_FILE=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+-DANDROID_ABI=armeabi-v7a -+-DANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DANDROID_PLATFORM=android-21 -+-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -+-DCMAKE_ANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -+-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a -+-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a -+-DCMAKE_MAKE_PROGRAM=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+-DCMAKE_SYSTEM_NAME=Android -+-DCMAKE_SYSTEM_VERSION=21 -+-B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+-GNinja -+jvmArgs : -+ -+ -+ Build command args: [] -+ Version: 1 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_file_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_file_index.txt -new file mode 100644 -index 0000000..baaf99c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_file_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_model.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_model.json -new file mode 100644 -index 0000000..9e586a8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/build_model.json -@@ -0,0 +1,216 @@ -+{ -+ "abi": "ARMEABI_V7A", -+ "info": { -+ "abi": "ARMEABI_V7A", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ "originalCxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "cxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "abiPlatformVersion": 21, -+ "cmake": { -+ "cmakeWrappingBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cxx/debug/armeabi-v7a", -+ "cmakeArtifactsBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "effectiveConfiguration": { -+ "name": "traditional-android-studio-cmake-environment", -+ "description": "Composite reified CMakeSettings configuration", -+ "generator": "Ninja", -+ "inheritEnvironments": [ -+ "ndk" -+ ], -+ "buildRoot": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "cmakeToolchain": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeExecutable": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "variables": [ -+ { -+ "name": "CMAKE_FIND_ROOT_PATH", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/armeabi-v7a/prefab" -+ }, -+ { -+ "name": "CMAKE_BUILD_TYPE", -+ "value": "Debug" -+ }, -+ { -+ "name": "CMAKE_TOOLCHAIN_FILE", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake" -+ }, -+ { -+ "name": "ANDROID_ABI", -+ "value": "armeabi-v7a" -+ }, -+ { -+ "name": "ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "ANDROID_PLATFORM", -+ "value": "android-21" -+ }, -+ { -+ "name": "CMAKE_ANDROID_ARCH_ABI", -+ "value": "armeabi-v7a" -+ }, -+ { -+ "name": "CMAKE_ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "CMAKE_EXPORT_COMPILE_COMMANDS", -+ "value": "ON" -+ }, -+ { -+ "name": "CMAKE_LIBRARY_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a" -+ }, -+ { -+ "name": "CMAKE_RUNTIME_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a" -+ }, -+ { -+ "name": "CMAKE_MAKE_PROGRAM", -+ "value": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_NAME", -+ "value": "Android" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_VERSION", -+ "value": "21" -+ } -+ ] -+ }, -+ "cmakeServerLogFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_server_log.txt" -+ }, -+ "variant": { -+ "buildSystemArgumentList": [], -+ "cFlagsList": [], -+ "cppFlagsList": [ -+ "" -+ ], -+ "variantName": "debug", -+ "objFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj", -+ "soFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/lib", -+ "isDebuggableEnabled": true, -+ "validAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "buildTargetSet": [], -+ "implicitBuildTargetSet": [], -+ "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", -+ "module": { -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx", -+ "splitsAbiFilterSet": [], -+ "intermediatesFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates", -+ "gradleModulePathName": ":nodejs-mobile-react-native", -+ "moduleRootFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "moduleBuildFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build.gradle", -+ "makeFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "buildSystem": "CMAKE", -+ "ndkFolder": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "ndkVersion": "21.4.7075529", -+ "ndkSupportedAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultStl": "LIBCXX_STATIC", -+ "ndkMetaPlatforms": { -+ "min": 16, -+ "max": 30, -+ "aliases": { -+ "20": 19, -+ "25": 24, -+ "J": 16, -+ "J-MR1": 17, -+ "J-MR2": 18, -+ "K": 19, -+ "L": 21, -+ "L-MR1": 22, -+ "M": 23, -+ "N": 24, -+ "N-MR1": 24, -+ "O": 26, -+ "O-MR1": 27, -+ "P": 28, -+ "Q": 29, -+ "R": 30 -+ } -+ }, -+ "ndkMetaAbiList": [ -+ { -+ "abi": "ARMEABI_V7A", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "ARM64_V8A", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86_64", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ } -+ ], -+ "originalCmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmake": { -+ "isValidCmakeAvailable": true, -+ "cmakeExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "minimumCmakeVersion": "3.10.2", -+ "ninjaExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "isPreferCmakeFileApiEnabled": true -+ }, -+ "stlSharedObjectMap": { -+ "LIBCXX_SHARED": { -+ "ARMEABI_V7A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", -+ "ARM64_V8A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", -+ "X86": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", -+ "X86_64": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" -+ }, -+ "LIBCXX_STATIC": {}, -+ "NONE": {}, -+ "SYSTEM": {} -+ }, -+ "project": { -+ "rootBuildGradleFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android", -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "compilerSettingsCacheFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "isNativeCompilerSettingsCacheEnabled": false, -+ "isBuildOnlyTargetAbiEnabled": true, -+ "isCmakeBuildCohabitationEnabled": false, -+ "isPrefabEnabled": false, -+ "isV2NativeModelEnabled": true -+ }, -+ "nativeBuildOutputLevel": "QUIET" -+ }, -+ "prefabDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab" -+ }, -+ "buildSettings": { -+ "environmentVariables": [] -+ }, -+ "prefabFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/armeabi-v7a" -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_install.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_install.cmake -new file mode 100644 -index 0000000..81c8162 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_install.cmake -@@ -0,0 +1,49 @@ -+# Install script for directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+# Set the install prefix -+if(NOT DEFINED CMAKE_INSTALL_PREFIX) -+ set(CMAKE_INSTALL_PREFIX "/usr/local") -+endif() -+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -+ -+# Set the install configuration name. -+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) -+ if(BUILD_TYPE) -+ string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" -+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") -+ else() -+ set(CMAKE_INSTALL_CONFIG_NAME "Debug") -+ endif() -+ message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -+endif() -+ -+# Set the component getting installed. -+if(NOT CMAKE_INSTALL_COMPONENT) -+ if(COMPONENT) -+ message(STATUS "Install component: \"${COMPONENT}\"") -+ set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") -+ else() -+ set(CMAKE_INSTALL_COMPONENT) -+ endif() -+endif() -+ -+# Install shared libraries without execute permission? -+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) -+ set(CMAKE_INSTALL_SO_NO_EXE "0") -+endif() -+ -+# Is this installation the result of a crosscompile? -+if(NOT DEFINED CMAKE_CROSSCOMPILING) -+ set(CMAKE_CROSSCOMPILING "TRUE") -+endif() -+ -+if(CMAKE_INSTALL_COMPONENT) -+ set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -+else() -+ set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -+endif() -+ -+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT -+ "${CMAKE_INSTALL_MANIFEST_FILES}") -+file(WRITE "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" -+ "${CMAKE_INSTALL_MANIFEST_CONTENT}") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_server_log.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_server_log.txt -new file mode 100644 -index 0000000..71bdf63 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/cmake_server_log.txt -@@ -0,0 +1,351 @@ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "handshake", -+ "cookie": "gradle-cmake-cookie", -+ "protocolVersion": { -+ "isExperimental": true, -+ "major": 1, -+ "minor": 1 -+ }, -+ "sourceDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "buildDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "generator": "Ninja" -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"gradle-cmake-cookie","inReplyTo":"handshake","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "configure", -+ "cacheArguments": [ -+ "", -+ "-DCMAKE_FIND_ROOT_PATH\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/armeabi-v7a/prefab", -+ "-DCMAKE_BUILD_TYPE\u003dDebug", -+ "-DCMAKE_TOOLCHAIN_FILE\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "-DANDROID_ABI\u003darmeabi-v7a", -+ "-DANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DANDROID_PLATFORM\u003dandroid-21", -+ "-DCMAKE_ANDROID_ARCH_ABI\u003darmeabi-v7a", -+ "-DCMAKE_ANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", -+ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a", -+ "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a", -+ "-DCMAKE_MAKE_PROGRAM\u003d/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-DCMAKE_SYSTEM_NAME\u003dAndroid", -+ "-DCMAKE_SYSTEM_VERSION\u003d21" -+ ] -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":33,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":65,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":96,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":126,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":155,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":184,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":211,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":237,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":262,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":287,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":311,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Configuring done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Configuring done -+CMAKE SERVER: Configuring done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"compute"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Generating","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","message":"Generating done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Generating done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"cmakeInputs"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"buildFiles":[{"isCMake":true,"isTemporary":false,"sources":["/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in"]},{"isCMake":false,"isTemporary":false,"sources":["CMakeLists.txt","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake"]},{"isCMake":false,"isTemporary":true,"sources":[".cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeSystem.cmake",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.c",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/armeabi-v7a/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake"]}],"cmakeRootDirectory":"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10","cookie":"","inReplyTo":"cmakeInputs","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"codemodel"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"configurations":[{"name":"Debug","projects":[{"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a","name":"Project","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","targets":[{"artifacts":["/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so"],"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a","fileGroups":[{"compileFlags":"-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC ","defines":["nodejs_mobile_react_native_native_lib_EXPORTS"],"includePath":[{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/include/node"},{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp"}],"isGenerated":false,"language":"CXX","sources":["src/main/cpp/native-lib.cpp","src/main/cpp/rn-bridge.cpp"]}],"fullName":"libnodejs-mobile-react-native-native-lib.so","linkFlags":"-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments","linkLibraries":"../../../../libnode/bin/armeabi-v7a/libnode.so -llog -latomic -lm","linkerLanguage":"CXX","name":"nodejs-mobile-react-native-native-lib","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","sysroot":"/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot","type":"SHARED_LIBRARY"}]}]}],"cookie":"","inReplyTo":"codemodel","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json -new file mode 100644 -index 0000000..2829efb ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json -@@ -0,0 +1,13 @@ -+[ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp" -+}, -+ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp" -+} -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json.bin -new file mode 100644 -index 0000000..be7b9e4 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/compile_commands.json.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/json_generation_record.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/json_generation_record.json -new file mode 100644 -index 0000000..bcb0016 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/json_generation_record.json -@@ -0,0 +1,23 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "Start JSON generation. Platform version: 21 min SDK version: armeabi-v7a", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|armeabi-v7a", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON \u0027/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/android_gradle_build.json\u0027 was up-to-date", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|armeabi-v7a", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON generation completed without problems", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|armeabi-v7a", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/prefab_config.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/prefab_config.json -new file mode 100644 -index 0000000..e799de8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/prefab_config.json -@@ -0,0 +1,4 @@ -+{ -+ "enabled": false, -+ "packages": [] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/rules.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/rules.ninja -new file mode 100644 -index 0000000..8154c00 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/rules.ninja -@@ -0,0 +1,64 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the rules used to get the outputs files -+# built from the input files. -+# It is included in the main 'build.ninja'. -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+# ============================================================================= -+ -+############################################# -+# Rule for running custom commands. -+ -+rule CUSTOM_COMMAND -+ command = $COMMAND -+ description = $DESC -+ -+ -+############################################# -+# Rule for compiling CXX files. -+ -+rule CXX_COMPILER__nodejs-mobile-react-native-native-lib -+ depfile = $DEP_FILE -+ deps = gcc -+ command = /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in -+ description = Building CXX object $out -+ -+ -+############################################# -+# Rule for linking CXX shared library. -+ -+rule CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib -+ command = $PRE_LINK && /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD -+ description = Linking CXX shared library $TARGET_FILE -+ restat = $RESTAT -+ -+ -+############################################# -+# Rule for re-running cmake. -+ -+rule RERUN_CMAKE -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a -+ description = Re-running CMake... -+ generator = 1 -+ -+ -+############################################# -+# Rule for cleaning all built files. -+ -+rule CLEAN -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t clean -+ description = Cleaning all built files... -+ -+ -+############################################# -+# Rule for printing all primary targets available. -+ -+rule HELP -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t targets -+ description = All primary targets available: -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/symbol_folder_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/symbol_folder_index.txt -new file mode 100644 -index 0000000..4e3f783 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/armeabi-v7a/symbol_folder_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_deps b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_deps -new file mode 100644 -index 0000000..2c4672a -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_deps differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_log -new file mode 100644 -index 0000000..30da31d ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/.ninja_log -@@ -0,0 +1,4 @@ -+# ninja log v5 -+0 537 1636396589 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o 7f79d0948d04b3fd -+0 811 1636396589 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o 32f34d458e611c8f -+812 1018 1636396589 ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so b4edb793770aa8f9 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeCache.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeCache.txt -new file mode 100644 -index 0000000..203dbeb ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeCache.txt -@@ -0,0 +1,365 @@ -+# This is the CMakeCache file. -+# For build in directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+# It was generated by CMake: /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+# You can edit this file to change values found and used by cmake. -+# If you do not want to change any of the values, simply exit the editor. -+# If you do want to change a value, simply edit, save, and exit the editor. -+# The syntax for the file is as follows: -+# KEY:TYPE=VALUE -+# KEY is the name of a variable in the cache. -+# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -+# VALUE is the current value for the KEY. -+ -+######################## -+# EXTERNAL cache entries -+######################## -+ -+//No help, variable specified on the command line. -+ANDROID_ABI:UNINITIALIZED=x86 -+ -+//No help, variable specified on the command line. -+ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//No help, variable specified on the command line. -+ANDROID_PLATFORM:UNINITIALIZED=android-21 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//Archiver -+CMAKE_AR:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ar -+ -+//Flags used by the compiler during all build types. -+CMAKE_ASM_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_ASM_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds. -+CMAKE_ASM_FLAGS_RELEASE:STRING= -+ -+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -+CMAKE_BUILD_TYPE:STRING=Debug -+ -+//LLVM archiver -+CMAKE_CXX_COMPILER_AR:FILEPATH=CMAKE_CXX_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_CXX_COMPILER_RANLIB:FILEPATH=CMAKE_CXX_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_CXX_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_CXX_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_CXX_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C++ applications. -+CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//LLVM archiver -+CMAKE_C_COMPILER_AR:FILEPATH=CMAKE_C_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_C_COMPILER_RANLIB:FILEPATH=CMAKE_C_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_C_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_C_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_C_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C applications. -+CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//Flags used by the linker. -+CMAKE_EXE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Enable/Disable output of compile commands during generation. -+CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -+ -+//No help, variable specified on the command line. -+CMAKE_FIND_ROOT_PATH:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86/prefab -+ -+//Install path prefix, prepended onto install directories. -+CMAKE_INSTALL_PREFIX:PATH=/usr/local -+ -+//No help, variable specified on the command line. -+CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86 -+ -+//Path to a program. -+CMAKE_LINKER:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ld -+ -+//No help, variable specified on the command line. -+CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+ -+//Flags used by the linker during the creation of modules. -+CMAKE_MODULE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_NM:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-nm -+ -+//Path to a program. -+CMAKE_OBJCOPY:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-objcopy -+ -+//Path to a program. -+CMAKE_OBJDUMP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-objdump -+ -+//Value Computed by CMake -+CMAKE_PROJECT_NAME:STATIC=Project -+ -+//Ranlib -+CMAKE_RANLIB:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ranlib -+ -+//No help, variable specified on the command line. -+CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86 -+ -+//Flags used by the linker during the creation of dll's. -+CMAKE_SHARED_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//If set, runtime paths are not added when installing shared libraries, -+// but are added when building. -+CMAKE_SKIP_INSTALL_RPATH:BOOL=NO -+ -+//If set, runtime paths are not added when using shared libraries. -+CMAKE_SKIP_RPATH:BOOL=NO -+ -+//Flags used by the linker during the creation of static libraries. -+CMAKE_STATIC_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_STRIP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-strip -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_NAME:UNINITIALIZED=Android -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 -+ -+//The CMake toolchain file -+CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+ -+//If this value is on, makefiles will be generated without the -+// .SILENT directive, and all commands will be echoed to the console -+// during the make. This is useful for debugging only. With Visual -+// Studio IDE projects all commands are done without /nologo. -+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE -+ -+//Value Computed by CMake -+Project_BINARY_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+ -+//Value Computed by CMake -+Project_SOURCE_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+//Path to a library. -+log-lib:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/liblog.so -+ -+//Dependencies for the target -+nodejs-mobile-react-native-native-lib_LIB_DEPENDS:STATIC=general;libnode;general;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/liblog.so; -+ -+ -+######################## -+# INTERNAL cache entries -+######################## -+ -+//ADVANCED property for variable: CMAKE_AR -+CMAKE_AR-ADVANCED:INTERNAL=1 -+//This is the directory where this CMakeCache.txt was created -+CMAKE_CACHEFILE_DIR:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+//Major version of cmake used to create the current loaded cache -+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -+//Minor version of cmake used to create the current loaded cache -+CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 -+//Patch version of cmake used to create the current loaded cache -+CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -+//Path to CMake executable. -+CMAKE_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+//Path to cpack program executable. -+CMAKE_CPACK_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cpack -+//Path to ctest program executable. -+CMAKE_CTEST_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ctest -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -+CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -+CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS -+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -+CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_AR -+CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -+CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS -+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -+CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -+CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -+//Name of external makefile project generator. -+CMAKE_EXTRA_GENERATOR:INTERNAL= -+//Name of generator. -+CMAKE_GENERATOR:INTERNAL=Ninja -+//Name of generator platform. -+CMAKE_GENERATOR_PLATFORM:INTERNAL= -+//Name of generator toolset. -+CMAKE_GENERATOR_TOOLSET:INTERNAL= -+//Source directory with the top level CMakeLists.txt file for this -+// project -+CMAKE_HOME_DIRECTORY:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+//Install .so files without execute permission. -+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -+//ADVANCED property for variable: CMAKE_LINKER -+CMAKE_LINKER-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_NM -+CMAKE_NM-ADVANCED:INTERNAL=1 -+//number of local generators -+CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJCOPY -+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJDUMP -+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -+//Platform information initialized -+CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_RANLIB -+CMAKE_RANLIB-ADVANCED:INTERNAL=1 -+//Path to CMake installation. -+CMAKE_ROOT:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -+CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_RPATH -+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -+CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -+CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -+CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STRIP -+CMAKE_STRIP-ADVANCED:INTERNAL=1 -+//uname command -+CMAKE_UNAME:INTERNAL=/usr/bin/uname -+//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCCompiler.cmake -new file mode 100644 -index 0000000..a3c2439 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCCompiler.cmake -@@ -0,0 +1,73 @@ -+set(CMAKE_C_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") -+set(CMAKE_C_COMPILER_ARG1 "") -+set(CMAKE_C_COMPILER_ID "Clang") -+set(CMAKE_C_COMPILER_VERSION "9.0") -+set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_C_COMPILER_WRAPPER "") -+set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -+set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -+set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -+set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -+set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -+ -+set(CMAKE_C_PLATFORM_ID "") -+set(CMAKE_C_SIMULATE_ID "") -+set(CMAKE_C_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ar") -+set(CMAKE_C_COMPILER_AR "CMAKE_C_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ranlib") -+set(CMAKE_C_COMPILER_RANLIB "CMAKE_C_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCC ) -+set(CMAKE_C_COMPILER_LOADED 1) -+set(CMAKE_C_COMPILER_WORKS TRUE) -+set(CMAKE_C_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_C_COMPILER_ENV_VAR "CC") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_C_COMPILER_ID_RUN 1) -+set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -+set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_C_LINKER_PREFERENCE 10) -+ -+# Save compiler ABI information. -+set(CMAKE_C_SIZEOF_DATA_PTR "4") -+set(CMAKE_C_COMPILER_ABI "ELF") -+set(CMAKE_C_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_C_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_C_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_C_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;dl;c;gcc;dl") -+set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -new file mode 100644 -index 0000000..e5cde15 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -@@ -0,0 +1,75 @@ -+set(CMAKE_CXX_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") -+set(CMAKE_CXX_COMPILER_ARG1 "") -+set(CMAKE_CXX_COMPILER_ID "Clang") -+set(CMAKE_CXX_COMPILER_VERSION "9.0") -+set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_CXX_COMPILER_WRAPPER "") -+set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") -+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -+set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -+set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -+ -+set(CMAKE_CXX_PLATFORM_ID "") -+set(CMAKE_CXX_SIMULATE_ID "") -+set(CMAKE_CXX_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ar") -+set(CMAKE_CXX_COMPILER_AR "CMAKE_CXX_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ranlib") -+set(CMAKE_CXX_COMPILER_RANLIB "CMAKE_CXX_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/i686-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCXX ) -+set(CMAKE_CXX_COMPILER_LOADED 1) -+set(CMAKE_CXX_COMPILER_WORKS TRUE) -+set(CMAKE_CXX_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_CXX_COMPILER_ID_RUN 1) -+set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -+set(CMAKE_CXX_LINKER_PREFERENCE 30) -+set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) -+ -+# Save compiler ABI information. -+set(CMAKE_CXX_SIZEOF_DATA_PTR "4") -+set(CMAKE_CXX_COMPILER_ABI "ELF") -+set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_CXX_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_CXX_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_CXX_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;gcc;dl;c;gcc;dl") -+set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin -new file mode 100755 -index 0000000..b2529f8 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin -new file mode 100755 -index 0000000..a2bd955 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeSystem.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeSystem.cmake -new file mode 100644 -index 0000000..8e83d69 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeSystem.cmake -@@ -0,0 +1,15 @@ -+set(CMAKE_HOST_SYSTEM "Darwin-20.6.0") -+set(CMAKE_HOST_SYSTEM_NAME "Darwin") -+set(CMAKE_HOST_SYSTEM_VERSION "20.6.0") -+set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") -+ -+include("/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake") -+ -+set(CMAKE_SYSTEM "Android-1") -+set(CMAKE_SYSTEM_NAME "Android") -+set(CMAKE_SYSTEM_VERSION "1") -+set(CMAKE_SYSTEM_PROCESSOR "i686") -+ -+set(CMAKE_CROSSCOMPILING "TRUE") -+ -+set(CMAKE_SYSTEM_LOADED 1) -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeOutput.log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeOutput.log -new file mode 100644 -index 0000000..dcecbf3 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeOutput.log -@@ -0,0 +1,508 @@ -+The target system is: Android - 1 - i686 -+The host system is: Darwin - 20.6.0 - x86_64 -+Determining if the C compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_80351" -+[1/2] Building C object CMakeFiles/cmTC_80351.dir/testCCompiler.c.o -+[2/2] Linking C executable cmTC_80351 -+ -+ -+Detecting C compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_87e3b" -+[1/2] Building C object CMakeFiles/cmTC_87e3b.dir/CMakeCCompilerABI.c.o -+[2/2] Linking C executable cmTC_87e3b -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: i686-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Candidate multilib: .;@m32 -+Selected multilib: .;@m32 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_i386 -dynamic-linker /system/bin/linker -o cmTC_87e3b /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_87e3b.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o -+ -+ -+Parsed C implicit link information from above output: -+ link line regex: [^( *|.*[/\])(i686-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_87e3b"] -+ ignore line: [[1/2] Building C object CMakeFiles/cmTC_87e3b.dir/CMakeCCompilerABI.c.o] -+ ignore line: [[2/2] Linking C executable cmTC_87e3b] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: i686-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m32] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m32] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_i386 -dynamic-linker /system/bin/linker -o cmTC_87e3b /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_87e3b.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [elf_i386] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_87e3b] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_87e3b.dir/CMakeCCompilerABI.c.o] ==> ignore -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting C [-std=c11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_a62c3" -+[1/2] Building C object CMakeFiles/cmTC_a62c3.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_a62c3 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:1c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c99] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_d2bdf" -+[1/2] Building C object CMakeFiles/cmTC_d2bdf.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_d2bdf -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c90] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_9b8e5" -+[1/2] Building C object CMakeFiles/cmTC_9b8e5.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_9b8e5 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:0c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:0c_variadic_macros -+Determining if the CXX compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_b53e6" -+[1/2] Building CXX object CMakeFiles/cmTC_b53e6.dir/testCXXCompiler.cxx.o -+[2/2] Linking CXX executable cmTC_b53e6 -+ -+ -+Detecting CXX compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_d507a" -+[1/2] Building CXX object CMakeFiles/cmTC_d507a.dir/CMakeCXXCompilerABI.cpp.o -+[2/2] Linking CXX executable cmTC_d507a -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: i686-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Candidate multilib: .;@m32 -+Selected multilib: .;@m32 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_i386 -dynamic-linker /system/bin/linker -o cmTC_d507a /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_d507a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o -+ -+ -+Parsed CXX implicit link information from above output: -+ link line regex: [^( *|.*[/\])(i686-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_d507a"] -+ ignore line: [[1/2] Building CXX object CMakeFiles/cmTC_d507a.dir/CMakeCXXCompilerABI.cpp.o] -+ ignore line: [[2/2] Linking CXX executable cmTC_d507a] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: i686-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m32] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m32] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_i386 -dynamic-linker /system/bin/linker -o cmTC_d507a /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_d507a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [elf_i386] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_d507a] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_d507a.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore -+ arg [-Bstatic] ==> ignore -+ arg [-lc++] ==> lib [c++] -+ arg [-Bdynamic] ==> ignore -+ arg [-lm] ==> lib [m] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [c++;m;gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/i386;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/i686-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting CXX [-std=c++1z] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_20704" -+[1/2] Building CXX object CMakeFiles/cmTC_20704.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_20704 -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++14] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_9cda8" -+[1/2] Building CXX object CMakeFiles/cmTC_9cda8.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_9cda8 -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_ffc72" -+[1/2] Building CXX object CMakeFiles/cmTC_ffc72.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_ffc72 -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++98] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_449ab" -+[1/2] Building CXX object CMakeFiles/cmTC_449ab.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_449ab -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:0cxx_alias_templates -+ Feature record: CXX_FEATURE:0cxx_alignas -+ Feature record: CXX_FEATURE:0cxx_alignof -+ Feature record: CXX_FEATURE:0cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:0cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:0cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:0cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:0cxx_default_function_template_args -+ Feature record: CXX_FEATURE:0cxx_defaulted_functions -+ Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:0cxx_delegating_constructors -+ Feature record: CXX_FEATURE:0cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:0cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:0cxx_explicit_conversions -+ Feature record: CXX_FEATURE:0cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:0cxx_extern_templates -+ Feature record: CXX_FEATURE:0cxx_final -+ Feature record: CXX_FEATURE:0cxx_func_identifier -+ Feature record: CXX_FEATURE:0cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:0cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:0cxx_inline_namespaces -+ Feature record: CXX_FEATURE:0cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:0cxx_local_type_template_args -+ Feature record: CXX_FEATURE:0cxx_long_long_type -+ Feature record: CXX_FEATURE:0cxx_noexcept -+ Feature record: CXX_FEATURE:0cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:0cxx_nullptr -+ Feature record: CXX_FEATURE:0cxx_override -+ Feature record: CXX_FEATURE:0cxx_range_for -+ Feature record: CXX_FEATURE:0cxx_raw_string_literals -+ Feature record: CXX_FEATURE:0cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:0cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:0cxx_rvalue_references -+ Feature record: CXX_FEATURE:0cxx_sizeof_member -+ Feature record: CXX_FEATURE:0cxx_static_assert -+ Feature record: CXX_FEATURE:0cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:0cxx_thread_local -+ Feature record: CXX_FEATURE:0cxx_trailing_return_types -+ Feature record: CXX_FEATURE:0cxx_unicode_literals -+ Feature record: CXX_FEATURE:0cxx_uniform_initialization -+ Feature record: CXX_FEATURE:0cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:0cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:0cxx_variadic_macros -+ Feature record: CXX_FEATURE:0cxx_variadic_templates -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/TargetDirectories.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/TargetDirectories.txt -new file mode 100644 -index 0000000..50333bc ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/TargetDirectories.txt -@@ -0,0 +1,3 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/rebuild_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/edit_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/cmake.check_cache b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/cmake.check_cache -new file mode 100644 -index 0000000..3dccd73 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/cmake.check_cache -@@ -0,0 +1 @@ -+# This file is generated by cmake for dependency checking of the CMakeCache.txt file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.bin -new file mode 100755 -index 0000000..51d0f7a -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.c b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.c -new file mode 100644 -index 0000000..90a87b1 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.c -@@ -0,0 +1,34 @@ -+ -+ const char features[] = {"\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 -+"1" -+#else -+"0" -+#endif -+"c_function_prototypes\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_restrict\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -+"1" -+#else -+"0" -+#endif -+"c_static_assert\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_variadic_macros\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx -new file mode 100644 -index 0000000..703b335 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx -@@ -0,0 +1,405 @@ -+ -+ const char features[] = {"\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_aggregate_nsdmi) -+"1" -+#else -+"0" -+#endif -+"cxx_aggregate_default_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alias_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_alias_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignof\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_attributes) -+"1" -+#else -+"0" -+#endif -+"cxx_attributes\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_attribute_deprecated\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_auto_type) -+"1" -+#else -+"0" -+#endif -+"cxx_auto_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_binary_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_binary_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_contextual_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_contextual_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_auto\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype_incomplete_return_types) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_incomplete_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_default_function_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_default_function_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_move_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_delegating_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_delegating_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_deleted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_deleted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_digit_separators\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_enum_forward_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_explicit_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_explicit_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extended_friend_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extern_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_final\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_func_identifier\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_generalized_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_generic_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_inheriting_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_inheriting_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_inline_namespaces\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_lambdas) -+"1" -+#else -+"0" -+#endif -+"cxx_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_init_captures) -+"1" -+#else -+"0" -+#endif -+"cxx_lambda_init_captures\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_local_type_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_local_type_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_long_long_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_noexcept) -+"1" -+#else -+"0" -+#endif -+"cxx_noexcept\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nonstatic_member_init) -+"1" -+#else -+"0" -+#endif -+"cxx_nonstatic_member_init\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nullptr) -+"1" -+#else -+"0" -+#endif -+"cxx_nullptr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_override\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_range_for) -+"1" -+#else -+"0" -+#endif -+"cxx_range_for\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_raw_string_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_raw_string_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_reference_qualified_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_reference_qualified_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_relaxed_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_relaxed_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_return_type_deduction) -+"1" -+#else -+"0" -+#endif -+"cxx_return_type_deduction\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_right_angle_brackets\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_rvalue_references) -+"1" -+#else -+"0" -+#endif -+"cxx_rvalue_references\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_sizeof_member\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_static_assert) -+"1" -+#else -+"0" -+#endif -+"cxx_static_assert\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_strong_enums) -+"1" -+#else -+"0" -+#endif -+"cxx_strong_enums\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 199711L -+"1" -+#else -+"0" -+#endif -+"cxx_template_template_parameters\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_thread_local) -+"1" -+#else -+"0" -+#endif -+"cxx_thread_local\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_trailing_return) -+"1" -+#else -+"0" -+#endif -+"cxx_trailing_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unicode_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_unicode_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_uniform_initialization\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unrestricted_unions) -+"1" -+#else -+"0" -+#endif -+"cxx_unrestricted_unions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_user_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_user_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variable_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variable_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_macros\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variadic_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_templates\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -new file mode 100644 -index 0000000..341e1a1 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -new file mode 100644 -index 0000000..3057065 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build.json -new file mode 100644 -index 0000000..24a6cf7 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build.json -@@ -0,0 +1,42 @@ -+{ -+ "stringTable": {}, -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-x86": { -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "buildType": "debug", -+ "abi": "x86", -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/x86/libnode.so" -+ ] -+ } -+ }, -+ "toolchains": {}, -+ "cFileExtensions": [], -+ "cppFileExtensions": [ -+ "cpp" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86.txt -new file mode 100644 -index 0000000..2145806 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86.txt -@@ -0,0 +1,7 @@ -+Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+arguments : -+-C -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+nodejs-mobile-react-native-native-lib -+jvmArgs : -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_mini.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_mini.json -new file mode 100644 -index 0000000..5aee7b2 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_mini.json -@@ -0,0 +1,35 @@ -+{ -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-x86": { -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "abi": "x86", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/x86/libnode.so" -+ ] -+ } -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_x86.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_x86.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86.txt -new file mode 100644 -index 0000000..4e1dd69 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86.txt -@@ -0,0 +1,2 @@ -+ninja: Entering directory `/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86' -+ninja: no work to do. -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build.ninja -new file mode 100644 -index 0000000..92c3d14 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build.ninja -@@ -0,0 +1,134 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the build statements describing the -+# compilation DAG. -+ -+# ============================================================================= -+# Write statements declared in CMakeLists.txt: -+# -+# Which is the root file. -+# ============================================================================= -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+ -+############################################# -+# Minimal version of Ninja required by this file -+ -+ninja_required_version = 1.5 -+ -+# ============================================================================= -+# Include auxiliary files. -+ -+ -+############################################# -+# Include rules file. -+ -+include rules.ninja -+ -+ -+############################################# -+# Utility command for rebuild_cache -+ -+build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+ DESC = Running CMake to regenerate build system... -+ pool = console -+ restat = 1 -+build rebuild_cache: phony CMakeFiles/rebuild_cache.util -+ -+############################################# -+# Utility command for edit_cache -+ -+build CMakeFiles/edit_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -+ DESC = No interactive CMake dialog available... -+ restat = 1 -+build edit_cache: phony CMakeFiles/edit_cache.util -+# ============================================================================= -+# Object build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Order-only phony target for nodejs-mobile-react-native-native-lib -+ -+build cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib: phony -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/rn-bridge.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+ -+# ============================================================================= -+# Link build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Link the shared library ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -+ -+build ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so: CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o | ../../../../libnode/bin/x86/libnode.so /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/21/liblog.so -+ LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -+ LINK_FLAGS = -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -+ LINK_LIBRARIES = ../../../../libnode/bin/x86/libnode.so -llog -latomic -lm -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ POST_BUILD = : -+ PRE_LINK = : -+ SONAME = libnodejs-mobile-react-native-native-lib.so -+ SONAME_FLAG = -Wl,-soname, -+ TARGET_FILE = ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -+ TARGET_PDB = nodejs-mobile-react-native-native-lib.so.dbg -+# ============================================================================= -+# Target aliases. -+ -+build libnodejs-mobile-react-native-native-lib.so: phony ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -+build nodejs-mobile-react-native-native-lib: phony ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -+# ============================================================================= -+# Folder targets. -+ -+# ============================================================================= -+# ============================================================================= -+# Built-in targets -+ -+ -+############################################# -+# The main all target. -+ -+build all: phony ../../../../build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -+ -+############################################# -+# Make the all target the default. -+ -+default all -+ -+############################################# -+# Re-run CMake if any of its inputs changed. -+ -+build build.ninja: RERUN_CMAKE | ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx -+ pool = console -+ -+############################################# -+# A missing CMake input file is not an error. -+ -+build ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx: phony -+ -+############################################# -+# Clean all the built files. -+ -+build clean: CLEAN -+ -+############################################# -+# Print all primary targets available. -+ -+build help: HELP -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_command.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_command.txt -new file mode 100644 -index 0000000..94cefa5 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_command.txt -@@ -0,0 +1,24 @@ -+ Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+arguments : -+-H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+-DCMAKE_FIND_ROOT_PATH=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86/prefab -+-DCMAKE_BUILD_TYPE=Debug -+-DCMAKE_TOOLCHAIN_FILE=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+-DANDROID_ABI=x86 -+-DANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DANDROID_PLATFORM=android-21 -+-DCMAKE_ANDROID_ARCH_ABI=x86 -+-DCMAKE_ANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -+-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86 -+-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86 -+-DCMAKE_MAKE_PROGRAM=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+-DCMAKE_SYSTEM_NAME=Android -+-DCMAKE_SYSTEM_VERSION=21 -+-B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+-GNinja -+jvmArgs : -+ -+ -+ Build command args: [] -+ Version: 1 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_file_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_file_index.txt -new file mode 100644 -index 0000000..baaf99c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_file_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_model.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_model.json -new file mode 100644 -index 0000000..2107a3b ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/build_model.json -@@ -0,0 +1,216 @@ -+{ -+ "abi": "X86", -+ "info": { -+ "abi": "X86", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ "originalCxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "cxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "abiPlatformVersion": 21, -+ "cmake": { -+ "cmakeWrappingBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cxx/debug/x86", -+ "cmakeArtifactsBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "effectiveConfiguration": { -+ "name": "traditional-android-studio-cmake-environment", -+ "description": "Composite reified CMakeSettings configuration", -+ "generator": "Ninja", -+ "inheritEnvironments": [ -+ "ndk" -+ ], -+ "buildRoot": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "cmakeToolchain": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeExecutable": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "variables": [ -+ { -+ "name": "CMAKE_FIND_ROOT_PATH", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86/prefab" -+ }, -+ { -+ "name": "CMAKE_BUILD_TYPE", -+ "value": "Debug" -+ }, -+ { -+ "name": "CMAKE_TOOLCHAIN_FILE", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake" -+ }, -+ { -+ "name": "ANDROID_ABI", -+ "value": "x86" -+ }, -+ { -+ "name": "ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "ANDROID_PLATFORM", -+ "value": "android-21" -+ }, -+ { -+ "name": "CMAKE_ANDROID_ARCH_ABI", -+ "value": "x86" -+ }, -+ { -+ "name": "CMAKE_ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "CMAKE_EXPORT_COMPILE_COMMANDS", -+ "value": "ON" -+ }, -+ { -+ "name": "CMAKE_LIBRARY_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86" -+ }, -+ { -+ "name": "CMAKE_RUNTIME_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86" -+ }, -+ { -+ "name": "CMAKE_MAKE_PROGRAM", -+ "value": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_NAME", -+ "value": "Android" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_VERSION", -+ "value": "21" -+ } -+ ] -+ }, -+ "cmakeServerLogFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_server_log.txt" -+ }, -+ "variant": { -+ "buildSystemArgumentList": [], -+ "cFlagsList": [], -+ "cppFlagsList": [ -+ "" -+ ], -+ "variantName": "debug", -+ "objFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj", -+ "soFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/lib", -+ "isDebuggableEnabled": true, -+ "validAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "buildTargetSet": [], -+ "implicitBuildTargetSet": [], -+ "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", -+ "module": { -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx", -+ "splitsAbiFilterSet": [], -+ "intermediatesFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates", -+ "gradleModulePathName": ":nodejs-mobile-react-native", -+ "moduleRootFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "moduleBuildFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build.gradle", -+ "makeFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "buildSystem": "CMAKE", -+ "ndkFolder": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "ndkVersion": "21.4.7075529", -+ "ndkSupportedAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultStl": "LIBCXX_STATIC", -+ "ndkMetaPlatforms": { -+ "min": 16, -+ "max": 30, -+ "aliases": { -+ "20": 19, -+ "25": 24, -+ "J": 16, -+ "J-MR1": 17, -+ "J-MR2": 18, -+ "K": 19, -+ "L": 21, -+ "L-MR1": 22, -+ "M": 23, -+ "N": 24, -+ "N-MR1": 24, -+ "O": 26, -+ "O-MR1": 27, -+ "P": 28, -+ "Q": 29, -+ "R": 30 -+ } -+ }, -+ "ndkMetaAbiList": [ -+ { -+ "abi": "ARMEABI_V7A", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "ARM64_V8A", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86_64", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ } -+ ], -+ "originalCmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmake": { -+ "isValidCmakeAvailable": true, -+ "cmakeExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "minimumCmakeVersion": "3.10.2", -+ "ninjaExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "isPreferCmakeFileApiEnabled": true -+ }, -+ "stlSharedObjectMap": { -+ "LIBCXX_SHARED": { -+ "ARMEABI_V7A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", -+ "ARM64_V8A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", -+ "X86": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", -+ "X86_64": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" -+ }, -+ "LIBCXX_STATIC": {}, -+ "NONE": {}, -+ "SYSTEM": {} -+ }, -+ "project": { -+ "rootBuildGradleFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android", -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "compilerSettingsCacheFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "isNativeCompilerSettingsCacheEnabled": false, -+ "isBuildOnlyTargetAbiEnabled": true, -+ "isCmakeBuildCohabitationEnabled": false, -+ "isPrefabEnabled": false, -+ "isV2NativeModelEnabled": true -+ }, -+ "nativeBuildOutputLevel": "QUIET" -+ }, -+ "prefabDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab" -+ }, -+ "buildSettings": { -+ "environmentVariables": [] -+ }, -+ "prefabFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86" -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_install.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_install.cmake -new file mode 100644 -index 0000000..231722f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_install.cmake -@@ -0,0 +1,49 @@ -+# Install script for directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+# Set the install prefix -+if(NOT DEFINED CMAKE_INSTALL_PREFIX) -+ set(CMAKE_INSTALL_PREFIX "/usr/local") -+endif() -+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -+ -+# Set the install configuration name. -+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) -+ if(BUILD_TYPE) -+ string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" -+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") -+ else() -+ set(CMAKE_INSTALL_CONFIG_NAME "Debug") -+ endif() -+ message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -+endif() -+ -+# Set the component getting installed. -+if(NOT CMAKE_INSTALL_COMPONENT) -+ if(COMPONENT) -+ message(STATUS "Install component: \"${COMPONENT}\"") -+ set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") -+ else() -+ set(CMAKE_INSTALL_COMPONENT) -+ endif() -+endif() -+ -+# Install shared libraries without execute permission? -+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) -+ set(CMAKE_INSTALL_SO_NO_EXE "0") -+endif() -+ -+# Is this installation the result of a crosscompile? -+if(NOT DEFINED CMAKE_CROSSCOMPILING) -+ set(CMAKE_CROSSCOMPILING "TRUE") -+endif() -+ -+if(CMAKE_INSTALL_COMPONENT) -+ set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -+else() -+ set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -+endif() -+ -+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT -+ "${CMAKE_INSTALL_MANIFEST_FILES}") -+file(WRITE "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/${CMAKE_INSTALL_MANIFEST}" -+ "${CMAKE_INSTALL_MANIFEST_CONTENT}") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_server_log.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_server_log.txt -new file mode 100644 -index 0000000..edd249c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/cmake_server_log.txt -@@ -0,0 +1,351 @@ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "handshake", -+ "cookie": "gradle-cmake-cookie", -+ "protocolVersion": { -+ "isExperimental": true, -+ "major": 1, -+ "minor": 1 -+ }, -+ "sourceDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "buildDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "generator": "Ninja" -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"gradle-cmake-cookie","inReplyTo":"handshake","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "configure", -+ "cacheArguments": [ -+ "", -+ "-DCMAKE_FIND_ROOT_PATH\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86/prefab", -+ "-DCMAKE_BUILD_TYPE\u003dDebug", -+ "-DCMAKE_TOOLCHAIN_FILE\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "-DANDROID_ABI\u003dx86", -+ "-DANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DANDROID_PLATFORM\u003dandroid-21", -+ "-DCMAKE_ANDROID_ARCH_ABI\u003dx86", -+ "-DCMAKE_ANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", -+ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86", -+ "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86", -+ "-DCMAKE_MAKE_PROGRAM\u003d/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-DCMAKE_SYSTEM_NAME\u003dAndroid", -+ "-DCMAKE_SYSTEM_VERSION\u003d21" -+ ] -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":33,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":65,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":96,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":126,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":155,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":184,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":211,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":237,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":262,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":287,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":311,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Configuring done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Configuring done -+CMAKE SERVER: Configuring done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"compute"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Generating","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","message":"Generating done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Generating done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"cmakeInputs"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"buildFiles":[{"isCMake":true,"isTemporary":false,"sources":["/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in"]},{"isCMake":false,"isTemporary":false,"sources":["CMakeLists.txt","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake"]},{"isCMake":false,"isTemporary":true,"sources":[".cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeSystem.cmake",".cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake"]}],"cmakeRootDirectory":"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10","cookie":"","inReplyTo":"cmakeInputs","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"codemodel"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"configurations":[{"name":"Debug","projects":[{"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86","name":"Project","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","targets":[{"artifacts":["/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so"],"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86","fileGroups":[{"compileFlags":"-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC ","defines":["nodejs_mobile_react_native_native_lib_EXPORTS"],"includePath":[{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/include/node"},{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp"}],"isGenerated":false,"language":"CXX","sources":["src/main/cpp/native-lib.cpp","src/main/cpp/rn-bridge.cpp"]}],"fullName":"libnodejs-mobile-react-native-native-lib.so","linkFlags":"-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments","linkLibraries":"../../../../libnode/bin/x86/libnode.so -llog -latomic -lm","linkerLanguage":"CXX","name":"nodejs-mobile-react-native-native-lib","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","sysroot":"/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot","type":"SHARED_LIBRARY"}]}]}],"cookie":"","inReplyTo":"codemodel","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json -new file mode 100644 -index 0000000..c4e90f8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json -@@ -0,0 +1,13 @@ -+[ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp" -+}, -+ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp" -+} -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json.bin -new file mode 100644 -index 0000000..8ca7430 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/compile_commands.json.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/json_generation_record.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/json_generation_record.json -new file mode 100644 -index 0000000..bcb8878 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/json_generation_record.json -@@ -0,0 +1,23 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "Start JSON generation. Platform version: 21 min SDK version: x86", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON \u0027/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/android_gradle_build.json\u0027 was up-to-date", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON generation completed without problems", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/prefab_config.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/prefab_config.json -new file mode 100644 -index 0000000..e799de8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/prefab_config.json -@@ -0,0 +1,4 @@ -+{ -+ "enabled": false, -+ "packages": [] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/rules.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/rules.ninja -new file mode 100644 -index 0000000..874dcf4 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/rules.ninja -@@ -0,0 +1,64 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the rules used to get the outputs files -+# built from the input files. -+# It is included in the main 'build.ninja'. -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+# ============================================================================= -+ -+############################################# -+# Rule for running custom commands. -+ -+rule CUSTOM_COMMAND -+ command = $COMMAND -+ description = $DESC -+ -+ -+############################################# -+# Rule for compiling CXX files. -+ -+rule CXX_COMPILER__nodejs-mobile-react-native-native-lib -+ depfile = $DEP_FILE -+ deps = gcc -+ command = /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in -+ description = Building CXX object $out -+ -+ -+############################################# -+# Rule for linking CXX shared library. -+ -+rule CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib -+ command = $PRE_LINK && /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD -+ description = Linking CXX shared library $TARGET_FILE -+ restat = $RESTAT -+ -+ -+############################################# -+# Rule for re-running cmake. -+ -+rule RERUN_CMAKE -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86 -+ description = Re-running CMake... -+ generator = 1 -+ -+ -+############################################# -+# Rule for cleaning all built files. -+ -+rule CLEAN -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t clean -+ description = Cleaning all built files... -+ -+ -+############################################# -+# Rule for printing all primary targets available. -+ -+rule HELP -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t targets -+ description = All primary targets available: -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/symbol_folder_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/symbol_folder_index.txt -new file mode 100644 -index 0000000..ea72588 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86/symbol_folder_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_deps b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_deps -new file mode 100644 -index 0000000..48999c3 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_deps differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_log -new file mode 100644 -index 0000000..79ed551 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/.ninja_log -@@ -0,0 +1,4 @@ -+# ninja log v5 -+0 516 1636396590 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o 3c536641477b99b6 -+0 786 1636396590 CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o b7b1ce66590f7778 -+787 1039 1636396590 ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so d3d898ec2b74cb9e -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeCache.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeCache.txt -new file mode 100644 -index 0000000..efe4475 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeCache.txt -@@ -0,0 +1,365 @@ -+# This is the CMakeCache file. -+# For build in directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+# It was generated by CMake: /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+# You can edit this file to change values found and used by cmake. -+# If you do not want to change any of the values, simply exit the editor. -+# If you do want to change a value, simply edit, save, and exit the editor. -+# The syntax for the file is as follows: -+# KEY:TYPE=VALUE -+# KEY is the name of a variable in the cache. -+# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -+# VALUE is the current value for the KEY. -+ -+######################## -+# EXTERNAL cache entries -+######################## -+ -+//No help, variable specified on the command line. -+ANDROID_ABI:UNINITIALIZED=x86_64 -+ -+//No help, variable specified on the command line. -+ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//No help, variable specified on the command line. -+ANDROID_PLATFORM:UNINITIALIZED=android-21 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86_64 -+ -+//No help, variable specified on the command line. -+CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+ -+//Archiver -+CMAKE_AR:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ar -+ -+//Flags used by the compiler during all build types. -+CMAKE_ASM_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_ASM_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds. -+CMAKE_ASM_FLAGS_RELEASE:STRING= -+ -+//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or -+// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. -+CMAKE_BUILD_TYPE:STRING=Debug -+ -+//LLVM archiver -+CMAKE_CXX_COMPILER_AR:FILEPATH=CMAKE_CXX_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_CXX_COMPILER_RANLIB:FILEPATH=CMAKE_CXX_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_CXX_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_CXX_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_CXX_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C++ applications. -+CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//LLVM archiver -+CMAKE_C_COMPILER_AR:FILEPATH=CMAKE_C_COMPILER_AR-NOTFOUND -+ -+//Generate index for LLVM archive -+CMAKE_C_COMPILER_RANLIB:FILEPATH=CMAKE_C_COMPILER_RANLIB-NOTFOUND -+ -+//Flags used by the compiler during all build types. -+CMAKE_C_FLAGS:STRING= -+ -+//Flags used by the compiler during debug builds. -+CMAKE_C_FLAGS_DEBUG:STRING= -+ -+//Flags used by the compiler during release builds for minimum -+// size. -+CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG -+ -+//Flags used by the compiler during release builds. -+CMAKE_C_FLAGS_RELEASE:STRING= -+ -+//Flags used by the compiler during release builds with debug info. -+CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG -+ -+//Libraries linked by default with all C applications. -+CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm -+ -+//Flags used by the linker. -+CMAKE_EXE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Enable/Disable output of compile commands during generation. -+CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON -+ -+//No help, variable specified on the command line. -+CMAKE_FIND_ROOT_PATH:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86_64/prefab -+ -+//Install path prefix, prepended onto install directories. -+CMAKE_INSTALL_PREFIX:PATH=/usr/local -+ -+//No help, variable specified on the command line. -+CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64 -+ -+//Path to a program. -+CMAKE_LINKER:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ld -+ -+//No help, variable specified on the command line. -+CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+ -+//Flags used by the linker during the creation of modules. -+CMAKE_MODULE_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_NM:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-nm -+ -+//Path to a program. -+CMAKE_OBJCOPY:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-objcopy -+ -+//Path to a program. -+CMAKE_OBJDUMP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-objdump -+ -+//Value Computed by CMake -+CMAKE_PROJECT_NAME:STATIC=Project -+ -+//Ranlib -+CMAKE_RANLIB:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ranlib -+ -+//No help, variable specified on the command line. -+CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64 -+ -+//Flags used by the linker during the creation of dll's. -+CMAKE_SHARED_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//If set, runtime paths are not added when installing shared libraries, -+// but are added when building. -+CMAKE_SKIP_INSTALL_RPATH:BOOL=NO -+ -+//If set, runtime paths are not added when using shared libraries. -+CMAKE_SKIP_RPATH:BOOL=NO -+ -+//Flags used by the linker during the creation of static libraries. -+CMAKE_STATIC_LINKER_FLAGS:STRING= -+ -+//Flags used by the linker during debug builds. -+CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= -+ -+//Flags used by the linker during release minsize builds. -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= -+ -+//Flags used by the linker during release builds. -+CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= -+ -+//Flags used by the linker during Release with Debug Info builds. -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= -+ -+//Path to a program. -+CMAKE_STRIP:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-strip -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_NAME:UNINITIALIZED=Android -+ -+//No help, variable specified on the command line. -+CMAKE_SYSTEM_VERSION:UNINITIALIZED=21 -+ -+//The CMake toolchain file -+CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+ -+//If this value is on, makefiles will be generated without the -+// .SILENT directive, and all commands will be echoed to the console -+// during the make. This is useful for debugging only. With Visual -+// Studio IDE projects all commands are done without /nologo. -+CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE -+ -+//Value Computed by CMake -+Project_BINARY_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+ -+//Value Computed by CMake -+Project_SOURCE_DIR:STATIC=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+//Path to a library. -+log-lib:FILEPATH=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/liblog.so -+ -+//Dependencies for the target -+nodejs-mobile-react-native-native-lib_LIB_DEPENDS:STATIC=general;libnode;general;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/liblog.so; -+ -+ -+######################## -+# INTERNAL cache entries -+######################## -+ -+//ADVANCED property for variable: CMAKE_AR -+CMAKE_AR-ADVANCED:INTERNAL=1 -+//This is the directory where this CMakeCache.txt was created -+CMAKE_CACHEFILE_DIR:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+//Major version of cmake used to create the current loaded cache -+CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -+//Minor version of cmake used to create the current loaded cache -+CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 -+//Patch version of cmake used to create the current loaded cache -+CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -+//Path to CMake executable. -+CMAKE_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+//Path to cpack program executable. -+CMAKE_CPACK_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cpack -+//Path to ctest program executable. -+CMAKE_CTEST_COMMAND:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ctest -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -+CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -+CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS -+CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -+CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -+CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -+CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -+CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES -+CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_AR -+CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -+CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS -+CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -+CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -+CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -+CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -+CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES -+CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -+CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -+CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -+CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -+CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -+CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -+//Name of external makefile project generator. -+CMAKE_EXTRA_GENERATOR:INTERNAL= -+//Name of generator. -+CMAKE_GENERATOR:INTERNAL=Ninja -+//Name of generator platform. -+CMAKE_GENERATOR_PLATFORM:INTERNAL= -+//Name of generator toolset. -+CMAKE_GENERATOR_TOOLSET:INTERNAL= -+//Source directory with the top level CMakeLists.txt file for this -+// project -+CMAKE_HOME_DIRECTORY:INTERNAL=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+//Install .so files without execute permission. -+CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -+//ADVANCED property for variable: CMAKE_LINKER -+CMAKE_LINKER-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -+CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -+CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -+CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -+CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_NM -+CMAKE_NM-ADVANCED:INTERNAL=1 -+//number of local generators -+CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJCOPY -+CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_OBJDUMP -+CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -+//Platform information initialized -+CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_RANLIB -+CMAKE_RANLIB-ADVANCED:INTERNAL=1 -+//Path to CMake installation. -+CMAKE_ROOT:INTERNAL=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -+CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -+CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -+CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -+CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -+CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_SKIP_RPATH -+CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -+CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -+CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -+CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -+CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -+CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -+//ADVANCED property for variable: CMAKE_STRIP -+CMAKE_STRIP-ADVANCED:INTERNAL=1 -+//uname command -+CMAKE_UNAME:INTERNAL=/usr/bin/uname -+//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -+CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCCompiler.cmake -new file mode 100644 -index 0000000..1fd384b ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCCompiler.cmake -@@ -0,0 +1,73 @@ -+set(CMAKE_C_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") -+set(CMAKE_C_COMPILER_ARG1 "") -+set(CMAKE_C_COMPILER_ID "Clang") -+set(CMAKE_C_COMPILER_VERSION "9.0") -+set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_C_COMPILER_WRAPPER "") -+set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -+set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -+set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -+set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -+set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") -+ -+set(CMAKE_C_PLATFORM_ID "") -+set(CMAKE_C_SIMULATE_ID "") -+set(CMAKE_C_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ar") -+set(CMAKE_C_COMPILER_AR "CMAKE_C_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ranlib") -+set(CMAKE_C_COMPILER_RANLIB "CMAKE_C_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCC ) -+set(CMAKE_C_COMPILER_LOADED 1) -+set(CMAKE_C_COMPILER_WORKS TRUE) -+set(CMAKE_C_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_C_COMPILER_ENV_VAR "CC") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_C_COMPILER_ID_RUN 1) -+set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -+set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_C_LINKER_PREFERENCE 10) -+ -+# Save compiler ABI information. -+set(CMAKE_C_SIZEOF_DATA_PTR "8") -+set(CMAKE_C_COMPILER_ABI "ELF") -+set(CMAKE_C_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_C_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_C_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_C_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;dl;c;gcc;dl") -+set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -new file mode 100644 -index 0000000..de8f0db ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake -@@ -0,0 +1,75 @@ -+set(CMAKE_CXX_COMPILER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") -+set(CMAKE_CXX_COMPILER_ARG1 "") -+set(CMAKE_CXX_COMPILER_ID "Clang") -+set(CMAKE_CXX_COMPILER_VERSION "9.0") -+set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -+set(CMAKE_CXX_COMPILER_WRAPPER "") -+set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") -+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -+set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -+set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -+ -+set(CMAKE_CXX_PLATFORM_ID "") -+set(CMAKE_CXX_SIMULATE_ID "") -+set(CMAKE_CXX_SIMULATE_VERSION "") -+ -+ -+ -+set(CMAKE_AR "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ar") -+set(CMAKE_CXX_COMPILER_AR "CMAKE_CXX_COMPILER_AR-NOTFOUND") -+set(CMAKE_RANLIB "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ranlib") -+set(CMAKE_CXX_COMPILER_RANLIB "CMAKE_CXX_COMPILER_RANLIB-NOTFOUND") -+set(CMAKE_LINKER "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/x86_64-linux-android-ld") -+set(CMAKE_COMPILER_IS_GNUCXX ) -+set(CMAKE_CXX_COMPILER_LOADED 1) -+set(CMAKE_CXX_COMPILER_WORKS TRUE) -+set(CMAKE_CXX_ABI_COMPILED TRUE) -+set(CMAKE_COMPILER_IS_MINGW ) -+set(CMAKE_COMPILER_IS_CYGWIN ) -+if(CMAKE_COMPILER_IS_CYGWIN) -+ set(CYGWIN 1) -+ set(UNIX 1) -+endif() -+ -+set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") -+ -+if(CMAKE_COMPILER_IS_MINGW) -+ set(MINGW 1) -+endif() -+set(CMAKE_CXX_COMPILER_ID_RUN 1) -+set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) -+set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) -+set(CMAKE_CXX_LINKER_PREFERENCE 30) -+set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) -+ -+# Save compiler ABI information. -+set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -+set(CMAKE_CXX_COMPILER_ABI "ELF") -+set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") -+ -+if(CMAKE_CXX_SIZEOF_DATA_PTR) -+ set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -+endif() -+ -+if(CMAKE_CXX_COMPILER_ABI) -+ set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -+endif() -+ -+if(CMAKE_CXX_LIBRARY_ARCHITECTURE) -+ set(CMAKE_LIBRARY_ARCHITECTURE "") -+endif() -+ -+set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -+if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) -+ set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -+endif() -+ -+ -+ -+ -+ -+set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;gcc;dl;c;gcc;dl") -+set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") -+set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin -new file mode 100755 -index 0000000..9e2df16 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin -new file mode 100755 -index 0000000..f309c3c -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeSystem.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeSystem.cmake -new file mode 100644 -index 0000000..3b6c5d9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeSystem.cmake -@@ -0,0 +1,15 @@ -+set(CMAKE_HOST_SYSTEM "Darwin-20.6.0") -+set(CMAKE_HOST_SYSTEM_NAME "Darwin") -+set(CMAKE_HOST_SYSTEM_VERSION "20.6.0") -+set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") -+ -+include("/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake") -+ -+set(CMAKE_SYSTEM "Android-1") -+set(CMAKE_SYSTEM_NAME "Android") -+set(CMAKE_SYSTEM_VERSION "1") -+set(CMAKE_SYSTEM_PROCESSOR "x86_64") -+ -+set(CMAKE_CROSSCOMPILING "TRUE") -+ -+set(CMAKE_SYSTEM_LOADED 1) -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeOutput.log b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeOutput.log -new file mode 100644 -index 0000000..5dbce7b ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeOutput.log -@@ -0,0 +1,512 @@ -+The target system is: Android - 1 - x86_64 -+The host system is: Darwin - 20.6.0 - x86_64 -+Determining if the C compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_d45ae" -+[1/2] Building C object CMakeFiles/cmTC_d45ae.dir/testCCompiler.c.o -+[2/2] Linking C executable cmTC_d45ae -+ -+ -+Detecting C compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_07c44" -+[1/2] Building C object CMakeFiles/cmTC_07c44.dir/CMakeCCompilerABI.c.o -+[2/2] Linking C executable cmTC_07c44 -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: x86_64-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Candidate multilib: .;@m64 -+Selected multilib: .;@m64 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_x86_64 -dynamic-linker /system/bin/linker64 -o cmTC_07c44 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_07c44.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o -+ -+ -+Parsed C implicit link information from above output: -+ link line regex: [^( *|.*[/\])(x86_64-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_07c44"] -+ ignore line: [[1/2] Building C object CMakeFiles/cmTC_07c44.dir/CMakeCCompilerABI.c.o] -+ ignore line: [[2/2] Linking C executable cmTC_07c44] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: x86_64-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m64] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m64] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_x86_64 -dynamic-linker /system/bin/linker64 -o cmTC_07c44 /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_07c44.dir/CMakeCCompilerABI.c.o -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [elf_x86_64] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker64] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_07c44] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_07c44.dir/CMakeCCompilerABI.c.o] ==> ignore -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting C [-std=c11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_9afa8" -+[1/2] Building C object CMakeFiles/cmTC_9afa8.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_9afa8 -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:1c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c99] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_0986a" -+[1/2] Building C object CMakeFiles/cmTC_0986a.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_0986a -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:1c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:1c_variadic_macros -+ -+ -+Detecting C [-std=c90] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_892be" -+[1/2] Building C object CMakeFiles/cmTC_892be.dir/feature_tests.c.o -+[2/2] Linking C executable cmTC_892be -+ -+ -+ Feature record: C_FEATURE:1c_function_prototypes -+ Feature record: C_FEATURE:0c_restrict -+ Feature record: C_FEATURE:0c_static_assert -+ Feature record: C_FEATURE:0c_variadic_macros -+Determining if the CXX compiler works passed with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_0452d" -+[1/2] Building CXX object CMakeFiles/cmTC_0452d.dir/testCXXCompiler.cxx.o -+[2/2] Linking CXX executable cmTC_0452d -+ -+ -+Detecting CXX compiler ABI info compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_31dab" -+[1/2] Building CXX object CMakeFiles/cmTC_31dab.dir/CMakeCXXCompilerABI.cpp.o -+[2/2] Linking CXX executable cmTC_31dab -+Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn) -+Target: x86_64-none-linux-android21 -+Thread model: posix -+InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x -+Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -+Candidate multilib: .;@m64 -+Selected multilib: .;@m64 -+ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_x86_64 -dynamic-linker /system/bin/linker64 -o cmTC_31dab /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_31dab.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o -+ -+ -+Parsed CXX implicit link information from above output: -+ link line regex: [^( *|.*[/\])(x86_64-linux-android-ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] -+ ignore line: [Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp] -+ ignore line: [] -+ ignore line: [Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_31dab"] -+ ignore line: [[1/2] Building CXX object CMakeFiles/cmTC_31dab.dir/CMakeCXXCompilerABI.cpp.o] -+ ignore line: [[2/2] Linking CXX executable cmTC_31dab] -+ ignore line: [Android (7019983 based on r365631c3) clang version 9.0.9 (https://android.googlesource.com/toolchain/llvm-project a2a1e703c0edb03ba29944e529ccbf457742737b) (based on LLVM 9.0.9svn)] -+ ignore line: [Target: x86_64-none-linux-android21] -+ ignore line: [Thread model: posix] -+ ignore line: [InstalledDir: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x] -+ ignore line: [Found candidate GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Selected GCC installation: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ ignore line: [Candidate multilib: .] -+ ignore line: [@m64] -+ ignore line: [Selected multilib: .] -+ ignore line: [@m64] -+ link line: [ "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld" --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -pie -z noexecstack --warn-shared-textrel -z now -z relro --hash-style=both --enable-new-dtags --eh-frame-hdr -m elf_x86_64 -dynamic-linker /system/bin/linker64 -o cmTC_31dab /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21 -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib -L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --exclude-libs libgcc.a --exclude-libs libgcc_real.a --exclude-libs libatomic.a --build-id --fatal-warnings --no-undefined --gc-sections CMakeFiles/cmTC_31dab.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm -lgcc -ldl -lc -lgcc -ldl /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld] ==> ignore -+ arg [--sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore -+ arg [-pie] ==> ignore -+ arg [-znoexecstack] ==> ignore -+ arg [--warn-shared-textrel] ==> ignore -+ arg [-znow] ==> ignore -+ arg [-zrelro] ==> ignore -+ arg [--hash-style=both] ==> ignore -+ arg [--enable-new-dtags] ==> ignore -+ arg [--eh-frame-hdr] ==> ignore -+ arg [-m] ==> ignore -+ arg [elf_x86_64] ==> ignore -+ arg [-dynamic-linker] ==> ignore -+ arg [/system/bin/linker64] ==> ignore -+ arg [-o] ==> ignore -+ arg [cmTC_31dab] ==> ignore -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtbegin_dynamic.o] ==> ignore -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] -+ arg [-L/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libgcc_real.a] ==> ignore -+ arg [--exclude-libs] ==> ignore -+ arg [libatomic.a] ==> ignore -+ arg [--build-id] ==> ignore -+ arg [--fatal-warnings] ==> ignore -+ arg [--no-undefined] ==> ignore -+ arg [--gc-sections] ==> ignore -+ arg [CMakeFiles/cmTC_31dab.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore -+ arg [-Bstatic] ==> ignore -+ arg [-lc++] ==> lib [c++] -+ arg [-Bdynamic] ==> ignore -+ arg [-lm] ==> lib [m] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [-lc] ==> lib [c] -+ arg [-lgcc] ==> lib [gcc] -+ arg [-ldl] ==> lib [dl] -+ arg [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/crtend_android.o] ==> ignore -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib/../lib64] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib] -+ collapse library dir [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit libs: [c++;m;gcc;dl;c;gcc;dl] -+ implicit dirs: [/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/9.0.9/lib/linux/x86_64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/lib/gcc/x86_64-linux-android/4.9.x;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib64;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/x86_64-linux-android/lib;/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] -+ implicit fwks: [] -+ -+ -+ -+ -+Detecting CXX [-std=c++1z] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_c742f" -+[1/2] Building CXX object CMakeFiles/cmTC_c742f.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_c742f -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++14] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_d8e9c" -+[1/2] Building CXX object CMakeFiles/cmTC_d8e9c.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_d8e9c -+ -+ -+ Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:1cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:1cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:1cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:1cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:1cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:1cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:1cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:1cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:1cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:1cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++11] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_7660c" -+[1/2] Building CXX object CMakeFiles/cmTC_7660c.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_7660c -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:1cxx_alias_templates -+ Feature record: CXX_FEATURE:1cxx_alignas -+ Feature record: CXX_FEATURE:1cxx_alignof -+ Feature record: CXX_FEATURE:1cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:1cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:1cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:1cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:1cxx_default_function_template_args -+ Feature record: CXX_FEATURE:1cxx_defaulted_functions -+ Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:1cxx_delegating_constructors -+ Feature record: CXX_FEATURE:1cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:1cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:1cxx_explicit_conversions -+ Feature record: CXX_FEATURE:1cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:1cxx_extern_templates -+ Feature record: CXX_FEATURE:1cxx_final -+ Feature record: CXX_FEATURE:1cxx_func_identifier -+ Feature record: CXX_FEATURE:1cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:1cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:1cxx_inline_namespaces -+ Feature record: CXX_FEATURE:1cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:1cxx_local_type_template_args -+ Feature record: CXX_FEATURE:1cxx_long_long_type -+ Feature record: CXX_FEATURE:1cxx_noexcept -+ Feature record: CXX_FEATURE:1cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:1cxx_nullptr -+ Feature record: CXX_FEATURE:1cxx_override -+ Feature record: CXX_FEATURE:1cxx_range_for -+ Feature record: CXX_FEATURE:1cxx_raw_string_literals -+ Feature record: CXX_FEATURE:1cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:1cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:1cxx_rvalue_references -+ Feature record: CXX_FEATURE:1cxx_sizeof_member -+ Feature record: CXX_FEATURE:1cxx_static_assert -+ Feature record: CXX_FEATURE:1cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:1cxx_thread_local -+ Feature record: CXX_FEATURE:1cxx_trailing_return_types -+ Feature record: CXX_FEATURE:1cxx_unicode_literals -+ Feature record: CXX_FEATURE:1cxx_uniform_initialization -+ Feature record: CXX_FEATURE:1cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:1cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:1cxx_variadic_macros -+ Feature record: CXX_FEATURE:1cxx_variadic_templates -+ -+ -+Detecting CXX [-std=c++98] compiler features compiled with the following output: -+Change Dir: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/CMakeTmp -+ -+Run Build Command:"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" "cmTC_65383" -+[1/2] Building CXX object CMakeFiles/cmTC_65383.dir/feature_tests.cxx.o -+[2/2] Linking CXX executable cmTC_65383 -+ -+ -+ Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers -+ Feature record: CXX_FEATURE:0cxx_alias_templates -+ Feature record: CXX_FEATURE:0cxx_alignas -+ Feature record: CXX_FEATURE:0cxx_alignof -+ Feature record: CXX_FEATURE:0cxx_attributes -+ Feature record: CXX_FEATURE:0cxx_attribute_deprecated -+ Feature record: CXX_FEATURE:0cxx_auto_type -+ Feature record: CXX_FEATURE:0cxx_binary_literals -+ Feature record: CXX_FEATURE:0cxx_constexpr -+ Feature record: CXX_FEATURE:0cxx_contextual_conversions -+ Feature record: CXX_FEATURE:0cxx_decltype -+ Feature record: CXX_FEATURE:0cxx_decltype_auto -+ Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types -+ Feature record: CXX_FEATURE:0cxx_default_function_template_args -+ Feature record: CXX_FEATURE:0cxx_defaulted_functions -+ Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers -+ Feature record: CXX_FEATURE:0cxx_delegating_constructors -+ Feature record: CXX_FEATURE:0cxx_deleted_functions -+ Feature record: CXX_FEATURE:0cxx_digit_separators -+ Feature record: CXX_FEATURE:0cxx_enum_forward_declarations -+ Feature record: CXX_FEATURE:0cxx_explicit_conversions -+ Feature record: CXX_FEATURE:0cxx_extended_friend_declarations -+ Feature record: CXX_FEATURE:0cxx_extern_templates -+ Feature record: CXX_FEATURE:0cxx_final -+ Feature record: CXX_FEATURE:0cxx_func_identifier -+ Feature record: CXX_FEATURE:0cxx_generalized_initializers -+ Feature record: CXX_FEATURE:0cxx_generic_lambdas -+ Feature record: CXX_FEATURE:0cxx_inheriting_constructors -+ Feature record: CXX_FEATURE:0cxx_inline_namespaces -+ Feature record: CXX_FEATURE:0cxx_lambdas -+ Feature record: CXX_FEATURE:0cxx_lambda_init_captures -+ Feature record: CXX_FEATURE:0cxx_local_type_template_args -+ Feature record: CXX_FEATURE:0cxx_long_long_type -+ Feature record: CXX_FEATURE:0cxx_noexcept -+ Feature record: CXX_FEATURE:0cxx_nonstatic_member_init -+ Feature record: CXX_FEATURE:0cxx_nullptr -+ Feature record: CXX_FEATURE:0cxx_override -+ Feature record: CXX_FEATURE:0cxx_range_for -+ Feature record: CXX_FEATURE:0cxx_raw_string_literals -+ Feature record: CXX_FEATURE:0cxx_reference_qualified_functions -+ Feature record: CXX_FEATURE:0cxx_relaxed_constexpr -+ Feature record: CXX_FEATURE:0cxx_return_type_deduction -+ Feature record: CXX_FEATURE:0cxx_right_angle_brackets -+ Feature record: CXX_FEATURE:0cxx_rvalue_references -+ Feature record: CXX_FEATURE:0cxx_sizeof_member -+ Feature record: CXX_FEATURE:0cxx_static_assert -+ Feature record: CXX_FEATURE:0cxx_strong_enums -+ Feature record: CXX_FEATURE:1cxx_template_template_parameters -+ Feature record: CXX_FEATURE:0cxx_thread_local -+ Feature record: CXX_FEATURE:0cxx_trailing_return_types -+ Feature record: CXX_FEATURE:0cxx_unicode_literals -+ Feature record: CXX_FEATURE:0cxx_uniform_initialization -+ Feature record: CXX_FEATURE:0cxx_unrestricted_unions -+ Feature record: CXX_FEATURE:0cxx_user_literals -+ Feature record: CXX_FEATURE:0cxx_variable_templates -+ Feature record: CXX_FEATURE:0cxx_variadic_macros -+ Feature record: CXX_FEATURE:0cxx_variadic_templates -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/TargetDirectories.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/TargetDirectories.txt -new file mode 100644 -index 0000000..5d04910 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/TargetDirectories.txt -@@ -0,0 +1,3 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/rebuild_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/edit_cache.dir -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/cmake.check_cache b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/cmake.check_cache -new file mode 100644 -index 0000000..3dccd73 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/cmake.check_cache -@@ -0,0 +1 @@ -+# This file is generated by cmake for dependency checking of the CMakeCache.txt file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.bin -new file mode 100755 -index 0000000..5e07fc6 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c -new file mode 100644 -index 0000000..90a87b1 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c -@@ -0,0 +1,34 @@ -+ -+ const char features[] = {"\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 -+"1" -+#else -+"0" -+#endif -+"c_function_prototypes\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_restrict\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -+"1" -+#else -+"0" -+#endif -+"c_static_assert\n" -+"C_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+"1" -+#else -+"0" -+#endif -+"c_variadic_macros\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx -new file mode 100644 -index 0000000..703b335 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx -@@ -0,0 +1,405 @@ -+ -+ const char features[] = {"\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_aggregate_nsdmi) -+"1" -+#else -+"0" -+#endif -+"cxx_aggregate_default_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alias_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_alias_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_alignas) -+"1" -+#else -+"0" -+#endif -+"cxx_alignof\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_attributes) -+"1" -+#else -+"0" -+#endif -+"cxx_attributes\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_attribute_deprecated\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_auto_type) -+"1" -+#else -+"0" -+#endif -+"cxx_auto_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_binary_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_binary_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_contextual_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_contextual_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_auto\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_decltype_incomplete_return_types) -+"1" -+#else -+"0" -+#endif -+"cxx_decltype_incomplete_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_default_function_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_default_function_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_defaulted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_defaulted_move_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_delegating_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_delegating_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_deleted_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_deleted_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_digit_separators\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_enum_forward_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_explicit_conversions) -+"1" -+#else -+"0" -+#endif -+"cxx_explicit_conversions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extended_friend_declarations\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_extern_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_final\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_func_identifier\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_generalized_initializers\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 304 && __cplusplus > 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_generic_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_inheriting_constructors) -+"1" -+#else -+"0" -+#endif -+"cxx_inheriting_constructors\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_inline_namespaces\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_lambdas) -+"1" -+#else -+"0" -+#endif -+"cxx_lambdas\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_init_captures) -+"1" -+#else -+"0" -+#endif -+"cxx_lambda_init_captures\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_local_type_template_args) -+"1" -+#else -+"0" -+#endif -+"cxx_local_type_template_args\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_long_long_type\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_noexcept) -+"1" -+#else -+"0" -+#endif -+"cxx_noexcept\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nonstatic_member_init) -+"1" -+#else -+"0" -+#endif -+"cxx_nonstatic_member_init\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_nullptr) -+"1" -+#else -+"0" -+#endif -+"cxx_nullptr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_override_control) -+"1" -+#else -+"0" -+#endif -+"cxx_override\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_range_for) -+"1" -+#else -+"0" -+#endif -+"cxx_range_for\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_raw_string_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_raw_string_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_reference_qualified_functions) -+"1" -+#else -+"0" -+#endif -+"cxx_reference_qualified_functions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_relaxed_constexpr) -+"1" -+#else -+"0" -+#endif -+"cxx_relaxed_constexpr\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_return_type_deduction) -+"1" -+#else -+"0" -+#endif -+"cxx_return_type_deduction\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_right_angle_brackets\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_rvalue_references) -+"1" -+#else -+"0" -+#endif -+"cxx_rvalue_references\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_sizeof_member\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_static_assert) -+"1" -+#else -+"0" -+#endif -+"cxx_static_assert\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_strong_enums) -+"1" -+#else -+"0" -+#endif -+"cxx_strong_enums\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 199711L -+"1" -+#else -+"0" -+#endif -+"cxx_template_template_parameters\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_thread_local) -+"1" -+#else -+"0" -+#endif -+"cxx_thread_local\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_trailing_return) -+"1" -+#else -+"0" -+#endif -+"cxx_trailing_return_types\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unicode_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_unicode_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_generalized_initializers) -+"1" -+#else -+"0" -+#endif -+"cxx_uniform_initialization\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_unrestricted_unions) -+"1" -+#else -+"0" -+#endif -+"cxx_unrestricted_unions\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_user_literals) -+"1" -+#else -+"0" -+#endif -+"cxx_user_literals\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variable_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variable_templates\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __cplusplus >= 201103L -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_macros\n" -+"CXX_FEATURE:" -+#if ((__clang_major__ * 100) + __clang_minor__) >= 301 && __has_feature(cxx_variadic_templates) -+"1" -+#else -+"0" -+#endif -+"cxx_variadic_templates\n" -+ -+}; -+ -+int main(int argc, char** argv) { (void)argv; return features[argc]; } -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -new file mode 100644 -index 0000000..8d2ce4f -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -new file mode 100644 -index 0000000..ce422bf -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build.json -new file mode 100644 -index 0000000..bd39811 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build.json -@@ -0,0 +1,42 @@ -+{ -+ "stringTable": {}, -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-x86_64": { -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "buildType": "debug", -+ "abi": "x86_64", -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/x86_64/libnode.so" -+ ] -+ } -+ }, -+ "toolchains": {}, -+ "cFileExtensions": [], -+ "cppFileExtensions": [ -+ "cpp" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86_64.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86_64.txt -new file mode 100644 -index 0000000..6a75a40 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_command_nodejs-mobile-react-native-native-lib_x86_64.txt -@@ -0,0 +1,7 @@ -+Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+arguments : -+-C -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+nodejs-mobile-react-native-native-lib -+jvmArgs : -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_mini.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_mini.json -new file mode 100644 -index 0000000..556bafc ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_mini.json -@@ -0,0 +1,35 @@ -+{ -+ "buildFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt" -+ ], -+ "cleanCommandsComponents": [ -+ [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "clean" -+ ] -+ ], -+ "buildTargetsCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "{LIST_OF_TARGETS_TO_BUILD}" -+ ], -+ "libraries": { -+ "nodejs-mobile-react-native-native-lib-Debug-x86_64": { -+ "artifactName": "nodejs-mobile-react-native-native-lib", -+ "buildCommandComponents": [ -+ "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-C", -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "nodejs-mobile-react-native-native-lib" -+ ], -+ "abi": "x86_64", -+ "output": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so", -+ "runtimeFiles": [ -+ "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/bin/x86_64/libnode.so" -+ ] -+ } -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_x86_64.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_stderr_nodejs-mobile-react-native-native-lib_x86_64.txt -new file mode 100644 -index 0000000..e69de29 -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86_64.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86_64.txt -new file mode 100644 -index 0000000..6917cc8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build_stdout_nodejs-mobile-react-native-native-lib_x86_64.txt -@@ -0,0 +1,2 @@ -+ninja: Entering directory `/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64' -+ninja: no work to do. -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build.ninja -new file mode 100644 -index 0000000..5843eb5 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build.ninja -@@ -0,0 +1,134 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the build statements describing the -+# compilation DAG. -+ -+# ============================================================================= -+# Write statements declared in CMakeLists.txt: -+# -+# Which is the root file. -+# ============================================================================= -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+ -+############################################# -+# Minimal version of Ninja required by this file -+ -+ninja_required_version = 1.5 -+ -+# ============================================================================= -+# Include auxiliary files. -+ -+ -+############################################# -+# Include rules file. -+ -+include rules.ninja -+ -+ -+############################################# -+# Utility command for rebuild_cache -+ -+build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+ DESC = Running CMake to regenerate build system... -+ pool = console -+ restat = 1 -+build rebuild_cache: phony CMakeFiles/rebuild_cache.util -+ -+############################################# -+# Utility command for edit_cache -+ -+build CMakeFiles/edit_cache.util: CUSTOM_COMMAND -+ COMMAND = cd /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 && /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -+ DESC = No interactive CMake dialog available... -+ restat = 1 -+build edit_cache: phony CMakeFiles/edit_cache.util -+# ============================================================================= -+# Object build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Order-only phony target for nodejs-mobile-react-native-native-lib -+ -+build cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib: phony -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+build CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o: CXX_COMPILER__nodejs-mobile-react-native-native-lib ../../../../src/main/cpp/rn-bridge.cpp || cmake_object_order_depends_target_nodejs-mobile-react-native-native-lib -+ DEFINES = -Dnodejs_mobile_react_native_native_lib_EXPORTS -+ DEP_FILE = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o.d -+ FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -+ INCLUDES = -I../../../../libnode/include/node -I../../../../src/main/cpp -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ OBJECT_FILE_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp -+ -+# ============================================================================= -+# Link build statements for SHARED_LIBRARY target nodejs-mobile-react-native-native-lib -+ -+ -+############################################# -+# Link the shared library ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -+ -+build ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so: CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o | ../../../../libnode/bin/x86_64/libnode.so /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/21/liblog.so -+ LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -+ LINK_FLAGS = -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -+ LINK_LIBRARIES = ../../../../libnode/bin/x86_64/libnode.so -llog -latomic -lm -+ OBJECT_DIR = CMakeFiles/nodejs-mobile-react-native-native-lib.dir -+ POST_BUILD = : -+ PRE_LINK = : -+ SONAME = libnodejs-mobile-react-native-native-lib.so -+ SONAME_FLAG = -Wl,-soname, -+ TARGET_FILE = ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -+ TARGET_PDB = nodejs-mobile-react-native-native-lib.so.dbg -+# ============================================================================= -+# Target aliases. -+ -+build libnodejs-mobile-react-native-native-lib.so: phony ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -+build nodejs-mobile-react-native-native-lib: phony ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -+# ============================================================================= -+# Folder targets. -+ -+# ============================================================================= -+# ============================================================================= -+# Built-in targets -+ -+ -+############################################# -+# The main all target. -+ -+build all: phony ../../../../build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -+ -+############################################# -+# Make the all target the default. -+ -+default all -+ -+############################################# -+# Re-run CMake if any of its inputs changed. -+ -+build build.ninja: RERUN_CMAKE | ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx -+ pool = console -+ -+############################################# -+# A missing CMake input file is not an error. -+ -+build ../../../../CMakeLists.txt /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake CMakeCache.txt CMakeFiles/3.10.2/CMakeCCompiler.cmake CMakeFiles/3.10.2/CMakeCXXCompiler.cmake CMakeFiles/3.10.2/CMakeSystem.cmake CMakeFiles/feature_tests.c CMakeFiles/feature_tests.cxx: phony -+ -+############################################# -+# Clean all the built files. -+ -+build clean: CLEAN -+ -+############################################# -+# Print all primary targets available. -+ -+build help: HELP -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_command.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_command.txt -new file mode 100644 -index 0000000..a260f74 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_command.txt -@@ -0,0 +1,24 @@ -+ Executable : /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -+arguments : -+-H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+-DCMAKE_FIND_ROOT_PATH=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86_64/prefab -+-DCMAKE_BUILD_TYPE=Debug -+-DCMAKE_TOOLCHAIN_FILE=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake -+-DANDROID_ABI=x86_64 -+-DANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DANDROID_PLATFORM=android-21 -+-DCMAKE_ANDROID_ARCH_ABI=x86_64 -+-DCMAKE_ANDROID_NDK=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 -+-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -+-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64 -+-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64 -+-DCMAKE_MAKE_PROGRAM=/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -+-DCMAKE_SYSTEM_NAME=Android -+-DCMAKE_SYSTEM_VERSION=21 -+-B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+-GNinja -+jvmArgs : -+ -+ -+ Build command args: [] -+ Version: 1 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_file_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_file_index.txt -new file mode 100644 -index 0000000..baaf99c ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_file_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_model.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_model.json -new file mode 100644 -index 0000000..6abf021 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/build_model.json -@@ -0,0 +1,216 @@ -+{ -+ "abi": "X86_64", -+ "info": { -+ "abi": "X86_64", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ "originalCxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "cxxBuildFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "abiPlatformVersion": 21, -+ "cmake": { -+ "cmakeWrappingBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cxx/debug/x86_64", -+ "cmakeArtifactsBaseFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "effectiveConfiguration": { -+ "name": "traditional-android-studio-cmake-environment", -+ "description": "Composite reified CMakeSettings configuration", -+ "generator": "Ninja", -+ "inheritEnvironments": [ -+ "ndk" -+ ], -+ "buildRoot": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "cmakeToolchain": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeExecutable": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "variables": [ -+ { -+ "name": "CMAKE_FIND_ROOT_PATH", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86_64/prefab" -+ }, -+ { -+ "name": "CMAKE_BUILD_TYPE", -+ "value": "Debug" -+ }, -+ { -+ "name": "CMAKE_TOOLCHAIN_FILE", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake" -+ }, -+ { -+ "name": "ANDROID_ABI", -+ "value": "x86_64" -+ }, -+ { -+ "name": "ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "ANDROID_PLATFORM", -+ "value": "android-21" -+ }, -+ { -+ "name": "CMAKE_ANDROID_ARCH_ABI", -+ "value": "x86_64" -+ }, -+ { -+ "name": "CMAKE_ANDROID_NDK", -+ "value": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ }, -+ { -+ "name": "CMAKE_EXPORT_COMPILE_COMMANDS", -+ "value": "ON" -+ }, -+ { -+ "name": "CMAKE_LIBRARY_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64" -+ }, -+ { -+ "name": "CMAKE_RUNTIME_OUTPUT_DIRECTORY", -+ "value": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64" -+ }, -+ { -+ "name": "CMAKE_MAKE_PROGRAM", -+ "value": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_NAME", -+ "value": "Android" -+ }, -+ { -+ "name": "CMAKE_SYSTEM_VERSION", -+ "value": "21" -+ } -+ ] -+ }, -+ "cmakeServerLogFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_server_log.txt" -+ }, -+ "variant": { -+ "buildSystemArgumentList": [], -+ "cFlagsList": [], -+ "cppFlagsList": [ -+ "" -+ ], -+ "variantName": "debug", -+ "objFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj", -+ "soFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/lib", -+ "isDebuggableEnabled": true, -+ "validAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "buildTargetSet": [], -+ "implicitBuildTargetSet": [], -+ "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", -+ "module": { -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx", -+ "splitsAbiFilterSet": [], -+ "intermediatesFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates", -+ "gradleModulePathName": ":nodejs-mobile-react-native", -+ "moduleRootFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "moduleBuildFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build.gradle", -+ "makeFile": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "buildSystem": "CMAKE", -+ "ndkFolder": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "ndkVersion": "21.4.7075529", -+ "ndkSupportedAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultAbiList": [ -+ "ARMEABI_V7A", -+ "ARM64_V8A", -+ "X86", -+ "X86_64" -+ ], -+ "ndkDefaultStl": "LIBCXX_STATIC", -+ "ndkMetaPlatforms": { -+ "min": 16, -+ "max": 30, -+ "aliases": { -+ "20": 19, -+ "25": 24, -+ "J": 16, -+ "J-MR1": 17, -+ "J-MR2": 18, -+ "K": 19, -+ "L": 21, -+ "L-MR1": 22, -+ "M": 23, -+ "N": 24, -+ "N-MR1": 24, -+ "O": 26, -+ "O-MR1": 27, -+ "P": 28, -+ "Q": 29, -+ "R": 30 -+ } -+ }, -+ "ndkMetaAbiList": [ -+ { -+ "abi": "ARMEABI_V7A", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "ARM64_V8A", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86", -+ "bitness": 32, -+ "deprecated": false, -+ "default": true -+ }, -+ { -+ "abi": "X86_64", -+ "bitness": 64, -+ "deprecated": false, -+ "default": true -+ } -+ ], -+ "originalCmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmakeToolchainFile": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "cmake": { -+ "isValidCmakeAvailable": true, -+ "cmakeExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake", -+ "minimumCmakeVersion": "3.10.2", -+ "ninjaExe": "/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "isPreferCmakeFileApiEnabled": true -+ }, -+ "stlSharedObjectMap": { -+ "LIBCXX_SHARED": { -+ "ARMEABI_V7A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", -+ "ARM64_V8A": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", -+ "X86": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", -+ "X86_64": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" -+ }, -+ "LIBCXX_STATIC": {}, -+ "NONE": {}, -+ "SYSTEM": {} -+ }, -+ "project": { -+ "rootBuildGradleFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android", -+ "cxxFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "compilerSettingsCacheFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/android/.cxx", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "isNativeCompilerSettingsCacheEnabled": false, -+ "isBuildOnlyTargetAbiEnabled": true, -+ "isCmakeBuildCohabitationEnabled": false, -+ "isPrefabEnabled": false, -+ "isV2NativeModelEnabled": true -+ }, -+ "nativeBuildOutputLevel": "QUIET" -+ }, -+ "prefabDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab" -+ }, -+ "buildSettings": { -+ "environmentVariables": [] -+ }, -+ "prefabFolder": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86_64" -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_install.cmake b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_install.cmake -new file mode 100644 -index 0000000..bd1a82f ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_install.cmake -@@ -0,0 +1,49 @@ -+# Install script for directory: /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -+ -+# Set the install prefix -+if(NOT DEFINED CMAKE_INSTALL_PREFIX) -+ set(CMAKE_INSTALL_PREFIX "/usr/local") -+endif() -+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -+ -+# Set the install configuration name. -+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) -+ if(BUILD_TYPE) -+ string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" -+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") -+ else() -+ set(CMAKE_INSTALL_CONFIG_NAME "Debug") -+ endif() -+ message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -+endif() -+ -+# Set the component getting installed. -+if(NOT CMAKE_INSTALL_COMPONENT) -+ if(COMPONENT) -+ message(STATUS "Install component: \"${COMPONENT}\"") -+ set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") -+ else() -+ set(CMAKE_INSTALL_COMPONENT) -+ endif() -+endif() -+ -+# Install shared libraries without execute permission? -+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) -+ set(CMAKE_INSTALL_SO_NO_EXE "0") -+endif() -+ -+# Is this installation the result of a crosscompile? -+if(NOT DEFINED CMAKE_CROSSCOMPILING) -+ set(CMAKE_CROSSCOMPILING "TRUE") -+endif() -+ -+if(CMAKE_INSTALL_COMPONENT) -+ set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -+else() -+ set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -+endif() -+ -+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT -+ "${CMAKE_INSTALL_MANIFEST_FILES}") -+file(WRITE "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/${CMAKE_INSTALL_MANIFEST}" -+ "${CMAKE_INSTALL_MANIFEST_CONTENT}") -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_server_log.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_server_log.txt -new file mode 100644 -index 0000000..262affe ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/cmake_server_log.txt -@@ -0,0 +1,351 @@ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":1}],"type":"hello"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "handshake", -+ "cookie": "gradle-cmake-cookie", -+ "protocolVersion": { -+ "isExperimental": true, -+ "major": 1, -+ "minor": 1 -+ }, -+ "sourceDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android", -+ "buildDirectory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "generator": "Ninja" -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"gradle-cmake-cookie","inReplyTo":"handshake","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: { -+ "type": "configure", -+ "cacheArguments": [ -+ "", -+ "-DCMAKE_FIND_ROOT_PATH\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/prefab/x86_64/prefab", -+ "-DCMAKE_BUILD_TYPE\u003dDebug", -+ "-DCMAKE_TOOLCHAIN_FILE\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake", -+ "-DANDROID_ABI\u003dx86_64", -+ "-DANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DANDROID_PLATFORM\u003dandroid-21", -+ "-DCMAKE_ANDROID_ARCH_ABI\u003dx86_64", -+ "-DCMAKE_ANDROID_NDK\u003d/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", -+ "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64", -+ "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64", -+ "-DCMAKE_MAKE_PROGRAM\u003d/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja", -+ "-DCMAKE_SYSTEM_NAME\u003dAndroid", -+ "-DCMAKE_SYSTEM_VERSION\u003d21" -+ ] -+} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":33,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: Check for working C compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: Detecting C compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":65,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: Detecting C compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: Detecting C compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":96,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":126,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":155,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting C compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: Detecting C compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":184,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: Check for working CXX compiler: /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ -- works -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: Detecting CXX compiler ABI info -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":211,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compiler ABI info - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: Detecting CXX compiler ABI info - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: Detecting CXX compile features -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":237,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":262,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":287,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":311,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Detecting CXX compile features - done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: Detecting CXX compile features - done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Configuring","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","message":"Configuring done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Configuring done -+CMAKE SERVER: Configuring done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"configure","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"compute"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","progressCurrent":1000,"progressMaximum":1000,"progressMessage":"Generating","progressMinimum":0,"type":"progress"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","message":"Generating done","type":"message"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: Generating done -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"cookie":"","inReplyTo":"compute","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"cmakeInputs"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"buildFiles":[{"isCMake":true,"isTemporary":false,"sources":["/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystem.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Initialize.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Determine-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android/Determine-Compiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeFindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-FindBinUtils.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeGenericSystem.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Linux.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/UnixPaths.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/GNU.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-C.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompilerABI.c","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-C-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCCompiler.cmake.in","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang-CXX.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Platform/Android-Clang.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCXXCompiler.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeTestCompilerCommon.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompilerABI.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeParseImplicitLinkInfo.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeDetermineCompileFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Internal/FeatureTesting.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-FeatureTests.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/Compiler/Clang-CXX-TestableFeatures.cmake","/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10/Modules/CMakeCXXCompiler.cmake.in"]},{"isCMake":false,"isTemporary":false,"sources":["CMakeLists.txt","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/platforms.cmake","/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/build/cmake/android.toolchain.cmake"]},{"isCMake":false,"isTemporary":true,"sources":[".cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeSystem.cmake",".cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.c",".cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCCompiler.cmake",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86_64/CMakeFiles/feature_tests.cxx",".cxx/cmake/debug/x86_64/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake"]}],"cmakeRootDirectory":"/Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/share/cmake-3.10","cookie":"","inReplyTo":"cmakeInputs","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"type":"codemodel"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -+CMAKE SERVER: -+ -+CMAKE SERVER: [== "CMake Server" ==[ -+ -+CMAKE SERVER: {"configurations":[{"name":"Debug","projects":[{"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64","name":"Project","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","targets":[{"artifacts":["/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so"],"buildDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64","fileGroups":[{"compileFlags":"-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC ","defines":["nodejs_mobile_react_native_native_lib_EXPORTS"],"includePath":[{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/libnode/include/node"},{"path":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp"}],"isGenerated":false,"language":"CXX","sources":["src/main/cpp/native-lib.cpp","src/main/cpp/rn-bridge.cpp"]}],"fullName":"libnodejs-mobile-react-native-native-lib.so","linkFlags":"-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments","linkLibraries":"../../../../libnode/bin/x86_64/libnode.so -llog -latomic -lm","linkerLanguage":"CXX","name":"nodejs-mobile-react-native-native-lib","sourceDirectory":"/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android","sysroot":"/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot","type":"SHARED_LIBRARY"}]}]}],"cookie":"","inReplyTo":"codemodel","type":"reply"} -+ -+CMAKE SERVER: ]== "CMake Server" ==] -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json -new file mode 100644 -index 0000000..90830e0 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json -@@ -0,0 +1,13 @@ -+[ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/native-lib.cpp" -+}, -+ -+{ -+ "directory": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64", -+ "command": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnodejs_mobile_react_native_native_lib_EXPORTS -I../../../../libnode/include/node -I../../../../src/main/cpp -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -o CMakeFiles/nodejs-mobile-react-native-native-lib.dir/src/main/cpp/rn-bridge.cpp.o -c /Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/src/main/cpp/rn-bridge.cpp" -+} -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json.bin b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json.bin -new file mode 100644 -index 0000000..a6928ac -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/compile_commands.json.bin differ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/json_generation_record.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/json_generation_record.json -new file mode 100644 -index 0000000..6ae3ade ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/json_generation_record.json -@@ -0,0 +1,23 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "Start JSON generation. Platform version: 21 min SDK version: x86_64", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86_64", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON \u0027/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/android_gradle_build.json\u0027 was up-to-date", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86_64", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "JSON generation completed without problems", -+ "file": "/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/CMakeLists.txt", -+ "tag": "debug|x86_64", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/prefab_config.json b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/prefab_config.json -new file mode 100644 -index 0000000..e799de8 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/prefab_config.json -@@ -0,0 +1,4 @@ -+{ -+ "enabled": false, -+ "packages": [] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/rules.ninja b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/rules.ninja -new file mode 100644 -index 0000000..4b440e5 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/rules.ninja -@@ -0,0 +1,64 @@ -+# CMAKE generated file: DO NOT EDIT! -+# Generated by "Ninja" Generator, CMake Version 3.10 -+ -+# This file contains all the rules used to get the outputs files -+# built from the input files. -+# It is included in the main 'build.ninja'. -+ -+# ============================================================================= -+# Project: Project -+# Configuration: Debug -+# ============================================================================= -+# ============================================================================= -+ -+############################################# -+# Rule for running custom commands. -+ -+rule CUSTOM_COMMAND -+ command = $COMMAND -+ description = $DESC -+ -+ -+############################################# -+# Rule for compiling CXX files. -+ -+rule CXX_COMPILER__nodejs-mobile-react-native-native-lib -+ depfile = $DEP_FILE -+ deps = gcc -+ command = /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in -+ description = Building CXX object $out -+ -+ -+############################################# -+# Rule for linking CXX shared library. -+ -+rule CXX_SHARED_LIBRARY_LINKER__nodejs-mobile-react-native-native-lib -+ command = $PRE_LINK && /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android21 --gcc-toolchain=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64 --sysroot=/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD -+ description = Linking CXX shared library $TARGET_FILE -+ restat = $RESTAT -+ -+ -+############################################# -+# Rule for re-running cmake. -+ -+rule RERUN_CMAKE -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake -H/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android -B/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64 -+ description = Re-running CMake... -+ generator = 1 -+ -+ -+############################################# -+# Rule for cleaning all built files. -+ -+rule CLEAN -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t clean -+ description = Cleaning all built files... -+ -+ -+############################################# -+# Rule for printing all primary targets available. -+ -+rule HELP -+ command = /Users/andrewchou/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja -t targets -+ description = All primary targets available: -+ -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/symbol_folder_index.txt b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/symbol_folder_index.txt -new file mode 100644 -index 0000000..ba22a48 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/cmake/debug/x86_64/symbol_folder_index.txt -@@ -0,0 +1 @@ -+/Users/andrewchou/GitHub/digidem/mapeo-mobile/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64 -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record.json b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record.json -new file mode 100644 -index 0000000..066ec22 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record.json -@@ -0,0 +1,49 @@ -+{ -+ "ndkFolder": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "messages": [ -+ { -+ "level": "INFO", -+ "message": "android.ndkVersion from module build.gradle is 21.4.7075529" -+ }, -+ { -+ "level": "INFO", -+ "message": "ndk.dir in local.properties is not set" -+ }, -+ { -+ "level": "INFO", -+ "message": "ANDROID_NDK_HOME environment variable is /Users/andrewchou/Library/Android/sdk/ndk/22.1.7171670/" -+ }, -+ { -+ "level": "INFO", -+ "message": "sdkFolder is /Users/andrewchou/Library/Android/sdk" -+ }, -+ { -+ "level": "WARN", -+ "message": "Support for ANDROID_NDK_HOME is deprecated and will be removed in the future. Use android.ndkVersion in build.gradle instead." -+ }, -+ { -+ "level": "INFO", -+ "message": "Considering /Users/andrewchou/Library/Android/sdk/ndk/22.1.7171670 by ANDROID_NDK_HOME" -+ }, -+ { -+ "level": "INFO", -+ "message": "Considering /Users/andrewchou/Library/Android/sdk/ndk-bundle in SDK ndk-bundle folder" -+ }, -+ { -+ "level": "INFO", -+ "message": "Considering /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529 in SDK ndk folder" -+ }, -+ { -+ "level": "INFO", -+ "message": "Rejected /Users/andrewchou/Library/Android/sdk/ndk/22.1.7171670 by ANDROID_NDK_HOME because that location has no source.properties" -+ }, -+ { -+ "level": "INFO", -+ "message": "Rejected /Users/andrewchou/Library/Android/sdk/ndk-bundle in SDK ndk-bundle folder because that location has no source.properties" -+ }, -+ { -+ "level": "INFO", -+ "message": "Found requested NDK version 21.4.7075529 at /Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529" -+ } -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.json b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.json -new file mode 100644 -index 0000000..4654b14 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.json -@@ -0,0 +1,11 @@ -+{ -+ "ndk": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "revision": { -+ "mMajor": 21, -+ "mMinor": 4, -+ "mMicro": 7075529, -+ "mPreview": 0, -+ "mPrecision": "MICRO", -+ "mPreviewSeparator": " " -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.log b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.log -new file mode 100644 -index 0000000..bef00fb ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1.log -@@ -0,0 +1,27 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "android.ndkVersion from module build.gradle is [21.4.7075529]", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "android.ndkPath from module build.gradle is not set", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "ndk.dir in local.properties is not set", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "Not considering ANDROID_NDK_HOME because support was removed after deprecation period.", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "sdkFolder is /Users/andrewchou/Library/Android/sdk", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1_key.json b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1_key.json -new file mode 100644 -index 0000000..4bbb5d9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_1mc2e6y1_key.json -@@ -0,0 +1,7 @@ -+{ -+ "ndkVersionFromDsl": "21.4.7075529", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "sideBySideNdkFolderNames": [ -+ "21.4.7075529" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.json b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.json -new file mode 100644 -index 0000000..4654b14 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.json -@@ -0,0 +1,11 @@ -+{ -+ "ndk": "/Users/andrewchou/Library/Android/sdk/ndk/21.4.7075529", -+ "revision": { -+ "mMajor": 21, -+ "mMinor": 4, -+ "mMicro": 7075529, -+ "mPreview": 0, -+ "mPrecision": "MICRO", -+ "mPreviewSeparator": " " -+ } -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.log b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.log -new file mode 100644 -index 0000000..bef00fb ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2.log -@@ -0,0 +1,27 @@ -+[ -+ { -+ "level": "INFO", -+ "message": "android.ndkVersion from module build.gradle is [21.4.7075529]", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "android.ndkPath from module build.gradle is not set", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "ndk.dir in local.properties is not set", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "Not considering ANDROID_NDK_HOME because support was removed after deprecation period.", -+ "diagnosticCode": "UNKNOWN" -+ }, -+ { -+ "level": "INFO", -+ "message": "sdkFolder is /Users/andrewchou/Library/Android/sdk", -+ "diagnosticCode": "UNKNOWN" -+ } -+] -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2_key.json b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2_key.json -new file mode 100644 -index 0000000..4bbb5d9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/.cxx/ndk_locator_record_4a6r24x2_key.json -@@ -0,0 +1,7 @@ -+{ -+ "ndkVersionFromDsl": "21.4.7075529", -+ "sdkFolder": "/Users/andrewchou/Library/Android/sdk", -+ "sideBySideNdkFolderNames": [ -+ "21.4.7075529" -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build.gradle b/node_modules/nodejs-mobile-react-native/android/build.gradle -index b6dccc4..1834a8e 100644 ---- a/node_modules/nodejs-mobile-react-native/android/build.gradle -+++ b/node_modules/nodejs-mobile-react-native/android/build.gradle -@@ -50,6 +50,7 @@ def _isCorrectSTLDefinedByApp = DoesAppAlreadyDefineWantedSTL() - android { - compileSdkVersion ((rootProject?.ext?.properties?.compileSdkVersion) ?: 23) - buildToolsVersion ((rootProject?.ext?.properties?.buildToolsVersion) ?: "23.0.1") -+ ndkVersion "21.4.7075529" - - defaultConfig { - minSdkVersion _nodeMinSdkVersion -@@ -76,9 +77,10 @@ android { - } - - sourceSets { -- main { -- jniLibs.srcDirs 'libnode/bin/' -- } -+ // https://github.com/JaneaSystems/nodejs-mobile/issues/317#issuecomment-852033823 -+ // main { -+ // jniLibs.srcDirs 'libnode/bin/' -+ // } - main.assets.srcDirs += '../install/resources/nodejs-modules' - } - -@@ -261,51 +263,59 @@ if ("1".equals(shouldRebuildNativeModules)) { - String temp_cc_ver = '4.9'; - String temp_dest_cpu; - String temp_v8_arch; -- String temp_suffix; -- String temp_toolchain_name; -+ String temp_binutils_prefix; -+ String temp_compiler_prefix; - String cargo_build_target; - switch ( temp_arch ) - { - case 'arm': - temp_dest_cpu = "${temp_arch}" - temp_v8_arch = "${temp_arch}" -- temp_suffix = "${temp_arch}-linux-androideabi" -- temp_toolchain_name = "${temp_suffix}" -+ temp_binutils_prefix = "arm-linux-androideabi" -+ temp_compiler_prefix = "armv7a-linux-androideabi${_compileNativeModulesSdkVersion}" - cargo_build_target = 'arm-linux-androideabi' - break - case 'x86': - temp_dest_cpu = 'ia32' - temp_v8_arch = 'ia32' -- temp_suffix = 'i686-linux-android' -- temp_toolchain_name = "${temp_arch}" -- cargo_build_target = temp_suffix -+ temp_binutils_prefix = "i686-linux-android" -+ temp_compiler_prefix = "i686-linux-android${_compileNativeModulesSdkVersion}" -+ cargo_build_target = "i686-linux-android" - break - case 'x86_64': - temp_dest_cpu = 'x64' - temp_v8_arch = 'x64' -- temp_suffix = "${temp_arch}-linux-android" -- temp_toolchain_name = "${temp_arch}" -- cargo_build_target = temp_suffix -+ temp_binutils_prefix = "x86_64-linux-android" -+ temp_compiler_prefix = "x86_64-linux-android${_compileNativeModulesSdkVersion}" -+ cargo_build_target = "x86_64-linux-android" - break - case 'arm64': - temp_dest_cpu = "${temp_arch}" - temp_v8_arch = "${temp_arch}" -- temp_suffix = 'aarch64-linux-android' -- temp_toolchain_name = 'aarch64' -- cargo_build_target = temp_suffix -+ temp_binutils_prefix = "aarch64-linux-android" -+ temp_compiler_prefix = "aarch64-linux-android${_compileNativeModulesSdkVersion}" -+ cargo_build_target = "aarch64-linux-android" - break - default: - throw new GradleException("Unsupported architecture for nodejs-mobile native modules: ${temp_arch}") - break - } - -+ String temp_host_tag -+ if (OperatingSystem.current().isMacOsX()) { -+ temp_host_tag = 'darwin-x86_64' -+ } else if (OperatingSystem.current().isLinux()) { -+ temp_host_tag = 'linux-x86_64' -+ } else { -+ throw new GradleException("Unsupported opperating system for nodejs-mobile native builds: ${OperatingSystem.current().getName()}") -+ } -+ - String ndk_bundle_path = android.ndkDirectory -- String standalone_toolchain = "${rootProject.buildDir}/standalone-toolchains/${temp_toolchain_name}" -- String npm_toolchain_add_to_path = "${rootProject.buildDir}/bin" -- String npm_toolchain_ar = "${standalone_toolchain}/bin/${temp_suffix}-ar" -- String npm_toolchain_cc = "${standalone_toolchain}/bin/${temp_suffix}-clang" -- String npm_toolchain_cxx = "${standalone_toolchain}/bin/${temp_suffix}-clang++" -- String npm_toolchain_link = "${standalone_toolchain}/bin/${temp_suffix}-clang++" -+ String toolchain_path = "${ndk_bundle_path}/toolchains/llvm/prebuilt/${temp_host_tag}" -+ String npm_toolchain_ar = "${toolchain_path}/bin/${temp_binutils_prefix}-ar" -+ String npm_toolchain_cc = "${toolchain_path}/bin/${temp_compiler_prefix}-clang" -+ String npm_toolchain_cxx = "${toolchain_path}/bin/${temp_compiler_prefix}-clang++" -+ String npm_toolchain_link = "${toolchain_path}/bin/${temp_compiler_prefix}-clang++" - String cargo_target_triple = cargo_build_target.toUpperCase().replaceAll('-', '_') - - String npm_gyp_defines = "target_arch=${temp_arch}" -@@ -358,16 +368,8 @@ if ("1".equals(shouldRebuildNativeModules)) { - } - } - -- task "MakeToolchain${abi_name}" (type:Exec) { -- description = "Building a native toolchain to compile nodejs-mobile native modules for ${abi_name}." -- executable = "${ndk_bundle_path}/build/tools/make-standalone-toolchain.sh" -- args "--toolchain=${temp_toolchain_name}-${temp_cc_ver}", "--arch=${temp_arch}", "--install-dir=${standalone_toolchain}", "--stl=libc++", "--force", "--platform=android-${_compileNativeModulesSdkVersion}" -- outputs.dir "${standalone_toolchain}" -- } -- - task "BuildNpmModules${abi_name}" (type:Exec) { - dependsOn "CopyNodeProjectAssets${abi_name}" -- dependsOn "MakeToolchain${abi_name}" - description = "Building native modules for ${abi_name}." - inputs.file "${rootProject.buildDir}/nodejs-native-assets-temp-build/nodejs-native-assets-${abi_name}/copy.timestamp" - outputs.dir "${rootProject.buildDir}/nodejs-native-assets-temp-build/nodejs-native-assets-${abi_name}/nodejs-project/" -@@ -398,7 +400,7 @@ if ("1".equals(shouldRebuildNativeModules)) { - environment ("CARGO_TARGET_${cargo_target_triple}_AR", "${npm_toolchain_ar}") - environment ("CARGO_TARGET_${cargo_target_triple}_LINKER", "${npm_toolchain_link}") - -- environment ('TOOLCHAIN',"${standalone_toolchain}") -+ environment ('TOOLCHAIN',"${toolchain_path}") - environment ('AR',"${npm_toolchain_ar}") - environment ('CC',"${npm_toolchain_cc}") - environment ('CXX',"${npm_toolchain_cxx}") -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/results.bin b/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/results.bin -new file mode 100644 -index 0000000..0d259dd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/results.bin -@@ -0,0 +1 @@ -+o/classes -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/transformed/classes/classes.dex b/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/transformed/classes/classes.dex -new file mode 100644 -index 0000000..ae63c95 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/.transforms/86c16d08d7dff57d1f0e6be491cf64b6/transformed/classes/classes.dex differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c.bin b/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c.bin -new file mode 100644 -index 0000000..0d259dd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c.bin -@@ -0,0 +1 @@ -+o/classes -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c/classes/classes.dex b/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c/classes/classes.dex -new file mode 100644 -index 0000000..f91cc33 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/.transforms/e836ddff7c72c6fd24f0805145c31b0c/classes/classes.dex differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/results.bin b/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/results.bin -new file mode 100644 -index 0000000..0d259dd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/results.bin -@@ -0,0 +1 @@ -+o/classes -diff --git a/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/transformed/classes/classes.dex b/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/transformed/classes/classes.dex -new file mode 100644 -index 0000000..b8fe317 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/.transforms/f71114f7f5eb07599c150508a2fa2ed1/transformed/classes/classes.dex differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/generated/source/buildConfig/debug/com/janeasystems/rn_nodejs_mobile/BuildConfig.java b/node_modules/nodejs-mobile-react-native/android/build/generated/source/buildConfig/debug/com/janeasystems/rn_nodejs_mobile/BuildConfig.java -new file mode 100644 -index 0000000..c1a37bc ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/generated/source/buildConfig/debug/com/janeasystems/rn_nodejs_mobile/BuildConfig.java -@@ -0,0 +1,10 @@ -+/** -+ * Automatically generated file. DO NOT MODIFY -+ */ -+package com.janeasystems.rn_nodejs_mobile; -+ -+public final class BuildConfig { -+ public static final boolean DEBUG = Boolean.parseBoolean("true"); -+ public static final String LIBRARY_PACKAGE_NAME = "com.janeasystems.rn_nodejs_mobile"; -+ public static final String BUILD_TYPE = "debug"; -+} -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml -new file mode 100644 -index 0000000..f24cf43 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml -@@ -0,0 +1,9 @@ -+ -+ -+ -+ -+ -+ -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json -new file mode 100644 -index 0000000..90e2cb1 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json -@@ -0,0 +1,16 @@ -+{ -+ "version": 2, -+ "artifactType": { -+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", -+ "kind": "Directory" -+ }, -+ "applicationId": "com.janeasystems.rn_nodejs_mobile", -+ "variantName": "debug", -+ "elements": [ -+ { -+ "type": "SINGLE", -+ "filters": [], -+ "outputFile": "AndroidManifest.xml" -+ } -+ ] -+} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/aar_metadata/debug/aar-metadata.properties b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aar_metadata/debug/aar-metadata.properties -new file mode 100644 -index 0000000..d8560bd ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/aar_metadata/debug/aar-metadata.properties -@@ -0,0 +1,2 @@ -+aarFormatVersion=1.0 -+aarMetadataVersion=1.0 -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/node_modules/nodejs-mobile-react-native/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json -new file mode 100644 -index 0000000..9e26dfe ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json -@@ -0,0 +1 @@ -+{} -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnode.so -new file mode 100755 -index 0000000..aa7e91f -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -new file mode 100755 -index 0000000..b591835 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/arm64-v8a/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnode.so -new file mode 100755 -index 0000000..16a9ae6 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -new file mode 100755 -index 0000000..2edaaba -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnode.so -new file mode 100755 -index 0000000..c52a7b2 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so -new file mode 100755 -index 0000000..8f9585d -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnode.so -new file mode 100755 -index 0000000..57b9ae2 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so -new file mode 100755 -index 0000000..03c4f07 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/cmake/debug/obj/x86_64/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes/debug/classes.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes/debug/classes.jar -new file mode 100644 -index 0000000..7a8a4c7 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes/debug/classes.jar differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes_jar/debug/classes.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes_jar/debug/classes.jar -new file mode 100644 -index 0000000..1ed1e84 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_library_classes_jar/debug/classes.jar differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/R.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/R.jar -new file mode 100644 -index 0000000..2bd1521 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/R.jar differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_r_class_jar/debug/R.jar b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_r_class_jar/debug/R.jar -new file mode 100644 -index 0000000..d5e367d -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_r_class_jar/debug/R.jar differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_symbol_list/debug/R.txt b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_symbol_list/debug/R.txt -new file mode 100644 -index 0000000..d0a34de ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/compile_symbol_list/debug/R.txt -@@ -0,0 +1,1792 @@ -+int anim abc_fade_in 0x0 -+int anim abc_fade_out 0x0 -+int anim abc_grow_fade_in_from_bottom 0x0 -+int anim abc_popup_enter 0x0 -+int anim abc_popup_exit 0x0 -+int anim abc_shrink_fade_out_from_bottom 0x0 -+int anim abc_slide_in_bottom 0x0 -+int anim abc_slide_in_top 0x0 -+int anim abc_slide_out_bottom 0x0 -+int anim abc_slide_out_top 0x0 -+int anim abc_tooltip_enter 0x0 -+int anim abc_tooltip_exit 0x0 -+int anim catalyst_fade_in 0x0 -+int anim catalyst_fade_out 0x0 -+int anim catalyst_push_up_in 0x0 -+int anim catalyst_push_up_out 0x0 -+int anim catalyst_slide_down 0x0 -+int anim catalyst_slide_up 0x0 -+int attr actionBarDivider 0x0 -+int attr actionBarItemBackground 0x0 -+int attr actionBarPopupTheme 0x0 -+int attr actionBarSize 0x0 -+int attr actionBarSplitStyle 0x0 -+int attr actionBarStyle 0x0 -+int attr actionBarTabBarStyle 0x0 -+int attr actionBarTabStyle 0x0 -+int attr actionBarTabTextStyle 0x0 -+int attr actionBarTheme 0x0 -+int attr actionBarWidgetTheme 0x0 -+int attr actionButtonStyle 0x0 -+int attr actionDropDownStyle 0x0 -+int attr actionLayout 0x0 -+int attr actionMenuTextAppearance 0x0 -+int attr actionMenuTextColor 0x0 -+int attr actionModeBackground 0x0 -+int attr actionModeCloseButtonStyle 0x0 -+int attr actionModeCloseDrawable 0x0 -+int attr actionModeCopyDrawable 0x0 -+int attr actionModeCutDrawable 0x0 -+int attr actionModeFindDrawable 0x0 -+int attr actionModePasteDrawable 0x0 -+int attr actionModePopupWindowStyle 0x0 -+int attr actionModeSelectAllDrawable 0x0 -+int attr actionModeShareDrawable 0x0 -+int attr actionModeSplitBackground 0x0 -+int attr actionModeStyle 0x0 -+int attr actionModeWebSearchDrawable 0x0 -+int attr actionOverflowButtonStyle 0x0 -+int attr actionOverflowMenuStyle 0x0 -+int attr actionProviderClass 0x0 -+int attr actionViewClass 0x0 -+int attr activityChooserViewStyle 0x0 -+int attr actualImageResource 0x0 -+int attr actualImageScaleType 0x0 -+int attr actualImageUri 0x0 -+int attr alertDialogButtonGroupStyle 0x0 -+int attr alertDialogCenterButtons 0x0 -+int attr alertDialogStyle 0x0 -+int attr alertDialogTheme 0x0 -+int attr allowStacking 0x0 -+int attr alpha 0x0 -+int attr alphabeticModifiers 0x0 -+int attr arrowHeadLength 0x0 -+int attr arrowShaftLength 0x0 -+int attr autoCompleteTextViewStyle 0x0 -+int attr autoSizeMaxTextSize 0x0 -+int attr autoSizeMinTextSize 0x0 -+int attr autoSizePresetSizes 0x0 -+int attr autoSizeStepGranularity 0x0 -+int attr autoSizeTextType 0x0 -+int attr background 0x0 -+int attr backgroundImage 0x0 -+int attr backgroundSplit 0x0 -+int attr backgroundStacked 0x0 -+int attr backgroundTint 0x0 -+int attr backgroundTintMode 0x0 -+int attr barLength 0x0 -+int attr borderlessButtonStyle 0x0 -+int attr buttonBarButtonStyle 0x0 -+int attr buttonBarNegativeButtonStyle 0x0 -+int attr buttonBarNeutralButtonStyle 0x0 -+int attr buttonBarPositiveButtonStyle 0x0 -+int attr buttonBarStyle 0x0 -+int attr buttonGravity 0x0 -+int attr buttonIconDimen 0x0 -+int attr buttonPanelSideLayout 0x0 -+int attr buttonStyle 0x0 -+int attr buttonStyleSmall 0x0 -+int attr buttonTint 0x0 -+int attr buttonTintMode 0x0 -+int attr checkboxStyle 0x0 -+int attr checkedTextViewStyle 0x0 -+int attr closeIcon 0x0 -+int attr closeItemLayout 0x0 -+int attr collapseContentDescription 0x0 -+int attr collapseIcon 0x0 -+int attr color 0x0 -+int attr colorAccent 0x0 -+int attr colorBackgroundFloating 0x0 -+int attr colorButtonNormal 0x0 -+int attr colorControlActivated 0x0 -+int attr colorControlHighlight 0x0 -+int attr colorControlNormal 0x0 -+int attr colorError 0x0 -+int attr colorPrimary 0x0 -+int attr colorPrimaryDark 0x0 -+int attr colorSwitchThumbNormal 0x0 -+int attr commitIcon 0x0 -+int attr contentDescription 0x0 -+int attr contentInsetEnd 0x0 -+int attr contentInsetEndWithActions 0x0 -+int attr contentInsetLeft 0x0 -+int attr contentInsetRight 0x0 -+int attr contentInsetStart 0x0 -+int attr contentInsetStartWithNavigation 0x0 -+int attr controlBackground 0x0 -+int attr coordinatorLayoutStyle 0x0 -+int attr customNavigationLayout 0x0 -+int attr defaultQueryHint 0x0 -+int attr dialogCornerRadius 0x0 -+int attr dialogPreferredPadding 0x0 -+int attr dialogTheme 0x0 -+int attr displayOptions 0x0 -+int attr divider 0x0 -+int attr dividerHorizontal 0x0 -+int attr dividerPadding 0x0 -+int attr dividerVertical 0x0 -+int attr drawableSize 0x0 -+int attr drawerArrowStyle 0x0 -+int attr dropDownListViewStyle 0x0 -+int attr dropdownListPreferredItemHeight 0x0 -+int attr editTextBackground 0x0 -+int attr editTextColor 0x0 -+int attr editTextStyle 0x0 -+int attr elevation 0x0 -+int attr expandActivityOverflowButtonDrawable 0x0 -+int attr fadeDuration 0x0 -+int attr failureImage 0x0 -+int attr failureImageScaleType 0x0 -+int attr firstBaselineToTopHeight 0x0 -+int attr font 0x0 -+int attr fontFamily 0x0 -+int attr fontProviderAuthority 0x0 -+int attr fontProviderCerts 0x0 -+int attr fontProviderFetchStrategy 0x0 -+int attr fontProviderFetchTimeout 0x0 -+int attr fontProviderPackage 0x0 -+int attr fontProviderQuery 0x0 -+int attr fontStyle 0x0 -+int attr fontVariationSettings 0x0 -+int attr fontWeight 0x0 -+int attr gapBetweenBars 0x0 -+int attr goIcon 0x0 -+int attr height 0x0 -+int attr hideOnContentScroll 0x0 -+int attr homeAsUpIndicator 0x0 -+int attr homeLayout 0x0 -+int attr icon 0x0 -+int attr iconTint 0x0 -+int attr iconTintMode 0x0 -+int attr iconifiedByDefault 0x0 -+int attr imageButtonStyle 0x0 -+int attr indeterminateProgressStyle 0x0 -+int attr initialActivityCount 0x0 -+int attr isLightTheme 0x0 -+int attr itemPadding 0x0 -+int attr keylines 0x0 -+int attr lastBaselineToBottomHeight 0x0 -+int attr layout 0x0 -+int attr layout_anchor 0x0 -+int attr layout_anchorGravity 0x0 -+int attr layout_behavior 0x0 -+int attr layout_dodgeInsetEdges 0x0 -+int attr layout_insetEdge 0x0 -+int attr layout_keyline 0x0 -+int attr lineHeight 0x0 -+int attr listChoiceBackgroundIndicator 0x0 -+int attr listDividerAlertDialog 0x0 -+int attr listItemLayout 0x0 -+int attr listLayout 0x0 -+int attr listMenuViewStyle 0x0 -+int attr listPopupWindowStyle 0x0 -+int attr listPreferredItemHeight 0x0 -+int attr listPreferredItemHeightLarge 0x0 -+int attr listPreferredItemHeightSmall 0x0 -+int attr listPreferredItemPaddingLeft 0x0 -+int attr listPreferredItemPaddingRight 0x0 -+int attr logo 0x0 -+int attr logoDescription 0x0 -+int attr maxButtonHeight 0x0 -+int attr measureWithLargestChild 0x0 -+int attr multiChoiceItemLayout 0x0 -+int attr navigationContentDescription 0x0 -+int attr navigationIcon 0x0 -+int attr navigationMode 0x0 -+int attr numericModifiers 0x0 -+int attr overlapAnchor 0x0 -+int attr overlayImage 0x0 -+int attr paddingBottomNoButtons 0x0 -+int attr paddingEnd 0x0 -+int attr paddingStart 0x0 -+int attr paddingTopNoTitle 0x0 -+int attr panelBackground 0x0 -+int attr panelMenuListTheme 0x0 -+int attr panelMenuListWidth 0x0 -+int attr placeholderImage 0x0 -+int attr placeholderImageScaleType 0x0 -+int attr popupMenuStyle 0x0 -+int attr popupTheme 0x0 -+int attr popupWindowStyle 0x0 -+int attr preserveIconSpacing 0x0 -+int attr pressedStateOverlayImage 0x0 -+int attr progressBarAutoRotateInterval 0x0 -+int attr progressBarImage 0x0 -+int attr progressBarImageScaleType 0x0 -+int attr progressBarPadding 0x0 -+int attr progressBarStyle 0x0 -+int attr queryBackground 0x0 -+int attr queryHint 0x0 -+int attr radioButtonStyle 0x0 -+int attr ratingBarStyle 0x0 -+int attr ratingBarStyleIndicator 0x0 -+int attr ratingBarStyleSmall 0x0 -+int attr retryImage 0x0 -+int attr retryImageScaleType 0x0 -+int attr roundAsCircle 0x0 -+int attr roundBottomEnd 0x0 -+int attr roundBottomLeft 0x0 -+int attr roundBottomRight 0x0 -+int attr roundBottomStart 0x0 -+int attr roundTopEnd 0x0 -+int attr roundTopLeft 0x0 -+int attr roundTopRight 0x0 -+int attr roundTopStart 0x0 -+int attr roundWithOverlayColor 0x0 -+int attr roundedCornerRadius 0x0 -+int attr roundingBorderColor 0x0 -+int attr roundingBorderPadding 0x0 -+int attr roundingBorderWidth 0x0 -+int attr searchHintIcon 0x0 -+int attr searchIcon 0x0 -+int attr searchViewStyle 0x0 -+int attr seekBarStyle 0x0 -+int attr selectableItemBackground 0x0 -+int attr selectableItemBackgroundBorderless 0x0 -+int attr showAsAction 0x0 -+int attr showDividers 0x0 -+int attr showText 0x0 -+int attr showTitle 0x0 -+int attr singleChoiceItemLayout 0x0 -+int attr spinBars 0x0 -+int attr spinnerDropDownItemStyle 0x0 -+int attr spinnerStyle 0x0 -+int attr splitTrack 0x0 -+int attr srcCompat 0x0 -+int attr state_above_anchor 0x0 -+int attr statusBarBackground 0x0 -+int attr subMenuArrow 0x0 -+int attr submitBackground 0x0 -+int attr subtitle 0x0 -+int attr subtitleTextAppearance 0x0 -+int attr subtitleTextColor 0x0 -+int attr subtitleTextStyle 0x0 -+int attr suggestionRowLayout 0x0 -+int attr switchMinWidth 0x0 -+int attr switchPadding 0x0 -+int attr switchStyle 0x0 -+int attr switchTextAppearance 0x0 -+int attr textAllCaps 0x0 -+int attr textAppearanceLargePopupMenu 0x0 -+int attr textAppearanceListItem 0x0 -+int attr textAppearanceListItemSecondary 0x0 -+int attr textAppearanceListItemSmall 0x0 -+int attr textAppearancePopupMenuHeader 0x0 -+int attr textAppearanceSearchResultSubtitle 0x0 -+int attr textAppearanceSearchResultTitle 0x0 -+int attr textAppearanceSmallPopupMenu 0x0 -+int attr textColorAlertDialogListItem 0x0 -+int attr textColorSearchUrl 0x0 -+int attr theme 0x0 -+int attr thickness 0x0 -+int attr thumbTextPadding 0x0 -+int attr thumbTint 0x0 -+int attr thumbTintMode 0x0 -+int attr tickMark 0x0 -+int attr tickMarkTint 0x0 -+int attr tickMarkTintMode 0x0 -+int attr tint 0x0 -+int attr tintMode 0x0 -+int attr title 0x0 -+int attr titleMargin 0x0 -+int attr titleMarginBottom 0x0 -+int attr titleMarginEnd 0x0 -+int attr titleMarginStart 0x0 -+int attr titleMarginTop 0x0 -+int attr titleMargins 0x0 -+int attr titleTextAppearance 0x0 -+int attr titleTextColor 0x0 -+int attr titleTextStyle 0x0 -+int attr toolbarNavigationButtonStyle 0x0 -+int attr toolbarStyle 0x0 -+int attr tooltipForegroundColor 0x0 -+int attr tooltipFrameBackground 0x0 -+int attr tooltipText 0x0 -+int attr track 0x0 -+int attr trackTint 0x0 -+int attr trackTintMode 0x0 -+int attr ttcIndex 0x0 -+int attr viewAspectRatio 0x0 -+int attr viewInflaterClass 0x0 -+int attr voiceIcon 0x0 -+int attr windowActionBar 0x0 -+int attr windowActionBarOverlay 0x0 -+int attr windowActionModeOverlay 0x0 -+int attr windowFixedHeightMajor 0x0 -+int attr windowFixedHeightMinor 0x0 -+int attr windowFixedWidthMajor 0x0 -+int attr windowFixedWidthMinor 0x0 -+int attr windowMinWidthMajor 0x0 -+int attr windowMinWidthMinor 0x0 -+int attr windowNoTitle 0x0 -+int bool abc_action_bar_embed_tabs 0x0 -+int bool abc_allow_stacked_button_bar 0x0 -+int bool abc_config_actionMenuItemAllCaps 0x0 -+int color abc_background_cache_hint_selector_material_dark 0x0 -+int color abc_background_cache_hint_selector_material_light 0x0 -+int color abc_btn_colored_borderless_text_material 0x0 -+int color abc_btn_colored_text_material 0x0 -+int color abc_color_highlight_material 0x0 -+int color abc_hint_foreground_material_dark 0x0 -+int color abc_hint_foreground_material_light 0x0 -+int color abc_input_method_navigation_guard 0x0 -+int color abc_primary_text_disable_only_material_dark 0x0 -+int color abc_primary_text_disable_only_material_light 0x0 -+int color abc_primary_text_material_dark 0x0 -+int color abc_primary_text_material_light 0x0 -+int color abc_search_url_text 0x0 -+int color abc_search_url_text_normal 0x0 -+int color abc_search_url_text_pressed 0x0 -+int color abc_search_url_text_selected 0x0 -+int color abc_secondary_text_material_dark 0x0 -+int color abc_secondary_text_material_light 0x0 -+int color abc_tint_btn_checkable 0x0 -+int color abc_tint_default 0x0 -+int color abc_tint_edittext 0x0 -+int color abc_tint_seek_thumb 0x0 -+int color abc_tint_spinner 0x0 -+int color abc_tint_switch_track 0x0 -+int color accent_material_dark 0x0 -+int color accent_material_light 0x0 -+int color background_floating_material_dark 0x0 -+int color background_floating_material_light 0x0 -+int color background_material_dark 0x0 -+int color background_material_light 0x0 -+int color bright_foreground_disabled_material_dark 0x0 -+int color bright_foreground_disabled_material_light 0x0 -+int color bright_foreground_inverse_material_dark 0x0 -+int color bright_foreground_inverse_material_light 0x0 -+int color bright_foreground_material_dark 0x0 -+int color bright_foreground_material_light 0x0 -+int color button_material_dark 0x0 -+int color button_material_light 0x0 -+int color catalyst_logbox_background 0x0 -+int color catalyst_redbox_background 0x0 -+int color dim_foreground_disabled_material_dark 0x0 -+int color dim_foreground_disabled_material_light 0x0 -+int color dim_foreground_material_dark 0x0 -+int color dim_foreground_material_light 0x0 -+int color error_color_material_dark 0x0 -+int color error_color_material_light 0x0 -+int color foreground_material_dark 0x0 -+int color foreground_material_light 0x0 -+int color highlighted_text_material_dark 0x0 -+int color highlighted_text_material_light 0x0 -+int color material_blue_grey_800 0x0 -+int color material_blue_grey_900 0x0 -+int color material_blue_grey_950 0x0 -+int color material_deep_teal_200 0x0 -+int color material_deep_teal_500 0x0 -+int color material_grey_100 0x0 -+int color material_grey_300 0x0 -+int color material_grey_50 0x0 -+int color material_grey_600 0x0 -+int color material_grey_800 0x0 -+int color material_grey_850 0x0 -+int color material_grey_900 0x0 -+int color notification_action_color_filter 0x0 -+int color notification_icon_bg_color 0x0 -+int color primary_dark_material_dark 0x0 -+int color primary_dark_material_light 0x0 -+int color primary_material_dark 0x0 -+int color primary_material_light 0x0 -+int color primary_text_default_material_dark 0x0 -+int color primary_text_default_material_light 0x0 -+int color primary_text_disabled_material_dark 0x0 -+int color primary_text_disabled_material_light 0x0 -+int color ripple_material_dark 0x0 -+int color ripple_material_light 0x0 -+int color secondary_text_default_material_dark 0x0 -+int color secondary_text_default_material_light 0x0 -+int color secondary_text_disabled_material_dark 0x0 -+int color secondary_text_disabled_material_light 0x0 -+int color switch_thumb_disabled_material_dark 0x0 -+int color switch_thumb_disabled_material_light 0x0 -+int color switch_thumb_material_dark 0x0 -+int color switch_thumb_material_light 0x0 -+int color switch_thumb_normal_material_dark 0x0 -+int color switch_thumb_normal_material_light 0x0 -+int color tooltip_background_dark 0x0 -+int color tooltip_background_light 0x0 -+int dimen abc_action_bar_content_inset_material 0x0 -+int dimen abc_action_bar_content_inset_with_nav 0x0 -+int dimen abc_action_bar_default_height_material 0x0 -+int dimen abc_action_bar_default_padding_end_material 0x0 -+int dimen abc_action_bar_default_padding_start_material 0x0 -+int dimen abc_action_bar_elevation_material 0x0 -+int dimen abc_action_bar_icon_vertical_padding_material 0x0 -+int dimen abc_action_bar_overflow_padding_end_material 0x0 -+int dimen abc_action_bar_overflow_padding_start_material 0x0 -+int dimen abc_action_bar_stacked_max_height 0x0 -+int dimen abc_action_bar_stacked_tab_max_width 0x0 -+int dimen abc_action_bar_subtitle_bottom_margin_material 0x0 -+int dimen abc_action_bar_subtitle_top_margin_material 0x0 -+int dimen abc_action_button_min_height_material 0x0 -+int dimen abc_action_button_min_width_material 0x0 -+int dimen abc_action_button_min_width_overflow_material 0x0 -+int dimen abc_alert_dialog_button_bar_height 0x0 -+int dimen abc_alert_dialog_button_dimen 0x0 -+int dimen abc_button_inset_horizontal_material 0x0 -+int dimen abc_button_inset_vertical_material 0x0 -+int dimen abc_button_padding_horizontal_material 0x0 -+int dimen abc_button_padding_vertical_material 0x0 -+int dimen abc_cascading_menus_min_smallest_width 0x0 -+int dimen abc_config_prefDialogWidth 0x0 -+int dimen abc_control_corner_material 0x0 -+int dimen abc_control_inset_material 0x0 -+int dimen abc_control_padding_material 0x0 -+int dimen abc_dialog_corner_radius_material 0x0 -+int dimen abc_dialog_fixed_height_major 0x0 -+int dimen abc_dialog_fixed_height_minor 0x0 -+int dimen abc_dialog_fixed_width_major 0x0 -+int dimen abc_dialog_fixed_width_minor 0x0 -+int dimen abc_dialog_list_padding_bottom_no_buttons 0x0 -+int dimen abc_dialog_list_padding_top_no_title 0x0 -+int dimen abc_dialog_min_width_major 0x0 -+int dimen abc_dialog_min_width_minor 0x0 -+int dimen abc_dialog_padding_material 0x0 -+int dimen abc_dialog_padding_top_material 0x0 -+int dimen abc_dialog_title_divider_material 0x0 -+int dimen abc_disabled_alpha_material_dark 0x0 -+int dimen abc_disabled_alpha_material_light 0x0 -+int dimen abc_dropdownitem_icon_width 0x0 -+int dimen abc_dropdownitem_text_padding_left 0x0 -+int dimen abc_dropdownitem_text_padding_right 0x0 -+int dimen abc_edit_text_inset_bottom_material 0x0 -+int dimen abc_edit_text_inset_horizontal_material 0x0 -+int dimen abc_edit_text_inset_top_material 0x0 -+int dimen abc_floating_window_z 0x0 -+int dimen abc_list_item_padding_horizontal_material 0x0 -+int dimen abc_panel_menu_list_width 0x0 -+int dimen abc_progress_bar_height_material 0x0 -+int dimen abc_search_view_preferred_height 0x0 -+int dimen abc_search_view_preferred_width 0x0 -+int dimen abc_seekbar_track_background_height_material 0x0 -+int dimen abc_seekbar_track_progress_height_material 0x0 -+int dimen abc_select_dialog_padding_start_material 0x0 -+int dimen abc_switch_padding 0x0 -+int dimen abc_text_size_body_1_material 0x0 -+int dimen abc_text_size_body_2_material 0x0 -+int dimen abc_text_size_button_material 0x0 -+int dimen abc_text_size_caption_material 0x0 -+int dimen abc_text_size_display_1_material 0x0 -+int dimen abc_text_size_display_2_material 0x0 -+int dimen abc_text_size_display_3_material 0x0 -+int dimen abc_text_size_display_4_material 0x0 -+int dimen abc_text_size_headline_material 0x0 -+int dimen abc_text_size_large_material 0x0 -+int dimen abc_text_size_medium_material 0x0 -+int dimen abc_text_size_menu_header_material 0x0 -+int dimen abc_text_size_menu_material 0x0 -+int dimen abc_text_size_small_material 0x0 -+int dimen abc_text_size_subhead_material 0x0 -+int dimen abc_text_size_subtitle_material_toolbar 0x0 -+int dimen abc_text_size_title_material 0x0 -+int dimen abc_text_size_title_material_toolbar 0x0 -+int dimen compat_button_inset_horizontal_material 0x0 -+int dimen compat_button_inset_vertical_material 0x0 -+int dimen compat_button_padding_horizontal_material 0x0 -+int dimen compat_button_padding_vertical_material 0x0 -+int dimen compat_control_corner_material 0x0 -+int dimen compat_notification_large_icon_max_height 0x0 -+int dimen compat_notification_large_icon_max_width 0x0 -+int dimen disabled_alpha_material_dark 0x0 -+int dimen disabled_alpha_material_light 0x0 -+int dimen highlight_alpha_material_colored 0x0 -+int dimen highlight_alpha_material_dark 0x0 -+int dimen highlight_alpha_material_light 0x0 -+int dimen hint_alpha_material_dark 0x0 -+int dimen hint_alpha_material_light 0x0 -+int dimen hint_pressed_alpha_material_dark 0x0 -+int dimen hint_pressed_alpha_material_light 0x0 -+int dimen notification_action_icon_size 0x0 -+int dimen notification_action_text_size 0x0 -+int dimen notification_big_circle_margin 0x0 -+int dimen notification_content_margin_start 0x0 -+int dimen notification_large_icon_height 0x0 -+int dimen notification_large_icon_width 0x0 -+int dimen notification_main_column_padding_top 0x0 -+int dimen notification_media_narrow_margin 0x0 -+int dimen notification_right_icon_size 0x0 -+int dimen notification_right_side_padding_top 0x0 -+int dimen notification_small_icon_background_padding 0x0 -+int dimen notification_small_icon_size_as_large 0x0 -+int dimen notification_subtext_size 0x0 -+int dimen notification_top_pad 0x0 -+int dimen notification_top_pad_large_text 0x0 -+int dimen tooltip_corner_radius 0x0 -+int dimen tooltip_horizontal_padding 0x0 -+int dimen tooltip_margin 0x0 -+int dimen tooltip_precise_anchor_extra_offset 0x0 -+int dimen tooltip_precise_anchor_threshold 0x0 -+int dimen tooltip_vertical_padding 0x0 -+int dimen tooltip_y_offset_non_touch 0x0 -+int dimen tooltip_y_offset_touch 0x0 -+int drawable abc_ab_share_pack_mtrl_alpha 0x0 -+int drawable abc_action_bar_item_background_material 0x0 -+int drawable abc_btn_borderless_material 0x0 -+int drawable abc_btn_check_material 0x0 -+int drawable abc_btn_check_to_on_mtrl_000 0x0 -+int drawable abc_btn_check_to_on_mtrl_015 0x0 -+int drawable abc_btn_colored_material 0x0 -+int drawable abc_btn_default_mtrl_shape 0x0 -+int drawable abc_btn_radio_material 0x0 -+int drawable abc_btn_radio_to_on_mtrl_000 0x0 -+int drawable abc_btn_radio_to_on_mtrl_015 0x0 -+int drawable abc_btn_switch_to_on_mtrl_00001 0x0 -+int drawable abc_btn_switch_to_on_mtrl_00012 0x0 -+int drawable abc_cab_background_internal_bg 0x0 -+int drawable abc_cab_background_top_material 0x0 -+int drawable abc_cab_background_top_mtrl_alpha 0x0 -+int drawable abc_control_background_material 0x0 -+int drawable abc_dialog_material_background 0x0 -+int drawable abc_edit_text_material 0x0 -+int drawable abc_ic_ab_back_material 0x0 -+int drawable abc_ic_arrow_drop_right_black_24dp 0x0 -+int drawable abc_ic_clear_material 0x0 -+int drawable abc_ic_commit_search_api_mtrl_alpha 0x0 -+int drawable abc_ic_go_search_api_material 0x0 -+int drawable abc_ic_menu_copy_mtrl_am_alpha 0x0 -+int drawable abc_ic_menu_cut_mtrl_alpha 0x0 -+int drawable abc_ic_menu_overflow_material 0x0 -+int drawable abc_ic_menu_paste_mtrl_am_alpha 0x0 -+int drawable abc_ic_menu_selectall_mtrl_alpha 0x0 -+int drawable abc_ic_menu_share_mtrl_alpha 0x0 -+int drawable abc_ic_search_api_material 0x0 -+int drawable abc_ic_star_black_16dp 0x0 -+int drawable abc_ic_star_black_36dp 0x0 -+int drawable abc_ic_star_black_48dp 0x0 -+int drawable abc_ic_star_half_black_16dp 0x0 -+int drawable abc_ic_star_half_black_36dp 0x0 -+int drawable abc_ic_star_half_black_48dp 0x0 -+int drawable abc_ic_voice_search_api_material 0x0 -+int drawable abc_item_background_holo_dark 0x0 -+int drawable abc_item_background_holo_light 0x0 -+int drawable abc_list_divider_material 0x0 -+int drawable abc_list_divider_mtrl_alpha 0x0 -+int drawable abc_list_focused_holo 0x0 -+int drawable abc_list_longpressed_holo 0x0 -+int drawable abc_list_pressed_holo_dark 0x0 -+int drawable abc_list_pressed_holo_light 0x0 -+int drawable abc_list_selector_background_transition_holo_dark 0x0 -+int drawable abc_list_selector_background_transition_holo_light 0x0 -+int drawable abc_list_selector_disabled_holo_dark 0x0 -+int drawable abc_list_selector_disabled_holo_light 0x0 -+int drawable abc_list_selector_holo_dark 0x0 -+int drawable abc_list_selector_holo_light 0x0 -+int drawable abc_menu_hardkey_panel_mtrl_mult 0x0 -+int drawable abc_popup_background_mtrl_mult 0x0 -+int drawable abc_ratingbar_indicator_material 0x0 -+int drawable abc_ratingbar_material 0x0 -+int drawable abc_ratingbar_small_material 0x0 -+int drawable abc_scrubber_control_off_mtrl_alpha 0x0 -+int drawable abc_scrubber_control_to_pressed_mtrl_000 0x0 -+int drawable abc_scrubber_control_to_pressed_mtrl_005 0x0 -+int drawable abc_scrubber_primary_mtrl_alpha 0x0 -+int drawable abc_scrubber_track_mtrl_alpha 0x0 -+int drawable abc_seekbar_thumb_material 0x0 -+int drawable abc_seekbar_tick_mark_material 0x0 -+int drawable abc_seekbar_track_material 0x0 -+int drawable abc_spinner_mtrl_am_alpha 0x0 -+int drawable abc_spinner_textfield_background_material 0x0 -+int drawable abc_switch_thumb_material 0x0 -+int drawable abc_switch_track_mtrl_alpha 0x0 -+int drawable abc_tab_indicator_material 0x0 -+int drawable abc_tab_indicator_mtrl_alpha 0x0 -+int drawable abc_text_cursor_material 0x0 -+int drawable abc_text_select_handle_left_mtrl_dark 0x0 -+int drawable abc_text_select_handle_left_mtrl_light 0x0 -+int drawable abc_text_select_handle_middle_mtrl_dark 0x0 -+int drawable abc_text_select_handle_middle_mtrl_light 0x0 -+int drawable abc_text_select_handle_right_mtrl_dark 0x0 -+int drawable abc_text_select_handle_right_mtrl_light 0x0 -+int drawable abc_textfield_activated_mtrl_alpha 0x0 -+int drawable abc_textfield_default_mtrl_alpha 0x0 -+int drawable abc_textfield_search_activated_mtrl_alpha 0x0 -+int drawable abc_textfield_search_default_mtrl_alpha 0x0 -+int drawable abc_textfield_search_material 0x0 -+int drawable abc_vector_test 0x0 -+int drawable notification_action_background 0x0 -+int drawable notification_bg 0x0 -+int drawable notification_bg_low 0x0 -+int drawable notification_bg_low_normal 0x0 -+int drawable notification_bg_low_pressed 0x0 -+int drawable notification_bg_normal 0x0 -+int drawable notification_bg_normal_pressed 0x0 -+int drawable notification_icon_background 0x0 -+int drawable notification_template_icon_bg 0x0 -+int drawable notification_template_icon_low_bg 0x0 -+int drawable notification_tile_bg 0x0 -+int drawable notify_panel_notification_icon_bg 0x0 -+int drawable redbox_top_border_background 0x0 -+int drawable tooltip_frame_dark 0x0 -+int drawable tooltip_frame_light 0x0 -+int id accessibility_actions 0x0 -+int id accessibility_hint 0x0 -+int id accessibility_label 0x0 -+int id accessibility_role 0x0 -+int id accessibility_state 0x0 -+int id accessibility_value 0x0 -+int id action_bar 0x0 -+int id action_bar_activity_content 0x0 -+int id action_bar_container 0x0 -+int id action_bar_root 0x0 -+int id action_bar_spinner 0x0 -+int id action_bar_subtitle 0x0 -+int id action_bar_title 0x0 -+int id action_container 0x0 -+int id action_context_bar 0x0 -+int id action_divider 0x0 -+int id action_image 0x0 -+int id action_menu_divider 0x0 -+int id action_menu_presenter 0x0 -+int id action_mode_bar 0x0 -+int id action_mode_bar_stub 0x0 -+int id action_mode_close_button 0x0 -+int id action_text 0x0 -+int id actions 0x0 -+int id activity_chooser_view_content 0x0 -+int id add 0x0 -+int id alertTitle 0x0 -+int id async 0x0 -+int id blocking 0x0 -+int id bottom 0x0 -+int id buttonPanel 0x0 -+int id catalyst_redbox_title 0x0 -+int id center 0x0 -+int id centerCrop 0x0 -+int id centerInside 0x0 -+int id checkbox 0x0 -+int id chronometer 0x0 -+int id content 0x0 -+int id contentPanel 0x0 -+int id custom 0x0 -+int id customPanel 0x0 -+int id decor_content_parent 0x0 -+int id default_activity_button 0x0 -+int id edit_query 0x0 -+int id end 0x0 -+int id expand_activities_button 0x0 -+int id expanded_menu 0x0 -+int id fitBottomStart 0x0 -+int id fitCenter 0x0 -+int id fitEnd 0x0 -+int id fitStart 0x0 -+int id fitXY 0x0 -+int id focusCrop 0x0 -+int id forever 0x0 -+int id fps_text 0x0 -+int id group_divider 0x0 -+int id home 0x0 -+int id icon 0x0 -+int id icon_group 0x0 -+int id image 0x0 -+int id info 0x0 -+int id italic 0x0 -+int id left 0x0 -+int id line1 0x0 -+int id line3 0x0 -+int id listMode 0x0 -+int id list_item 0x0 -+int id message 0x0 -+int id multiply 0x0 -+int id none 0x0 -+int id normal 0x0 -+int id notification_background 0x0 -+int id notification_main_column 0x0 -+int id notification_main_column_container 0x0 -+int id parentPanel 0x0 -+int id progress_circular 0x0 -+int id progress_horizontal 0x0 -+int id radio 0x0 -+int id react_test_id 0x0 -+int id right 0x0 -+int id right_icon 0x0 -+int id right_side 0x0 -+int id rn_frame_file 0x0 -+int id rn_frame_method 0x0 -+int id rn_redbox_dismiss_button 0x0 -+int id rn_redbox_line_separator 0x0 -+int id rn_redbox_loading_indicator 0x0 -+int id rn_redbox_reload_button 0x0 -+int id rn_redbox_report_button 0x0 -+int id rn_redbox_report_label 0x0 -+int id rn_redbox_stack 0x0 -+int id screen 0x0 -+int id scrollIndicatorDown 0x0 -+int id scrollIndicatorUp 0x0 -+int id scrollView 0x0 -+int id search_badge 0x0 -+int id search_bar 0x0 -+int id search_button 0x0 -+int id search_close_btn 0x0 -+int id search_edit_frame 0x0 -+int id search_go_btn 0x0 -+int id search_mag_icon 0x0 -+int id search_plate 0x0 -+int id search_src_text 0x0 -+int id search_voice_btn 0x0 -+int id select_dialog_listview 0x0 -+int id shortcut 0x0 -+int id spacer 0x0 -+int id split_action_bar 0x0 -+int id src_atop 0x0 -+int id src_in 0x0 -+int id src_over 0x0 -+int id start 0x0 -+int id submenuarrow 0x0 -+int id submit_area 0x0 -+int id tabMode 0x0 -+int id tag_transition_group 0x0 -+int id tag_unhandled_key_event_manager 0x0 -+int id tag_unhandled_key_listeners 0x0 -+int id text 0x0 -+int id text2 0x0 -+int id textSpacerNoButtons 0x0 -+int id textSpacerNoTitle 0x0 -+int id time 0x0 -+int id title 0x0 -+int id titleDividerNoCustom 0x0 -+int id title_template 0x0 -+int id top 0x0 -+int id topPanel 0x0 -+int id uniform 0x0 -+int id up 0x0 -+int id view_tag_instance_handle 0x0 -+int id view_tag_native_id 0x0 -+int id wrap_content 0x0 -+int integer abc_config_activityDefaultDur 0x0 -+int integer abc_config_activityShortDur 0x0 -+int integer cancel_button_image_alpha 0x0 -+int integer config_tooltipAnimTime 0x0 -+int integer react_native_dev_server_port 0x0 -+int integer react_native_inspector_proxy_port 0x0 -+int integer status_bar_notification_info_maxnum 0x0 -+int layout abc_action_bar_title_item 0x0 -+int layout abc_action_bar_up_container 0x0 -+int layout abc_action_menu_item_layout 0x0 -+int layout abc_action_menu_layout 0x0 -+int layout abc_action_mode_bar 0x0 -+int layout abc_action_mode_close_item_material 0x0 -+int layout abc_activity_chooser_view 0x0 -+int layout abc_activity_chooser_view_list_item 0x0 -+int layout abc_alert_dialog_button_bar_material 0x0 -+int layout abc_alert_dialog_material 0x0 -+int layout abc_alert_dialog_title_material 0x0 -+int layout abc_cascading_menu_item_layout 0x0 -+int layout abc_dialog_title_material 0x0 -+int layout abc_expanded_menu_layout 0x0 -+int layout abc_list_menu_item_checkbox 0x0 -+int layout abc_list_menu_item_icon 0x0 -+int layout abc_list_menu_item_layout 0x0 -+int layout abc_list_menu_item_radio 0x0 -+int layout abc_popup_menu_header_item_layout 0x0 -+int layout abc_popup_menu_item_layout 0x0 -+int layout abc_screen_content_include 0x0 -+int layout abc_screen_simple 0x0 -+int layout abc_screen_simple_overlay_action_mode 0x0 -+int layout abc_screen_toolbar 0x0 -+int layout abc_search_dropdown_item_icons_2line 0x0 -+int layout abc_search_view 0x0 -+int layout abc_select_dialog_material 0x0 -+int layout abc_tooltip 0x0 -+int layout dev_loading_view 0x0 -+int layout fps_view 0x0 -+int layout notification_action 0x0 -+int layout notification_action_tombstone 0x0 -+int layout notification_template_custom_big 0x0 -+int layout notification_template_icon_group 0x0 -+int layout notification_template_part_chronometer 0x0 -+int layout notification_template_part_time 0x0 -+int layout redbox_item_frame 0x0 -+int layout redbox_item_title 0x0 -+int layout redbox_view 0x0 -+int layout select_dialog_item_material 0x0 -+int layout select_dialog_multichoice_material 0x0 -+int layout select_dialog_singlechoice_material 0x0 -+int layout support_simple_spinner_dropdown_item 0x0 -+int string abc_action_bar_home_description 0x0 -+int string abc_action_bar_up_description 0x0 -+int string abc_action_menu_overflow_description 0x0 -+int string abc_action_mode_done 0x0 -+int string abc_activity_chooser_view_see_all 0x0 -+int string abc_activitychooserview_choose_application 0x0 -+int string abc_capital_off 0x0 -+int string abc_capital_on 0x0 -+int string abc_font_family_body_1_material 0x0 -+int string abc_font_family_body_2_material 0x0 -+int string abc_font_family_button_material 0x0 -+int string abc_font_family_caption_material 0x0 -+int string abc_font_family_display_1_material 0x0 -+int string abc_font_family_display_2_material 0x0 -+int string abc_font_family_display_3_material 0x0 -+int string abc_font_family_display_4_material 0x0 -+int string abc_font_family_headline_material 0x0 -+int string abc_font_family_menu_material 0x0 -+int string abc_font_family_subhead_material 0x0 -+int string abc_font_family_title_material 0x0 -+int string abc_menu_alt_shortcut_label 0x0 -+int string abc_menu_ctrl_shortcut_label 0x0 -+int string abc_menu_delete_shortcut_label 0x0 -+int string abc_menu_enter_shortcut_label 0x0 -+int string abc_menu_function_shortcut_label 0x0 -+int string abc_menu_meta_shortcut_label 0x0 -+int string abc_menu_shift_shortcut_label 0x0 -+int string abc_menu_space_shortcut_label 0x0 -+int string abc_menu_sym_shortcut_label 0x0 -+int string abc_prepend_shortcut_label 0x0 -+int string abc_search_hint 0x0 -+int string abc_searchview_description_clear 0x0 -+int string abc_searchview_description_query 0x0 -+int string abc_searchview_description_search 0x0 -+int string abc_searchview_description_submit 0x0 -+int string abc_searchview_description_voice 0x0 -+int string abc_shareactionprovider_share_with 0x0 -+int string abc_shareactionprovider_share_with_application 0x0 -+int string abc_toolbar_collapse_description 0x0 -+int string alert_description 0x0 -+int string button_description 0x0 -+int string catalyst_change_bundle_location 0x0 -+int string catalyst_copy_button 0x0 -+int string catalyst_debug 0x0 -+int string catalyst_debug_chrome 0x0 -+int string catalyst_debug_chrome_stop 0x0 -+int string catalyst_debug_connecting 0x0 -+int string catalyst_debug_error 0x0 -+int string catalyst_debug_nuclide 0x0 -+int string catalyst_debug_nuclide_error 0x0 -+int string catalyst_debug_stop 0x0 -+int string catalyst_dismiss_button 0x0 -+int string catalyst_heap_capture 0x0 -+int string catalyst_hot_reloading 0x0 -+int string catalyst_hot_reloading_auto_disable 0x0 -+int string catalyst_hot_reloading_auto_enable 0x0 -+int string catalyst_hot_reloading_stop 0x0 -+int string catalyst_inspector 0x0 -+int string catalyst_loading_from_url 0x0 -+int string catalyst_perf_monitor 0x0 -+int string catalyst_perf_monitor_stop 0x0 -+int string catalyst_reload 0x0 -+int string catalyst_reload_button 0x0 -+int string catalyst_reload_error 0x0 -+int string catalyst_report_button 0x0 -+int string catalyst_sample_profiler_disable 0x0 -+int string catalyst_sample_profiler_enable 0x0 -+int string catalyst_settings 0x0 -+int string catalyst_settings_title 0x0 -+int string combobox_description 0x0 -+int string header_description 0x0 -+int string image_description 0x0 -+int string imagebutton_description 0x0 -+int string link_description 0x0 -+int string menu_description 0x0 -+int string menubar_description 0x0 -+int string menuitem_description 0x0 -+int string progressbar_description 0x0 -+int string radiogroup_description 0x0 -+int string rn_tab_description 0x0 -+int string scrollbar_description 0x0 -+int string search_description 0x0 -+int string search_menu_title 0x0 -+int string spinbutton_description 0x0 -+int string state_busy_description 0x0 -+int string state_collapsed_description 0x0 -+int string state_expanded_description 0x0 -+int string state_mixed_description 0x0 -+int string state_off_description 0x0 -+int string state_on_description 0x0 -+int string status_bar_notification_info_overflow 0x0 -+int string summary_description 0x0 -+int string tablist_description 0x0 -+int string timer_description 0x0 -+int string toolbar_description 0x0 -+int style AlertDialog_AppCompat 0x0 -+int style AlertDialog_AppCompat_Light 0x0 -+int style Animation_AppCompat_Dialog 0x0 -+int style Animation_AppCompat_DropDownUp 0x0 -+int style Animation_AppCompat_Tooltip 0x0 -+int style Animation_Catalyst_LogBox 0x0 -+int style Animation_Catalyst_RedBox 0x0 -+int style Base_AlertDialog_AppCompat 0x0 -+int style Base_AlertDialog_AppCompat_Light 0x0 -+int style Base_Animation_AppCompat_Dialog 0x0 -+int style Base_Animation_AppCompat_DropDownUp 0x0 -+int style Base_Animation_AppCompat_Tooltip 0x0 -+int style Base_DialogWindowTitleBackground_AppCompat 0x0 -+int style Base_DialogWindowTitle_AppCompat 0x0 -+int style Base_TextAppearance_AppCompat 0x0 -+int style Base_TextAppearance_AppCompat_Body1 0x0 -+int style Base_TextAppearance_AppCompat_Body2 0x0 -+int style Base_TextAppearance_AppCompat_Button 0x0 -+int style Base_TextAppearance_AppCompat_Caption 0x0 -+int style Base_TextAppearance_AppCompat_Display1 0x0 -+int style Base_TextAppearance_AppCompat_Display2 0x0 -+int style Base_TextAppearance_AppCompat_Display3 0x0 -+int style Base_TextAppearance_AppCompat_Display4 0x0 -+int style Base_TextAppearance_AppCompat_Headline 0x0 -+int style Base_TextAppearance_AppCompat_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Large 0x0 -+int style Base_TextAppearance_AppCompat_Large_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0 -+int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0 -+int style Base_TextAppearance_AppCompat_Medium 0x0 -+int style Base_TextAppearance_AppCompat_Medium_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Menu 0x0 -+int style Base_TextAppearance_AppCompat_SearchResult 0x0 -+int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x0 -+int style Base_TextAppearance_AppCompat_SearchResult_Title 0x0 -+int style Base_TextAppearance_AppCompat_Small 0x0 -+int style Base_TextAppearance_AppCompat_Small_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Subhead 0x0 -+int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Title 0x0 -+int style Base_TextAppearance_AppCompat_Title_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Tooltip 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0 -+int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x0 -+int style Base_TextAppearance_AppCompat_Widget_Button 0x0 -+int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0 -+int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x0 -+int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x0 -+int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x0 -+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0 -+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0 -+int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0 -+int style Base_TextAppearance_AppCompat_Widget_Switch 0x0 -+int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0 -+int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0 -+int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0 -+int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x0 -+int style Base_ThemeOverlay_AppCompat 0x0 -+int style Base_ThemeOverlay_AppCompat_ActionBar 0x0 -+int style Base_ThemeOverlay_AppCompat_Dark 0x0 -+int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x0 -+int style Base_ThemeOverlay_AppCompat_Dialog 0x0 -+int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x0 -+int style Base_ThemeOverlay_AppCompat_Light 0x0 -+int style Base_Theme_AppCompat 0x0 -+int style Base_Theme_AppCompat_CompactMenu 0x0 -+int style Base_Theme_AppCompat_Dialog 0x0 -+int style Base_Theme_AppCompat_DialogWhenLarge 0x0 -+int style Base_Theme_AppCompat_Dialog_Alert 0x0 -+int style Base_Theme_AppCompat_Dialog_FixedSize 0x0 -+int style Base_Theme_AppCompat_Dialog_MinWidth 0x0 -+int style Base_Theme_AppCompat_Light 0x0 -+int style Base_Theme_AppCompat_Light_DarkActionBar 0x0 -+int style Base_Theme_AppCompat_Light_Dialog 0x0 -+int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x0 -+int style Base_Theme_AppCompat_Light_Dialog_Alert 0x0 -+int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x0 -+int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x0 -+int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x0 -+int style Base_V21_Theme_AppCompat 0x0 -+int style Base_V21_Theme_AppCompat_Dialog 0x0 -+int style Base_V21_Theme_AppCompat_Light 0x0 -+int style Base_V21_Theme_AppCompat_Light_Dialog 0x0 -+int style Base_V22_Theme_AppCompat 0x0 -+int style Base_V22_Theme_AppCompat_Light 0x0 -+int style Base_V23_Theme_AppCompat 0x0 -+int style Base_V23_Theme_AppCompat_Light 0x0 -+int style Base_V26_Theme_AppCompat 0x0 -+int style Base_V26_Theme_AppCompat_Light 0x0 -+int style Base_V26_Widget_AppCompat_Toolbar 0x0 -+int style Base_V28_Theme_AppCompat 0x0 -+int style Base_V28_Theme_AppCompat_Light 0x0 -+int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x0 -+int style Base_V7_Theme_AppCompat 0x0 -+int style Base_V7_Theme_AppCompat_Dialog 0x0 -+int style Base_V7_Theme_AppCompat_Light 0x0 -+int style Base_V7_Theme_AppCompat_Light_Dialog 0x0 -+int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x0 -+int style Base_V7_Widget_AppCompat_EditText 0x0 -+int style Base_V7_Widget_AppCompat_Toolbar 0x0 -+int style Base_Widget_AppCompat_ActionBar 0x0 -+int style Base_Widget_AppCompat_ActionBar_Solid 0x0 -+int style Base_Widget_AppCompat_ActionBar_TabBar 0x0 -+int style Base_Widget_AppCompat_ActionBar_TabText 0x0 -+int style Base_Widget_AppCompat_ActionBar_TabView 0x0 -+int style Base_Widget_AppCompat_ActionButton 0x0 -+int style Base_Widget_AppCompat_ActionButton_CloseMode 0x0 -+int style Base_Widget_AppCompat_ActionButton_Overflow 0x0 -+int style Base_Widget_AppCompat_ActionMode 0x0 -+int style Base_Widget_AppCompat_ActivityChooserView 0x0 -+int style Base_Widget_AppCompat_AutoCompleteTextView 0x0 -+int style Base_Widget_AppCompat_Button 0x0 -+int style Base_Widget_AppCompat_ButtonBar 0x0 -+int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x0 -+int style Base_Widget_AppCompat_Button_Borderless 0x0 -+int style Base_Widget_AppCompat_Button_Borderless_Colored 0x0 -+int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0 -+int style Base_Widget_AppCompat_Button_Colored 0x0 -+int style Base_Widget_AppCompat_Button_Small 0x0 -+int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x0 -+int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x0 -+int style Base_Widget_AppCompat_CompoundButton_Switch 0x0 -+int style Base_Widget_AppCompat_DrawerArrowToggle 0x0 -+int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x0 -+int style Base_Widget_AppCompat_DropDownItem_Spinner 0x0 -+int style Base_Widget_AppCompat_EditText 0x0 -+int style Base_Widget_AppCompat_ImageButton 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0 -+int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x0 -+int style Base_Widget_AppCompat_Light_PopupMenu 0x0 -+int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x0 -+int style Base_Widget_AppCompat_ListMenuView 0x0 -+int style Base_Widget_AppCompat_ListPopupWindow 0x0 -+int style Base_Widget_AppCompat_ListView 0x0 -+int style Base_Widget_AppCompat_ListView_DropDown 0x0 -+int style Base_Widget_AppCompat_ListView_Menu 0x0 -+int style Base_Widget_AppCompat_PopupMenu 0x0 -+int style Base_Widget_AppCompat_PopupMenu_Overflow 0x0 -+int style Base_Widget_AppCompat_PopupWindow 0x0 -+int style Base_Widget_AppCompat_ProgressBar 0x0 -+int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x0 -+int style Base_Widget_AppCompat_RatingBar 0x0 -+int style Base_Widget_AppCompat_RatingBar_Indicator 0x0 -+int style Base_Widget_AppCompat_RatingBar_Small 0x0 -+int style Base_Widget_AppCompat_SearchView 0x0 -+int style Base_Widget_AppCompat_SearchView_ActionBar 0x0 -+int style Base_Widget_AppCompat_SeekBar 0x0 -+int style Base_Widget_AppCompat_SeekBar_Discrete 0x0 -+int style Base_Widget_AppCompat_Spinner 0x0 -+int style Base_Widget_AppCompat_Spinner_Underlined 0x0 -+int style Base_Widget_AppCompat_TextView_SpinnerItem 0x0 -+int style Base_Widget_AppCompat_Toolbar 0x0 -+int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x0 -+int style CalendarDatePickerDialog 0x0 -+int style CalendarDatePickerStyle 0x0 -+int style ClockTimePickerDialog 0x0 -+int style ClockTimePickerStyle 0x0 -+int style DialogAnimationFade 0x0 -+int style DialogAnimationSlide 0x0 -+int style Platform_AppCompat 0x0 -+int style Platform_AppCompat_Light 0x0 -+int style Platform_ThemeOverlay_AppCompat 0x0 -+int style Platform_ThemeOverlay_AppCompat_Dark 0x0 -+int style Platform_ThemeOverlay_AppCompat_Light 0x0 -+int style Platform_V21_AppCompat 0x0 -+int style Platform_V21_AppCompat_Light 0x0 -+int style Platform_V25_AppCompat 0x0 -+int style Platform_V25_AppCompat_Light 0x0 -+int style Platform_Widget_AppCompat_Spinner 0x0 -+int style RtlOverlay_DialogWindowTitle_AppCompat 0x0 -+int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x0 -+int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x0 -+int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x0 -+int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x0 -+int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x0 -+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x0 -+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x0 -+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x0 -+int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x0 -+int style RtlUnderlay_Widget_AppCompat_ActionButton 0x0 -+int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x0 -+int style SpinnerDatePickerDialog 0x0 -+int style SpinnerDatePickerStyle 0x0 -+int style SpinnerTimePickerDialog 0x0 -+int style SpinnerTimePickerStyle 0x0 -+int style TextAppearance_AppCompat 0x0 -+int style TextAppearance_AppCompat_Body1 0x0 -+int style TextAppearance_AppCompat_Body2 0x0 -+int style TextAppearance_AppCompat_Button 0x0 -+int style TextAppearance_AppCompat_Caption 0x0 -+int style TextAppearance_AppCompat_Display1 0x0 -+int style TextAppearance_AppCompat_Display2 0x0 -+int style TextAppearance_AppCompat_Display3 0x0 -+int style TextAppearance_AppCompat_Display4 0x0 -+int style TextAppearance_AppCompat_Headline 0x0 -+int style TextAppearance_AppCompat_Inverse 0x0 -+int style TextAppearance_AppCompat_Large 0x0 -+int style TextAppearance_AppCompat_Large_Inverse 0x0 -+int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x0 -+int style TextAppearance_AppCompat_Light_SearchResult_Title 0x0 -+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0 -+int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0 -+int style TextAppearance_AppCompat_Medium 0x0 -+int style TextAppearance_AppCompat_Medium_Inverse 0x0 -+int style TextAppearance_AppCompat_Menu 0x0 -+int style TextAppearance_AppCompat_SearchResult_Subtitle 0x0 -+int style TextAppearance_AppCompat_SearchResult_Title 0x0 -+int style TextAppearance_AppCompat_Small 0x0 -+int style TextAppearance_AppCompat_Small_Inverse 0x0 -+int style TextAppearance_AppCompat_Subhead 0x0 -+int style TextAppearance_AppCompat_Subhead_Inverse 0x0 -+int style TextAppearance_AppCompat_Title 0x0 -+int style TextAppearance_AppCompat_Title_Inverse 0x0 -+int style TextAppearance_AppCompat_Tooltip 0x0 -+int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0 -+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0 -+int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0 -+int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x0 -+int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0 -+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0 -+int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x0 -+int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x0 -+int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x0 -+int style TextAppearance_AppCompat_Widget_Button 0x0 -+int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0 -+int style TextAppearance_AppCompat_Widget_Button_Colored 0x0 -+int style TextAppearance_AppCompat_Widget_Button_Inverse 0x0 -+int style TextAppearance_AppCompat_Widget_DropDownItem 0x0 -+int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0 -+int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0 -+int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0 -+int style TextAppearance_AppCompat_Widget_Switch 0x0 -+int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0 -+int style TextAppearance_Compat_Notification 0x0 -+int style TextAppearance_Compat_Notification_Info 0x0 -+int style TextAppearance_Compat_Notification_Line2 0x0 -+int style TextAppearance_Compat_Notification_Time 0x0 -+int style TextAppearance_Compat_Notification_Title 0x0 -+int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0 -+int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0 -+int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x0 -+int style Theme 0x0 -+int style ThemeOverlay_AppCompat 0x0 -+int style ThemeOverlay_AppCompat_ActionBar 0x0 -+int style ThemeOverlay_AppCompat_Dark 0x0 -+int style ThemeOverlay_AppCompat_Dark_ActionBar 0x0 -+int style ThemeOverlay_AppCompat_Dialog 0x0 -+int style ThemeOverlay_AppCompat_Dialog_Alert 0x0 -+int style ThemeOverlay_AppCompat_Light 0x0 -+int style Theme_AppCompat 0x0 -+int style Theme_AppCompat_CompactMenu 0x0 -+int style Theme_AppCompat_DayNight 0x0 -+int style Theme_AppCompat_DayNight_DarkActionBar 0x0 -+int style Theme_AppCompat_DayNight_Dialog 0x0 -+int style Theme_AppCompat_DayNight_DialogWhenLarge 0x0 -+int style Theme_AppCompat_DayNight_Dialog_Alert 0x0 -+int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x0 -+int style Theme_AppCompat_DayNight_NoActionBar 0x0 -+int style Theme_AppCompat_Dialog 0x0 -+int style Theme_AppCompat_DialogWhenLarge 0x0 -+int style Theme_AppCompat_Dialog_Alert 0x0 -+int style Theme_AppCompat_Dialog_MinWidth 0x0 -+int style Theme_AppCompat_Light 0x0 -+int style Theme_AppCompat_Light_DarkActionBar 0x0 -+int style Theme_AppCompat_Light_Dialog 0x0 -+int style Theme_AppCompat_Light_DialogWhenLarge 0x0 -+int style Theme_AppCompat_Light_Dialog_Alert 0x0 -+int style Theme_AppCompat_Light_Dialog_MinWidth 0x0 -+int style Theme_AppCompat_Light_NoActionBar 0x0 -+int style Theme_AppCompat_NoActionBar 0x0 -+int style Theme_Catalyst 0x0 -+int style Theme_Catalyst_LogBox 0x0 -+int style Theme_Catalyst_RedBox 0x0 -+int style Theme_FullScreenDialog 0x0 -+int style Theme_FullScreenDialogAnimatedFade 0x0 -+int style Theme_FullScreenDialogAnimatedSlide 0x0 -+int style Theme_ReactNative_AppCompat_Light 0x0 -+int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x0 -+int style Widget_AppCompat_ActionBar 0x0 -+int style Widget_AppCompat_ActionBar_Solid 0x0 -+int style Widget_AppCompat_ActionBar_TabBar 0x0 -+int style Widget_AppCompat_ActionBar_TabText 0x0 -+int style Widget_AppCompat_ActionBar_TabView 0x0 -+int style Widget_AppCompat_ActionButton 0x0 -+int style Widget_AppCompat_ActionButton_CloseMode 0x0 -+int style Widget_AppCompat_ActionButton_Overflow 0x0 -+int style Widget_AppCompat_ActionMode 0x0 -+int style Widget_AppCompat_ActivityChooserView 0x0 -+int style Widget_AppCompat_AutoCompleteTextView 0x0 -+int style Widget_AppCompat_Button 0x0 -+int style Widget_AppCompat_ButtonBar 0x0 -+int style Widget_AppCompat_ButtonBar_AlertDialog 0x0 -+int style Widget_AppCompat_Button_Borderless 0x0 -+int style Widget_AppCompat_Button_Borderless_Colored 0x0 -+int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0 -+int style Widget_AppCompat_Button_Colored 0x0 -+int style Widget_AppCompat_Button_Small 0x0 -+int style Widget_AppCompat_CompoundButton_CheckBox 0x0 -+int style Widget_AppCompat_CompoundButton_RadioButton 0x0 -+int style Widget_AppCompat_CompoundButton_Switch 0x0 -+int style Widget_AppCompat_DrawerArrowToggle 0x0 -+int style Widget_AppCompat_DropDownItem_Spinner 0x0 -+int style Widget_AppCompat_EditText 0x0 -+int style Widget_AppCompat_ImageButton 0x0 -+int style Widget_AppCompat_Light_ActionBar 0x0 -+int style Widget_AppCompat_Light_ActionBar_Solid 0x0 -+int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabBar 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabText 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabView 0x0 -+int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x0 -+int style Widget_AppCompat_Light_ActionButton 0x0 -+int style Widget_AppCompat_Light_ActionButton_CloseMode 0x0 -+int style Widget_AppCompat_Light_ActionButton_Overflow 0x0 -+int style Widget_AppCompat_Light_ActionMode_Inverse 0x0 -+int style Widget_AppCompat_Light_ActivityChooserView 0x0 -+int style Widget_AppCompat_Light_AutoCompleteTextView 0x0 -+int style Widget_AppCompat_Light_DropDownItem_Spinner 0x0 -+int style Widget_AppCompat_Light_ListPopupWindow 0x0 -+int style Widget_AppCompat_Light_ListView_DropDown 0x0 -+int style Widget_AppCompat_Light_PopupMenu 0x0 -+int style Widget_AppCompat_Light_PopupMenu_Overflow 0x0 -+int style Widget_AppCompat_Light_SearchView 0x0 -+int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x0 -+int style Widget_AppCompat_ListMenuView 0x0 -+int style Widget_AppCompat_ListPopupWindow 0x0 -+int style Widget_AppCompat_ListView 0x0 -+int style Widget_AppCompat_ListView_DropDown 0x0 -+int style Widget_AppCompat_ListView_Menu 0x0 -+int style Widget_AppCompat_PopupMenu 0x0 -+int style Widget_AppCompat_PopupMenu_Overflow 0x0 -+int style Widget_AppCompat_PopupWindow 0x0 -+int style Widget_AppCompat_ProgressBar 0x0 -+int style Widget_AppCompat_ProgressBar_Horizontal 0x0 -+int style Widget_AppCompat_RatingBar 0x0 -+int style Widget_AppCompat_RatingBar_Indicator 0x0 -+int style Widget_AppCompat_RatingBar_Small 0x0 -+int style Widget_AppCompat_SearchView 0x0 -+int style Widget_AppCompat_SearchView_ActionBar 0x0 -+int style Widget_AppCompat_SeekBar 0x0 -+int style Widget_AppCompat_SeekBar_Discrete 0x0 -+int style Widget_AppCompat_Spinner 0x0 -+int style Widget_AppCompat_Spinner_DropDown 0x0 -+int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x0 -+int style Widget_AppCompat_Spinner_Underlined 0x0 -+int style Widget_AppCompat_TextView_SpinnerItem 0x0 -+int style Widget_AppCompat_Toolbar 0x0 -+int style Widget_AppCompat_Toolbar_Button_Navigation 0x0 -+int style Widget_Compat_NotificationActionContainer 0x0 -+int style Widget_Compat_NotificationActionText 0x0 -+int style Widget_Support_CoordinatorLayout 0x0 -+int style redboxButton 0x0 -+int[] styleable ActionBar { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable ActionBar_background 0 -+int styleable ActionBar_backgroundSplit 1 -+int styleable ActionBar_backgroundStacked 2 -+int styleable ActionBar_contentInsetEnd 3 -+int styleable ActionBar_contentInsetEndWithActions 4 -+int styleable ActionBar_contentInsetLeft 5 -+int styleable ActionBar_contentInsetRight 6 -+int styleable ActionBar_contentInsetStart 7 -+int styleable ActionBar_contentInsetStartWithNavigation 8 -+int styleable ActionBar_customNavigationLayout 9 -+int styleable ActionBar_displayOptions 10 -+int styleable ActionBar_divider 11 -+int styleable ActionBar_elevation 12 -+int styleable ActionBar_height 13 -+int styleable ActionBar_hideOnContentScroll 14 -+int styleable ActionBar_homeAsUpIndicator 15 -+int styleable ActionBar_homeLayout 16 -+int styleable ActionBar_icon 17 -+int styleable ActionBar_indeterminateProgressStyle 18 -+int styleable ActionBar_itemPadding 19 -+int styleable ActionBar_logo 20 -+int styleable ActionBar_navigationMode 21 -+int styleable ActionBar_popupTheme 22 -+int styleable ActionBar_progressBarPadding 23 -+int styleable ActionBar_progressBarStyle 24 -+int styleable ActionBar_subtitle 25 -+int styleable ActionBar_subtitleTextStyle 26 -+int styleable ActionBar_title 27 -+int styleable ActionBar_titleTextStyle 28 -+int[] styleable ActionBarLayout { 0x10100b3 } -+int styleable ActionBarLayout_android_layout_gravity 0 -+int[] styleable ActionMenuItemView { 0x101013f } -+int styleable ActionMenuItemView_android_minWidth 0 -+int[] styleable ActionMenuView { } -+int[] styleable ActionMode { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable ActionMode_background 0 -+int styleable ActionMode_backgroundSplit 1 -+int styleable ActionMode_closeItemLayout 2 -+int styleable ActionMode_height 3 -+int styleable ActionMode_subtitleTextStyle 4 -+int styleable ActionMode_titleTextStyle 5 -+int[] styleable ActivityChooserView { 0x0, 0x0 } -+int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 -+int styleable ActivityChooserView_initialActivityCount 1 -+int[] styleable AlertDialog { 0x10100f2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable AlertDialog_android_layout 0 -+int styleable AlertDialog_buttonIconDimen 1 -+int styleable AlertDialog_buttonPanelSideLayout 2 -+int styleable AlertDialog_listItemLayout 3 -+int styleable AlertDialog_listLayout 4 -+int styleable AlertDialog_multiChoiceItemLayout 5 -+int styleable AlertDialog_showTitle 6 -+int styleable AlertDialog_singleChoiceItemLayout 7 -+int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } -+int styleable AnimatedStateListDrawableCompat_android_constantSize 0 -+int styleable AnimatedStateListDrawableCompat_android_dither 1 -+int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2 -+int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3 -+int styleable AnimatedStateListDrawableCompat_android_variablePadding 4 -+int styleable AnimatedStateListDrawableCompat_android_visible 5 -+int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 } -+int styleable AnimatedStateListDrawableItem_android_drawable 0 -+int styleable AnimatedStateListDrawableItem_android_id 1 -+int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 } -+int styleable AnimatedStateListDrawableTransition_android_drawable 0 -+int styleable AnimatedStateListDrawableTransition_android_fromId 1 -+int styleable AnimatedStateListDrawableTransition_android_reversible 2 -+int styleable AnimatedStateListDrawableTransition_android_toId 3 -+int[] styleable AppCompatImageView { 0x1010119, 0x0, 0x0, 0x0 } -+int styleable AppCompatImageView_android_src 0 -+int styleable AppCompatImageView_srcCompat 1 -+int styleable AppCompatImageView_tint 2 -+int styleable AppCompatImageView_tintMode 3 -+int[] styleable AppCompatSeekBar { 0x1010142, 0x0, 0x0, 0x0 } -+int styleable AppCompatSeekBar_android_thumb 0 -+int styleable AppCompatSeekBar_tickMark 1 -+int styleable AppCompatSeekBar_tickMarkTint 2 -+int styleable AppCompatSeekBar_tickMarkTintMode 3 -+int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 } -+int styleable AppCompatTextHelper_android_drawableBottom 0 -+int styleable AppCompatTextHelper_android_drawableEnd 1 -+int styleable AppCompatTextHelper_android_drawableLeft 2 -+int styleable AppCompatTextHelper_android_drawableRight 3 -+int styleable AppCompatTextHelper_android_drawableStart 4 -+int styleable AppCompatTextHelper_android_drawableTop 5 -+int styleable AppCompatTextHelper_android_textAppearance 6 -+int[] styleable AppCompatTextView { 0x1010034, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable AppCompatTextView_android_textAppearance 0 -+int styleable AppCompatTextView_autoSizeMaxTextSize 1 -+int styleable AppCompatTextView_autoSizeMinTextSize 2 -+int styleable AppCompatTextView_autoSizePresetSizes 3 -+int styleable AppCompatTextView_autoSizeStepGranularity 4 -+int styleable AppCompatTextView_autoSizeTextType 5 -+int styleable AppCompatTextView_firstBaselineToTopHeight 6 -+int styleable AppCompatTextView_fontFamily 7 -+int styleable AppCompatTextView_lastBaselineToBottomHeight 8 -+int styleable AppCompatTextView_lineHeight 9 -+int styleable AppCompatTextView_textAllCaps 10 -+int[] styleable AppCompatTheme { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10100ae, 0x1010057, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable AppCompatTheme_actionBarDivider 0 -+int styleable AppCompatTheme_actionBarItemBackground 1 -+int styleable AppCompatTheme_actionBarPopupTheme 2 -+int styleable AppCompatTheme_actionBarSize 3 -+int styleable AppCompatTheme_actionBarSplitStyle 4 -+int styleable AppCompatTheme_actionBarStyle 5 -+int styleable AppCompatTheme_actionBarTabBarStyle 6 -+int styleable AppCompatTheme_actionBarTabStyle 7 -+int styleable AppCompatTheme_actionBarTabTextStyle 8 -+int styleable AppCompatTheme_actionBarTheme 9 -+int styleable AppCompatTheme_actionBarWidgetTheme 10 -+int styleable AppCompatTheme_actionButtonStyle 11 -+int styleable AppCompatTheme_actionDropDownStyle 12 -+int styleable AppCompatTheme_actionMenuTextAppearance 13 -+int styleable AppCompatTheme_actionMenuTextColor 14 -+int styleable AppCompatTheme_actionModeBackground 15 -+int styleable AppCompatTheme_actionModeCloseButtonStyle 16 -+int styleable AppCompatTheme_actionModeCloseDrawable 17 -+int styleable AppCompatTheme_actionModeCopyDrawable 18 -+int styleable AppCompatTheme_actionModeCutDrawable 19 -+int styleable AppCompatTheme_actionModeFindDrawable 20 -+int styleable AppCompatTheme_actionModePasteDrawable 21 -+int styleable AppCompatTheme_actionModePopupWindowStyle 22 -+int styleable AppCompatTheme_actionModeSelectAllDrawable 23 -+int styleable AppCompatTheme_actionModeShareDrawable 24 -+int styleable AppCompatTheme_actionModeSplitBackground 25 -+int styleable AppCompatTheme_actionModeStyle 26 -+int styleable AppCompatTheme_actionModeWebSearchDrawable 27 -+int styleable AppCompatTheme_actionOverflowButtonStyle 28 -+int styleable AppCompatTheme_actionOverflowMenuStyle 29 -+int styleable AppCompatTheme_activityChooserViewStyle 30 -+int styleable AppCompatTheme_alertDialogButtonGroupStyle 31 -+int styleable AppCompatTheme_alertDialogCenterButtons 32 -+int styleable AppCompatTheme_alertDialogStyle 33 -+int styleable AppCompatTheme_alertDialogTheme 34 -+int styleable AppCompatTheme_android_windowAnimationStyle 35 -+int styleable AppCompatTheme_android_windowIsFloating 36 -+int styleable AppCompatTheme_autoCompleteTextViewStyle 37 -+int styleable AppCompatTheme_borderlessButtonStyle 38 -+int styleable AppCompatTheme_buttonBarButtonStyle 39 -+int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 -+int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 -+int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 -+int styleable AppCompatTheme_buttonBarStyle 43 -+int styleable AppCompatTheme_buttonStyle 44 -+int styleable AppCompatTheme_buttonStyleSmall 45 -+int styleable AppCompatTheme_checkboxStyle 46 -+int styleable AppCompatTheme_checkedTextViewStyle 47 -+int styleable AppCompatTheme_colorAccent 48 -+int styleable AppCompatTheme_colorBackgroundFloating 49 -+int styleable AppCompatTheme_colorButtonNormal 50 -+int styleable AppCompatTheme_colorControlActivated 51 -+int styleable AppCompatTheme_colorControlHighlight 52 -+int styleable AppCompatTheme_colorControlNormal 53 -+int styleable AppCompatTheme_colorError 54 -+int styleable AppCompatTheme_colorPrimary 55 -+int styleable AppCompatTheme_colorPrimaryDark 56 -+int styleable AppCompatTheme_colorSwitchThumbNormal 57 -+int styleable AppCompatTheme_controlBackground 58 -+int styleable AppCompatTheme_dialogCornerRadius 59 -+int styleable AppCompatTheme_dialogPreferredPadding 60 -+int styleable AppCompatTheme_dialogTheme 61 -+int styleable AppCompatTheme_dividerHorizontal 62 -+int styleable AppCompatTheme_dividerVertical 63 -+int styleable AppCompatTheme_dropDownListViewStyle 64 -+int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 -+int styleable AppCompatTheme_editTextBackground 66 -+int styleable AppCompatTheme_editTextColor 67 -+int styleable AppCompatTheme_editTextStyle 68 -+int styleable AppCompatTheme_homeAsUpIndicator 69 -+int styleable AppCompatTheme_imageButtonStyle 70 -+int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 -+int styleable AppCompatTheme_listDividerAlertDialog 72 -+int styleable AppCompatTheme_listMenuViewStyle 73 -+int styleable AppCompatTheme_listPopupWindowStyle 74 -+int styleable AppCompatTheme_listPreferredItemHeight 75 -+int styleable AppCompatTheme_listPreferredItemHeightLarge 76 -+int styleable AppCompatTheme_listPreferredItemHeightSmall 77 -+int styleable AppCompatTheme_listPreferredItemPaddingLeft 78 -+int styleable AppCompatTheme_listPreferredItemPaddingRight 79 -+int styleable AppCompatTheme_panelBackground 80 -+int styleable AppCompatTheme_panelMenuListTheme 81 -+int styleable AppCompatTheme_panelMenuListWidth 82 -+int styleable AppCompatTheme_popupMenuStyle 83 -+int styleable AppCompatTheme_popupWindowStyle 84 -+int styleable AppCompatTheme_radioButtonStyle 85 -+int styleable AppCompatTheme_ratingBarStyle 86 -+int styleable AppCompatTheme_ratingBarStyleIndicator 87 -+int styleable AppCompatTheme_ratingBarStyleSmall 88 -+int styleable AppCompatTheme_searchViewStyle 89 -+int styleable AppCompatTheme_seekBarStyle 90 -+int styleable AppCompatTheme_selectableItemBackground 91 -+int styleable AppCompatTheme_selectableItemBackgroundBorderless 92 -+int styleable AppCompatTheme_spinnerDropDownItemStyle 93 -+int styleable AppCompatTheme_spinnerStyle 94 -+int styleable AppCompatTheme_switchStyle 95 -+int styleable AppCompatTheme_textAppearanceLargePopupMenu 96 -+int styleable AppCompatTheme_textAppearanceListItem 97 -+int styleable AppCompatTheme_textAppearanceListItemSecondary 98 -+int styleable AppCompatTheme_textAppearanceListItemSmall 99 -+int styleable AppCompatTheme_textAppearancePopupMenuHeader 100 -+int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 101 -+int styleable AppCompatTheme_textAppearanceSearchResultTitle 102 -+int styleable AppCompatTheme_textAppearanceSmallPopupMenu 103 -+int styleable AppCompatTheme_textColorAlertDialogListItem 104 -+int styleable AppCompatTheme_textColorSearchUrl 105 -+int styleable AppCompatTheme_toolbarNavigationButtonStyle 106 -+int styleable AppCompatTheme_toolbarStyle 107 -+int styleable AppCompatTheme_tooltipForegroundColor 108 -+int styleable AppCompatTheme_tooltipFrameBackground 109 -+int styleable AppCompatTheme_viewInflaterClass 110 -+int styleable AppCompatTheme_windowActionBar 111 -+int styleable AppCompatTheme_windowActionBarOverlay 112 -+int styleable AppCompatTheme_windowActionModeOverlay 113 -+int styleable AppCompatTheme_windowFixedHeightMajor 114 -+int styleable AppCompatTheme_windowFixedHeightMinor 115 -+int styleable AppCompatTheme_windowFixedWidthMajor 116 -+int styleable AppCompatTheme_windowFixedWidthMinor 117 -+int styleable AppCompatTheme_windowMinWidthMajor 118 -+int styleable AppCompatTheme_windowMinWidthMinor 119 -+int styleable AppCompatTheme_windowNoTitle 120 -+int[] styleable ButtonBarLayout { 0x0 } -+int styleable ButtonBarLayout_allowStacking 0 -+int[] styleable ColorStateListItem { 0x0, 0x101031f, 0x10101a5 } -+int styleable ColorStateListItem_alpha 0 -+int styleable ColorStateListItem_android_alpha 1 -+int styleable ColorStateListItem_android_color 2 -+int[] styleable CompoundButton { 0x1010107, 0x0, 0x0 } -+int styleable CompoundButton_android_button 0 -+int styleable CompoundButton_buttonTint 1 -+int styleable CompoundButton_buttonTintMode 2 -+int[] styleable CoordinatorLayout { 0x0, 0x0 } -+int styleable CoordinatorLayout_keylines 0 -+int styleable CoordinatorLayout_statusBarBackground 1 -+int[] styleable CoordinatorLayout_Layout { 0x10100b3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable CoordinatorLayout_Layout_android_layout_gravity 0 -+int styleable CoordinatorLayout_Layout_layout_anchor 1 -+int styleable CoordinatorLayout_Layout_layout_anchorGravity 2 -+int styleable CoordinatorLayout_Layout_layout_behavior 3 -+int styleable CoordinatorLayout_Layout_layout_dodgeInsetEdges 4 -+int styleable CoordinatorLayout_Layout_layout_insetEdge 5 -+int styleable CoordinatorLayout_Layout_layout_keyline 6 -+int[] styleable DrawerArrowToggle { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable DrawerArrowToggle_arrowHeadLength 0 -+int styleable DrawerArrowToggle_arrowShaftLength 1 -+int styleable DrawerArrowToggle_barLength 2 -+int styleable DrawerArrowToggle_color 3 -+int styleable DrawerArrowToggle_drawableSize 4 -+int styleable DrawerArrowToggle_gapBetweenBars 5 -+int styleable DrawerArrowToggle_spinBars 6 -+int styleable DrawerArrowToggle_thickness 7 -+int[] styleable FontFamily { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable FontFamily_fontProviderAuthority 0 -+int styleable FontFamily_fontProviderCerts 1 -+int styleable FontFamily_fontProviderFetchStrategy 2 -+int styleable FontFamily_fontProviderFetchTimeout 3 -+int styleable FontFamily_fontProviderPackage 4 -+int styleable FontFamily_fontProviderQuery 5 -+int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable FontFamilyFont_android_font 0 -+int styleable FontFamilyFont_android_fontStyle 1 -+int styleable FontFamilyFont_android_fontVariationSettings 2 -+int styleable FontFamilyFont_android_fontWeight 3 -+int styleable FontFamilyFont_android_ttcIndex 4 -+int styleable FontFamilyFont_font 5 -+int styleable FontFamilyFont_fontStyle 6 -+int styleable FontFamilyFont_fontVariationSettings 7 -+int styleable FontFamilyFont_fontWeight 8 -+int styleable FontFamilyFont_ttcIndex 9 -+int[] styleable GenericDraweeHierarchy { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable GenericDraweeHierarchy_actualImageScaleType 0 -+int styleable GenericDraweeHierarchy_backgroundImage 1 -+int styleable GenericDraweeHierarchy_fadeDuration 2 -+int styleable GenericDraweeHierarchy_failureImage 3 -+int styleable GenericDraweeHierarchy_failureImageScaleType 4 -+int styleable GenericDraweeHierarchy_overlayImage 5 -+int styleable GenericDraweeHierarchy_placeholderImage 6 -+int styleable GenericDraweeHierarchy_placeholderImageScaleType 7 -+int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8 -+int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9 -+int styleable GenericDraweeHierarchy_progressBarImage 10 -+int styleable GenericDraweeHierarchy_progressBarImageScaleType 11 -+int styleable GenericDraweeHierarchy_retryImage 12 -+int styleable GenericDraweeHierarchy_retryImageScaleType 13 -+int styleable GenericDraweeHierarchy_roundAsCircle 14 -+int styleable GenericDraweeHierarchy_roundBottomEnd 15 -+int styleable GenericDraweeHierarchy_roundBottomLeft 16 -+int styleable GenericDraweeHierarchy_roundBottomRight 17 -+int styleable GenericDraweeHierarchy_roundBottomStart 18 -+int styleable GenericDraweeHierarchy_roundTopEnd 19 -+int styleable GenericDraweeHierarchy_roundTopLeft 20 -+int styleable GenericDraweeHierarchy_roundTopRight 21 -+int styleable GenericDraweeHierarchy_roundTopStart 22 -+int styleable GenericDraweeHierarchy_roundWithOverlayColor 23 -+int styleable GenericDraweeHierarchy_roundedCornerRadius 24 -+int styleable GenericDraweeHierarchy_roundingBorderColor 25 -+int styleable GenericDraweeHierarchy_roundingBorderPadding 26 -+int styleable GenericDraweeHierarchy_roundingBorderWidth 27 -+int styleable GenericDraweeHierarchy_viewAspectRatio 28 -+int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 } -+int styleable GradientColor_android_centerColor 0 -+int styleable GradientColor_android_centerX 1 -+int styleable GradientColor_android_centerY 2 -+int styleable GradientColor_android_endColor 3 -+int styleable GradientColor_android_endX 4 -+int styleable GradientColor_android_endY 5 -+int styleable GradientColor_android_gradientRadius 6 -+int styleable GradientColor_android_startColor 7 -+int styleable GradientColor_android_startX 8 -+int styleable GradientColor_android_startY 9 -+int styleable GradientColor_android_tileMode 10 -+int styleable GradientColor_android_type 11 -+int[] styleable GradientColorItem { 0x10101a5, 0x1010514 } -+int styleable GradientColorItem_android_color 0 -+int styleable GradientColorItem_android_offset 1 -+int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x0, 0x0, 0x0, 0x0 } -+int styleable LinearLayoutCompat_android_baselineAligned 0 -+int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1 -+int styleable LinearLayoutCompat_android_gravity 2 -+int styleable LinearLayoutCompat_android_orientation 3 -+int styleable LinearLayoutCompat_android_weightSum 4 -+int styleable LinearLayoutCompat_divider 5 -+int styleable LinearLayoutCompat_dividerPadding 6 -+int styleable LinearLayoutCompat_measureWithLargestChild 7 -+int styleable LinearLayoutCompat_showDividers 8 -+int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 } -+int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 -+int styleable LinearLayoutCompat_Layout_android_layout_height 1 -+int styleable LinearLayoutCompat_Layout_android_layout_weight 2 -+int styleable LinearLayoutCompat_Layout_android_layout_width 3 -+int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad } -+int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 -+int styleable ListPopupWindow_android_dropDownVerticalOffset 1 -+int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 } -+int styleable MenuGroup_android_checkableBehavior 0 -+int styleable MenuGroup_android_enabled 1 -+int styleable MenuGroup_android_id 2 -+int styleable MenuGroup_android_menuCategory 3 -+int styleable MenuGroup_android_orderInCategory 4 -+int styleable MenuGroup_android_visible 5 -+int[] styleable MenuItem { 0x0, 0x0, 0x0, 0x0, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable MenuItem_actionLayout 0 -+int styleable MenuItem_actionProviderClass 1 -+int styleable MenuItem_actionViewClass 2 -+int styleable MenuItem_alphabeticModifiers 3 -+int styleable MenuItem_android_alphabeticShortcut 4 -+int styleable MenuItem_android_checkable 5 -+int styleable MenuItem_android_checked 6 -+int styleable MenuItem_android_enabled 7 -+int styleable MenuItem_android_icon 8 -+int styleable MenuItem_android_id 9 -+int styleable MenuItem_android_menuCategory 10 -+int styleable MenuItem_android_numericShortcut 11 -+int styleable MenuItem_android_onClick 12 -+int styleable MenuItem_android_orderInCategory 13 -+int styleable MenuItem_android_title 14 -+int styleable MenuItem_android_titleCondensed 15 -+int styleable MenuItem_android_visible 16 -+int styleable MenuItem_contentDescription 17 -+int styleable MenuItem_iconTint 18 -+int styleable MenuItem_iconTintMode 19 -+int styleable MenuItem_numericModifiers 20 -+int styleable MenuItem_showAsAction 21 -+int styleable MenuItem_tooltipText 22 -+int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x0, 0x0 } -+int styleable MenuView_android_headerBackground 0 -+int styleable MenuView_android_horizontalDivider 1 -+int styleable MenuView_android_itemBackground 2 -+int styleable MenuView_android_itemIconDisabledAlpha 3 -+int styleable MenuView_android_itemTextAppearance 4 -+int styleable MenuView_android_verticalDivider 5 -+int styleable MenuView_android_windowAnimationStyle 6 -+int styleable MenuView_preserveIconSpacing 7 -+int styleable MenuView_subMenuArrow 8 -+int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x0 } -+int styleable PopupWindow_android_popupAnimationStyle 0 -+int styleable PopupWindow_android_popupBackground 1 -+int styleable PopupWindow_overlapAnchor 2 -+int[] styleable PopupWindowBackgroundState { 0x0 } -+int styleable PopupWindowBackgroundState_state_above_anchor 0 -+int[] styleable RecycleListView { 0x0, 0x0 } -+int styleable RecycleListView_paddingBottomNoButtons 0 -+int styleable RecycleListView_paddingTopNoTitle 1 -+int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable SearchView_android_focusable 0 -+int styleable SearchView_android_imeOptions 1 -+int styleable SearchView_android_inputType 2 -+int styleable SearchView_android_maxWidth 3 -+int styleable SearchView_closeIcon 4 -+int styleable SearchView_commitIcon 5 -+int styleable SearchView_defaultQueryHint 6 -+int styleable SearchView_goIcon 7 -+int styleable SearchView_iconifiedByDefault 8 -+int styleable SearchView_layout 9 -+int styleable SearchView_queryBackground 10 -+int styleable SearchView_queryHint 11 -+int styleable SearchView_searchHintIcon 12 -+int styleable SearchView_searchIcon 13 -+int styleable SearchView_submitBackground 14 -+int styleable SearchView_suggestionRowLayout 15 -+int styleable SearchView_voiceIcon 16 -+int[] styleable SimpleDraweeView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable SimpleDraweeView_actualImageResource 0 -+int styleable SimpleDraweeView_actualImageScaleType 1 -+int styleable SimpleDraweeView_actualImageUri 2 -+int styleable SimpleDraweeView_backgroundImage 3 -+int styleable SimpleDraweeView_fadeDuration 4 -+int styleable SimpleDraweeView_failureImage 5 -+int styleable SimpleDraweeView_failureImageScaleType 6 -+int styleable SimpleDraweeView_overlayImage 7 -+int styleable SimpleDraweeView_placeholderImage 8 -+int styleable SimpleDraweeView_placeholderImageScaleType 9 -+int styleable SimpleDraweeView_pressedStateOverlayImage 10 -+int styleable SimpleDraweeView_progressBarAutoRotateInterval 11 -+int styleable SimpleDraweeView_progressBarImage 12 -+int styleable SimpleDraweeView_progressBarImageScaleType 13 -+int styleable SimpleDraweeView_retryImage 14 -+int styleable SimpleDraweeView_retryImageScaleType 15 -+int styleable SimpleDraweeView_roundAsCircle 16 -+int styleable SimpleDraweeView_roundBottomEnd 17 -+int styleable SimpleDraweeView_roundBottomLeft 18 -+int styleable SimpleDraweeView_roundBottomRight 19 -+int styleable SimpleDraweeView_roundBottomStart 20 -+int styleable SimpleDraweeView_roundTopEnd 21 -+int styleable SimpleDraweeView_roundTopLeft 22 -+int styleable SimpleDraweeView_roundTopRight 23 -+int styleable SimpleDraweeView_roundTopStart 24 -+int styleable SimpleDraweeView_roundWithOverlayColor 25 -+int styleable SimpleDraweeView_roundedCornerRadius 26 -+int styleable SimpleDraweeView_roundingBorderColor 27 -+int styleable SimpleDraweeView_roundingBorderPadding 28 -+int styleable SimpleDraweeView_roundingBorderWidth 29 -+int styleable SimpleDraweeView_viewAspectRatio 30 -+int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x0 } -+int styleable Spinner_android_dropDownWidth 0 -+int styleable Spinner_android_entries 1 -+int styleable Spinner_android_popupBackground 2 -+int styleable Spinner_android_prompt 3 -+int styleable Spinner_popupTheme 4 -+int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 } -+int styleable StateListDrawable_android_constantSize 0 -+int styleable StateListDrawable_android_dither 1 -+int styleable StateListDrawable_android_enterFadeDuration 2 -+int styleable StateListDrawable_android_exitFadeDuration 3 -+int styleable StateListDrawable_android_variablePadding 4 -+int styleable StateListDrawable_android_visible 5 -+int[] styleable StateListDrawableItem { 0x1010199 } -+int styleable StateListDrawableItem_android_drawable 0 -+int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable SwitchCompat_android_textOff 0 -+int styleable SwitchCompat_android_textOn 1 -+int styleable SwitchCompat_android_thumb 2 -+int styleable SwitchCompat_showText 3 -+int styleable SwitchCompat_splitTrack 4 -+int styleable SwitchCompat_switchMinWidth 5 -+int styleable SwitchCompat_switchPadding 6 -+int styleable SwitchCompat_switchTextAppearance 7 -+int styleable SwitchCompat_thumbTextPadding 8 -+int styleable SwitchCompat_thumbTint 9 -+int styleable SwitchCompat_thumbTintMode 10 -+int styleable SwitchCompat_track 11 -+int styleable SwitchCompat_trackTint 12 -+int styleable SwitchCompat_trackTintMode 13 -+int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010095, 0x1010097, 0x1010096, 0x0, 0x0 } -+int styleable TextAppearance_android_fontFamily 0 -+int styleable TextAppearance_android_shadowColor 1 -+int styleable TextAppearance_android_shadowDx 2 -+int styleable TextAppearance_android_shadowDy 3 -+int styleable TextAppearance_android_shadowRadius 4 -+int styleable TextAppearance_android_textColor 5 -+int styleable TextAppearance_android_textColorHint 6 -+int styleable TextAppearance_android_textColorLink 7 -+int styleable TextAppearance_android_textSize 8 -+int styleable TextAppearance_android_textStyle 9 -+int styleable TextAppearance_android_typeface 10 -+int styleable TextAppearance_fontFamily 11 -+int styleable TextAppearance_textAllCaps 12 -+int[] styleable Toolbar { 0x10100af, 0x1010140, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } -+int styleable Toolbar_android_gravity 0 -+int styleable Toolbar_android_minHeight 1 -+int styleable Toolbar_buttonGravity 2 -+int styleable Toolbar_collapseContentDescription 3 -+int styleable Toolbar_collapseIcon 4 -+int styleable Toolbar_contentInsetEnd 5 -+int styleable Toolbar_contentInsetEndWithActions 6 -+int styleable Toolbar_contentInsetLeft 7 -+int styleable Toolbar_contentInsetRight 8 -+int styleable Toolbar_contentInsetStart 9 -+int styleable Toolbar_contentInsetStartWithNavigation 10 -+int styleable Toolbar_logo 11 -+int styleable Toolbar_logoDescription 12 -+int styleable Toolbar_maxButtonHeight 13 -+int styleable Toolbar_navigationContentDescription 14 -+int styleable Toolbar_navigationIcon 15 -+int styleable Toolbar_popupTheme 16 -+int styleable Toolbar_subtitle 17 -+int styleable Toolbar_subtitleTextAppearance 18 -+int styleable Toolbar_subtitleTextColor 19 -+int styleable Toolbar_title 20 -+int styleable Toolbar_titleMargin 21 -+int styleable Toolbar_titleMarginBottom 22 -+int styleable Toolbar_titleMarginEnd 23 -+int styleable Toolbar_titleMarginStart 24 -+int styleable Toolbar_titleMarginTop 25 -+int styleable Toolbar_titleMargins 26 -+int styleable Toolbar_titleTextAppearance 27 -+int styleable Toolbar_titleTextColor 28 -+int[] styleable View { 0x10100da, 0x1010000, 0x0, 0x0, 0x0 } -+int styleable View_android_focusable 0 -+int styleable View_android_theme 1 -+int styleable View_paddingEnd 2 -+int styleable View_paddingStart 3 -+int styleable View_theme 4 -+int[] styleable ViewBackgroundHelper { 0x10100d4, 0x0, 0x0 } -+int styleable ViewBackgroundHelper_android_background 0 -+int styleable ViewBackgroundHelper_backgroundTint 1 -+int styleable ViewBackgroundHelper_backgroundTintMode 2 -+int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 } -+int styleable ViewStubCompat_android_id 0 -+int styleable ViewStubCompat_android_inflatedId 1 -+int styleable ViewStubCompat_android_layout 2 -+int xml rn_dev_preferences 0x0 -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml -new file mode 100644 -index 0000000..13599d5 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugShaders/merger.xml -new file mode 100644 -index 0000000..e21a2ca ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/mergeDebugShaders/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugAssets/merger.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugAssets/merger.xml -new file mode 100644 -index 0000000..ba1825a ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugAssets/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties -new file mode 100644 -index 0000000..151cb4e ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties -@@ -0,0 +1 @@ -+#Mon Nov 08 13:55:44 EST 2021 -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/merger.xml b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/merger.xml -new file mode 100644 -index 0000000..21f59f3 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/incremental/packageDebugResources/merger.xml -@@ -0,0 +1,2 @@ -+ -+ -\ No newline at end of file -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnode.so -new file mode 100644 -index 0000000..6a654b1 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnodejs-mobile-react-native-native-lib.so -new file mode 100644 -index 0000000..5c8930f -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/arm64-v8a/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnode.so -new file mode 100644 -index 0000000..e3186b4 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so -new file mode 100644 -index 0000000..56eb18b -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/armeabi-v7a/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnode.so -new file mode 100644 -index 0000000..e9181b4 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnodejs-mobile-react-native-native-lib.so -new file mode 100644 -index 0000000..585bfcd -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnode.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnode.so -new file mode 100644 -index 0000000..d912b55 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnode.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnodejs-mobile-react-native-native-lib.so b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnodejs-mobile-react-native-native-lib.so -new file mode 100644 -index 0000000..3b868a2 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/intermediate-jars/debug/jni/x86_64/libnodejs-mobile-react-native-native-lib.so differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/BuildConfig.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/BuildConfig.class -new file mode 100644 -index 0000000..2d860ad -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/BuildConfig.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$1.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$1.class -new file mode 100644 -index 0000000..476339c -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$1.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$2.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$2.class -new file mode 100644 -index 0000000..ed8eb2d -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$2.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$3.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$3.class -new file mode 100644 -index 0000000..3d726e4 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$3.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$4.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$4.class -new file mode 100644 -index 0000000..6ce07f5 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule$4.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.class -new file mode 100644 -index 0000000..456e81b -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobileModule.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobilePackage.class b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobilePackage.class -new file mode 100644 -index 0000000..93f7e3b -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/javac/debug/classes/com/janeasystems/rn_nodejs_mobile/RNNodeJsMobilePackage.class differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/builtin_modules/rn-bridge/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/builtin_modules/rn-bridge/index.js -new file mode 100644 -index 0000000..c6280bf ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/builtin_modules/rn-bridge/index.js -@@ -0,0 +1,219 @@ -+ -+const EventEmitter = require('events'); -+const NativeBridge = process._linkedBinding('rn_bridge'); -+ -+/** -+ * Built-in events channel to exchange events between the react-native app -+ * and the Node.js app. It allows to emit user defined event types with -+ * optional arguments. -+ */ -+const EVENT_CHANNEL = '_EVENTS_'; -+ -+/** -+ * Built-in, one-way event channel reserved for sending events from -+ * the react-native plug-in native layer to the Node.js app. -+ */ -+const SYSTEM_CHANNEL = '_SYSTEM_'; -+ -+/** -+ * This class is defined in the plugin's root index.js as well. -+ * Any change made here should be ported to the root index.js too. -+ * The MessageCodec class provides two static methods to serialize/deserialize -+ * the data sent through the events channel. -+*/ -+class MessageCodec { -+ // This is a 'private' constructor, should only be used by this class -+ // static methods. -+ constructor(_event, ..._payload) { -+ this.event = _event; -+ this.payload = JSON.stringify(_payload); -+ }; -+ -+ // Serialize the message payload and the message. -+ static serialize(event, ...payload) { -+ const envelope = new MessageCodec(event, ...payload); -+ // Return the serialized message, that can be sent through a channel. -+ return JSON.stringify(envelope); -+ }; -+ -+ // Deserialize the message and the message payload. -+ static deserialize(message) { -+ var envelope = JSON.parse(message); -+ if (typeof envelope.payload !== 'undefined') { -+ envelope.payload = JSON.parse(envelope.payload); -+ } -+ return envelope; -+ }; -+}; -+ -+/** -+ * Channel super class. -+ */ -+class ChannelSuper extends EventEmitter { -+ constructor(name) { -+ super(); -+ this.name = name; -+ // Renaming the 'emit' method to 'emitLocal' is not strictly needed, but -+ // it is useful to clarify that 'emitting' on this object has a local -+ // scope: it emits the event on the react-native side only, it doesn't send -+ // the event to Node. -+ this.emitLocal = this.emit; -+ delete this.emit; -+ }; -+ -+ emitWrapper(type, ...msg) { -+ const _this = this; -+ setImmediate( () => { -+ _this.emitLocal(type, ...msg); -+ }); -+ }; -+}; -+ -+/** -+ * Events channel class that supports user defined event types with -+ * optional arguments. Allows to send any serializable -+ * JavaScript object supported by 'JSON.stringify()'. -+ * Sending functions is not currently supported. -+ * Includes the previously available 'send' method for 'message' events. -+ */ -+class EventChannel extends ChannelSuper { -+ post(event, ...msg) { -+ NativeBridge.sendMessage(this.name, MessageCodec.serialize(event, ...msg)); -+ }; -+ -+ // Posts a 'message' event, to be backward compatible with old code. -+ send(...msg) { -+ this.post('message', ...msg); -+ }; -+ -+ processData(data) { -+ // The data contains the serialized message envelope. -+ var envelope = MessageCodec.deserialize(data); -+ this.emitWrapper(envelope.event, ...(envelope.payload)); -+ }; -+}; -+ -+/** -+ * System event Lock class -+ * Helper class to handle lock acquisition and release in system event handlers. -+ * Will call a callback after every lock has been released. -+ **/ -+class SystemEventLock { -+ constructor(callback, startingLocks) { -+ this._locksAcquired = startingLocks; // Start with one lock. -+ this._callback = callback; // Callback to call after all locks are released. -+ this._hasReleased = false; // To stop doing anything after it's supposed to serve its purpose. -+ this._checkRelease(); // Initial check. If it's been started with no locks, can be released right away. -+ } -+ // Release a lock and call the callback if all locks have been released. -+ release() { -+ if (this._hasReleased) return; -+ this._locksAcquired--; -+ this._checkRelease(); -+ } -+ // Check if the lock can be released and release it. -+ _checkRelease() { -+ if(this._locksAcquired<=0) { -+ this._hasReleased=true; -+ this._callback(); -+ } -+ } -+ -+} -+ -+/** -+ * System channel class. -+ * Emit pause/resume events when the app goes to background/foreground. -+ */ -+class SystemChannel extends ChannelSuper { -+ constructor(name) { -+ super(name); -+ // datadir should not change during runtime, so we cache it. -+ this._cacheDataDir = null; -+ }; -+ -+ emitWrapper(type) { -+ // Overload the emitWrapper to handle the pause event locks. -+ const _this = this; -+ if (type.startsWith('pause')) { -+ setImmediate( () => { -+ let releaseMessage = 'release-pause-event'; -+ let eventArguments = type.split('|'); -+ if (eventArguments.length >= 2) { -+ // The expected format for the release message is "release-pause-event|{eventId}" -+ // eventId comes from the pause event, with the format "pause|{eventId}" -+ releaseMessage = releaseMessage + '|' + eventArguments[1]; -+ } -+ // Create a lock to signal the native side after the app event has been handled. -+ let eventLock = new SystemEventLock( -+ () => { -+ NativeBridge.sendMessage(_this.name, releaseMessage); -+ } -+ , _this.listenerCount("pause") // A lock for each current event listener. All listeners need to call release(). -+ ); -+ _this.emitLocal("pause", eventLock); -+ }); -+ } else { -+ setImmediate( () => { -+ _this.emitLocal(type); -+ }); -+ } -+ }; -+ -+ processData(data) { -+ // The data is the event. -+ this.emitWrapper(data); -+ }; -+ -+ // Get a writable data directory for persistent file storage. -+ datadir() { -+ if (this._cacheDataDir === null) { -+ this._cacheDataDir = NativeBridge.getDataDir(); -+ } -+ return this._cacheDataDir; -+ } -+}; -+/** -+ * Manage the registered channels to emit events/messages received by the -+ * react-native app or by the react-native plugin itself (i.e. the system channel). -+ */ -+var channels = {}; -+ -+/* -+ * This method is invoked by the native code when an event/message is received -+ * from the react-native app. -+ */ -+function bridgeListener(channelName, data) { -+ if (channels.hasOwnProperty(channelName)) { -+ channels[channelName].processData(data); -+ } else { -+ console.error('ERROR: Channel not found:', channelName); -+ } -+}; -+ -+/* -+ * The bridge's native code processes each channel's messages in a dedicated -+ * per-channel queue, therefore each channel needs to be registered within -+ * the native code. -+ */ -+function registerChannel(channel) { -+ channels[channel.name] = channel; -+ NativeBridge.registerChannel(channel.name, bridgeListener); -+}; -+ -+/** -+ * Module exports. -+ */ -+const systemChannel = new SystemChannel(SYSTEM_CHANNEL); -+registerChannel(systemChannel); -+ -+// Signal we are ready for app events, so the native code won't lock before node is ready to handle those. -+NativeBridge.sendMessage(SYSTEM_CHANNEL, "ready-for-app-events"); -+ -+const eventChannel = new EventChannel(EVENT_CHANNEL); -+registerChannel(eventChannel); -+ -+module.exports = exports = { -+ app: systemChannel, -+ channel: eventChannel -+}; -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/dir.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/dir.list -new file mode 100644 -index 0000000..4d549ba ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/dir.list -@@ -0,0 +1,34 @@ -+nodejs-project -+nodejs-project/node_modules -+nodejs-project/node_modules/hasha -+nodejs-project/node_modules/leveldown -+nodejs-project/node_modules/leveldown/deps -+nodejs-project/node_modules/leveldown/deps/leveldb -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20 -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/win -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv -+nodejs-project/node_modules/leveldown/deps/snappy -+nodejs-project/node_modules/leveldown/deps/snappy/freebsd -+nodejs-project/node_modules/leveldown/deps/snappy/linux -+nodejs-project/node_modules/leveldown/deps/snappy/mac -+nodejs-project/node_modules/leveldown/deps/snappy/openbsd -+nodejs-project/node_modules/leveldown/deps/snappy/snappy -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake -+nodejs-project/node_modules/leveldown/deps/snappy/solaris -+nodejs-project/node_modules/leveldown/deps/snappy/win32 -+nodejs-project/node_modules/leveldown/node_modules -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build -+nodejs-project/node_modules/napi-macros -+nodejs-project/node_modules/napi-macros/example -+nodejs-project/node_modules/node-gyp-build -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/file.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/file.list -new file mode 100644 -index 0000000..7538e50 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/file.list -@@ -0,0 +1,248 @@ -+nodejs-project/index.js -+nodejs-project/loader.js -+nodejs-project/node_modules/hasha/thread.js -+nodejs-project/node_modules/leveldown/CHANGELOG.md -+nodejs-project/node_modules/leveldown/CONTRIBUTORS.md -+nodejs-project/node_modules/leveldown/LICENSE.md -+nodejs-project/node_modules/leveldown/README.md -+nodejs-project/node_modules/leveldown/UPGRADING.md -+nodejs-project/node_modules/leveldown/binding.cc -+nodejs-project/node_modules/leveldown/binding.gyp -+nodejs-project/node_modules/leveldown/binding.js -+nodejs-project/node_modules/leveldown/chained-batch.js -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/LICENSE -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/Makefile -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/README.md -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/build_detect_platform -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/autocompact_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/builder.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/c_test.c -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/corruption_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_bench.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_impl.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_iter.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/db_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dbformat_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/dumpfile.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/fault_injection_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/filename_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/leveldbutil.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_format.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_reader.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/log_writer.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/memtable.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/recovery_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/repair.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/skiplist_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/snapshot.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/table_cache.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_edit_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/version_set_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_internal.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/db/write_batch_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/helpers/memenv/memenv_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/c.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/cache.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/comparator.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/db.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/dumpfile.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/env.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/filter_policy.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/iterator.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/options.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/slice.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/status.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/table_builder.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/include/leveldb/write_batch.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue178_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/issues/issue200_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/README -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/atomic_pointer.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_example.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/port_posix_sse.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/thread_annotations.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/port/win/stdint.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/block_builder.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/filter_block_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/format.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/iterator_wrapper.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/merger.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_builder.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/table_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/table/two_level_iterator.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/arena_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/bloom_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/cache_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/coding_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/comparator.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/crc32c_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_posix_test_helper.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/env_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/filter_policy.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/hash_test.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/histogram.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/logging.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/mutexlock.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/options.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/posix_logger.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/random.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/status.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testharness.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb-1.20/util/testutil.h -+nodejs-project/node_modules/leveldown/deps/leveldb/leveldb.gyp -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/atomic_pointer_win.h -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/env_win.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/port_uv.h.bak -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/stdint-msvc2008.h -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar.h -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/uv_condvar_posix.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.cc -+nodejs-project/node_modules/leveldown/deps/leveldb/port-libuv/win_logger.h -+nodejs-project/node_modules/leveldown/deps/snappy/freebsd/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/freebsd/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/deps/snappy/linux/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/linux/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/deps/snappy/mac/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/mac/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/deps/snappy/openbsd/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/openbsd/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy.gyp -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/COPYING -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/README.md -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/SnappyConfig.cmake -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/cmake/config.h.in -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.cc -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-c.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-internal.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.cc -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-sinksource.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.cc -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-internal.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-stubs-public.h.in -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.cc -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy-test.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.cc -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy.h -+nodejs-project/node_modules/leveldown/deps/snappy/snappy/snappy_unittest.cc -+nodejs-project/node_modules/leveldown/deps/snappy/solaris/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/solaris/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/deps/snappy/win32/config.h -+nodejs-project/node_modules/leveldown/deps/snappy/win32/snappy-stubs-public.h -+nodejs-project/node_modules/leveldown/iterator.js -+nodejs-project/node_modules/leveldown/leveldown.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CHANGELOG.md -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/CONTRIBUTORS.md -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/LICENSE.md -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/README.md -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/UPGRADING.md -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-chained-batch.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-iterator.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/abstract-leveldown.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/index.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick-browser.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/next-tick.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/package.json -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/sauce-labs.svg -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/batch-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/chained-batch-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-range-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/clear-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/close-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/common.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/del-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/factory-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/get-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/index.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-no-snapshot-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-range-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-seek-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-snapshot-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/iterator-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/leveldown-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/manifest-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-create-if-missing-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-error-if-exists-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/open-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-get-del-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/put-test.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/self.js -+nodejs-project/node_modules/leveldown/node_modules/abstract-leveldown/test/util.js -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/LICENSE -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/README.md -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/bin.js -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/build-test.js -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/index.js -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/optional.js -+nodejs-project/node_modules/leveldown/node_modules/node-gyp-build/package.json -+nodejs-project/node_modules/leveldown/package.json -+nodejs-project/node_modules/napi-macros/LICENSE -+nodejs-project/node_modules/napi-macros/README.md -+nodejs-project/node_modules/napi-macros/example/binding.gyp -+nodejs-project/node_modules/napi-macros/example/example.js -+nodejs-project/node_modules/napi-macros/example/index.c -+nodejs-project/node_modules/napi-macros/example/package.json -+nodejs-project/node_modules/napi-macros/index.js -+nodejs-project/node_modules/napi-macros/napi-macros.h -+nodejs-project/node_modules/napi-macros/package.json -+nodejs-project/node_modules/node-gyp-build/LICENSE -+nodejs-project/node_modules/node-gyp-build/README.md -+nodejs-project/node_modules/node-gyp-build/bin.js -+nodejs-project/node_modules/node-gyp-build/build-test.js -+nodejs-project/node_modules/node-gyp-build/index.js -+nodejs-project/node_modules/node-gyp-build/optional.js -+nodejs-project/node_modules/node-gyp-build/package.json -+nodejs-project/package.json -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/dir.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/dir.list -new file mode 100644 -index 0000000..f88f447 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/dir.list -@@ -0,0 +1,5 @@ -+node_modules -+node_modules/leveldown -+node_modules/leveldown/build -+node_modules/leveldown/build/Release -+node_modules/leveldown/build/Release/obj.target -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/file.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/file.list -new file mode 100644 -index 0000000..7a01cf9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/file.list -@@ -0,0 +1,2 @@ -+node_modules/leveldown/build/Release/leveldown.node -+node_modules/leveldown/build/Release/obj.target/leveldown.node -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/leveldown.node -new file mode 100755 -index 0000000..a51f7bd -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/obj.target/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/obj.target/leveldown.node -new file mode 100755 -index 0000000..a51f7bd -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-arm64-v8a/node_modules/leveldown/build/Release/obj.target/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/dir.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/dir.list -new file mode 100644 -index 0000000..f88f447 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/dir.list -@@ -0,0 +1,5 @@ -+node_modules -+node_modules/leveldown -+node_modules/leveldown/build -+node_modules/leveldown/build/Release -+node_modules/leveldown/build/Release/obj.target -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/file.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/file.list -new file mode 100644 -index 0000000..7a01cf9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/file.list -@@ -0,0 +1,2 @@ -+node_modules/leveldown/build/Release/leveldown.node -+node_modules/leveldown/build/Release/obj.target/leveldown.node -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/leveldown.node -new file mode 100755 -index 0000000..1897cf1 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/obj.target/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/obj.target/leveldown.node -new file mode 100755 -index 0000000..1897cf1 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-armeabi-v7a/node_modules/leveldown/build/Release/obj.target/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/dir.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/dir.list -new file mode 100644 -index 0000000..f88f447 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/dir.list -@@ -0,0 +1,5 @@ -+node_modules -+node_modules/leveldown -+node_modules/leveldown/build -+node_modules/leveldown/build/Release -+node_modules/leveldown/build/Release/obj.target -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/file.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/file.list -new file mode 100644 -index 0000000..7a01cf9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/file.list -@@ -0,0 +1,2 @@ -+node_modules/leveldown/build/Release/leveldown.node -+node_modules/leveldown/build/Release/obj.target/leveldown.node -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/leveldown.node -new file mode 100755 -index 0000000..2fc75d6 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/obj.target/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/obj.target/leveldown.node -new file mode 100755 -index 0000000..2fc75d6 -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86/node_modules/leveldown/build/Release/obj.target/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/dir.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/dir.list -new file mode 100644 -index 0000000..f88f447 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/dir.list -@@ -0,0 +1,5 @@ -+node_modules -+node_modules/leveldown -+node_modules/leveldown/build -+node_modules/leveldown/build/Release -+node_modules/leveldown/build/Release/obj.target -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/file.list b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/file.list -new file mode 100644 -index 0000000..7a01cf9 ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/file.list -@@ -0,0 +1,2 @@ -+node_modules/leveldown/build/Release/leveldown.node -+node_modules/leveldown/build/Release/obj.target/leveldown.node -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/leveldown.node -new file mode 100755 -index 0000000..18e4d6a -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/obj.target/leveldown.node b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/obj.target/leveldown.node -new file mode 100755 -index 0000000..18e4d6a -Binary files /dev/null and b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-native-assets-x86_64/node_modules/leveldown/build/Release/obj.target/leveldown.node differ -diff --git a/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/index.js b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/index.js -new file mode 100644 -index 0000000..e09844d ---- /dev/null -+++ b/node_modules/nodejs-mobile-react-native/android/build/intermediates/library_assets/debug/out/nodejs-project/index.js -@@ -0,0 +1,193572 @@ -+#! /usr/bin/env node -+(function prelude(content, deps, entry) { -+ var cache = {} -+ -+ function load(file) { -+ var d = deps[file] -+ if (cache[file]) return cache[file].exports -+ if (!d) return require(file) -+ var fn = content[d[0]] //the actual module -+ var module = (cache[file] = { -+ exports: {}, -+ parent: file !== entry, -+ require: require -+ }) -+ cache[file] = module -+ var resolved = require('path').resolve(file) -+ var dirname = require('path').dirname(resolved) -+ fn.call( -+ module.exports, -+ function(m) { -+ if (!d[1][m]) return require(m) -+ else return load(d[1][m]) -+ }, -+ module, -+ module.exports, -+ dirname, -+ resolved -+ ) -+ return cache[file].exports -+ } -+ -+ return load(entry) -+})({ -+"+19grhHIhNb+zrYmnmZJvIarZtNvOtgfE10mekqytdw=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.TimeoutError = void 0; -+const net = require("net"); -+const unhandle_1 = require("./unhandle"); -+const reentry = Symbol('reentry'); -+const noop = () => { }; -+class TimeoutError extends Error { -+ constructor(threshold, event) { -+ super(`Timeout awaiting '${event}' for ${threshold}ms`); -+ this.event = event; -+ this.name = 'TimeoutError'; -+ this.code = 'ETIMEDOUT'; -+ } -+} -+exports.TimeoutError = TimeoutError; -+exports.default = (request, delays, options) => { -+ if (reentry in request) { -+ return noop; -+ } -+ request[reentry] = true; -+ const cancelers = []; -+ const { once, unhandleAll } = unhandle_1.default(); -+ const addTimeout = (delay, callback, event) => { -+ var _a; -+ const timeout = setTimeout(callback, delay, delay, event); -+ (_a = timeout.unref) === null || _a === void 0 ? void 0 : _a.call(timeout); -+ const cancel = () => { -+ clearTimeout(timeout); -+ }; -+ cancelers.push(cancel); -+ return cancel; -+ }; -+ const { host, hostname } = options; -+ const timeoutHandler = (delay, event) => { -+ request.destroy(new TimeoutError(delay, event)); -+ }; -+ const cancelTimeouts = () => { -+ for (const cancel of cancelers) { -+ cancel(); -+ } -+ unhandleAll(); -+ }; -+ request.once('error', error => { -+ cancelTimeouts(); -+ // Save original behavior -+ /* istanbul ignore next */ -+ if (request.listenerCount('error') === 0) { -+ throw error; -+ } -+ }); -+ request.once('close', cancelTimeouts); -+ once(request, 'response', (response) => { -+ once(response, 'end', cancelTimeouts); -+ }); -+ if (typeof delays.request !== 'undefined') { -+ addTimeout(delays.request, timeoutHandler, 'request'); -+ } -+ if (typeof delays.socket !== 'undefined') { -+ const socketTimeoutHandler = () => { -+ timeoutHandler(delays.socket, 'socket'); -+ }; -+ request.setTimeout(delays.socket, socketTimeoutHandler); -+ // `request.setTimeout(0)` causes a memory leak. -+ // We can just remove the listener and forget about the timer - it's unreffed. -+ // See https://github.com/sindresorhus/got/issues/690 -+ cancelers.push(() => { -+ request.removeListener('timeout', socketTimeoutHandler); -+ }); -+ } -+ once(request, 'socket', (socket) => { -+ var _a; -+ const { socketPath } = request; -+ /* istanbul ignore next: hard to test */ -+ if (socket.connecting) { -+ const hasPath = Boolean(socketPath !== null && socketPath !== void 0 ? socketPath : net.isIP((_a = hostname !== null && hostname !== void 0 ? hostname : host) !== null && _a !== void 0 ? _a : '') !== 0); -+ if (typeof delays.lookup !== 'undefined' && !hasPath && typeof socket.address().address === 'undefined') { -+ const cancelTimeout = addTimeout(delays.lookup, timeoutHandler, 'lookup'); -+ once(socket, 'lookup', cancelTimeout); -+ } -+ if (typeof delays.connect !== 'undefined') { -+ const timeConnect = () => addTimeout(delays.connect, timeoutHandler, 'connect'); -+ if (hasPath) { -+ once(socket, 'connect', timeConnect()); -+ } -+ else { -+ once(socket, 'lookup', (error) => { -+ if (error === null) { -+ once(socket, 'connect', timeConnect()); -+ } -+ }); -+ } -+ } -+ if (typeof delays.secureConnect !== 'undefined' && options.protocol === 'https:') { -+ once(socket, 'connect', () => { -+ const cancelTimeout = addTimeout(delays.secureConnect, timeoutHandler, 'secureConnect'); -+ once(socket, 'secureConnect', cancelTimeout); -+ }); -+ } -+ } -+ if (typeof delays.send !== 'undefined') { -+ const timeRequest = () => addTimeout(delays.send, timeoutHandler, 'send'); -+ /* istanbul ignore next: hard to test */ -+ if (socket.connecting) { -+ once(socket, 'connect', () => { -+ once(request, 'upload-complete', timeRequest()); -+ }); -+ } -+ else { -+ once(request, 'upload-complete', timeRequest()); -+ } -+ } -+ }); -+ if (typeof delays.response !== 'undefined') { -+ once(request, 'upload-complete', () => { -+ const cancelTimeout = addTimeout(delays.response, timeoutHandler, 'response'); -+ once(request, 'response', cancelTimeout); -+ }); -+ } -+ return cancelTimeouts; -+}; -+ -+}, -+"+2tZtTmq5cnFbAG6Ww/EbBPYXJzLaAdrxBU3CnB7SlY=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "NotFound": { -+ "code": 404, -+ "message": "Not Found" -+ }, -+ "ChangesetIdMismatch": { -+ "code": 409, -+ "message": "diff contains elements with changeset IDs %s\nwhich don't match the changeset ID %s that the diff was uploaded to" -+ }, -+ "ClosedChangeset": { -+ "code": 409, -+ "message": "The changeset %s was closed at %s." -+ }, -+ "NoVersion": { -+ "code": 400, -+ "message": "No such observation with that version" -+ }, -+ "DeleteMultiple": { -+ "code": 400, -+ "message": "Only one element can be deleted per request." -+ }, -+ "ForkedChangeset": { -+ "code": 409, -+ "message": "Changeset %s has multiple forks, you must specify a version" -+ }, -+ "IdMismatch": { -+ "code": 400, -+ "message": "Id mismatch between url parameter and xml.\n%s !== %s" -+ }, -+ "InUse": { -+ "code": 412, -+ "message": "Cannot delete an element that is in use" -+ }, -+ "InvalidBbox": { -+ "code": 400, -+ "message": "Invalid bbox query string parameter" -+ }, -+ "MissingBbox": { -+ "code": 400, -+ "message": "Missing bbox query string parameter" -+ }, -+ "DeleteFailed": { -+ "code": 400, -+ "message": "Failed to delete observation" -+ }, -+ "MissingChangeset": { -+ "code": 400, -+ "message": "Changeset %s not found.\n The element must reference an existing changeset." -+ }, -+ "MissingChangesetId": { -+ "code": 400, -+ "message": "Missing changeset ID: the element must have a changeset attribute with the id of an open changset" -+ }, -+ "MissingParameter": { -+ "code": 400, -+ "message": "Missing parameter '%s'.\nThe parameter has to be the same in the URL (e.g. /api/0.6/nodes?nodes=123,456,789)" -+ }, -+ "PlaceholderIdError": { -+ "code": 400, -+ "message": "Placeholder id is missing or non-unique" -+ }, -+ "TypeMismatch": { -+ "code": 400, -+ "message": "Type mismatch between url parameter and body." -+ }, -+ "UnsupportedContentType": { -+ "code": 400, -+ "message": "Unsupported content-type" -+ }, -+ "XmlParseError": { -+ "code": 400, -+ "message": "Error parsing XML" -+ }, -+ "JSONParseError": { -+ "code": 400, -+ "message": "Error parsing JSON" -+ }, -+ "XmlMissingElement": { -+ "code": 400, -+ "message": "missing %s elements in XML" -+ }, -+ "InvalidFields": { -+ "code": 400, -+ "message": "Invalid fields: %s" -+ } -+} -+ -+}, -+"+52LEKEE8WlMhXMKNyz64Rl3TlQHWN0cAdN24CarrI8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var utf8 = require('./utf8'); -+var utils = require('./utils'); -+var GenericWorker = require('./stream/GenericWorker'); -+var StreamHelper = require('./stream/StreamHelper'); -+var defaults = require('./defaults'); -+var CompressedObject = require('./compressedObject'); -+var ZipObject = require('./zipObject'); -+var generate = require("./generate"); -+var nodejsUtils = require("./nodejsUtils"); -+var NodejsStreamInputAdapter = require("./nodejs/NodejsStreamInputAdapter"); -+ -+ -+/** -+ * Add a file in the current folder. -+ * @private -+ * @param {string} name the name of the file -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file -+ * @param {Object} originalOptions the options of the file -+ * @return {Object} the new file. -+ */ -+var fileAdd = function(name, data, originalOptions) { -+ // be sure sub folders exist -+ var dataType = utils.getTypeOf(data), -+ parent; -+ -+ -+ /* -+ * Correct options. -+ */ -+ -+ var o = utils.extend(originalOptions || {}, defaults); -+ o.date = o.date || new Date(); -+ if (o.compression !== null) { -+ o.compression = o.compression.toUpperCase(); -+ } -+ -+ if (typeof o.unixPermissions === "string") { -+ o.unixPermissions = parseInt(o.unixPermissions, 8); -+ } -+ -+ // UNX_IFDIR 0040000 see zipinfo.c -+ if (o.unixPermissions && (o.unixPermissions & 0x4000)) { -+ o.dir = true; -+ } -+ // Bit 4 Directory -+ if (o.dosPermissions && (o.dosPermissions & 0x0010)) { -+ o.dir = true; -+ } -+ -+ if (o.dir) { -+ name = forceTrailingSlash(name); -+ } -+ if (o.createFolders && (parent = parentFolder(name))) { -+ folderAdd.call(this, parent, true); -+ } -+ -+ var isUnicodeString = dataType === "string" && o.binary === false && o.base64 === false; -+ if (!originalOptions || typeof originalOptions.binary === "undefined") { -+ o.binary = !isUnicodeString; -+ } -+ -+ -+ var isCompressedEmpty = (data instanceof CompressedObject) && data.uncompressedSize === 0; -+ -+ if (isCompressedEmpty || o.dir || !data || data.length === 0) { -+ o.base64 = false; -+ o.binary = true; -+ data = ""; -+ o.compression = "STORE"; -+ dataType = "string"; -+ } -+ -+ /* -+ * Convert content to fit. -+ */ -+ -+ var zipObjectContent = null; -+ if (data instanceof CompressedObject || data instanceof GenericWorker) { -+ zipObjectContent = data; -+ } else if (nodejsUtils.isNode && nodejsUtils.isStream(data)) { -+ zipObjectContent = new NodejsStreamInputAdapter(name, data); -+ } else { -+ zipObjectContent = utils.prepareContent(name, data, o.binary, o.optimizedBinaryString, o.base64); -+ } -+ -+ var object = new ZipObject(name, zipObjectContent, o); -+ this.files[name] = object; -+ /* -+ TODO: we can't throw an exception because we have async promises -+ (we can have a promise of a Date() for example) but returning a -+ promise is useless because file(name, data) returns the JSZip -+ object for chaining. Should we break that to allow the user -+ to catch the error ? -+ -+ return external.Promise.resolve(zipObjectContent) -+ .then(function () { -+ return object; -+ }); -+ */ -+}; -+ -+/** -+ * Find the parent folder of the path. -+ * @private -+ * @param {string} path the path to use -+ * @return {string} the parent folder, or "" -+ */ -+var parentFolder = function (path) { -+ if (path.slice(-1) === '/') { -+ path = path.substring(0, path.length - 1); -+ } -+ var lastSlash = path.lastIndexOf('/'); -+ return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; -+}; -+ -+/** -+ * Returns the path with a slash at the end. -+ * @private -+ * @param {String} path the path to check. -+ * @return {String} the path with a trailing slash. -+ */ -+var forceTrailingSlash = function(path) { -+ // Check the name ends with a / -+ if (path.slice(-1) !== "/") { -+ path += "/"; // IE doesn't like substr(-1) -+ } -+ return path; -+}; -+ -+/** -+ * Add a (sub) folder in the current folder. -+ * @private -+ * @param {string} name the folder's name -+ * @param {boolean=} [createFolders] If true, automatically create sub -+ * folders. Defaults to false. -+ * @return {Object} the new folder. -+ */ -+var folderAdd = function(name, createFolders) { -+ createFolders = (typeof createFolders !== 'undefined') ? createFolders : defaults.createFolders; -+ -+ name = forceTrailingSlash(name); -+ -+ // Does this folder already exist? -+ if (!this.files[name]) { -+ fileAdd.call(this, name, null, { -+ dir: true, -+ createFolders: createFolders -+ }); -+ } -+ return this.files[name]; -+}; -+ -+/** -+* Cross-window, cross-Node-context regular expression detection -+* @param {Object} object Anything -+* @return {Boolean} true if the object is a regular expression, -+* false otherwise -+*/ -+function isRegExp(object) { -+ return Object.prototype.toString.call(object) === "[object RegExp]"; -+} -+ -+// return the actual prototype of JSZip -+var out = { -+ /** -+ * @see loadAsync -+ */ -+ load: function() { -+ throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide."); -+ }, -+ -+ -+ /** -+ * Call a callback function for each entry at this folder level. -+ * @param {Function} cb the callback function: -+ * function (relativePath, file) {...} -+ * It takes 2 arguments : the relative path and the file. -+ */ -+ forEach: function(cb) { -+ var filename, relativePath, file; -+ for (filename in this.files) { -+ if (!this.files.hasOwnProperty(filename)) { -+ continue; -+ } -+ file = this.files[filename]; -+ relativePath = filename.slice(this.root.length, filename.length); -+ if (relativePath && filename.slice(0, this.root.length) === this.root) { // the file is in the current root -+ cb(relativePath, file); // TODO reverse the parameters ? need to be clean AND consistent with the filter search fn... -+ } -+ } -+ }, -+ -+ /** -+ * Filter nested files/folders with the specified function. -+ * @param {Function} search the predicate to use : -+ * function (relativePath, file) {...} -+ * It takes 2 arguments : the relative path and the file. -+ * @return {Array} An array of matching elements. -+ */ -+ filter: function(search) { -+ var result = []; -+ this.forEach(function (relativePath, entry) { -+ if (search(relativePath, entry)) { // the file matches the function -+ result.push(entry); -+ } -+ -+ }); -+ return result; -+ }, -+ -+ /** -+ * Add a file to the zip file, or search a file. -+ * @param {string|RegExp} name The name of the file to add (if data is defined), -+ * the name of the file to find (if no data) or a regex to match files. -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded -+ * @param {Object} o File options -+ * @return {JSZip|Object|Array} this JSZip object (when adding a file), -+ * a file (when searching by string) or an array of files (when searching by regex). -+ */ -+ file: function(name, data, o) { -+ if (arguments.length === 1) { -+ if (isRegExp(name)) { -+ var regexp = name; -+ return this.filter(function(relativePath, file) { -+ return !file.dir && regexp.test(relativePath); -+ }); -+ } -+ else { // text -+ var obj = this.files[this.root + name]; -+ if (obj && !obj.dir) { -+ return obj; -+ } else { -+ return null; -+ } -+ } -+ } -+ else { // more than one argument : we have data ! -+ name = this.root + name; -+ fileAdd.call(this, name, data, o); -+ } -+ return this; -+ }, -+ -+ /** -+ * Add a directory to the zip file, or search. -+ * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. -+ * @return {JSZip} an object with the new directory as the root, or an array containing matching folders. -+ */ -+ folder: function(arg) { -+ if (!arg) { -+ return this; -+ } -+ -+ if (isRegExp(arg)) { -+ return this.filter(function(relativePath, file) { -+ return file.dir && arg.test(relativePath); -+ }); -+ } -+ -+ // else, name is a new folder -+ var name = this.root + arg; -+ var newFolder = folderAdd.call(this, name); -+ -+ // Allow chaining by returning a new object with this folder as the root -+ var ret = this.clone(); -+ ret.root = newFolder.name; -+ return ret; -+ }, -+ -+ /** -+ * Delete a file, or a directory and all sub-files, from the zip -+ * @param {string} name the name of the file to delete -+ * @return {JSZip} this JSZip object -+ */ -+ remove: function(name) { -+ name = this.root + name; -+ var file = this.files[name]; -+ if (!file) { -+ // Look for any folders -+ if (name.slice(-1) !== "/") { -+ name += "/"; -+ } -+ file = this.files[name]; -+ } -+ -+ if (file && !file.dir) { -+ // file -+ delete this.files[name]; -+ } else { -+ // maybe a folder, delete recursively -+ var kids = this.filter(function(relativePath, file) { -+ return file.name.slice(0, name.length) === name; -+ }); -+ for (var i = 0; i < kids.length; i++) { -+ delete this.files[kids[i].name]; -+ } -+ } -+ -+ return this; -+ }, -+ -+ /** -+ * Generate the complete zip file -+ * @param {Object} options the options to generate the zip file : -+ * - compression, "STORE" by default. -+ * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. -+ * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file -+ */ -+ generate: function(options) { -+ throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide."); -+ }, -+ -+ /** -+ * Generate the complete zip file as an internal stream. -+ * @param {Object} options the options to generate the zip file : -+ * - compression, "STORE" by default. -+ * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. -+ * @return {StreamHelper} the streamed zip file. -+ */ -+ generateInternalStream: function(options) { -+ var worker, opts = {}; -+ try { -+ opts = utils.extend(options || {}, { -+ streamFiles: false, -+ compression: "STORE", -+ compressionOptions : null, -+ type: "", -+ platform: "DOS", -+ comment: null, -+ mimeType: 'application/zip', -+ encodeFileName: utf8.utf8encode -+ }); -+ -+ opts.type = opts.type.toLowerCase(); -+ opts.compression = opts.compression.toUpperCase(); -+ -+ // "binarystring" is prefered but the internals use "string". -+ if(opts.type === "binarystring") { -+ opts.type = "string"; -+ } -+ -+ if (!opts.type) { -+ throw new Error("No output type specified."); -+ } -+ -+ utils.checkSupport(opts.type); -+ -+ // accept nodejs `process.platform` -+ if( -+ opts.platform === 'darwin' || -+ opts.platform === 'freebsd' || -+ opts.platform === 'linux' || -+ opts.platform === 'sunos' -+ ) { -+ opts.platform = "UNIX"; -+ } -+ if (opts.platform === 'win32') { -+ opts.platform = "DOS"; -+ } -+ -+ var comment = opts.comment || this.comment || ""; -+ worker = generate.generateWorker(this, opts, comment); -+ } catch (e) { -+ worker = new GenericWorker("error"); -+ worker.error(e); -+ } -+ return new StreamHelper(worker, opts.type || "string", opts.mimeType); -+ }, -+ /** -+ * Generate the complete zip file asynchronously. -+ * @see generateInternalStream -+ */ -+ generateAsync: function(options, onUpdate) { -+ return this.generateInternalStream(options).accumulate(onUpdate); -+ }, -+ /** -+ * Generate the complete zip file asynchronously. -+ * @see generateInternalStream -+ */ -+ generateNodeStream: function(options, onUpdate) { -+ options = options || {}; -+ if (!options.type) { -+ options.type = "nodebuffer"; -+ } -+ return this.generateInternalStream(options).toNodejsStream(onUpdate); -+ } -+}; -+module.exports = out; -+ -+}, -+"+6zgrAJw0M2/GBCHmTxjq2aXEq4RcLnHB/U2Lr30AAY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+/** -+ * Code imported from `pino-http` -+ * Repo: https://github.com/pinojs/pino-http -+ * License: MIT (https://raw.githubusercontent.com/pinojs/pino-http/master/LICENSE) -+ */ -+ -+const nullLogger = require('abstract-logging') -+const pino = require('pino') -+const { serializersSym } = pino.symbols -+const { FST_ERR_LOG_INVALID_DESTINATION } = require('./errors') -+ -+function createPinoLogger (opts, stream) { -+ stream = stream || opts.stream -+ delete opts.stream -+ -+ if (stream && opts.file) { -+ throw new FST_ERR_LOG_INVALID_DESTINATION() -+ } else if (opts.file) { -+ // we do not have stream -+ stream = pino.destination(opts.file) -+ delete opts.file -+ } -+ -+ const prevLogger = opts.logger -+ const prevGenReqId = opts.genReqId -+ let logger = null -+ -+ if (prevLogger) { -+ opts.logger = undefined -+ opts.genReqId = undefined -+ // we need to tap into pino internals because in v5 it supports -+ // adding serializers in child loggers -+ if (prevLogger[serializersSym]) { -+ opts.serializers = Object.assign({}, opts.serializers, prevLogger[serializersSym]) -+ } -+ logger = prevLogger.child(opts) -+ opts.logger = prevLogger -+ opts.genReqId = prevGenReqId -+ } else { -+ logger = pino(opts, stream) -+ } -+ -+ return logger -+} -+ -+const serializers = { -+ req: function asReqValue (req) { -+ return { -+ method: req.method, -+ url: req.url, -+ version: req.headers['accept-version'], -+ hostname: req.hostname, -+ remoteAddress: req.ip, -+ remotePort: req.socket.remotePort -+ } -+ }, -+ err: pino.stdSerializers.err, -+ res: function asResValue (reply) { -+ return { -+ statusCode: reply.statusCode -+ } -+ } -+} -+ -+function now () { -+ const ts = process.hrtime() -+ return (ts[0] * 1e3) + (ts[1] / 1e6) -+} -+ -+function createLogger (options) { -+ if (isValidLogger(options.logger)) { -+ const logger = createPinoLogger({ -+ logger: options.logger, -+ serializers: Object.assign({}, serializers, options.logger.serializers) -+ }) -+ return { logger, hasLogger: true } -+ } else if (!options.logger) { -+ const logger = nullLogger -+ logger.child = () => logger -+ return { logger, hasLogger: false } -+ } else { -+ const localLoggerOptions = {} -+ if (Object.prototype.toString.call(options.logger) === '[object Object]') { -+ Reflect.ownKeys(options.logger).forEach(prop => { -+ Object.defineProperty(localLoggerOptions, prop, { -+ value: options.logger[prop], -+ writable: true, -+ enumerable: true, -+ configurable: true -+ }) -+ }) -+ } -+ localLoggerOptions.level = localLoggerOptions.level || 'info' -+ localLoggerOptions.serializers = Object.assign({}, serializers, localLoggerOptions.serializers) -+ options.logger = localLoggerOptions -+ const logger = createPinoLogger(options.logger) -+ return { logger, hasLogger: true } -+ } -+} -+ -+function isValidLogger (logger) { -+ if (!logger) { -+ return false -+ } -+ -+ let result = true -+ const methods = ['info', 'error', 'debug', 'fatal', 'warn', 'trace', 'child'] -+ for (let i = 0; i < methods.length; i += 1) { -+ if (!logger[methods[i]] || typeof logger[methods[i]] !== 'function') { -+ result = false -+ break -+ } -+ } -+ return result -+} -+ -+module.exports = { -+ createLogger, -+ serializers, -+ now -+} -+ -+}, -+"+ATc0OeJj+wyS8eYPHgDv1Utpeu7H2bKLyiKY06stnA=": -+function (require, module, exports, __dirname, __filename) { -+// This is free and unencumbered software released into the public domain. -+// See LICENSE.md for more information. -+ -+var encoding = require("./lib/encoding.js"); -+ -+module.exports = { -+ TextEncoder: encoding.TextEncoder, -+ TextDecoder: encoding.TextDecoder, -+}; -+ -+}, -+"+Ax63u49K4WzK/sdNW+7iGcLUgEU0NC4TdPM7Kpqur0=": -+function (require, module, exports, __dirname, __filename) { -+var once = require('once') -+var noop = function noop(){} -+ -+module.exports = mapLimit -+ -+function mapLimit(arr, limit, iterator, callback) { -+ var complete = 0 -+ var aborted = false -+ var results = [] -+ var queued = 0 -+ var l = arr.length -+ var i = 0 -+ -+ callback = once(callback || noop) -+ if (typeof iterator !== 'function') throw new Error( -+ 'Iterator function must be passed as the third argument' -+ ) -+ -+ for (var r = 0; r < l; r++) { -+ results[r] = null -+ } -+ -+ flush() -+ -+ function flush() { -+ if (complete === l) -+ return callback(null, results) -+ -+ while (queued < limit) { -+ if (aborted) break -+ if (i === l) break -+ push() -+ } -+ } -+ -+ function abort(err) { -+ aborted = true -+ return callback(err) -+ } -+ -+ function push() { -+ var idx = i++ -+ -+ queued += 1 -+ -+ iterator(arr[idx], function(err, result) { -+ if (err) return abort(err) -+ results[idx] = result -+ complete += 1 -+ queued -= 1 -+ flush() -+ }) -+ } -+} -+ -+}, -+"+G44vGXv7fkp0I07mqjzELc8awvdCU6DKNafdbaxhAs=": -+function (require, module, exports, __dirname, __filename) { -+var xsalsa20 = require('xsalsa20') -+ -+exports.crypto_stream_KEYBYTES = 32 -+exports.crypto_stream_NONCEBYTES = 24 -+exports.crypto_stream_PRIMITIVE = 'xsalsa20' -+ -+exports.crypto_stream = function (out, nonce, key) { -+ out.fill(0) -+ exports.crypto_stream_xor(out, out, nonce, key) -+} -+ -+exports.crypto_stream_xor = function (out, inp, nonce, key) { -+ var xor = xsalsa20(nonce, key) -+ xor.update(inp, out) -+ xor.final() -+} -+ -+exports.crypto_stream_xor_instance = function (nonce, key) { -+ return new XOR(nonce, key) -+} -+ -+function XOR (nonce, key) { -+ this._instance = xsalsa20(nonce, key) -+} -+ -+XOR.prototype.update = function (out, inp) { -+ this._instance.update(inp, out) -+} -+ -+XOR.prototype.final = function () { -+ this._instance.finalize() -+ this._instance = null -+} -+ -+}, -+"+KodWd2iZy8K/3s2UvEhKZgo+eewQoIY0ww1n0YFJyA=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.retryAfterStatusCodes = void 0; -+exports.retryAfterStatusCodes = new Set([413, 429, 503]); -+const calculateRetryDelay = ({ attemptCount, retryOptions, error, retryAfter }) => { -+ if (attemptCount > retryOptions.limit) { -+ return 0; -+ } -+ const hasMethod = retryOptions.methods.includes(error.options.method); -+ const hasErrorCode = retryOptions.errorCodes.includes(error.code); -+ const hasStatusCode = error.response && retryOptions.statusCodes.includes(error.response.statusCode); -+ if (!hasMethod || (!hasErrorCode && !hasStatusCode)) { -+ return 0; -+ } -+ if (error.response) { -+ if (retryAfter) { -+ if (retryOptions.maxRetryAfter === undefined || retryAfter > retryOptions.maxRetryAfter) { -+ return 0; -+ } -+ return retryAfter; -+ } -+ if (error.response.statusCode === 413) { -+ return 0; -+ } -+ } -+ const noise = Math.random() * 100; -+ return ((2 ** (attemptCount - 1)) * 1000) + noise; -+}; -+exports.default = calculateRetryDelay; -+ -+}, -+"+OWCloOOIvXM8kxG33UMvIQdIEKiWffUs/8JNyVgey8=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const codegen_1 = require("../../compile/codegen"); -+const util_1 = require("../../compile/util"); -+const error = { -+ message: ({ params }) => codegen_1.str `must match "${params.ifClause}" schema`, -+ params: ({ params }) => codegen_1._ `{failingKeyword: ${params.ifClause}}`, -+}; -+const def = { -+ keyword: "if", -+ schemaType: ["object", "boolean"], -+ trackErrors: true, -+ error, -+ code(cxt) { -+ const { gen, parentSchema, it } = cxt; -+ if (parentSchema.then === undefined && parentSchema.else === undefined) { -+ util_1.checkStrictMode(it, '"if" without "then" and "else" is ignored'); -+ } -+ const hasThen = hasSchema(it, "then"); -+ const hasElse = hasSchema(it, "else"); -+ if (!hasThen && !hasElse) -+ return; -+ const valid = gen.let("valid", true); -+ const schValid = gen.name("_valid"); -+ validateIf(); -+ cxt.reset(); -+ if (hasThen && hasElse) { -+ const ifClause = gen.let("ifClause"); -+ cxt.setParams({ ifClause }); -+ gen.if(schValid, validateClause("then", ifClause), validateClause("else", ifClause)); -+ } -+ else if (hasThen) { -+ gen.if(schValid, validateClause("then")); -+ } -+ else { -+ gen.if(codegen_1.not(schValid), validateClause("else")); -+ } -+ cxt.pass(valid, () => cxt.error(true)); -+ function validateIf() { -+ const schCxt = cxt.subschema({ -+ keyword: "if", -+ compositeRule: true, -+ createErrors: false, -+ allErrors: false, -+ }, schValid); -+ cxt.mergeEvaluated(schCxt); -+ } -+ function validateClause(keyword, ifClause) { -+ return () => { -+ const schCxt = cxt.subschema({ keyword }, schValid); -+ gen.assign(valid, schValid); -+ cxt.mergeValidEvaluated(schCxt, valid); -+ if (ifClause) -+ gen.assign(ifClause, codegen_1._ `${keyword}`); -+ else -+ cxt.setParams({ ifClause: keyword }); -+ }; -+ } -+ }, -+}; -+function hasSchema(it, keyword) { -+ const schema = it.schema[keyword]; -+ return schema !== undefined && !util_1.alwaysValidSchema(it, schema); -+} -+exports.default = def; -+//# sourceMappingURL=if.js.map -+}, -+"+QSAaWxhs2XpWS00oq8nXeRWPzIKSusR+NknzqmbEa8=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.or = exports.and = exports.not = exports.CodeGen = exports.operators = exports.varKinds = exports.ValueScopeName = exports.ValueScope = exports.Scope = exports.Name = exports.regexpCode = exports.stringify = exports.getProperty = exports.nil = exports.strConcat = exports.str = exports._ = void 0; -+const code_1 = require("./code"); -+const scope_1 = require("./scope"); -+var code_2 = require("./code"); -+Object.defineProperty(exports, "_", { enumerable: true, get: function () { return code_2._; } }); -+Object.defineProperty(exports, "str", { enumerable: true, get: function () { return code_2.str; } }); -+Object.defineProperty(exports, "strConcat", { enumerable: true, get: function () { return code_2.strConcat; } }); -+Object.defineProperty(exports, "nil", { enumerable: true, get: function () { return code_2.nil; } }); -+Object.defineProperty(exports, "getProperty", { enumerable: true, get: function () { return code_2.getProperty; } }); -+Object.defineProperty(exports, "stringify", { enumerable: true, get: function () { return code_2.stringify; } }); -+Object.defineProperty(exports, "regexpCode", { enumerable: true, get: function () { return code_2.regexpCode; } }); -+Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return code_2.Name; } }); -+var scope_2 = require("./scope"); -+Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return scope_2.Scope; } }); -+Object.defineProperty(exports, "ValueScope", { enumerable: true, get: function () { return scope_2.ValueScope; } }); -+Object.defineProperty(exports, "ValueScopeName", { enumerable: true, get: function () { return scope_2.ValueScopeName; } }); -+Object.defineProperty(exports, "varKinds", { enumerable: true, get: function () { return scope_2.varKinds; } }); -+exports.operators = { -+ GT: new code_1._Code(">"), -+ GTE: new code_1._Code(">="), -+ LT: new code_1._Code("<"), -+ LTE: new code_1._Code("<="), -+ EQ: new code_1._Code("==="), -+ NEQ: new code_1._Code("!=="), -+ NOT: new code_1._Code("!"), -+ OR: new code_1._Code("||"), -+ AND: new code_1._Code("&&"), -+ ADD: new code_1._Code("+"), -+}; -+class Node { -+ optimizeNodes() { -+ return this; -+ } -+ optimizeNames(_names, _constants) { -+ return this; -+ } -+} -+class Def extends Node { -+ constructor(varKind, name, rhs) { -+ super(); -+ this.varKind = varKind; -+ this.name = name; -+ this.rhs = rhs; -+ } -+ render({ es5, _n }) { -+ const varKind = es5 ? scope_1.varKinds.var : this.varKind; -+ const rhs = this.rhs === undefined ? "" : ` = ${this.rhs}`; -+ return `${varKind} ${this.name}${rhs};` + _n; -+ } -+ optimizeNames(names, constants) { -+ if (!names[this.name.str]) -+ return; -+ if (this.rhs) -+ this.rhs = optimizeExpr(this.rhs, names, constants); -+ return this; -+ } -+ get names() { -+ return this.rhs instanceof code_1._CodeOrName ? this.rhs.names : {}; -+ } -+} -+class Assign extends Node { -+ constructor(lhs, rhs, sideEffects) { -+ super(); -+ this.lhs = lhs; -+ this.rhs = rhs; -+ this.sideEffects = sideEffects; -+ } -+ render({ _n }) { -+ return `${this.lhs} = ${this.rhs};` + _n; -+ } -+ optimizeNames(names, constants) { -+ if (this.lhs instanceof code_1.Name && !names[this.lhs.str] && !this.sideEffects) -+ return; -+ this.rhs = optimizeExpr(this.rhs, names, constants); -+ return this; -+ } -+ get names() { -+ const names = this.lhs instanceof code_1.Name ? {} : { ...this.lhs.names }; -+ return addExprNames(names, this.rhs); -+ } -+} -+class AssignOp extends Assign { -+ constructor(lhs, op, rhs, sideEffects) { -+ super(lhs, rhs, sideEffects); -+ this.op = op; -+ } -+ render({ _n }) { -+ return `${this.lhs} ${this.op}= ${this.rhs};` + _n; -+ } -+} -+class Label extends Node { -+ constructor(label) { -+ super(); -+ this.label = label; -+ this.names = {}; -+ } -+ render({ _n }) { -+ return `${this.label}:` + _n; -+ } -+} -+class Break extends Node { -+ constructor(label) { -+ super(); -+ this.label = label; -+ this.names = {}; -+ } -+ render({ _n }) { -+ const label = this.label ? ` ${this.label}` : ""; -+ return `break${label};` + _n; -+ } -+} -+class Throw extends Node { -+ constructor(error) { -+ super(); -+ this.error = error; -+ } -+ render({ _n }) { -+ return `throw ${this.error};` + _n; -+ } -+ get names() { -+ return this.error.names; -+ } -+} -+class AnyCode extends Node { -+ constructor(code) { -+ super(); -+ this.code = code; -+ } -+ render({ _n }) { -+ return `${this.code};` + _n; -+ } -+ optimizeNodes() { -+ return `${this.code}` ? this : undefined; -+ } -+ optimizeNames(names, constants) { -+ this.code = optimizeExpr(this.code, names, constants); -+ return this; -+ } -+ get names() { -+ return this.code instanceof code_1._CodeOrName ? this.code.names : {}; -+ } -+} -+class ParentNode extends Node { -+ constructor(nodes = []) { -+ super(); -+ this.nodes = nodes; -+ } -+ render(opts) { -+ return this.nodes.reduce((code, n) => code + n.render(opts), ""); -+ } -+ optimizeNodes() { -+ const { nodes } = this; -+ let i = nodes.length; -+ while (i--) { -+ const n = nodes[i].optimizeNodes(); -+ if (Array.isArray(n)) -+ nodes.splice(i, 1, ...n); -+ else if (n) -+ nodes[i] = n; -+ else -+ nodes.splice(i, 1); -+ } -+ return nodes.length > 0 ? this : undefined; -+ } -+ optimizeNames(names, constants) { -+ const { nodes } = this; -+ let i = nodes.length; -+ while (i--) { -+ // iterating backwards improves 1-pass optimization -+ const n = nodes[i]; -+ if (n.optimizeNames(names, constants)) -+ continue; -+ subtractNames(names, n.names); -+ nodes.splice(i, 1); -+ } -+ return nodes.length > 0 ? this : undefined; -+ } -+ get names() { -+ return this.nodes.reduce((names, n) => addNames(names, n.names), {}); -+ } -+} -+class BlockNode extends ParentNode { -+ render(opts) { -+ return "{" + opts._n + super.render(opts) + "}" + opts._n; -+ } -+} -+class Root extends ParentNode { -+} -+class Else extends BlockNode { -+} -+Else.kind = "else"; -+class If extends BlockNode { -+ constructor(condition, nodes) { -+ super(nodes); -+ this.condition = condition; -+ } -+ render(opts) { -+ let code = `if(${this.condition})` + super.render(opts); -+ if (this.else) -+ code += "else " + this.else.render(opts); -+ return code; -+ } -+ optimizeNodes() { -+ super.optimizeNodes(); -+ const cond = this.condition; -+ if (cond === true) -+ return this.nodes; // else is ignored here -+ let e = this.else; -+ if (e) { -+ const ns = e.optimizeNodes(); -+ e = this.else = Array.isArray(ns) ? new Else(ns) : ns; -+ } -+ if (e) { -+ if (cond === false) -+ return e instanceof If ? e : e.nodes; -+ if (this.nodes.length) -+ return this; -+ return new If(not(cond), e instanceof If ? [e] : e.nodes); -+ } -+ if (cond === false || !this.nodes.length) -+ return undefined; -+ return this; -+ } -+ optimizeNames(names, constants) { -+ var _a; -+ this.else = (_a = this.else) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants); -+ if (!(super.optimizeNames(names, constants) || this.else)) -+ return; -+ this.condition = optimizeExpr(this.condition, names, constants); -+ return this; -+ } -+ get names() { -+ const names = super.names; -+ addExprNames(names, this.condition); -+ if (this.else) -+ addNames(names, this.else.names); -+ return names; -+ } -+} -+If.kind = "if"; -+class For extends BlockNode { -+} -+For.kind = "for"; -+class ForLoop extends For { -+ constructor(iteration) { -+ super(); -+ this.iteration = iteration; -+ } -+ render(opts) { -+ return `for(${this.iteration})` + super.render(opts); -+ } -+ optimizeNames(names, constants) { -+ if (!super.optimizeNames(names, constants)) -+ return; -+ this.iteration = optimizeExpr(this.iteration, names, constants); -+ return this; -+ } -+ get names() { -+ return addNames(super.names, this.iteration.names); -+ } -+} -+class ForRange extends For { -+ constructor(varKind, name, from, to) { -+ super(); -+ this.varKind = varKind; -+ this.name = name; -+ this.from = from; -+ this.to = to; -+ } -+ render(opts) { -+ const varKind = opts.es5 ? scope_1.varKinds.var : this.varKind; -+ const { name, from, to } = this; -+ return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts); -+ } -+ get names() { -+ const names = addExprNames(super.names, this.from); -+ return addExprNames(names, this.to); -+ } -+} -+class ForIter extends For { -+ constructor(loop, varKind, name, iterable) { -+ super(); -+ this.loop = loop; -+ this.varKind = varKind; -+ this.name = name; -+ this.iterable = iterable; -+ } -+ render(opts) { -+ return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts); -+ } -+ optimizeNames(names, constants) { -+ if (!super.optimizeNames(names, constants)) -+ return; -+ this.iterable = optimizeExpr(this.iterable, names, constants); -+ return this; -+ } -+ get names() { -+ return addNames(super.names, this.iterable.names); -+ } -+} -+class Func extends BlockNode { -+ constructor(name, args, async) { -+ super(); -+ this.name = name; -+ this.args = args; -+ this.async = async; -+ } -+ render(opts) { -+ const _async = this.async ? "async " : ""; -+ return `${_async}function ${this.name}(${this.args})` + super.render(opts); -+ } -+} -+Func.kind = "func"; -+class Return extends ParentNode { -+ render(opts) { -+ return "return " + super.render(opts); -+ } -+} -+Return.kind = "return"; -+class Try extends BlockNode { -+ render(opts) { -+ let code = "try" + super.render(opts); -+ if (this.catch) -+ code += this.catch.render(opts); -+ if (this.finally) -+ code += this.finally.render(opts); -+ return code; -+ } -+ optimizeNodes() { -+ var _a, _b; -+ super.optimizeNodes(); -+ (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNodes(); -+ (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNodes(); -+ return this; -+ } -+ optimizeNames(names, constants) { -+ var _a, _b; -+ super.optimizeNames(names, constants); -+ (_a = this.catch) === null || _a === void 0 ? void 0 : _a.optimizeNames(names, constants); -+ (_b = this.finally) === null || _b === void 0 ? void 0 : _b.optimizeNames(names, constants); -+ return this; -+ } -+ get names() { -+ const names = super.names; -+ if (this.catch) -+ addNames(names, this.catch.names); -+ if (this.finally) -+ addNames(names, this.finally.names); -+ return names; -+ } -+} -+class Catch extends BlockNode { -+ constructor(error) { -+ super(); -+ this.error = error; -+ } -+ render(opts) { -+ return `catch(${this.error})` + super.render(opts); -+ } -+} -+Catch.kind = "catch"; -+class Finally extends BlockNode { -+ render(opts) { -+ return "finally" + super.render(opts); -+ } -+} -+Finally.kind = "finally"; -+class CodeGen { -+ constructor(extScope, opts = {}) { -+ this._values = {}; -+ this._blockStarts = []; -+ this._constants = {}; -+ this.opts = { ...opts, _n: opts.lines ? "\n" : "" }; -+ this._extScope = extScope; -+ this._scope = new scope_1.Scope({ parent: extScope }); -+ this._nodes = [new Root()]; -+ } -+ toString() { -+ return this._root.render(this.opts); -+ } -+ // returns unique name in the internal scope -+ name(prefix) { -+ return this._scope.name(prefix); -+ } -+ // reserves unique name in the external scope -+ scopeName(prefix) { -+ return this._extScope.name(prefix); -+ } -+ // reserves unique name in the external scope and assigns value to it -+ scopeValue(prefixOrName, value) { -+ const name = this._extScope.value(prefixOrName, value); -+ const vs = this._values[name.prefix] || (this._values[name.prefix] = new Set()); -+ vs.add(name); -+ return name; -+ } -+ getScopeValue(prefix, keyOrRef) { -+ return this._extScope.getValue(prefix, keyOrRef); -+ } -+ // return code that assigns values in the external scope to the names that are used internally -+ // (same names that were returned by gen.scopeName or gen.scopeValue) -+ scopeRefs(scopeName) { -+ return this._extScope.scopeRefs(scopeName, this._values); -+ } -+ scopeCode() { -+ return this._extScope.scopeCode(this._values); -+ } -+ _def(varKind, nameOrPrefix, rhs, constant) { -+ const name = this._scope.toName(nameOrPrefix); -+ if (rhs !== undefined && constant) -+ this._constants[name.str] = rhs; -+ this._leafNode(new Def(varKind, name, rhs)); -+ return name; -+ } -+ // `const` declaration (`var` in es5 mode) -+ const(nameOrPrefix, rhs, _constant) { -+ return this._def(scope_1.varKinds.const, nameOrPrefix, rhs, _constant); -+ } -+ // `let` declaration with optional assignment (`var` in es5 mode) -+ let(nameOrPrefix, rhs, _constant) { -+ return this._def(scope_1.varKinds.let, nameOrPrefix, rhs, _constant); -+ } -+ // `var` declaration with optional assignment -+ var(nameOrPrefix, rhs, _constant) { -+ return this._def(scope_1.varKinds.var, nameOrPrefix, rhs, _constant); -+ } -+ // assignment code -+ assign(lhs, rhs, sideEffects) { -+ return this._leafNode(new Assign(lhs, rhs, sideEffects)); -+ } -+ // `+=` code -+ add(lhs, rhs) { -+ return this._leafNode(new AssignOp(lhs, exports.operators.ADD, rhs)); -+ } -+ // appends passed SafeExpr to code or executes Block -+ code(c) { -+ if (typeof c == "function") -+ c(); -+ else if (c !== code_1.nil) -+ this._leafNode(new AnyCode(c)); -+ return this; -+ } -+ // returns code for object literal for the passed argument list of key-value pairs -+ object(...keyValues) { -+ const code = ["{"]; -+ for (const [key, value] of keyValues) { -+ if (code.length > 1) -+ code.push(","); -+ code.push(key); -+ if (key !== value || this.opts.es5) { -+ code.push(":"); -+ code_1.addCodeArg(code, value); -+ } -+ } -+ code.push("}"); -+ return new code_1._Code(code); -+ } -+ // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed) -+ if(condition, thenBody, elseBody) { -+ this._blockNode(new If(condition)); -+ if (thenBody && elseBody) { -+ this.code(thenBody).else().code(elseBody).endIf(); -+ } -+ else if (thenBody) { -+ this.code(thenBody).endIf(); -+ } -+ else if (elseBody) { -+ throw new Error('CodeGen: "else" body without "then" body'); -+ } -+ return this; -+ } -+ // `else if` clause - invalid without `if` or after `else` clauses -+ elseIf(condition) { -+ return this._elseNode(new If(condition)); -+ } -+ // `else` clause - only valid after `if` or `else if` clauses -+ else() { -+ return this._elseNode(new Else()); -+ } -+ // end `if` statement (needed if gen.if was used only with condition) -+ endIf() { -+ return this._endBlockNode(If, Else); -+ } -+ _for(node, forBody) { -+ this._blockNode(node); -+ if (forBody) -+ this.code(forBody).endFor(); -+ return this; -+ } -+ // a generic `for` clause (or statement if `forBody` is passed) -+ for(iteration, forBody) { -+ return this._for(new ForLoop(iteration), forBody); -+ } -+ // `for` statement for a range of values -+ forRange(nameOrPrefix, from, to, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.let) { -+ const name = this._scope.toName(nameOrPrefix); -+ return this._for(new ForRange(varKind, name, from, to), () => forBody(name)); -+ } -+ // `for-of` statement (in es5 mode replace with a normal for loop) -+ forOf(nameOrPrefix, iterable, forBody, varKind = scope_1.varKinds.const) { -+ const name = this._scope.toName(nameOrPrefix); -+ if (this.opts.es5) { -+ const arr = iterable instanceof code_1.Name ? iterable : this.var("_arr", iterable); -+ return this.forRange("_i", 0, code_1._ `${arr}.length`, (i) => { -+ this.var(name, code_1._ `${arr}[${i}]`); -+ forBody(name); -+ }); -+ } -+ return this._for(new ForIter("of", varKind, name, iterable), () => forBody(name)); -+ } -+ // `for-in` statement. -+ // With option `ownProperties` replaced with a `for-of` loop for object keys -+ forIn(nameOrPrefix, obj, forBody, varKind = this.opts.es5 ? scope_1.varKinds.var : scope_1.varKinds.const) { -+ if (this.opts.ownProperties) { -+ return this.forOf(nameOrPrefix, code_1._ `Object.keys(${obj})`, forBody); -+ } -+ const name = this._scope.toName(nameOrPrefix); -+ return this._for(new ForIter("in", varKind, name, obj), () => forBody(name)); -+ } -+ // end `for` loop -+ endFor() { -+ return this._endBlockNode(For); -+ } -+ // `label` statement -+ label(label) { -+ return this._leafNode(new Label(label)); -+ } -+ // `break` statement -+ break(label) { -+ return this._leafNode(new Break(label)); -+ } -+ // `return` statement -+ return(value) { -+ const node = new Return(); -+ this._blockNode(node); -+ this.code(value); -+ if (node.nodes.length !== 1) -+ throw new Error('CodeGen: "return" should have one node'); -+ return this._endBlockNode(Return); -+ } -+ // `try` statement -+ try(tryBody, catchCode, finallyCode) { -+ if (!catchCode && !finallyCode) -+ throw new Error('CodeGen: "try" without "catch" and "finally"'); -+ const node = new Try(); -+ this._blockNode(node); -+ this.code(tryBody); -+ if (catchCode) { -+ const error = this.name("e"); -+ this._currNode = node.catch = new Catch(error); -+ catchCode(error); -+ } -+ if (finallyCode) { -+ this._currNode = node.finally = new Finally(); -+ this.code(finallyCode); -+ } -+ return this._endBlockNode(Catch, Finally); -+ } -+ // `throw` statement -+ throw(error) { -+ return this._leafNode(new Throw(error)); -+ } -+ // start self-balancing block -+ block(body, nodeCount) { -+ this._blockStarts.push(this._nodes.length); -+ if (body) -+ this.code(body).endBlock(nodeCount); -+ return this; -+ } -+ // end the current self-balancing block -+ endBlock(nodeCount) { -+ const len = this._blockStarts.pop(); -+ if (len === undefined) -+ throw new Error("CodeGen: not in self-balancing block"); -+ const toClose = this._nodes.length - len; -+ if (toClose < 0 || (nodeCount !== undefined && toClose !== nodeCount)) { -+ throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`); -+ } -+ this._nodes.length = len; -+ return this; -+ } -+ // `function` heading (or definition if funcBody is passed) -+ func(name, args = code_1.nil, async, funcBody) { -+ this._blockNode(new Func(name, args, async)); -+ if (funcBody) -+ this.code(funcBody).endFunc(); -+ return this; -+ } -+ // end function definition -+ endFunc() { -+ return this._endBlockNode(Func); -+ } -+ optimize(n = 1) { -+ while (n-- > 0) { -+ this._root.optimizeNodes(); -+ this._root.optimizeNames(this._root.names, this._constants); -+ } -+ } -+ _leafNode(node) { -+ this._currNode.nodes.push(node); -+ return this; -+ } -+ _blockNode(node) { -+ this._currNode.nodes.push(node); -+ this._nodes.push(node); -+ } -+ _endBlockNode(N1, N2) { -+ const n = this._currNode; -+ if (n instanceof N1 || (N2 && n instanceof N2)) { -+ this._nodes.pop(); -+ return this; -+ } -+ throw new Error(`CodeGen: not in block "${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}"`); -+ } -+ _elseNode(node) { -+ const n = this._currNode; -+ if (!(n instanceof If)) { -+ throw new Error('CodeGen: "else" without "if"'); -+ } -+ this._currNode = n.else = node; -+ return this; -+ } -+ get _root() { -+ return this._nodes[0]; -+ } -+ get _currNode() { -+ const ns = this._nodes; -+ return ns[ns.length - 1]; -+ } -+ set _currNode(node) { -+ const ns = this._nodes; -+ ns[ns.length - 1] = node; -+ } -+} -+exports.CodeGen = CodeGen; -+function addNames(names, from) { -+ for (const n in from) -+ names[n] = (names[n] || 0) + (from[n] || 0); -+ return names; -+} -+function addExprNames(names, from) { -+ return from instanceof code_1._CodeOrName ? addNames(names, from.names) : names; -+} -+function optimizeExpr(expr, names, constants) { -+ if (expr instanceof code_1.Name) -+ return replaceName(expr); -+ if (!canOptimize(expr)) -+ return expr; -+ return new code_1._Code(expr._items.reduce((items, c) => { -+ if (c instanceof code_1.Name) -+ c = replaceName(c); -+ if (c instanceof code_1._Code) -+ items.push(...c._items); -+ else -+ items.push(c); -+ return items; -+ }, [])); -+ function replaceName(n) { -+ const c = constants[n.str]; -+ if (c === undefined || names[n.str] !== 1) -+ return n; -+ delete names[n.str]; -+ return c; -+ } -+ function canOptimize(e) { -+ return (e instanceof code_1._Code && -+ e._items.some((c) => c instanceof code_1.Name && names[c.str] === 1 && constants[c.str] !== undefined)); -+ } -+} -+function subtractNames(names, from) { -+ for (const n in from) -+ names[n] = (names[n] || 0) - (from[n] || 0); -+} -+function not(x) { -+ return typeof x == "boolean" || typeof x == "number" || x === null ? !x : code_1._ `!${par(x)}`; -+} -+exports.not = not; -+const andCode = mappend(exports.operators.AND); -+// boolean AND (&&) expression with the passed arguments -+function and(...args) { -+ return args.reduce(andCode); -+} -+exports.and = and; -+const orCode = mappend(exports.operators.OR); -+// boolean OR (||) expression with the passed arguments -+function or(...args) { -+ return args.reduce(orCode); -+} -+exports.or = or; -+function mappend(op) { -+ return (x, y) => (x === code_1.nil ? y : y === code_1.nil ? x : code_1._ `${par(x)} ${op} ${par(y)}`); -+} -+function par(x) { -+ return x instanceof code_1.Name ? x : code_1._ `(${x})`; -+} -+//# sourceMappingURL=index.js.map -+}, -+"+Vj3u4AGUaeSiJwFFm8yruEFc4XfTEf/f9LtK4hOLfM=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+const OriginalAgent = require('http').Agent; -+const ms = require('humanize-ms'); -+const debug = require('debug')('agentkeepalive'); -+const deprecate = require('depd')('agentkeepalive'); -+const { -+ INIT_SOCKET, -+ CURRENT_ID, -+ CREATE_ID, -+ SOCKET_CREATED_TIME, -+ SOCKET_NAME, -+ SOCKET_REQUEST_COUNT, -+ SOCKET_REQUEST_FINISHED_COUNT, -+} = require('./constants'); -+ -+// OriginalAgent come from -+// - https://github.com/nodejs/node/blob/v8.12.0/lib/_http_agent.js -+// - https://github.com/nodejs/node/blob/v10.12.0/lib/_http_agent.js -+ -+// node <= 10 -+let defaultTimeoutListenerCount = 1; -+const majorVersion = parseInt(process.version.split('.', 1)[0].substring(1)); -+if (majorVersion >= 11 && majorVersion <= 12) { -+ defaultTimeoutListenerCount = 2; -+} else if (majorVersion >= 13) { -+ defaultTimeoutListenerCount = 3; -+} -+ -+class Agent extends OriginalAgent { -+ constructor(options) { -+ options = options || {}; -+ options.keepAlive = options.keepAlive !== false; -+ // default is keep-alive and 15s free socket timeout -+ if (options.freeSocketTimeout === undefined) { -+ options.freeSocketTimeout = 15000; -+ } -+ // Legacy API: keepAliveTimeout should be rename to `freeSocketTimeout` -+ if (options.keepAliveTimeout) { -+ deprecate('options.keepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); -+ options.freeSocketTimeout = options.keepAliveTimeout; -+ delete options.keepAliveTimeout; -+ } -+ // Legacy API: freeSocketKeepAliveTimeout should be rename to `freeSocketTimeout` -+ if (options.freeSocketKeepAliveTimeout) { -+ deprecate('options.freeSocketKeepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); -+ options.freeSocketTimeout = options.freeSocketKeepAliveTimeout; -+ delete options.freeSocketKeepAliveTimeout; -+ } -+ -+ // Sets the socket to timeout after timeout milliseconds of inactivity on the socket. -+ // By default is double free socket timeout. -+ if (options.timeout === undefined) { -+ // make sure socket default inactivity timeout >= 30s -+ options.timeout = Math.max(options.freeSocketTimeout * 2, 30000); -+ } -+ -+ // support humanize format -+ options.timeout = ms(options.timeout); -+ options.freeSocketTimeout = ms(options.freeSocketTimeout); -+ options.socketActiveTTL = options.socketActiveTTL ? ms(options.socketActiveTTL) : 0; -+ -+ super(options); -+ -+ this[CURRENT_ID] = 0; -+ -+ // create socket success counter -+ this.createSocketCount = 0; -+ this.createSocketCountLastCheck = 0; -+ -+ this.createSocketErrorCount = 0; -+ this.createSocketErrorCountLastCheck = 0; -+ -+ this.closeSocketCount = 0; -+ this.closeSocketCountLastCheck = 0; -+ -+ // socket error event count -+ this.errorSocketCount = 0; -+ this.errorSocketCountLastCheck = 0; -+ -+ // request finished counter -+ this.requestCount = 0; -+ this.requestCountLastCheck = 0; -+ -+ // including free socket timeout counter -+ this.timeoutSocketCount = 0; -+ this.timeoutSocketCountLastCheck = 0; -+ -+ this.on('free', socket => { -+ // https://github.com/nodejs/node/pull/32000 -+ // Node.js native agent will check socket timeout eqs agent.options.timeout. -+ // Use the ttl or freeSocketTimeout to overwrite. -+ const timeout = this.calcSocketTimeout(socket); -+ if (timeout > 0 && socket.timeout !== timeout) { -+ socket.setTimeout(timeout); -+ } -+ }); -+ } -+ -+ get freeSocketKeepAliveTimeout() { -+ deprecate('agent.freeSocketKeepAliveTimeout is deprecated, please use agent.options.freeSocketTimeout instead'); -+ return this.options.freeSocketTimeout; -+ } -+ -+ get timeout() { -+ deprecate('agent.timeout is deprecated, please use agent.options.timeout instead'); -+ return this.options.timeout; -+ } -+ -+ get socketActiveTTL() { -+ deprecate('agent.socketActiveTTL is deprecated, please use agent.options.socketActiveTTL instead'); -+ return this.options.socketActiveTTL; -+ } -+ -+ calcSocketTimeout(socket) { -+ /** -+ * return <= 0: should free socket -+ * return > 0: should update socket timeout -+ * return undefined: not find custom timeout -+ */ -+ let freeSocketTimeout = this.options.freeSocketTimeout; -+ const socketActiveTTL = this.options.socketActiveTTL; -+ if (socketActiveTTL) { -+ // check socketActiveTTL -+ const aliveTime = Date.now() - socket[SOCKET_CREATED_TIME]; -+ const diff = socketActiveTTL - aliveTime; -+ if (diff <= 0) { -+ return diff; -+ } -+ if (freeSocketTimeout && diff < freeSocketTimeout) { -+ freeSocketTimeout = diff; -+ } -+ } -+ // set freeSocketTimeout -+ if (freeSocketTimeout) { -+ // set free keepalive timer -+ // try to use socket custom freeSocketTimeout first, support headers['keep-alive'] -+ // https://github.com/node-modules/urllib/blob/b76053020923f4d99a1c93cf2e16e0c5ba10bacf/lib/urllib.js#L498 -+ const customFreeSocketTimeout = socket.freeSocketTimeout || socket.freeSocketKeepAliveTimeout; -+ return customFreeSocketTimeout || freeSocketTimeout; -+ } -+ } -+ -+ keepSocketAlive(socket) { -+ const result = super.keepSocketAlive(socket); -+ // should not keepAlive, do nothing -+ if (!result) return result; -+ -+ const customTimeout = this.calcSocketTimeout(socket); -+ if (typeof customTimeout === 'undefined') { -+ return true; -+ } -+ if (customTimeout <= 0) { -+ debug('%s(requests: %s, finished: %s) free but need to destroy by TTL, request count %s, diff is %s', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], customTimeout); -+ return false; -+ } -+ if (socket.timeout !== customTimeout) { -+ socket.setTimeout(customTimeout); -+ } -+ return true; -+ } -+ -+ // only call on addRequest -+ reuseSocket(...args) { -+ // reuseSocket(socket, req) -+ super.reuseSocket(...args); -+ const socket = args[0]; -+ const req = args[1]; -+ req.reusedSocket = true; -+ const agentTimeout = this.options.timeout; -+ if (getSocketTimeout(socket) !== agentTimeout) { -+ // reset timeout before use -+ socket.setTimeout(agentTimeout); -+ debug('%s reset timeout to %sms', socket[SOCKET_NAME], agentTimeout); -+ } -+ socket[SOCKET_REQUEST_COUNT]++; -+ debug('%s(requests: %s, finished: %s) reuse on addRequest, timeout %sms', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], -+ getSocketTimeout(socket)); -+ } -+ -+ [CREATE_ID]() { -+ const id = this[CURRENT_ID]++; -+ if (this[CURRENT_ID] === Number.MAX_SAFE_INTEGER) this[CURRENT_ID] = 0; -+ return id; -+ } -+ -+ [INIT_SOCKET](socket, options) { -+ // bugfix here. -+ // https on node 8, 10 won't set agent.options.timeout by default -+ // TODO: need to fix on node itself -+ if (options.timeout) { -+ const timeout = getSocketTimeout(socket); -+ if (!timeout) { -+ socket.setTimeout(options.timeout); -+ } -+ } -+ -+ if (this.options.keepAlive) { -+ // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/ -+ // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html -+ socket.setNoDelay(true); -+ } -+ this.createSocketCount++; -+ if (this.options.socketActiveTTL) { -+ socket[SOCKET_CREATED_TIME] = Date.now(); -+ } -+ // don't show the hole '-----BEGIN CERTIFICATE----' key string -+ socket[SOCKET_NAME] = `sock[${this[CREATE_ID]()}#${options._agentKey}]`.split('-----BEGIN', 1)[0]; -+ socket[SOCKET_REQUEST_COUNT] = 1; -+ socket[SOCKET_REQUEST_FINISHED_COUNT] = 0; -+ installListeners(this, socket, options); -+ } -+ -+ createConnection(options, oncreate) { -+ let called = false; -+ const onNewCreate = (err, socket) => { -+ if (called) return; -+ called = true; -+ -+ if (err) { -+ this.createSocketErrorCount++; -+ return oncreate(err); -+ } -+ this[INIT_SOCKET](socket, options); -+ oncreate(err, socket); -+ }; -+ -+ const newSocket = super.createConnection(options, onNewCreate); -+ if (newSocket) onNewCreate(null, newSocket); -+ } -+ -+ get statusChanged() { -+ const changed = this.createSocketCount !== this.createSocketCountLastCheck || -+ this.createSocketErrorCount !== this.createSocketErrorCountLastCheck || -+ this.closeSocketCount !== this.closeSocketCountLastCheck || -+ this.errorSocketCount !== this.errorSocketCountLastCheck || -+ this.timeoutSocketCount !== this.timeoutSocketCountLastCheck || -+ this.requestCount !== this.requestCountLastCheck; -+ if (changed) { -+ this.createSocketCountLastCheck = this.createSocketCount; -+ this.createSocketErrorCountLastCheck = this.createSocketErrorCount; -+ this.closeSocketCountLastCheck = this.closeSocketCount; -+ this.errorSocketCountLastCheck = this.errorSocketCount; -+ this.timeoutSocketCountLastCheck = this.timeoutSocketCount; -+ this.requestCountLastCheck = this.requestCount; -+ } -+ return changed; -+ } -+ -+ getCurrentStatus() { -+ return { -+ createSocketCount: this.createSocketCount, -+ createSocketErrorCount: this.createSocketErrorCount, -+ closeSocketCount: this.closeSocketCount, -+ errorSocketCount: this.errorSocketCount, -+ timeoutSocketCount: this.timeoutSocketCount, -+ requestCount: this.requestCount, -+ freeSockets: inspect(this.freeSockets), -+ sockets: inspect(this.sockets), -+ requests: inspect(this.requests), -+ }; -+ } -+} -+ -+// node 8 don't has timeout attribute on socket -+// https://github.com/nodejs/node/pull/21204/files#diff-e6ef024c3775d787c38487a6309e491dR408 -+function getSocketTimeout(socket) { -+ return socket.timeout || socket._idleTimeout; -+} -+ -+function installListeners(agent, socket, options) { -+ debug('%s create, timeout %sms', socket[SOCKET_NAME], getSocketTimeout(socket)); -+ -+ // listener socket events: close, timeout, error, free -+ function onFree() { -+ // create and socket.emit('free') logic -+ // https://github.com/nodejs/node/blob/master/lib/_http_agent.js#L311 -+ // no req on the socket, it should be the new socket -+ if (!socket._httpMessage && socket[SOCKET_REQUEST_COUNT] === 1) return; -+ -+ socket[SOCKET_REQUEST_FINISHED_COUNT]++; -+ agent.requestCount++; -+ debug('%s(requests: %s, finished: %s) free', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); -+ -+ // should reuse on pedding requests? -+ const name = agent.getName(options); -+ if (socket.writable && agent.requests[name] && agent.requests[name].length) { -+ // will be reuse on agent free listener -+ socket[SOCKET_REQUEST_COUNT]++; -+ debug('%s(requests: %s, finished: %s) will be reuse on agent free event', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); -+ } -+ } -+ socket.on('free', onFree); -+ -+ function onClose(isError) { -+ debug('%s(requests: %s, finished: %s) close, isError: %s', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], isError); -+ agent.closeSocketCount++; -+ } -+ socket.on('close', onClose); -+ -+ // start socket timeout handler -+ function onTimeout() { -+ // onTimeout and emitRequestTimeout(_http_client.js) -+ // https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L711 -+ const listenerCount = socket.listeners('timeout').length; -+ // node <= 10, default listenerCount is 1, onTimeout -+ // 11 < node <= 12, default listenerCount is 2, onTimeout and emitRequestTimeout -+ // node >= 13, default listenerCount is 3, onTimeout, -+ // onTimeout(https://github.com/nodejs/node/pull/32000/files#diff-5f7fb0850412c6be189faeddea6c5359R333) -+ // and emitRequestTimeout -+ const timeout = getSocketTimeout(socket); -+ const req = socket._httpMessage; -+ const reqTimeoutListenerCount = req && req.listeners('timeout').length || 0; -+ debug('%s(requests: %s, finished: %s) timeout after %sms, listeners %s, defaultTimeoutListenerCount %s, hasHttpRequest %s, HttpRequest timeoutListenerCount %s', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], -+ timeout, listenerCount, defaultTimeoutListenerCount, !!req, reqTimeoutListenerCount); -+ if (debug.enabled) { -+ debug('timeout listeners: %s', socket.listeners('timeout').map(f => f.name).join(', ')); -+ } -+ agent.timeoutSocketCount++; -+ const name = agent.getName(options); -+ if (agent.freeSockets[name] && agent.freeSockets[name].indexOf(socket) !== -1) { -+ // free socket timeout, destroy quietly -+ socket.destroy(); -+ // Remove it from freeSockets list immediately to prevent new requests -+ // from being sent through this socket. -+ agent.removeSocket(socket, options); -+ debug('%s is free, destroy quietly', socket[SOCKET_NAME]); -+ } else { -+ // if there is no any request socket timeout handler, -+ // agent need to handle socket timeout itself. -+ // -+ // custom request socket timeout handle logic must follow these rules: -+ // 1. Destroy socket first -+ // 2. Must emit socket 'agentRemove' event tell agent remove socket -+ // from freeSockets list immediately. -+ // Otherise you may be get 'socket hang up' error when reuse -+ // free socket and timeout happen in the same time. -+ if (reqTimeoutListenerCount === 0) { -+ const error = new Error('Socket timeout'); -+ error.code = 'ERR_SOCKET_TIMEOUT'; -+ error.timeout = timeout; -+ // must manually call socket.end() or socket.destroy() to end the connection. -+ // https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_settimeout_timeout_callback -+ socket.destroy(error); -+ agent.removeSocket(socket, options); -+ debug('%s destroy with timeout error', socket[SOCKET_NAME]); -+ } -+ } -+ } -+ socket.on('timeout', onTimeout); -+ -+ function onError(err) { -+ const listenerCount = socket.listeners('error').length; -+ debug('%s(requests: %s, finished: %s) error: %s, listenerCount: %s', -+ socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], -+ err, listenerCount); -+ agent.errorSocketCount++; -+ if (listenerCount === 1) { -+ // if socket don't contain error event handler, don't catch it, emit it again -+ debug('%s emit uncaught error event', socket[SOCKET_NAME]); -+ socket.removeListener('error', onError); -+ socket.emit('error', err); -+ } -+ } -+ socket.on('error', onError); -+ -+ function onRemove() { -+ debug('%s(requests: %s, finished: %s) agentRemove', -+ socket[SOCKET_NAME], -+ socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); -+ // We need this function for cases like HTTP 'upgrade' -+ // (defined by WebSockets) where we need to remove a socket from the -+ // pool because it'll be locked up indefinitely -+ socket.removeListener('close', onClose); -+ socket.removeListener('error', onError); -+ socket.removeListener('free', onFree); -+ socket.removeListener('timeout', onTimeout); -+ socket.removeListener('agentRemove', onRemove); -+ } -+ socket.on('agentRemove', onRemove); -+} -+ -+module.exports = Agent; -+ -+function inspect(obj) { -+ const res = {}; -+ for (const key in obj) { -+ res[key] = obj[key].length; -+ } -+ return res; -+} -+ -+}, -+"+WftLrHhqglv7DAMCAaUf6gxI4xztJ3f1iye6Plg9Yw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+const OriginalHttpsAgent = require('https').Agent; -+const HttpAgent = require('./agent'); -+const { -+ INIT_SOCKET, -+ CREATE_HTTPS_CONNECTION, -+} = require('./constants'); -+ -+class HttpsAgent extends HttpAgent { -+ constructor(options) { -+ super(options); -+ -+ this.defaultPort = 443; -+ this.protocol = 'https:'; -+ this.maxCachedSessions = this.options.maxCachedSessions; -+ /* istanbul ignore next */ -+ if (this.maxCachedSessions === undefined) { -+ this.maxCachedSessions = 100; -+ } -+ -+ this._sessionCache = { -+ map: {}, -+ list: [], -+ }; -+ } -+ -+ createConnection(options) { -+ const socket = this[CREATE_HTTPS_CONNECTION](options); -+ this[INIT_SOCKET](socket, options); -+ return socket; -+ } -+} -+ -+// https://github.com/nodejs/node/blob/master/lib/https.js#L89 -+HttpsAgent.prototype[CREATE_HTTPS_CONNECTION] = OriginalHttpsAgent.prototype.createConnection; -+ -+[ -+ 'getName', -+ '_getSession', -+ '_cacheSession', -+ // https://github.com/nodejs/node/pull/4982 -+ '_evictSession', -+].forEach(function(method) { -+ /* istanbul ignore next */ -+ if (typeof OriginalHttpsAgent.prototype[method] === 'function') { -+ HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method]; -+ } -+}); -+ -+module.exports = HttpsAgent; -+ -+}, -+"+d5dkll+tS6ZyPthsKKREH0kPSfONRPWB61BVu02/VI=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const util_1 = require("../../compile/util"); -+const def = { -+ keyword: "not", -+ schemaType: ["object", "boolean"], -+ trackErrors: true, -+ code(cxt) { -+ const { gen, schema, it } = cxt; -+ if (util_1.alwaysValidSchema(it, schema)) { -+ cxt.fail(); -+ return; -+ } -+ const valid = gen.name("valid"); -+ cxt.subschema({ -+ keyword: "not", -+ compositeRule: true, -+ createErrors: false, -+ allErrors: false, -+ }, valid); -+ cxt.result(valid, () => cxt.error(), () => cxt.reset()); -+ }, -+ error: { message: "must NOT be valid" }, -+}; -+exports.default = def; -+//# sourceMappingURL=not.js.map -+}, -+"+gTRLFOmM3YZLqHDXoAXFf4cRvYgMA8u1DK94N/6bEQ=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.isResponseOk = void 0; -+exports.isResponseOk = (response) => { -+ const { statusCode } = response; -+ const limitStatusCode = response.request.options.followRedirect ? 299 : 399; -+ return (statusCode >= 200 && statusCode <= limitStatusCode) || statusCode === 304; -+}; -+ -+}, -+"+ij3xbmBZEYasGXMSNmPbyBHAia/Z5LvyYRwRi9fJJk=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * to-regex-range -+ * -+ * Copyright (c) 2015, 2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var repeat = require('repeat-string'); -+var isNumber = require('is-number'); -+var cache = {}; -+ -+function toRegexRange(min, max, options) { -+ if (isNumber(min) === false) { -+ throw new RangeError('toRegexRange: first argument is invalid.'); -+ } -+ -+ if (typeof max === 'undefined' || min === max) { -+ return String(min); -+ } -+ -+ if (isNumber(max) === false) { -+ throw new RangeError('toRegexRange: second argument is invalid.'); -+ } -+ -+ options = options || {}; -+ var relax = String(options.relaxZeros); -+ var shorthand = String(options.shorthand); -+ var capture = String(options.capture); -+ var key = min + ':' + max + '=' + relax + shorthand + capture; -+ if (cache.hasOwnProperty(key)) { -+ return cache[key].result; -+ } -+ -+ var a = Math.min(min, max); -+ var b = Math.max(min, max); -+ -+ if (Math.abs(a - b) === 1) { -+ var result = min + '|' + max; -+ if (options.capture) { -+ return '(' + result + ')'; -+ } -+ return result; -+ } -+ -+ var isPadded = padding(min) || padding(max); -+ var positives = []; -+ var negatives = []; -+ -+ var tok = {min: min, max: max, a: a, b: b}; -+ if (isPadded) { -+ tok.isPadded = isPadded; -+ tok.maxLen = String(tok.max).length; -+ } -+ -+ if (a < 0) { -+ var newMin = b < 0 ? Math.abs(b) : 1; -+ var newMax = Math.abs(a); -+ negatives = splitToPatterns(newMin, newMax, tok, options); -+ a = tok.a = 0; -+ } -+ -+ if (b >= 0) { -+ positives = splitToPatterns(a, b, tok, options); -+ } -+ -+ tok.negatives = negatives; -+ tok.positives = positives; -+ tok.result = siftPatterns(negatives, positives, options); -+ -+ if (options.capture && (positives.length + negatives.length) > 1) { -+ tok.result = '(' + tok.result + ')'; -+ } -+ -+ cache[key] = tok; -+ return tok.result; -+} -+ -+function siftPatterns(neg, pos, options) { -+ var onlyNegative = filterPatterns(neg, pos, '-', false, options) || []; -+ var onlyPositive = filterPatterns(pos, neg, '', false, options) || []; -+ var intersected = filterPatterns(neg, pos, '-?', true, options) || []; -+ var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); -+ return subpatterns.join('|'); -+} -+ -+function splitToRanges(min, max) { -+ min = Number(min); -+ max = Number(max); -+ -+ var nines = 1; -+ var stops = [max]; -+ var stop = +countNines(min, nines); -+ -+ while (min <= stop && stop <= max) { -+ stops = push(stops, stop); -+ nines += 1; -+ stop = +countNines(min, nines); -+ } -+ -+ var zeros = 1; -+ stop = countZeros(max + 1, zeros) - 1; -+ -+ while (min < stop && stop <= max) { -+ stops = push(stops, stop); -+ zeros += 1; -+ stop = countZeros(max + 1, zeros) - 1; -+ } -+ -+ stops.sort(compare); -+ return stops; -+} -+ -+/** -+ * Convert a range to a regex pattern -+ * @param {Number} `start` -+ * @param {Number} `stop` -+ * @return {String} -+ */ -+ -+function rangeToPattern(start, stop, options) { -+ if (start === stop) { -+ return {pattern: String(start), digits: []}; -+ } -+ -+ var zipped = zip(String(start), String(stop)); -+ var len = zipped.length, i = -1; -+ -+ var pattern = ''; -+ var digits = 0; -+ -+ while (++i < len) { -+ var numbers = zipped[i]; -+ var startDigit = numbers[0]; -+ var stopDigit = numbers[1]; -+ -+ if (startDigit === stopDigit) { -+ pattern += startDigit; -+ -+ } else if (startDigit !== '0' || stopDigit !== '9') { -+ pattern += toCharacterClass(startDigit, stopDigit); -+ -+ } else { -+ digits += 1; -+ } -+ } -+ -+ if (digits) { -+ pattern += options.shorthand ? '\\d' : '[0-9]'; -+ } -+ -+ return { pattern: pattern, digits: [digits] }; -+} -+ -+function splitToPatterns(min, max, tok, options) { -+ var ranges = splitToRanges(min, max); -+ var len = ranges.length; -+ var idx = -1; -+ -+ var tokens = []; -+ var start = min; -+ var prev; -+ -+ while (++idx < len) { -+ var range = ranges[idx]; -+ var obj = rangeToPattern(start, range, options); -+ var zeros = ''; -+ -+ if (!tok.isPadded && prev && prev.pattern === obj.pattern) { -+ if (prev.digits.length > 1) { -+ prev.digits.pop(); -+ } -+ prev.digits.push(obj.digits[0]); -+ prev.string = prev.pattern + toQuantifier(prev.digits); -+ start = range + 1; -+ continue; -+ } -+ -+ if (tok.isPadded) { -+ zeros = padZeros(range, tok); -+ } -+ -+ obj.string = zeros + obj.pattern + toQuantifier(obj.digits); -+ tokens.push(obj); -+ start = range + 1; -+ prev = obj; -+ } -+ -+ return tokens; -+} -+ -+function filterPatterns(arr, comparison, prefix, intersection, options) { -+ var res = []; -+ -+ for (var i = 0; i < arr.length; i++) { -+ var tok = arr[i]; -+ var ele = tok.string; -+ -+ if (options.relaxZeros !== false) { -+ if (prefix === '-' && ele.charAt(0) === '0') { -+ if (ele.charAt(1) === '{') { -+ ele = '0*' + ele.replace(/^0\{\d+\}/, ''); -+ } else { -+ ele = '0*' + ele.slice(1); -+ } -+ } -+ } -+ -+ if (!intersection && !contains(comparison, 'string', ele)) { -+ res.push(prefix + ele); -+ } -+ -+ if (intersection && contains(comparison, 'string', ele)) { -+ res.push(prefix + ele); -+ } -+ } -+ return res; -+} -+ -+/** -+ * Zip strings (`for in` can be used on string characters) -+ */ -+ -+function zip(a, b) { -+ var arr = []; -+ for (var ch in a) arr.push([a[ch], b[ch]]); -+ return arr; -+} -+ -+function compare(a, b) { -+ return a > b ? 1 : b > a ? -1 : 0; -+} -+ -+function push(arr, ele) { -+ if (arr.indexOf(ele) === -1) arr.push(ele); -+ return arr; -+} -+ -+function contains(arr, key, val) { -+ for (var i = 0; i < arr.length; i++) { -+ if (arr[i][key] === val) { -+ return true; -+ } -+ } -+ return false; -+} -+ -+function countNines(min, len) { -+ return String(min).slice(0, -len) + repeat('9', len); -+} -+ -+function countZeros(integer, zeros) { -+ return integer - (integer % Math.pow(10, zeros)); -+} -+ -+function toQuantifier(digits) { -+ var start = digits[0]; -+ var stop = digits[1] ? (',' + digits[1]) : ''; -+ if (!stop && (!start || start === 1)) { -+ return ''; -+ } -+ return '{' + start + stop + '}'; -+} -+ -+function toCharacterClass(a, b) { -+ return '[' + a + ((b - a === 1) ? '' : '-') + b + ']'; -+} -+ -+function padding(str) { -+ return /^-?(0+)\d/.exec(str); -+} -+ -+function padZeros(val, tok) { -+ if (tok.isPadded) { -+ var diff = Math.abs(tok.maxLen - String(val).length); -+ switch (diff) { -+ case 0: -+ return ''; -+ case 1: -+ return '0'; -+ default: { -+ return '0{' + diff + '}'; -+ } -+ } -+ } -+ return val; -+} -+ -+/** -+ * Expose `toRegexRange` -+ */ -+ -+module.exports = toRegexRange; -+ -+}, -+"+knOC9dQMP/hwr8qJLri76IS7Ejw++bj5s/81aSSYlQ=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+/** -+ * POSIX character classes -+ */ -+ -+module.exports = { -+ alnum: 'a-zA-Z0-9', -+ alpha: 'a-zA-Z', -+ ascii: '\\x00-\\x7F', -+ blank: ' \\t', -+ cntrl: '\\x00-\\x1F\\x7F', -+ digit: '0-9', -+ graph: '\\x21-\\x7E', -+ lower: 'a-z', -+ print: '\\x20-\\x7E ', -+ punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', -+ space: ' \\t\\r\\n\\v\\f', -+ upper: 'A-Z', -+ word: 'A-Za-z0-9_', -+ xdigit: 'A-Fa-f0-9' -+}; -+ -+}, -+"+oGUwhy/swafbVPSLcMb5CqWaGmb4UnykDw9R4tfMII=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const dataType_1 = require("../../compile/validate/dataType"); -+const codegen_1 = require("../../compile/codegen"); -+const util_1 = require("../../compile/util"); -+const equal_1 = require("../../runtime/equal"); -+const error = { -+ message: ({ params: { i, j } }) => codegen_1.str `must NOT have duplicate items (items ## ${j} and ${i} are identical)`, -+ params: ({ params: { i, j } }) => codegen_1._ `{i: ${i}, j: ${j}}`, -+}; -+const def = { -+ keyword: "uniqueItems", -+ type: "array", -+ schemaType: "boolean", -+ $data: true, -+ error, -+ code(cxt) { -+ const { gen, data, $data, schema, parentSchema, schemaCode, it } = cxt; -+ if (!$data && !schema) -+ return; -+ const valid = gen.let("valid"); -+ const itemTypes = parentSchema.items ? dataType_1.getSchemaTypes(parentSchema.items) : []; -+ cxt.block$data(valid, validateUniqueItems, codegen_1._ `${schemaCode} === false`); -+ cxt.ok(valid); -+ function validateUniqueItems() { -+ const i = gen.let("i", codegen_1._ `${data}.length`); -+ const j = gen.let("j"); -+ cxt.setParams({ i, j }); -+ gen.assign(valid, true); -+ gen.if(codegen_1._ `${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j)); -+ } -+ function canOptimize() { -+ return itemTypes.length > 0 && !itemTypes.some((t) => t === "object" || t === "array"); -+ } -+ function loopN(i, j) { -+ const item = gen.name("item"); -+ const wrongType = dataType_1.checkDataTypes(itemTypes, item, it.opts.strictNumbers, dataType_1.DataType.Wrong); -+ const indices = gen.const("indices", codegen_1._ `{}`); -+ gen.for(codegen_1._ `;${i}--;`, () => { -+ gen.let(item, codegen_1._ `${data}[${i}]`); -+ gen.if(wrongType, codegen_1._ `continue`); -+ if (itemTypes.length > 1) -+ gen.if(codegen_1._ `typeof ${item} == "string"`, codegen_1._ `${item} += "_"`); -+ gen -+ .if(codegen_1._ `typeof ${indices}[${item}] == "number"`, () => { -+ gen.assign(j, codegen_1._ `${indices}[${item}]`); -+ cxt.error(); -+ gen.assign(valid, false).break(); -+ }) -+ .code(codegen_1._ `${indices}[${item}] = ${i}`); -+ }); -+ } -+ function loopN2(i, j) { -+ const eql = util_1.useFunc(gen, equal_1.default); -+ const outer = gen.name("outer"); -+ gen.label(outer).for(codegen_1._ `;${i}--;`, () => gen.for(codegen_1._ `${j} = ${i}; ${j}--;`, () => gen.if(codegen_1._ `${eql}(${data}[${i}], ${data}[${j}])`, () => { -+ cxt.error(); -+ gen.assign(valid, false).break(outer); -+ }))); -+ } -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=uniqueItems.js.map -+}, -+"+q4ZYhYLORHfBEwjn43pPTeNBwMjKu4+bjTq7AZvYlI=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", -+ "description": "Meta-schema for $data reference (JSON AnySchema extension proposal)", -+ "type": "object", -+ "required": ["$data"], -+ "properties": { -+ "$data": { -+ "type": "string", -+ "anyOf": [{"format": "relative-json-pointer"}, {"format": "json-pointer"}] -+ } -+ }, -+ "additionalProperties": false -+} -+ -+}, -+"//0q47ESfZSFMpCZIPwjhEYUVW2Z/kBQHV+93aaTm6o=": -+function (require, module, exports, __dirname, __filename) { -+"use strict" -+ -+function unique_pred(list, compare) { -+ var ptr = 1 -+ , len = list.length -+ , a=list[0], b=list[0] -+ for(var i=1; i> 2; -+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); -+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); -+ enc4 = chr3 & 63; -+ -+ if (isNaN(chr2)) { -+ enc3 = enc4 = 64; -+ } -+ else if (isNaN(chr3)) { -+ enc4 = 64; -+ } -+ -+ output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); -+ -+ } -+ -+ return output; -+}; -+ -+// public method for decoding -+exports.decode = function(input, utf8) { -+ var output = ""; -+ var chr1, chr2, chr3; -+ var enc1, enc2, enc3, enc4; -+ var i = 0; -+ -+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); -+ -+ while (i < input.length) { -+ -+ enc1 = _keyStr.indexOf(input.charAt(i++)); -+ enc2 = _keyStr.indexOf(input.charAt(i++)); -+ enc3 = _keyStr.indexOf(input.charAt(i++)); -+ enc4 = _keyStr.indexOf(input.charAt(i++)); -+ -+ chr1 = (enc1 << 2) | (enc2 >> 4); -+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); -+ chr3 = ((enc3 & 3) << 6) | enc4; -+ -+ output = output + String.fromCharCode(chr1); -+ -+ if (enc3 != 64) { -+ output = output + String.fromCharCode(chr2); -+ } -+ if (enc4 != 64) { -+ output = output + String.fromCharCode(chr3); -+ } -+ -+ } -+ -+ return output; -+ -+}; -+ -+}, -+"/LhrfcjHmG4b2F+SWYFQjXHP1y0iylFh0eC6ggtv7I0=": -+function (require, module, exports, __dirname, __filename) { -+ -+var server = require('./server.js') -+ -+module.exports = require('./stream.js') -+module.exports.Server = server.Server -+module.exports.createServer = server.createServer -+ -+}, -+"/RSo9gBmNA3yvCnDHGaK911lJBbkQhXecLG2ELKywBM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.validateUnion = exports.validateArray = exports.usePattern = exports.callValidateCode = exports.schemaProperties = exports.allSchemaProperties = exports.noPropertyInData = exports.propertyInData = exports.isOwnProperty = exports.hasPropFunc = exports.reportMissingProp = exports.checkMissingProp = exports.checkReportMissingProp = void 0; -+const codegen_1 = require("../compile/codegen"); -+const util_1 = require("../compile/util"); -+const names_1 = require("../compile/names"); -+function checkReportMissingProp(cxt, prop) { -+ const { gen, data, it } = cxt; -+ gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => { -+ cxt.setParams({ missingProperty: codegen_1._ `${prop}` }, true); -+ cxt.error(); -+ }); -+} -+exports.checkReportMissingProp = checkReportMissingProp; -+function checkMissingProp({ gen, data, it: { opts } }, properties, missing) { -+ return codegen_1.or(...properties.map((prop) => codegen_1.and(noPropertyInData(gen, data, prop, opts.ownProperties), codegen_1._ `${missing} = ${prop}`))); -+} -+exports.checkMissingProp = checkMissingProp; -+function reportMissingProp(cxt, missing) { -+ cxt.setParams({ missingProperty: missing }, true); -+ cxt.error(); -+} -+exports.reportMissingProp = reportMissingProp; -+function hasPropFunc(gen) { -+ return gen.scopeValue("func", { -+ // eslint-disable-next-line @typescript-eslint/unbound-method -+ ref: Object.prototype.hasOwnProperty, -+ code: codegen_1._ `Object.prototype.hasOwnProperty`, -+ }); -+} -+exports.hasPropFunc = hasPropFunc; -+function isOwnProperty(gen, data, property) { -+ return codegen_1._ `${hasPropFunc(gen)}.call(${data}, ${property})`; -+} -+exports.isOwnProperty = isOwnProperty; -+function propertyInData(gen, data, property, ownProperties) { -+ const cond = codegen_1._ `${data}${codegen_1.getProperty(property)} !== undefined`; -+ return ownProperties ? codegen_1._ `${cond} && ${isOwnProperty(gen, data, property)}` : cond; -+} -+exports.propertyInData = propertyInData; -+function noPropertyInData(gen, data, property, ownProperties) { -+ const cond = codegen_1._ `${data}${codegen_1.getProperty(property)} === undefined`; -+ return ownProperties ? codegen_1.or(cond, codegen_1.not(isOwnProperty(gen, data, property))) : cond; -+} -+exports.noPropertyInData = noPropertyInData; -+function allSchemaProperties(schemaMap) { -+ return schemaMap ? Object.keys(schemaMap).filter((p) => p !== "__proto__") : []; -+} -+exports.allSchemaProperties = allSchemaProperties; -+function schemaProperties(it, schemaMap) { -+ return allSchemaProperties(schemaMap).filter((p) => !util_1.alwaysValidSchema(it, schemaMap[p])); -+} -+exports.schemaProperties = schemaProperties; -+function callValidateCode({ schemaCode, data, it: { gen, topSchemaRef, schemaPath, errorPath }, it }, func, context, passSchema) { -+ const dataAndSchema = passSchema ? codegen_1._ `${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data; -+ const valCxt = [ -+ [names_1.default.instancePath, codegen_1.strConcat(names_1.default.instancePath, errorPath)], -+ [names_1.default.parentData, it.parentData], -+ [names_1.default.parentDataProperty, it.parentDataProperty], -+ [names_1.default.rootData, names_1.default.rootData], -+ ]; -+ if (it.opts.dynamicRef) -+ valCxt.push([names_1.default.dynamicAnchors, names_1.default.dynamicAnchors]); -+ const args = codegen_1._ `${dataAndSchema}, ${gen.object(...valCxt)}`; -+ return context !== codegen_1.nil ? codegen_1._ `${func}.call(${context}, ${args})` : codegen_1._ `${func}(${args})`; -+} -+exports.callValidateCode = callValidateCode; -+function usePattern({ gen, it: { opts } }, pattern) { -+ const u = opts.unicodeRegExp ? "u" : ""; -+ return gen.scopeValue("pattern", { -+ key: pattern, -+ ref: new RegExp(pattern, u), -+ code: codegen_1._ `new RegExp(${pattern}, ${u})`, -+ }); -+} -+exports.usePattern = usePattern; -+function validateArray(cxt) { -+ const { gen, data, keyword, it } = cxt; -+ const valid = gen.name("valid"); -+ if (it.allErrors) { -+ const validArr = gen.let("valid", true); -+ validateItems(() => gen.assign(validArr, false)); -+ return validArr; -+ } -+ gen.var(valid, true); -+ validateItems(() => gen.break()); -+ return valid; -+ function validateItems(notValid) { -+ const len = gen.const("len", codegen_1._ `${data}.length`); -+ gen.forRange("i", 0, len, (i) => { -+ cxt.subschema({ -+ keyword, -+ dataProp: i, -+ dataPropType: util_1.Type.Num, -+ }, valid); -+ gen.if(codegen_1.not(valid), notValid); -+ }); -+ } -+} -+exports.validateArray = validateArray; -+function validateUnion(cxt) { -+ const { gen, schema, keyword, it } = cxt; -+ /* istanbul ignore if */ -+ if (!Array.isArray(schema)) -+ throw new Error("ajv implementation error"); -+ const alwaysValid = schema.some((sch) => util_1.alwaysValidSchema(it, sch)); -+ if (alwaysValid && !it.opts.unevaluated) -+ return; -+ const valid = gen.let("valid", false); -+ const schValid = gen.name("_valid"); -+ gen.block(() => schema.forEach((_sch, i) => { -+ const schCxt = cxt.subschema({ -+ keyword, -+ schemaProp: i, -+ compositeRule: true, -+ }, schValid); -+ gen.assign(valid, codegen_1._ `${valid} || ${schValid}`); -+ const merged = cxt.mergeValidEvaluated(schCxt, schValid); -+ // can short-circuit if `unevaluatedProperties/Items` not supported (opts.unevaluated !== true) -+ // or if all properties and items were evaluated (it.props === true && it.items === true) -+ if (!merged) -+ gen.if(codegen_1.not(valid)); -+ })); -+ cxt.result(valid, () => cxt.reset(), () => cxt.error(true)); -+} -+exports.validateUnion = validateUnion; -+//# sourceMappingURL=code.js.map -+}, -+"/RfWqS3ZugBMhfjjZLJ3GvENASqDdmQ3RH265jh5+ms=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+// a duplex stream is just a stream that is both readable and writable. -+// Since JS doesn't have multiple prototypal inheritance, this class -+// prototypally inherits from Readable, and then parasitically from -+// Writable. -+ -+'use strict'; -+ -+/**/ -+ -+var pna = require('process-nextick-args'); -+/**/ -+ -+/**/ -+var objectKeys = Object.keys || function (obj) { -+ var keys = []; -+ for (var key in obj) { -+ keys.push(key); -+ }return keys; -+}; -+/**/ -+ -+module.exports = Duplex; -+ -+/**/ -+var util = Object.create(require('core-util-is')); -+util.inherits = require('inherits'); -+/**/ -+ -+var Readable = require('./_stream_readable'); -+var Writable = require('./_stream_writable'); -+ -+util.inherits(Duplex, Readable); -+ -+{ -+ // avoid scope creep, the keys array can then be collected -+ var keys = objectKeys(Writable.prototype); -+ for (var v = 0; v < keys.length; v++) { -+ var method = keys[v]; -+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -+ } -+} -+ -+function Duplex(options) { -+ if (!(this instanceof Duplex)) return new Duplex(options); -+ -+ Readable.call(this, options); -+ Writable.call(this, options); -+ -+ if (options && options.readable === false) this.readable = false; -+ -+ if (options && options.writable === false) this.writable = false; -+ -+ this.allowHalfOpen = true; -+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; -+ -+ this.once('end', onend); -+} -+ -+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function () { -+ return this._writableState.highWaterMark; -+ } -+}); -+ -+// the no-half-open enforcer -+function onend() { -+ // if we allow half-open state, or if the writable side ended, -+ // then we're ok. -+ if (this.allowHalfOpen || this._writableState.ended) return; -+ -+ // no more data can be written. -+ // But allow more writes to happen in this tick. -+ pna.nextTick(onEndNT, this); -+} -+ -+function onEndNT(self) { -+ self.end(); -+} -+ -+Object.defineProperty(Duplex.prototype, 'destroyed', { -+ get: function () { -+ if (this._readableState === undefined || this._writableState === undefined) { -+ return false; -+ } -+ return this._readableState.destroyed && this._writableState.destroyed; -+ }, -+ set: function (value) { -+ // we ignore the value if the stream -+ // has not been initialized yet -+ if (this._readableState === undefined || this._writableState === undefined) { -+ return; -+ } -+ -+ // backward compatibility, the user is explicitly -+ // managing destroyed -+ this._readableState.destroyed = value; -+ this._writableState.destroyed = value; -+ } -+}); -+ -+Duplex.prototype._destroy = function (err, cb) { -+ this.push(null); -+ this.end(); -+ -+ pna.nextTick(cb, err); -+}; -+}, -+"/RvBI9DZx8QHjCEy1YDCvWqeELWxbzLVQgP0l/8zj9E=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function() { -+ var that = this; -+ return new Promise(function read(resolve, reject) { -+ var buffer = that._stream.read(); -+ if (buffer != null) return resolve({done: false, value: buffer}); -+ that._readable.then(function(done) { return done ? resolve({done: true, value: undefined}) : read(resolve, reject); }).catch(reject); -+ }); -+}; -+ -+}, -+"/XjQhkiFHi2xsZ4ScakK1VtkDQtq4rIK0RyUruyEezM=": -+function (require, module, exports, __dirname, __filename) { -+const optsArg = require('./lib/opts-arg.js') -+const pathArg = require('./lib/path-arg.js') -+ -+const {mkdirpNative, mkdirpNativeSync} = require('./lib/mkdirp-native.js') -+const {mkdirpManual, mkdirpManualSync} = require('./lib/mkdirp-manual.js') -+const {useNative, useNativeSync} = require('./lib/use-native.js') -+ -+ -+const mkdirp = (path, opts) => { -+ path = pathArg(path) -+ opts = optsArg(opts) -+ return useNative(opts) -+ ? mkdirpNative(path, opts) -+ : mkdirpManual(path, opts) -+} -+ -+const mkdirpSync = (path, opts) => { -+ path = pathArg(path) -+ opts = optsArg(opts) -+ return useNativeSync(opts) -+ ? mkdirpNativeSync(path, opts) -+ : mkdirpManualSync(path, opts) -+} -+ -+mkdirp.sync = mkdirpSync -+mkdirp.native = (path, opts) => mkdirpNative(pathArg(path), optsArg(opts)) -+mkdirp.manual = (path, opts) => mkdirpManual(pathArg(path), optsArg(opts)) -+mkdirp.nativeSync = (path, opts) => mkdirpNativeSync(pathArg(path), optsArg(opts)) -+mkdirp.manualSync = (path, opts) => mkdirpManualSync(pathArg(path), optsArg(opts)) -+ -+module.exports = mkdirp -+ -+}, -+"/YDzo0MZh7TG1rkXc1sEaO4Vt49BSDDFAYd5y7qvyu0=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * is-windows -+ * -+ * Copyright © 2015-2018, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+(function(factory) { -+ if (exports && typeof exports === 'object' && typeof module !== 'undefined') { -+ module.exports = factory(); -+ } else if (typeof define === 'function' && define.amd) { -+ define([], factory); -+ } else if (typeof window !== 'undefined') { -+ window.isWindows = factory(); -+ } else if (typeof global !== 'undefined') { -+ global.isWindows = factory(); -+ } else if (typeof self !== 'undefined') { -+ self.isWindows = factory(); -+ } else { -+ this.isWindows = factory(); -+ } -+})(function() { -+ 'use strict'; -+ return function isWindows() { -+ return process && (process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE)); -+ }; -+}); -+ -+}, -+"/eothdz3ShVm8kZPnPQ0MDnobMCY+jfj4wUHhl4PkXg=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs') -+var RWLock = require('rwlock') -+var through = require('through2') -+var readonly = require('read-only-stream') -+var pump = require('pump') -+var tarHeader = require('tar-stream/headers') -+var fromBuffer = require('./lib/util').fromBuffer -+var cached = require('./lib/cached-value') -+var tarUtil = require('./lib/tar') -+ -+module.exports = SingleTarball -+ -+function SingleTarball (filepath, opts) { -+ this.filepath = filepath -+ -+ this.lock = new RWLock() -+ -+ if (!fs.existsSync(filepath)) fs.writeFileSync(filepath, '', 'utf8') // touch new file -+ -+ this.archive = cached(SingleTarball.prototype._lookupMeta.bind(this)) -+ this.archive.refresh() -+} -+ -+// Append a file and update the index entry. -+SingleTarball.prototype.append = function (filepath, size, cb) { -+ if (!cb && typeof size === 'function') { -+ cb = size -+ size = null -+ } -+ size = 0 -+ -+ var self = this -+ cb = cb || noop -+ -+ var t = through(function (chunk, _, next) { -+ size += chunk.length -+ next(null, chunk) -+ }) -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ // 1. Refresh the index & its byte offset. -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ -+ if (typeof archive.indexOffset === 'number') { -+ // 2. Truncate the file to remove the old index. -+ fs.truncate(self.filepath, archive.indexOffset, function (err) { -+ if (err) return done(err) -+ write(archive, archive.indexOffset) -+ }) -+ } else { -+ write(archive, undefined) -+ } -+ }) -+ -+ function write (archive, start) { -+ // 3. Prepare the tar archive for appending. -+ var fsOpts = { -+ flags: 'r+', -+ start: start !== undefined ? start : 0 -+ } -+ if (fsOpts.start < 0) fsOpts.start = 0 -+ var appendStream = fs.createWriteStream(self.filepath, fsOpts) -+ appendStream.once('error', done) -+ -+ // 4. Write tar header, without size info (yet). -+ var header = tarHeader.encode({ -+ name: filepath, -+ type: 'file', -+ mode: parseInt('644', 8), -+ uid: 0, -+ gid: 0, -+ mtime: new Date(), -+ size: 0 -+ }) -+ appendStream.write(header) -+ -+ // 5. Write data. -+ pump(t, appendStream, function (err) { -+ if (err) return done(err) -+ -+ // Detect ENOSPC. This comes up when only one stream write happened, -+ // which will not trigger an ENOSPC error. -+ // Tracked by https://github.com/nodejs/node/issues/31908 -+ if (size > appendStream.bytesWritten) { -+ var err = new Error('insufficient disk space') -+ err.code = 'ENOSPC' -+ return done(err) -+ } -+ -+ // 6. Pad the remaining bytes to fit a 512-byte block. -+ var leftover = 512 - (size % 512) -+ if (leftover === 512) leftover = 0 -+ -+ fs.appendFile(self.filepath, Buffer.alloc(leftover), function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 7. Open file so we can update the header. -+ withWritableFile(self.filepath, function (fd, done) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 8. Read header. -+ var header = Buffer.alloc(512) -+ var headerStart = fsOpts.start || 0 -+ fs.read(fd, header, 0, 512, headerStart, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 9. Update size field. -+ var sizeStr = toPaddedOctal(size, 12) -+ header.write(sizeStr, 124, 12, 'utf8') -+ -+ // 10. Update checksum field. -+ var sum = cksum(header) -+ var ck = toPaddedOctal(sum, 8) -+ header.write(ck, 148, 8, 'utf8') -+ -+ // 11. Write new header. -+ fs.write(fd, header, 0, 512, headerStart, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ archive.index[filepath] = { offset: start, size: size } -+ -+ // 12. Write the new index to the end of the archive. -+ appendMeta(fd, headerStart + 512 + size + leftover, archive.meta, done) -+ }) -+ }) -+ }, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ self.archive.refresh(done) -+ }) -+ }) -+ }) -+ } -+ }) -+ -+ return t -+} -+ -+SingleTarball.prototype.list = function (cb) { -+ var self = this -+ -+ this.lock.readLock(function (release) { -+ self.archive.value(function (err, archive) { -+ release() -+ cb(err, err ? null : Object.keys(archive.index)) -+ }) -+ }) -+} -+ -+SingleTarball.prototype.read = function (filepath) { -+ var self = this -+ var t = through() -+ -+ this.lock.readLock(function (release) { -+ self.archive.value(function (err, archive) { -+ if (err) { -+ release() -+ t.emit('error', err) -+ return -+ } -+ -+ var entry = archive.index[filepath] -+ if (!entry) { -+ release() -+ process.nextTick(function () { -+ var err = new Error('that file does not exist in the archive') -+ err.notFound = true -+ t.emit('error', err) -+ }) -+ return -+ } -+ -+ if (entry.size === 0) { -+ process.nextTick(function () { -+ t.end() -+ release() -+ }) -+ return -+ } -+ -+ pump( -+ fs.createReadStream(self.filepath, { start: entry.offset + 512, end: entry.offset + 512 + entry.size - 1 }), -+ t, -+ function (err) { -+ release() -+ }) -+ }) -+ }) -+ -+ return readonly(t) -+} -+ -+// TODO: might be nice if this also returned the final file, but we don't want -+// to buffer the entire contents, and can't really stream it if it's being -+// truncated from the archive file.. -+SingleTarball.prototype.pop = function (name, cb) { -+ if (typeof name === 'function' && !cb) { -+ cb = name -+ name = null -+ } -+ var self = this -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ -+ // Get the last file in the archive. -+ var fname = getFileLargestOffset(archive.index) -+ if (name && name !== fname) { -+ return cb(null, new Error('the last file doesnt match the filename given')) -+ } -+ var offset = archive.index[fname].offset -+ -+ fs.truncate(self.filepath, offset, function (err) { -+ if (err) return done(err) -+ delete archive.index[fname] -+ -+ withWritableFile(self.filepath, function (fd, done) { -+ appendMeta(fd, offset, archive.meta, done) -+ }, function (err) { -+ if (err) return done(err) -+ self.archive.refresh(done) -+ }) -+ }) -+ }) -+ }) -+} -+ -+SingleTarball.prototype.userdata = function (data, cb) { -+ if (data && !cb && typeof data === 'function') { -+ cb = data -+ data = null -+ } -+ var self = this -+ -+ if (!data) { -+ // get -+ this.lock.readLock(function (release) { -+ function done (err, res) { -+ release() -+ cb(err, res) -+ } -+ -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ done(null, archive.meta.userdata || {}) -+ }) -+ }) -+ } else { -+ // set -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ -+ var offset = archive.indexOffset -+ fs.truncate(self.filepath, offset, function (err) { -+ if (err) return done(err) -+ -+ withWritableFile(self.filepath, function (fd, done) { -+ archive.meta.userdata = data -+ appendMeta(fd, offset, archive.meta, done) -+ }, function (err) { -+ if (err) return done(err) -+ self.archive.refresh(done) -+ }) -+ }) -+ }) -+ }) -+ } -+} -+ -+// Search the tar archive backwards for the index file. -+SingleTarball.prototype._lookupMeta = function (cb) { -+ var self = this -+ -+ fs.stat(this.filepath, function (err, stat) { -+ if (err) return cb(err) -+ var size = stat.size -+ -+ // Archive is fresh & empty -+ if (size < 1024) { -+ var index = {} -+ return cb(null, { index: index, indexOffset: 0, fileSize: size, meta: {index: index} }) -+ } -+ -+ fs.open(self.filepath, 'r', function (err, fd) { -+ if (err) return cb(err) -+ -+ tarUtil.readFinalFile(fd, size, function (err, buf, offset) { -+ if (err) return cb(err) -+ var meta -+ try { -+ meta = JSON.parse(buf.toString()) -+ } catch (e) { -+ return cb(e) -+ } -+ fs.close(fd, function (err) { -+ if (err) return cb(err) -+ // if in old format (2.x.x), upgrade to new format (3.x.x and [hopefully] later) -+ if (!meta.index) { -+ var newMeta = { index: meta } -+ cb(null, { index: newMeta.index, indexOffset: offset, fileSize: size, meta: newMeta }) -+ } else { -+ cb(null, { index: meta.index, indexOffset: offset, fileSize: size, meta: meta }) -+ } -+ }) -+ }) -+ }) -+ }) -+} -+ -+// Returns the entry nearest the end of the index. -+function getFileLargestOffset (index) { -+ var key -+ for (var name in index) { -+ var entry = index[name] -+ if (!key || entry.offset > index[key].offset) key = name -+ } -+ return key -+} -+ -+function noop () {} -+ -+// tar checksum algorithm (from mafintosh/tar-stream) -+var cksum = function (block) { -+ var sum = 8 * 32 -+ for (var i = 0; i < 148; i++) sum += block[i] -+ for (var j = 156; j < 512; j++) sum += block[j] -+ return sum -+} -+ -+function toPaddedOctal (number, length) { -+ var octal = number.toString(8) -+ var leftover = length - octal.length -+ var padding = new Array(leftover).fill('0').join('') -+ return padding + octal -+} -+ -+function appendMeta (fd, pos, meta, cb) { -+ var data = Buffer.from(JSON.stringify(meta), 'utf8') -+ -+ var header = tarHeader.encode({ -+ name: '___index.json', -+ type: 'file', -+ mode: parseInt('644', 8), -+ uid: 0, -+ gid: 0, -+ mtime: new Date(), -+ size: data.length -+ }) -+ -+ // leftover bytes to reach 512 block boundary, plus another 512 * 2 = 1024 to mark the end-of-file -+ var padding = Buffer.alloc(512 - (data.length % 512) + 512 + 512).fill(0) -+ -+ var buf = Buffer.concat([header, data, padding]) -+ -+ fs.write(fd, buf, 0, buf.length, pos, cb) -+} -+ -+function withWritableFile (filepath, cb, done) { -+ fs.open(filepath, 'r+', function (err, fd) { -+ if (err) return cb(err) -+ cb(fd, function () { -+ fs.close(fd, done) -+ }) -+ }) -+} -+ -+}, -+"/nyiuJgTewek/Ln+ppwqXUe71vvc6ZQfjcL3k8BpGIA=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * is-extendable -+ * -+ * Copyright (c) 2015-2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var isPlainObject = require('is-plain-object'); -+ -+module.exports = function isExtendable(val) { -+ return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); -+}; -+ -+}, -+"/tHhT006ZQSTZmaXiJ5367O+bMtgVOn1UZdWbRzw7qg=": -+function (require, module, exports, __dirname, __filename) { -+const fs = require('fs') -+ -+const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version -+const versArr = version.replace(/^v/, '').split('.') -+const hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12 -+ -+const useNative = !hasNative ? () => false : opts => opts.mkdir === fs.mkdir -+const useNativeSync = !hasNative ? () => false : opts => opts.mkdirSync === fs.mkdirSync -+ -+module.exports = {useNative, useNativeSync} -+ -+}, -+"0+b9uyfdh9Ue1zb0o7R73IJnMRlJRXA0zud6oCFoUeA=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const code_1 = require("../code"); -+const codegen_1 = require("../../compile/codegen"); -+const util_1 = require("../../compile/util"); -+const error = { -+ message: ({ params: { missingProperty } }) => codegen_1.str `must have required property '${missingProperty}'`, -+ params: ({ params: { missingProperty } }) => codegen_1._ `{missingProperty: ${missingProperty}}`, -+}; -+const def = { -+ keyword: "required", -+ type: "object", -+ schemaType: "array", -+ $data: true, -+ error, -+ code(cxt) { -+ const { gen, schema, schemaCode, data, $data, it } = cxt; -+ const { opts } = it; -+ if (!$data && schema.length === 0) -+ return; -+ const useLoop = schema.length >= opts.loopRequired; -+ if (it.allErrors) -+ allErrorsMode(); -+ else -+ exitOnErrorMode(); -+ if (opts.strictRequired) { -+ const props = cxt.parentSchema.properties; -+ const { definedProperties } = cxt.it; -+ for (const requiredKey of schema) { -+ if ((props === null || props === void 0 ? void 0 : props[requiredKey]) === undefined && !definedProperties.has(requiredKey)) { -+ const schemaPath = it.schemaEnv.baseId + it.errSchemaPath; -+ const msg = `required property "${requiredKey}" is not defined at "${schemaPath}" (strictRequired)`; -+ util_1.checkStrictMode(it, msg, it.opts.strictRequired); -+ } -+ } -+ } -+ function allErrorsMode() { -+ if (useLoop || $data) { -+ cxt.block$data(codegen_1.nil, loopAllRequired); -+ } -+ else { -+ for (const prop of schema) { -+ code_1.checkReportMissingProp(cxt, prop); -+ } -+ } -+ } -+ function exitOnErrorMode() { -+ const missing = gen.let("missing"); -+ if (useLoop || $data) { -+ const valid = gen.let("valid", true); -+ cxt.block$data(valid, () => loopUntilMissing(missing, valid)); -+ cxt.ok(valid); -+ } -+ else { -+ gen.if(code_1.checkMissingProp(cxt, schema, missing)); -+ code_1.reportMissingProp(cxt, missing); -+ gen.else(); -+ } -+ } -+ function loopAllRequired() { -+ gen.forOf("prop", schemaCode, (prop) => { -+ cxt.setParams({ missingProperty: prop }); -+ gen.if(code_1.noPropertyInData(gen, data, prop, opts.ownProperties), () => cxt.error()); -+ }); -+ } -+ function loopUntilMissing(missing, valid) { -+ cxt.setParams({ missingProperty: missing }); -+ gen.forOf(missing, schemaCode, () => { -+ gen.assign(valid, code_1.propertyInData(gen, data, missing, opts.ownProperties)); -+ gen.if(codegen_1.not(valid), () => { -+ cxt.error(); -+ gen.break(); -+ }); -+ }, codegen_1.nil); -+ } -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=required.js.map -+}, -+"05F8fnyKe2zAUZAYEyJUHzef5fXNaEt6NGnM9c6dcpc=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_pattern(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $isData = it.opts.$data && $schema && $schema.$data, -+ $schemaValue; -+ if ($isData) { -+ out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; -+ $schemaValue = 'schema' + $lvl; -+ } else { -+ $schemaValue = $schema; -+ } -+ var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); -+ out += 'if ( '; -+ if ($isData) { -+ out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; -+ } -+ out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; -+ if ($isData) { -+ out += '' + ($schemaValue); -+ } else { -+ out += '' + (it.util.toQuotedString($schema)); -+ } -+ out += ' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should match pattern "'; -+ if ($isData) { -+ out += '\' + ' + ($schemaValue) + ' + \''; -+ } else { -+ out += '' + (it.util.escapeQuotes($schema)); -+ } -+ out += '"\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: '; -+ if ($isData) { -+ out += 'validate.schema' + ($schemaPath); -+ } else { -+ out += '' + (it.util.toQuotedString($schema)); -+ } -+ out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += '} '; -+ if ($breakOnError) { -+ out += ' else { '; -+ } -+ return out; -+} -+ -+}, -+"0CRR+jlt5/nsk8xvs7B6qnvmN6yzQJqd3r0cLeknnBo=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+module.exports = function (Yallist) { -+ Yallist.prototype[Symbol.iterator] = function* () { -+ for (let walker = this.head; walker; walker = walker.next) { -+ yield walker.value -+ } -+ } -+} -+ -+}, -+"0DDu4kinfW3N6+5ySYA1CLcfwwr66gHbmxPD5lHud7E=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * is-plain-object -+ * -+ * Copyright (c) 2014-2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var isObject = require('isobject'); -+ -+function isObjectObject(o) { -+ return isObject(o) === true -+ && Object.prototype.toString.call(o) === '[object Object]'; -+} -+ -+module.exports = function isPlainObject(o) { -+ var ctor,prot; -+ -+ if (isObjectObject(o) === false) return false; -+ -+ // If has modified constructor -+ ctor = o.constructor; -+ if (typeof ctor !== 'function') return false; -+ -+ // If has modified prototype -+ prot = ctor.prototype; -+ if (isObjectObject(prot) === false) return false; -+ -+ // If constructor does not have an Object-specific method -+ if (prot.hasOwnProperty('isPrototypeOf') === false) { -+ return false; -+ } -+ -+ // Most likely a plain Object -+ return true; -+}; -+ -+}, -+"0FDUmC5Vy/ljQlv4pCqxudNl4qU+HMAyCKbSswvfzN8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var metaSchema = require('./refs/json-schema-draft-07.json'); -+ -+module.exports = { -+ $id: 'https://github.com/ajv-validator/ajv/blob/master/lib/definition_schema.js', -+ definitions: { -+ simpleTypes: metaSchema.definitions.simpleTypes -+ }, -+ type: 'object', -+ dependencies: { -+ schema: ['validate'], -+ $data: ['validate'], -+ statements: ['inline'], -+ valid: {not: {required: ['macro']}} -+ }, -+ properties: { -+ type: metaSchema.properties.type, -+ schema: {type: 'boolean'}, -+ statements: {type: 'boolean'}, -+ dependencies: { -+ type: 'array', -+ items: {type: 'string'} -+ }, -+ metaSchema: {type: 'object'}, -+ modifying: {type: 'boolean'}, -+ valid: {type: 'boolean'}, -+ $data: {type: 'boolean'}, -+ async: {type: 'boolean'}, -+ errors: { -+ anyOf: [ -+ {type: 'boolean'}, -+ {const: 'full'} -+ ] -+ } -+ } -+}; -+ -+}, -+"0GdO4BTpX0bylYkIQ2YWVD4KwJnF3LWtLmY8gsa5LV0=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var regexNot = require('regex-not'); -+var toRegex = require('to-regex'); -+ -+/** -+ * Characters to use in negation regex (we want to "not" match -+ * characters that are matched by other parsers) -+ */ -+ -+var cached; -+var NOT_REGEX = '[\\[!*+?$^"\'.\\\\/]+'; -+var not = createTextRegex(NOT_REGEX); -+ -+/** -+ * Nanomatch parsers -+ */ -+ -+module.exports = function(nanomatch, options) { -+ var parser = nanomatch.parser; -+ var opts = parser.options; -+ -+ parser.state = { -+ slashes: 0, -+ paths: [] -+ }; -+ -+ parser.ast.state = parser.state; -+ parser -+ -+ /** -+ * Beginning-of-string -+ */ -+ -+ .capture('prefix', function() { -+ if (this.parsed) return; -+ var m = this.match(/^\.[\\/]/); -+ if (!m) return; -+ this.state.strictOpen = !!this.options.strictOpen; -+ this.state.addPrefix = true; -+ }) -+ -+ /** -+ * Escape: "\\." -+ */ -+ -+ .capture('escape', function() { -+ if (this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(/^(?:\\(.)|([$^]))/); -+ if (!m) return; -+ -+ return pos({ -+ type: 'escape', -+ val: m[2] || m[1] -+ }); -+ }) -+ -+ /** -+ * Quoted strings -+ */ -+ -+ .capture('quoted', function() { -+ var pos = this.position(); -+ var m = this.match(/^["']/); -+ if (!m) return; -+ -+ var quote = m[0]; -+ if (this.input.indexOf(quote) === -1) { -+ return pos({ -+ type: 'escape', -+ val: quote -+ }); -+ } -+ -+ var tok = advanceTo(this.input, quote); -+ this.consume(tok.len); -+ -+ return pos({ -+ type: 'quoted', -+ val: tok.esc -+ }); -+ }) -+ -+ /** -+ * Negations: "!" -+ */ -+ -+ .capture('not', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(this.notRegex || /^!+/); -+ if (!m) return; -+ var val = m[0]; -+ -+ var isNegated = (val.length % 2) === 1; -+ if (parsed === '' && !isNegated) { -+ val = ''; -+ } -+ -+ // if nothing has been parsed, we know `!` is at the start, -+ // so we need to wrap the result in a negation regex -+ if (parsed === '' && isNegated && this.options.nonegate !== true) { -+ this.bos.val = '(?!^(?:'; -+ this.append = ')$).*'; -+ val = ''; -+ } -+ return pos({ -+ type: 'not', -+ val: val -+ }); -+ }) -+ -+ /** -+ * Dot: "." -+ */ -+ -+ .capture('dot', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(/^\.+/); -+ if (!m) return; -+ -+ var val = m[0]; -+ this.state.dot = val === '.' && (parsed === '' || parsed.slice(-1) === '/'); -+ -+ return pos({ -+ type: 'dot', -+ dotfiles: this.state.dot, -+ val: val -+ }); -+ }) -+ -+ /** -+ * Plus: "+" -+ */ -+ -+ .capture('plus', /^\+(?!\()/) -+ -+ /** -+ * Question mark: "?" -+ */ -+ -+ .capture('qmark', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(/^\?+(?!\()/); -+ if (!m) return; -+ -+ this.state.metachar = true; -+ this.state.qmark = true; -+ -+ return pos({ -+ type: 'qmark', -+ parsed: parsed, -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * Globstar: "**" -+ */ -+ -+ .capture('globstar', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(/^\*{2}(?![*(])(?=[,)/]|$)/); -+ if (!m) return; -+ -+ var type = opts.noglobstar !== true ? 'globstar' : 'star'; -+ var node = pos({type: type, parsed: parsed}); -+ this.state.metachar = true; -+ -+ while (this.input.slice(0, 4) === '/**/') { -+ this.input = this.input.slice(3); -+ } -+ -+ node.isInside = { -+ brace: this.isInside('brace'), -+ paren: this.isInside('paren') -+ }; -+ -+ if (type === 'globstar') { -+ this.state.globstar = true; -+ node.val = '**'; -+ -+ } else { -+ this.state.star = true; -+ node.val = '*'; -+ } -+ -+ return node; -+ }) -+ -+ /** -+ * Star: "*" -+ */ -+ -+ .capture('star', function() { -+ var pos = this.position(); -+ var starRe = /^(?:\*(?![*(])|[*]{3,}(?!\()|[*]{2}(?![(/]|$)|\*(?=\*\())/; -+ var m = this.match(starRe); -+ if (!m) return; -+ -+ this.state.metachar = true; -+ this.state.star = true; -+ return pos({ -+ type: 'star', -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * Slash: "/" -+ */ -+ -+ .capture('slash', function() { -+ var pos = this.position(); -+ var m = this.match(/^\//); -+ if (!m) return; -+ -+ this.state.slashes++; -+ return pos({ -+ type: 'slash', -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * Backslash: "\\" -+ */ -+ -+ .capture('backslash', function() { -+ var pos = this.position(); -+ var m = this.match(/^\\(?![*+?(){}[\]'"])/); -+ if (!m) return; -+ -+ var val = m[0]; -+ -+ if (this.isInside('bracket')) { -+ val = '\\'; -+ } else if (val.length > 1) { -+ val = '\\\\'; -+ } -+ -+ return pos({ -+ type: 'backslash', -+ val: val -+ }); -+ }) -+ -+ /** -+ * Square: "[.]" -+ */ -+ -+ .capture('square', function() { -+ if (this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(/^\[([^!^\\])\]/); -+ if (!m) return; -+ -+ return pos({ -+ type: 'square', -+ val: m[1] -+ }); -+ }) -+ -+ /** -+ * Brackets: "[...]" (basic, this can be overridden by other parsers) -+ */ -+ -+ .capture('bracket', function() { -+ var pos = this.position(); -+ var m = this.match(/^(?:\[([!^]?)([^\]]+|\]-)(\]|[^*+?]+)|\[)/); -+ if (!m) return; -+ -+ var val = m[0]; -+ var negated = m[1] ? '^' : ''; -+ var inner = (m[2] || '').replace(/\\\\+/, '\\\\'); -+ var close = m[3] || ''; -+ -+ if (m[2] && inner.length < m[2].length) { -+ val = val.replace(/\\\\+/, '\\\\'); -+ } -+ -+ var esc = this.input.slice(0, 2); -+ if (inner === '' && esc === '\\]') { -+ inner += esc; -+ this.consume(2); -+ -+ var str = this.input; -+ var idx = -1; -+ var ch; -+ -+ while ((ch = str[++idx])) { -+ this.consume(1); -+ if (ch === ']') { -+ close = ch; -+ break; -+ } -+ inner += ch; -+ } -+ } -+ -+ return pos({ -+ type: 'bracket', -+ val: val, -+ escaped: close !== ']', -+ negated: negated, -+ inner: inner, -+ close: close -+ }); -+ }) -+ -+ /** -+ * Text -+ */ -+ -+ .capture('text', function() { -+ if (this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(not); -+ if (!m || !m[0]) return; -+ -+ return pos({ -+ type: 'text', -+ val: m[0] -+ }); -+ }); -+ -+ /** -+ * Allow custom parsers to be passed on options -+ */ -+ -+ if (options && typeof options.parsers === 'function') { -+ options.parsers(nanomatch.parser); -+ } -+}; -+ -+/** -+ * Advance to the next non-escaped character -+ */ -+ -+function advanceTo(input, endChar) { -+ var ch = input.charAt(0); -+ var tok = { len: 1, val: '', esc: '' }; -+ var idx = 0; -+ -+ function advance() { -+ if (ch !== '\\') { -+ tok.esc += '\\' + ch; -+ tok.val += ch; -+ } -+ -+ ch = input.charAt(++idx); -+ tok.len++; -+ -+ if (ch === '\\') { -+ advance(); -+ advance(); -+ } -+ } -+ -+ while (ch && ch !== endChar) { -+ advance(); -+ } -+ return tok; -+} -+ -+/** -+ * Create text regex -+ */ -+ -+function createTextRegex(pattern) { -+ if (cached) return cached; -+ var opts = {contains: true, strictClose: false}; -+ var not = regexNot.create(pattern, opts); -+ var re = toRegex('^(?:[*]\\((?=.)|' + not + ')', opts); -+ return (cached = re); -+} -+ -+/** -+ * Expose negation string -+ */ -+ -+module.exports.not = NOT_REGEX; -+ -+}, -+"0OdBMKjwsH3Zisu/oKivdw+YtApmRuQ8L35UNegi0Fo=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = indexOf -+ -+function indexOf (left, right) { -+ var result = new Array(right.length) -+ var i = 0 -+ var j = 0 -+ -+ while (i < left.length && j < right.length) { -+ var a = left[i] -+ var b = right[j] -+ -+ if (a === b) { -+ result[j++] = i -+ continue -+ } -+ -+ if (a < b) { -+ i++ -+ continue -+ } -+ -+ result[j++] = -1 -+ continue -+ } -+ -+ for (; j < right.length; j++) result[j] = -1 -+ -+ return result -+} -+ -+}, -+"0P1P7TKtsEVwY070xQ4v2Ss8fyQLaORAPbHPXfYJZj8=": -+function (require, module, exports, __dirname, __filename) { -+(function(global) { -+ 'use strict'; -+ -+ if (typeof module !== "undefined" && module.exports) { -+ module.exports = global; -+ } -+ -+ global["encoding-indexes"] = -+{ -+ "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188], -+ "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], -+ "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565], -+ "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]], -+ "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], -+ "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], -+ "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160], -+ "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], -+ "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729], -+ "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729], -+ "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119], -+ "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null], -+ "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], -+ "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], -+ "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312], -+ "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217], -+ "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255], -+ "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], -+ "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255], -+ "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], -+ "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], -+ "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711], -+ "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null], -+ "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], -+ "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103], -+ "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], -+ "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], -+ "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255], -+ "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], -+ "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746], -+ "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729], -+ "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], -+ "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] -+}; -+ -+// For strict environments where `this` inside the global scope -+// is `undefined`, take a pure object instead -+}(this || {})); -+}, -+"0PAzSsP/a644/wKEep3l2jlXvQZRMgpprlTt2cFAkW4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+module.exports = { -+ /** -+ * True if this is running in Nodejs, will be undefined in a browser. -+ * In a browser, browserify won't include this file and the whole module -+ * will be resolved an empty object. -+ */ -+ isNode : typeof Buffer !== "undefined", -+ /** -+ * Create a new nodejs Buffer from an existing content. -+ * @param {Object} data the data to pass to the constructor. -+ * @param {String} encoding the encoding to use. -+ * @return {Buffer} a new Buffer. -+ */ -+ newBufferFrom: function(data, encoding) { -+ // XXX We can't use `Buffer.from` which comes from `Uint8Array.from` -+ // in nodejs v4 (< v.4.5). It's not the expected implementation (and -+ // has a different signature). -+ // see https://github.com/nodejs/node/issues/8053 -+ // A condition on nodejs' version won't solve the issue as we don't -+ // control the Buffer polyfills that may or may not be used. -+ return new Buffer(data, encoding); -+ }, -+ /** -+ * Create a new nodejs Buffer with the specified size. -+ * @param {Integer} size the size of the buffer. -+ * @return {Buffer} a new Buffer. -+ */ -+ allocBuffer: function (size) { -+ if (Buffer.alloc) { -+ return Buffer.alloc(size); -+ } else { -+ return new Buffer(size); -+ } -+ }, -+ /** -+ * Find out if an object is a Buffer. -+ * @param {Object} b the object to test. -+ * @return {Boolean} true if the object is a Buffer, false otherwise. -+ */ -+ isBuffer : function(b){ -+ return Buffer.isBuffer(b); -+ }, -+ -+ isStream : function (obj) { -+ return obj && -+ typeof obj.on === "function" && -+ typeof obj.pause === "function" && -+ typeof obj.resume === "function"; -+ } -+}; -+ -+}, -+"0TcdOX1os7G/h5TxrQn4wtdmt4zFwk+ZFVQZ7GpQKQY=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = new (require('fragment-cache'))(); -+ -+}, -+"0Yj8sD+WJFevwfAFo1MEGGmvbPszkQKQYS1VzS+gUmU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const queueMicrotask = require('queue-microtask') -+const fastq = require('fastq') -+const EE = require('events').EventEmitter -+const inherits = require('util').inherits -+const debug = require('debug')('avvio') -+const CODE_PLUGIN_TIMEOUT = 'ERR_AVVIO_PLUGIN_TIMEOUT' -+ -+function getName (func) { -+ // let's see if this is a file, and in that case use that -+ // this is common for plugins -+ const cache = require.cache -+ const keys = [] // Object.keys(cache) -+ -+ // eslint-disable-next-line no-var -+ for (var i = 0; i < keys.length; i++) { -+ if (cache[keys[i]].exports === func) { -+ return keys[i] -+ } -+ } -+ -+ // if not maybe it's a named function, so use that -+ if (func.name) { -+ return func.name -+ } -+ -+ // takes the first two lines of the function if nothing else works -+ return func.toString().split('\n').slice(0, 2).map(s => s.trim()).join(' -- ') -+} -+ -+function promise () { -+ const obj = {} -+ -+ obj.promise = new Promise((resolve, reject) => { -+ obj.resolve = resolve -+ obj.reject = reject -+ }) -+ -+ return obj -+} -+ -+function Plugin (parent, func, optsOrFunc, isAfter, timeout) { -+ this.started = false -+ this.func = func -+ this.opts = optsOrFunc -+ this.onFinish = null -+ this.parent = parent -+ this.timeout = timeout === undefined ? parent._timeout : timeout -+ this.name = getName(func) -+ this.isAfter = isAfter -+ this.q = fastq(parent, loadPlugin, 1) -+ this.q.pause() -+ this._error = null -+ this.loaded = false -+ this._promise = null -+ -+ // always start the queue in the next tick -+ // because we try to attach subsequent call to use() -+ // to the right plugin. we need to defer them, -+ // or they will end up at the top of _current -+} -+ -+inherits(Plugin, EE) -+ -+Plugin.prototype.exec = function (server, cb) { -+ const func = this.func -+ let completed = false -+ const name = this.name -+ -+ if (this.parent._error && !this.isAfter) { -+ debug('skipping loading of plugin as parent errored and it is not an after', name) -+ process.nextTick(cb) -+ return -+ } -+ -+ if (!this.isAfter) { -+ // Skip override for after -+ try { -+ this.server = this.parent.override(server, func, this.opts) -+ } catch (err) { -+ debug('override errored', name) -+ return cb(err) -+ } -+ } else { -+ this.server = server -+ } -+ -+ this.opts = typeof this.opts === 'function' ? this.opts(this.server) : this.opts -+ -+ debug('exec', name) -+ -+ let timer -+ -+ const done = (err) => { -+ if (completed) { -+ debug('loading complete', name) -+ return -+ } -+ -+ this._error = err -+ -+ if (err) { -+ debug('exec errored', name) -+ } else { -+ debug('exec completed', name) -+ } -+ -+ completed = true -+ -+ if (timer) { -+ clearTimeout(timer) -+ } -+ -+ cb(err) -+ } -+ -+ if (this.timeout > 0) { -+ debug('setting up timeout', name, this.timeout) -+ timer = setTimeout(function () { -+ debug('timed out', name) -+ timer = null -+ const err = new Error(`${CODE_PLUGIN_TIMEOUT}: plugin did not start in time: ${name}. You may have forgotten to call 'done' function or to resolve a Promise`) -+ err.code = CODE_PLUGIN_TIMEOUT -+ err.fn = func -+ done(err) -+ }, this.timeout) -+ } -+ -+ this.started = true -+ this.emit('start', this.server ? this.server.name : null, this.name, Date.now()) -+ const promise = func(this.server, this.opts, done) -+ -+ if (promise && typeof promise.then === 'function') { -+ debug('exec: resolving promise', name) -+ -+ promise.then( -+ () => process.nextTick(done), -+ (e) => process.nextTick(done, e)) -+ } -+} -+ -+Plugin.prototype.loadedSoFar = function () { -+ if (this.loaded) { -+ return Promise.resolve() -+ } -+ -+ const setup = () => { -+ this.server.after((err, cb) => { -+ this._error = err -+ this.q.pause() -+ -+ if (err) { -+ debug('rejecting promise', this.name, err) -+ this._promise.reject(err) -+ } else { -+ debug('resolving promise', this.name) -+ this._promise.resolve() -+ } -+ this._promise = null -+ -+ process.nextTick(cb, err) -+ }) -+ this.q.resume() -+ } -+ -+ let res -+ -+ if (!this._promise) { -+ this._promise = promise() -+ res = this._promise.promise -+ -+ if (!this.server) { -+ this.on('start', setup) -+ } else { -+ setup() -+ } -+ } else { -+ res = Promise.resolve() -+ } -+ -+ return res -+} -+ -+Plugin.prototype.enqueue = function (obj, cb) { -+ debug('enqueue', this.name, obj.name) -+ this.emit('enqueue', this.server ? this.server.name : null, this.name, Date.now()) -+ this.q.push(obj, cb) -+} -+ -+Plugin.prototype.finish = function (err, cb) { -+ debug('finish', this.name, err) -+ const done = () => { -+ if (this.loaded) { -+ return -+ } -+ -+ debug('loaded', this.name) -+ this.emit('loaded', this.server ? this.server.name : null, this.name, Date.now()) -+ this.loaded = true -+ -+ cb(err) -+ } -+ -+ if (err) { -+ if (this._promise) { -+ this._promise.reject(err) -+ this._promise = null -+ } -+ done() -+ return -+ } -+ -+ const check = () => { -+ debug('check', this.name, this.q.length(), this.q.running(), this._promise) -+ if (this.q.length() === 0 && this.q.running() === 0) { -+ if (this._promise) { -+ const wrap = () => { -+ debug('wrap') -+ queueMicrotask(check) -+ } -+ this._promise.resolve() -+ this._promise.promise.then(wrap, wrap) -+ this._promise = null -+ } else { -+ done() -+ } -+ } else { -+ debug('delayed', this.name) -+ // finish when the queue of nested plugins to load is empty -+ this.q.drain = () => { -+ debug('drain', this.name) -+ this.q.drain = noop -+ -+ // we defer the check, as a safety net for things -+ // that might be scheduled in the loading callback -+ queueMicrotask(check) -+ } -+ } -+ } -+ -+ queueMicrotask(check) -+ -+ // we start loading the dependents plugins only once -+ // the current level is finished -+ this.q.resume() -+} -+ -+// loads a plugin -+function loadPlugin (toLoad, cb) { -+ if (typeof toLoad.func.then === 'function') { -+ toLoad.func.then((fn) => { -+ if (typeof fn.default === 'function') { -+ fn = fn.default -+ } -+ toLoad.func = fn -+ loadPlugin.call(this, toLoad, cb) -+ }, cb) -+ return -+ } -+ -+ const last = this._current[0] -+ -+ // place the plugin at the top of _current -+ this._current.unshift(toLoad) -+ -+ toLoad.exec((last && last.server) || this._server, (err) => { -+ toLoad.finish(err, (err) => { -+ this._current.shift() -+ cb(err) -+ }) -+ }) -+} -+ -+function noop () {} -+ -+module.exports = Plugin -+module.exports.loadPlugin = loadPlugin -+ -+}, -+"0bI0Og/ifiB5geeLZMVX5jRQGJsKmMCYD2b9JCGm+2c=": -+function (require, module, exports, __dirname, __filename) { -+const RandomAccess = require('random-access-storage') -+const isOptions = require('is-options') -+const inherits = require('inherits') -+ -+const DEFAULT_PAGE_SIZE = 1024 * 1024 -+ -+module.exports = RAM -+ -+function RAM (opts) { -+ if (!(this instanceof RAM)) return new RAM(opts) -+ if (typeof opts === 'number') opts = {length: opts} -+ if (!opts) opts = {} -+ -+ RandomAccess.call(this) -+ -+ if (Buffer.isBuffer(opts)) { -+ opts = {length: opts.length, buffer: opts} -+ } -+ if (!isOptions(opts)) opts = {} -+ -+ this.length = opts.length || 0 -+ this.pageSize = opts.length || opts.pageSize || DEFAULT_PAGE_SIZE -+ this.buffers = [] -+ -+ if (opts.buffer) this.buffers.push(opts.buffer) -+} -+ -+inherits(RAM, RandomAccess) -+ -+RAM.prototype._stat = function (req) { -+ callback(req, null, {size: this.length}) -+} -+ -+RAM.prototype._write = function (req) { -+ var i = Math.floor(req.offset / this.pageSize) -+ var rel = req.offset - i * this.pageSize -+ var start = 0 -+ -+ const len = req.offset + req.size -+ if (len > this.length) this.length = len -+ -+ while (start < req.size) { -+ const page = this._page(i++, true) -+ const free = this.pageSize - rel -+ const end = free < (req.size - start) -+ ? start + free -+ : req.size -+ -+ req.data.copy(page, rel, start, end) -+ start = end -+ rel = 0 -+ } -+ -+ callback(req, null, null) -+} -+ -+RAM.prototype._read = function (req) { -+ var i = Math.floor(req.offset / this.pageSize) -+ var rel = req.offset - i * this.pageSize -+ var start = 0 -+ -+ if (req.offset + req.size > this.length) { -+ return callback(req, new Error('Could not satisfy length'), null) -+ } -+ -+ const data = Buffer.alloc(req.size) -+ -+ while (start < req.size) { -+ const page = this._page(i++, false) -+ const avail = this.pageSize - rel -+ const wanted = req.size - start -+ const len = avail < wanted ? avail : wanted -+ -+ if (page) page.copy(data, start, rel, rel + len) -+ start += len -+ rel = 0 -+ } -+ -+ callback(req, null, data) -+} -+ -+RAM.prototype._del = function (req) { -+ var i = Math.floor(req.offset / this.pageSize) -+ var rel = req.offset - i * this.pageSize -+ var start = 0 -+ -+ if (rel && req.offset + req.size >= this.length) { -+ var buf = this.buffers[i] -+ if (buf) buf.fill(0, rel) -+ } -+ -+ if (req.offset + req.size > this.length) { -+ req.size = Math.max(0, this.length - req.offset) -+ } -+ -+ while (start < req.size) { -+ if (rel === 0 && req.size - start >= this.pageSize) { -+ this.buffers[i++] = undefined -+ } -+ -+ rel = 0 -+ start += this.pageSize - rel -+ } -+ -+ if (req.offset + req.size >= this.length) { -+ this.length = req.offset -+ } -+ -+ callback(req, null, null) -+} -+ -+RAM.prototype._destroy = function (req) { -+ this._buffers = [] -+ this.length = 0 -+ callback(req, null, null) -+} -+ -+RAM.prototype._page = function (i, upsert) { -+ var page = this.buffers[i] -+ if (page || !upsert) return page -+ page = this.buffers[i] = Buffer.alloc(this.pageSize) -+ return page -+} -+ -+RAM.prototype.toBuffer = function () { -+ const buf = Buffer.alloc(this.length) -+ -+ for (var i = 0; i < this.buffers.length; i++) { -+ if (this.buffers[i]) this.buffers[i].copy(buf, i * this.pageSize) -+ } -+ -+ return buf -+} -+ -+function callback (req, err, data) { -+ process.nextTick(callbackNT, req, err, data) -+} -+ -+function callbackNT (req, err, data) { -+ req.callback(err, data) -+} -+ -+}, -+"0dLDmxAguWSs3HiWORKl3dlYM7Q//05QpdeSN4GvKUE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+function Queue(options) { -+ if (!(this instanceof Queue)) { -+ return new Queue(options); -+ } -+ -+ options = options || {}; -+ this.concurrency = options.concurrency || Infinity; -+ this.pending = 0; -+ this.jobs = []; -+ this.cbs = []; -+ this._done = done.bind(this); -+} -+ -+var arrayAddMethods = [ -+ 'push', -+ 'unshift', -+ 'splice' -+]; -+ -+arrayAddMethods.forEach(function(method) { -+ Queue.prototype[method] = function() { -+ var methodResult = Array.prototype[method].apply(this.jobs, arguments); -+ this._run(); -+ return methodResult; -+ }; -+}); -+ -+Object.defineProperty(Queue.prototype, 'length', { -+ get: function() { -+ return this.pending + this.jobs.length; -+ } -+}); -+ -+Queue.prototype._run = function() { -+ if (this.pending === this.concurrency) { -+ return; -+ } -+ if (this.jobs.length) { -+ var job = this.jobs.shift(); -+ this.pending++; -+ job(this._done); -+ this._run(); -+ } -+ -+ if (this.pending === 0) { -+ while (this.cbs.length !== 0) { -+ var cb = this.cbs.pop(); -+ process.nextTick(cb); -+ } -+ } -+}; -+ -+Queue.prototype.onDone = function(cb) { -+ if (typeof cb === 'function') { -+ this.cbs.push(cb); -+ this._run(); -+ } -+}; -+ -+function done() { -+ this.pending--; -+ this._run(); -+} -+ -+module.exports = Queue; -+ -+}, -+"0g4TXknmIVjmOwJNN4VBXhU+HE4pkx8bTCijb5TR4RI=": -+function (require, module, exports, __dirname, __filename) { -+ -+var N1 = Math.pow(2, 7) -+var N2 = Math.pow(2, 14) -+var N3 = Math.pow(2, 21) -+var N4 = Math.pow(2, 28) -+var N5 = Math.pow(2, 35) -+var N6 = Math.pow(2, 42) -+var N7 = Math.pow(2, 49) -+var N8 = Math.pow(2, 56) -+var N9 = Math.pow(2, 63) -+ -+module.exports = function (value) { -+ return ( -+ value < N1 ? 1 -+ : value < N2 ? 2 -+ : value < N3 ? 3 -+ : value < N4 ? 4 -+ : value < N5 ? 5 -+ : value < N6 ? 6 -+ : value < N7 ? 7 -+ : value < N8 ? 8 -+ : value < N9 ? 9 -+ : 10 -+ ) -+} -+ -+}, -+"0k7C1caIh8dGQlZ2RNQZ7F0+jncZQyDrwIRgNVVa/Ts=": -+function (require, module, exports, __dirname, __filename) { -+var ext = require('./extent'); -+ -+ -+var types = require('./types'); -+ -+module.exports.write = function writePoints(geometries, extent, shpView, shxView, TYPE) { -+ -+ var shpI = 0; -+ -+ -+ var shxI = 0; -+ -+ -+ var shxOffset = 100; -+ -+ geometries.forEach(writePolyLine); -+ -+ function writePolyLine(coordinates, i) { -+ -+ var flattened = justCoords(coordinates); -+ -+ -+ var noParts = parts([coordinates], TYPE); -+ -+ -+ var contentLength = (flattened.length * 16) + 48 + (noParts - 1) * 4; -+ -+ var featureExtent = flattened.reduce(function(extent, c) { -+ return ext.enlarge(extent, c); -+ }, ext.blank()); -+ -+ // INDEX -+ shxView.setInt32(shxI, shxOffset / 2); // offset -+ shxView.setInt32(shxI + 4, contentLength / 2); // offset length -+ -+ shxI += 8; -+ shxOffset += contentLength + 8; -+ -+ shpView.setInt32(shpI, i + 1); // record number -+ shpView.setInt32(shpI + 4, contentLength / 2); // length -+ shpView.setInt32(shpI + 8, TYPE, true); // POLYLINE=3 -+ shpView.setFloat64(shpI + 12, featureExtent.xmin, true); // EXTENT -+ shpView.setFloat64(shpI + 20, featureExtent.ymin, true); -+ shpView.setFloat64(shpI + 28, featureExtent.xmax, true); -+ shpView.setFloat64(shpI + 36, featureExtent.ymax, true); -+ shpView.setInt32(shpI + 44, noParts, true); -+ shpView.setInt32(shpI + 48, flattened.length, true); // POINTS -+ shpView.setInt32(shpI + 52, 0, true); // The first part - index zero -+ -+ var onlyParts = coordinates.reduce(function (arr, coords) { -+ if (Array.isArray(coords[0][0])) { -+ arr = arr.concat(coords); -+ } else { -+ arr.push(coords); -+ } -+ return arr; -+ }, []); -+ for (var p = 1; p < noParts; p++) { -+ shpView.setInt32( // set part index -+ shpI + 52 + (p * 4), -+ onlyParts.reduce(function (a, b, idx) { -+ return idx < p ? a + b.length : a; -+ }, 0), -+ true -+ ); -+ } -+ -+ flattened.forEach(function writeLine(coords, i) { -+ shpView.setFloat64(shpI + 56 + (i * 16) + (noParts - 1) * 4, coords[0], true); // X -+ shpView.setFloat64(shpI + 56 + (i * 16) + (noParts - 1) * 4 + 8, coords[1], true); // Y -+ }); -+ -+ shpI += contentLength + 8; -+ } -+}; -+ -+module.exports.shpLength = function(geometries) { -+ return (geometries.length * 56) + -+ // points -+ (justCoords(geometries).length * 16); -+}; -+ -+module.exports.shxLength = function(geometries) { -+ return geometries.length * 8; -+}; -+ -+module.exports.extent = function(coordinates) { -+ return justCoords(coordinates).reduce(function(extent, c) { -+ return ext.enlarge(extent, c); -+ }, ext.blank()); -+}; -+ -+function parts(geometries, TYPE) { -+ var no = 1; -+ if (TYPE === types.geometries.POLYGON || TYPE === types.geometries.POLYLINE) { -+ no = geometries.reduce(function (no, coords) { -+ no += coords.length; -+ if (Array.isArray(coords[0][0][0])) { // multi -+ no += coords.reduce(function (no, rings) { -+ return no + rings.length - 1; // minus outer -+ }, 0); -+ } -+ return no; -+ }, 0); -+ } -+ return no; -+} -+ -+module.exports.parts = parts; -+ -+function justCoords(coords, l) { -+ if (l === undefined) l = []; -+ if (typeof coords[0][0] == 'object') { -+ return coords.reduce(function(memo, c) { -+ return memo.concat(justCoords(c)); -+ }, l); -+ } else { -+ return coords; -+ } -+} -+ -+}, -+"0xeZoj8q6H8MUtISQckieLQdI7tTZbRS8nBtQbAMQkU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// (C) 1995-2013 Jean-loup Gailly and Mark Adler -+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -+// -+// This software is provided 'as-is', without any express or implied -+// warranty. In no event will the authors be held liable for any damages -+// arising from the use of this software. -+// -+// Permission is granted to anyone to use this software for any purpose, -+// including commercial applications, and to alter it and redistribute it -+// freely, subject to the following restrictions: -+// -+// 1. The origin of this software must not be misrepresented; you must not -+// claim that you wrote the original software. If you use this software -+// in a product, an acknowledgment in the product documentation would be -+// appreciated but is not required. -+// 2. Altered source versions must be plainly marked as such, and must not be -+// misrepresented as being the original software. -+// 3. This notice may not be removed or altered from any source distribution. -+ -+var utils = require('../utils/common'); -+var adler32 = require('./adler32'); -+var crc32 = require('./crc32'); -+var inflate_fast = require('./inffast'); -+var inflate_table = require('./inftrees'); -+ -+var CODES = 0; -+var LENS = 1; -+var DISTS = 2; -+ -+/* Public constants ==========================================================*/ -+/* ===========================================================================*/ -+ -+ -+/* Allowed flush values; see deflate() and inflate() below for details */ -+//var Z_NO_FLUSH = 0; -+//var Z_PARTIAL_FLUSH = 1; -+//var Z_SYNC_FLUSH = 2; -+//var Z_FULL_FLUSH = 3; -+var Z_FINISH = 4; -+var Z_BLOCK = 5; -+var Z_TREES = 6; -+ -+ -+/* Return codes for the compression/decompression functions. Negative values -+ * are errors, positive values are used for special but normal events. -+ */ -+var Z_OK = 0; -+var Z_STREAM_END = 1; -+var Z_NEED_DICT = 2; -+//var Z_ERRNO = -1; -+var Z_STREAM_ERROR = -2; -+var Z_DATA_ERROR = -3; -+var Z_MEM_ERROR = -4; -+var Z_BUF_ERROR = -5; -+//var Z_VERSION_ERROR = -6; -+ -+/* The deflate compression method */ -+var Z_DEFLATED = 8; -+ -+ -+/* STATES ====================================================================*/ -+/* ===========================================================================*/ -+ -+ -+var HEAD = 1; /* i: waiting for magic header */ -+var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -+var TIME = 3; /* i: waiting for modification time (gzip) */ -+var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -+var EXLEN = 5; /* i: waiting for extra length (gzip) */ -+var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -+var NAME = 7; /* i: waiting for end of file name (gzip) */ -+var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -+var HCRC = 9; /* i: waiting for header crc (gzip) */ -+var DICTID = 10; /* i: waiting for dictionary check value */ -+var DICT = 11; /* waiting for inflateSetDictionary() call */ -+var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -+var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -+var STORED = 14; /* i: waiting for stored size (length and complement) */ -+var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -+var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -+var TABLE = 17; /* i: waiting for dynamic block table lengths */ -+var LENLENS = 18; /* i: waiting for code length code lengths */ -+var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -+var LEN_ = 20; /* i: same as LEN below, but only first time in */ -+var LEN = 21; /* i: waiting for length/lit/eob code */ -+var LENEXT = 22; /* i: waiting for length extra bits */ -+var DIST = 23; /* i: waiting for distance code */ -+var DISTEXT = 24; /* i: waiting for distance extra bits */ -+var MATCH = 25; /* o: waiting for output space to copy string */ -+var LIT = 26; /* o: waiting for output space to write literal */ -+var CHECK = 27; /* i: waiting for 32-bit check value */ -+var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -+var DONE = 29; /* finished check, done -- remain here until reset */ -+var BAD = 30; /* got a data error -- remain here until reset */ -+var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -+var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ -+ -+/* ===========================================================================*/ -+ -+ -+ -+var ENOUGH_LENS = 852; -+var ENOUGH_DISTS = 592; -+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); -+ -+var MAX_WBITS = 15; -+/* 32K LZ77 window */ -+var DEF_WBITS = MAX_WBITS; -+ -+ -+function zswap32(q) { -+ return (((q >>> 24) & 0xff) + -+ ((q >>> 8) & 0xff00) + -+ ((q & 0xff00) << 8) + -+ ((q & 0xff) << 24)); -+} -+ -+ -+function InflateState() { -+ this.mode = 0; /* current inflate mode */ -+ this.last = false; /* true if processing last block */ -+ this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ -+ this.havedict = false; /* true if dictionary provided */ -+ this.flags = 0; /* gzip header method and flags (0 if zlib) */ -+ this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ -+ this.check = 0; /* protected copy of check value */ -+ this.total = 0; /* protected copy of output count */ -+ // TODO: may be {} -+ this.head = null; /* where to save gzip header information */ -+ -+ /* sliding window */ -+ this.wbits = 0; /* log base 2 of requested window size */ -+ this.wsize = 0; /* window size or zero if not using window */ -+ this.whave = 0; /* valid bytes in the window */ -+ this.wnext = 0; /* window write index */ -+ this.window = null; /* allocated sliding window, if needed */ -+ -+ /* bit accumulator */ -+ this.hold = 0; /* input bit accumulator */ -+ this.bits = 0; /* number of bits in "in" */ -+ -+ /* for string and stored block copying */ -+ this.length = 0; /* literal or length of data to copy */ -+ this.offset = 0; /* distance back to copy string from */ -+ -+ /* for table and code decoding */ -+ this.extra = 0; /* extra bits needed */ -+ -+ /* fixed and dynamic code tables */ -+ this.lencode = null; /* starting table for length/literal codes */ -+ this.distcode = null; /* starting table for distance codes */ -+ this.lenbits = 0; /* index bits for lencode */ -+ this.distbits = 0; /* index bits for distcode */ -+ -+ /* dynamic table building */ -+ this.ncode = 0; /* number of code length code lengths */ -+ this.nlen = 0; /* number of length code lengths */ -+ this.ndist = 0; /* number of distance code lengths */ -+ this.have = 0; /* number of code lengths in lens[] */ -+ this.next = null; /* next available space in codes[] */ -+ -+ this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ -+ this.work = new utils.Buf16(288); /* work area for code table building */ -+ -+ /* -+ because we don't have pointers in js, we use lencode and distcode directly -+ as buffers so we don't need codes -+ */ -+ //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ -+ this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ -+ this.distdyn = null; /* dynamic table for distance codes (JS specific) */ -+ this.sane = 0; /* if false, allow invalid distance too far */ -+ this.back = 0; /* bits back of last unprocessed length/lit */ -+ this.was = 0; /* initial length of match */ -+} -+ -+function inflateResetKeep(strm) { -+ var state; -+ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ strm.total_in = strm.total_out = state.total = 0; -+ strm.msg = ''; /*Z_NULL*/ -+ if (state.wrap) { /* to support ill-conceived Java test suite */ -+ strm.adler = state.wrap & 1; -+ } -+ state.mode = HEAD; -+ state.last = 0; -+ state.havedict = 0; -+ state.dmax = 32768; -+ state.head = null/*Z_NULL*/; -+ state.hold = 0; -+ state.bits = 0; -+ //state.lencode = state.distcode = state.next = state.codes; -+ state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); -+ state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); -+ -+ state.sane = 1; -+ state.back = -1; -+ //Tracev((stderr, "inflate: reset\n")); -+ return Z_OK; -+} -+ -+function inflateReset(strm) { -+ var state; -+ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ state.wsize = 0; -+ state.whave = 0; -+ state.wnext = 0; -+ return inflateResetKeep(strm); -+ -+} -+ -+function inflateReset2(strm, windowBits) { -+ var wrap; -+ var state; -+ -+ /* get the state */ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ -+ /* extract wrap request from windowBits parameter */ -+ if (windowBits < 0) { -+ wrap = 0; -+ windowBits = -windowBits; -+ } -+ else { -+ wrap = (windowBits >> 4) + 1; -+ if (windowBits < 48) { -+ windowBits &= 15; -+ } -+ } -+ -+ /* set number of window bits, free window if different */ -+ if (windowBits && (windowBits < 8 || windowBits > 15)) { -+ return Z_STREAM_ERROR; -+ } -+ if (state.window !== null && state.wbits !== windowBits) { -+ state.window = null; -+ } -+ -+ /* update state and reset the rest of it */ -+ state.wrap = wrap; -+ state.wbits = windowBits; -+ return inflateReset(strm); -+} -+ -+function inflateInit2(strm, windowBits) { -+ var ret; -+ var state; -+ -+ if (!strm) { return Z_STREAM_ERROR; } -+ //strm.msg = Z_NULL; /* in case we return an error */ -+ -+ state = new InflateState(); -+ -+ //if (state === Z_NULL) return Z_MEM_ERROR; -+ //Tracev((stderr, "inflate: allocated\n")); -+ strm.state = state; -+ state.window = null/*Z_NULL*/; -+ ret = inflateReset2(strm, windowBits); -+ if (ret !== Z_OK) { -+ strm.state = null/*Z_NULL*/; -+ } -+ return ret; -+} -+ -+function inflateInit(strm) { -+ return inflateInit2(strm, DEF_WBITS); -+} -+ -+ -+/* -+ Return state with length and distance decoding tables and index sizes set to -+ fixed code decoding. Normally this returns fixed tables from inffixed.h. -+ If BUILDFIXED is defined, then instead this routine builds the tables the -+ first time it's called, and returns those tables the first time and -+ thereafter. This reduces the size of the code by about 2K bytes, in -+ exchange for a little execution time. However, BUILDFIXED should not be -+ used for threaded applications, since the rewriting of the tables and virgin -+ may not be thread-safe. -+ */ -+var virgin = true; -+ -+var lenfix, distfix; // We have no pointers in JS, so keep tables separate -+ -+function fixedtables(state) { -+ /* build fixed huffman tables if first call (may not be thread safe) */ -+ if (virgin) { -+ var sym; -+ -+ lenfix = new utils.Buf32(512); -+ distfix = new utils.Buf32(32); -+ -+ /* literal/length table */ -+ sym = 0; -+ while (sym < 144) { state.lens[sym++] = 8; } -+ while (sym < 256) { state.lens[sym++] = 9; } -+ while (sym < 280) { state.lens[sym++] = 7; } -+ while (sym < 288) { state.lens[sym++] = 8; } -+ -+ inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); -+ -+ /* distance table */ -+ sym = 0; -+ while (sym < 32) { state.lens[sym++] = 5; } -+ -+ inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); -+ -+ /* do this just once */ -+ virgin = false; -+ } -+ -+ state.lencode = lenfix; -+ state.lenbits = 9; -+ state.distcode = distfix; -+ state.distbits = 5; -+} -+ -+ -+/* -+ Update the window with the last wsize (normally 32K) bytes written before -+ returning. If window does not exist yet, create it. This is only called -+ when a window is already in use, or when output has been written during this -+ inflate call, but the end of the deflate stream has not been reached yet. -+ It is also called to create a window for dictionary data when a dictionary -+ is loaded. -+ -+ Providing output buffers larger than 32K to inflate() should provide a speed -+ advantage, since only the last 32K of output is copied to the sliding window -+ upon return from inflate(), and since all distances after the first 32K of -+ output will fall in the output data, making match copies simpler and faster. -+ The advantage may be dependent on the size of the processor's data caches. -+ */ -+function updatewindow(strm, src, end, copy) { -+ var dist; -+ var state = strm.state; -+ -+ /* if it hasn't been done already, allocate space for the window */ -+ if (state.window === null) { -+ state.wsize = 1 << state.wbits; -+ state.wnext = 0; -+ state.whave = 0; -+ -+ state.window = new utils.Buf8(state.wsize); -+ } -+ -+ /* copy state->wsize or less output bytes into the circular window */ -+ if (copy >= state.wsize) { -+ utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); -+ state.wnext = 0; -+ state.whave = state.wsize; -+ } -+ else { -+ dist = state.wsize - state.wnext; -+ if (dist > copy) { -+ dist = copy; -+ } -+ //zmemcpy(state->window + state->wnext, end - copy, dist); -+ utils.arraySet(state.window, src, end - copy, dist, state.wnext); -+ copy -= dist; -+ if (copy) { -+ //zmemcpy(state->window, end - copy, copy); -+ utils.arraySet(state.window, src, end - copy, copy, 0); -+ state.wnext = copy; -+ state.whave = state.wsize; -+ } -+ else { -+ state.wnext += dist; -+ if (state.wnext === state.wsize) { state.wnext = 0; } -+ if (state.whave < state.wsize) { state.whave += dist; } -+ } -+ } -+ return 0; -+} -+ -+function inflate(strm, flush) { -+ var state; -+ var input, output; // input/output buffers -+ var next; /* next input INDEX */ -+ var put; /* next output INDEX */ -+ var have, left; /* available input and output */ -+ var hold; /* bit buffer */ -+ var bits; /* bits in bit buffer */ -+ var _in, _out; /* save starting available input and output */ -+ var copy; /* number of stored or match bytes to copy */ -+ var from; /* where to copy match bytes from */ -+ var from_source; -+ var here = 0; /* current decoding table entry */ -+ var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) -+ //var last; /* parent table entry */ -+ var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) -+ var len; /* length to copy for repeats, bits to drop */ -+ var ret; /* return code */ -+ var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ -+ var opts; -+ -+ var n; // temporary var for NEED_BITS -+ -+ var order = /* permutation of code lengths */ -+ [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; -+ -+ -+ if (!strm || !strm.state || !strm.output || -+ (!strm.input && strm.avail_in !== 0)) { -+ return Z_STREAM_ERROR; -+ } -+ -+ state = strm.state; -+ if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ -+ -+ -+ //--- LOAD() --- -+ put = strm.next_out; -+ output = strm.output; -+ left = strm.avail_out; -+ next = strm.next_in; -+ input = strm.input; -+ have = strm.avail_in; -+ hold = state.hold; -+ bits = state.bits; -+ //--- -+ -+ _in = have; -+ _out = left; -+ ret = Z_OK; -+ -+ inf_leave: // goto emulation -+ for (;;) { -+ switch (state.mode) { -+ case HEAD: -+ if (state.wrap === 0) { -+ state.mode = TYPEDO; -+ break; -+ } -+ //=== NEEDBITS(16); -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ -+ state.check = 0/*crc32(0L, Z_NULL, 0)*/; -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = FLAGS; -+ break; -+ } -+ state.flags = 0; /* expect zlib header */ -+ if (state.head) { -+ state.head.done = false; -+ } -+ if (!(state.wrap & 1) || /* check if zlib header allowed */ -+ (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { -+ strm.msg = 'incorrect header check'; -+ state.mode = BAD; -+ break; -+ } -+ if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { -+ strm.msg = 'unknown compression method'; -+ state.mode = BAD; -+ break; -+ } -+ //--- DROPBITS(4) ---// -+ hold >>>= 4; -+ bits -= 4; -+ //---// -+ len = (hold & 0x0f)/*BITS(4)*/ + 8; -+ if (state.wbits === 0) { -+ state.wbits = len; -+ } -+ else if (len > state.wbits) { -+ strm.msg = 'invalid window size'; -+ state.mode = BAD; -+ break; -+ } -+ state.dmax = 1 << len; -+ //Tracev((stderr, "inflate: zlib header ok\n")); -+ strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; -+ state.mode = hold & 0x200 ? DICTID : TYPE; -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ break; -+ case FLAGS: -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.flags = hold; -+ if ((state.flags & 0xff) !== Z_DEFLATED) { -+ strm.msg = 'unknown compression method'; -+ state.mode = BAD; -+ break; -+ } -+ if (state.flags & 0xe000) { -+ strm.msg = 'unknown header flags set'; -+ state.mode = BAD; -+ break; -+ } -+ if (state.head) { -+ state.head.text = ((hold >> 8) & 1); -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = TIME; -+ /* falls through */ -+ case TIME: -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (state.head) { -+ state.head.time = hold; -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC4(state.check, hold) -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ hbuf[2] = (hold >>> 16) & 0xff; -+ hbuf[3] = (hold >>> 24) & 0xff; -+ state.check = crc32(state.check, hbuf, 4, 0); -+ //=== -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = OS; -+ /* falls through */ -+ case OS: -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (state.head) { -+ state.head.xflags = (hold & 0xff); -+ state.head.os = (hold >> 8); -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = EXLEN; -+ /* falls through */ -+ case EXLEN: -+ if (state.flags & 0x0400) { -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.length = hold; -+ if (state.head) { -+ state.head.extra_len = hold; -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ } -+ else if (state.head) { -+ state.head.extra = null/*Z_NULL*/; -+ } -+ state.mode = EXTRA; -+ /* falls through */ -+ case EXTRA: -+ if (state.flags & 0x0400) { -+ copy = state.length; -+ if (copy > have) { copy = have; } -+ if (copy) { -+ if (state.head) { -+ len = state.head.extra_len - state.length; -+ if (!state.head.extra) { -+ // Use untyped array for more convenient processing later -+ state.head.extra = new Array(state.head.extra_len); -+ } -+ utils.arraySet( -+ state.head.extra, -+ input, -+ next, -+ // extra field is limited to 65536 bytes -+ // - no need for additional size check -+ copy, -+ /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ -+ len -+ ); -+ //zmemcpy(state.head.extra + len, next, -+ // len + copy > state.head.extra_max ? -+ // state.head.extra_max - len : copy); -+ } -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ state.length -= copy; -+ } -+ if (state.length) { break inf_leave; } -+ } -+ state.length = 0; -+ state.mode = NAME; -+ /* falls through */ -+ case NAME: -+ if (state.flags & 0x0800) { -+ if (have === 0) { break inf_leave; } -+ copy = 0; -+ do { -+ // TODO: 2 or 1 bytes? -+ len = input[next + copy++]; -+ /* use constant limit because in js we should not preallocate memory */ -+ if (state.head && len && -+ (state.length < 65536 /*state.head.name_max*/)) { -+ state.head.name += String.fromCharCode(len); -+ } -+ } while (len && copy < have); -+ -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ if (len) { break inf_leave; } -+ } -+ else if (state.head) { -+ state.head.name = null; -+ } -+ state.length = 0; -+ state.mode = COMMENT; -+ /* falls through */ -+ case COMMENT: -+ if (state.flags & 0x1000) { -+ if (have === 0) { break inf_leave; } -+ copy = 0; -+ do { -+ len = input[next + copy++]; -+ /* use constant limit because in js we should not preallocate memory */ -+ if (state.head && len && -+ (state.length < 65536 /*state.head.comm_max*/)) { -+ state.head.comment += String.fromCharCode(len); -+ } -+ } while (len && copy < have); -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ if (len) { break inf_leave; } -+ } -+ else if (state.head) { -+ state.head.comment = null; -+ } -+ state.mode = HCRC; -+ /* falls through */ -+ case HCRC: -+ if (state.flags & 0x0200) { -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (hold !== (state.check & 0xffff)) { -+ strm.msg = 'header crc mismatch'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ } -+ if (state.head) { -+ state.head.hcrc = ((state.flags >> 9) & 1); -+ state.head.done = true; -+ } -+ strm.adler = state.check = 0; -+ state.mode = TYPE; -+ break; -+ case DICTID: -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ strm.adler = state.check = zswap32(hold); -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = DICT; -+ /* falls through */ -+ case DICT: -+ if (state.havedict === 0) { -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ return Z_NEED_DICT; -+ } -+ strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; -+ state.mode = TYPE; -+ /* falls through */ -+ case TYPE: -+ if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case TYPEDO: -+ if (state.last) { -+ //--- BYTEBITS() ---// -+ hold >>>= bits & 7; -+ bits -= bits & 7; -+ //---// -+ state.mode = CHECK; -+ break; -+ } -+ //=== NEEDBITS(3); */ -+ while (bits < 3) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.last = (hold & 0x01)/*BITS(1)*/; -+ //--- DROPBITS(1) ---// -+ hold >>>= 1; -+ bits -= 1; -+ //---// -+ -+ switch ((hold & 0x03)/*BITS(2)*/) { -+ case 0: /* stored block */ -+ //Tracev((stderr, "inflate: stored block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = STORED; -+ break; -+ case 1: /* fixed block */ -+ fixedtables(state); -+ //Tracev((stderr, "inflate: fixed codes block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = LEN_; /* decode codes */ -+ if (flush === Z_TREES) { -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ break inf_leave; -+ } -+ break; -+ case 2: /* dynamic block */ -+ //Tracev((stderr, "inflate: dynamic codes block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = TABLE; -+ break; -+ case 3: -+ strm.msg = 'invalid block type'; -+ state.mode = BAD; -+ } -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ break; -+ case STORED: -+ //--- BYTEBITS() ---// /* go to byte boundary */ -+ hold >>>= bits & 7; -+ bits -= bits & 7; -+ //---// -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { -+ strm.msg = 'invalid stored block lengths'; -+ state.mode = BAD; -+ break; -+ } -+ state.length = hold & 0xffff; -+ //Tracev((stderr, "inflate: stored length %u\n", -+ // state.length)); -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = COPY_; -+ if (flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case COPY_: -+ state.mode = COPY; -+ /* falls through */ -+ case COPY: -+ copy = state.length; -+ if (copy) { -+ if (copy > have) { copy = have; } -+ if (copy > left) { copy = left; } -+ if (copy === 0) { break inf_leave; } -+ //--- zmemcpy(put, next, copy); --- -+ utils.arraySet(output, input, next, copy, put); -+ //---// -+ have -= copy; -+ next += copy; -+ left -= copy; -+ put += copy; -+ state.length -= copy; -+ break; -+ } -+ //Tracev((stderr, "inflate: stored end\n")); -+ state.mode = TYPE; -+ break; -+ case TABLE: -+ //=== NEEDBITS(14); */ -+ while (bits < 14) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; -+ //--- DROPBITS(5) ---// -+ hold >>>= 5; -+ bits -= 5; -+ //---// -+ state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; -+ //--- DROPBITS(5) ---// -+ hold >>>= 5; -+ bits -= 5; -+ //---// -+ state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; -+ //--- DROPBITS(4) ---// -+ hold >>>= 4; -+ bits -= 4; -+ //---// -+//#ifndef PKZIP_BUG_WORKAROUND -+ if (state.nlen > 286 || state.ndist > 30) { -+ strm.msg = 'too many length or distance symbols'; -+ state.mode = BAD; -+ break; -+ } -+//#endif -+ //Tracev((stderr, "inflate: table sizes ok\n")); -+ state.have = 0; -+ state.mode = LENLENS; -+ /* falls through */ -+ case LENLENS: -+ while (state.have < state.ncode) { -+ //=== NEEDBITS(3); -+ while (bits < 3) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); -+ //--- DROPBITS(3) ---// -+ hold >>>= 3; -+ bits -= 3; -+ //---// -+ } -+ while (state.have < 19) { -+ state.lens[order[state.have++]] = 0; -+ } -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ //state.next = state.codes; -+ //state.lencode = state.next; -+ // Switch to use dynamic table -+ state.lencode = state.lendyn; -+ state.lenbits = 7; -+ -+ opts = { bits: state.lenbits }; -+ ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); -+ state.lenbits = opts.bits; -+ -+ if (ret) { -+ strm.msg = 'invalid code lengths set'; -+ state.mode = BAD; -+ break; -+ } -+ //Tracev((stderr, "inflate: code lengths ok\n")); -+ state.have = 0; -+ state.mode = CODELENS; -+ /* falls through */ -+ case CODELENS: -+ while (state.have < state.nlen + state.ndist) { -+ for (;;) { -+ here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if (here_val < 16) { -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.lens[state.have++] = here_val; -+ } -+ else { -+ if (here_val === 16) { -+ //=== NEEDBITS(here.bits + 2); -+ n = here_bits + 2; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ if (state.have === 0) { -+ strm.msg = 'invalid bit length repeat'; -+ state.mode = BAD; -+ break; -+ } -+ len = state.lens[state.have - 1]; -+ copy = 3 + (hold & 0x03);//BITS(2); -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ } -+ else if (here_val === 17) { -+ //=== NEEDBITS(here.bits + 3); -+ n = here_bits + 3; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ len = 0; -+ copy = 3 + (hold & 0x07);//BITS(3); -+ //--- DROPBITS(3) ---// -+ hold >>>= 3; -+ bits -= 3; -+ //---// -+ } -+ else { -+ //=== NEEDBITS(here.bits + 7); -+ n = here_bits + 7; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ len = 0; -+ copy = 11 + (hold & 0x7f);//BITS(7); -+ //--- DROPBITS(7) ---// -+ hold >>>= 7; -+ bits -= 7; -+ //---// -+ } -+ if (state.have + copy > state.nlen + state.ndist) { -+ strm.msg = 'invalid bit length repeat'; -+ state.mode = BAD; -+ break; -+ } -+ while (copy--) { -+ state.lens[state.have++] = len; -+ } -+ } -+ } -+ -+ /* handle error breaks in while */ -+ if (state.mode === BAD) { break; } -+ -+ /* check for end-of-block code (better have one) */ -+ if (state.lens[256] === 0) { -+ strm.msg = 'invalid code -- missing end-of-block'; -+ state.mode = BAD; -+ break; -+ } -+ -+ /* build code tables -- note: do not change the lenbits or distbits -+ values here (9 and 6) without reading the comments in inftrees.h -+ concerning the ENOUGH constants, which depend on those values */ -+ state.lenbits = 9; -+ -+ opts = { bits: state.lenbits }; -+ ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ // state.next_index = opts.table_index; -+ state.lenbits = opts.bits; -+ // state.lencode = state.next; -+ -+ if (ret) { -+ strm.msg = 'invalid literal/lengths set'; -+ state.mode = BAD; -+ break; -+ } -+ -+ state.distbits = 6; -+ //state.distcode.copy(state.codes); -+ // Switch to use dynamic table -+ state.distcode = state.distdyn; -+ opts = { bits: state.distbits }; -+ ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ // state.next_index = opts.table_index; -+ state.distbits = opts.bits; -+ // state.distcode = state.next; -+ -+ if (ret) { -+ strm.msg = 'invalid distances set'; -+ state.mode = BAD; -+ break; -+ } -+ //Tracev((stderr, 'inflate: codes ok\n')); -+ state.mode = LEN_; -+ if (flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case LEN_: -+ state.mode = LEN; -+ /* falls through */ -+ case LEN: -+ if (have >= 6 && left >= 258) { -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ inflate_fast(strm, _out); -+ //--- LOAD() --- -+ put = strm.next_out; -+ output = strm.output; -+ left = strm.avail_out; -+ next = strm.next_in; -+ input = strm.input; -+ have = strm.avail_in; -+ hold = state.hold; -+ bits = state.bits; -+ //--- -+ -+ if (state.mode === TYPE) { -+ state.back = -1; -+ } -+ break; -+ } -+ state.back = 0; -+ for (;;) { -+ here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if (here_bits <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if (here_op && (here_op & 0xf0) === 0) { -+ last_bits = here_bits; -+ last_op = here_op; -+ last_val = here_val; -+ for (;;) { -+ here = state.lencode[last_val + -+ ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((last_bits + here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ //--- DROPBITS(last.bits) ---// -+ hold >>>= last_bits; -+ bits -= last_bits; -+ //---// -+ state.back += last_bits; -+ } -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.back += here_bits; -+ state.length = here_val; -+ if (here_op === 0) { -+ //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? -+ // "inflate: literal '%c'\n" : -+ // "inflate: literal 0x%02x\n", here.val)); -+ state.mode = LIT; -+ break; -+ } -+ if (here_op & 32) { -+ //Tracevv((stderr, "inflate: end of block\n")); -+ state.back = -1; -+ state.mode = TYPE; -+ break; -+ } -+ if (here_op & 64) { -+ strm.msg = 'invalid literal/length code'; -+ state.mode = BAD; -+ break; -+ } -+ state.extra = here_op & 15; -+ state.mode = LENEXT; -+ /* falls through */ -+ case LENEXT: -+ if (state.extra) { -+ //=== NEEDBITS(state.extra); -+ n = state.extra; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; -+ //--- DROPBITS(state.extra) ---// -+ hold >>>= state.extra; -+ bits -= state.extra; -+ //---// -+ state.back += state.extra; -+ } -+ //Tracevv((stderr, "inflate: length %u\n", state.length)); -+ state.was = state.length; -+ state.mode = DIST; -+ /* falls through */ -+ case DIST: -+ for (;;) { -+ here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if ((here_op & 0xf0) === 0) { -+ last_bits = here_bits; -+ last_op = here_op; -+ last_val = here_val; -+ for (;;) { -+ here = state.distcode[last_val + -+ ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((last_bits + here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ //--- DROPBITS(last.bits) ---// -+ hold >>>= last_bits; -+ bits -= last_bits; -+ //---// -+ state.back += last_bits; -+ } -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.back += here_bits; -+ if (here_op & 64) { -+ strm.msg = 'invalid distance code'; -+ state.mode = BAD; -+ break; -+ } -+ state.offset = here_val; -+ state.extra = (here_op) & 15; -+ state.mode = DISTEXT; -+ /* falls through */ -+ case DISTEXT: -+ if (state.extra) { -+ //=== NEEDBITS(state.extra); -+ n = state.extra; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; -+ //--- DROPBITS(state.extra) ---// -+ hold >>>= state.extra; -+ bits -= state.extra; -+ //---// -+ state.back += state.extra; -+ } -+//#ifdef INFLATE_STRICT -+ if (state.offset > state.dmax) { -+ strm.msg = 'invalid distance too far back'; -+ state.mode = BAD; -+ break; -+ } -+//#endif -+ //Tracevv((stderr, "inflate: distance %u\n", state.offset)); -+ state.mode = MATCH; -+ /* falls through */ -+ case MATCH: -+ if (left === 0) { break inf_leave; } -+ copy = _out - left; -+ if (state.offset > copy) { /* copy from window */ -+ copy = state.offset - copy; -+ if (copy > state.whave) { -+ if (state.sane) { -+ strm.msg = 'invalid distance too far back'; -+ state.mode = BAD; -+ break; -+ } -+// (!) This block is disabled in zlib defaults, -+// don't enable it for binary compatibility -+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -+// Trace((stderr, "inflate.c too far\n")); -+// copy -= state.whave; -+// if (copy > state.length) { copy = state.length; } -+// if (copy > left) { copy = left; } -+// left -= copy; -+// state.length -= copy; -+// do { -+// output[put++] = 0; -+// } while (--copy); -+// if (state.length === 0) { state.mode = LEN; } -+// break; -+//#endif -+ } -+ if (copy > state.wnext) { -+ copy -= state.wnext; -+ from = state.wsize - copy; -+ } -+ else { -+ from = state.wnext - copy; -+ } -+ if (copy > state.length) { copy = state.length; } -+ from_source = state.window; -+ } -+ else { /* copy from output */ -+ from_source = output; -+ from = put - state.offset; -+ copy = state.length; -+ } -+ if (copy > left) { copy = left; } -+ left -= copy; -+ state.length -= copy; -+ do { -+ output[put++] = from_source[from++]; -+ } while (--copy); -+ if (state.length === 0) { state.mode = LEN; } -+ break; -+ case LIT: -+ if (left === 0) { break inf_leave; } -+ output[put++] = state.length; -+ left--; -+ state.mode = LEN; -+ break; -+ case CHECK: -+ if (state.wrap) { -+ //=== NEEDBITS(32); -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ // Use '|' instead of '+' to make sure that result is signed -+ hold |= input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ _out -= left; -+ strm.total_out += _out; -+ state.total += _out; -+ if (_out) { -+ strm.adler = state.check = -+ /*UPDATE(state.check, put - _out, _out);*/ -+ (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); -+ -+ } -+ _out = left; -+ // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too -+ if ((state.flags ? hold : zswap32(hold)) !== state.check) { -+ strm.msg = 'incorrect data check'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ //Tracev((stderr, "inflate: check matches trailer\n")); -+ } -+ state.mode = LENGTH; -+ /* falls through */ -+ case LENGTH: -+ if (state.wrap && state.flags) { -+ //=== NEEDBITS(32); -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (hold !== (state.total & 0xffffffff)) { -+ strm.msg = 'incorrect length check'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ //Tracev((stderr, "inflate: length matches trailer\n")); -+ } -+ state.mode = DONE; -+ /* falls through */ -+ case DONE: -+ ret = Z_STREAM_END; -+ break inf_leave; -+ case BAD: -+ ret = Z_DATA_ERROR; -+ break inf_leave; -+ case MEM: -+ return Z_MEM_ERROR; -+ case SYNC: -+ /* falls through */ -+ default: -+ return Z_STREAM_ERROR; -+ } -+ } -+ -+ // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" -+ -+ /* -+ Return from inflate(), updating the total counts and the check value. -+ If there was no progress during the inflate() call, return a buffer -+ error. Call updatewindow() to create and/or update the window state. -+ Note: a memory error from inflate() is non-recoverable. -+ */ -+ -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ -+ if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && -+ (state.mode < CHECK || flush !== Z_FINISH))) { -+ if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { -+ state.mode = MEM; -+ return Z_MEM_ERROR; -+ } -+ } -+ _in -= strm.avail_in; -+ _out -= strm.avail_out; -+ strm.total_in += _in; -+ strm.total_out += _out; -+ state.total += _out; -+ if (state.wrap && _out) { -+ strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ -+ (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); -+ } -+ strm.data_type = state.bits + (state.last ? 64 : 0) + -+ (state.mode === TYPE ? 128 : 0) + -+ (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); -+ if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { -+ ret = Z_BUF_ERROR; -+ } -+ return ret; -+} -+ -+function inflateEnd(strm) { -+ -+ if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { -+ return Z_STREAM_ERROR; -+ } -+ -+ var state = strm.state; -+ if (state.window) { -+ state.window = null; -+ } -+ strm.state = null; -+ return Z_OK; -+} -+ -+function inflateGetHeader(strm, head) { -+ var state; -+ -+ /* check state */ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } -+ -+ /* save header structure */ -+ state.head = head; -+ head.done = false; -+ return Z_OK; -+} -+ -+function inflateSetDictionary(strm, dictionary) { -+ var dictLength = dictionary.length; -+ -+ var state; -+ var dictid; -+ var ret; -+ -+ /* check state */ -+ if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ -+ if (state.wrap !== 0 && state.mode !== DICT) { -+ return Z_STREAM_ERROR; -+ } -+ -+ /* check for correct dictionary identifier */ -+ if (state.mode === DICT) { -+ dictid = 1; /* adler32(0, null, 0)*/ -+ /* dictid = adler32(dictid, dictionary, dictLength); */ -+ dictid = adler32(dictid, dictionary, dictLength, 0); -+ if (dictid !== state.check) { -+ return Z_DATA_ERROR; -+ } -+ } -+ /* copy dictionary to window using updatewindow(), which will amend the -+ existing dictionary if appropriate */ -+ ret = updatewindow(strm, dictionary, dictLength, dictLength); -+ if (ret) { -+ state.mode = MEM; -+ return Z_MEM_ERROR; -+ } -+ state.havedict = 1; -+ // Tracev((stderr, "inflate: dictionary set\n")); -+ return Z_OK; -+} -+ -+exports.inflateReset = inflateReset; -+exports.inflateReset2 = inflateReset2; -+exports.inflateResetKeep = inflateResetKeep; -+exports.inflateInit = inflateInit; -+exports.inflateInit2 = inflateInit2; -+exports.inflate = inflate; -+exports.inflateEnd = inflateEnd; -+exports.inflateGetHeader = inflateGetHeader; -+exports.inflateSetDictionary = inflateSetDictionary; -+exports.inflateInfo = 'pako inflate (from Nodeca project)'; -+ -+/* Not implemented -+exports.inflateCopy = inflateCopy; -+exports.inflateGetDictionary = inflateGetDictionary; -+exports.inflateMark = inflateMark; -+exports.inflatePrime = inflatePrime; -+exports.inflateSync = inflateSync; -+exports.inflateSyncPoint = inflateSyncPoint; -+exports.inflateUndermine = inflateUndermine; -+*/ -+ -+}, -+"1+2UmCFCKTtST4IBDL6fIO3Q60UUi0cOCyv4IJzI3Hw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var StringReader = require('./stringReader'); -+var utils = require('./utils'); -+var CompressedObject = require('./compressedObject'); -+var jszipProto = require('./object'); -+ -+var MADE_BY_DOS = 0x00; -+var MADE_BY_UNIX = 0x03; -+ -+// class ZipEntry {{{ -+/** -+ * An entry in the zip file. -+ * @constructor -+ * @param {Object} options Options of the current file. -+ * @param {Object} loadOptions Options for loading the stream. -+ */ -+function ZipEntry(options, loadOptions) { -+ this.options = options; -+ this.loadOptions = loadOptions; -+} -+ZipEntry.prototype = { -+ /** -+ * say if the file is encrypted. -+ * @return {boolean} true if the file is encrypted, false otherwise. -+ */ -+ isEncrypted: function() { -+ // bit 1 is set -+ return (this.bitFlag & 0x0001) === 0x0001; -+ }, -+ /** -+ * say if the file has utf-8 filename/comment. -+ * @return {boolean} true if the filename/comment is in utf-8, false otherwise. -+ */ -+ useUTF8: function() { -+ // bit 11 is set -+ return (this.bitFlag & 0x0800) === 0x0800; -+ }, -+ /** -+ * Prepare the function used to generate the compressed content from this ZipFile. -+ * @param {DataReader} reader the reader to use. -+ * @param {number} from the offset from where we should read the data. -+ * @param {number} length the length of the data to read. -+ * @return {Function} the callback to get the compressed content (the type depends of the DataReader class). -+ */ -+ prepareCompressedContent: function(reader, from, length) { -+ return function() { -+ var previousIndex = reader.index; -+ reader.setIndex(from); -+ var compressedFileData = reader.readData(length); -+ reader.setIndex(previousIndex); -+ -+ return compressedFileData; -+ }; -+ }, -+ /** -+ * Prepare the function used to generate the uncompressed content from this ZipFile. -+ * @param {DataReader} reader the reader to use. -+ * @param {number} from the offset from where we should read the data. -+ * @param {number} length the length of the data to read. -+ * @param {JSZip.compression} compression the compression used on this file. -+ * @param {number} uncompressedSize the uncompressed size to expect. -+ * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class). -+ */ -+ prepareContent: function(reader, from, length, compression, uncompressedSize) { -+ return function() { -+ -+ var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent()); -+ var uncompressedFileData = compression.uncompress(compressedFileData); -+ -+ if (uncompressedFileData.length !== uncompressedSize) { -+ throw new Error("Bug : uncompressed data size mismatch"); -+ } -+ -+ return uncompressedFileData; -+ }; -+ }, -+ /** -+ * Read the local part of a zip file and add the info in this object. -+ * @param {DataReader} reader the reader to use. -+ */ -+ readLocalPart: function(reader) { -+ var compression, localExtraFieldsLength; -+ -+ // we already know everything from the central dir ! -+ // If the central dir data are false, we are doomed. -+ // On the bright side, the local part is scary : zip64, data descriptors, both, etc. -+ // The less data we get here, the more reliable this should be. -+ // Let's skip the whole header and dash to the data ! -+ reader.skip(22); -+ // in some zip created on windows, the filename stored in the central dir contains \ instead of /. -+ // Strangely, the filename here is OK. -+ // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes -+ // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators... -+ // Search "unzip mismatching "local" filename continuing with "central" filename version" on -+ // the internet. -+ // -+ // I think I see the logic here : the central directory is used to display -+ // content and the local directory is used to extract the files. Mixing / and \ -+ // may be used to display \ to windows users and use / when extracting the files. -+ // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394 -+ this.fileNameLength = reader.readInt(2); -+ localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir -+ this.fileName = reader.readString(this.fileNameLength); -+ reader.skip(localExtraFieldsLength); -+ -+ if (this.compressedSize == -1 || this.uncompressedSize == -1) { -+ throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)"); -+ } -+ -+ compression = utils.findCompression(this.compressionMethod); -+ if (compression === null) { // no compression found -+ throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")"); -+ } -+ this.decompressed = new CompressedObject(); -+ this.decompressed.compressedSize = this.compressedSize; -+ this.decompressed.uncompressedSize = this.uncompressedSize; -+ this.decompressed.crc32 = this.crc32; -+ this.decompressed.compressionMethod = this.compressionMethod; -+ this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression); -+ this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize); -+ -+ // we need to compute the crc32... -+ if (this.loadOptions.checkCRC32) { -+ this.decompressed = utils.transformTo("string", this.decompressed.getContent()); -+ if (jszipProto.crc32(this.decompressed) !== this.crc32) { -+ throw new Error("Corrupted zip : CRC32 mismatch"); -+ } -+ } -+ }, -+ -+ /** -+ * Read the central part of a zip file and add the info in this object. -+ * @param {DataReader} reader the reader to use. -+ */ -+ readCentralPart: function(reader) { -+ this.versionMadeBy = reader.readInt(2); -+ this.versionNeeded = reader.readInt(2); -+ this.bitFlag = reader.readInt(2); -+ this.compressionMethod = reader.readString(2); -+ this.date = reader.readDate(); -+ this.crc32 = reader.readInt(4); -+ this.compressedSize = reader.readInt(4); -+ this.uncompressedSize = reader.readInt(4); -+ this.fileNameLength = reader.readInt(2); -+ this.extraFieldsLength = reader.readInt(2); -+ this.fileCommentLength = reader.readInt(2); -+ this.diskNumberStart = reader.readInt(2); -+ this.internalFileAttributes = reader.readInt(2); -+ this.externalFileAttributes = reader.readInt(4); -+ this.localHeaderOffset = reader.readInt(4); -+ -+ if (this.isEncrypted()) { -+ throw new Error("Encrypted zip are not supported"); -+ } -+ -+ this.fileName = reader.readString(this.fileNameLength); -+ this.readExtraFields(reader); -+ this.parseZIP64ExtraField(reader); -+ this.fileComment = reader.readString(this.fileCommentLength); -+ }, -+ -+ /** -+ * Parse the external file attributes and get the unix/dos permissions. -+ */ -+ processAttributes: function () { -+ this.unixPermissions = null; -+ this.dosPermissions = null; -+ var madeBy = this.versionMadeBy >> 8; -+ -+ // Check if we have the DOS directory flag set. -+ // We look for it in the DOS and UNIX permissions -+ // but some unknown platform could set it as a compatibility flag. -+ this.dir = this.externalFileAttributes & 0x0010 ? true : false; -+ -+ if(madeBy === MADE_BY_DOS) { -+ // first 6 bits (0 to 5) -+ this.dosPermissions = this.externalFileAttributes & 0x3F; -+ } -+ -+ if(madeBy === MADE_BY_UNIX) { -+ this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF; -+ // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8); -+ } -+ -+ // fail safe : if the name ends with a / it probably means a folder -+ if (!this.dir && this.fileName.slice(-1) === '/') { -+ this.dir = true; -+ } -+ }, -+ -+ /** -+ * Parse the ZIP64 extra field and merge the info in the current ZipEntry. -+ * @param {DataReader} reader the reader to use. -+ */ -+ parseZIP64ExtraField: function(reader) { -+ -+ if (!this.extraFields[0x0001]) { -+ return; -+ } -+ -+ // should be something, preparing the extra reader -+ var extraReader = new StringReader(this.extraFields[0x0001].value); -+ -+ // I really hope that these 64bits integer can fit in 32 bits integer, because js -+ // won't let us have more. -+ if (this.uncompressedSize === utils.MAX_VALUE_32BITS) { -+ this.uncompressedSize = extraReader.readInt(8); -+ } -+ if (this.compressedSize === utils.MAX_VALUE_32BITS) { -+ this.compressedSize = extraReader.readInt(8); -+ } -+ if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) { -+ this.localHeaderOffset = extraReader.readInt(8); -+ } -+ if (this.diskNumberStart === utils.MAX_VALUE_32BITS) { -+ this.diskNumberStart = extraReader.readInt(4); -+ } -+ }, -+ /** -+ * Read the central part of a zip file and add the info in this object. -+ * @param {DataReader} reader the reader to use. -+ */ -+ readExtraFields: function(reader) { -+ var start = reader.index, -+ extraFieldId, -+ extraFieldLength, -+ extraFieldValue; -+ -+ this.extraFields = this.extraFields || {}; -+ -+ while (reader.index < start + this.extraFieldsLength) { -+ extraFieldId = reader.readInt(2); -+ extraFieldLength = reader.readInt(2); -+ extraFieldValue = reader.readString(extraFieldLength); -+ -+ this.extraFields[extraFieldId] = { -+ id: extraFieldId, -+ length: extraFieldLength, -+ value: extraFieldValue -+ }; -+ } -+ }, -+ /** -+ * Apply an UTF8 transformation if needed. -+ */ -+ handleUTF8: function() { -+ if (this.useUTF8()) { -+ this.fileName = jszipProto.utf8decode(this.fileName); -+ this.fileComment = jszipProto.utf8decode(this.fileComment); -+ } else { -+ var upath = this.findExtraFieldUnicodePath(); -+ if (upath !== null) { -+ this.fileName = upath; -+ } -+ var ucomment = this.findExtraFieldUnicodeComment(); -+ if (ucomment !== null) { -+ this.fileComment = ucomment; -+ } -+ } -+ }, -+ -+ /** -+ * Find the unicode path declared in the extra field, if any. -+ * @return {String} the unicode path, null otherwise. -+ */ -+ findExtraFieldUnicodePath: function() { -+ var upathField = this.extraFields[0x7075]; -+ if (upathField) { -+ var extraReader = new StringReader(upathField.value); -+ -+ // wrong version -+ if (extraReader.readInt(1) !== 1) { -+ return null; -+ } -+ -+ // the crc of the filename changed, this field is out of date. -+ if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) { -+ return null; -+ } -+ -+ return jszipProto.utf8decode(extraReader.readString(upathField.length - 5)); -+ } -+ return null; -+ }, -+ -+ /** -+ * Find the unicode comment declared in the extra field, if any. -+ * @return {String} the unicode comment, null otherwise. -+ */ -+ findExtraFieldUnicodeComment: function() { -+ var ucommentField = this.extraFields[0x6375]; -+ if (ucommentField) { -+ var extraReader = new StringReader(ucommentField.value); -+ -+ // wrong version -+ if (extraReader.readInt(1) !== 1) { -+ return null; -+ } -+ -+ // the crc of the comment changed, this field is out of date. -+ if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) { -+ return null; -+ } -+ -+ return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5)); -+ } -+ return null; -+ } -+}; -+module.exports = ZipEntry; -+ -+}, -+"1155+ipL54hxeO4hRio3vGCe5AEFqyFQ9IQ27OTC2K8=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, INTERNAL, debug) { -+var util = require("./util"); -+var TimeoutError = Promise.TimeoutError; -+ -+function HandleWrapper(handle) { -+ this.handle = handle; -+} -+ -+HandleWrapper.prototype._resultCancelled = function() { -+ clearTimeout(this.handle); -+}; -+ -+var afterValue = function(value) { return delay(+this).thenReturn(value); }; -+var delay = Promise.delay = function (ms, value) { -+ var ret; -+ var handle; -+ if (value !== undefined) { -+ ret = Promise.resolve(value) -+ ._then(afterValue, null, null, ms, undefined); -+ if (debug.cancellation() && value instanceof Promise) { -+ ret._setOnCancel(value); -+ } -+ } else { -+ ret = new Promise(INTERNAL); -+ handle = setTimeout(function() { ret._fulfill(); }, +ms); -+ if (debug.cancellation()) { -+ ret._setOnCancel(new HandleWrapper(handle)); -+ } -+ ret._captureStackTrace(); -+ } -+ ret._setAsyncGuaranteed(); -+ return ret; -+}; -+ -+Promise.prototype.delay = function (ms) { -+ return delay(ms, this); -+}; -+ -+var afterTimeout = function (promise, message, parent) { -+ var err; -+ if (typeof message !== "string") { -+ if (message instanceof Error) { -+ err = message; -+ } else { -+ err = new TimeoutError("operation timed out"); -+ } -+ } else { -+ err = new TimeoutError(message); -+ } -+ util.markAsOriginatingFromRejection(err); -+ promise._attachExtraTrace(err); -+ promise._reject(err); -+ -+ if (parent != null) { -+ parent.cancel(); -+ } -+}; -+ -+function successClear(value) { -+ clearTimeout(this.handle); -+ return value; -+} -+ -+function failureClear(reason) { -+ clearTimeout(this.handle); -+ throw reason; -+} -+ -+Promise.prototype.timeout = function (ms, message) { -+ ms = +ms; -+ var ret, parent; -+ -+ var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { -+ if (ret.isPending()) { -+ afterTimeout(ret, message, parent); -+ } -+ }, ms)); -+ -+ if (debug.cancellation()) { -+ parent = this.then(); -+ ret = parent._then(successClear, failureClear, -+ undefined, handleWrapper, undefined); -+ ret._setOnCancel(handleWrapper); -+ } else { -+ ret = this._then(successClear, failureClear, -+ undefined, handleWrapper, undefined); -+ } -+ -+ return ret; -+}; -+ -+}; -+ -+}, -+"11luD3yAjygAqm+p36cjxVR6uWSrp9zZAUzr8pL2Z9E=": -+function (require, module, exports, __dirname, __filename) { -+//TODO: handle reviver/dehydrate function like normal -+//and handle indentation, like normal. -+//if anyone needs this... please send pull request. -+ -+exports.stringify = function stringify (o) { -+ if('undefined' == typeof o) return o -+ -+ if(o && Buffer.isBuffer(o)) -+ return JSON.stringify(':base64:' + o.toString('base64')) -+ -+ if(o && o.toJSON) -+ o = o.toJSON() -+ -+ if(o && 'object' === typeof o) { -+ var s = '' -+ var array = Array.isArray(o) -+ s = array ? '[' : '{' -+ var first = true -+ -+ for(var k in o) { -+ var ignore = 'function' == typeof o[k] || (!array && 'undefined' === typeof o[k]) -+ if(Object.hasOwnProperty.call(o, k) && !ignore) { -+ if(!first) -+ s += ',' -+ first = false -+ if (array) { -+ if(o[k] == undefined) -+ s += 'null' -+ else -+ s += stringify(o[k]) -+ } else if (o[k] !== void(0)) { -+ s += stringify(k) + ':' + stringify(o[k]) -+ } -+ } -+ } -+ -+ s += array ? ']' : '}' -+ -+ return s -+ } else if ('string' === typeof o) { -+ return JSON.stringify(/^:/.test(o) ? ':' + o : o) -+ } else if ('undefined' === typeof o) { -+ return 'null'; -+ } else -+ return JSON.stringify(o) -+} -+ -+exports.parse = function (s) { -+ return JSON.parse(s, function (key, value) { -+ if('string' === typeof value) { -+ if(/^:base64:/.test(value)) -+ return Buffer.from(value.substring(8), 'base64') -+ else -+ return /^:/.test(value) ? value.substring(1) : value -+ } -+ return value -+ }) -+} -+ -+}, -+"17T6fQV8jDz84CBgZM5yZjYbaNQAA5Hlzs92BrGADSk=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * is-data-descriptor -+ * -+ * Copyright (c) 2015-2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var typeOf = require('kind-of'); -+ -+module.exports = function isDataDescriptor(obj, prop) { -+ // data descriptor properties -+ var data = { -+ configurable: 'boolean', -+ enumerable: 'boolean', -+ writable: 'boolean' -+ }; -+ -+ if (typeOf(obj) !== 'object') { -+ return false; -+ } -+ -+ if (typeof prop === 'string') { -+ var val = Object.getOwnPropertyDescriptor(obj, prop); -+ return typeof val !== 'undefined'; -+ } -+ -+ if (!('value' in obj) && !('writable' in obj)) { -+ return false; -+ } -+ -+ for (var key in obj) { -+ if (key === 'value') continue; -+ -+ if (!data.hasOwnProperty(key)) { -+ continue; -+ } -+ -+ if (typeOf(obj[key]) === data[key]) { -+ continue; -+ } -+ -+ if (typeof obj[key] !== 'undefined') { -+ return false; -+ } -+ } -+ return true; -+}; -+ -+}, -+"1BDKStMFOGkNgRRPK2fwuS25BILTrqKik0RsVZUXzrI=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * array-unique -+ * -+ * Copyright (c) 2014-2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+module.exports = function unique(arr) { -+ if (!Array.isArray(arr)) { -+ throw new TypeError('array-unique expects an array.'); -+ } -+ -+ var len = arr.length; -+ var i = -1; -+ -+ while (i++ < len) { -+ var j = i + 1; -+ -+ for (; j < arr.length; ++j) { -+ if (arr[i] === arr[j]) { -+ arr.splice(j--, 1); -+ } -+ } -+ } -+ return arr; -+}; -+ -+module.exports.immutable = function uniqueImmutable(arr) { -+ if (!Array.isArray(arr)) { -+ throw new TypeError('array-unique expects an array.'); -+ } -+ -+ var arrLen = arr.length; -+ var newArr = new Array(arrLen); -+ -+ for (var i = 0; i < arrLen; i++) { -+ newArr[i] = arr[i]; -+ } -+ -+ return module.exports(newArr); -+}; -+ -+}, -+"1BYzukJqzKDkmkcd613wWuNJAwjKFaJT7mL3yu6o3vA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const http2 = require('http2'); -+const {Writable} = require('stream'); -+const {Agent, globalAgent} = require('./agent'); -+const IncomingMessage = require('./incoming-message'); -+const urlToOptions = require('./utils/url-to-options'); -+const proxyEvents = require('./utils/proxy-events'); -+const isRequestPseudoHeader = require('./utils/is-request-pseudo-header'); -+const { -+ ERR_INVALID_ARG_TYPE, -+ ERR_INVALID_PROTOCOL, -+ ERR_HTTP_HEADERS_SENT, -+ ERR_INVALID_HTTP_TOKEN, -+ ERR_HTTP_INVALID_HEADER_VALUE, -+ ERR_INVALID_CHAR -+} = require('./utils/errors'); -+ -+const { -+ HTTP2_HEADER_STATUS, -+ HTTP2_HEADER_METHOD, -+ HTTP2_HEADER_PATH, -+ HTTP2_METHOD_CONNECT -+} = http2.constants; -+ -+const kHeaders = Symbol('headers'); -+const kOrigin = Symbol('origin'); -+const kSession = Symbol('session'); -+const kOptions = Symbol('options'); -+const kFlushedHeaders = Symbol('flushedHeaders'); -+const kJobs = Symbol('jobs'); -+ -+const isValidHttpToken = /^[\^`\-\w!#$%&*+.|~]+$/; -+const isInvalidHeaderValue = /[^\t\u0020-\u007E\u0080-\u00FF]/; -+ -+class ClientRequest extends Writable { -+ constructor(input, options, callback) { -+ super({ -+ autoDestroy: false -+ }); -+ -+ const hasInput = typeof input === 'string' || input instanceof URL; -+ if (hasInput) { -+ input = urlToOptions(input instanceof URL ? input : new URL(input)); -+ } -+ -+ if (typeof options === 'function' || options === undefined) { -+ // (options, callback) -+ callback = options; -+ options = hasInput ? input : {...input}; -+ } else { -+ // (input, options, callback) -+ options = {...input, ...options}; -+ } -+ -+ if (options.h2session) { -+ this[kSession] = options.h2session; -+ } else if (options.agent === false) { -+ this.agent = new Agent({maxFreeSessions: 0}); -+ } else if (typeof options.agent === 'undefined' || options.agent === null) { -+ if (typeof options.createConnection === 'function') { -+ // This is a workaround - we don't have to create the session on our own. -+ this.agent = new Agent({maxFreeSessions: 0}); -+ this.agent.createConnection = options.createConnection; -+ } else { -+ this.agent = globalAgent; -+ } -+ } else if (typeof options.agent.request === 'function') { -+ this.agent = options.agent; -+ } else { -+ throw new ERR_INVALID_ARG_TYPE('options.agent', ['Agent-like Object', 'undefined', 'false'], options.agent); -+ } -+ -+ if (options.protocol && options.protocol !== 'https:') { -+ throw new ERR_INVALID_PROTOCOL(options.protocol, 'https:'); -+ } -+ -+ const port = options.port || options.defaultPort || (this.agent && this.agent.defaultPort) || 443; -+ const host = options.hostname || options.host || 'localhost'; -+ -+ // Don't enforce the origin via options. It may be changed in an Agent. -+ delete options.hostname; -+ delete options.host; -+ delete options.port; -+ -+ const {timeout} = options; -+ options.timeout = undefined; -+ -+ this[kHeaders] = Object.create(null); -+ this[kJobs] = []; -+ -+ this.socket = null; -+ this.connection = null; -+ -+ this.method = options.method || 'GET'; -+ this.path = options.path; -+ -+ this.res = null; -+ this.aborted = false; -+ this.reusedSocket = false; -+ -+ if (options.headers) { -+ for (const [header, value] of Object.entries(options.headers)) { -+ this.setHeader(header, value); -+ } -+ } -+ -+ if (options.auth && !('authorization' in this[kHeaders])) { -+ this[kHeaders].authorization = 'Basic ' + Buffer.from(options.auth).toString('base64'); -+ } -+ -+ options.session = options.tlsSession; -+ options.path = options.socketPath; -+ -+ this[kOptions] = options; -+ -+ // Clients that generate HTTP/2 requests directly SHOULD use the :authority pseudo-header field instead of the Host header field. -+ if (port === 443) { -+ this[kOrigin] = `https://${host}`; -+ -+ if (!(':authority' in this[kHeaders])) { -+ this[kHeaders][':authority'] = host; -+ } -+ } else { -+ this[kOrigin] = `https://${host}:${port}`; -+ -+ if (!(':authority' in this[kHeaders])) { -+ this[kHeaders][':authority'] = `${host}:${port}`; -+ } -+ } -+ -+ if (timeout) { -+ this.setTimeout(timeout); -+ } -+ -+ if (callback) { -+ this.once('response', callback); -+ } -+ -+ this[kFlushedHeaders] = false; -+ } -+ -+ get method() { -+ return this[kHeaders][HTTP2_HEADER_METHOD]; -+ } -+ -+ set method(value) { -+ if (value) { -+ this[kHeaders][HTTP2_HEADER_METHOD] = value.toUpperCase(); -+ } -+ } -+ -+ get path() { -+ return this[kHeaders][HTTP2_HEADER_PATH]; -+ } -+ -+ set path(value) { -+ if (value) { -+ this[kHeaders][HTTP2_HEADER_PATH] = value; -+ } -+ } -+ -+ get _mustNotHaveABody() { -+ return this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE'; -+ } -+ -+ _write(chunk, encoding, callback) { -+ // https://github.com/nodejs/node/blob/654df09ae0c5e17d1b52a900a545f0664d8c7627/lib/internal/http2/util.js#L148-L156 -+ if (this._mustNotHaveABody) { -+ callback(new Error('The GET, HEAD and DELETE methods must NOT have a body')); -+ /* istanbul ignore next: Node.js 12 throws directly */ -+ return; -+ } -+ -+ this.flushHeaders(); -+ -+ const callWrite = () => this._request.write(chunk, encoding, callback); -+ if (this._request) { -+ callWrite(); -+ } else { -+ this[kJobs].push(callWrite); -+ } -+ } -+ -+ _final(callback) { -+ if (this.destroyed) { -+ return; -+ } -+ -+ this.flushHeaders(); -+ -+ const callEnd = () => { -+ // For GET, HEAD and DELETE -+ if (this._mustNotHaveABody) { -+ callback(); -+ return; -+ } -+ -+ this._request.end(callback); -+ }; -+ -+ if (this._request) { -+ callEnd(); -+ } else { -+ this[kJobs].push(callEnd); -+ } -+ } -+ -+ abort() { -+ if (this.res && this.res.complete) { -+ return; -+ } -+ -+ if (!this.aborted) { -+ process.nextTick(() => this.emit('abort')); -+ } -+ -+ this.aborted = true; -+ -+ this.destroy(); -+ } -+ -+ _destroy(error, callback) { -+ if (this.res) { -+ this.res._dump(); -+ } -+ -+ if (this._request) { -+ this._request.destroy(); -+ } -+ -+ callback(error); -+ } -+ -+ async flushHeaders() { -+ if (this[kFlushedHeaders] || this.destroyed) { -+ return; -+ } -+ -+ this[kFlushedHeaders] = true; -+ -+ const isConnectMethod = this.method === HTTP2_METHOD_CONNECT; -+ -+ // The real magic is here -+ const onStream = stream => { -+ this._request = stream; -+ -+ if (this.destroyed) { -+ stream.destroy(); -+ return; -+ } -+ -+ // Forwards `timeout`, `continue`, `close` and `error` events to this instance. -+ if (!isConnectMethod) { -+ proxyEvents(stream, this, ['timeout', 'continue', 'close', 'error']); -+ } -+ -+ // Wait for the `finish` event. We don't want to emit the `response` event -+ // before `request.end()` is called. -+ const waitForEnd = fn => { -+ return (...args) => { -+ if (!this.writable && !this.destroyed) { -+ fn(...args); -+ } else { -+ this.once('finish', () => { -+ fn(...args); -+ }); -+ } -+ }; -+ }; -+ -+ // This event tells we are ready to listen for the data. -+ stream.once('response', waitForEnd((headers, flags, rawHeaders) => { -+ // If we were to emit raw request stream, it would be as fast as the native approach. -+ // Note that wrapping the raw stream in a Proxy instance won't improve the performance (already tested it). -+ const response = new IncomingMessage(this.socket, stream.readableHighWaterMark); -+ this.res = response; -+ -+ response.req = this; -+ response.statusCode = headers[HTTP2_HEADER_STATUS]; -+ response.headers = headers; -+ response.rawHeaders = rawHeaders; -+ -+ response.once('end', () => { -+ if (this.aborted) { -+ response.aborted = true; -+ response.emit('aborted'); -+ } else { -+ response.complete = true; -+ -+ // Has no effect, just be consistent with the Node.js behavior -+ response.socket = null; -+ response.connection = null; -+ } -+ }); -+ -+ if (isConnectMethod) { -+ response.upgrade = true; -+ -+ // The HTTP1 API says the socket is detached here, -+ // but we can't do that so we pass the original HTTP2 request. -+ if (this.emit('connect', response, stream, Buffer.alloc(0))) { -+ this.emit('close'); -+ } else { -+ // No listeners attached, destroy the original request. -+ stream.destroy(); -+ } -+ } else { -+ // Forwards data -+ stream.on('data', chunk => { -+ if (!response._dumped && !response.push(chunk)) { -+ stream.pause(); -+ } -+ }); -+ -+ stream.once('end', () => { -+ response.push(null); -+ }); -+ -+ if (!this.emit('response', response)) { -+ // No listeners attached, dump the response. -+ response._dump(); -+ } -+ } -+ })); -+ -+ // Emits `information` event -+ stream.once('headers', waitForEnd( -+ headers => this.emit('information', {statusCode: headers[HTTP2_HEADER_STATUS]}) -+ )); -+ -+ stream.once('trailers', waitForEnd((trailers, flags, rawTrailers) => { -+ const {res} = this; -+ -+ // Assigns trailers to the response object. -+ res.trailers = trailers; -+ res.rawTrailers = rawTrailers; -+ })); -+ -+ const {socket} = stream.session; -+ this.socket = socket; -+ this.connection = socket; -+ -+ for (const job of this[kJobs]) { -+ job(); -+ } -+ -+ this.emit('socket', this.socket); -+ }; -+ -+ // Makes a HTTP2 request -+ if (this[kSession]) { -+ try { -+ onStream(this[kSession].request(this[kHeaders])); -+ } catch (error) { -+ this.emit('error', error); -+ } -+ } else { -+ this.reusedSocket = true; -+ -+ try { -+ onStream(await this.agent.request(this[kOrigin], this[kOptions], this[kHeaders])); -+ } catch (error) { -+ this.emit('error', error); -+ } -+ } -+ } -+ -+ getHeader(name) { -+ if (typeof name !== 'string') { -+ throw new ERR_INVALID_ARG_TYPE('name', 'string', name); -+ } -+ -+ return this[kHeaders][name.toLowerCase()]; -+ } -+ -+ get headersSent() { -+ return this[kFlushedHeaders]; -+ } -+ -+ removeHeader(name) { -+ if (typeof name !== 'string') { -+ throw new ERR_INVALID_ARG_TYPE('name', 'string', name); -+ } -+ -+ if (this.headersSent) { -+ throw new ERR_HTTP_HEADERS_SENT('remove'); -+ } -+ -+ delete this[kHeaders][name.toLowerCase()]; -+ } -+ -+ setHeader(name, value) { -+ if (this.headersSent) { -+ throw new ERR_HTTP_HEADERS_SENT('set'); -+ } -+ -+ if (typeof name !== 'string' || (!isValidHttpToken.test(name) && !isRequestPseudoHeader(name))) { -+ throw new ERR_INVALID_HTTP_TOKEN('Header name', name); -+ } -+ -+ if (typeof value === 'undefined') { -+ throw new ERR_HTTP_INVALID_HEADER_VALUE(value, name); -+ } -+ -+ if (isInvalidHeaderValue.test(value)) { -+ throw new ERR_INVALID_CHAR('header content', name); -+ } -+ -+ this[kHeaders][name.toLowerCase()] = value; -+ } -+ -+ setNoDelay() { -+ // HTTP2 sockets cannot be malformed, do nothing. -+ } -+ -+ setSocketKeepAlive() { -+ // HTTP2 sockets cannot be malformed, do nothing. -+ } -+ -+ setTimeout(ms, callback) { -+ const applyTimeout = () => this._request.setTimeout(ms, callback); -+ -+ if (this._request) { -+ applyTimeout(); -+ } else { -+ this[kJobs].push(applyTimeout); -+ } -+ -+ return this; -+ } -+ -+ get maxHeadersCount() { -+ if (!this.destroyed && this._request) { -+ return this._request.session.localSettings.maxHeaderListSize; -+ } -+ -+ return undefined; -+ } -+ -+ set maxHeadersCount(_value) { -+ // Updating HTTP2 settings would affect all requests, do nothing. -+ } -+} -+ -+module.exports = ClientRequest; -+ -+}, -+"1C4WLBh91IcDbCZPsKptIq+jdRVwRu1ab83vV39Vn98=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * pascalcase -+ * -+ * Copyright (c) 2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+function pascalcase(str) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string.'); -+ } -+ str = str.replace(/([A-Z])/g, ' $1'); -+ if (str.length === 1) { return str.toUpperCase(); } -+ str = str.replace(/^[\W_]+|[\W_]+$/g, '').toLowerCase(); -+ str = str.charAt(0).toUpperCase() + str.slice(1); -+ return str.replace(/[\W_]+(\w|$)/g, function (_, ch) { -+ return ch.toUpperCase(); -+ }); -+} -+ -+module.exports = pascalcase; -+ -+}, -+"1DqoH1vIn6o1ng+XyBS6JRVVkf8Hj7ub/UD4x8loMjA=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+ -+}, -+"1J0swLA60ltmkf6zko8jG/eN+xGHoOzW+aUkbmEJc+Y=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+var UTF8_ACCEPT = 12 -+var UTF8_REJECT = 0 -+var UTF8_DATA = [ -+ // The first part of the table maps bytes to character to a transition. -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -+ 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -+ 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7, -+ 10, 9, 9, 9, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -+ -+ // The second part of the table maps a state to a new state when adding a -+ // transition. -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 12, 0, 0, 0, 0, 24, 36, 48, 60, 72, 84, 96, -+ 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ -+ // The third part maps the current transition to a mask that needs to apply -+ // to the byte. -+ 0x7F, 0x3F, 0x3F, 0x3F, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07 -+] -+ -+function decodeURIComponent (uri) { -+ var percentPosition = uri.indexOf('%') -+ if (percentPosition === -1) return uri -+ -+ var length = uri.length -+ var decoded = '' -+ var last = 0 -+ var codepoint = 0 -+ var startOfOctets = percentPosition -+ var state = UTF8_ACCEPT -+ -+ while (percentPosition > -1 && percentPosition < length) { -+ var high = hexCodeToInt(uri[percentPosition + 1], 4) -+ var low = hexCodeToInt(uri[percentPosition + 2], 0) -+ var byte = high | low -+ var type = UTF8_DATA[byte] -+ state = UTF8_DATA[256 + state + type] -+ codepoint = (codepoint << 6) | (byte & UTF8_DATA[364 + type]) -+ -+ if (state === UTF8_ACCEPT) { -+ decoded += uri.slice(last, startOfOctets) -+ -+ decoded += (codepoint <= 0xFFFF) -+ ? String.fromCharCode(codepoint) -+ : String.fromCharCode( -+ (0xD7C0 + (codepoint >> 10)), -+ (0xDC00 + (codepoint & 0x3FF)) -+ ) -+ -+ codepoint = 0 -+ last = percentPosition + 3 -+ percentPosition = startOfOctets = uri.indexOf('%', last) -+ } else if (state === UTF8_REJECT) { -+ return null -+ } else { -+ percentPosition += 3 -+ if (percentPosition < length && uri.charCodeAt(percentPosition) === 37) continue -+ return null -+ } -+ } -+ -+ return decoded + uri.slice(last) -+} -+ -+var HEX = { -+ '0': 0, -+ '1': 1, -+ '2': 2, -+ '3': 3, -+ '4': 4, -+ '5': 5, -+ '6': 6, -+ '7': 7, -+ '8': 8, -+ '9': 9, -+ 'a': 10, -+ 'A': 10, -+ 'b': 11, -+ 'B': 11, -+ 'c': 12, -+ 'C': 12, -+ 'd': 13, -+ 'D': 13, -+ 'e': 14, -+ 'E': 14, -+ 'f': 15, -+ 'F': 15 -+} -+ -+function hexCodeToInt (c, shift) { -+ var i = HEX[c] -+ return i === undefined ? 255 : i << shift -+} -+ -+module.exports = decodeURIComponent -+ -+}, -+"1Vpk+cwIn8CvDZPBgZSEXpP05jqnHCtUA2uIPujfnJM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+/* istanbul ignore file: deprecated */ -+const url_1 = require("url"); -+const keys = [ -+ 'protocol', -+ 'host', -+ 'hostname', -+ 'port', -+ 'pathname', -+ 'search' -+]; -+exports.default = (origin, options) => { -+ var _a, _b; -+ if (options.path) { -+ if (options.pathname) { -+ throw new TypeError('Parameters `path` and `pathname` are mutually exclusive.'); -+ } -+ if (options.search) { -+ throw new TypeError('Parameters `path` and `search` are mutually exclusive.'); -+ } -+ if (options.searchParams) { -+ throw new TypeError('Parameters `path` and `searchParams` are mutually exclusive.'); -+ } -+ } -+ if (options.search && options.searchParams) { -+ throw new TypeError('Parameters `search` and `searchParams` are mutually exclusive.'); -+ } -+ if (!origin) { -+ if (!options.protocol) { -+ throw new TypeError('No URL protocol specified'); -+ } -+ origin = `${options.protocol}//${(_b = (_a = options.hostname) !== null && _a !== void 0 ? _a : options.host) !== null && _b !== void 0 ? _b : ''}`; -+ } -+ const url = new url_1.URL(origin); -+ if (options.path) { -+ const searchIndex = options.path.indexOf('?'); -+ if (searchIndex === -1) { -+ options.pathname = options.path; -+ } -+ else { -+ options.pathname = options.path.slice(0, searchIndex); -+ options.search = options.path.slice(searchIndex + 1); -+ } -+ delete options.path; -+ } -+ for (const key of keys) { -+ if (options[key]) { -+ url[key] = options[key].toString(); -+ } -+ } -+ return url; -+}; -+ -+}, -+"1YryHLBRiGTQxQV0LRr3HlteHxQvTA8nNTqg9DGmFtQ=": -+function (require, module, exports, __dirname, __filename) { -+/* eslint-disable node/no-deprecated-api */ -+var buffer = require('buffer') -+var Buffer = buffer.Buffer -+ -+// alternative to using Object.keys for old browsers -+function copyProps (src, dst) { -+ for (var key in src) { -+ dst[key] = src[key] -+ } -+} -+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { -+ module.exports = buffer -+} else { -+ // Copy properties from require('buffer') -+ copyProps(buffer, exports) -+ exports.Buffer = SafeBuffer -+} -+ -+function SafeBuffer (arg, encodingOrOffset, length) { -+ return Buffer(arg, encodingOrOffset, length) -+} -+ -+// Copy static methods from Buffer -+copyProps(Buffer, SafeBuffer) -+ -+SafeBuffer.from = function (arg, encodingOrOffset, length) { -+ if (typeof arg === 'number') { -+ throw new TypeError('Argument must not be a number') -+ } -+ return Buffer(arg, encodingOrOffset, length) -+} -+ -+SafeBuffer.alloc = function (size, fill, encoding) { -+ if (typeof size !== 'number') { -+ throw new TypeError('Argument must be a number') -+ } -+ var buf = Buffer(size) -+ if (fill !== undefined) { -+ if (typeof encoding === 'string') { -+ buf.fill(fill, encoding) -+ } else { -+ buf.fill(fill) -+ } -+ } else { -+ buf.fill(0) -+ } -+ return buf -+} -+ -+SafeBuffer.allocUnsafe = function (size) { -+ if (typeof size !== 'number') { -+ throw new TypeError('Argument must be a number') -+ } -+ return Buffer(size) -+} -+ -+SafeBuffer.allocUnsafeSlow = function (size) { -+ if (typeof size !== 'number') { -+ throw new TypeError('Argument must be a number') -+ } -+ return buffer.SlowBuffer(size) -+} -+ -+}, -+"1drV+VycX0j4ypVs27knqvx7Vrqr/KjAsEA9ksXr62c=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const format_1 = require("./format"); -+const format = [format_1.default]; -+exports.default = format; -+//# sourceMappingURL=index.js.map -+}, -+"1ezvgupqhEwRalMylP1e8AmrEQVsTYOzIMt6JCnFH2k=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('inherits') -+var abstract = require('abstract-leveldown') -+var wrap = require('level-option-wrap') -+var reachdown = require('reachdown') -+var matchdown = require('./matchdown') -+ -+var rangeOptions = 'start end gt gte lt lte'.split(' ') -+var defaultClear = abstract.AbstractLevelDOWN.prototype._clear -+var hasOwnProperty = Object.prototype.hasOwnProperty -+var END = Buffer.from([0xff]) -+ -+function concat (prefix, key, force) { -+ if (typeof key === 'string' && (force || key.length)) return prefix + key -+ if (Buffer.isBuffer(key) && (force || key.length)) { -+ return Buffer.concat([Buffer.from(prefix), key]) -+ } -+ return key -+} -+ -+function SubIterator (db, ite, prefix) { -+ this.iterator = ite -+ this.prefix = prefix -+ -+ abstract.AbstractIterator.call(this, db) -+} -+ -+inherits(SubIterator, abstract.AbstractIterator) -+ -+SubIterator.prototype._next = function (cb) { -+ var self = this -+ this.iterator.next(function (err, key, value) { -+ if (err) return cb(err) -+ if (key) key = key.slice(self.prefix.length) -+ cb.apply(null, arguments) -+ }) -+} -+ -+SubIterator.prototype._seek = function (key) { -+ this.iterator.seek(concat(this.prefix, key)) -+} -+ -+SubIterator.prototype._end = function (cb) { -+ this.iterator.end(cb) -+} -+ -+function SubDown (db, prefix, opts) { -+ if (!(this instanceof SubDown)) return new SubDown(db, prefix, opts) -+ if (typeof opts === 'string') opts = { separator: opts } -+ if (!opts) opts = {} -+ -+ var separator = opts.separator -+ -+ if (!prefix) prefix = '' -+ if (!separator) separator = '!' -+ if (prefix[0] === separator) prefix = prefix.slice(1) -+ if (prefix[prefix.length - 1] === separator) prefix = prefix.slice(0, -1) -+ -+ this.db = db -+ this.leveldown = null -+ this.ownPrefix = separator + prefix + separator -+ this.prefix = this.ownPrefix -+ this._beforeOpen = opts.open -+ -+ var self = this -+ -+ this._wrap = { -+ gt: function (x) { -+ return concat(self.prefix, x || '', true) -+ }, -+ lt: function (x) { -+ if (Buffer.isBuffer(x) && !x.length) x = END -+ return concat(self.prefix, x || '\xff') -+ } -+ } -+ -+ abstract.AbstractLevelDOWN.call(this) -+} -+ -+inherits(SubDown, abstract.AbstractLevelDOWN) -+ -+SubDown.prototype.type = 'subleveldown' -+ -+SubDown.prototype._open = function (opts, cb) { -+ var self = this -+ -+ this.db.open(function (err) { -+ if (err) return cb(err) -+ -+ var subdb = reachdown(self.db, 'subleveldown') -+ -+ if (subdb && subdb.prefix) { -+ self.prefix = subdb.prefix + self.ownPrefix -+ self.leveldown = subdb.leveldown -+ } else { -+ self.leveldown = reachdown(self.db, matchdown, false) -+ } -+ -+ if (self._beforeOpen) self._beforeOpen(cb) -+ else cb() -+ }) -+} -+ -+SubDown.prototype._close = function (cb) { -+ this.leveldown.close(cb) -+} -+ -+SubDown.prototype._serializeKey = function (key) { -+ return Buffer.isBuffer(key) ? key : String(key) -+} -+ -+SubDown.prototype._put = function (key, value, opts, cb) { -+ this.leveldown.put(concat(this.prefix, key), value, opts, cb) -+} -+ -+SubDown.prototype._get = function (key, opts, cb) { -+ this.leveldown.get(concat(this.prefix, key), opts, cb) -+} -+ -+SubDown.prototype._del = function (key, opts, cb) { -+ this.leveldown.del(concat(this.prefix, key), opts, cb) -+} -+ -+SubDown.prototype._batch = function (operations, opts, cb) { -+ // No need to make a copy of the array, abstract-leveldown does that -+ for (var i = 0; i < operations.length; i++) { -+ operations[i].key = concat(this.prefix, operations[i].key) -+ } -+ -+ this.leveldown.batch(operations, opts, cb) -+} -+ -+SubDown.prototype._clear = function (opts, cb) { -+ if (typeof this.leveldown.clear === 'function') { -+ // Prefer optimized implementation of clear() -+ opts = addRestOptions(wrap(opts, this._wrap), opts) -+ this.leveldown.clear(opts, cb) -+ } else { -+ // Fall back to iterator-based implementation -+ defaultClear.call(this, opts, cb) -+ } -+} -+ -+function addRestOptions (target, opts) { -+ for (var k in opts) { -+ if (hasOwnProperty.call(opts, k) && !isRangeOption(k)) { -+ target[k] = opts[k] -+ } -+ } -+ -+ return target -+} -+ -+function isRangeOption (k) { -+ return rangeOptions.indexOf(k) !== -1 -+} -+ -+// TODO (refactor): use addRestOptions instead -+function extend (xopts, opts) { -+ xopts.keys = opts.keys -+ xopts.values = opts.values -+ xopts.createIfMissing = opts.createIfMissing -+ xopts.errorIfExists = opts.errorIfExists -+ xopts.keyEncoding = opts.keyEncoding -+ xopts.valueEncoding = opts.valueEncoding -+ xopts.compression = opts.compression -+ xopts.db = opts.db -+ xopts.limit = opts.limit -+ xopts.keyAsBuffer = opts.keyAsBuffer -+ xopts.valueAsBuffer = opts.valueAsBuffer -+ xopts.reverse = opts.reverse -+ xopts.fillCache = opts.fillCache -+ return xopts -+} -+ -+function fixRange (opts) { -+ return (!opts.reverse || (!opts.end && !opts.start)) ? opts : { start: opts.end, end: opts.start } -+} -+ -+SubDown.prototype._iterator = function (opts) { -+ var xopts = extend(wrap(fixRange(opts), this._wrap), opts) -+ return new SubIterator(this, this.leveldown.iterator(xopts), this.prefix) -+} -+ -+module.exports = SubDown -+ -+}, -+"1gtpeU4glLKu81q77V0XueFLQaT+8q1aONpOIXHRxJ8=": -+function (require, module, exports, __dirname, __filename) { -+const parse = require('./parse') -+const valid = (version, options) => { -+ const v = parse(version, options) -+ return v ? v.version : null -+} -+module.exports = valid -+ -+}, -+"1k3xkOg/715JdFq+Dfmb4XzQFspieRMhUT3D2b/uPQw=": -+function (require, module, exports, __dirname, __filename) { -+var tick = 1 -+var maxTick = 65535 -+var resolution = 4 -+var inc = function () { -+ tick = (tick + 1) & maxTick -+} -+ -+var timer = setInterval(inc, (1000 / resolution) | 0) -+if (timer.unref) timer.unref() -+ -+module.exports = function (seconds) { -+ var size = resolution * (seconds || 5) -+ var buffer = [0] -+ var pointer = 1 -+ var last = (tick - 1) & maxTick -+ -+ return function (delta) { -+ var dist = (tick - last) & maxTick -+ if (dist > size) dist = size -+ last = tick -+ -+ while (dist--) { -+ if (pointer === size) pointer = 0 -+ buffer[pointer] = buffer[pointer === 0 ? size - 1 : pointer - 1] -+ pointer++ -+ } -+ -+ if (delta) buffer[pointer - 1] += delta -+ -+ var top = buffer[pointer - 1] -+ var btm = buffer.length < size ? 0 : buffer[pointer === size ? 0 : pointer] -+ -+ return buffer.length < resolution ? top : (top - btm) * resolution / buffer.length -+ } -+} -+ -+}, -+"1pOIV8+KlUFClrag3fUK2wDQMI478ANWhW3DdsEIwLI=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = Osm -+ -+var sub = require('subleveldown') -+var utils = require('./lib/utils') -+var once = require('once') -+var uniq = require('uniq') -+var EventEmitter = require('events').EventEmitter -+var through = require('through2') -+var pumpify = require('pumpify') -+ -+var umkv = require('unordered-materialized-kv') -+var checkElement = require('./lib/check-element') -+var createRefsIndex = require('./lib/refs-index.js') -+var createChangesetIndex = require('./lib/changeset-index.js') -+var createTypesIndex = require('./lib/types-index.js') -+var createKvIndex = require('./lib/kv-index.js') -+var createBkdIndex = require('./lib/bkd-index.js') -+var createHistoryIndex = require('./lib/history-index.js') -+ -+function Osm (opts) { -+ if (!(this instanceof Osm)) return new Osm(opts) -+ if (!opts.core) throw new Error('missing param "core"') -+ if (!opts.index) throw new Error('missing param "index"') -+ if (!opts.storage) throw new Error('missing param "storage"') -+ -+ var self = this -+ -+ this.core = opts.core -+ this.core.on('error', function (err) { -+ self.emit('error', err) -+ }) -+ this.index = opts.index -+ -+ this.writer = null -+ this.readyFns = [] -+ this.core.writer('default', function (err, writer) { -+ if (err) return self.emit('error', err) -+ self.writer = writer -+ self.readyFns.forEach(function (fn) { fn() }) -+ self.readyFns = [] -+ }) -+ -+ // Create indexes -+ var kv = umkv(sub(this.index, 'kvu')) -+ var bkd = createBkdIndex(this.core, sub(this.index, 'bkd'), kv, opts.storage) -+ this.core.use('kv', 2, createKvIndex(kv, sub(this.index, 'kvi'))) -+ this.core.use('refs', 2, createRefsIndex(sub(this.index, 'refs'))) -+ this.core.use('changeset', 2, createChangesetIndex(sub(this.index, 'ch'))) -+ this.core.use('geo', 2, bkd) -+ this.core.use('history', 2, createHistoryIndex(this, sub(this.index, 'h'))) -+ this.core.use('types', 2, createTypesIndex(sub(this.index, 't'))) -+} -+Osm.prototype = Object.create(EventEmitter.prototype) -+ -+// Is the log ready for writing? -+Osm.prototype._ready = function (cb) { -+ if (this.writer) cb() -+ else this.readyFns.push(cb) -+} -+ -+Osm.prototype.ready = function (cb) { -+ // TODO: one day we'll have a readonly mode! -+ if (!this.writer) { -+ this.readyFns.push(cb) -+ return -+ } -+ this.core.ready(cb) -+} -+ -+// OsmElement -> Error -+Osm.prototype.create = function (element, cb) { -+ // Generate unique ID for element -+ var id = utils.generateId() -+ -+ this.put(id, element, cb) -+} -+ -+// OsmId -> [OsmElement] -+Osm.prototype.get = function (id, cb) { -+ var self = this -+ -+ var elms = [] -+ var error -+ var pending = 0 -+ -+ this.core.api.kv.get(id, function (err, versions) { -+ if (err) return cb(err) -+ versions = versions || [] -+ pending = versions.length + 1 -+ -+ for (var i = 0; i < versions.length; i++) { -+ self.getByVersion(versions[i], done) -+ } -+ done() -+ }) -+ -+ function done (err, elm) { -+ if (err) error = err -+ if (elm) elms.push(elm) -+ if (--pending) return -+ if (error) cb(error) -+ else cb(null, elms) -+ } -+} -+ -+// String -> [Message] -+Osm.prototype._getByVersion = function (version, cb) { -+ var key = version.split('@')[0] -+ var seq = version.split('@')[1] -+ var feed = this.core._logs.feed(key) -+ if (feed) { -+ feed.get(seq, { wait:false }, cb) -+ } else { -+ process.nextTick(cb, null, null) -+ } -+} -+ -+// OsmVersion -> [OsmElement] -+Osm.prototype.getByVersion = function (version, opts, cb) { -+ if (typeof opts === 'function' && !cb) { -+ cb = opts -+ opts = {} -+ } -+ -+ this._getByVersion(version, function (err, doc) { -+ if (err) return cb(err) -+ if (!doc) return cb(null, null) -+ doc = Object.assign({}, doc, { version: version, deviceId: versionToDeviceId(version) }) -+ cb(null, doc) -+ }) -+} -+ -+// OsmId, OsmElement -> OsmElement -+Osm.prototype.put = function (id, element, opts, cb) { -+ if (opts && !cb && typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ opts = opts || {} -+ -+ var self = this -+ -+ // Check for type errors -+ var errs = checkElement(element, 'put') -+ if (errs.length) return cb(errs[0]) -+ -+ var doc = Object.assign({}, element, { id: id, timestamp: new Date().toISOString() }) -+ -+ // set links -+ if (opts.links) { -+ doc.links = opts.links -+ write() -+ } else { -+ self.core.api.kv.get(id, function (err, versions) { -+ if (err) return cb(err) -+ doc.links = versions -+ write() -+ }) -+ } -+ -+ // write to the feed -+ function write () { -+ self._ready(function () { -+ self.writer.append(doc, function (err) { -+ if (err) return cb(err) -+ var version = self.writer.key.toString('hex') + -+ '@' + (self.writer.length - 1) -+ var elm = Object.assign({}, doc, { -+ version: version, -+ deviceId: versionToDeviceId(version), -+ id: id, -+ links: doc.links || [] -+ }) -+ cb(null, elm) -+ }) -+ }) -+ } -+} -+ -+// OsmId, OsmElement -> OsmElement -+Osm.prototype.del = function (id, element, opts, cb) { -+ if (opts && !cb && typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ opts = opts || {} -+ -+ var self = this -+ -+ // Check for type errors -+ var errs = checkElement(element, 'del') -+ if (errs.length) return cb(errs[0]) -+ -+ getLinks(function (err, links) { -+ if (err) return cb(err) -+ getElms(links, function (err, elms) { -+ if (err) return cb(err) -+ if (!elms.length) return cb(new Error('no elements exist with id ' + id)) -+ var refs = self._mergeElementRefsAndMembers(elms) -+ var doc = Object.assign({}, element, { id: id, deleted: true, type: elms[0].type, links: links }) -+ if (refs.refs) doc.refs = refs.refs -+ else if (refs.members) doc.members = refs.members -+ write(doc, cb) -+ }) -+ }) -+ -+ // Get links -+ function getLinks (cb) { -+ if (opts.links) { -+ cb(null, opts.links) -+ } else { -+ self.core.api.kv.get(id, function (err, versions) { -+ if (err) return cb(err) -+ cb(null, versions) -+ }) -+ } -+ } -+ -+ function getElms (links, cb) { -+ if (!links.length) return cb(null, []) -+ -+ var res = [] -+ var error -+ var pending = links.length -+ for (var i = 0; i < links.length; i++) { -+ self.getByVersion(links[i], onElm) -+ } -+ -+ function onElm (err, elm) { -+ if (err) error = err -+ else res.push(elm) -+ if (--pending) return -+ if (error) return cb(error) -+ cb(null, res) -+ } -+ } -+ -+ // write to the feed -+ function write (doc, cb) { -+ self._ready(function () { -+ doc.id = id -+ self.writer.append(doc, function (err) { -+ if (err) return cb(err) -+ var version = self.writer.key.toString('hex') + -+ '@' + (self.writer.length - 1) -+ var elm = Object.assign({}, element, { id: id, version: version }) -+ cb(null, elm) -+ }) -+ }) -+ } -+} -+ -+// TODO: should element validation happen on batch jobs? -+Osm.prototype.batch = function (ops, cb) { -+ if (!ops || !ops.length) return cb() -+ -+ var self = this -+ cb = once(cb) -+ -+ populateWayRelationRefs(function (err) { -+ if (err) return cb(err) -+ populateMissingLinks(function (err) { -+ if (err) return cb(err) -+ writeData(cb) -+ }) -+ }) -+ -+ // First, populate way & relation deletions with correct refs/members. -+ function populateWayRelationRefs (cb) { -+ var pending = 0 -+ var error -+ for (var i = 0; i < ops.length; i++) { -+ if (ops[i].type === 'del') { -+ pending++ -+ updateRefs(ops[i].id, ops[i].value.links || [], ops[i].value, function (err) { -+ if (err) error = err -+ if (!--pending) cb(error) -+ }) -+ } -+ } -+ if (!pending) cb() -+ } -+ -+ function populateMissingLinks (cb) { -+ var pending = 1 -+ for (var i = 0; i < ops.length; i++) { -+ if (!ops[i].id) { -+ ops[i].id = utils.generateId() -+ ops[i].value.links = [] -+ } else if (!ops[i].value.links) { -+ pending++ -+ ;(function get (op) { -+ self.core.api.kv.get(op.id, function (err, versions) { -+ op.value.links = versions || [] -+ if (!--pending) cb(err) -+ }) -+ })(ops[i]) -+ } -+ } -+ if (!--pending) cb() -+ } -+ -+ function writeData (cb) { -+ var batch = ops.map(osmOpToMsg) -+ -+ self._ready(function () { -+ var key = self.writer.key.toString('hex') -+ var startSeq = self.writer.length -+ self.writer.append(batch, function (err) { -+ if (err) return cb(err) -+ var res = batch.map(function (doc, n) { -+ var version = key + '@' + (startSeq + n) -+ return Object.assign({}, doc, { -+ id: doc.id, -+ version: version, -+ deviceId: versionToDeviceId(version) -+ }) -+ }) -+ cb(null, res) -+ }) -+ }) -+ } -+ -+ function updateRefs (id, links, elm, cb) { -+ if (links) self._getRefsMembersByVersions(links, done) -+ else self._getRefsMembersById(id, done) -+ -+ function done (err, res) { -+ if (err) return cb(err) -+ if (res.refs) elm.refs = res.refs -+ else if (res.members) elm.members = res.members -+ cb() -+ } -+ } -+ -+ function osmOpToMsg (op) { -+ if (op.type === 'put') { -+ return Object.assign({}, op.value, { id: op.id }) -+ } else if (op.type === 'del') { -+ return Object.assign({}, op.value, { id: op.id, deleted: true }) -+ } else { -+ cb(new Error('unknown type')) -+ } -+ } -+} -+ -+// Id -> { id, version } -+Osm.prototype.getChanges = function (id, cb) { -+ var self = this -+ this.core.api.changeset.ready(function () { -+ self.core.api.changeset.get(id, cb) -+ }) -+} -+ -+// Id -> { id, version } -+Osm.prototype.refs = function (id, cb) { -+ var self = this -+ this.core.api.refs.ready(function () { -+ self.core.api.refs.get(id, cb) -+ }) -+} -+ -+Osm.prototype.byType = function (type, opts) { -+ opts = opts || {} -+ var self = this -+ -+ var fetch = through.obj(function (row, _, next) { -+ self._getByVersion(row.version, function (err, elm) { -+ if (err) return next(err) -+ if (!elm) return next() -+ var res = Object.assign(elm, { -+ version: row.version, -+ deviceId: versionToDeviceId(row.version), -+ id: row.id -+ }) -+ next(null, res) -+ }) -+ }) -+ -+ var ropts = {} -+ if (opts.limit) ropts.limit = opts.limit -+ -+ return pumpify.obj(this.core.api.types.createReadStream(type, ropts), fetch) -+} -+ -+// BoundingBox -> (Stream or Callback) -+Osm.prototype.query = function (bbox, opts, cb) { -+ if (opts && !cb && typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ opts = opts || {} -+ -+ var filter = through.obj(function (row, _, next) { -+ if (!row || !row.type) return next() -+ if (!opts.observations) { -+ var type = row.type -+ if (type !== 'node' && type !== 'way' && type !== 'relation') return next() -+ } -+ next(null, row) -+ }) -+ -+ var stream = this.core.api.geo.query(bbox, opts, cb) -+ if (stream instanceof Error) return process.nextTick(stream) -+ var res = pumpify.obj(stream, filter) -+ -+ return res -+} -+ -+Osm.prototype.createReplicationStream = function (opts) { -+ return this.core.replicate(opts) -+} -+Osm.prototype.replicate = Osm.prototype.createReplicationStream -+ -+// OsmId -> {refs: [OsmId]} | {members: [OsmId]} | {} -+Osm.prototype._mergeElementRefsAndMembers = function (elms) { -+ var res = {} -+ for (var i = 0; i < elms.length; i++) { -+ var elm = elms[i] -+ if (elm.refs) { -+ res.refs = res.refs || [] -+ mergeRefs(res.refs, elm.refs) -+ } else if (elm.members) { -+ res.members = res.members || [] -+ mergeMembers(res.members, elm.members) -+ } -+ } -+ return res -+ -+ function mergeRefs (into, from) { -+ into.push.apply(into, from) -+ return uniq(into) -+ } -+ -+ function mergeMembers (into, from) { -+ into.push.apply(into, from) -+ return uniq(into, memberCmp) -+ } -+ -+ function memberCmp (a, b) { -+ return a.id === b.id ? 0 : -1 -+ } -+} -+ -+// OsmId -> {refs: [OsmId]} | {members: [OsmId]} | {} -+Osm.prototype._getRefsMembersById = function (id, cb) { -+ var self = this -+ this.get(id, function (err, elms) { -+ if (err || !elms || !elms.length) return cb(err, {}) -+ var res = self._mergeElementRefsAndMembers(elms) -+ cb(null, res) -+ }) -+} -+ -+// [OsmVersion] -> {refs: [OsmId]} | {members: [OsmId]} | {} -+Osm.prototype._getRefsMembersByVersions = function (versions, cb) { -+ var self = this -+ if (!versions.length) return process.nextTick(cb, null, []) -+ -+ var elms = [] -+ var error -+ var pending = versions.length -+ for (var i = 0; i < versions.length; i++) { -+ self.getByVersion(versions[i], onElm) -+ } -+ -+ function onElm (err, elm) { -+ if (err) error = err -+ if (elm) elms.push(elm) -+ if (--pending) return -+ if (error) return cb(error) -+ -+ var res = self._mergeElementRefsAndMembers(elms) -+ cb(null, res) -+ } -+} -+ -+Osm.prototype.history = function (opts) { -+ if (opts && opts.id && opts.type) { -+ var stream = through.obj() -+ var err = new Error('id and type are exclusive history options') -+ process.nextTick(function () { -+ stream.emit('error', err) -+ }) -+ return stream -+ } else if (opts && opts.id) { -+ return this.core.api.history.id(opts.id, opts) -+ } else if (opts && opts.type) { -+ return this.core.api.history.type(opts.type, opts) -+ } else { -+ return this.core.api.history.all(opts) -+ } -+} -+ -+function versionToDeviceId (version) { -+ return version.split('@')[0] -+} -+ -+}, -+"1rJuQc9xcGdeTEPExYn91mCOp1zP+s0C3xnnjVOnq+Y=": -+function (require, module, exports, __dirname, __filename) { -+var JSONStream = require('JSONStream') -+ -+var OPEN = '{\n' + -+ ' "type": "FeatureCollection",\n' + -+ ' "features": [\n ' -+ -+var SEP = ',\n ' -+ -+var CLOSE = ' ]\n}\n' -+ -+module.exports = function GeoJSONFeatureCollectionStream () { -+ return JSONStream.stringify(OPEN, SEP, CLOSE) -+} -+ -+}, -+"1rbat6F0EGVgLwMJpUJ/p5uYk8AWHuHwzPpi2Y9gK6s=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('inherits') -+var EventEmitter = require('events').EventEmitter -+var hypercore = require('hypercore') -+var multifeed = require('multifeed') -+var indexer = require('multifeed-index') -+ -+module.exports = Kappa -+ -+function Kappa (storage, opts) { -+ if (!(this instanceof Kappa)) return new Kappa(storage, opts) -+ if (!opts) opts = {} -+ -+ this._logs = opts.multifeed || multifeed(hypercore, storage, opts) -+ this._indexes = {} -+ -+ this.api = {} -+} -+ -+inherits(Kappa, EventEmitter) -+ -+Kappa.prototype.use = function (name, version, view) { -+ var self = this -+ if (typeof version !== 'number') { -+ view = version -+ version = undefined -+ } -+ var idx = indexer(Object.assign({}, view, { -+ log: this._logs, -+ version: version, -+ maxBatch: view.maxBatch || 10, -+ batch: view.map -+ })) -+ idx.on('error', function (err) { -+ self.emit('error', err) -+ }) -+ if (view.indexed) idx.on('indexed', view.indexed) -+ this._indexes[name] = idx -+ this.api[name] = {} -+ this.api[name].ready = idx.ready.bind(idx) -+ for (var key in view.api) { -+ if (typeof view.api[key] === 'function') this.api[name][key] = view.api[key].bind(idx, this) -+ else this.api[name][key] = view.api[key] -+ } -+} -+ -+Kappa.prototype.feeds = function () { -+ return this._logs.feeds() -+} -+ -+Kappa.prototype.ready = function (viewNames, cb) { -+ if (typeof viewNames === 'function') { -+ cb = viewNames -+ viewNames = [] -+ } -+ -+ if (typeof viewNames === 'string') viewNames = [viewNames] -+ if (viewNames.length === 0) { -+ viewNames = Object.keys(this._indexes) -+ } -+ -+ var pending = viewNames.length + 1 -+ var self = this -+ this._logs.ready(function () { -+ for (var i = 0; i < viewNames.length; i++) { -+ self._indexes[viewNames[i]].ready(done) -+ } -+ done() -+ }) -+ -+ function done () { -+ if (!--pending) cb() -+ } -+} -+ -+Kappa.prototype.pause = function (viewNames, cb) { -+ if (typeof viewNames === 'function') { -+ cb = viewNames -+ viewNames = [] -+ } -+ cb = cb || noop -+ -+ if (!viewNames) viewNames = [] -+ if (typeof viewNames === 'string') viewNames = [viewNames] -+ if (viewNames.length === 0) { -+ viewNames = Object.keys(this._indexes) -+ } -+ -+ var pending = viewNames.length + 1 -+ var self = this -+ this._logs.ready(function () { -+ for (var i = 0; i < viewNames.length; i++) { -+ self._indexes[viewNames[i]].pause(done) -+ } -+ done() -+ }) -+ -+ function done () { -+ if (!--pending) cb() -+ } -+} -+ -+Kappa.prototype.resume = function (viewNames) { -+ if (!viewNames) viewNames = [] -+ if (typeof viewNames === 'string') viewNames = [viewNames] -+ if (viewNames.length === 0) { -+ viewNames = Object.keys(this._indexes) -+ } -+ -+ var self = this -+ this._logs.ready(function () { -+ for (var i = 0; i < viewNames.length; i++) { -+ self._indexes[viewNames[i]].resume() -+ } -+ }) -+} -+ -+Kappa.prototype.writer = function (name, cb) { -+ this._logs.writer(name, cb) -+} -+ -+Kappa.prototype.feed = function (key) { -+ return this._logs.feed(key) -+} -+ -+Kappa.prototype.replicate = function (opts) { -+ return this._logs.replicate(opts) -+} -+ -+function noop () {} -+ -+}, -+"1zNI1a8LFE8FiVsSJ+6dpTLUoUXzBdtc0fQ0mnn9r6Q=": -+function (require, module, exports, __dirname, __filename) { -+var hash = require('./crc16') -+ -+module.exports = LRU -+ -+function LRU (max, opts) { -+ if (!(this instanceof LRU)) return new LRU(max, opts) -+ if (!opts) opts = {} -+ -+ // how many collisions before evicting (factor of two for fast modulo) -+ this.collisions = factorOfTwo(opts.collisions || opts.bucketSize || 4) -+ // buckets should be a factor of two for fast modulo as well -+ this.buckets = factorOf(max, this.collisions) / this.collisions -+ -+ // we use 16bit hashing to bucket index must be <0xffff -+ while (this.buckets > 65536) { -+ this.buckets >>= 1 -+ this.collisions <<= 1 -+ } -+ -+ this.size = this.buckets * this.collisions -+ this.wrap = !opts.indexedValues -+ this.cache = new Array(this.size) -+ this.hash = this.buckets === 65536 ? hash : maskedHash(this.buckets - 1) -+ this.evict = opts.evict || null -+} -+ -+LRU.prototype.set = function (index, val) { -+ var pageStart = this.collisions * this.hash(index) -+ var pageEnd = pageStart + this.collisions -+ var ptr = pageStart -+ var page = null -+ -+ while (ptr < pageEnd) { -+ page = this.cache[ptr] -+ -+ if (!page) { -+ // no exiting version, but we have space to store it -+ page = this.cache[ptr] = this.wrap ? new Node(index, val) : val -+ move(this.cache, pageStart, ptr, page) -+ return -+ } -+ -+ if (page.index === index) { -+ // update existing version and move to head of bucket -+ if (this.wrap) page.value = val -+ else this.cache[ptr] = val -+ move(this.cache, pageStart, ptr, page) -+ return -+ } -+ -+ ptr++ -+ } -+ -+ // bucket is full, update oldest (last element in bucket) -+ if (this.wrap) { -+ if (this.evict) this.evict(page.index, page.value) -+ page.index = index -+ page.value = val -+ } else { -+ if (this.evict) this.evict(page.index, page) -+ this.cache[ptr - 1] = val -+ } -+ move(this.cache, pageStart, ptr - 1, page) -+} -+ -+LRU.prototype.get = function (index) { -+ var pageStart = this.collisions * this.hash(index) -+ var pageEnd = pageStart + this.collisions -+ var ptr = pageStart -+ -+ while (ptr < pageEnd) { -+ var page = this.cache[ptr++] -+ -+ if (!page) return null -+ if (page.index !== index) continue -+ -+ // we found it! move to head of bucket and return value -+ move(this.cache, pageStart, ptr - 1, page) -+ -+ return this.wrap ? page.value : page -+ } -+ -+ return null -+} -+ -+function move (list, index, itemIndex, item) { -+ while (itemIndex > index) list[itemIndex] = list[--itemIndex] -+ list[index] = item -+} -+ -+function Node (index, value) { -+ this.index = index -+ this.value = value -+} -+ -+function factorOf (n, factor) { -+ n = factorOfTwo(n) -+ while (n & (factor - 1)) n <<= 1 -+ return n -+} -+ -+function factorOfTwo (n) { -+ if (n && !(n & (n - 1))) return n -+ var p = 1 -+ while (p < n) p <<= 1 -+ return p -+} -+ -+function maskedHash (mask) { -+ return function (n) { -+ return hash(n) & mask -+ } -+} -+ -+}, -+"2+HH0HMeRVluIGhKDgqwMJw8sp9XCJFp86N1B5r/2m0=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, INTERNAL) { -+var util = require("./util"); -+var errorObj = util.errorObj; -+var isObject = util.isObject; -+ -+function tryConvertToPromise(obj, context) { -+ if (isObject(obj)) { -+ if (obj instanceof Promise) return obj; -+ var then = getThen(obj); -+ if (then === errorObj) { -+ if (context) context._pushContext(); -+ var ret = Promise.reject(then.e); -+ if (context) context._popContext(); -+ return ret; -+ } else if (typeof then === "function") { -+ if (isAnyBluebirdPromise(obj)) { -+ var ret = new Promise(INTERNAL); -+ obj._then( -+ ret._fulfill, -+ ret._reject, -+ undefined, -+ ret, -+ null -+ ); -+ return ret; -+ } -+ return doThenable(obj, then, context); -+ } -+ } -+ return obj; -+} -+ -+function doGetThen(obj) { -+ return obj.then; -+} -+ -+function getThen(obj) { -+ try { -+ return doGetThen(obj); -+ } catch (e) { -+ errorObj.e = e; -+ return errorObj; -+ } -+} -+ -+var hasProp = {}.hasOwnProperty; -+function isAnyBluebirdPromise(obj) { -+ try { -+ return hasProp.call(obj, "_promise0"); -+ } catch (e) { -+ return false; -+ } -+} -+ -+function doThenable(x, then, context) { -+ var promise = new Promise(INTERNAL); -+ var ret = promise; -+ if (context) context._pushContext(); -+ promise._captureStackTrace(); -+ if (context) context._popContext(); -+ var synchronous = true; -+ var result = util.tryCatch(then).call(x, resolve, reject); -+ synchronous = false; -+ -+ if (promise && result === errorObj) { -+ promise._rejectCallback(result.e, true, true); -+ promise = null; -+ } -+ -+ function resolve(value) { -+ if (!promise) return; -+ promise._resolveCallback(value); -+ promise = null; -+ } -+ -+ function reject(reason) { -+ if (!promise) return; -+ promise._rejectCallback(reason, synchronous, true); -+ promise = null; -+ } -+ return ret; -+} -+ -+return tryConvertToPromise; -+}; -+ -+}, -+"20EZXmp2uXaAoitHS9knLXpULcsg6FZYNZ0SOm8jTXo=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * has-value -+ * -+ * Copyright (c) 2014-2017, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var isObject = require('isobject'); -+var hasValues = require('has-values'); -+var get = require('get-value'); -+ -+module.exports = function(val, prop) { -+ return hasValues(isObject(val) && prop ? get(val, prop) : val); -+}; -+ -+}, -+"24Me2VaLtFW+4kZ/bwu+gy+1oB+bvpAPS+1OsfPMn2o=": -+function (require, module, exports, __dirname, __filename) { -+var isObject = require('./_is-object') -+ , document = require('./_global').document -+ // in old IE typeof document.createElement is 'object' -+ , is = isObject(document) && isObject(document.createElement); -+module.exports = function(it){ -+ return is ? document.createElement(it) : {}; -+}; -+}, -+"24R104ashdwp9Ot/n4n3XreXgqd7XYxM8wEOAuJ7/Vw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// MODULES // -+ -+var deepCopy = require( 'utils-copy' ); -+var getKeys = require( 'object-keys' ).shim(); -+ -+ -+// COPY ERROR // -+ -+/** -+* FUNCTION: copy( error ) -+* Copies an error. -+* -+* @param {Error|TypeError|SyntaxError|URIError|ReferenceError|RangeError|RangeError|EvalError} error - error to copy -+* @returns {Error|TypeError|SyntaxError|URIError|ReferenceError|RangeError|RangeError|EvalError} error copy -+*/ -+function copy( error ) { -+ /* jshint newcap:false */ -+ var keys; -+ var desc; -+ var key; -+ var err; -+ var i; -+ if ( !( error instanceof Error ) ) { -+ throw new TypeError( 'invalid input argument. Must provide an error object. Value: `' + error + '`.' ); -+ } -+ // Create a new error... -+ err = new error.constructor( error.message ); -+ -+ // If a `stack` property is present, copy it over... -+ if ( error.stack ) { -+ err.stack = error.stack; -+ } -+ // Node.js specific (system errors)... -+ if ( error.code ) { -+ err.code = error.code; -+ } -+ if ( error.errno ) { -+ err.errno = error.errno; -+ } -+ if ( error.syscall ) { -+ err.syscall = error.syscall; -+ } -+ // Any enumerable properties... -+ keys = getKeys( error ); -+ for ( i = 0; i < keys.length; i++ ) { -+ key = keys[ i ]; -+ desc = Object.getOwnPropertyDescriptor( error, key ); -+ if ( desc.hasOwnProperty( 'value' ) ) { -+ desc.value = deepCopy( error[ key ] ); -+ } -+ Object.defineProperty( err, key, desc ); -+ } -+ return err; -+} // end FUNCTION copy() -+ -+ -+// EXPORTS // -+ -+module.exports = copy; -+ -+}, -+"2BJMw4gFcSBkjoRuwDyVSGS9emjZzZXDXZzuxCbZVC4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const eos = require('readable-stream').finished -+const statusCodes = require('http').STATUS_CODES -+const flatstr = require('flatstr') -+const FJS = require('fast-json-stringify') -+const { -+ kSchemaResponse, -+ kFourOhFourContext, -+ kReplyErrorHandlerCalled, -+ kReplySent, -+ kReplySentOverwritten, -+ kReplyStartTime, -+ kReplySerializer, -+ kReplySerializerDefault, -+ kReplyIsError, -+ kReplyHeaders, -+ kReplyHasStatusCode, -+ kReplyIsRunningOnErrorHook, -+ kDisableRequestLogging -+} = require('./symbols.js') -+const { hookRunner, hookIterator, onSendHookRunner } = require('./hooks') -+ -+const internals = require('./handleRequest')[Symbol.for('internals')] -+const loggerUtils = require('./logger') -+const now = loggerUtils.now -+const wrapThenable = require('./wrapThenable') -+ -+const serializeError = FJS({ -+ type: 'object', -+ properties: { -+ statusCode: { type: 'number' }, -+ code: { type: 'string' }, -+ error: { type: 'string' }, -+ message: { type: 'string' } -+ } -+}) -+ -+const CONTENT_TYPE = { -+ JSON: 'application/json; charset=utf-8', -+ PLAIN: 'text/plain; charset=utf-8', -+ OCTET: 'application/octet-stream' -+} -+const { -+ FST_ERR_REP_INVALID_PAYLOAD_TYPE, -+ FST_ERR_REP_ALREADY_SENT, -+ FST_ERR_REP_SENT_VALUE, -+ FST_ERR_SEND_INSIDE_ONERR, -+ FST_ERR_BAD_STATUS_CODE -+} = require('./errors') -+const warning = require('./warnings') -+ -+function Reply (res, request, log) { -+ this.raw = res -+ this[kReplySent] = false -+ this[kReplySerializer] = null -+ this[kReplyErrorHandlerCalled] = false -+ this[kReplyIsError] = false -+ this[kReplyIsRunningOnErrorHook] = false -+ this.request = request -+ this[kReplyHeaders] = {} -+ this[kReplyHasStatusCode] = false -+ this[kReplyStartTime] = undefined -+ this.log = log -+} -+ -+Object.defineProperties(Reply.prototype, { -+ context: { -+ get () { -+ return this.request.context -+ } -+ }, -+ res: { -+ get () { -+ warning.emit('FSTDEP002') -+ return this.raw -+ } -+ }, -+ sent: { -+ enumerable: true, -+ get () { -+ return this[kReplySent] -+ }, -+ set (value) { -+ if (value !== true) { -+ throw new FST_ERR_REP_SENT_VALUE() -+ } -+ -+ if (this[kReplySent]) { -+ throw new FST_ERR_REP_ALREADY_SENT() -+ } -+ -+ this[kReplySentOverwritten] = true -+ this[kReplySent] = true -+ } -+ }, -+ statusCode: { -+ get () { -+ return this.raw.statusCode -+ }, -+ set (value) { -+ this.code(value) -+ } -+ } -+}) -+ -+Reply.prototype.hijack = function () { -+ this[kReplySent] = true -+ return this -+} -+ -+Reply.prototype.send = function (payload) { -+ if (this[kReplyIsRunningOnErrorHook] === true) { -+ throw new FST_ERR_SEND_INSIDE_ONERR() -+ } -+ -+ if (this[kReplySent]) { -+ this.log.warn({ err: new FST_ERR_REP_ALREADY_SENT() }, 'Reply already sent') -+ return this -+ } -+ -+ if (payload instanceof Error || this[kReplyIsError] === true) { -+ onErrorHook(this, payload, onSendHook) -+ return this -+ } -+ -+ if (payload === undefined) { -+ onSendHook(this, payload) -+ return this -+ } -+ -+ const contentType = this.getHeader('content-type') -+ const hasContentType = contentType !== undefined -+ -+ if (payload !== null) { -+ if (Buffer.isBuffer(payload) || typeof payload.pipe === 'function') { -+ if (hasContentType === false) { -+ this[kReplyHeaders]['content-type'] = CONTENT_TYPE.OCTET -+ } -+ onSendHook(this, payload) -+ return this -+ } -+ -+ if (hasContentType === false && typeof payload === 'string') { -+ this[kReplyHeaders]['content-type'] = CONTENT_TYPE.PLAIN -+ onSendHook(this, payload) -+ return this -+ } -+ } -+ -+ if (this[kReplySerializer] !== null) { -+ if (typeof payload !== 'string') { -+ preserializeHook(this, payload) -+ return this -+ } else { -+ payload = this[kReplySerializer](payload) -+ } -+ -+ // The indexOf below also matches custom json mimetypes such as 'application/hal+json' or 'application/ld+json' -+ } else if (hasContentType === false || contentType.indexOf('json') > -1) { -+ if (hasContentType === false) { -+ this[kReplyHeaders]['content-type'] = CONTENT_TYPE.JSON -+ } else { -+ // If hasContentType === true, we have a JSON mimetype -+ if (contentType.indexOf('charset') === -1) { -+ // If we have simply application/json instead of a custom json mimetype -+ if (contentType.indexOf('/json') > -1) { -+ this[kReplyHeaders]['content-type'] = CONTENT_TYPE.JSON -+ } else { -+ const currContentType = this[kReplyHeaders]['content-type'] -+ // We extract the custom mimetype part (e.g. 'hal+' from 'application/hal+json') -+ const customJsonType = currContentType.substring( -+ currContentType.indexOf('/'), -+ currContentType.indexOf('json') + 4 -+ ) -+ -+ // We ensure we set the header to the proper JSON content-type if necessary -+ // (e.g. 'application/hal+json' instead of 'application/json') -+ this[kReplyHeaders]['content-type'] = CONTENT_TYPE.JSON.replace('/json', customJsonType) -+ } -+ } -+ } -+ if (typeof payload !== 'string') { -+ preserializeHook(this, payload) -+ return this -+ } -+ } -+ -+ onSendHook(this, payload) -+ -+ return this -+} -+ -+Reply.prototype.getHeader = function (key) { -+ key = key.toLowerCase() -+ const res = this.raw -+ let value = this[kReplyHeaders][key] -+ if (value === undefined && res.hasHeader(key)) { -+ value = res.getHeader(key) -+ } -+ return value -+} -+ -+Reply.prototype.getHeaders = function () { -+ return { -+ ...this.raw.getHeaders(), -+ ...this[kReplyHeaders] -+ } -+} -+ -+Reply.prototype.hasHeader = function (key) { -+ key = key.toLowerCase() -+ if (this[kReplyHeaders][key] !== undefined) { -+ return true -+ } -+ return this.raw.hasHeader(key) -+} -+ -+Reply.prototype.removeHeader = function (key) { -+ // Node.js does not like headers with keys set to undefined, -+ // so we have to delete the key. -+ delete this[kReplyHeaders][key.toLowerCase()] -+ return this -+} -+ -+Reply.prototype.header = function (key, value) { -+ const _key = key.toLowerCase() -+ -+ // default the value to '' -+ value = value === undefined ? '' : value -+ -+ if (this[kReplyHeaders][_key] && _key === 'set-cookie') { -+ // https://tools.ietf.org/html/rfc7230#section-3.2.2 -+ if (typeof this[kReplyHeaders][_key] === 'string') { -+ this[kReplyHeaders][_key] = [this[kReplyHeaders][_key]] -+ } -+ if (Array.isArray(value)) { -+ Array.prototype.push.apply(this[kReplyHeaders][_key], value) -+ } else { -+ this[kReplyHeaders][_key].push(value) -+ } -+ } else { -+ this[kReplyHeaders][_key] = value -+ } -+ return this -+} -+ -+Reply.prototype.headers = function (headers) { -+ const keys = Object.keys(headers) -+ /* eslint-disable no-var */ -+ for (var i = 0; i !== keys.length; ++i) { -+ const key = keys[i] -+ this.header(key, headers[key]) -+ } -+ return this -+} -+ -+Reply.prototype.code = function (code) { -+ const intValue = parseInt(code) -+ if (isNaN(intValue) || intValue < 100 || intValue > 600) { -+ throw new FST_ERR_BAD_STATUS_CODE(code || String(code)) -+ } -+ -+ this.raw.statusCode = intValue -+ this[kReplyHasStatusCode] = true -+ return this -+} -+ -+Reply.prototype.status = Reply.prototype.code -+ -+Reply.prototype.serialize = function (payload) { -+ if (this[kReplySerializer] !== null) { -+ return this[kReplySerializer](payload) -+ } else { -+ if (this.context && this.context[kReplySerializerDefault]) { -+ return this.context[kReplySerializerDefault](payload, this.raw.statusCode) -+ } else { -+ return serialize(this.context, payload, this.raw.statusCode) -+ } -+ } -+} -+ -+Reply.prototype.serializer = function (fn) { -+ this[kReplySerializer] = fn -+ return this -+} -+ -+Reply.prototype.type = function (type) { -+ this[kReplyHeaders]['content-type'] = type -+ return this -+} -+ -+Reply.prototype.redirect = function (code, url) { -+ if (typeof code === 'string') { -+ url = code -+ code = this[kReplyHasStatusCode] ? this.raw.statusCode : 302 -+ } -+ -+ this.header('location', url).code(code).send() -+} -+ -+Reply.prototype.callNotFound = function () { -+ notFound(this) -+} -+ -+Reply.prototype.getResponseTime = function () { -+ let responseTime = 0 -+ -+ if (this[kReplyStartTime] !== undefined) { -+ responseTime = now() - this[kReplyStartTime] -+ } -+ -+ return responseTime -+} -+ -+// Make reply a thenable, so it could be used with async/await. -+// See -+// - https://github.com/fastify/fastify/issues/1864 for the discussions -+// - https://promisesaplus.com/ for the definition of thenable -+// - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then for the signature -+Reply.prototype.then = function (fulfilled, rejected) { -+ if (this.sent) { -+ fulfilled() -+ return -+ } -+ -+ eos(this.raw, function (err) { -+ // We must not treat ERR_STREAM_PREMATURE_CLOSE as -+ // an error because it is created by eos, not by the stream. -+ if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { -+ if (rejected) { -+ rejected(err) -+ } -+ } else { -+ fulfilled() -+ } -+ }) -+} -+ -+function preserializeHook (reply, payload) { -+ if (reply.context.preSerialization !== null) { -+ onSendHookRunner( -+ reply.context.preSerialization, -+ reply.request, -+ reply, -+ payload, -+ preserializeHookEnd -+ ) -+ } else { -+ preserializeHookEnd(null, reply.request, reply, payload) -+ } -+} -+ -+function preserializeHookEnd (err, request, reply, payload) { -+ if (err != null) { -+ onErrorHook(reply, err) -+ return -+ } -+ -+ if (reply[kReplySerializer] !== null) { -+ payload = reply[kReplySerializer](payload) -+ } else if (reply.context && reply.context[kReplySerializerDefault]) { -+ payload = reply.context[kReplySerializerDefault](payload, reply.raw.statusCode) -+ } else { -+ payload = serialize(reply.context, payload, reply.raw.statusCode) -+ } -+ -+ flatstr(payload) -+ -+ onSendHook(reply, payload) -+} -+ -+function onSendHook (reply, payload) { -+ reply[kReplySent] = true -+ if (reply.context.onSend !== null) { -+ onSendHookRunner( -+ reply.context.onSend, -+ reply.request, -+ reply, -+ payload, -+ wrapOnSendEnd -+ ) -+ } else { -+ onSendEnd(reply, payload) -+ } -+} -+ -+function wrapOnSendEnd (err, request, reply, payload) { -+ if (err != null) { -+ onErrorHook(reply, err) -+ } else { -+ onSendEnd(reply, payload) -+ } -+} -+ -+function onSendEnd (reply, payload) { -+ const res = reply.raw -+ const req = reply.request -+ const statusCode = res.statusCode -+ -+ if (payload === undefined || payload === null) { -+ reply[kReplySent] = true -+ -+ // according to https://tools.ietf.org/html/rfc7230#section-3.3.2 -+ // we cannot send a content-length for 304 and 204, and all status code -+ // < 200. -+ // For HEAD we don't overwrite the `content-length` -+ if (statusCode >= 200 && statusCode !== 204 && statusCode !== 304 && req.method !== 'HEAD') { -+ reply[kReplyHeaders]['content-length'] = '0' -+ } -+ -+ res.writeHead(statusCode, reply[kReplyHeaders]) -+ // avoid ArgumentsAdaptorTrampoline from V8 -+ res.end(null, null, null) -+ return -+ } -+ -+ if (typeof payload.pipe === 'function') { -+ sendStream(payload, res, reply) -+ return -+ } -+ -+ if (typeof payload !== 'string' && !Buffer.isBuffer(payload)) { -+ throw new FST_ERR_REP_INVALID_PAYLOAD_TYPE(typeof payload) -+ } -+ -+ if (!reply[kReplyHeaders]['content-length']) { -+ reply[kReplyHeaders]['content-length'] = '' + Buffer.byteLength(payload) -+ } -+ -+ reply[kReplySent] = true -+ -+ res.writeHead(statusCode, reply[kReplyHeaders]) -+ -+ // avoid ArgumentsAdaptorTrampoline from V8 -+ res.end(payload, null, null) -+} -+ -+function logStreamError (logger, err, res) { -+ if (err.code === 'ERR_STREAM_PREMATURE_CLOSE') { -+ if (!logger[kDisableRequestLogging]) { -+ logger.info({ res }, 'stream closed prematurely') -+ } -+ } else { -+ logger.warn({ err }, 'response terminated with an error with headers already sent') -+ } -+} -+ -+function sendStream (payload, res, reply) { -+ let sourceOpen = true -+ let errorLogged = false -+ -+ eos(payload, { readable: true, writable: false }, function (err) { -+ sourceOpen = false -+ if (err != null) { -+ if (res.headersSent) { -+ if (!errorLogged) { -+ errorLogged = true -+ logStreamError(reply.log, err, res) -+ } -+ res.destroy() -+ } else { -+ onErrorHook(reply, err) -+ } -+ } -+ // there is nothing to do if there is not an error -+ }) -+ -+ eos(res, function (err) { -+ if (sourceOpen) { -+ if (err != null && res.headersSent && !errorLogged) { -+ errorLogged = true -+ logStreamError(reply.log, err, res) -+ } -+ if (typeof payload.destroy === 'function') { -+ payload.destroy() -+ } else if (typeof payload.close === 'function') { -+ payload.close(noop) -+ } else if (typeof payload.abort === 'function') { -+ payload.abort() -+ } -+ } -+ }) -+ -+ // streams will error asynchronously, and we want to handle that error -+ // appropriately, e.g. a 404 for a missing file. So we cannot use -+ // writeHead, and we need to resort to setHeader, which will trigger -+ // a writeHead when there is data to send. -+ if (!res.headersSent) { -+ for (const key in reply[kReplyHeaders]) { -+ res.setHeader(key, reply[kReplyHeaders][key]) -+ } -+ } else { -+ reply.log.warn('response will send, but you shouldn\'t use res.writeHead in stream mode') -+ } -+ payload.pipe(res) -+} -+ -+function onErrorHook (reply, error, cb) { -+ reply[kReplySent] = true -+ if (reply.context.onError !== null && reply[kReplyErrorHandlerCalled] === true) { -+ reply[kReplyIsRunningOnErrorHook] = true -+ onSendHookRunner( -+ reply.context.onError, -+ reply.request, -+ reply, -+ error, -+ () => handleError(reply, error, cb) -+ ) -+ } else { -+ handleError(reply, error, cb) -+ } -+} -+ -+function handleError (reply, error, cb) { -+ reply[kReplyIsRunningOnErrorHook] = false -+ const res = reply.raw -+ let statusCode = res.statusCode -+ statusCode = (statusCode >= 400) ? statusCode : 500 -+ // treat undefined and null as same -+ if (error != null) { -+ if (error.headers !== undefined) { -+ reply.headers(error.headers) -+ } -+ if (error.status >= 400) { -+ statusCode = error.status -+ } else if (error.statusCode >= 400) { -+ statusCode = error.statusCode -+ } -+ } -+ -+ res.statusCode = statusCode -+ -+ const errorHandler = reply.context.errorHandler -+ if (errorHandler && reply[kReplyErrorHandlerCalled] === false) { -+ reply[kReplySent] = false -+ reply[kReplyIsError] = false -+ reply[kReplyErrorHandlerCalled] = true -+ reply[kReplyHeaders]['content-length'] = undefined -+ const result = errorHandler(error, reply.request, reply) -+ if (result && typeof result.then === 'function') { -+ wrapThenable(result, reply) -+ } -+ return -+ } -+ -+ let payload -+ try { -+ const serializerFn = getSchemaSerializer(reply.context, statusCode) -+ payload = (serializerFn === false) -+ ? serializeError({ -+ error: statusCodes[statusCode + ''], -+ code: error.code, -+ message: error.message || '', -+ statusCode: statusCode -+ }) -+ : serializerFn(Object.create(error, { -+ error: { value: statusCodes[statusCode + ''] }, -+ message: { value: error.message || '' }, -+ statusCode: { value: statusCode } -+ })) -+ } catch (err) { -+ reply.log.error({ err, statusCode: res.statusCode }, 'The serializer for the given status code failed') -+ res.statusCode = 500 -+ payload = serializeError({ -+ error: statusCodes['500'], -+ message: err.message || '', -+ statusCode: 500 -+ }) -+ } -+ -+ flatstr(payload) -+ reply[kReplyHeaders]['content-type'] = CONTENT_TYPE.JSON -+ reply[kReplyHeaders]['content-length'] = '' + Buffer.byteLength(payload) -+ -+ if (cb) { -+ cb(reply, payload) -+ return -+ } -+ -+ reply[kReplySent] = true -+ res.writeHead(res.statusCode, reply[kReplyHeaders]) -+ res.end(payload) -+} -+ -+function setupResponseListeners (reply) { -+ reply[kReplyStartTime] = now() -+ -+ const onResFinished = err => { -+ reply.raw.removeListener('finish', onResFinished) -+ reply.raw.removeListener('error', onResFinished) -+ -+ const ctx = reply.context -+ -+ if (ctx && ctx.onResponse !== null) { -+ hookRunner( -+ ctx.onResponse, -+ onResponseIterator, -+ reply.request, -+ reply, -+ onResponseCallback -+ ) -+ } else { -+ onResponseCallback(err, reply.request, reply) -+ } -+ } -+ -+ reply.raw.on('finish', onResFinished) -+ reply.raw.on('error', onResFinished) -+} -+ -+function onResponseIterator (fn, request, reply, next) { -+ return fn(request, reply, next) -+} -+ -+function onResponseCallback (err, request, reply) { -+ if (reply.log[kDisableRequestLogging]) { -+ return -+ } -+ -+ const responseTime = reply.getResponseTime() -+ -+ if (err != null) { -+ reply.log.error({ -+ res: reply, -+ err, -+ responseTime -+ }, 'request errored') -+ return -+ } -+ -+ reply.log.info({ -+ res: reply, -+ responseTime -+ }, 'request completed') -+} -+ -+function buildReply (R) { -+ function _Reply (res, request, log) { -+ this.raw = res -+ this[kReplyIsError] = false -+ this[kReplyErrorHandlerCalled] = false -+ this[kReplySent] = false -+ this[kReplySentOverwritten] = false -+ this[kReplySerializer] = null -+ this.request = request -+ this[kReplyHeaders] = {} -+ this[kReplyStartTime] = undefined -+ this.log = log -+ } -+ _Reply.prototype = new R() -+ return _Reply -+} -+ -+function notFound (reply) { -+ reply[kReplySent] = false -+ reply[kReplyIsError] = false -+ -+ if (reply.context[kFourOhFourContext] === null) { -+ reply.log.warn('Trying to send a NotFound error inside a 404 handler. Sending basic 404 response.') -+ reply.code(404).send('404 Not Found') -+ return -+ } -+ -+ reply.request.context = reply.context[kFourOhFourContext] -+ -+ // preHandler hook -+ if (reply.context.preHandler !== null) { -+ hookRunner( -+ reply.context.preHandler, -+ hookIterator, -+ reply.request, -+ reply, -+ internals.preHandlerCallback -+ ) -+ } else { -+ internals.preHandlerCallback(null, reply.request, reply) -+ } -+} -+ -+/** -+ * This function runs when a payload that is not a string|buffer|stream or null -+ * should be serialized to be streamed to the response. -+ * This is the default serializer that can be customized by the user using the replySerializer -+ * -+ * @param {object} context the request context -+ * @param {object} data the JSON payload to serialize -+ * @param {number} statusCode the http status code -+ * @returns {string} the serialized payload -+ */ -+function serialize (context, data, statusCode) { -+ const fnSerialize = getSchemaSerializer(context, statusCode) -+ if (fnSerialize) { -+ return fnSerialize(data) -+ } -+ return JSON.stringify(data) -+} -+ -+/** -+ * Search for the right JSON schema compiled function in the request context -+ * setup by the route configuration `schema.response`. -+ * It will look for the exact match (eg 200) or generic (eg 2xx) -+ * -+ * @param {object} context the request context -+ * @param {number} statusCode the http status code -+ * @returns {function|boolean} the right JSON Schema function to serialize -+ * the reply or false if it is not set -+ */ -+function getSchemaSerializer (context, statusCode) { -+ const responseSchemaDef = context[kSchemaResponse] -+ if (!responseSchemaDef) { -+ return false -+ } -+ if (responseSchemaDef[statusCode]) { -+ return responseSchemaDef[statusCode] -+ } -+ const fallbackStatusCode = (statusCode + '')[0] + 'xx' -+ if (responseSchemaDef[fallbackStatusCode]) { -+ return responseSchemaDef[fallbackStatusCode] -+ } -+ return false -+} -+ -+function noop () { } -+ -+module.exports = Reply -+module.exports.buildReply = buildReply -+module.exports.setupResponseListeners = setupResponseListeners -+ -+}, -+"2FuyuMa6PPceaudZNC34ne6VmBxoVun03AuF1wz2C1k=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+// a transform stream is a readable/writable stream where you do -+// something with the data. Sometimes it's called a "filter", -+// but that's not a great name for it, since that implies a thing where -+// some bits pass through, and others are simply ignored. (That would -+// be a valid example of a transform, of course.) -+// -+// While the output is causally related to the input, it's not a -+// necessarily symmetric or synchronous transformation. For example, -+// a zlib stream might take multiple plain-text writes(), and then -+// emit a single compressed chunk some time in the future. -+// -+// Here's how this works: -+// -+// The Transform stream has all the aspects of the readable and writable -+// stream classes. When you write(chunk), that calls _write(chunk,cb) -+// internally, and returns false if there's a lot of pending writes -+// buffered up. When you call read(), that calls _read(n) until -+// there's enough pending readable data buffered up. -+// -+// In a transform stream, the written data is placed in a buffer. When -+// _read(n) is called, it transforms the queued up data, calling the -+// buffered _write cb's as it consumes chunks. If consuming a single -+// written chunk would result in multiple output chunks, then the first -+// outputted bit calls the readcb, and subsequent chunks just go into -+// the read buffer, and will cause it to emit 'readable' if necessary. -+// -+// This way, back-pressure is actually determined by the reading side, -+// since _read has to be called to start processing a new chunk. However, -+// a pathological inflate type of transform can cause excessive buffering -+// here. For example, imagine a stream where every byte of input is -+// interpreted as an integer from 0-255, and then results in that many -+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -+// 1kb of data being output. In this case, you could write a very small -+// amount of input, and end up with a very large amount of output. In -+// such a pathological inflating mechanism, there'd be no way to tell -+// the system to stop doing the transform. A single 4MB write could -+// cause the system to run out of memory. -+// -+// However, even in such a pathological case, only a single written chunk -+// would be consumed, and then the rest would wait (un-transformed) until -+// the results of the previous transformed chunk were consumed. -+'use strict'; -+ -+module.exports = Transform; -+ -+var _require$codes = require('../errors').codes, -+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, -+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, -+ ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, -+ ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; -+ -+var Duplex = require('./_stream_duplex'); -+ -+require('inherits')(Transform, Duplex); -+ -+function afterTransform(er, data) { -+ var ts = this._transformState; -+ ts.transforming = false; -+ var cb = ts.writecb; -+ -+ if (cb === null) { -+ return this.emit('error', new ERR_MULTIPLE_CALLBACK()); -+ } -+ -+ ts.writechunk = null; -+ ts.writecb = null; -+ if (data != null) // single equals check for both `null` and `undefined` -+ this.push(data); -+ cb(er); -+ var rs = this._readableState; -+ rs.reading = false; -+ -+ if (rs.needReadable || rs.length < rs.highWaterMark) { -+ this._read(rs.highWaterMark); -+ } -+} -+ -+function Transform(options) { -+ if (!(this instanceof Transform)) return new Transform(options); -+ Duplex.call(this, options); -+ this._transformState = { -+ afterTransform: afterTransform.bind(this), -+ needTransform: false, -+ transforming: false, -+ writecb: null, -+ writechunk: null, -+ writeencoding: null -+ }; // start out asking for a readable event once data is transformed. -+ -+ this._readableState.needReadable = true; // we have implemented the _read method, and done the other things -+ // that Readable wants before the first _read call, so unset the -+ // sync guard flag. -+ -+ this._readableState.sync = false; -+ -+ if (options) { -+ if (typeof options.transform === 'function') this._transform = options.transform; -+ if (typeof options.flush === 'function') this._flush = options.flush; -+ } // When the writable side finishes, then flush out anything remaining. -+ -+ -+ this.on('prefinish', prefinish); -+} -+ -+function prefinish() { -+ var _this = this; -+ -+ if (typeof this._flush === 'function' && !this._readableState.destroyed) { -+ this._flush(function (er, data) { -+ done(_this, er, data); -+ }); -+ } else { -+ done(this, null, null); -+ } -+} -+ -+Transform.prototype.push = function (chunk, encoding) { -+ this._transformState.needTransform = false; -+ return Duplex.prototype.push.call(this, chunk, encoding); -+}; // This is the part where you do stuff! -+// override this function in implementation classes. -+// 'chunk' is an input chunk. -+// -+// Call `push(newChunk)` to pass along transformed output -+// to the readable side. You may call 'push' zero or more times. -+// -+// Call `cb(err)` when you are done with this chunk. If you pass -+// an error, then that'll put the hurt on the whole operation. If you -+// never call cb(), then you'll never get another chunk. -+ -+ -+Transform.prototype._transform = function (chunk, encoding, cb) { -+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); -+}; -+ -+Transform.prototype._write = function (chunk, encoding, cb) { -+ var ts = this._transformState; -+ ts.writecb = cb; -+ ts.writechunk = chunk; -+ ts.writeencoding = encoding; -+ -+ if (!ts.transforming) { -+ var rs = this._readableState; -+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); -+ } -+}; // Doesn't matter what the args are here. -+// _transform does all the work. -+// That we got here means that the readable side wants more data. -+ -+ -+Transform.prototype._read = function (n) { -+ var ts = this._transformState; -+ -+ if (ts.writechunk !== null && !ts.transforming) { -+ ts.transforming = true; -+ -+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); -+ } else { -+ // mark that we need a transform, so that any data that comes in -+ // will get processed, now that we've asked for it. -+ ts.needTransform = true; -+ } -+}; -+ -+Transform.prototype._destroy = function (err, cb) { -+ Duplex.prototype._destroy.call(this, err, function (err2) { -+ cb(err2); -+ }); -+}; -+ -+function done(stream, er, data) { -+ if (er) return stream.emit('error', er); -+ if (data != null) // single equals check for both `null` and `undefined` -+ stream.push(data); // TODO(BridgeAR): Write a test for these two error cases -+ // if there's nothing in the write buffer, then that means -+ // that nothing more will ever be provided -+ -+ if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); -+ if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); -+ return stream.push(null); -+} -+}, -+"2NHB1sOHq2fD8o14/Qsgub7NaUQtudPv4RDKRktQnIo=": -+function (require, module, exports, __dirname, __filename) { -+ -+/** -+ * This is the common logic for both the Node.js and web browser -+ * implementations of `debug()`. -+ * -+ * Expose `debug()` as the module. -+ */ -+ -+exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -+exports.coerce = coerce; -+exports.disable = disable; -+exports.enable = enable; -+exports.enabled = enabled; -+exports.humanize = require('ms'); -+ -+/** -+ * The currently active debug mode names, and names to skip. -+ */ -+ -+exports.names = []; -+exports.skips = []; -+ -+/** -+ * Map of special "%n" handling functions, for the debug "format" argument. -+ * -+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". -+ */ -+ -+exports.formatters = {}; -+ -+/** -+ * Previous log timestamp. -+ */ -+ -+var prevTime; -+ -+/** -+ * Select a color. -+ * @param {String} namespace -+ * @return {Number} -+ * @api private -+ */ -+ -+function selectColor(namespace) { -+ var hash = 0, i; -+ -+ for (i in namespace) { -+ hash = ((hash << 5) - hash) + namespace.charCodeAt(i); -+ hash |= 0; // Convert to 32bit integer -+ } -+ -+ return exports.colors[Math.abs(hash) % exports.colors.length]; -+} -+ -+/** -+ * Create a debugger with the given `namespace`. -+ * -+ * @param {String} namespace -+ * @return {Function} -+ * @api public -+ */ -+ -+function createDebug(namespace) { -+ -+ function debug() { -+ // disabled? -+ if (!debug.enabled) return; -+ -+ var self = debug; -+ -+ // set `diff` timestamp -+ var curr = +new Date(); -+ var ms = curr - (prevTime || curr); -+ self.diff = ms; -+ self.prev = prevTime; -+ self.curr = curr; -+ prevTime = curr; -+ -+ // turn the `arguments` into a proper Array -+ var args = new Array(arguments.length); -+ for (var i = 0; i < args.length; i++) { -+ args[i] = arguments[i]; -+ } -+ -+ args[0] = exports.coerce(args[0]); -+ -+ if ('string' !== typeof args[0]) { -+ // anything else let's inspect with %O -+ args.unshift('%O'); -+ } -+ -+ // apply any `formatters` transformations -+ var index = 0; -+ args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { -+ // if we encounter an escaped % then don't increase the array index -+ if (match === '%%') return match; -+ index++; -+ var formatter = exports.formatters[format]; -+ if ('function' === typeof formatter) { -+ var val = args[index]; -+ match = formatter.call(self, val); -+ -+ // now we need to remove `args[index]` since it's inlined in the `format` -+ args.splice(index, 1); -+ index--; -+ } -+ return match; -+ }); -+ -+ // apply env-specific formatting (colors, etc.) -+ exports.formatArgs.call(self, args); -+ -+ var logFn = debug.log || exports.log || console.log.bind(console); -+ logFn.apply(self, args); -+ } -+ -+ debug.namespace = namespace; -+ debug.enabled = exports.enabled(namespace); -+ debug.useColors = exports.useColors(); -+ debug.color = selectColor(namespace); -+ -+ // env-specific initialization logic for debug instances -+ if ('function' === typeof exports.init) { -+ exports.init(debug); -+ } -+ -+ return debug; -+} -+ -+/** -+ * Enables a debug mode by namespaces. This can include modes -+ * separated by a colon and wildcards. -+ * -+ * @param {String} namespaces -+ * @api public -+ */ -+ -+function enable(namespaces) { -+ exports.save(namespaces); -+ -+ exports.names = []; -+ exports.skips = []; -+ -+ var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); -+ var len = split.length; -+ -+ for (var i = 0; i < len; i++) { -+ if (!split[i]) continue; // ignore empty strings -+ namespaces = split[i].replace(/\*/g, '.*?'); -+ if (namespaces[0] === '-') { -+ exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); -+ } else { -+ exports.names.push(new RegExp('^' + namespaces + '$')); -+ } -+ } -+} -+ -+/** -+ * Disable debug output. -+ * -+ * @api public -+ */ -+ -+function disable() { -+ exports.enable(''); -+} -+ -+/** -+ * Returns true if the given mode name is enabled, false otherwise. -+ * -+ * @param {String} name -+ * @return {Boolean} -+ * @api public -+ */ -+ -+function enabled(name) { -+ var i, len; -+ for (i = 0, len = exports.skips.length; i < len; i++) { -+ if (exports.skips[i].test(name)) { -+ return false; -+ } -+ } -+ for (i = 0, len = exports.names.length; i < len; i++) { -+ if (exports.names[i].test(name)) { -+ return true; -+ } -+ } -+ return false; -+} -+ -+/** -+ * Coerce `val`. -+ * -+ * @param {Mixed} val -+ * @return {Mixed} -+ * @api private -+ */ -+ -+function coerce(val) { -+ if (val instanceof Error) return val.stack || val.message; -+ return val; -+} -+ -+}, -+"2SKxAhtyBwlMzQ5nPu7+GbcF8B9k3XQ36cXUikhq5gs=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const keys = { -+ kAvvioBoot: Symbol('fastify.avvioBoot'), -+ kChildren: Symbol('fastify.children'), -+ kBodyLimit: Symbol('fastify.bodyLimit'), -+ kRoutePrefix: Symbol('fastify.routePrefix'), -+ kLogLevel: Symbol('fastify.logLevel'), -+ kLogSerializers: Symbol('fastify.logSerializers'), -+ kHooks: Symbol('fastify.hooks'), -+ kHooksDeprecatedPreParsing: Symbol('fastify.hooks.DeprecatedPreParsing'), -+ kSchemaController: Symbol('fastify.schemaController'), -+ kSchemaHeaders: Symbol('headers-schema'), -+ kSchemaParams: Symbol('params-schema'), -+ kSchemaQuerystring: Symbol('querystring-schema'), -+ kSchemaBody: Symbol('body-schema'), -+ kSchemaResponse: Symbol('response-schema'), -+ kSchemaErrorFormatter: Symbol('fastify.schemaErrorFormatter'), -+ kReplySerializerDefault: Symbol('fastify.replySerializerDefault'), -+ kContentTypeParser: Symbol('fastify.contentTypeParser'), -+ kReply: Symbol('fastify.Reply'), -+ kRequest: Symbol('fastify.Request'), -+ kRequestPayloadStream: Symbol('fastify.RequestPayloadStream'), -+ kCanSetNotFoundHandler: Symbol('fastify.canSetNotFoundHandler'), -+ kFourOhFour: Symbol('fastify.404'), -+ kFourOhFourLevelInstance: Symbol('fastify.404LogLevelInstance'), -+ kFourOhFourContext: Symbol('fastify.404ContextKey'), -+ kDefaultJsonParse: Symbol('fastify.defaultJSONParse'), -+ kReplySerializer: Symbol('fastify.reply.serializer'), -+ kReplyIsError: Symbol('fastify.reply.isError'), -+ kReplyHeaders: Symbol('fastify.reply.headers'), -+ kReplyHasStatusCode: Symbol('fastify.reply.hasStatusCode'), -+ kReplySent: Symbol('fastify.reply.sent'), -+ kReplySentOverwritten: Symbol('fastify.reply.sentOverwritten'), -+ kReplyStartTime: Symbol('fastify.reply.startTime'), -+ kReplyErrorHandlerCalled: Symbol('fastify.reply.errorHandlerCalled'), -+ kReplyIsRunningOnErrorHook: Symbol('fastify.reply.isRunningOnErrorHook'), -+ kSchemaVisited: Symbol('fastify.schemas.visited'), -+ kState: Symbol('fastify.state'), -+ kOptions: Symbol('fastify.options'), -+ kDisableRequestLogging: Symbol('fastify.disableRequestLogging'), -+ kPluginNameChain: Symbol('fastify.pluginNameChain'), -+ // This symbol is only meant to be used for fastify tests and should not be used for any other purpose -+ kTestInternals: Symbol('fastify.testInternals'), -+ kErrorHandler: Symbol('fastify.errorHandler') -+} -+ -+module.exports = keys -+ -+}, -+"2mBLY1MRf7VMWX2wG0y4xUxwvsOC1h9SHxQORgS6ogg=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { promisify } = require('util') -+ -+const fs = process.versions.electron ? require('original-fs') : require('fs') -+const mkdirp = require('mkdirp') -+ -+const promisifiedMethods = [ -+ 'lstat', -+ 'readFile', -+ 'stat', -+ 'writeFile' -+] -+ -+const promisified = {} -+ -+for (const method of Object.keys(fs)) { -+ if (promisifiedMethods.includes(method)) { -+ promisified[method] = promisify(fs[method]) -+ } else { -+ promisified[method] = fs[method] -+ } -+} -+// To make it more like fs-extra -+promisified.mkdirp = promisify(mkdirp) -+promisified.mkdirpSync = mkdirp.sync -+ -+module.exports = promisified -+ -+}, -+"2n/DcO5BwCralPcxSst+P9cpN/OEYHxA/Qy0W/ofLMk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var StreamHelper = require('./stream/StreamHelper'); -+var DataWorker = require('./stream/DataWorker'); -+var utf8 = require('./utf8'); -+var CompressedObject = require('./compressedObject'); -+var GenericWorker = require('./stream/GenericWorker'); -+ -+/** -+ * A simple object representing a file in the zip file. -+ * @constructor -+ * @param {string} name the name of the file -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data -+ * @param {Object} options the options of the file -+ */ -+var ZipObject = function(name, data, options) { -+ this.name = name; -+ this.dir = options.dir; -+ this.date = options.date; -+ this.comment = options.comment; -+ this.unixPermissions = options.unixPermissions; -+ this.dosPermissions = options.dosPermissions; -+ -+ this._data = data; -+ this._dataBinary = options.binary; -+ // keep only the compression -+ this.options = { -+ compression : options.compression, -+ compressionOptions : options.compressionOptions -+ }; -+}; -+ -+ZipObject.prototype = { -+ /** -+ * Create an internal stream for the content of this object. -+ * @param {String} type the type of each chunk. -+ * @return StreamHelper the stream. -+ */ -+ internalStream: function (type) { -+ var result = null, outputType = "string"; -+ try { -+ if (!type) { -+ throw new Error("No output type specified."); -+ } -+ outputType = type.toLowerCase(); -+ var askUnicodeString = outputType === "string" || outputType === "text"; -+ if (outputType === "binarystring" || outputType === "text") { -+ outputType = "string"; -+ } -+ result = this._decompressWorker(); -+ -+ var isUnicodeString = !this._dataBinary; -+ -+ if (isUnicodeString && !askUnicodeString) { -+ result = result.pipe(new utf8.Utf8EncodeWorker()); -+ } -+ if (!isUnicodeString && askUnicodeString) { -+ result = result.pipe(new utf8.Utf8DecodeWorker()); -+ } -+ } catch (e) { -+ result = new GenericWorker("error"); -+ result.error(e); -+ } -+ -+ return new StreamHelper(result, outputType, ""); -+ }, -+ -+ /** -+ * Prepare the content in the asked type. -+ * @param {String} type the type of the result. -+ * @param {Function} onUpdate a function to call on each internal update. -+ * @return Promise the promise of the result. -+ */ -+ async: function (type, onUpdate) { -+ return this.internalStream(type).accumulate(onUpdate); -+ }, -+ -+ /** -+ * Prepare the content as a nodejs stream. -+ * @param {String} type the type of each chunk. -+ * @param {Function} onUpdate a function to call on each internal update. -+ * @return Stream the stream. -+ */ -+ nodeStream: function (type, onUpdate) { -+ return this.internalStream(type || "nodebuffer").toNodejsStream(onUpdate); -+ }, -+ -+ /** -+ * Return a worker for the compressed content. -+ * @private -+ * @param {Object} compression the compression object to use. -+ * @param {Object} compressionOptions the options to use when compressing. -+ * @return Worker the worker. -+ */ -+ _compressWorker: function (compression, compressionOptions) { -+ if ( -+ this._data instanceof CompressedObject && -+ this._data.compression.magic === compression.magic -+ ) { -+ return this._data.getCompressedWorker(); -+ } else { -+ var result = this._decompressWorker(); -+ if(!this._dataBinary) { -+ result = result.pipe(new utf8.Utf8EncodeWorker()); -+ } -+ return CompressedObject.createWorkerFrom(result, compression, compressionOptions); -+ } -+ }, -+ /** -+ * Return a worker for the decompressed content. -+ * @private -+ * @return Worker the worker. -+ */ -+ _decompressWorker : function () { -+ if (this._data instanceof CompressedObject) { -+ return this._data.getContentWorker(); -+ } else if (this._data instanceof GenericWorker) { -+ return this._data; -+ } else { -+ return new DataWorker(this._data); -+ } -+ } -+}; -+ -+var removedMethods = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"]; -+var removedFn = function () { -+ throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide."); -+}; -+ -+for(var i = 0; i < removedMethods.length; i++) { -+ ZipObject.prototype[removedMethods[i]] = removedFn; -+} -+module.exports = ZipObject; -+ -+}, -+"2sOgr1u9Xr0um4SGWC7WHd7GlKn8nWr7NDsYWh+z5Z8=": -+function (require, module, exports, __dirname, __filename) { -+const Range = require('../classes/range') -+const satisfies = (version, range, options) => { -+ try { -+ range = new Range(range, options) -+ } catch (er) { -+ return false -+ } -+ return range.test(version) -+} -+module.exports = satisfies -+ -+}, -+"30nRmN2uRYkBE6W3HOnLYZOXaMdbu1NgSEZTkGRmU3I=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var util = require('util'); -+var visit = require('object-visit'); -+ -+/** -+ * Map `visit` over an array of objects. -+ * -+ * @param {Object} `collection` The context in which to invoke `method` -+ * @param {String} `method` Name of the method to call on `collection` -+ * @param {Object} `arr` Array of objects. -+ */ -+ -+module.exports = function mapVisit(collection, method, val) { -+ if (isObject(val)) { -+ return visit.apply(null, arguments); -+ } -+ -+ if (!Array.isArray(val)) { -+ throw new TypeError('expected an array: ' + util.inspect(val)); -+ } -+ -+ var args = [].slice.call(arguments, 3); -+ -+ for (var i = 0; i < val.length; i++) { -+ var ele = val[i]; -+ if (isObject(ele)) { -+ visit.apply(null, [collection, method, ele].concat(args)); -+ } else { -+ collection[method].apply(collection, [ele].concat(args)); -+ } -+ } -+}; -+ -+function isObject(val) { -+ return val && (typeof val === 'function' || (!Array.isArray(val) && typeof val === 'object')); -+} -+ -+}, -+"30ojQMbw1gZ3W37GleClaVyag0uIOsu9gsvk98y5IWs=": -+function (require, module, exports, __dirname, __filename) { -+var flat = require('flat-tree') -+var rle = require('bitfield-rle') -+var pager = require('memory-pager') -+var bitfield = require('sparse-bitfield') -+ -+var INDEX_UPDATE_MASK = [63, 207, 243, 252] -+var INDEX_ITERATE_MASK = [0, 192, 240, 252] -+var DATA_ITERATE_MASK = [128, 192, 224, 240, 248, 252, 254, 255] -+var DATA_UPDATE_MASK = [127, 191, 223, 239, 247, 251, 253, 254] -+var MAP_PARENT_RIGHT = new Array(256) -+var MAP_PARENT_LEFT = new Array(256) -+var NEXT_DATA_0_BIT = new Array(256) -+var NEXT_INDEX_0_BIT = new Array(256) -+var TOTAL_1_BITS = new Array(256) -+ -+for (var i = 0; i < 256; i++) { -+ var a = (i & (15 << 4)) >> 4 -+ var b = i & 15 -+ var nibble = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4] -+ MAP_PARENT_RIGHT[i] = ((a === 15 ? 3 : a === 0 ? 0 : 1) << 2) | (b === 15 ? 3 : b === 0 ? 0 : 1) -+ MAP_PARENT_LEFT[i] = MAP_PARENT_RIGHT[i] << 4 -+ NEXT_DATA_0_BIT[i] = i === 255 ? -1 : (8 - Math.ceil(Math.log(256 - i) / Math.log(2))) -+ NEXT_INDEX_0_BIT[i] = i === 255 ? -1 : Math.floor(NEXT_DATA_0_BIT[i] / 2) -+ TOTAL_1_BITS[i] = nibble[i >> 4] + nibble[i & 0x0F] -+} -+ -+module.exports = Bitfield -+ -+function Bitfield (pageSize, pages) { -+ if (!(this instanceof Bitfield)) return new Bitfield(pageSize, pages) -+ if (!pageSize) pageSize = 2048 + 1024 + 512 -+ -+ var deduplicate = Buffer.allocUnsafe(pageSize) -+ deduplicate.fill(255) -+ -+ this.indexSize = pageSize - 2048 - 1024 -+ this.pages = pager(pageSize, { deduplicate }) -+ -+ if (pages) { -+ for (var i = 0; i < pages.length; i++) { -+ this.pages.set(i, pages[i]) -+ } -+ } -+ -+ this.data = bitfield({ -+ pageSize: 1024, -+ pageOffset: 0, -+ pages: this.pages, -+ trackUpdates: true -+ }) -+ -+ this.tree = bitfield({ -+ pageSize: 2048, -+ pageOffset: 1024, -+ pages: this.pages, -+ trackUpdates: true -+ }) -+ -+ this.index = bitfield({ -+ pageSize: this.indexSize, -+ pageOffset: 1024 + 2048, -+ pages: this.pages, -+ trackUpdates: true -+ }) -+ -+ this.length = this.data.length -+ this._iterator = flat.iterator(0) -+} -+ -+Bitfield.prototype.set = function (i, value) { -+ var o = i & 7 -+ i = (i - o) / 8 -+ var v = value ? this.data.getByte(i) | (128 >> o) : this.data.getByte(i) & DATA_UPDATE_MASK[o] -+ -+ if (!this.data.setByte(i, v)) return false -+ this.length = this.data.length -+ this._setIndex(i, v) -+ return true -+} -+ -+Bitfield.prototype.get = function (i) { -+ return this.data.get(i) -+} -+ -+Bitfield.prototype.total = function (start, end) { -+ if (!start || start < 0) start = 0 -+ if (!end) end = this.data.length -+ if (end < start) return 0 -+ if (end > this.data.length) { -+ this._expand(end) -+ } -+ var o = start & 7 -+ var e = end & 7 -+ var pos = (start - o) / 8 -+ var last = (end - e) / 8 -+ var leftMask = (255 - (o ? DATA_ITERATE_MASK[o - 1] : 0)) -+ var rightMask = (e ? DATA_ITERATE_MASK[e - 1] : 0) -+ var byte = this.data.getByte(pos) -+ if (pos === last) { -+ return TOTAL_1_BITS[byte & leftMask & rightMask] -+ } -+ var total = TOTAL_1_BITS[byte & leftMask] -+ for (var i = pos + 1; i < last; i++) { -+ total += TOTAL_1_BITS[this.data.getByte(i)] -+ } -+ total += TOTAL_1_BITS[this.data.getByte(last) & rightMask] -+ return total -+} -+ -+// TODO: use the index to speed this up *a lot* -+Bitfield.prototype.compress = function (start, length) { -+ if (!start && !length) return rle.encode(this.data.toBuffer()) -+ -+ var buf = Buffer.alloc(length) -+ var p = start / this.data.pageSize / 8 -+ var end = p + length / this.data.pageSize / 8 -+ var offset = p * this.data.pageSize -+ -+ for (; p < end; p++) { -+ var page = this.data.pages.get(p, true) -+ if (!page || !page.buffer) continue -+ page.buffer.copy(buf, p * this.data.pageSize - offset, this.data.pageOffset, this.data.pageOffset + this.data.pageSize) -+ } -+ -+ return rle.encode(buf) -+} -+ -+Bitfield.prototype._setIndex = function (i, value) { -+ // (a + b | c + d | e + f | g + h) -+ // -> (a | b | c | d) (e | f | g | h) -+ // -+ -+ var o = i & 3 -+ i = (i - o) / 4 -+ -+ var bitfield = this.index -+ var ite = this._iterator -+ var start = 2 * i -+ var byte = (bitfield.getByte(start) & INDEX_UPDATE_MASK[o]) | (getIndexValue(value) >> (2 * o)) -+ var len = bitfield.length -+ var maxLength = this.pages.length * this.indexSize -+ -+ ite.seek(start) -+ -+ while (ite.index < maxLength && bitfield.setByte(ite.index, byte)) { -+ if (ite.isLeft()) { -+ byte = MAP_PARENT_LEFT[byte] | MAP_PARENT_RIGHT[bitfield.getByte(ite.sibling())] -+ } else { -+ byte = MAP_PARENT_RIGHT[byte] | MAP_PARENT_LEFT[bitfield.getByte(ite.sibling())] -+ } -+ ite.parent() -+ } -+ -+ if (len !== bitfield.length) this._expand(len) -+ -+ return ite.index !== start -+} -+ -+Bitfield.prototype._expand = function (len) { -+ var roots = flat.fullRoots(2 * len) -+ var bitfield = this.index -+ var ite = this._iterator -+ var byte = 0 -+ -+ for (var i = 0; i < roots.length; i++) { -+ ite.seek(roots[i]) -+ byte = bitfield.getByte(ite.index) -+ -+ do { -+ if (ite.isLeft()) { -+ byte = MAP_PARENT_LEFT[byte] | MAP_PARENT_RIGHT[bitfield.getByte(ite.sibling())] -+ } else { -+ byte = MAP_PARENT_RIGHT[byte] | MAP_PARENT_LEFT[bitfield.getByte(ite.sibling())] -+ } -+ } while (setByteNoAlloc(bitfield, ite.parent(), byte)) -+ } -+} -+ -+function setByteNoAlloc (bitfield, i, b) { -+ if (8 * i >= bitfield.length) return false -+ return bitfield.setByte(i, b) -+} -+ -+Bitfield.prototype.iterator = function (start, end) { -+ var ite = new Iterator(this) -+ -+ ite.range(start || 0, end || this.length) -+ ite.seek(0) -+ -+ return ite -+} -+ -+function Iterator (bitfield) { -+ this.start = 0 -+ this.end = 0 -+ -+ this._indexEnd = 0 -+ this._pos = 0 -+ this._byte = 0 -+ this._bitfield = bitfield -+} -+ -+Iterator.prototype.range = function (start, end) { -+ this.start = start -+ this.end = end -+ this._indexEnd = 2 * Math.ceil(end / 32) -+ -+ if (this.end > this._bitfield.length) { -+ this._bitfield._expand(this.end) -+ } -+ -+ return this -+} -+ -+Iterator.prototype.seek = function (offset) { -+ offset += this.start -+ if (offset < this.start) offset = this.start -+ -+ if (offset >= this.end) { -+ this._pos = -1 -+ return this -+ } -+ -+ var o = offset & 7 -+ -+ this._pos = (offset - o) / 8 -+ this._byte = this._bitfield.data.getByte(this._pos) | (o ? DATA_ITERATE_MASK[o - 1] : 0) -+ -+ return this -+} -+ -+Iterator.prototype.random = function () { -+ var i = this.seek(Math.floor(Math.random() * (this.end - this.start))).next() -+ return i === -1 ? this.seek(0).next() : i -+} -+ -+Iterator.prototype.next = function () { -+ if (this._pos === -1) return -1 -+ -+ var dataBitfield = this._bitfield.data -+ var free = NEXT_DATA_0_BIT[this._byte] -+ -+ while (free === -1) { -+ this._byte = dataBitfield.getByte(++this._pos) -+ free = NEXT_DATA_0_BIT[this._byte] -+ -+ if (free === -1) { -+ this._pos = this._skipAhead(this._pos) -+ if (this._pos === -1) return -1 -+ -+ this._byte = dataBitfield.getByte(this._pos) -+ free = NEXT_DATA_0_BIT[this._byte] -+ } -+ } -+ -+ this._byte |= DATA_ITERATE_MASK[free] -+ -+ var n = 8 * this._pos + free -+ return n < this.end ? n : -1 -+} -+ -+Iterator.prototype.peek = function () { -+ if (this._pos === -1) return -1 -+ -+ var free = NEXT_DATA_0_BIT[this._byte] -+ var n = 8 * this._pos + free -+ return n < this.end ? n : -1 -+} -+ -+Iterator.prototype._skipAhead = function (start) { -+ var indexBitfield = this._bitfield.index -+ var treeEnd = this._indexEnd -+ var ite = this._bitfield._iterator -+ var o = start & 3 -+ -+ ite.seek(2 * ((start - o) / 4)) -+ -+ var treeByte = indexBitfield.getByte(ite.index) | INDEX_ITERATE_MASK[o] -+ -+ while (NEXT_INDEX_0_BIT[treeByte] === -1) { -+ if (ite.isLeft()) { -+ ite.next() -+ } else { -+ ite.next() -+ ite.parent() -+ } -+ -+ if (rightSpan(ite) >= treeEnd) { -+ while (rightSpan(ite) >= treeEnd && isParent(ite)) ite.leftChild() -+ if (rightSpan(ite) >= treeEnd) return -1 -+ } -+ -+ treeByte = indexBitfield.getByte(ite.index) -+ } -+ -+ while (ite.factor > 2) { -+ if (NEXT_INDEX_0_BIT[treeByte] < 2) ite.leftChild() -+ else ite.rightChild() -+ -+ treeByte = indexBitfield.getByte(ite.index) -+ } -+ -+ var free = NEXT_INDEX_0_BIT[treeByte] -+ if (free === -1) free = 4 -+ -+ var next = ite.index * 2 + free -+ -+ return next <= start ? start + 1 : next -+} -+ -+function rightSpan (ite) { -+ return ite.index + ite.factor / 2 - 1 -+} -+ -+function isParent (ite) { -+ return ite.index & 1 -+} -+ -+function getIndexValue (n) { -+ switch (n) { -+ case 255: return 192 -+ case 0: return 0 -+ default: return 64 -+ } -+} -+ -+}, -+"36mjBujt88iwRF1cx3LmoKdDgt/L8Z69O+BujzH7+U4=": -+function (require, module, exports, __dirname, __filename) { -+var constants = require('fs-constants') -+var eos = require('end-of-stream') -+var inherits = require('inherits') -+var alloc = Buffer.alloc -+ -+var Readable = require('readable-stream').Readable -+var Writable = require('readable-stream').Writable -+var StringDecoder = require('string_decoder').StringDecoder -+ -+var headers = require('./headers') -+ -+var DMODE = parseInt('755', 8) -+var FMODE = parseInt('644', 8) -+ -+var END_OF_TAR = alloc(1024) -+ -+var noop = function () {} -+ -+var overflow = function (self, size) { -+ size &= 511 -+ if (size) self.push(END_OF_TAR.slice(0, 512 - size)) -+} -+ -+function modeToType (mode) { -+ switch (mode & constants.S_IFMT) { -+ case constants.S_IFBLK: return 'block-device' -+ case constants.S_IFCHR: return 'character-device' -+ case constants.S_IFDIR: return 'directory' -+ case constants.S_IFIFO: return 'fifo' -+ case constants.S_IFLNK: return 'symlink' -+ } -+ -+ return 'file' -+} -+ -+var Sink = function (to) { -+ Writable.call(this) -+ this.written = 0 -+ this._to = to -+ this._destroyed = false -+} -+ -+inherits(Sink, Writable) -+ -+Sink.prototype._write = function (data, enc, cb) { -+ this.written += data.length -+ if (this._to.push(data)) return cb() -+ this._to._drain = cb -+} -+ -+Sink.prototype.destroy = function () { -+ if (this._destroyed) return -+ this._destroyed = true -+ this.emit('close') -+} -+ -+var LinkSink = function () { -+ Writable.call(this) -+ this.linkname = '' -+ this._decoder = new StringDecoder('utf-8') -+ this._destroyed = false -+} -+ -+inherits(LinkSink, Writable) -+ -+LinkSink.prototype._write = function (data, enc, cb) { -+ this.linkname += this._decoder.write(data) -+ cb() -+} -+ -+LinkSink.prototype.destroy = function () { -+ if (this._destroyed) return -+ this._destroyed = true -+ this.emit('close') -+} -+ -+var Void = function () { -+ Writable.call(this) -+ this._destroyed = false -+} -+ -+inherits(Void, Writable) -+ -+Void.prototype._write = function (data, enc, cb) { -+ cb(new Error('No body allowed for this entry')) -+} -+ -+Void.prototype.destroy = function () { -+ if (this._destroyed) return -+ this._destroyed = true -+ this.emit('close') -+} -+ -+var Pack = function (opts) { -+ if (!(this instanceof Pack)) return new Pack(opts) -+ Readable.call(this, opts) -+ -+ this._drain = noop -+ this._finalized = false -+ this._finalizing = false -+ this._destroyed = false -+ this._stream = null -+} -+ -+inherits(Pack, Readable) -+ -+Pack.prototype.entry = function (header, buffer, callback) { -+ if (this._stream) throw new Error('already piping an entry') -+ if (this._finalized || this._destroyed) return -+ -+ if (typeof buffer === 'function') { -+ callback = buffer -+ buffer = null -+ } -+ -+ if (!callback) callback = noop -+ -+ var self = this -+ -+ if (!header.size || header.type === 'symlink') header.size = 0 -+ if (!header.type) header.type = modeToType(header.mode) -+ if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE -+ if (!header.uid) header.uid = 0 -+ if (!header.gid) header.gid = 0 -+ if (!header.mtime) header.mtime = new Date() -+ -+ if (typeof buffer === 'string') buffer = Buffer.from(buffer) -+ if (Buffer.isBuffer(buffer)) { -+ header.size = buffer.length -+ this._encode(header) -+ var ok = this.push(buffer) -+ overflow(self, header.size) -+ if (ok) process.nextTick(callback) -+ else this._drain = callback -+ return new Void() -+ } -+ -+ if (header.type === 'symlink' && !header.linkname) { -+ var linkSink = new LinkSink() -+ eos(linkSink, function (err) { -+ if (err) { // stream was closed -+ self.destroy() -+ return callback(err) -+ } -+ -+ header.linkname = linkSink.linkname -+ self._encode(header) -+ callback() -+ }) -+ -+ return linkSink -+ } -+ -+ this._encode(header) -+ -+ if (header.type !== 'file' && header.type !== 'contiguous-file') { -+ process.nextTick(callback) -+ return new Void() -+ } -+ -+ var sink = new Sink(this) -+ -+ this._stream = sink -+ -+ eos(sink, function (err) { -+ self._stream = null -+ -+ if (err) { // stream was closed -+ self.destroy() -+ return callback(err) -+ } -+ -+ if (sink.written !== header.size) { // corrupting tar -+ self.destroy() -+ return callback(new Error('size mismatch')) -+ } -+ -+ overflow(self, header.size) -+ if (self._finalizing) self.finalize() -+ callback() -+ }) -+ -+ return sink -+} -+ -+Pack.prototype.finalize = function () { -+ if (this._stream) { -+ this._finalizing = true -+ return -+ } -+ -+ if (this._finalized) return -+ this._finalized = true -+ this.push(END_OF_TAR) -+ this.push(null) -+} -+ -+Pack.prototype.destroy = function (err) { -+ if (this._destroyed) return -+ this._destroyed = true -+ -+ if (err) this.emit('error', err) -+ this.emit('close') -+ if (this._stream && this._stream.destroy) this._stream.destroy() -+} -+ -+Pack.prototype._encode = function (header) { -+ if (!header.pax) { -+ var buf = headers.encode(header) -+ if (buf) { -+ this.push(buf) -+ return -+ } -+ } -+ this._encodePax(header) -+} -+ -+Pack.prototype._encodePax = function (header) { -+ var paxHeader = headers.encodePax({ -+ name: header.name, -+ linkname: header.linkname, -+ pax: header.pax -+ }) -+ -+ var newHeader = { -+ name: 'PaxHeader', -+ mode: header.mode, -+ uid: header.uid, -+ gid: header.gid, -+ size: paxHeader.length, -+ mtime: header.mtime, -+ type: 'pax-header', -+ linkname: header.linkname && 'PaxHeader', -+ uname: header.uname, -+ gname: header.gname, -+ devmajor: header.devmajor, -+ devminor: header.devminor -+ } -+ -+ this.push(headers.encode(newHeader)) -+ this.push(paxHeader) -+ overflow(this, paxHeader.length) -+ -+ newHeader.size = header.size -+ newHeader.type = header.type -+ this.push(headers.encode(newHeader)) -+} -+ -+Pack.prototype._read = function (n) { -+ var drain = this._drain -+ this._drain = noop -+ drain() -+} -+ -+module.exports = Pack -+ -+}, -+"39ACJbCXsnMdkJF0m+N8GMQY4tpZBF5U4R1N+As8yuU=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+var es5 = require("./es5"); -+var canEvaluate = typeof navigator == "undefined"; -+ -+var errorObj = {e: {}}; -+var tryCatchTarget; -+var globalObject = typeof self !== "undefined" ? self : -+ typeof window !== "undefined" ? window : -+ typeof global !== "undefined" ? global : -+ this !== undefined ? this : null; -+ -+function tryCatcher() { -+ try { -+ var target = tryCatchTarget; -+ tryCatchTarget = null; -+ return target.apply(this, arguments); -+ } catch (e) { -+ errorObj.e = e; -+ return errorObj; -+ } -+} -+function tryCatch(fn) { -+ tryCatchTarget = fn; -+ return tryCatcher; -+} -+ -+var inherits = function(Child, Parent) { -+ var hasProp = {}.hasOwnProperty; -+ -+ function T() { -+ this.constructor = Child; -+ this.constructor$ = Parent; -+ for (var propertyName in Parent.prototype) { -+ if (hasProp.call(Parent.prototype, propertyName) && -+ propertyName.charAt(propertyName.length-1) !== "$" -+ ) { -+ this[propertyName + "$"] = Parent.prototype[propertyName]; -+ } -+ } -+ } -+ T.prototype = Parent.prototype; -+ Child.prototype = new T(); -+ return Child.prototype; -+}; -+ -+ -+function isPrimitive(val) { -+ return val == null || val === true || val === false || -+ typeof val === "string" || typeof val === "number"; -+ -+} -+ -+function isObject(value) { -+ return typeof value === "function" || -+ typeof value === "object" && value !== null; -+} -+ -+function maybeWrapAsError(maybeError) { -+ if (!isPrimitive(maybeError)) return maybeError; -+ -+ return new Error(safeToString(maybeError)); -+} -+ -+function withAppended(target, appendee) { -+ var len = target.length; -+ var ret = new Array(len + 1); -+ var i; -+ for (i = 0; i < len; ++i) { -+ ret[i] = target[i]; -+ } -+ ret[i] = appendee; -+ return ret; -+} -+ -+function getDataPropertyOrDefault(obj, key, defaultValue) { -+ if (es5.isES5) { -+ var desc = Object.getOwnPropertyDescriptor(obj, key); -+ -+ if (desc != null) { -+ return desc.get == null && desc.set == null -+ ? desc.value -+ : defaultValue; -+ } -+ } else { -+ return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; -+ } -+} -+ -+function notEnumerableProp(obj, name, value) { -+ if (isPrimitive(obj)) return obj; -+ var descriptor = { -+ value: value, -+ configurable: true, -+ enumerable: false, -+ writable: true -+ }; -+ es5.defineProperty(obj, name, descriptor); -+ return obj; -+} -+ -+function thrower(r) { -+ throw r; -+} -+ -+var inheritedDataKeys = (function() { -+ var excludedPrototypes = [ -+ Array.prototype, -+ Object.prototype, -+ Function.prototype -+ ]; -+ -+ var isExcludedProto = function(val) { -+ for (var i = 0; i < excludedPrototypes.length; ++i) { -+ if (excludedPrototypes[i] === val) { -+ return true; -+ } -+ } -+ return false; -+ }; -+ -+ if (es5.isES5) { -+ var getKeys = Object.getOwnPropertyNames; -+ return function(obj) { -+ var ret = []; -+ var visitedKeys = Object.create(null); -+ while (obj != null && !isExcludedProto(obj)) { -+ var keys; -+ try { -+ keys = getKeys(obj); -+ } catch (e) { -+ return ret; -+ } -+ for (var i = 0; i < keys.length; ++i) { -+ var key = keys[i]; -+ if (visitedKeys[key]) continue; -+ visitedKeys[key] = true; -+ var desc = Object.getOwnPropertyDescriptor(obj, key); -+ if (desc != null && desc.get == null && desc.set == null) { -+ ret.push(key); -+ } -+ } -+ obj = es5.getPrototypeOf(obj); -+ } -+ return ret; -+ }; -+ } else { -+ var hasProp = {}.hasOwnProperty; -+ return function(obj) { -+ if (isExcludedProto(obj)) return []; -+ var ret = []; -+ -+ /*jshint forin:false */ -+ enumeration: for (var key in obj) { -+ if (hasProp.call(obj, key)) { -+ ret.push(key); -+ } else { -+ for (var i = 0; i < excludedPrototypes.length; ++i) { -+ if (hasProp.call(excludedPrototypes[i], key)) { -+ continue enumeration; -+ } -+ } -+ ret.push(key); -+ } -+ } -+ return ret; -+ }; -+ } -+ -+})(); -+ -+var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; -+function isClass(fn) { -+ try { -+ if (typeof fn === "function") { -+ var keys = es5.names(fn.prototype); -+ -+ var hasMethods = es5.isES5 && keys.length > 1; -+ var hasMethodsOtherThanConstructor = keys.length > 0 && -+ !(keys.length === 1 && keys[0] === "constructor"); -+ var hasThisAssignmentAndStaticMethods = -+ thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; -+ -+ if (hasMethods || hasMethodsOtherThanConstructor || -+ hasThisAssignmentAndStaticMethods) { -+ return true; -+ } -+ } -+ return false; -+ } catch (e) { -+ return false; -+ } -+} -+ -+function toFastProperties(obj) { -+ /*jshint -W027,-W055,-W031*/ -+ function FakeConstructor() {} -+ FakeConstructor.prototype = obj; -+ var receiver = new FakeConstructor(); -+ function ic() { -+ return typeof receiver.foo; -+ } -+ ic(); -+ ic(); -+ return obj; -+ eval(obj); -+} -+ -+var rident = /^[a-z$_][a-z$_0-9]*$/i; -+function isIdentifier(str) { -+ return rident.test(str); -+} -+ -+function filledRange(count, prefix, suffix) { -+ var ret = new Array(count); -+ for(var i = 0; i < count; ++i) { -+ ret[i] = prefix + i + suffix; -+ } -+ return ret; -+} -+ -+function safeToString(obj) { -+ try { -+ return obj + ""; -+ } catch (e) { -+ return "[no string representation]"; -+ } -+} -+ -+function isError(obj) { -+ return obj instanceof Error || -+ (obj !== null && -+ typeof obj === "object" && -+ typeof obj.message === "string" && -+ typeof obj.name === "string"); -+} -+ -+function markAsOriginatingFromRejection(e) { -+ try { -+ notEnumerableProp(e, "isOperational", true); -+ } -+ catch(ignore) {} -+} -+ -+function originatesFromRejection(e) { -+ if (e == null) return false; -+ return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || -+ e["isOperational"] === true); -+} -+ -+function canAttachTrace(obj) { -+ return isError(obj) && es5.propertyIsWritable(obj, "stack"); -+} -+ -+var ensureErrorObject = (function() { -+ if (!("stack" in new Error())) { -+ return function(value) { -+ if (canAttachTrace(value)) return value; -+ try {throw new Error(safeToString(value));} -+ catch(err) {return err;} -+ }; -+ } else { -+ return function(value) { -+ if (canAttachTrace(value)) return value; -+ return new Error(safeToString(value)); -+ }; -+ } -+})(); -+ -+function classString(obj) { -+ return {}.toString.call(obj); -+} -+ -+function copyDescriptors(from, to, filter) { -+ var keys = es5.names(from); -+ for (var i = 0; i < keys.length; ++i) { -+ var key = keys[i]; -+ if (filter(key)) { -+ try { -+ es5.defineProperty(to, key, es5.getDescriptor(from, key)); -+ } catch (ignore) {} -+ } -+ } -+} -+ -+var asArray = function(v) { -+ if (es5.isArray(v)) { -+ return v; -+ } -+ return null; -+}; -+ -+if (typeof Symbol !== "undefined" && Symbol.iterator) { -+ var ArrayFrom = typeof Array.from === "function" ? function(v) { -+ return Array.from(v); -+ } : function(v) { -+ var ret = []; -+ var it = v[Symbol.iterator](); -+ var itResult; -+ while (!((itResult = it.next()).done)) { -+ ret.push(itResult.value); -+ } -+ return ret; -+ }; -+ -+ asArray = function(v) { -+ if (es5.isArray(v)) { -+ return v; -+ } else if (v != null && typeof v[Symbol.iterator] === "function") { -+ return ArrayFrom(v); -+ } -+ return null; -+ }; -+} -+ -+var isNode = typeof process !== "undefined" && -+ classString(process).toLowerCase() === "[object process]"; -+ -+var hasEnvVariables = typeof process !== "undefined" && -+ typeof process.env !== "undefined"; -+ -+function env(key) { -+ return hasEnvVariables ? process.env[key] : undefined; -+} -+ -+function getNativePromise() { -+ if (typeof Promise === "function") { -+ try { -+ var promise = new Promise(function(){}); -+ if (classString(promise) === "[object Promise]") { -+ return Promise; -+ } -+ } catch (e) {} -+ } -+} -+ -+var reflectHandler; -+function contextBind(ctx, cb) { -+ if (ctx === null || -+ typeof cb !== "function" || -+ cb === reflectHandler) { -+ return cb; -+ } -+ -+ if (ctx.domain !== null) { -+ cb = ctx.domain.bind(cb); -+ } -+ -+ var async = ctx.async; -+ if (async !== null) { -+ var old = cb; -+ cb = function() { -+ var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i - 2];}; -+ args[0] = old; -+ args[1] = this; -+ return async.runInAsyncScope.apply(async, args); -+ }; -+ } -+ return cb; -+} -+ -+var ret = { -+ setReflectHandler: function(fn) { -+ reflectHandler = fn; -+ }, -+ isClass: isClass, -+ isIdentifier: isIdentifier, -+ inheritedDataKeys: inheritedDataKeys, -+ getDataPropertyOrDefault: getDataPropertyOrDefault, -+ thrower: thrower, -+ isArray: es5.isArray, -+ asArray: asArray, -+ notEnumerableProp: notEnumerableProp, -+ isPrimitive: isPrimitive, -+ isObject: isObject, -+ isError: isError, -+ canEvaluate: canEvaluate, -+ errorObj: errorObj, -+ tryCatch: tryCatch, -+ inherits: inherits, -+ withAppended: withAppended, -+ maybeWrapAsError: maybeWrapAsError, -+ toFastProperties: toFastProperties, -+ filledRange: filledRange, -+ toString: safeToString, -+ canAttachTrace: canAttachTrace, -+ ensureErrorObject: ensureErrorObject, -+ originatesFromRejection: originatesFromRejection, -+ markAsOriginatingFromRejection: markAsOriginatingFromRejection, -+ classString: classString, -+ copyDescriptors: copyDescriptors, -+ isNode: isNode, -+ hasEnvVariables: hasEnvVariables, -+ env: env, -+ global: globalObject, -+ getNativePromise: getNativePromise, -+ contextBind: contextBind -+}; -+ret.isRecentNode = ret.isNode && (function() { -+ var version; -+ if (process.versions && process.versions.node) { -+ version = process.versions.node.split(".").map(Number); -+ } else if (process.version) { -+ version = process.version.split(".").map(Number); -+ } -+ return (version[0] === 0 && version[1] > 10) || (version[0] > 0); -+})(); -+ret.nodeSupportsAsyncResource = ret.isNode && (function() { -+ var supportsAsync = false; -+ try { -+ var res = require("async_hooks").AsyncResource; -+ supportsAsync = typeof res.prototype.runInAsyncScope === "function"; -+ } catch (e) { -+ supportsAsync = false; -+ } -+ return supportsAsync; -+})(); -+ -+if (ret.isNode) ret.toFastProperties(process); -+ -+try {throw new Error(); } catch (e) {ret.lastLineError = e;} -+module.exports = ret; -+ -+}, -+"3A+JvbE2d5+ewGLgopY6PsifRXMe7J6AKJB66fnpA00=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = (flag, argv) => { -+ argv = argv || process.argv; -+ const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); -+ const pos = argv.indexOf(prefix + flag); -+ const terminatorPos = argv.indexOf('--'); -+ return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); -+}; -+ -+}, -+"3AmEVsLZq5CkwKF8ypvhZmW5gT3yCQZVOpiwCIoVe+c=": -+function (require, module, exports, __dirname, __filename) { -+/* -+ * Copyright 2009-2011 Mozilla Foundation and contributors -+ * Licensed under the New BSD license. See LICENSE.txt or: -+ * http://opensource.org/licenses/BSD-3-Clause -+ */ -+exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator; -+exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer; -+exports.SourceNode = require('./lib/source-node').SourceNode; -+ -+}, -+"3B6hTddWaKHRbGFK4NGt38tInwAsMjruQp0MDBhLmtQ=": -+function (require, module, exports, __dirname, __filename) { -+var promiseLib = require('./promise.js'); -+var fs = require('fs'); -+var writeShp = require('shp-write').write; -+var shapefile = require('shapefile'); -+var Promise, writeFile; -+ -+exports.setPromiseLib = setPromiseLib; -+ -+exports.toGeoJson = function(fileName, options) { -+ if (!Promise) { setPromiseLib(); } -+ if(!fs.statSync(fileName)) { reject(new Error('Given shapefile does not exist.')); } -+ -+ return shapefile.read(fileName); -+}; -+ -+exports.fromGeoJson = function(geojson, fileName, options) { -+ if (!Promise) { setPromiseLib(); } -+ -+ var esriWKT; -+ if (options) { -+ esriWKT = options.esriWKT; -+ } -+ -+ var promise = new Promise(function(resolve, reject) { -+ try { -+ var geoms = []; -+ var properties = []; -+ geojson.features.forEach(function(feature) { -+ geoms.push(feature.geometry.coordinates); -+ -+ for (var key in feature.properties) { -+ if (feature.properties.hasOwnProperty(key) && !feature.properties[key]) { -+ feature.properties[key] = ' '; -+ } -+ } -+ -+ properties.push(feature.properties); -+ }); -+ -+ var geomType; -+ switch(geojson.features[0].geometry.type.toUpperCase()) { -+ case 'POINT': -+ case 'MULTIPOINT': -+ geomType = 'POINT'; -+ break; -+ case 'LINESTRING': -+ case 'MULTILINESTRING': -+ geomType = 'POLYLINE'; -+ break; -+ case 'POLYGON': -+ case 'MULTIPOLYGON': -+ geomType = 'POLYGON'; -+ break; -+ default: -+ reject(new Error('Given geometry type is not supported')); -+ } -+ -+ writeShp(properties, geomType, geoms, function(err, files) { -+ if (err) { -+ reject(ex); -+ } else { -+ resolve(files); -+ } -+ }); -+ } catch(ex) { -+ reject(ex); -+ } -+ }); -+ -+ return promise.then(function(files) { -+ if (fileName) { -+ var fileNameWithoutExt = fileName; -+ -+ if(fileNameWithoutExt.indexOf('.shp') !== -1) { -+ fileNameWithoutExt = fileNameWithoutExt.replace('.shp', ''); -+ } -+ -+ var writeTasks = [ -+ writeFile(fileNameWithoutExt + '.shp', toBuffer(files.shp.buffer)), -+ writeFile(fileNameWithoutExt + '.shx', toBuffer(files.shx.buffer)), -+ writeFile(fileNameWithoutExt + '.dbf', toBuffer(files.dbf.buffer)) -+ ]; -+ -+ if (esriWKT) { -+ writeTasks.push(writeFile(fileNameWithoutExt + '.prj', esriWKT)); -+ } -+ -+ return Promise.all(writeTasks) -+ .then(function() { -+ return [ -+ fileNameWithoutExt + '.shp', -+ fileNameWithoutExt + '.shx', -+ fileNameWithoutExt + '.dbf' -+ ]; -+ }); -+ } else { -+ var fileData = [ -+ { data: toBuffer(files.shp.buffer), format: 'shp' }, -+ { data: toBuffer(files.shx.buffer), format: 'shx'}, -+ { data: toBuffer(files.dbf.buffer), format: 'dbf'} -+ ]; -+ -+ if (esriWKT) { -+ fileData.push({ data: esriWKT, format: 'prj'}); -+ } -+ -+ return fileData; -+ } -+ }); -+}; -+ -+function toBuffer(ab) { -+ var buffer = new Buffer(ab.byteLength), -+ view = new Uint8Array(ab); -+ for (var i = 0; i < buffer.length; ++i) { buffer[i] = view[i]; } -+ return buffer; -+} -+ -+function setPromiseLib(lib) { -+ Promise = promiseLib.set(lib); -+ writeFile = promiseLib.promisify(fs.writeFile); -+} -+ -+}, -+"3CJAKWNcBhhsLsCwfSmNsdkk5QA9sp7JSoIAazPbQRE=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs') -+var path = require('path') -+var pump = require('pump') -+var RWLock = require('rwlock') -+var through = require('through2') -+var readonly = require('read-only-stream') -+var IndexedTarball = require('./single') -+ -+module.exports = MultiTarball -+ -+function MultiTarball (filepath, opts) { -+ opts = opts || {} -+ -+ this.filepath = filepath -+ this.tarballs = [] -+ this.maxFileSize = opts.maxFileSize || (Math.pow(2, 32) - 1) -+ -+ this.lock = new RWLock() -+ -+ // Find all of the tarballs belonging to the set. -+ this._setupTarballs() -+} -+ -+MultiTarball.prototype.append = function (filepath, size, cb) { -+ if (!cb && typeof size === 'function') { -+ cb = size -+ size = null -+ } -+ var self = this -+ -+ var t = through() -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ // Find the last tarball in the set. -+ self._getLastTarball(function (err, tarball, index) { -+ if (err) return done(err) -+ -+ // Check if the new file to be added will cause the tarball to exceed its -+ // maximum size. -+ tarball.archive.value(function (err, archive) { -+ if (err) return done(err) -+ var totalAddedSize = 512 + roundUp(size, 512) -+ -+ // Overflow into a brand new tarball -+ if (archive.fileSize + totalAddedSize > self.maxFileSize) { -+ var newFilepath = self.filepath + '.' + (index + 1) -+ tarball = new IndexedTarball(newFilepath) -+ self.tarballs.push(tarball) -+ } -+ -+ var ws = tarball.append(filepath, done) -+ t.pipe(ws) -+ }) -+ }) -+ }) -+ -+ return t -+} -+ -+MultiTarball.prototype.list = function (cb) { -+ var self = this -+ this.lock.readLock(function (release) { -+ var error -+ var pending = self.tarballs.length -+ var res = {} -+ -+ self.tarballs.forEach(list) -+ -+ function done (err) { -+ error = err || error -+ pending-- -+ if (!pending) { -+ release() -+ cb(error, error ? undefined : Object.keys(res)) -+ } -+ } -+ -+ function list (tarball) { -+ tarball.list(function (err, files) { -+ if (err) return done(err) -+ for (var idx in files) { -+ res[files[idx]] = true -+ } -+ done() -+ }) -+ } -+ }) -+} -+ -+MultiTarball.prototype.read = function (filepath) { -+ var self = this -+ var stream = through() -+ -+ this.lock.readLock(function (release) { -+ self._getFullIndex(function (err, index) { -+ if (err) stream.emit('error', err) -+ else if (!index[filepath]) stream.emit('error', new Error('not found')) -+ else { -+ pump(index[filepath].tarball.read(filepath), stream, function (err) { -+ if (err) stream.emit('error', err) -+ }) -+ } -+ release() -+ }) -+ }) -+ -+ return readonly(stream) -+} -+ -+MultiTarball.prototype.pop = function (cb) { -+ var self = this -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ self._getLastPopulatedTarball(function (err, tarball) { -+ if (err) return done(err) -+ else if (!tarball) return done() -+ tarball.pop(done) -+ }) -+ }) -+} -+ -+MultiTarball.prototype.userdata = function (data, cb) { -+ if (data && !cb && typeof data === 'function') { -+ cb = data -+ data = null -+ } -+ var self = this -+ -+ this.lock.writeLock(function (release) { -+ function done (err, res) { -+ release() -+ cb(err, res) -+ } -+ -+ self._getLastPopulatedTarball(function (err, tarball) { -+ if (err) return done(err) -+ else if (!tarball) return done() -+ tarball.userdata(data, done) -+ }) -+ }) -+} -+ -+MultiTarball.prototype._setupTarballs = function (cb) { -+ var self = this -+ cb = cb || noop -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ var dir = path.dirname(self.filepath) -+ fs.readdir(dir, function (err, contents) { -+ if (err) return done(err) -+ // TODO: test that the sort function is working & these are in order -+ self.tarballs = contents -+ .filter(function (name) { return parseIndexFromFilename(name) !== null }) -+ .map(function (name) { return new IndexedTarball(name) }) -+ .sort(tarballCmp) -+ done() -+ }) -+ }) -+} -+ -+// Returns the final tarball in the set. A new one will be created if it doesn't exist. -+MultiTarball.prototype._getLastTarball = function (cb) { -+ cb = cb || noop -+ var tarball -+ -+ if (!this.tarballs.length) { -+ tarball = new IndexedTarball(this.filepath) -+ this.tarballs.push(tarball) -+ cb(null, tarball, 0) -+ } else { -+ tarball = this.tarballs[this.tarballs.length - 1] -+ var index = parseIndexFromFilename(tarball.filepath) -+ cb(null, tarball, index) -+ } -+} -+ -+// Returns the final *populated* tarball in the set. Returns 'null' if none are -+// populated. -+MultiTarball.prototype._getLastPopulatedTarball = function (cb) { -+ cb = cb || noop -+ var self = this -+ var tarball -+ -+ ;(function checkPrevious (idx) { -+ if (idx < 0) return cb(null) // all empty tarballs! -+ tarball = self.tarballs[idx] -+ tarball.archive.value(function (err, meta) { -+ if (err) return cb(err) -+ if (meta && meta.index && Object.keys(meta.index).length > 0) { -+ var index = parseIndexFromFilename(tarball.filepath) -+ cb(null, tarball, index) -+ } else { -+ checkPrevious(idx - 1) -+ } -+ }) -+ })(this.tarballs.length - 1) -+} -+ -+// Read the index of *all* tarballs to build a full index. -+MultiTarball.prototype._getFullIndex = function (cb) { -+ var self = this -+ var index = {} -+ -+ // Process tarballs *in order*. This is necessary to avoid earlier duplicate -+ // filenames overwriting newer ones. -+ ;(function next (idx) { -+ if (idx >= self.tarballs.length) return cb(null, index) -+ -+ var tarball = self.tarballs[idx] -+ tarball.archive.value(function (err, _meta) { -+ if (err) return cb(err) -+ var _index = _meta.index -+ for (var key in _index) { -+ index[key] = Object.assign({}, _index[key]) -+ index[key].tarball = tarball -+ } -+ next(idx + 1) -+ }) -+ })(0) -+} -+ -+function noop () {} -+ -+// Compares two IndexedTarball instances; sorting them so that the biggest indexed tarball filename comes last. -+function tarballCmp (a, b) { -+ var an = parseIndexFromFilename(a.filepath) -+ var bn = parseIndexFromFilename(b.filepath) -+ if (an === null || bn === null) return 0 -+ if (an < bn) return -1 -+ else if (an > bn) return 1 -+ else return 0 -+} -+ -+// "foobar.tar.2" => 2 -+// "foobar.tar.3" => 3 -+// "foobar.tar" => 0 -+// "foobar.tar.hi" => null -+function parseIndexFromFilename (filename) { -+ if (/\.tar\.[0-9]+$/.test(filename)) { -+ try { -+ return parseInt(filename.match(/\.tar\.([0-9]+)$/)[1]) -+ } catch (e) { -+ return null -+ } -+ } else { -+ return 0 -+ } -+} -+ -+function roundUp (n, nearest) { -+ var more = 512 - (n % nearest) -+ return n + more -+} -+ -+}, -+"3DQYWedo3Q5qAZkFtzfd+wyPCCeG77IQ7r+0Yackl5Q=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const fastClone = require('rfdc')({ circles: false, proto: true }) -+const { kSchemaVisited } = require('./symbols') -+const kFluentSchema = Symbol.for('fluent-schema-object') -+ -+const { -+ FST_ERR_SCH_MISSING_ID, -+ FST_ERR_SCH_ALREADY_PRESENT, -+ FST_ERR_SCH_DUPLICATE -+} = require('./errors') -+ -+const SCHEMAS_SOURCE = ['params', 'body', 'querystring', 'query', 'headers'] -+ -+function Schemas (initStore) { -+ this.store = initStore || {} -+} -+ -+Schemas.prototype.add = function (inputSchema) { -+ const schema = fastClone((inputSchema.isFluentSchema || inputSchema.isFluentJSONSchema || inputSchema[kFluentSchema]) -+ ? inputSchema.valueOf() -+ : inputSchema -+ ) -+ -+ // devs can add schemas without $id, but with $def instead -+ const id = schema.$id -+ if (!id) { -+ throw new FST_ERR_SCH_MISSING_ID() -+ } -+ -+ if (this.store[id]) { -+ throw new FST_ERR_SCH_ALREADY_PRESENT(id) -+ } -+ -+ this.store[id] = schema -+} -+ -+Schemas.prototype.getSchemas = function () { -+ return Object.assign({}, this.store) -+} -+ -+Schemas.prototype.getSchema = function (schemaId) { -+ return this.store[schemaId] -+} -+ -+function normalizeSchema (routeSchemas) { -+ if (routeSchemas[kSchemaVisited]) { -+ return routeSchemas -+ } -+ -+ // alias query to querystring schema -+ if (routeSchemas.query) { -+ // check if our schema has both querystring and query -+ if (routeSchemas.querystring) { -+ throw new FST_ERR_SCH_DUPLICATE('querystring') -+ } -+ routeSchemas.querystring = routeSchemas.query -+ } -+ -+ generateFluentSchema(routeSchemas) -+ -+ // let's check if our schemas have a custom prototype -+ for (const key of ['headers', 'querystring', 'params', 'body']) { -+ if (typeof routeSchemas[key] === 'object' && Object.getPrototypeOf(routeSchemas[key]) !== Object.prototype) { -+ return routeSchemas -+ } -+ } -+ -+ if (routeSchemas.body) { -+ routeSchemas.body = getSchemaAnyway(routeSchemas.body) -+ } -+ -+ if (routeSchemas.headers) { -+ routeSchemas.headers = getSchemaAnyway(routeSchemas.headers) -+ } -+ -+ if (routeSchemas.querystring) { -+ routeSchemas.querystring = getSchemaAnyway(routeSchemas.querystring) -+ } -+ -+ if (routeSchemas.params) { -+ routeSchemas.params = getSchemaAnyway(routeSchemas.params) -+ } -+ -+ if (routeSchemas.response) { -+ const httpCodes = Object.keys(routeSchemas.response) -+ for (const code of httpCodes) { -+ routeSchemas.response[code] = getSchemaAnyway(routeSchemas.response[code]) -+ } -+ } -+ -+ routeSchemas[kSchemaVisited] = true -+ return routeSchemas -+} -+ -+function generateFluentSchema (schema) { -+ for (const key of SCHEMAS_SOURCE) { -+ if (schema[key] && (schema[key].isFluentSchema || schema[key][kFluentSchema])) { -+ schema[key] = schema[key].valueOf() -+ } -+ } -+ -+ if (schema.response) { -+ const httpCodes = Object.keys(schema.response) -+ for (const code of httpCodes) { -+ if (schema.response[code].isFluentSchema || schema.response[code][kFluentSchema]) { -+ schema.response[code] = schema.response[code].valueOf() -+ } -+ } -+ } -+} -+ -+function getSchemaAnyway (schema) { -+ if (schema.$ref || schema.oneOf || schema.allOf || schema.anyOf || schema.$merge || schema.$patch) return schema -+ if (!schema.type && !schema.properties) { -+ return { -+ type: 'object', -+ properties: schema -+ } -+ } -+ return schema -+} -+ -+module.exports = { -+ buildSchemas (initStore) { return new Schemas(initStore) }, -+ normalizeSchema -+} -+ -+}, -+"3Eb1bM1CgAVqNEk3FRTIdxKO921DxPG14SYRONjgQr8=": -+function (require, module, exports, __dirname, __filename) { -+var write = require('./write'), -+ geojson = require('./geojson'), -+ prj = require('./prj'), -+ JSZip = require('jszip'); -+ -+module.exports = function(gj, options) { -+ -+ var zip = new JSZip(), -+ layers = zip.folder(options && options.folder ? options.folder : 'layers'); -+ -+ [geojson.point(gj), geojson.line(gj), geojson.polygon(gj)] -+ .forEach(function(l) { -+ if (l.geometries.length && l.geometries[0].length) { -+ write( -+ // field definitions -+ l.properties, -+ // geometry type -+ l.type, -+ // geometries -+ l.geometries, -+ function(err, files) { -+ var fileName = options && options.types[l.type.toLowerCase()] ? options.types[l.type.toLowerCase()] : l.type; -+ layers.file(fileName + '.shp', files.shp.buffer, { binary: true }); -+ layers.file(fileName + '.shx', files.shx.buffer, { binary: true }); -+ layers.file(fileName + '.dbf', files.dbf.buffer, { binary: true }); -+ layers.file(fileName + '.prj', prj); -+ }); -+ } -+ }); -+ -+ var generateOptions = { compression:'STORE' }; -+ -+ if (!process.browser) { -+ generateOptions.type = 'nodebuffer'; -+ } -+ -+ return zip.generate(generateOptions); -+}; -+ -+}, -+"3H4svKrPegvFEYv535qRaD66Ur8QWZS2XqHevmn45Fc=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * has-value -+ * -+ * Copyright (c) 2014-2016, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var isObject = require('isobject'); -+var hasValues = require('has-values'); -+var get = require('get-value'); -+ -+module.exports = function(obj, prop, noZero) { -+ if (isObject(obj)) { -+ return hasValues(get(obj, prop), noZero); -+ } -+ return hasValues(obj, prop); -+}; -+ -+}, -+"3Inq13BpMjkKklX7xFnV42ADfNkc/MeG4U9OMaTYf7c=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var splitString = require('split-string'); -+var utils = module.exports; -+ -+/** -+ * Module dependencies -+ */ -+ -+utils.extend = require('extend-shallow'); -+utils.flatten = require('arr-flatten'); -+utils.isObject = require('isobject'); -+utils.fillRange = require('fill-range'); -+utils.repeat = require('repeat-element'); -+utils.unique = require('array-unique'); -+ -+utils.define = function(obj, key, val) { -+ Object.defineProperty(obj, key, { -+ writable: true, -+ configurable: true, -+ enumerable: false, -+ value: val -+ }); -+}; -+ -+/** -+ * Returns true if the given string contains only empty brace sets. -+ */ -+ -+utils.isEmptySets = function(str) { -+ return /^(?:\{,\})+$/.test(str); -+}; -+ -+/** -+ * Returns true if the given string contains only empty brace sets. -+ */ -+ -+utils.isQuotedString = function(str) { -+ var open = str.charAt(0); -+ if (open === '\'' || open === '"' || open === '`') { -+ return str.slice(-1) === open; -+ } -+ return false; -+}; -+ -+/** -+ * Create the key to use for memoization. The unique key is generated -+ * by iterating over the options and concatenating key-value pairs -+ * to the pattern string. -+ */ -+ -+utils.createKey = function(pattern, options) { -+ var id = pattern; -+ if (typeof options === 'undefined') { -+ return id; -+ } -+ var keys = Object.keys(options); -+ for (var i = 0; i < keys.length; i++) { -+ var key = keys[i]; -+ id += ';' + key + '=' + String(options[key]); -+ } -+ return id; -+}; -+ -+/** -+ * Normalize options -+ */ -+ -+utils.createOptions = function(options) { -+ var opts = utils.extend.apply(null, arguments); -+ if (typeof opts.expand === 'boolean') { -+ opts.optimize = !opts.expand; -+ } -+ if (typeof opts.optimize === 'boolean') { -+ opts.expand = !opts.optimize; -+ } -+ if (opts.optimize === true) { -+ opts.makeRe = true; -+ } -+ return opts; -+}; -+ -+/** -+ * Join patterns in `a` to patterns in `b` -+ */ -+ -+utils.join = function(a, b, options) { -+ options = options || {}; -+ a = utils.arrayify(a); -+ b = utils.arrayify(b); -+ -+ if (!a.length) return b; -+ if (!b.length) return a; -+ -+ var len = a.length; -+ var idx = -1; -+ var arr = []; -+ -+ while (++idx < len) { -+ var val = a[idx]; -+ if (Array.isArray(val)) { -+ for (var i = 0; i < val.length; i++) { -+ val[i] = utils.join(val[i], b, options); -+ } -+ arr.push(val); -+ continue; -+ } -+ -+ for (var j = 0; j < b.length; j++) { -+ var bval = b[j]; -+ -+ if (Array.isArray(bval)) { -+ arr.push(utils.join(val, bval, options)); -+ } else { -+ arr.push(val + bval); -+ } -+ } -+ } -+ return arr; -+}; -+ -+/** -+ * Split the given string on `,` if not escaped. -+ */ -+ -+utils.split = function(str, options) { -+ var opts = utils.extend({sep: ','}, options); -+ if (typeof opts.keepQuotes !== 'boolean') { -+ opts.keepQuotes = true; -+ } -+ if (opts.unescape === false) { -+ opts.keepEscaping = true; -+ } -+ return splitString(str, opts, utils.escapeBrackets(opts)); -+}; -+ -+/** -+ * Expand ranges or sets in the given `pattern`. -+ * -+ * @param {String} `str` -+ * @param {Object} `options` -+ * @return {Object} -+ */ -+ -+utils.expand = function(str, options) { -+ var opts = utils.extend({rangeLimit: 10000}, options); -+ var segs = utils.split(str, opts); -+ var tok = { segs: segs }; -+ -+ if (utils.isQuotedString(str)) { -+ return tok; -+ } -+ -+ if (opts.rangeLimit === true) { -+ opts.rangeLimit = 10000; -+ } -+ -+ if (segs.length > 1) { -+ if (opts.optimize === false) { -+ tok.val = segs[0]; -+ return tok; -+ } -+ -+ tok.segs = utils.stringifyArray(tok.segs); -+ } else if (segs.length === 1) { -+ var arr = str.split('..'); -+ -+ if (arr.length === 1) { -+ tok.val = tok.segs[tok.segs.length - 1] || tok.val || str; -+ tok.segs = []; -+ return tok; -+ } -+ -+ if (arr.length === 2 && arr[0] === arr[1]) { -+ tok.escaped = true; -+ tok.val = arr[0]; -+ tok.segs = []; -+ return tok; -+ } -+ -+ if (arr.length > 1) { -+ if (opts.optimize !== false) { -+ opts.optimize = true; -+ delete opts.expand; -+ } -+ -+ if (opts.optimize !== true) { -+ var min = Math.min(arr[0], arr[1]); -+ var max = Math.max(arr[0], arr[1]); -+ var step = arr[2] || 1; -+ -+ if (opts.rangeLimit !== false && ((max - min) / step >= opts.rangeLimit)) { -+ throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.'); -+ } -+ } -+ -+ arr.push(opts); -+ tok.segs = utils.fillRange.apply(null, arr); -+ -+ if (!tok.segs.length) { -+ tok.escaped = true; -+ tok.val = str; -+ return tok; -+ } -+ -+ if (opts.optimize === true) { -+ tok.segs = utils.stringifyArray(tok.segs); -+ } -+ -+ if (tok.segs === '') { -+ tok.val = str; -+ } else { -+ tok.val = tok.segs[0]; -+ } -+ return tok; -+ } -+ } else { -+ tok.val = str; -+ } -+ return tok; -+}; -+ -+/** -+ * Ensure commas inside brackets and parens are not split. -+ * @param {Object} `tok` Token from the `split-string` module -+ * @return {undefined} -+ */ -+ -+utils.escapeBrackets = function(options) { -+ return function(tok) { -+ if (tok.escaped && tok.val === 'b') { -+ tok.val = '\\b'; -+ return; -+ } -+ -+ if (tok.val !== '(' && tok.val !== '[') return; -+ var opts = utils.extend({}, options); -+ var brackets = []; -+ var parens = []; -+ var stack = []; -+ var val = tok.val; -+ var str = tok.str; -+ var i = tok.idx - 1; -+ -+ while (++i < str.length) { -+ var ch = str[i]; -+ -+ if (ch === '\\') { -+ val += (opts.keepEscaping === false ? '' : ch) + str[++i]; -+ continue; -+ } -+ -+ if (ch === '(') { -+ parens.push(ch); -+ stack.push(ch); -+ } -+ -+ if (ch === '[') { -+ brackets.push(ch); -+ stack.push(ch); -+ } -+ -+ if (ch === ')') { -+ parens.pop(); -+ stack.pop(); -+ if (!stack.length) { -+ val += ch; -+ break; -+ } -+ } -+ -+ if (ch === ']') { -+ brackets.pop(); -+ stack.pop(); -+ if (!stack.length) { -+ val += ch; -+ break; -+ } -+ } -+ val += ch; -+ } -+ -+ tok.split = false; -+ tok.val = val.slice(1); -+ tok.idx = i; -+ }; -+}; -+ -+/** -+ * Returns true if the given string looks like a regex quantifier -+ * @return {Boolean} -+ */ -+ -+utils.isQuantifier = function(str) { -+ return /^(?:[0-9]?,[0-9]|[0-9],)$/.test(str); -+}; -+ -+/** -+ * Cast `val` to an array. -+ * @param {*} `val` -+ */ -+ -+utils.stringifyArray = function(arr) { -+ return [utils.arrayify(arr).join('|')]; -+}; -+ -+/** -+ * Cast `val` to an array. -+ * @param {*} `val` -+ */ -+ -+utils.arrayify = function(arr) { -+ if (typeof arr === 'undefined') { -+ return []; -+ } -+ if (typeof arr === 'string') { -+ return [arr]; -+ } -+ return arr; -+}; -+ -+/** -+ * Returns true if the given `str` is a non-empty string -+ * @return {Boolean} -+ */ -+ -+utils.isString = function(str) { -+ return str != null && typeof str === 'string'; -+}; -+ -+/** -+ * Get the last element from `array` -+ * @param {Array} `array` -+ * @return {*} -+ */ -+ -+utils.last = function(arr, n) { -+ return arr[arr.length - (n || 1)]; -+}; -+ -+utils.escapeRegex = function(str) { -+ return str.replace(/\\?([!^*?()[\]{}+?/])/g, '\\$1'); -+}; -+ -+}, -+"3Jv8J0AgvrgK3FFpZhlgvr6Gi/1+rjmPdkFMpvtNmWE=": -+function (require, module, exports, __dirname, __filename) { -+const types = require('./types'); -+const sets = require('./sets'); -+ -+ -+const CTRL = '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?'; -+const SLSH = { '0': 0, 't': 9, 'n': 10, 'v': 11, 'f': 12, 'r': 13 }; -+ -+/** -+ * Finds character representations in str and convert all to -+ * their respective characters -+ * -+ * @param {String} str -+ * @return {String} -+ */ -+exports.strToChars = function(str) { -+ /* jshint maxlen: false */ -+ var chars_regex = /(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z[\\\]^?])|([0tnvfr]))/g; -+ str = str.replace(chars_regex, function(s, b, lbs, a16, b16, c8, dctrl, eslsh) { -+ if (lbs) { -+ return s; -+ } -+ -+ var code = b ? 8 : -+ a16 ? parseInt(a16, 16) : -+ b16 ? parseInt(b16, 16) : -+ c8 ? parseInt(c8, 8) : -+ dctrl ? CTRL.indexOf(dctrl) : -+ SLSH[eslsh]; -+ -+ var c = String.fromCharCode(code); -+ -+ // Escape special regex characters. -+ if (/[[\]{}^$.|?*+()]/.test(c)) { -+ c = '\\' + c; -+ } -+ -+ return c; -+ }); -+ -+ return str; -+}; -+ -+ -+/** -+ * turns class into tokens -+ * reads str until it encounters a ] not preceeded by a \ -+ * -+ * @param {String} str -+ * @param {String} regexpStr -+ * @return {Array., Number>} -+ */ -+exports.tokenizeClass = (str, regexpStr) => { -+ /* jshint maxlen: false */ -+ var tokens = []; -+ var regexp = /\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?([^])/g; -+ var rs, c; -+ -+ -+ while ((rs = regexp.exec(str)) != null) { -+ if (rs[1]) { -+ tokens.push(sets.words()); -+ -+ } else if (rs[2]) { -+ tokens.push(sets.ints()); -+ -+ } else if (rs[3]) { -+ tokens.push(sets.whitespace()); -+ -+ } else if (rs[4]) { -+ tokens.push(sets.notWords()); -+ -+ } else if (rs[5]) { -+ tokens.push(sets.notInts()); -+ -+ } else if (rs[6]) { -+ tokens.push(sets.notWhitespace()); -+ -+ } else if (rs[7]) { -+ tokens.push({ -+ type: types.RANGE, -+ from: (rs[8] || rs[9]).charCodeAt(0), -+ to: rs[10].charCodeAt(0), -+ }); -+ -+ } else if ((c = rs[12])) { -+ tokens.push({ -+ type: types.CHAR, -+ value: c.charCodeAt(0), -+ }); -+ -+ } else { -+ return [tokens, regexp.lastIndex]; -+ } -+ } -+ -+ exports.error(regexpStr, 'Unterminated character class'); -+}; -+ -+ -+/** -+ * Shortcut to throw errors. -+ * -+ * @param {String} regexp -+ * @param {String} msg -+ */ -+exports.error = (regexp, msg) => { -+ throw new SyntaxError('Invalid regular expression: /' + regexp + '/: ' + msg); -+}; -+ -+}, -+"3PxLalQ0UFykDCZUS9pghU3kMOxN11j9aO3fb/J23ig=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function (work, noauto) { -+ var ready = false -+ var fns = [] -+ -+ var startWork = function () { -+ process.nextTick(function () { -+ work(function () { -+ ready = true -+ fns.forEach(process.nextTick) -+ }) -+ }) -+ } -+ -+ if (!noauto) startWork() // default behaviour -+ -+ return function (fn) { -+ if (noauto) { // start on first invocation -+ noauto = false -+ startWork() -+ } -+ -+ if (!ready) fns.push(fn) -+ else process.nextTick(fn) -+ } -+} -+ -+ -+}, -+"3R3sbFEM0H55bGuht0bPHvxO7VfHnveQQX1QSX7prwI=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var resolve = require('./resolve'); -+ -+module.exports = { -+ Validation: errorSubclass(ValidationError), -+ MissingRef: errorSubclass(MissingRefError) -+}; -+ -+ -+function ValidationError(errors) { -+ this.message = 'validation failed'; -+ this.errors = errors; -+ this.ajv = this.validation = true; -+} -+ -+ -+MissingRefError.message = function (baseId, ref) { -+ return 'can\'t resolve reference ' + ref + ' from id ' + baseId; -+}; -+ -+ -+function MissingRefError(baseId, ref, message) { -+ this.message = message || MissingRefError.message(baseId, ref); -+ this.missingRef = resolve.url(baseId, ref); -+ this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef)); -+} -+ -+ -+function errorSubclass(Subclass) { -+ Subclass.prototype = Object.create(Error.prototype); -+ Subclass.prototype.constructor = Subclass; -+ return Subclass; -+} -+ -+}, -+"3UF5VNcF22nqwwRfbftV4mrwcdjb5TkqfzbO6G8kBNk=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = -+ function(Promise, PromiseArray, debug) { -+var PromiseInspection = Promise.PromiseInspection; -+var util = require("./util"); -+ -+function SettledPromiseArray(values) { -+ this.constructor$(values); -+} -+util.inherits(SettledPromiseArray, PromiseArray); -+ -+SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { -+ this._values[index] = inspection; -+ var totalResolved = ++this._totalResolved; -+ if (totalResolved >= this._length) { -+ this._resolve(this._values); -+ return true; -+ } -+ return false; -+}; -+ -+SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { -+ var ret = new PromiseInspection(); -+ ret._bitField = 33554432; -+ ret._settledValueField = value; -+ return this._promiseResolved(index, ret); -+}; -+SettledPromiseArray.prototype._promiseRejected = function (reason, index) { -+ var ret = new PromiseInspection(); -+ ret._bitField = 16777216; -+ ret._settledValueField = reason; -+ return this._promiseResolved(index, ret); -+}; -+ -+Promise.settle = function (promises) { -+ debug.deprecated(".settle()", ".reflect()"); -+ return new SettledPromiseArray(promises).promise(); -+}; -+ -+Promise.allSettled = function (promises) { -+ return new SettledPromiseArray(promises).promise(); -+}; -+ -+Promise.prototype.settle = function () { -+ return Promise.settle(this); -+}; -+}; -+ -+}, -+"3Yfz6/UrnqBi380Wh0o4y+RJY6kcSzIQ1SnWZTbr20U=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const types = require('./types') -+const rcodes = require('./rcodes') -+const opcodes = require('./opcodes') -+const classes = require('./classes') -+const ip = require('ip') -+const Buffer = require('safe-buffer').Buffer -+ -+const QUERY_FLAG = 0 -+const RESPONSE_FLAG = 1 << 15 -+const FLUSH_MASK = 1 << 15 -+const NOT_FLUSH_MASK = ~FLUSH_MASK -+const QU_MASK = 1 << 15 -+const NOT_QU_MASK = ~QU_MASK -+ -+const name = exports.txt = exports.name = {} -+ -+name.encode = function (str, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(name.encodingLength(str)) -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ -+ // strip leading and trailing . -+ const n = str.replace(/^\.|\.$/gm, '') -+ if (n.length) { -+ const list = n.split('.') -+ -+ for (let i = 0; i < list.length; i++) { -+ const len = buf.write(list[i], offset + 1) -+ buf[offset] = len -+ offset += len + 1 -+ } -+ } -+ -+ buf[offset++] = 0 -+ -+ name.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+name.encode.bytes = 0 -+ -+name.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const list = [] -+ const oldOffset = offset -+ let len = buf[offset++] -+ -+ if (len === 0) { -+ name.decode.bytes = 1 -+ return '.' -+ } -+ if (len >= 0xc0) { -+ const res = name.decode(buf, buf.readUInt16BE(offset - 1) - 0xc000) -+ name.decode.bytes = 2 -+ return res -+ } -+ -+ while (len) { -+ if (len >= 0xc0) { -+ list.push(name.decode(buf, buf.readUInt16BE(offset - 1) - 0xc000)) -+ offset++ -+ break -+ } -+ -+ list.push(buf.toString('utf-8', offset, offset + len)) -+ offset += len -+ len = buf[offset++] -+ } -+ -+ name.decode.bytes = offset - oldOffset -+ return list.join('.') -+} -+ -+name.decode.bytes = 0 -+ -+name.encodingLength = function (n) { -+ if (n === '.') return 1 -+ return Buffer.byteLength(n) + 2 -+} -+ -+const string = {} -+ -+string.encode = function (s, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(string.encodingLength(s)) -+ if (!offset) offset = 0 -+ -+ const len = buf.write(s, offset + 1) -+ buf[offset] = len -+ string.encode.bytes = len + 1 -+ return buf -+} -+ -+string.encode.bytes = 0 -+ -+string.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const len = buf[offset] -+ const s = buf.toString('utf-8', offset + 1, offset + 1 + len) -+ string.decode.bytes = len + 1 -+ return s -+} -+ -+string.decode.bytes = 0 -+ -+string.encodingLength = function (s) { -+ return Buffer.byteLength(s) + 1 -+} -+ -+const header = {} -+ -+header.encode = function (h, buf, offset) { -+ if (!buf) buf = header.encodingLength(h) -+ if (!offset) offset = 0 -+ -+ const flags = (h.flags || 0) & 32767 -+ const type = h.type === 'response' ? RESPONSE_FLAG : QUERY_FLAG -+ -+ buf.writeUInt16BE(h.id || 0, offset) -+ buf.writeUInt16BE(flags | type, offset + 2) -+ buf.writeUInt16BE(h.questions.length, offset + 4) -+ buf.writeUInt16BE(h.answers.length, offset + 6) -+ buf.writeUInt16BE(h.authorities.length, offset + 8) -+ buf.writeUInt16BE(h.additionals.length, offset + 10) -+ -+ return buf -+} -+ -+header.encode.bytes = 12 -+ -+header.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ if (buf.length < 12) throw new Error('Header must be 12 bytes') -+ const flags = buf.readUInt16BE(offset + 2) -+ -+ return { -+ id: buf.readUInt16BE(offset), -+ type: flags & RESPONSE_FLAG ? 'response' : 'query', -+ flags: flags & 32767, -+ flag_qr: ((flags >> 15) & 0x1) === 1, -+ opcode: opcodes.toString((flags >> 11) & 0xf), -+ flag_aa: ((flags >> 10) & 0x1) === 1, -+ flag_tc: ((flags >> 9) & 0x1) === 1, -+ flag_rd: ((flags >> 8) & 0x1) === 1, -+ flag_ra: ((flags >> 7) & 0x1) === 1, -+ flag_z: ((flags >> 6) & 0x1) === 1, -+ flag_ad: ((flags >> 5) & 0x1) === 1, -+ flag_cd: ((flags >> 4) & 0x1) === 1, -+ rcode: rcodes.toString(flags & 0xf), -+ questions: new Array(buf.readUInt16BE(offset + 4)), -+ answers: new Array(buf.readUInt16BE(offset + 6)), -+ authorities: new Array(buf.readUInt16BE(offset + 8)), -+ additionals: new Array(buf.readUInt16BE(offset + 10)) -+ } -+} -+ -+header.decode.bytes = 12 -+ -+header.encodingLength = function () { -+ return 12 -+} -+ -+const runknown = exports.unknown = {} -+ -+runknown.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(runknown.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ buf.writeUInt16BE(data.length, offset) -+ data.copy(buf, offset + 2) -+ -+ runknown.encode.bytes = data.length + 2 -+ return buf -+} -+ -+runknown.encode.bytes = 0 -+ -+runknown.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const len = buf.readUInt16BE(offset) -+ const data = buf.slice(offset + 2, offset + 2 + len) -+ runknown.decode.bytes = len + 2 -+ return data -+} -+ -+runknown.decode.bytes = 0 -+ -+runknown.encodingLength = function (data) { -+ return data.length + 2 -+} -+ -+const rns = exports.ns = {} -+ -+rns.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rns.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ name.encode(data, buf, offset + 2) -+ buf.writeUInt16BE(name.encode.bytes, offset) -+ rns.encode.bytes = name.encode.bytes + 2 -+ return buf -+} -+ -+rns.encode.bytes = 0 -+ -+rns.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const len = buf.readUInt16BE(offset) -+ const dd = name.decode(buf, offset + 2) -+ -+ rns.decode.bytes = len + 2 -+ return dd -+} -+ -+rns.decode.bytes = 0 -+ -+rns.encodingLength = function (data) { -+ return name.encodingLength(data) + 2 -+} -+ -+const rsoa = exports.soa = {} -+ -+rsoa.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rsoa.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ offset += 2 -+ name.encode(data.mname, buf, offset) -+ offset += name.encode.bytes -+ name.encode(data.rname, buf, offset) -+ offset += name.encode.bytes -+ buf.writeUInt32BE(data.serial || 0, offset) -+ offset += 4 -+ buf.writeUInt32BE(data.refresh || 0, offset) -+ offset += 4 -+ buf.writeUInt32BE(data.retry || 0, offset) -+ offset += 4 -+ buf.writeUInt32BE(data.expire || 0, offset) -+ offset += 4 -+ buf.writeUInt32BE(data.minimum || 0, offset) -+ offset += 4 -+ -+ buf.writeUInt16BE(offset - oldOffset - 2, oldOffset) -+ rsoa.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+rsoa.encode.bytes = 0 -+ -+rsoa.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ const data = {} -+ offset += 2 -+ data.mname = name.decode(buf, offset) -+ offset += name.decode.bytes -+ data.rname = name.decode(buf, offset) -+ offset += name.decode.bytes -+ data.serial = buf.readUInt32BE(offset) -+ offset += 4 -+ data.refresh = buf.readUInt32BE(offset) -+ offset += 4 -+ data.retry = buf.readUInt32BE(offset) -+ offset += 4 -+ data.expire = buf.readUInt32BE(offset) -+ offset += 4 -+ data.minimum = buf.readUInt32BE(offset) -+ offset += 4 -+ -+ rsoa.decode.bytes = offset - oldOffset -+ return data -+} -+ -+rsoa.decode.bytes = 0 -+ -+rsoa.encodingLength = function (data) { -+ return 22 + name.encodingLength(data.mname) + name.encodingLength(data.rname) -+} -+ -+const rtxt = exports.txt = {} -+ -+rtxt.encode = function (data, buf, offset) { -+ if (!Array.isArray(data)) data = [data] -+ for (let i = 0; i < data.length; i++) { -+ if (typeof data[i] === 'string') { -+ data[i] = Buffer.from(data[i]) -+ } -+ if (!Buffer.isBuffer(data[i])) { -+ throw new Error('Must be a Buffer') -+ } -+ } -+ -+ if (!buf) buf = Buffer.allocUnsafe(rtxt.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ offset += 2 -+ -+ data.forEach(function (d) { -+ buf[offset++] = d.length -+ d.copy(buf, offset, 0, d.length) -+ offset += d.length -+ }) -+ -+ buf.writeUInt16BE(offset - oldOffset - 2, oldOffset) -+ rtxt.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+rtxt.encode.bytes = 0 -+ -+rtxt.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ let remaining = buf.readUInt16BE(offset) -+ offset += 2 -+ -+ let data = [] -+ while (remaining > 0) { -+ const len = buf[offset++] -+ --remaining -+ if (remaining < len) { -+ throw new Error('Buffer overflow') -+ } -+ data.push(buf.slice(offset, offset + len)) -+ offset += len -+ remaining -= len -+ } -+ -+ rtxt.decode.bytes = offset - oldOffset -+ return data -+} -+ -+rtxt.decode.bytes = 0 -+ -+rtxt.encodingLength = function (data) { -+ if (!Array.isArray(data)) data = [data] -+ let length = 2 -+ data.forEach(function (buf) { -+ if (typeof buf === 'string') { -+ length += Buffer.byteLength(buf) + 1 -+ } else { -+ length += buf.length + 1 -+ } -+ }) -+ return length -+} -+ -+const rnull = exports.null = {} -+ -+rnull.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rnull.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ if (typeof data === 'string') data = Buffer.from(data) -+ if (!data) data = Buffer.allocUnsafe(0) -+ -+ const oldOffset = offset -+ offset += 2 -+ -+ const len = data.length -+ data.copy(buf, offset, 0, len) -+ offset += len -+ -+ buf.writeUInt16BE(offset - oldOffset - 2, oldOffset) -+ rnull.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+rnull.encode.bytes = 0 -+ -+rnull.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ const len = buf.readUInt16BE(offset) -+ -+ offset += 2 -+ -+ const data = buf.slice(offset, offset + len) -+ offset += len -+ -+ rnull.decode.bytes = offset - oldOffset -+ return data -+} -+ -+rnull.decode.bytes = 0 -+ -+rnull.encodingLength = function (data) { -+ if (!data) return 2 -+ return (Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data)) + 2 -+} -+ -+const rhinfo = exports.hinfo = {} -+ -+rhinfo.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rhinfo.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ offset += 2 -+ string.encode(data.cpu, buf, offset) -+ offset += string.encode.bytes -+ string.encode(data.os, buf, offset) -+ offset += string.encode.bytes -+ buf.writeUInt16BE(offset - oldOffset - 2, oldOffset) -+ rhinfo.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+rhinfo.encode.bytes = 0 -+ -+rhinfo.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ const data = {} -+ offset += 2 -+ data.cpu = string.decode(buf, offset) -+ offset += string.decode.bytes -+ data.os = string.decode(buf, offset) -+ offset += string.decode.bytes -+ rhinfo.decode.bytes = offset - oldOffset -+ return data -+} -+ -+rhinfo.decode.bytes = 0 -+ -+rhinfo.encodingLength = function (data) { -+ return string.encodingLength(data.cpu) + string.encodingLength(data.os) + 2 -+} -+ -+const rptr = exports.ptr = {} -+const rcname = exports.cname = rptr -+const rdname = exports.dname = rptr -+ -+rptr.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rptr.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ name.encode(data, buf, offset + 2) -+ buf.writeUInt16BE(name.encode.bytes, offset) -+ rptr.encode.bytes = name.encode.bytes + 2 -+ return buf -+} -+ -+rptr.encode.bytes = 0 -+ -+rptr.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const data = name.decode(buf, offset + 2) -+ rptr.decode.bytes = name.decode.bytes + 2 -+ return data -+} -+ -+rptr.decode.bytes = 0 -+ -+rptr.encodingLength = function (data) { -+ return name.encodingLength(data) + 2 -+} -+ -+const rsrv = exports.srv = {} -+ -+rsrv.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rsrv.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ buf.writeUInt16BE(data.priority || 0, offset + 2) -+ buf.writeUInt16BE(data.weight || 0, offset + 4) -+ buf.writeUInt16BE(data.port || 0, offset + 6) -+ name.encode(data.target, buf, offset + 8) -+ -+ const len = name.encode.bytes + 6 -+ buf.writeUInt16BE(len, offset) -+ -+ rsrv.encode.bytes = len + 2 -+ return buf -+} -+ -+rsrv.encode.bytes = 0 -+ -+rsrv.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const len = buf.readUInt16BE(offset) -+ -+ const data = {} -+ data.priority = buf.readUInt16BE(offset + 2) -+ data.weight = buf.readUInt16BE(offset + 4) -+ data.port = buf.readUInt16BE(offset + 6) -+ data.target = name.decode(buf, offset + 8) -+ -+ rsrv.decode.bytes = len + 2 -+ return data -+} -+ -+rsrv.decode.bytes = 0 -+ -+rsrv.encodingLength = function (data) { -+ return 8 + name.encodingLength(data.target) -+} -+ -+const rcaa = exports.caa = {} -+ -+rcaa.ISSUER_CRITICAL = 1 << 7 -+ -+rcaa.encode = function (data, buf, offset) { -+ const len = rcaa.encodingLength(data) -+ -+ if (!buf) buf = Buffer.allocUnsafe(rcaa.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ if (data.issuerCritical) { -+ data.flags = rcaa.ISSUER_CRITICAL -+ } -+ -+ buf.writeUInt16BE(len - 2, offset) -+ offset += 2 -+ buf.writeUInt8(data.flags || 0, offset) -+ offset += 1 -+ string.encode(data.tag, buf, offset) -+ offset += string.encode.bytes -+ buf.write(data.value, offset) -+ offset += Buffer.byteLength(data.value) -+ -+ rcaa.encode.bytes = len -+ return buf -+} -+ -+rcaa.encode.bytes = 0 -+ -+rcaa.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const len = buf.readUInt16BE(offset) -+ offset += 2 -+ -+ const oldOffset = offset -+ const data = {} -+ data.flags = buf.readUInt8(offset) -+ offset += 1 -+ data.tag = string.decode(buf, offset) -+ offset += string.decode.bytes -+ data.value = buf.toString('utf-8', offset, oldOffset + len) -+ -+ data.issuerCritical = !!(data.flags & rcaa.ISSUER_CRITICAL) -+ -+ rcaa.decode.bytes = len + 2 -+ -+ return data -+} -+ -+rcaa.decode.bytes = 0 -+ -+rcaa.encodingLength = function (data) { -+ return string.encodingLength(data.tag) + string.encodingLength(data.value) + 2 -+} -+ -+const rmx = exports.mx = {} -+ -+rmx.encode = function (data, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(rmx.encodingLength(data)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ offset += 2 -+ buf.writeUInt16BE(data.preference || 0, offset) -+ offset += 2 -+ name.encode(data.exchange, buf, offset) -+ offset += name.encode.bytes -+ -+ buf.writeUInt16BE(offset - oldOffset - 2, oldOffset) -+ rmx.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+rmx.encode.bytes = 0 -+ -+rmx.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ const data = {} -+ offset += 2 -+ data.preference = buf.readUInt16BE(offset) -+ offset += 2 -+ data.exchange = name.decode(buf, offset) -+ offset += name.decode.bytes -+ -+ rmx.decode.bytes = offset - oldOffset -+ return data -+} -+ -+rmx.encodingLength = function (data) { -+ return 4 + name.encodingLength(data.exchange) -+} -+ -+const ra = exports.a = {} -+ -+ra.encode = function (host, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(ra.encodingLength(host)) -+ if (!offset) offset = 0 -+ -+ buf.writeUInt16BE(4, offset) -+ offset += 2 -+ ip.toBuffer(host, buf, offset) -+ ra.encode.bytes = 6 -+ return buf -+} -+ -+ra.encode.bytes = 0 -+ -+ra.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ offset += 2 -+ const host = ip.toString(buf, offset, 4) -+ ra.decode.bytes = 6 -+ return host -+} -+ -+ra.decode.bytes = 0 -+ -+ra.encodingLength = function () { -+ return 6 -+} -+ -+const raaaa = exports.aaaa = {} -+ -+raaaa.encode = function (host, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(raaaa.encodingLength(host)) -+ if (!offset) offset = 0 -+ -+ buf.writeUInt16BE(16, offset) -+ offset += 2 -+ ip.toBuffer(host, buf, offset) -+ raaaa.encode.bytes = 18 -+ return buf -+} -+ -+raaaa.encode.bytes = 0 -+ -+raaaa.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ offset += 2 -+ const host = ip.toString(buf, offset, 16) -+ raaaa.decode.bytes = 18 -+ return host -+} -+ -+raaaa.decode.bytes = 0 -+ -+raaaa.encodingLength = function () { -+ return 18 -+} -+ -+const roption = exports.option = {} -+ -+roption.encode = function (option, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(roption.encodingLength(option)) -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ -+ buf.writeUInt16BE(option.code, offset) -+ offset += 2 -+ buf.writeUInt16BE(option.data.length, offset) -+ offset += 2 -+ option.data.copy(buf, offset) -+ offset += option.data.length -+ -+ roption.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+roption.encode.bytes = 0 -+ -+roption.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ const option = {} -+ -+ option.code = buf.readUInt16BE(offset) -+ const len = buf.readUInt16BE(offset + 2) -+ option.data = buf.slice(offset + 4, offset + 4 + len) -+ -+ roption.decode.bytes = len + 4 -+ return option -+} -+ -+roption.decode.bytes = 0 -+ -+roption.encodingLength = function (option) { -+ return option.data.length + 4 -+} -+ -+const ropt = exports.opt = {} -+ -+ropt.encode = function (options, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(ropt.encodingLength(options)) -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ -+ const rdlen = encodingLengthList(options, roption) -+ buf.writeUInt16BE(rdlen, offset) -+ offset = encodeList(options, roption, buf, offset + 2) -+ -+ ropt.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+ropt.encode.bytes = 0 -+ -+ropt.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ const oldOffset = offset -+ -+ const options = [] -+ let rdlen = buf.readUInt16BE(offset) -+ offset += 2 -+ let o = 0 -+ while (rdlen > 0) { -+ options[o++] = roption.decode(buf, offset) -+ offset += roption.decode.bytes -+ rdlen -= roption.decode.bytes -+ } -+ ropt.decode.bytes = offset - oldOffset -+ return options -+} -+ -+ropt.decode.bytes = 0 -+ -+ropt.encodingLength = function (options) { -+ return 2 + encodingLengthList(options || [], roption) -+} -+ -+const renc = exports.record = function (type) { -+ switch (type.toUpperCase()) { -+ case 'A': return ra -+ case 'PTR': return rptr -+ case 'CNAME': return rcname -+ case 'DNAME': return rdname -+ case 'TXT': return rtxt -+ case 'NULL': return rnull -+ case 'AAAA': return raaaa -+ case 'SRV': return rsrv -+ case 'HINFO': return rhinfo -+ case 'CAA': return rcaa -+ case 'NS': return rns -+ case 'SOA': return rsoa -+ case 'MX': return rmx -+ case 'OPT': return ropt -+ } -+ return runknown -+} -+ -+const answer = exports.answer = {} -+ -+answer.encode = function (a, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(answer.encodingLength(a)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ name.encode(a.name, buf, offset) -+ offset += name.encode.bytes -+ -+ buf.writeUInt16BE(types.toType(a.type), offset) -+ -+ if (a.type.toUpperCase() === 'OPT') { -+ if (a.name !== '.') { -+ throw new Error('OPT name must be root.') -+ } -+ buf.writeUInt16BE(a.updPayloadSize || 4096, offset + 2) -+ buf.writeUInt8(a.extendedRcode || 0, offset + 4) -+ buf.writeUInt8(a.ednsVersion || 0, offset + 5) -+ buf.writeUInt16BE(a.flags || 0, offset + 6) -+ -+ offset += 8 -+ ropt.encode(a.options || [], buf, offset) -+ offset += ropt.encode.bytes -+ } else { -+ let klass = classes.toClass(a.class === undefined ? 'IN' : a.class) -+ if (a.flush) klass |= FLUSH_MASK // the 1st bit of the class is the flush bit -+ buf.writeUInt16BE(klass, offset + 2) -+ buf.writeUInt32BE(a.ttl || 0, offset + 4) -+ -+ offset += 8 -+ const enc = renc(a.type) -+ enc.encode(a.data, buf, offset) -+ offset += enc.encode.bytes -+ } -+ -+ answer.encode.bytes = offset - oldOffset -+ return buf -+} -+ -+answer.encode.bytes = 0 -+ -+answer.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const a = {} -+ const oldOffset = offset -+ -+ a.name = name.decode(buf, offset) -+ offset += name.decode.bytes -+ a.type = types.toString(buf.readUInt16BE(offset)) -+ if (a.type === 'OPT') { -+ a.udpPayloadSize = buf.readUInt16BE(offset + 2) -+ a.extendedRcode = buf.readUInt8(offset + 4) -+ a.ednsVersion = buf.readUInt8(offset + 5) -+ a.flags = buf.readUInt16BE(offset + 6) -+ a.flag_do = ((a.flags >> 15) & 0x1) === 1 -+ a.options = ropt.decode(buf, offset + 8) -+ offset += 8 + ropt.decode.bytes -+ } else { -+ const klass = buf.readUInt16BE(offset + 2) -+ a.ttl = buf.readUInt32BE(offset + 4) -+ -+ a.class = classes.toString(klass & NOT_FLUSH_MASK) -+ a.flush = !!(klass & FLUSH_MASK) -+ -+ const enc = renc(a.type) -+ a.data = enc.decode(buf, offset + 8) -+ offset += 8 + enc.decode.bytes -+ } -+ -+ answer.decode.bytes = offset - oldOffset -+ return a -+} -+ -+answer.decode.bytes = 0 -+ -+answer.encodingLength = function (a) { -+ return name.encodingLength(a.name) + 8 + renc(a.type).encodingLength(a.data || a.options) -+} -+ -+const question = exports.question = {} -+ -+question.encode = function (q, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(question.encodingLength(q)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ name.encode(q.name, buf, offset) -+ offset += name.encode.bytes -+ -+ buf.writeUInt16BE(types.toType(q.type), offset) -+ offset += 2 -+ -+ buf.writeUInt16BE(classes.toClass(q.class === undefined ? 'IN' : q.class), offset) -+ offset += 2 -+ -+ question.encode.bytes = offset - oldOffset -+ return q -+} -+ -+question.encode.bytes = 0 -+ -+question.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ const q = {} -+ -+ q.name = name.decode(buf, offset) -+ offset += name.decode.bytes -+ -+ q.type = types.toString(buf.readUInt16BE(offset)) -+ offset += 2 -+ -+ q.class = classes.toString(buf.readUInt16BE(offset)) -+ offset += 2 -+ -+ const qu = !!(q.class & QU_MASK) -+ if (qu) q.class &= NOT_QU_MASK -+ -+ question.decode.bytes = offset - oldOffset -+ return q -+} -+ -+question.decode.bytes = 0 -+ -+question.encodingLength = function (q) { -+ return name.encodingLength(q.name) + 4 -+} -+ -+exports.AUTHORITATIVE_ANSWER = 1 << 10 -+exports.TRUNCATED_RESPONSE = 1 << 9 -+exports.RECURSION_DESIRED = 1 << 8 -+exports.RECURSION_AVAILABLE = 1 << 7 -+exports.AUTHENTIC_DATA = 1 << 5 -+exports.CHECKING_DISABLED = 1 << 4 -+exports.DNSSEC_OK = 1 << 15 -+ -+exports.encode = function (result, buf, offset) { -+ if (!buf) buf = Buffer.allocUnsafe(exports.encodingLength(result)) -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ -+ if (!result.questions) result.questions = [] -+ if (!result.answers) result.answers = [] -+ if (!result.authorities) result.authorities = [] -+ if (!result.additionals) result.additionals = [] -+ -+ header.encode(result, buf, offset) -+ offset += header.encode.bytes -+ -+ offset = encodeList(result.questions, question, buf, offset) -+ offset = encodeList(result.answers, answer, buf, offset) -+ offset = encodeList(result.authorities, answer, buf, offset) -+ offset = encodeList(result.additionals, answer, buf, offset) -+ -+ exports.encode.bytes = offset - oldOffset -+ -+ return buf -+} -+ -+exports.encode.bytes = 0 -+ -+exports.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ const oldOffset = offset -+ const result = header.decode(buf, offset) -+ offset += header.decode.bytes -+ -+ offset = decodeList(result.questions, question, buf, offset) -+ offset = decodeList(result.answers, answer, buf, offset) -+ offset = decodeList(result.authorities, answer, buf, offset) -+ offset = decodeList(result.additionals, answer, buf, offset) -+ -+ exports.decode.bytes = offset - oldOffset -+ -+ return result -+} -+ -+exports.decode.bytes = 0 -+ -+exports.encodingLength = function (result) { -+ return header.encodingLength(result) + -+ encodingLengthList(result.questions || [], question) + -+ encodingLengthList(result.answers || [], answer) + -+ encodingLengthList(result.authorities || [], answer) + -+ encodingLengthList(result.additionals || [], answer) -+} -+ -+exports.streamEncode = function (result) { -+ const buf = exports.encode(result) -+ const sbuf = Buffer.allocUnsafe(2) -+ sbuf.writeUInt16BE(buf.byteLength) -+ const combine = Buffer.concat([sbuf, buf]) -+ exports.streamEncode.bytes = combine.byteLength -+ return combine -+} -+ -+exports.streamEncode.bytes = 0 -+ -+exports.streamDecode = function (sbuf) { -+ const len = sbuf.readUInt16BE(0) -+ if (sbuf.byteLength < len + 2) { -+ // not enough data -+ return null -+ } -+ const result = exports.decode(sbuf.slice(2)) -+ exports.streamDecode.bytes = exports.decode.bytes -+ return result -+} -+ -+exports.streamDecode.bytes = 0 -+ -+function encodingLengthList (list, enc) { -+ let len = 0 -+ for (let i = 0; i < list.length; i++) len += enc.encodingLength(list[i]) -+ return len -+} -+ -+function encodeList (list, enc, buf, offset) { -+ for (let i = 0; i < list.length; i++) { -+ enc.encode(list[i], buf, offset) -+ offset += enc.encode.bytes -+ } -+ return offset -+} -+ -+function decodeList (list, enc, buf, offset) { -+ for (let i = 0; i < list.length; i++) { -+ list[i] = enc.decode(buf, offset) -+ offset += enc.decode.bytes -+ } -+ return offset -+} -+ -+}, -+"3a8vGjFoUVp119KzT+sCFborse+HxcK36DkXwi4uHhQ=": -+function (require, module, exports, __dirname, __filename) { -+var IndexedTarball = require('indexed-tarball') -+ -+var noop = function() {} -+ -+function BlobStore (opts) { -+ if (!(this instanceof BlobStore)) return new BlobStore(opts) -+ if (typeof opts === 'string') opts = {path:opts} -+ -+ if (opts.tarball) this.tarball = opts.tarball -+ else this.tarball = new IndexedTarball(opts.path, opts) -+} -+ -+BlobStore.prototype.createWriteStream = function (opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ if (opts.name && !opts.key) opts.key = opts.name -+ return this.tarball.append(opts.key, opts.size || undefined, function (err) { -+ if (cb) cb(err, {key:opts.key}) -+ }) -+} -+ -+BlobStore.prototype.createReadStream = function (key, opts) { -+ if (key && typeof key === 'object') return this.createReadStream(key.key, key) -+ return this.tarball.read(key, opts) -+} -+ -+BlobStore.prototype.exists = function (opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ this.tarball.list(function (err, files) { -+ if (err) return cb(err) -+ cb(null, files.indexOf(opts.key) !== -1) -+ }) -+} -+ -+BlobStore.prototype.remove = function (opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ if (!opts) opts = noop -+ this.tarball.pop(opts.key, cb) -+} -+ -+BlobStore.prototype.list = function (cb) { -+ this.tarball.list(cb) -+} -+ -+module.exports = BlobStore -+ -+}, -+"3dLpQt28s+uWVddZNi4c3eE4KmJSA+VkZXjWGFNy6fg=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+const isStream = stream => -+ stream !== null && -+ typeof stream === 'object' && -+ typeof stream.pipe === 'function'; -+ -+isStream.writable = stream => -+ isStream(stream) && -+ stream.writable !== false && -+ typeof stream._write === 'function' && -+ typeof stream._writableState === 'object'; -+ -+isStream.readable = stream => -+ isStream(stream) && -+ stream.readable !== false && -+ typeof stream._read === 'function' && -+ typeof stream._readableState === 'object'; -+ -+isStream.duplex = stream => -+ isStream.writable(stream) && -+ isStream.readable(stream); -+ -+isStream.transform = stream => -+ isStream.duplex(stream) && -+ typeof stream._transform === 'function' && -+ typeof stream._transformState === 'object'; -+ -+module.exports = isStream; -+ -+}, -+"3fBTbY6qA8B4ICZ+hM4PzMLC/2i3tndJYPK6wi8AHDU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var immediate = require('immediate'); -+ -+/* istanbul ignore next */ -+function INTERNAL() {} -+ -+var handlers = {}; -+ -+var REJECTED = ['REJECTED']; -+var FULFILLED = ['FULFILLED']; -+var PENDING = ['PENDING']; -+/* istanbul ignore else */ -+if (!process.browser) { -+ // in which we actually take advantage of JS scoping -+ var UNHANDLED = ['UNHANDLED']; -+} -+ -+module.exports = Promise; -+ -+function Promise(resolver) { -+ if (typeof resolver !== 'function') { -+ throw new TypeError('resolver must be a function'); -+ } -+ this.state = PENDING; -+ this.queue = []; -+ this.outcome = void 0; -+ /* istanbul ignore else */ -+ if (!process.browser) { -+ this.handled = UNHANDLED; -+ } -+ if (resolver !== INTERNAL) { -+ safelyResolveThenable(this, resolver); -+ } -+} -+ -+Promise.prototype.catch = function (onRejected) { -+ return this.then(null, onRejected); -+}; -+Promise.prototype.then = function (onFulfilled, onRejected) { -+ if (typeof onFulfilled !== 'function' && this.state === FULFILLED || -+ typeof onRejected !== 'function' && this.state === REJECTED) { -+ return this; -+ } -+ var promise = new this.constructor(INTERNAL); -+ /* istanbul ignore else */ -+ if (!process.browser) { -+ if (this.handled === UNHANDLED) { -+ this.handled = null; -+ } -+ } -+ if (this.state !== PENDING) { -+ var resolver = this.state === FULFILLED ? onFulfilled : onRejected; -+ unwrap(promise, resolver, this.outcome); -+ } else { -+ this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); -+ } -+ -+ return promise; -+}; -+function QueueItem(promise, onFulfilled, onRejected) { -+ this.promise = promise; -+ if (typeof onFulfilled === 'function') { -+ this.onFulfilled = onFulfilled; -+ this.callFulfilled = this.otherCallFulfilled; -+ } -+ if (typeof onRejected === 'function') { -+ this.onRejected = onRejected; -+ this.callRejected = this.otherCallRejected; -+ } -+} -+QueueItem.prototype.callFulfilled = function (value) { -+ handlers.resolve(this.promise, value); -+}; -+QueueItem.prototype.otherCallFulfilled = function (value) { -+ unwrap(this.promise, this.onFulfilled, value); -+}; -+QueueItem.prototype.callRejected = function (value) { -+ handlers.reject(this.promise, value); -+}; -+QueueItem.prototype.otherCallRejected = function (value) { -+ unwrap(this.promise, this.onRejected, value); -+}; -+ -+function unwrap(promise, func, value) { -+ immediate(function () { -+ var returnValue; -+ try { -+ returnValue = func(value); -+ } catch (e) { -+ return handlers.reject(promise, e); -+ } -+ if (returnValue === promise) { -+ handlers.reject(promise, new TypeError('Cannot resolve promise with itself')); -+ } else { -+ handlers.resolve(promise, returnValue); -+ } -+ }); -+} -+ -+handlers.resolve = function (self, value) { -+ var result = tryCatch(getThen, value); -+ if (result.status === 'error') { -+ return handlers.reject(self, result.value); -+ } -+ var thenable = result.value; -+ -+ if (thenable) { -+ safelyResolveThenable(self, thenable); -+ } else { -+ self.state = FULFILLED; -+ self.outcome = value; -+ var i = -1; -+ var len = self.queue.length; -+ while (++i < len) { -+ self.queue[i].callFulfilled(value); -+ } -+ } -+ return self; -+}; -+handlers.reject = function (self, error) { -+ self.state = REJECTED; -+ self.outcome = error; -+ /* istanbul ignore else */ -+ if (!process.browser) { -+ if (self.handled === UNHANDLED) { -+ immediate(function () { -+ if (self.handled === UNHANDLED) { -+ process.emit('unhandledRejection', error, self); -+ } -+ }); -+ } -+ } -+ var i = -1; -+ var len = self.queue.length; -+ while (++i < len) { -+ self.queue[i].callRejected(error); -+ } -+ return self; -+}; -+ -+function getThen(obj) { -+ // Make sure we only access the accessor once as required by the spec -+ var then = obj && obj.then; -+ if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') { -+ return function appyThen() { -+ then.apply(obj, arguments); -+ }; -+ } -+} -+ -+function safelyResolveThenable(self, thenable) { -+ // Either fulfill, reject or reject with error -+ var called = false; -+ function onError(value) { -+ if (called) { -+ return; -+ } -+ called = true; -+ handlers.reject(self, value); -+ } -+ -+ function onSuccess(value) { -+ if (called) { -+ return; -+ } -+ called = true; -+ handlers.resolve(self, value); -+ } -+ -+ function tryToUnwrap() { -+ thenable(onSuccess, onError); -+ } -+ -+ var result = tryCatch(tryToUnwrap); -+ if (result.status === 'error') { -+ onError(result.value); -+ } -+} -+ -+function tryCatch(func, value) { -+ var out = {}; -+ try { -+ out.value = func(value); -+ out.status = 'success'; -+ } catch (e) { -+ out.status = 'error'; -+ out.value = e; -+ } -+ return out; -+} -+ -+Promise.resolve = resolve; -+function resolve(value) { -+ if (value instanceof this) { -+ return value; -+ } -+ return handlers.resolve(new this(INTERNAL), value); -+} -+ -+Promise.reject = reject; -+function reject(reason) { -+ var promise = new this(INTERNAL); -+ return handlers.reject(promise, reason); -+} -+ -+Promise.all = all; -+function all(iterable) { -+ var self = this; -+ if (Object.prototype.toString.call(iterable) !== '[object Array]') { -+ return this.reject(new TypeError('must be an array')); -+ } -+ -+ var len = iterable.length; -+ var called = false; -+ if (!len) { -+ return this.resolve([]); -+ } -+ -+ var values = new Array(len); -+ var resolved = 0; -+ var i = -1; -+ var promise = new this(INTERNAL); -+ -+ while (++i < len) { -+ allResolver(iterable[i], i); -+ } -+ return promise; -+ function allResolver(value, i) { -+ self.resolve(value).then(resolveFromAll, function (error) { -+ if (!called) { -+ called = true; -+ handlers.reject(promise, error); -+ } -+ }); -+ function resolveFromAll(outValue) { -+ values[i] = outValue; -+ if (++resolved === len && !called) { -+ called = true; -+ handlers.resolve(promise, values); -+ } -+ } -+ } -+} -+ -+Promise.race = race; -+function race(iterable) { -+ var self = this; -+ if (Object.prototype.toString.call(iterable) !== '[object Array]') { -+ return this.reject(new TypeError('must be an array')); -+ } -+ -+ var len = iterable.length; -+ var called = false; -+ if (!len) { -+ return this.resolve([]); -+ } -+ -+ var i = -1; -+ var promise = new this(INTERNAL); -+ -+ while (++i < len) { -+ resolver(iterable[i]); -+ } -+ return promise; -+ function resolver(value) { -+ self.resolve(value).then(function (response) { -+ if (!called) { -+ called = true; -+ handlers.resolve(promise, response); -+ } -+ }, function (error) { -+ if (!called) { -+ called = true; -+ handlers.reject(promise, error); -+ } -+ }); -+ } -+} -+ -+}, -+"3pZajqqEknGKQXSKPJk4Bsp8re3icYWBXwgEUWYgccg=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+exports.toString = function (type) { -+ switch (type) { -+ // list at -+ // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11 -+ case 1: return 'LLQ' -+ case 2: return 'UL' -+ case 3: return 'NSID' -+ case 5: return 'DAU' -+ case 6: return 'DHU' -+ case 7: return 'N3U' -+ case 8: return 'CLIENT_SUBNET' -+ case 9: return 'EXPIRE' -+ case 10: return 'COOKIE' -+ case 11: return 'TCP_KEEPALIVE' -+ case 12: return 'PADDING' -+ case 13: return 'CHAIN' -+ case 14: return 'KEY_TAG' -+ case 26946: return 'DEVICEID' -+ } -+ if (type < 0) { -+ return null -+ } -+ return `OPTION_${type}` -+} -+ -+exports.toCode = function (name) { -+ if (typeof name === 'number') { -+ return name -+ } -+ if (!name) { -+ return -1 -+ } -+ switch (name.toUpperCase()) { -+ case 'OPTION_0': return 0 -+ case 'LLQ': return 1 -+ case 'UL': return 2 -+ case 'NSID': return 3 -+ case 'OPTION_4': return 4 -+ case 'DAU': return 5 -+ case 'DHU': return 6 -+ case 'N3U': return 7 -+ case 'CLIENT_SUBNET': return 8 -+ case 'EXPIRE': return 9 -+ case 'COOKIE': return 10 -+ case 'TCP_KEEPALIVE': return 11 -+ case 'PADDING': return 12 -+ case 'CHAIN': return 13 -+ case 'KEY_TAG': return 14 -+ case 'DEVICEID': return 26946 -+ case 'OPTION_65535': return 65535 -+ } -+ const m = name.match(/_(\d+)$/) -+ if (m) { -+ return parseInt(m[1], 10) -+ } -+ return -1 -+} -+ -+}, -+"3pvqpQtcAXribMC+IuVicf3nqi+95/rbIhgOOVmH+v0=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const codegen_1 = require("../../compile/codegen"); -+const ops = codegen_1.operators; -+const KWDs = { -+ maximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT }, -+ minimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT }, -+ exclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE }, -+ exclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE }, -+}; -+const error = { -+ message: ({ keyword, schemaCode }) => codegen_1.str `must be ${KWDs[keyword].okStr} ${schemaCode}`, -+ params: ({ keyword, schemaCode }) => codegen_1._ `{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`, -+}; -+const def = { -+ keyword: Object.keys(KWDs), -+ type: "number", -+ schemaType: "number", -+ $data: true, -+ error, -+ code(cxt) { -+ const { keyword, data, schemaCode } = cxt; -+ cxt.fail$data(codegen_1._ `${data} ${KWDs[keyword].fail} ${schemaCode} || isNaN(${data})`); -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=limitNumber.js.map -+}, -+"3t3qrBF4sD7Q70WB9eU45XvjmstMrNPil2J+LtckuPM=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_properties(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $errs = 'errs__' + $lvl; -+ var $it = it.util.copy(it); -+ var $closingBraces = ''; -+ $it.level++; -+ var $nextValid = 'valid' + $it.level; -+ var $key = 'key' + $lvl, -+ $idx = 'idx' + $lvl, -+ $dataNxt = $it.dataLevel = it.dataLevel + 1, -+ $nextData = 'data' + $dataNxt, -+ $dataProperties = 'dataProperties' + $lvl; -+ var $schemaKeys = Object.keys($schema || {}).filter(notProto), -+ $pProperties = it.schema.patternProperties || {}, -+ $pPropertyKeys = Object.keys($pProperties).filter(notProto), -+ $aProperties = it.schema.additionalProperties, -+ $someProperties = $schemaKeys.length || $pPropertyKeys.length, -+ $noAdditional = $aProperties === false, -+ $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, -+ $removeAdditional = it.opts.removeAdditional, -+ $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, -+ $ownProperties = it.opts.ownProperties, -+ $currentBaseId = it.baseId; -+ var $required = it.schema.required; -+ if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { -+ var $requiredHash = it.util.toHash($required); -+ } -+ -+ function notProto(p) { -+ return p !== '__proto__'; -+ } -+ out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; -+ if ($ownProperties) { -+ out += ' var ' + ($dataProperties) + ' = undefined;'; -+ } -+ if ($checkAdditional) { -+ if ($ownProperties) { -+ out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; -+ } else { -+ out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; -+ } -+ if ($someProperties) { -+ out += ' var isAdditional' + ($lvl) + ' = !(false '; -+ if ($schemaKeys.length) { -+ if ($schemaKeys.length > 8) { -+ out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; -+ } else { -+ var arr1 = $schemaKeys; -+ if (arr1) { -+ var $propertyKey, i1 = -1, -+ l1 = arr1.length - 1; -+ while (i1 < l1) { -+ $propertyKey = arr1[i1 += 1]; -+ out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; -+ } -+ } -+ } -+ } -+ if ($pPropertyKeys.length) { -+ var arr2 = $pPropertyKeys; -+ if (arr2) { -+ var $pProperty, $i = -1, -+ l2 = arr2.length - 1; -+ while ($i < l2) { -+ $pProperty = arr2[$i += 1]; -+ out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; -+ } -+ } -+ } -+ out += ' ); if (isAdditional' + ($lvl) + ') { '; -+ } -+ if ($removeAdditional == 'all') { -+ out += ' delete ' + ($data) + '[' + ($key) + ']; '; -+ } else { -+ var $currentErrorPath = it.errorPath; -+ var $additionalProperty = '\' + ' + $key + ' + \''; -+ if (it.opts._errorDataPathProperty) { -+ it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -+ } -+ if ($noAdditional) { -+ if ($removeAdditional) { -+ out += ' delete ' + ($data) + '[' + ($key) + ']; '; -+ } else { -+ out += ' ' + ($nextValid) + ' = false; '; -+ var $currErrSchemaPath = $errSchemaPath; -+ $errSchemaPath = it.errSchemaPath + '/additionalProperties'; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \''; -+ if (it.opts._errorDataPathProperty) { -+ out += 'is an invalid additional property'; -+ } else { -+ out += 'should NOT have additional properties'; -+ } -+ out += '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ $errSchemaPath = $currErrSchemaPath; -+ if ($breakOnError) { -+ out += ' break; '; -+ } -+ } -+ } else if ($additionalIsSchema) { -+ if ($removeAdditional == 'failing') { -+ out += ' var ' + ($errs) + ' = errors; '; -+ var $wasComposite = it.compositeRule; -+ it.compositeRule = $it.compositeRule = true; -+ $it.schema = $aProperties; -+ $it.schemaPath = it.schemaPath + '.additionalProperties'; -+ $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; -+ $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -+ var $passData = $data + '[' + $key + ']'; -+ $it.dataPathArr[$dataNxt] = $key; -+ var $code = it.validate($it); -+ $it.baseId = $currentBaseId; -+ if (it.util.varOccurences($code, $nextData) < 2) { -+ out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; -+ } else { -+ out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; -+ } -+ out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; -+ it.compositeRule = $it.compositeRule = $wasComposite; -+ } else { -+ $it.schema = $aProperties; -+ $it.schemaPath = it.schemaPath + '.additionalProperties'; -+ $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; -+ $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -+ var $passData = $data + '[' + $key + ']'; -+ $it.dataPathArr[$dataNxt] = $key; -+ var $code = it.validate($it); -+ $it.baseId = $currentBaseId; -+ if (it.util.varOccurences($code, $nextData) < 2) { -+ out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; -+ } else { -+ out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; -+ } -+ if ($breakOnError) { -+ out += ' if (!' + ($nextValid) + ') break; '; -+ } -+ } -+ } -+ it.errorPath = $currentErrorPath; -+ } -+ if ($someProperties) { -+ out += ' } '; -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' if (' + ($nextValid) + ') { '; -+ $closingBraces += '}'; -+ } -+ } -+ var $useDefaults = it.opts.useDefaults && !it.compositeRule; -+ if ($schemaKeys.length) { -+ var arr3 = $schemaKeys; -+ if (arr3) { -+ var $propertyKey, i3 = -1, -+ l3 = arr3.length - 1; -+ while (i3 < l3) { -+ $propertyKey = arr3[i3 += 1]; -+ var $sch = $schema[$propertyKey]; -+ if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { -+ var $prop = it.util.getProperty($propertyKey), -+ $passData = $data + $prop, -+ $hasDefault = $useDefaults && $sch.default !== undefined; -+ $it.schema = $sch; -+ $it.schemaPath = $schemaPath + $prop; -+ $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); -+ $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); -+ $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); -+ var $code = it.validate($it); -+ $it.baseId = $currentBaseId; -+ if (it.util.varOccurences($code, $nextData) < 2) { -+ $code = it.util.varReplace($code, $nextData, $passData); -+ var $useData = $passData; -+ } else { -+ var $useData = $nextData; -+ out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; -+ } -+ if ($hasDefault) { -+ out += ' ' + ($code) + ' '; -+ } else { -+ if ($requiredHash && $requiredHash[$propertyKey]) { -+ out += ' if ( ' + ($useData) + ' === undefined '; -+ if ($ownProperties) { -+ out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; -+ } -+ out += ') { ' + ($nextValid) + ' = false; '; -+ var $currentErrorPath = it.errorPath, -+ $currErrSchemaPath = $errSchemaPath, -+ $missingProperty = it.util.escapeQuotes($propertyKey); -+ if (it.opts._errorDataPathProperty) { -+ it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); -+ } -+ $errSchemaPath = it.errSchemaPath + '/required'; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \''; -+ if (it.opts._errorDataPathProperty) { -+ out += 'is a required property'; -+ } else { -+ out += 'should have required property \\\'' + ($missingProperty) + '\\\''; -+ } -+ out += '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ $errSchemaPath = $currErrSchemaPath; -+ it.errorPath = $currentErrorPath; -+ out += ' } else { '; -+ } else { -+ if ($breakOnError) { -+ out += ' if ( ' + ($useData) + ' === undefined '; -+ if ($ownProperties) { -+ out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; -+ } -+ out += ') { ' + ($nextValid) + ' = true; } else { '; -+ } else { -+ out += ' if (' + ($useData) + ' !== undefined '; -+ if ($ownProperties) { -+ out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; -+ } -+ out += ' ) { '; -+ } -+ } -+ out += ' ' + ($code) + ' } '; -+ } -+ } -+ if ($breakOnError) { -+ out += ' if (' + ($nextValid) + ') { '; -+ $closingBraces += '}'; -+ } -+ } -+ } -+ } -+ if ($pPropertyKeys.length) { -+ var arr4 = $pPropertyKeys; -+ if (arr4) { -+ var $pProperty, i4 = -1, -+ l4 = arr4.length - 1; -+ while (i4 < l4) { -+ $pProperty = arr4[i4 += 1]; -+ var $sch = $pProperties[$pProperty]; -+ if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { -+ $it.schema = $sch; -+ $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); -+ $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); -+ if ($ownProperties) { -+ out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; -+ } else { -+ out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; -+ } -+ out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; -+ $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); -+ var $passData = $data + '[' + $key + ']'; -+ $it.dataPathArr[$dataNxt] = $key; -+ var $code = it.validate($it); -+ $it.baseId = $currentBaseId; -+ if (it.util.varOccurences($code, $nextData) < 2) { -+ out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; -+ } else { -+ out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; -+ } -+ if ($breakOnError) { -+ out += ' if (!' + ($nextValid) + ') break; '; -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' else ' + ($nextValid) + ' = true; '; -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' if (' + ($nextValid) + ') { '; -+ $closingBraces += '}'; -+ } -+ } -+ } -+ } -+ } -+ if ($breakOnError) { -+ out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; -+ } -+ return out; -+} -+ -+}, -+"4/8uLHmK7Sv3z9Zo/iFxgX3UaWCA3nzh/TtcF2m+z2s=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * ws: a node.js websocket client -+ * Copyright(c) 2011 Einar Otto Stangvik -+ * MIT Licensed -+ */ -+ -+'use strict'; -+ -+try { -+ const isValidUTF8 = require('utf-8-validate'); -+ -+ module.exports = typeof isValidUTF8 === 'object' -+ ? isValidUTF8.Validation.isValidUTF8 // utf-8-validate@<3.0.0 -+ : isValidUTF8; -+} catch (e) /* istanbul ignore next */ { -+ module.exports = () => true; -+} -+ -+}, -+"4/PR/VSqJBM6PVGK5+rybVy8G5SWOJ4Y3SS6Y+p2PtM=": -+function (require, module, exports, __dirname, __filename) { -+// Approach: -+// -+// 1. Get the minimatch set -+// 2. For each pattern in the set, PROCESS(pattern, false) -+// 3. Store matches per-set, then uniq them -+// -+// PROCESS(pattern, inGlobStar) -+// Get the first [n] items from pattern that are all strings -+// Join these together. This is PREFIX. -+// If there is no more remaining, then stat(PREFIX) and -+// add to matches if it succeeds. END. -+// -+// If inGlobStar and PREFIX is symlink and points to dir -+// set ENTRIES = [] -+// else readdir(PREFIX) as ENTRIES -+// If fail, END -+// -+// with ENTRIES -+// If pattern[n] is GLOBSTAR -+// // handle the case where the globstar match is empty -+// // by pruning it out, and testing the resulting pattern -+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -+// // handle other cases. -+// for ENTRY in ENTRIES (not dotfiles) -+// // attach globstar + tail onto the entry -+// // Mark that this entry is a globstar match -+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -+// -+// else // not globstar -+// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -+// Test ENTRY against pattern[n] -+// If fails, continue -+// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -+// -+// Caveat: -+// Cache all stats and readdirs results to minimize syscall. Since all -+// we ever care about is existence and directory-ness, we can just keep -+// `true` for files, and [children,...] for directories, or `false` for -+// things that don't exist. -+ -+module.exports = glob -+ -+var fs = require('fs') -+var rp = require('fs.realpath') -+var minimatch = require('minimatch') -+var Minimatch = minimatch.Minimatch -+var inherits = require('inherits') -+var EE = require('events').EventEmitter -+var path = require('path') -+var assert = require('assert') -+var isAbsolute = require('path-is-absolute') -+var globSync = require('./sync.js') -+var common = require('./common.js') -+var alphasort = common.alphasort -+var alphasorti = common.alphasorti -+var setopts = common.setopts -+var ownProp = common.ownProp -+var inflight = require('inflight') -+var util = require('util') -+var childrenIgnored = common.childrenIgnored -+var isIgnored = common.isIgnored -+ -+var once = require('once') -+ -+function glob (pattern, options, cb) { -+ if (typeof options === 'function') cb = options, options = {} -+ if (!options) options = {} -+ -+ if (options.sync) { -+ if (cb) -+ throw new TypeError('callback provided to sync glob') -+ return globSync(pattern, options) -+ } -+ -+ return new Glob(pattern, options, cb) -+} -+ -+glob.sync = globSync -+var GlobSync = glob.GlobSync = globSync.GlobSync -+ -+// old api surface -+glob.glob = glob -+ -+function extend (origin, add) { -+ if (add === null || typeof add !== 'object') { -+ return origin -+ } -+ -+ var keys = Object.keys(add) -+ var i = keys.length -+ while (i--) { -+ origin[keys[i]] = add[keys[i]] -+ } -+ return origin -+} -+ -+glob.hasMagic = function (pattern, options_) { -+ var options = extend({}, options_) -+ options.noprocess = true -+ -+ var g = new Glob(pattern, options) -+ var set = g.minimatch.set -+ -+ if (!pattern) -+ return false -+ -+ if (set.length > 1) -+ return true -+ -+ for (var j = 0; j < set[0].length; j++) { -+ if (typeof set[0][j] !== 'string') -+ return true -+ } -+ -+ return false -+} -+ -+glob.Glob = Glob -+inherits(Glob, EE) -+function Glob (pattern, options, cb) { -+ if (typeof options === 'function') { -+ cb = options -+ options = null -+ } -+ -+ if (options && options.sync) { -+ if (cb) -+ throw new TypeError('callback provided to sync glob') -+ return new GlobSync(pattern, options) -+ } -+ -+ if (!(this instanceof Glob)) -+ return new Glob(pattern, options, cb) -+ -+ setopts(this, pattern, options) -+ this._didRealPath = false -+ -+ // process each pattern in the minimatch set -+ var n = this.minimatch.set.length -+ -+ // The matches are stored as {: true,...} so that -+ // duplicates are automagically pruned. -+ // Later, we do an Object.keys() on these. -+ // Keep them as a list so we can fill in when nonull is set. -+ this.matches = new Array(n) -+ -+ if (typeof cb === 'function') { -+ cb = once(cb) -+ this.on('error', cb) -+ this.on('end', function (matches) { -+ cb(null, matches) -+ }) -+ } -+ -+ var self = this -+ this._processing = 0 -+ -+ this._emitQueue = [] -+ this._processQueue = [] -+ this.paused = false -+ -+ if (this.noprocess) -+ return this -+ -+ if (n === 0) -+ return done() -+ -+ var sync = true -+ for (var i = 0; i < n; i ++) { -+ this._process(this.minimatch.set[i], i, false, done) -+ } -+ sync = false -+ -+ function done () { -+ --self._processing -+ if (self._processing <= 0) { -+ if (sync) { -+ process.nextTick(function () { -+ self._finish() -+ }) -+ } else { -+ self._finish() -+ } -+ } -+ } -+} -+ -+Glob.prototype._finish = function () { -+ assert(this instanceof Glob) -+ if (this.aborted) -+ return -+ -+ if (this.realpath && !this._didRealpath) -+ return this._realpath() -+ -+ common.finish(this) -+ this.emit('end', this.found) -+} -+ -+Glob.prototype._realpath = function () { -+ if (this._didRealpath) -+ return -+ -+ this._didRealpath = true -+ -+ var n = this.matches.length -+ if (n === 0) -+ return this._finish() -+ -+ var self = this -+ for (var i = 0; i < this.matches.length; i++) -+ this._realpathSet(i, next) -+ -+ function next () { -+ if (--n === 0) -+ self._finish() -+ } -+} -+ -+Glob.prototype._realpathSet = function (index, cb) { -+ var matchset = this.matches[index] -+ if (!matchset) -+ return cb() -+ -+ var found = Object.keys(matchset) -+ var self = this -+ var n = found.length -+ -+ if (n === 0) -+ return cb() -+ -+ var set = this.matches[index] = Object.create(null) -+ found.forEach(function (p, i) { -+ // If there's a problem with the stat, then it means that -+ // one or more of the links in the realpath couldn't be -+ // resolved. just return the abs value in that case. -+ p = self._makeAbs(p) -+ rp.realpath(p, self.realpathCache, function (er, real) { -+ if (!er) -+ set[real] = true -+ else if (er.syscall === 'stat') -+ set[p] = true -+ else -+ self.emit('error', er) // srsly wtf right here -+ -+ if (--n === 0) { -+ self.matches[index] = set -+ cb() -+ } -+ }) -+ }) -+} -+ -+Glob.prototype._mark = function (p) { -+ return common.mark(this, p) -+} -+ -+Glob.prototype._makeAbs = function (f) { -+ return common.makeAbs(this, f) -+} -+ -+Glob.prototype.abort = function () { -+ this.aborted = true -+ this.emit('abort') -+} -+ -+Glob.prototype.pause = function () { -+ if (!this.paused) { -+ this.paused = true -+ this.emit('pause') -+ } -+} -+ -+Glob.prototype.resume = function () { -+ if (this.paused) { -+ this.emit('resume') -+ this.paused = false -+ if (this._emitQueue.length) { -+ var eq = this._emitQueue.slice(0) -+ this._emitQueue.length = 0 -+ for (var i = 0; i < eq.length; i ++) { -+ var e = eq[i] -+ this._emitMatch(e[0], e[1]) -+ } -+ } -+ if (this._processQueue.length) { -+ var pq = this._processQueue.slice(0) -+ this._processQueue.length = 0 -+ for (var i = 0; i < pq.length; i ++) { -+ var p = pq[i] -+ this._processing-- -+ this._process(p[0], p[1], p[2], p[3]) -+ } -+ } -+ } -+} -+ -+Glob.prototype._process = function (pattern, index, inGlobStar, cb) { -+ assert(this instanceof Glob) -+ assert(typeof cb === 'function') -+ -+ if (this.aborted) -+ return -+ -+ this._processing++ -+ if (this.paused) { -+ this._processQueue.push([pattern, index, inGlobStar, cb]) -+ return -+ } -+ -+ //console.error('PROCESS %d', this._processing, pattern) -+ -+ // Get the first [n] parts of pattern that are all strings. -+ var n = 0 -+ while (typeof pattern[n] === 'string') { -+ n ++ -+ } -+ // now n is the index of the first one that is *not* a string. -+ -+ // see if there's anything else -+ var prefix -+ switch (n) { -+ // if not, then this is rather simple -+ case pattern.length: -+ this._processSimple(pattern.join('/'), index, cb) -+ return -+ -+ case 0: -+ // pattern *starts* with some non-trivial item. -+ // going to readdir(cwd), but not include the prefix in matches. -+ prefix = null -+ break -+ -+ default: -+ // pattern has some string bits in the front. -+ // whatever it starts with, whether that's 'absolute' like /foo/bar, -+ // or 'relative' like '../baz' -+ prefix = pattern.slice(0, n).join('/') -+ break -+ } -+ -+ var remain = pattern.slice(n) -+ -+ // get the list of entries. -+ var read -+ if (prefix === null) -+ read = '.' -+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { -+ if (!prefix || !isAbsolute(prefix)) -+ prefix = '/' + prefix -+ read = prefix -+ } else -+ read = prefix -+ -+ var abs = this._makeAbs(read) -+ -+ //if ignored, skip _processing -+ if (childrenIgnored(this, read)) -+ return cb() -+ -+ var isGlobStar = remain[0] === minimatch.GLOBSTAR -+ if (isGlobStar) -+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) -+ else -+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -+} -+ -+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { -+ var self = this -+ this._readdir(abs, inGlobStar, function (er, entries) { -+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) -+ }) -+} -+ -+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { -+ -+ // if the abs isn't a dir, then nothing can match! -+ if (!entries) -+ return cb() -+ -+ // It will only match dot entries if it starts with a dot, or if -+ // dot is set. Stuff like @(.foo|.bar) isn't allowed. -+ var pn = remain[0] -+ var negate = !!this.minimatch.negate -+ var rawGlob = pn._glob -+ var dotOk = this.dot || rawGlob.charAt(0) === '.' -+ -+ var matchedEntries = [] -+ for (var i = 0; i < entries.length; i++) { -+ var e = entries[i] -+ if (e.charAt(0) !== '.' || dotOk) { -+ var m -+ if (negate && !prefix) { -+ m = !e.match(pn) -+ } else { -+ m = e.match(pn) -+ } -+ if (m) -+ matchedEntries.push(e) -+ } -+ } -+ -+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) -+ -+ var len = matchedEntries.length -+ // If there are no matched entries, then nothing matches. -+ if (len === 0) -+ return cb() -+ -+ // if this is the last remaining pattern bit, then no need for -+ // an additional stat *unless* the user has specified mark or -+ // stat explicitly. We know they exist, since readdir returned -+ // them. -+ -+ if (remain.length === 1 && !this.mark && !this.stat) { -+ if (!this.matches[index]) -+ this.matches[index] = Object.create(null) -+ -+ for (var i = 0; i < len; i ++) { -+ var e = matchedEntries[i] -+ if (prefix) { -+ if (prefix !== '/') -+ e = prefix + '/' + e -+ else -+ e = prefix + e -+ } -+ -+ if (e.charAt(0) === '/' && !this.nomount) { -+ e = path.join(this.root, e) -+ } -+ this._emitMatch(index, e) -+ } -+ // This was the last one, and no stats were needed -+ return cb() -+ } -+ -+ // now test all matched entries as stand-ins for that part -+ // of the pattern. -+ remain.shift() -+ for (var i = 0; i < len; i ++) { -+ var e = matchedEntries[i] -+ var newPattern -+ if (prefix) { -+ if (prefix !== '/') -+ e = prefix + '/' + e -+ else -+ e = prefix + e -+ } -+ this._process([e].concat(remain), index, inGlobStar, cb) -+ } -+ cb() -+} -+ -+Glob.prototype._emitMatch = function (index, e) { -+ if (this.aborted) -+ return -+ -+ if (isIgnored(this, e)) -+ return -+ -+ if (this.paused) { -+ this._emitQueue.push([index, e]) -+ return -+ } -+ -+ var abs = isAbsolute(e) ? e : this._makeAbs(e) -+ -+ if (this.mark) -+ e = this._mark(e) -+ -+ if (this.absolute) -+ e = abs -+ -+ if (this.matches[index][e]) -+ return -+ -+ if (this.nodir) { -+ var c = this.cache[abs] -+ if (c === 'DIR' || Array.isArray(c)) -+ return -+ } -+ -+ this.matches[index][e] = true -+ -+ var st = this.statCache[abs] -+ if (st) -+ this.emit('stat', e, st) -+ -+ this.emit('match', e) -+} -+ -+Glob.prototype._readdirInGlobStar = function (abs, cb) { -+ if (this.aborted) -+ return -+ -+ // follow all symlinked directories forever -+ // just proceed as if this is a non-globstar situation -+ if (this.follow) -+ return this._readdir(abs, false, cb) -+ -+ var lstatkey = 'lstat\0' + abs -+ var self = this -+ var lstatcb = inflight(lstatkey, lstatcb_) -+ -+ if (lstatcb) -+ fs.lstat(abs, lstatcb) -+ -+ function lstatcb_ (er, lstat) { -+ if (er && er.code === 'ENOENT') -+ return cb() -+ -+ var isSym = lstat && lstat.isSymbolicLink() -+ self.symlinks[abs] = isSym -+ -+ // If it's not a symlink or a dir, then it's definitely a regular file. -+ // don't bother doing a readdir in that case. -+ if (!isSym && lstat && !lstat.isDirectory()) { -+ self.cache[abs] = 'FILE' -+ cb() -+ } else -+ self._readdir(abs, false, cb) -+ } -+} -+ -+Glob.prototype._readdir = function (abs, inGlobStar, cb) { -+ if (this.aborted) -+ return -+ -+ cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) -+ if (!cb) -+ return -+ -+ //console.error('RD %j %j', +inGlobStar, abs) -+ if (inGlobStar && !ownProp(this.symlinks, abs)) -+ return this._readdirInGlobStar(abs, cb) -+ -+ if (ownProp(this.cache, abs)) { -+ var c = this.cache[abs] -+ if (!c || c === 'FILE') -+ return cb() -+ -+ if (Array.isArray(c)) -+ return cb(null, c) -+ } -+ -+ var self = this -+ fs.readdir(abs, readdirCb(this, abs, cb)) -+} -+ -+function readdirCb (self, abs, cb) { -+ return function (er, entries) { -+ if (er) -+ self._readdirError(abs, er, cb) -+ else -+ self._readdirEntries(abs, entries, cb) -+ } -+} -+ -+Glob.prototype._readdirEntries = function (abs, entries, cb) { -+ if (this.aborted) -+ return -+ -+ // if we haven't asked to stat everything, then just -+ // assume that everything in there exists, so we can avoid -+ // having to stat it a second time. -+ if (!this.mark && !this.stat) { -+ for (var i = 0; i < entries.length; i ++) { -+ var e = entries[i] -+ if (abs === '/') -+ e = abs + e -+ else -+ e = abs + '/' + e -+ this.cache[e] = true -+ } -+ } -+ -+ this.cache[abs] = entries -+ return cb(null, entries) -+} -+ -+Glob.prototype._readdirError = function (f, er, cb) { -+ if (this.aborted) -+ return -+ -+ // handle errors, and cache the information -+ switch (er.code) { -+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 -+ case 'ENOTDIR': // totally normal. means it *does* exist. -+ var abs = this._makeAbs(f) -+ this.cache[abs] = 'FILE' -+ if (abs === this.cwdAbs) { -+ var error = new Error(er.code + ' invalid cwd ' + this.cwd) -+ error.path = this.cwd -+ error.code = er.code -+ this.emit('error', error) -+ this.abort() -+ } -+ break -+ -+ case 'ENOENT': // not terribly unusual -+ case 'ELOOP': -+ case 'ENAMETOOLONG': -+ case 'UNKNOWN': -+ this.cache[this._makeAbs(f)] = false -+ break -+ -+ default: // some unusual error. Treat as failure. -+ this.cache[this._makeAbs(f)] = false -+ if (this.strict) { -+ this.emit('error', er) -+ // If the error is handled, then we abort -+ // if not, we threw out of here -+ this.abort() -+ } -+ if (!this.silent) -+ console.error('glob error', er) -+ break -+ } -+ -+ return cb() -+} -+ -+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { -+ var self = this -+ this._readdir(abs, inGlobStar, function (er, entries) { -+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) -+ }) -+} -+ -+ -+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { -+ //console.error('pgs2', prefix, remain[0], entries) -+ -+ // no entries means not a dir, so it can never have matches -+ // foo.txt/** doesn't match foo.txt -+ if (!entries) -+ return cb() -+ -+ // test without the globstar, and with every child both below -+ // and replacing the globstar. -+ var remainWithoutGlobStar = remain.slice(1) -+ var gspref = prefix ? [ prefix ] : [] -+ var noGlobStar = gspref.concat(remainWithoutGlobStar) -+ -+ // the noGlobStar pattern exits the inGlobStar state -+ this._process(noGlobStar, index, false, cb) -+ -+ var isSym = this.symlinks[abs] -+ var len = entries.length -+ -+ // If it's a symlink, and we're in a globstar, then stop -+ if (isSym && inGlobStar) -+ return cb() -+ -+ for (var i = 0; i < len; i++) { -+ var e = entries[i] -+ if (e.charAt(0) === '.' && !this.dot) -+ continue -+ -+ // these two cases enter the inGlobStar state -+ var instead = gspref.concat(entries[i], remainWithoutGlobStar) -+ this._process(instead, index, true, cb) -+ -+ var below = gspref.concat(entries[i], remain) -+ this._process(below, index, true, cb) -+ } -+ -+ cb() -+} -+ -+Glob.prototype._processSimple = function (prefix, index, cb) { -+ // XXX review this. Shouldn't it be doing the mounting etc -+ // before doing stat? kinda weird? -+ var self = this -+ this._stat(prefix, function (er, exists) { -+ self._processSimple2(prefix, index, er, exists, cb) -+ }) -+} -+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { -+ -+ //console.error('ps2', prefix, exists) -+ -+ if (!this.matches[index]) -+ this.matches[index] = Object.create(null) -+ -+ // If it doesn't exist, then just mark the lack of results -+ if (!exists) -+ return cb() -+ -+ if (prefix && isAbsolute(prefix) && !this.nomount) { -+ var trail = /[\/\\]$/.test(prefix) -+ if (prefix.charAt(0) === '/') { -+ prefix = path.join(this.root, prefix) -+ } else { -+ prefix = path.resolve(this.root, prefix) -+ if (trail) -+ prefix += '/' -+ } -+ } -+ -+ if (process.platform === 'win32') -+ prefix = prefix.replace(/\\/g, '/') -+ -+ // Mark this as a match -+ this._emitMatch(index, prefix) -+ cb() -+} -+ -+// Returns either 'DIR', 'FILE', or false -+Glob.prototype._stat = function (f, cb) { -+ var abs = this._makeAbs(f) -+ var needDir = f.slice(-1) === '/' -+ -+ if (f.length > this.maxLength) -+ return cb() -+ -+ if (!this.stat && ownProp(this.cache, abs)) { -+ var c = this.cache[abs] -+ -+ if (Array.isArray(c)) -+ c = 'DIR' -+ -+ // It exists, but maybe not how we need it -+ if (!needDir || c === 'DIR') -+ return cb(null, c) -+ -+ if (needDir && c === 'FILE') -+ return cb() -+ -+ // otherwise we have to stat, because maybe c=true -+ // if we know it exists, but not what it is. -+ } -+ -+ var exists -+ var stat = this.statCache[abs] -+ if (stat !== undefined) { -+ if (stat === false) -+ return cb(null, stat) -+ else { -+ var type = stat.isDirectory() ? 'DIR' : 'FILE' -+ if (needDir && type === 'FILE') -+ return cb() -+ else -+ return cb(null, type, stat) -+ } -+ } -+ -+ var self = this -+ var statcb = inflight('stat\0' + abs, lstatcb_) -+ if (statcb) -+ fs.lstat(abs, statcb) -+ -+ function lstatcb_ (er, lstat) { -+ if (lstat && lstat.isSymbolicLink()) { -+ // If it's a symlink, then treat it as the target, unless -+ // the target does not exist, then treat it as a file. -+ return fs.stat(abs, function (er, stat) { -+ if (er) -+ self._stat2(f, abs, null, lstat, cb) -+ else -+ self._stat2(f, abs, er, stat, cb) -+ }) -+ } else { -+ self._stat2(f, abs, er, lstat, cb) -+ } -+ } -+} -+ -+Glob.prototype._stat2 = function (f, abs, er, stat, cb) { -+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { -+ this.statCache[abs] = false -+ return cb() -+ } -+ -+ var needDir = f.slice(-1) === '/' -+ this.statCache[abs] = stat -+ -+ if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) -+ return cb(null, false, stat) -+ -+ var c = true -+ if (stat) -+ c = stat.isDirectory() ? 'DIR' : 'FILE' -+ this.cache[abs] = this.cache[abs] || c -+ -+ if (needDir && c === 'FILE') -+ return cb() -+ -+ return cb(null, c, stat) -+} -+ -+}, -+"43EWdmH9qtf5kqMgczVzw7PIPsa6nAaQVsPFYfO9RxE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function (a, b) { -+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { -+ throw new TypeError('Arguments must be Buffers'); -+ } -+ -+ if (a === b) { -+ return true; -+ } -+ -+ if (typeof a.equals === 'function') { -+ return a.equals(b); -+ } -+ -+ if (a.length !== b.length) { -+ return false; -+ } -+ -+ for (var i = 0; i < a.length; i++) { -+ if (a[i] !== b[i]) { -+ return false; -+ } -+ } -+ -+ return true; -+}; -+ -+}, -+"49ahoYVARwf6SSQ86St1YyLde6EIsArJwwIO6+zAlu8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var ArrayReader = require('./ArrayReader'); -+var utils = require('../utils'); -+ -+function Uint8ArrayReader(data) { -+ ArrayReader.call(this, data); -+} -+utils.inherits(Uint8ArrayReader, ArrayReader); -+/** -+ * @see DataReader.readData -+ */ -+Uint8ArrayReader.prototype.readData = function(size) { -+ this.checkOffset(size); -+ if(size === 0) { -+ // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. -+ return new Uint8Array(0); -+ } -+ var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size); -+ this.index += size; -+ return result; -+}; -+module.exports = Uint8ArrayReader; -+ -+}, -+"4GRDy1YX7zT/UIqqC38MBvLEX0CoGgrUGLsl5/ecYGE=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * ws: a node.js websocket client -+ * Copyright(c) 2011 Einar Otto Stangvik -+ * MIT Licensed -+ */ -+ -+'use strict'; -+ -+const EventEmitter = require('events'); -+const crypto = require('crypto'); -+const Ultron = require('ultron'); -+const https = require('https'); -+const http = require('http'); -+const url = require('url'); -+ -+const PerMessageDeflate = require('./PerMessageDeflate'); -+const EventTarget = require('./EventTarget'); -+const Extensions = require('./Extensions'); -+const constants = require('./Constants'); -+const Receiver = require('./Receiver'); -+const Sender = require('./Sender'); -+ -+const protocolVersions = [8, 13]; -+const closeTimeout = 30 * 1000; // Allow 30 seconds to terminate the connection cleanly. -+ -+/** -+ * Class representing a WebSocket. -+ * -+ * @extends EventEmitter -+ */ -+class WebSocket extends EventEmitter { -+ /** -+ * Create a new `WebSocket`. -+ * -+ * @param {String} address The URL to which to connect -+ * @param {(String|String[])} protocols The subprotocols -+ * @param {Object} options Connection options -+ */ -+ constructor (address, protocols, options) { -+ super(); -+ -+ if (!protocols) { -+ protocols = []; -+ } else if (typeof protocols === 'string') { -+ protocols = [protocols]; -+ } else if (!Array.isArray(protocols)) { -+ options = protocols; -+ protocols = []; -+ } -+ -+ this.readyState = WebSocket.CONNECTING; -+ this.bytesReceived = 0; -+ this.extensions = {}; -+ this.protocol = ''; -+ -+ this._binaryType = constants.BINARY_TYPES[0]; -+ this._finalize = this.finalize.bind(this); -+ this._closeFrameReceived = false; -+ this._closeFrameSent = false; -+ this._closeMessage = ''; -+ this._closeTimer = null; -+ this._finalized = false; -+ this._closeCode = 1006; -+ this._receiver = null; -+ this._sender = null; -+ this._socket = null; -+ this._ultron = null; -+ -+ if (Array.isArray(address)) { -+ initAsServerClient.call(this, address[0], address[1], options); -+ } else { -+ initAsClient.call(this, address, protocols, options); -+ } -+ } -+ -+ get CONNECTING () { return WebSocket.CONNECTING; } -+ get CLOSING () { return WebSocket.CLOSING; } -+ get CLOSED () { return WebSocket.CLOSED; } -+ get OPEN () { return WebSocket.OPEN; } -+ -+ /** -+ * @type {Number} -+ */ -+ get bufferedAmount () { -+ var amount = 0; -+ -+ if (this._socket) { -+ amount = this._socket.bufferSize + this._sender._bufferedBytes; -+ } -+ return amount; -+ } -+ -+ /** -+ * This deviates from the WHATWG interface since ws doesn't support the required -+ * default "blob" type (instead we define a custom "nodebuffer" type). -+ * -+ * @type {String} -+ */ -+ get binaryType () { -+ return this._binaryType; -+ } -+ -+ set binaryType (type) { -+ if (constants.BINARY_TYPES.indexOf(type) < 0) return; -+ -+ this._binaryType = type; -+ -+ // -+ // Allow to change `binaryType` on the fly. -+ // -+ if (this._receiver) this._receiver._binaryType = type; -+ } -+ -+ /** -+ * Set up the socket and the internal resources. -+ * -+ * @param {net.Socket} socket The network socket between the server and client -+ * @param {Buffer} head The first packet of the upgraded stream -+ * @private -+ */ -+ setSocket (socket, head) { -+ socket.setTimeout(0); -+ socket.setNoDelay(); -+ -+ this._receiver = new Receiver(this.extensions, this._maxPayload, this.binaryType); -+ this._sender = new Sender(socket, this.extensions); -+ this._ultron = new Ultron(socket); -+ this._socket = socket; -+ -+ this._ultron.on('close', this._finalize); -+ this._ultron.on('error', this._finalize); -+ this._ultron.on('end', this._finalize); -+ -+ if (head.length > 0) socket.unshift(head); -+ -+ this._ultron.on('data', (data) => { -+ this.bytesReceived += data.length; -+ this._receiver.add(data); -+ }); -+ -+ this._receiver.onmessage = (data) => this.emit('message', data); -+ this._receiver.onping = (data) => { -+ this.pong(data, !this._isServer, true); -+ this.emit('ping', data); -+ }; -+ this._receiver.onpong = (data) => this.emit('pong', data); -+ this._receiver.onclose = (code, reason) => { -+ this._closeFrameReceived = true; -+ this._closeMessage = reason; -+ this._closeCode = code; -+ if (!this._finalized) this.close(code, reason); -+ }; -+ this._receiver.onerror = (error, code) => { -+ this._closeMessage = ''; -+ this._closeCode = code; -+ -+ // -+ // Ensure that the error is emitted even if `WebSocket#finalize()` has -+ // already been called. -+ // -+ this.readyState = WebSocket.CLOSING; -+ this.emit('error', error); -+ this.finalize(true); -+ }; -+ -+ this.readyState = WebSocket.OPEN; -+ this.emit('open'); -+ } -+ -+ /** -+ * Clean up and release internal resources. -+ * -+ * @param {(Boolean|Error)} error Indicates whether or not an error occurred -+ * @private -+ */ -+ finalize (error) { -+ if (this._finalized) return; -+ -+ this.readyState = WebSocket.CLOSING; -+ this._finalized = true; -+ -+ if (typeof error === 'object') this.emit('error', error); -+ if (!this._socket) return this.emitClose(); -+ -+ clearTimeout(this._closeTimer); -+ this._closeTimer = null; -+ -+ this._ultron.destroy(); -+ this._ultron = null; -+ -+ this._socket.on('error', constants.NOOP); -+ -+ if (!error) this._socket.end(); -+ else this._socket.destroy(); -+ -+ this._socket = null; -+ this._sender = null; -+ -+ this._receiver.cleanup(() => this.emitClose()); -+ this._receiver = null; -+ } -+ -+ /** -+ * Emit the `close` event. -+ * -+ * @private -+ */ -+ emitClose () { -+ this.readyState = WebSocket.CLOSED; -+ -+ this.emit('close', this._closeCode, this._closeMessage); -+ -+ if (this.extensions[PerMessageDeflate.extensionName]) { -+ this.extensions[PerMessageDeflate.extensionName].cleanup(); -+ } -+ -+ this.extensions = null; -+ -+ this.removeAllListeners(); -+ } -+ -+ /** -+ * Pause the socket stream. -+ * -+ * @public -+ */ -+ pause () { -+ if (this.readyState !== WebSocket.OPEN) throw new Error('not opened'); -+ -+ this._socket.pause(); -+ } -+ -+ /** -+ * Resume the socket stream -+ * -+ * @public -+ */ -+ resume () { -+ if (this.readyState !== WebSocket.OPEN) throw new Error('not opened'); -+ -+ this._socket.resume(); -+ } -+ -+ /** -+ * Start a closing handshake. -+ * -+ * +----------+ +-----------+ +----------+ -+ * + - - -|ws.close()|---->|close frame|-->|ws.close()|- - - - -+ * +----------+ +-----------+ +----------+ | -+ * | +----------+ +-----------+ | -+ * |ws.close()|<----|close frame|<--------+ | -+ * +----------+ +-----------+ | -+ * CLOSING | +---+ | CLOSING -+ * | +---|fin|<------------+ -+ * | | | +---+ | -+ * | | +---+ +-------------+ -+ * | +----------+-->|fin|----->|ws.finalize()| - - + -+ * | +---+ +-------------+ -+ * | +-------------+ | -+ * - - -|ws.finalize()|<--+ -+ * +-------------+ -+ * -+ * @param {Number} code Status code explaining why the connection is closing -+ * @param {String} data A string explaining why the connection is closing -+ * @public -+ */ -+ close (code, data) { -+ if (this.readyState === WebSocket.CLOSED) return; -+ if (this.readyState === WebSocket.CONNECTING) { -+ this._req.abort(); -+ this.finalize(new Error('closed before the connection is established')); -+ return; -+ } -+ -+ if (this.readyState === WebSocket.CLOSING) { -+ if (this._closeFrameSent && this._closeFrameReceived) this._socket.end(); -+ return; -+ } -+ -+ this.readyState = WebSocket.CLOSING; -+ this._sender.close(code, data, !this._isServer, (err) => { -+ // -+ // This error is handled by the `'error'` listener on the socket. We only -+ // want to know if the close frame has been sent here. -+ // -+ if (err) return; -+ -+ this._closeFrameSent = true; -+ -+ if (!this._finalized) { -+ if (this._closeFrameReceived) this._socket.end(); -+ -+ // -+ // Ensure that the connection is cleaned up even when the closing -+ // handshake fails. -+ // -+ this._closeTimer = setTimeout(this._finalize, closeTimeout, true); -+ } -+ }); -+ } -+ -+ /** -+ * Send a ping message. -+ * -+ * @param {*} data The message to send -+ * @param {Boolean} mask Indicates whether or not to mask `data` -+ * @param {Boolean} failSilently Indicates whether or not to throw if `readyState` isn't `OPEN` -+ * @public -+ */ -+ ping (data, mask, failSilently) { -+ if (this.readyState !== WebSocket.OPEN) { -+ if (failSilently) return; -+ throw new Error('not opened'); -+ } -+ -+ if (typeof data === 'number') data = data.toString(); -+ if (mask === undefined) mask = !this._isServer; -+ this._sender.ping(data || constants.EMPTY_BUFFER, mask); -+ } -+ -+ /** -+ * Send a pong message. -+ * -+ * @param {*} data The message to send -+ * @param {Boolean} mask Indicates whether or not to mask `data` -+ * @param {Boolean} failSilently Indicates whether or not to throw if `readyState` isn't `OPEN` -+ * @public -+ */ -+ pong (data, mask, failSilently) { -+ if (this.readyState !== WebSocket.OPEN) { -+ if (failSilently) return; -+ throw new Error('not opened'); -+ } -+ -+ if (typeof data === 'number') data = data.toString(); -+ if (mask === undefined) mask = !this._isServer; -+ this._sender.pong(data || constants.EMPTY_BUFFER, mask); -+ } -+ -+ /** -+ * Send a data message. -+ * -+ * @param {*} data The message to send -+ * @param {Object} options Options object -+ * @param {Boolean} options.compress Specifies whether or not to compress `data` -+ * @param {Boolean} options.binary Specifies whether `data` is binary or text -+ * @param {Boolean} options.fin Specifies whether the fragment is the last one -+ * @param {Boolean} options.mask Specifies whether or not to mask `data` -+ * @param {Function} cb Callback which is executed when data is written out -+ * @public -+ */ -+ send (data, options, cb) { -+ if (typeof options === 'function') { -+ cb = options; -+ options = {}; -+ } -+ -+ if (this.readyState !== WebSocket.OPEN) { -+ if (cb) cb(new Error('not opened')); -+ else throw new Error('not opened'); -+ return; -+ } -+ -+ if (typeof data === 'number') data = data.toString(); -+ -+ const opts = Object.assign({ -+ binary: typeof data !== 'string', -+ mask: !this._isServer, -+ compress: true, -+ fin: true -+ }, options); -+ -+ if (!this.extensions[PerMessageDeflate.extensionName]) { -+ opts.compress = false; -+ } -+ -+ this._sender.send(data || constants.EMPTY_BUFFER, opts, cb); -+ } -+ -+ /** -+ * Forcibly close the connection. -+ * -+ * @public -+ */ -+ terminate () { -+ if (this.readyState === WebSocket.CLOSED) return; -+ if (this.readyState === WebSocket.CONNECTING) { -+ this._req.abort(); -+ this.finalize(new Error('closed before the connection is established')); -+ return; -+ } -+ -+ this.finalize(true); -+ } -+} -+ -+WebSocket.CONNECTING = 0; -+WebSocket.OPEN = 1; -+WebSocket.CLOSING = 2; -+WebSocket.CLOSED = 3; -+ -+// -+// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes. -+// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface -+// -+['open', 'error', 'close', 'message'].forEach((method) => { -+ Object.defineProperty(WebSocket.prototype, `on${method}`, { -+ /** -+ * Return the listener of the event. -+ * -+ * @return {(Function|undefined)} The event listener or `undefined` -+ * @public -+ */ -+ get () { -+ const listeners = this.listeners(method); -+ for (var i = 0; i < listeners.length; i++) { -+ if (listeners[i]._listener) return listeners[i]._listener; -+ } -+ }, -+ /** -+ * Add a listener for the event. -+ * -+ * @param {Function} listener The listener to add -+ * @public -+ */ -+ set (listener) { -+ const listeners = this.listeners(method); -+ for (var i = 0; i < listeners.length; i++) { -+ // -+ // Remove only the listeners added via `addEventListener`. -+ // -+ if (listeners[i]._listener) this.removeListener(method, listeners[i]); -+ } -+ this.addEventListener(method, listener); -+ } -+ }); -+}); -+ -+WebSocket.prototype.addEventListener = EventTarget.addEventListener; -+WebSocket.prototype.removeEventListener = EventTarget.removeEventListener; -+ -+module.exports = WebSocket; -+ -+/** -+ * Initialize a WebSocket server client. -+ * -+ * @param {http.IncomingMessage} req The request object -+ * @param {net.Socket} socket The network socket between the server and client -+ * @param {Buffer} head The first packet of the upgraded stream -+ * @param {Object} options WebSocket attributes -+ * @param {Number} options.protocolVersion The WebSocket protocol version -+ * @param {Object} options.extensions The negotiated extensions -+ * @param {Number} options.maxPayload The maximum allowed message size -+ * @param {String} options.protocol The chosen subprotocol -+ * @private -+ */ -+function initAsServerClient (socket, head, options) { -+ this.protocolVersion = options.protocolVersion; -+ this._maxPayload = options.maxPayload; -+ this.extensions = options.extensions; -+ this.protocol = options.protocol; -+ -+ this._isServer = true; -+ -+ this.setSocket(socket, head); -+} -+ -+/** -+ * Initialize a WebSocket client. -+ * -+ * @param {String} address The URL to which to connect -+ * @param {String[]} protocols The list of subprotocols -+ * @param {Object} options Connection options -+ * @param {String} options.protocol Value of the `Sec-WebSocket-Protocol` header -+ * @param {(Boolean|Object)} options.perMessageDeflate Enable/disable permessage-deflate -+ * @param {Number} options.handshakeTimeout Timeout in milliseconds for the handshake request -+ * @param {String} options.localAddress Local interface to bind for network connections -+ * @param {Number} options.protocolVersion Value of the `Sec-WebSocket-Version` header -+ * @param {Object} options.headers An object containing request headers -+ * @param {String} options.origin Value of the `Origin` or `Sec-WebSocket-Origin` header -+ * @param {http.Agent} options.agent Use the specified Agent -+ * @param {String} options.host Value of the `Host` header -+ * @param {Number} options.family IP address family to use during hostname lookup (4 or 6). -+ * @param {Function} options.checkServerIdentity A function to validate the server hostname -+ * @param {Boolean} options.rejectUnauthorized Verify or not the server certificate -+ * @param {String} options.passphrase The passphrase for the private key or pfx -+ * @param {String} options.ciphers The ciphers to use or exclude -+ * @param {String} options.ecdhCurve The curves for ECDH key agreement to use or exclude -+ * @param {(String|String[]|Buffer|Buffer[])} options.cert The certificate key -+ * @param {(String|String[]|Buffer|Buffer[])} options.key The private key -+ * @param {(String|Buffer)} options.pfx The private key, certificate, and CA certs -+ * @param {(String|String[]|Buffer|Buffer[])} options.ca Trusted certificates -+ * @private -+ */ -+function initAsClient (address, protocols, options) { -+ options = Object.assign({ -+ protocolVersion: protocolVersions[1], -+ protocol: protocols.join(','), -+ perMessageDeflate: true, -+ handshakeTimeout: null, -+ localAddress: null, -+ headers: null, -+ family: null, -+ origin: null, -+ agent: null, -+ host: null, -+ -+ // -+ // SSL options. -+ // -+ checkServerIdentity: null, -+ rejectUnauthorized: null, -+ passphrase: null, -+ ciphers: null, -+ ecdhCurve: null, -+ cert: null, -+ key: null, -+ pfx: null, -+ ca: null -+ }, options); -+ -+ if (protocolVersions.indexOf(options.protocolVersion) === -1) { -+ throw new Error( -+ `unsupported protocol version: ${options.protocolVersion} ` + -+ `(supported versions: ${protocolVersions.join(', ')})` -+ ); -+ } -+ -+ this.protocolVersion = options.protocolVersion; -+ this._isServer = false; -+ this.url = address; -+ -+ const serverUrl = url.parse(address); -+ const isUnixSocket = serverUrl.protocol === 'ws+unix:'; -+ -+ if (!serverUrl.host && (!isUnixSocket || !serverUrl.path)) { -+ throw new Error('invalid url'); -+ } -+ -+ const isSecure = serverUrl.protocol === 'wss:' || serverUrl.protocol === 'https:'; -+ const key = crypto.randomBytes(16).toString('base64'); -+ const httpObj = isSecure ? https : http; -+ var perMessageDeflate; -+ -+ const requestOptions = { -+ port: serverUrl.port || (isSecure ? 443 : 80), -+ host: serverUrl.hostname, -+ path: '/', -+ headers: { -+ 'Sec-WebSocket-Version': options.protocolVersion, -+ 'Sec-WebSocket-Key': key, -+ 'Connection': 'Upgrade', -+ 'Upgrade': 'websocket' -+ } -+ }; -+ -+ if (options.headers) Object.assign(requestOptions.headers, options.headers); -+ if (options.perMessageDeflate) { -+ perMessageDeflate = new PerMessageDeflate( -+ options.perMessageDeflate !== true ? options.perMessageDeflate : {}, -+ false -+ ); -+ requestOptions.headers['Sec-WebSocket-Extensions'] = Extensions.format({ -+ [PerMessageDeflate.extensionName]: perMessageDeflate.offer() -+ }); -+ } -+ if (options.protocol) { -+ requestOptions.headers['Sec-WebSocket-Protocol'] = options.protocol; -+ } -+ if (options.origin) { -+ if (options.protocolVersion < 13) { -+ requestOptions.headers['Sec-WebSocket-Origin'] = options.origin; -+ } else { -+ requestOptions.headers.Origin = options.origin; -+ } -+ } -+ if (options.host) requestOptions.headers.Host = options.host; -+ if (serverUrl.auth) requestOptions.auth = serverUrl.auth; -+ -+ if (options.localAddress) requestOptions.localAddress = options.localAddress; -+ if (options.family) requestOptions.family = options.family; -+ -+ if (isUnixSocket) { -+ const parts = serverUrl.path.split(':'); -+ -+ requestOptions.socketPath = parts[0]; -+ requestOptions.path = parts[1]; -+ } else if (serverUrl.path) { -+ // -+ // Make sure that path starts with `/`. -+ // -+ if (serverUrl.path.charAt(0) !== '/') { -+ requestOptions.path = `/${serverUrl.path}`; -+ } else { -+ requestOptions.path = serverUrl.path; -+ } -+ } -+ -+ var agent = options.agent; -+ -+ // -+ // A custom agent is required for these options. -+ // -+ if ( -+ options.rejectUnauthorized != null || -+ options.checkServerIdentity || -+ options.passphrase || -+ options.ciphers || -+ options.ecdhCurve || -+ options.cert || -+ options.key || -+ options.pfx || -+ options.ca -+ ) { -+ if (options.passphrase) requestOptions.passphrase = options.passphrase; -+ if (options.ciphers) requestOptions.ciphers = options.ciphers; -+ if (options.ecdhCurve) requestOptions.ecdhCurve = options.ecdhCurve; -+ if (options.cert) requestOptions.cert = options.cert; -+ if (options.key) requestOptions.key = options.key; -+ if (options.pfx) requestOptions.pfx = options.pfx; -+ if (options.ca) requestOptions.ca = options.ca; -+ if (options.checkServerIdentity) { -+ requestOptions.checkServerIdentity = options.checkServerIdentity; -+ } -+ if (options.rejectUnauthorized != null) { -+ requestOptions.rejectUnauthorized = options.rejectUnauthorized; -+ } -+ -+ if (!agent) agent = new httpObj.Agent(requestOptions); -+ } -+ -+ if (agent) requestOptions.agent = agent; -+ -+ this._req = httpObj.get(requestOptions); -+ -+ if (options.handshakeTimeout) { -+ this._req.setTimeout(options.handshakeTimeout, () => { -+ this._req.abort(); -+ this.finalize(new Error('opening handshake has timed out')); -+ }); -+ } -+ -+ this._req.on('error', (error) => { -+ if (this._req.aborted) return; -+ -+ this._req = null; -+ this.finalize(error); -+ }); -+ -+ this._req.on('response', (res) => { -+ if (!this.emit('unexpected-response', this._req, res)) { -+ this._req.abort(); -+ this.finalize(new Error(`unexpected server response (${res.statusCode})`)); -+ } -+ }); -+ -+ this._req.on('upgrade', (res, socket, head) => { -+ this.emit('headers', res.headers, res); -+ -+ // -+ // The user may have closed the connection from a listener of the `headers` -+ // event. -+ // -+ if (this.readyState !== WebSocket.CONNECTING) return; -+ -+ this._req = null; -+ -+ const digest = crypto.createHash('sha1') -+ .update(key + constants.GUID, 'binary') -+ .digest('base64'); -+ -+ if (res.headers['sec-websocket-accept'] !== digest) { -+ socket.destroy(); -+ return this.finalize(new Error('invalid server key')); -+ } -+ -+ const serverProt = res.headers['sec-websocket-protocol']; -+ const protList = (options.protocol || '').split(/, */); -+ var protError; -+ -+ if (!options.protocol && serverProt) { -+ protError = 'server sent a subprotocol even though none requested'; -+ } else if (options.protocol && !serverProt) { -+ protError = 'server sent no subprotocol even though requested'; -+ } else if (serverProt && protList.indexOf(serverProt) === -1) { -+ protError = 'server responded with an invalid protocol'; -+ } -+ -+ if (protError) { -+ socket.destroy(); -+ return this.finalize(new Error(protError)); -+ } -+ -+ if (serverProt) this.protocol = serverProt; -+ -+ if (perMessageDeflate) { -+ try { -+ const serverExtensions = Extensions.parse( -+ res.headers['sec-websocket-extensions'] -+ ); -+ -+ if (serverExtensions[PerMessageDeflate.extensionName]) { -+ perMessageDeflate.accept( -+ serverExtensions[PerMessageDeflate.extensionName] -+ ); -+ this.extensions[PerMessageDeflate.extensionName] = perMessageDeflate; -+ } -+ } catch (err) { -+ socket.destroy(); -+ this.finalize(new Error('invalid Sec-WebSocket-Extensions header')); -+ return; -+ } -+ } -+ -+ this.setSocket(socket, head); -+ }); -+} -+ -+}, -+"4HnDszALSP6XmfpvCP2hkurZktoNaurAvx3QXurzcp8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var safe = require('safe-regex'); -+var define = require('define-property'); -+var extend = require('extend-shallow'); -+var not = require('regex-not'); -+var MAX_LENGTH = 1024 * 64; -+ -+/** -+ * Session cache -+ */ -+ -+var cache = {}; -+ -+/** -+ * Create a regular expression from the given `pattern` string. -+ * -+ * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. -+ * @param {Object} `options` -+ * @return {RegExp} -+ * @api public -+ */ -+ -+module.exports = function(patterns, options) { -+ if (!Array.isArray(patterns)) { -+ return makeRe(patterns, options); -+ } -+ return makeRe(patterns.join('|'), options); -+}; -+ -+/** -+ * Create a regular expression from the given `pattern` string. -+ * -+ * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. -+ * @param {Object} `options` -+ * @return {RegExp} -+ * @api public -+ */ -+ -+function makeRe(pattern, options) { -+ if (pattern instanceof RegExp) { -+ return pattern; -+ } -+ -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected a string'); -+ } -+ -+ if (pattern.length > MAX_LENGTH) { -+ throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); -+ } -+ -+ var key = pattern; -+ // do this before shallow cloning options, it's a lot faster -+ if (!options || (options && options.cache !== false)) { -+ key = createKey(pattern, options); -+ -+ if (cache.hasOwnProperty(key)) { -+ return cache[key]; -+ } -+ } -+ -+ var opts = extend({}, options); -+ if (opts.contains === true) { -+ if (opts.negate === true) { -+ opts.strictNegate = false; -+ } else { -+ opts.strict = false; -+ } -+ } -+ -+ if (opts.strict === false) { -+ opts.strictOpen = false; -+ opts.strictClose = false; -+ } -+ -+ var open = opts.strictOpen !== false ? '^' : ''; -+ var close = opts.strictClose !== false ? '$' : ''; -+ var flags = opts.flags || ''; -+ var regex; -+ -+ if (opts.nocase === true && !/i/.test(flags)) { -+ flags += 'i'; -+ } -+ -+ try { -+ if (opts.negate || typeof opts.strictNegate === 'boolean') { -+ pattern = not.create(pattern, opts); -+ } -+ -+ var str = open + '(?:' + pattern + ')' + close; -+ regex = new RegExp(str, flags); -+ -+ if (opts.safe === true && safe(regex) === false) { -+ throw new Error('potentially unsafe regular expression: ' + regex.source); -+ } -+ -+ } catch (err) { -+ if (opts.strictErrors === true || opts.safe === true) { -+ err.key = key; -+ err.pattern = pattern; -+ err.originalOptions = options; -+ err.createdOptions = opts; -+ throw err; -+ } -+ -+ try { -+ regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); -+ } catch (err) { -+ regex = /.^/; //<= match nothing -+ } -+ } -+ -+ if (opts.cache !== false) { -+ memoize(regex, key, pattern, opts); -+ } -+ return regex; -+} -+ -+/** -+ * Memoize generated regex. This can result in dramatic speed improvements -+ * and simplify debugging by adding options and pattern to the regex. It can be -+ * disabled by passing setting `options.cache` to false. -+ */ -+ -+function memoize(regex, key, pattern, options) { -+ define(regex, 'cached', true); -+ define(regex, 'pattern', pattern); -+ define(regex, 'options', options); -+ define(regex, 'key', key); -+ cache[key] = regex; -+} -+ -+/** -+ * Create the key to use for memoization. The key is generated -+ * by iterating over the options and concatenating key-value pairs -+ * to the pattern string. -+ */ -+ -+function createKey(pattern, options) { -+ if (!options) return pattern; -+ var key = pattern; -+ for (var prop in options) { -+ if (options.hasOwnProperty(prop)) { -+ key += ';' + prop + '=' + String(options[prop]); -+ } -+ } -+ return key; -+} -+ -+/** -+ * Expose `makeRe` -+ */ -+ -+module.exports.makeRe = makeRe; -+ -+}, -+"4IVB8OTDJVzCpLVB+ANFWCR8ERle6adXQP3e+vHjH5s=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { version } = require('../package.json') -+ -+module.exports = { version } -+ -+}, -+"4Ig68JSB9TVoYZjneHnLeiswjUy8LXMqSmPcvZUnFEc=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+/* eslint-disable no-multi-spaces */ -+const indent = ' ' -+const branchIndent = '│ ' -+const midBranchIndent = '├── ' -+const endBranchIndent = '└── ' -+const wildcardDelimiter = '*' -+const pathDelimiter = '/' -+const pathRegExp = /(?=\/)/ -+/* eslint-enable */ -+ -+function prettyPrintRoutesArray (routeArray) { -+ const mergedRouteArray = [] -+ -+ let tree = '' -+ -+ routeArray.sort((a, b) => { -+ if (!a.path || !b.path) return 0 -+ return a.path.localeCompare(b.path) -+ }) -+ -+ // merge alike paths -+ for (let i = 0; i < routeArray.length; i++) { -+ const route = routeArray[i] -+ const pathExists = mergedRouteArray.find(r => route.path === r.path) -+ if (pathExists) { -+ // path already declared, add new method and break out of loop -+ pathExists.handlers.push({ -+ method: route.method, -+ opts: route.opts.constraints || undefined -+ }) -+ continue -+ } -+ -+ const routeHandler = { -+ method: route.method, -+ opts: route.opts.constraints || undefined -+ } -+ mergedRouteArray.push({ -+ path: route.path, -+ methods: [route.method], -+ opts: [route.opts], -+ handlers: [routeHandler], -+ parents: [], -+ branchLevel: 1 -+ }) -+ } -+ -+ // insert root level path if none defined -+ if (!mergedRouteArray.filter(r => r.path === pathDelimiter).length) { -+ const rootPath = { -+ path: pathDelimiter, -+ truncatedPath: '', -+ methods: [], -+ opts: [], -+ handlers: [{}], -+ parents: [pathDelimiter] -+ } -+ -+ // if wildcard route exists, insert root level after wildcard -+ if (mergedRouteArray.filter(r => r.path === wildcardDelimiter).length) { -+ mergedRouteArray.splice(1, 0, rootPath) -+ } else { -+ mergedRouteArray.unshift(rootPath) -+ } -+ } -+ -+ // build tree -+ const routeTree = buildRouteTree(mergedRouteArray) -+ -+ // draw tree -+ routeTree.forEach((rootBranch, idx) => { -+ tree += drawBranch(rootBranch, null, idx === routeTree.length - 1, false, true) -+ tree += '\n' // newline characters inserted at beginning of drawing function to allow for nested paths -+ }) -+ -+ return tree -+} -+ -+function buildRouteTree (mergedRouteArray, rootPath) { -+ rootPath = rootPath || pathDelimiter -+ -+ const result = [] -+ const temp = { result } -+ mergedRouteArray.forEach((route, idx) => { -+ let splitPath = route.path.split(pathRegExp) -+ -+ // add preceding slash for proper nesting -+ if (splitPath[0] !== pathDelimiter) { -+ // handle wildcard route -+ if (splitPath[0] !== wildcardDelimiter) splitPath = [pathDelimiter, splitPath[0].slice(1), ...splitPath.slice(1)] -+ } -+ -+ // build tree -+ splitPath.reduce((acc, path, pidx) => { -+ if (!acc[path]) { -+ acc[path] = { result: [] } -+ const pathSeg = { path, children: acc[path].result } -+ -+ if (pidx === splitPath.length - 1) pathSeg.handlers = route.handlers -+ acc.result.push(pathSeg) -+ } -+ return acc[path] -+ }, temp) -+ }) -+ -+ // unfold root object from array -+ return result -+} -+ -+function drawBranch (pathSeg, prefix, endBranch, noPrefix, rootBranch) { -+ let branch = '' -+ -+ if (!noPrefix && !rootBranch) branch += '\n' -+ if (!noPrefix) branch += `${prefix || ''}${endBranch ? endBranchIndent : midBranchIndent}` -+ branch += `${pathSeg.path}` -+ -+ if (pathSeg.handlers) { -+ const flatHandlers = pathSeg.handlers.reduce((acc, curr) => { -+ const match = acc.findIndex(h => JSON.stringify(h.opts) === JSON.stringify(curr.opts)) -+ if (match !== -1) { -+ acc[match].method = [acc[match].method, curr.method].join(', ') -+ } else { -+ acc.push(curr) -+ } -+ return acc -+ }, []) -+ -+ flatHandlers.forEach((handler, idx) => { -+ if (idx > 0) branch += `${noPrefix ? '' : prefix}${endBranch ? indent : branchIndent}${pathSeg.path}` -+ branch += ` (${handler.method || '-'})` -+ if (handler.opts && JSON.stringify(handler.opts) !== '{}') branch += ` ${JSON.stringify(handler.opts)}` -+ if (flatHandlers.length > 1 && idx !== flatHandlers.length - 1) branch += '\n' -+ }) -+ } -+ -+ if (!noPrefix) prefix = `${prefix || ''}${endBranch ? indent : branchIndent}` -+ -+ pathSeg.children.forEach((child, idx) => { -+ const endBranch = idx === pathSeg.children.length - 1 -+ const skipPrefix = (!pathSeg.handlers && pathSeg.children.length === 1) -+ branch += drawBranch(child, prefix, endBranch, skipPrefix) -+ }) -+ -+ return branch -+} -+ -+function prettyPrintFlattenedNode (flattenedNode, prefix, tail) { -+ let paramName = '' -+ const printHandlers = [] -+ -+ for (const node of flattenedNode.nodes) { -+ for (const handler of node.handlers) { -+ printHandlers.push({ method: node.method, ...handler }) -+ } -+ } -+ -+ if (printHandlers.length) { -+ printHandlers.forEach((handler, index) => { -+ let suffix = `(${handler.method || '-'})` -+ if (Object.keys(handler.constraints).length > 0) { -+ suffix += ' ' + JSON.stringify(handler.constraints) -+ } -+ -+ let name = '' -+ // find locations of parameters in prefix -+ const paramIndices = flattenedNode.prefix.split('').map((ch, idx) => ch === ':' ? idx : null).filter(idx => idx !== null) -+ if (paramIndices.length) { -+ let prevLoc = 0 -+ paramIndices.forEach((loc, idx) => { -+ // find parameter in prefix -+ name += flattenedNode.prefix.slice(prevLoc, loc + 1) -+ // insert parameters -+ name += handler.params[handler.params.length - paramIndices.length + idx] -+ if (idx === paramIndices.length - 1) name += flattenedNode.prefix.slice(loc + 1) -+ prevLoc = loc + 1 -+ }) -+ } else { -+ // there are no parameters, return full object -+ name = flattenedNode.prefix -+ } -+ -+ if (index === 0) { -+ paramName += `${name} ${suffix}` -+ return -+ } else { -+ paramName += '\n' -+ } -+ -+ paramName += `${prefix}${tail ? indent : branchIndent}${name} ${suffix}` -+ }) -+ } else { -+ paramName = flattenedNode.prefix -+ } -+ -+ let tree = `${prefix}${tail ? endBranchIndent : midBranchIndent}${paramName}\n` -+ -+ prefix = `${prefix}${tail ? indent : branchIndent}` -+ const labels = Object.keys(flattenedNode.children) -+ for (let i = 0; i < labels.length; i++) { -+ const child = flattenedNode.children[labels[i]] -+ tree += prettyPrintFlattenedNode(child, prefix, i === (labels.length - 1)) -+ } -+ return tree -+} -+ -+function flattenNode (flattened, node) { -+ if (node.handlers.length > 0) { -+ flattened.nodes.push(node) -+ } -+ -+ if (node.children) { -+ for (const child of Object.values(node.children)) { -+ // split on the slash separator but use a regex to lookahead and not actually match it, preserving it in the returned string segments -+ const childPrefixSegments = child.prefix.split(pathRegExp) -+ let cursor = flattened -+ let parent -+ for (const segment of childPrefixSegments) { -+ parent = cursor -+ cursor = cursor.children[segment] -+ if (!cursor) { -+ cursor = { -+ prefix: segment, -+ nodes: [], -+ children: {} -+ } -+ parent.children[segment] = cursor -+ } -+ } -+ flattenNode(cursor, child) -+ } -+ } -+} -+ -+function compressFlattenedNode (flattenedNode) { -+ const childKeys = Object.keys(flattenedNode.children) -+ if (flattenedNode.nodes.length === 0 && childKeys.length === 1) { -+ const child = flattenedNode.children[childKeys[0]] -+ if (child.nodes.length <= 1) { -+ compressFlattenedNode(child) -+ flattenedNode.nodes = child.nodes -+ flattenedNode.prefix += child.prefix -+ flattenedNode.children = child.children -+ return flattenedNode -+ } -+ } -+ -+ for (const key of Object.keys(flattenedNode.children)) { -+ compressFlattenedNode(flattenedNode.children[key]) -+ } -+ -+ return flattenedNode -+} -+ -+module.exports = { flattenNode, compressFlattenedNode, prettyPrintFlattenedNode, prettyPrintRoutesArray } -+ -+}, -+"4Jm/BmI9GHTxVGga/SqbCjcOi/3p5pZVXbFKcn4++mw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var define = require('define-property'); -+ -+/** -+ * Store position for a node -+ */ -+ -+module.exports = function Position(start, parser) { -+ this.start = start; -+ this.end = { line: parser.line, column: parser.column }; -+ define(this, 'content', parser.orig); -+ define(this, 'source', parser.options.source); -+}; -+ -+}, -+"4MQDzD+zwIb4xXzxUuESEiZkHkw80F5tDNWOZzM7fpg=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+/** -+ * Module dependencies -+ */ -+ -+var extend = require('extend-shallow'); -+var unique = require('array-unique'); -+var toRegex = require('to-regex'); -+ -+/** -+ * Local dependencies -+ */ -+ -+var compilers = require('./lib/compilers'); -+var parsers = require('./lib/parsers'); -+var Extglob = require('./lib/extglob'); -+var utils = require('./lib/utils'); -+var MAX_LENGTH = 1024 * 64; -+ -+/** -+ * Convert the given `extglob` pattern into a regex-compatible string. Returns -+ * an object with the compiled result and the parsed AST. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * console.log(extglob('*.!(*a)')); -+ * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' -+ * ``` -+ * @param {String} `pattern` -+ * @param {Object} `options` -+ * @return {String} -+ * @api public -+ */ -+ -+function extglob(pattern, options) { -+ return extglob.create(pattern, options).output; -+} -+ -+/** -+ * Takes an array of strings and an extglob pattern and returns a new -+ * array that contains only the strings that match the pattern. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * console.log(extglob.match(['a.a', 'a.b', 'a.c'], '*.!(*a)')); -+ * //=> ['a.b', 'a.c'] -+ * ``` -+ * @param {Array} `list` Array of strings to match -+ * @param {String} `pattern` Extglob pattern -+ * @param {Object} `options` -+ * @return {Array} Returns an array of matches -+ * @api public -+ */ -+ -+extglob.match = function(list, pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ list = utils.arrayify(list); -+ var isMatch = extglob.matcher(pattern, options); -+ var len = list.length; -+ var idx = -1; -+ var matches = []; -+ -+ while (++idx < len) { -+ var ele = list[idx]; -+ -+ if (isMatch(ele)) { -+ matches.push(ele); -+ } -+ } -+ -+ // if no options were passed, uniquify results and return -+ if (typeof options === 'undefined') { -+ return unique(matches); -+ } -+ -+ if (matches.length === 0) { -+ if (options.failglob === true) { -+ throw new Error('no matches found for "' + pattern + '"'); -+ } -+ if (options.nonull === true || options.nullglob === true) { -+ return [pattern.split('\\').join('')]; -+ } -+ } -+ -+ return options.nodupes !== false ? unique(matches) : matches; -+}; -+ -+/** -+ * Returns true if the specified `string` matches the given -+ * extglob `pattern`. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * -+ * console.log(extglob.isMatch('a.a', '*.!(*a)')); -+ * //=> false -+ * console.log(extglob.isMatch('a.b', '*.!(*a)')); -+ * //=> true -+ * ``` -+ * @param {String} `string` String to match -+ * @param {String} `pattern` Extglob pattern -+ * @param {String} `options` -+ * @return {Boolean} -+ * @api public -+ */ -+ -+extglob.isMatch = function(str, pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string'); -+ } -+ -+ if (pattern === str) { -+ return true; -+ } -+ -+ if (pattern === '' || pattern === ' ' || pattern === '.') { -+ return pattern === str; -+ } -+ -+ var isMatch = utils.memoize('isMatch', pattern, options, extglob.matcher); -+ return isMatch(str); -+}; -+ -+/** -+ * Returns true if the given `string` contains the given pattern. Similar to `.isMatch` but -+ * the pattern can match any part of the string. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * console.log(extglob.contains('aa/bb/cc', '*b')); -+ * //=> true -+ * console.log(extglob.contains('aa/bb/cc', '*d')); -+ * //=> false -+ * ``` -+ * @param {String} `str` The string to match. -+ * @param {String} `pattern` Glob pattern to use for matching. -+ * @param {Object} `options` -+ * @return {Boolean} Returns true if the patter matches any part of `str`. -+ * @api public -+ */ -+ -+extglob.contains = function(str, pattern, options) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string'); -+ } -+ -+ if (pattern === '' || pattern === ' ' || pattern === '.') { -+ return pattern === str; -+ } -+ -+ var opts = extend({}, options, {contains: true}); -+ opts.strictClose = false; -+ opts.strictOpen = false; -+ return extglob.isMatch(str, pattern, opts); -+}; -+ -+/** -+ * Takes an extglob pattern and returns a matcher function. The returned -+ * function takes the string to match as its only argument. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * var isMatch = extglob.matcher('*.!(*a)'); -+ * -+ * console.log(isMatch('a.a')); -+ * //=> false -+ * console.log(isMatch('a.b')); -+ * //=> true -+ * ``` -+ * @param {String} `pattern` Extglob pattern -+ * @param {String} `options` -+ * @return {Boolean} -+ * @api public -+ */ -+ -+extglob.matcher = function(pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ function matcher() { -+ var re = extglob.makeRe(pattern, options); -+ return function(str) { -+ return re.test(str); -+ }; -+ } -+ -+ return utils.memoize('matcher', pattern, options, matcher); -+}; -+ -+/** -+ * Convert the given `extglob` pattern into a regex-compatible string. Returns -+ * an object with the compiled result and the parsed AST. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * console.log(extglob.create('*.!(*a)').output); -+ * //=> '(?!\\.)[^/]*?\\.(?!(?!\\.)[^/]*?a\\b).*?' -+ * ``` -+ * @param {String} `str` -+ * @param {Object} `options` -+ * @return {String} -+ * @api public -+ */ -+ -+extglob.create = function(pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ function create() { -+ var ext = new Extglob(options); -+ var ast = ext.parse(pattern, options); -+ return ext.compile(ast, options); -+ } -+ -+ return utils.memoize('create', pattern, options, create); -+}; -+ -+/** -+ * Returns an array of matches captured by `pattern` in `string`, or `null` -+ * if the pattern did not match. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * extglob.capture(pattern, string[, options]); -+ * -+ * console.log(extglob.capture('test/*.js', 'test/foo.js')); -+ * //=> ['foo'] -+ * console.log(extglob.capture('test/*.js', 'foo/bar.css')); -+ * //=> null -+ * ``` -+ * @param {String} `pattern` Glob pattern to use for matching. -+ * @param {String} `string` String to match -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. -+ * @api public -+ */ -+ -+extglob.capture = function(pattern, str, options) { -+ var re = extglob.makeRe(pattern, extend({capture: true}, options)); -+ -+ function match() { -+ return function(string) { -+ var match = re.exec(string); -+ if (!match) { -+ return null; -+ } -+ -+ return match.slice(1); -+ }; -+ } -+ -+ var capture = utils.memoize('capture', pattern, options, match); -+ return capture(str); -+}; -+ -+/** -+ * Create a regular expression from the given `pattern` and `options`. -+ * -+ * ```js -+ * var extglob = require('extglob'); -+ * var re = extglob.makeRe('*.!(*a)'); -+ * console.log(re); -+ * //=> /^[^\/]*?\.(?![^\/]*?a)[^\/]*?$/ -+ * ``` -+ * @param {String} `pattern` The pattern to convert to regex. -+ * @param {Object} `options` -+ * @return {RegExp} -+ * @api public -+ */ -+ -+extglob.makeRe = function(pattern, options) { -+ if (pattern instanceof RegExp) { -+ return pattern; -+ } -+ -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ if (pattern.length > MAX_LENGTH) { -+ throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); -+ } -+ -+ function makeRe() { -+ var opts = extend({strictErrors: false}, options); -+ if (opts.strictErrors === true) opts.strict = true; -+ var res = extglob.create(pattern, opts); -+ return toRegex(res.output, opts); -+ } -+ -+ var regex = utils.memoize('makeRe', pattern, options, makeRe); -+ if (regex.source.length > MAX_LENGTH) { -+ throw new SyntaxError('potentially malicious regex detected'); -+ } -+ -+ return regex; -+}; -+ -+/** -+ * Cache -+ */ -+ -+extglob.cache = utils.cache; -+extglob.clearCache = function() { -+ extglob.cache.__data__ = {}; -+}; -+ -+/** -+ * Expose `Extglob` constructor, parsers and compilers -+ */ -+ -+extglob.Extglob = Extglob; -+extglob.compilers = compilers; -+extglob.parsers = parsers; -+ -+/** -+ * Expose `extglob` -+ * @type {Function} -+ */ -+ -+module.exports = extglob; -+ -+}, -+"4MQUjtJnon8Dq6n5o0y6S63iCQwPEpBZB1OeOMhCq7w=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// (C) 1995-2013 Jean-loup Gailly and Mark Adler -+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -+// -+// This software is provided 'as-is', without any express or implied -+// warranty. In no event will the authors be held liable for any damages -+// arising from the use of this software. -+// -+// Permission is granted to anyone to use this software for any purpose, -+// including commercial applications, and to alter it and redistribute it -+// freely, subject to the following restrictions: -+// -+// 1. The origin of this software must not be misrepresented; you must not -+// claim that you wrote the original software. If you use this software -+// in a product, an acknowledgment in the product documentation would be -+// appreciated but is not required. -+// 2. Altered source versions must be plainly marked as such, and must not be -+// misrepresented as being the original software. -+// 3. This notice may not be removed or altered from any source distribution. -+ -+module.exports = { -+ -+ /* Allowed flush values; see deflate() and inflate() below for details */ -+ Z_NO_FLUSH: 0, -+ Z_PARTIAL_FLUSH: 1, -+ Z_SYNC_FLUSH: 2, -+ Z_FULL_FLUSH: 3, -+ Z_FINISH: 4, -+ Z_BLOCK: 5, -+ Z_TREES: 6, -+ -+ /* Return codes for the compression/decompression functions. Negative values -+ * are errors, positive values are used for special but normal events. -+ */ -+ Z_OK: 0, -+ Z_STREAM_END: 1, -+ Z_NEED_DICT: 2, -+ Z_ERRNO: -1, -+ Z_STREAM_ERROR: -2, -+ Z_DATA_ERROR: -3, -+ //Z_MEM_ERROR: -4, -+ Z_BUF_ERROR: -5, -+ //Z_VERSION_ERROR: -6, -+ -+ /* compression levels */ -+ Z_NO_COMPRESSION: 0, -+ Z_BEST_SPEED: 1, -+ Z_BEST_COMPRESSION: 9, -+ Z_DEFAULT_COMPRESSION: -1, -+ -+ -+ Z_FILTERED: 1, -+ Z_HUFFMAN_ONLY: 2, -+ Z_RLE: 3, -+ Z_FIXED: 4, -+ Z_DEFAULT_STRATEGY: 0, -+ -+ /* Possible values of the data_type field (though see inflate()) */ -+ Z_BINARY: 0, -+ Z_TEXT: 1, -+ //Z_ASCII: 1, // = Z_TEXT (deprecated) -+ Z_UNKNOWN: 2, -+ -+ /* The deflate compression method */ -+ Z_DEFLATED: 8 -+ //Z_NULL: null // Use -1 or null inline, depending on var type -+}; -+ -+}, -+"4N88g2JgXjt0WRHjT+ErzOW+C5RaHW6mL7MPeYdKrH0=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -+ if (k2 === undefined) k2 = k; -+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -+}) : (function(o, m, k, k2) { -+ if (k2 === undefined) k2 = k; -+ o[k2] = m[k]; -+})); -+var __exportStar = (this && this.__exportStar) || function(m, exports) { -+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -+}; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.CancelError = exports.ParseError = void 0; -+const core_1 = require("../core"); -+/** -+An error to be thrown when server response code is 2xx, and parsing body fails. -+Includes a `response` property. -+*/ -+class ParseError extends core_1.RequestError { -+ constructor(error, response) { -+ const { options } = response.request; -+ super(`${error.message} in "${options.url.toString()}"`, error, response.request); -+ this.name = 'ParseError'; -+ } -+} -+exports.ParseError = ParseError; -+/** -+An error to be thrown when the request is aborted with `.cancel()`. -+*/ -+class CancelError extends core_1.RequestError { -+ constructor(request) { -+ super('Promise was canceled', {}, request); -+ this.name = 'CancelError'; -+ } -+ get isCanceled() { -+ return true; -+ } -+} -+exports.CancelError = CancelError; -+__exportStar(require("../core"), exports); -+ -+}, -+"4Tgc/iGKVY8PAoHavByULFmgc26MnOslg//c9PqqWrA=": -+function (require, module, exports, __dirname, __filename) { -+module.exports.point = justType('Point', 'POINT'); -+module.exports.line = justType('LineString', 'POLYLINE'); -+module.exports.polygon = justType('Polygon', 'POLYGON'); -+ -+function justType(type, TYPE) { -+ return function(gj) { -+ var oftype = gj.features.filter(isType(type)); -+ return { -+ geometries: (TYPE === 'POLYGON' || TYPE === 'POLYLINE') ? [oftype.map(justCoords)] : oftype.map(justCoords), -+ properties: oftype.map(justProps), -+ type: TYPE -+ }; -+ }; -+} -+ -+function justCoords(t) { -+ if (t.geometry.coordinates[0] !== undefined && -+ t.geometry.coordinates[0][0] !== undefined && -+ t.geometry.coordinates[0][0][0] !== undefined) { -+ return t.geometry.coordinates[0]; -+ } else { -+ return t.geometry.coordinates; -+ } -+} -+ -+function justProps(t) { -+ return t.properties; -+} -+ -+function isType(t) { -+ return function(f) { return f.geometry.type === t; }; -+} -+ -+}, -+"4YNPfQgY9jFsKvAi8NIKYeik5oNruY9HvDhzvgOYRCU=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "$schema": "http://json-schema.org/draft-07/schema#", -+ "$id": "http://json-schema.org/draft-07/schema#", -+ "title": "Core schema meta-schema", -+ "definitions": { -+ "schemaArray": { -+ "type": "array", -+ "minItems": 1, -+ "items": { "$ref": "#" } -+ }, -+ "nonNegativeInteger": { -+ "type": "integer", -+ "minimum": 0 -+ }, -+ "nonNegativeIntegerDefault0": { -+ "allOf": [ -+ { "$ref": "#/definitions/nonNegativeInteger" }, -+ { "default": 0 } -+ ] -+ }, -+ "simpleTypes": { -+ "enum": [ -+ "array", -+ "boolean", -+ "integer", -+ "null", -+ "number", -+ "object", -+ "string" -+ ] -+ }, -+ "stringArray": { -+ "type": "array", -+ "items": { "type": "string" }, -+ "uniqueItems": true, -+ "default": [] -+ } -+ }, -+ "type": ["object", "boolean"], -+ "properties": { -+ "$id": { -+ "type": "string", -+ "format": "uri-reference" -+ }, -+ "$schema": { -+ "type": "string", -+ "format": "uri" -+ }, -+ "$ref": { -+ "type": "string", -+ "format": "uri-reference" -+ }, -+ "$comment": { -+ "type": "string" -+ }, -+ "title": { -+ "type": "string" -+ }, -+ "description": { -+ "type": "string" -+ }, -+ "default": true, -+ "readOnly": { -+ "type": "boolean", -+ "default": false -+ }, -+ "examples": { -+ "type": "array", -+ "items": true -+ }, -+ "multipleOf": { -+ "type": "number", -+ "exclusiveMinimum": 0 -+ }, -+ "maximum": { -+ "type": "number" -+ }, -+ "exclusiveMaximum": { -+ "type": "number" -+ }, -+ "minimum": { -+ "type": "number" -+ }, -+ "exclusiveMinimum": { -+ "type": "number" -+ }, -+ "maxLength": { "$ref": "#/definitions/nonNegativeInteger" }, -+ "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, -+ "pattern": { -+ "type": "string", -+ "format": "regex" -+ }, -+ "additionalItems": { "$ref": "#" }, -+ "items": { -+ "anyOf": [ -+ { "$ref": "#" }, -+ { "$ref": "#/definitions/schemaArray" } -+ ], -+ "default": true -+ }, -+ "maxItems": { "$ref": "#/definitions/nonNegativeInteger" }, -+ "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, -+ "uniqueItems": { -+ "type": "boolean", -+ "default": false -+ }, -+ "contains": { "$ref": "#" }, -+ "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" }, -+ "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" }, -+ "required": { "$ref": "#/definitions/stringArray" }, -+ "additionalProperties": { "$ref": "#" }, -+ "definitions": { -+ "type": "object", -+ "additionalProperties": { "$ref": "#" }, -+ "default": {} -+ }, -+ "properties": { -+ "type": "object", -+ "additionalProperties": { "$ref": "#" }, -+ "default": {} -+ }, -+ "patternProperties": { -+ "type": "object", -+ "additionalProperties": { "$ref": "#" }, -+ "propertyNames": { "format": "regex" }, -+ "default": {} -+ }, -+ "dependencies": { -+ "type": "object", -+ "additionalProperties": { -+ "anyOf": [ -+ { "$ref": "#" }, -+ { "$ref": "#/definitions/stringArray" } -+ ] -+ } -+ }, -+ "propertyNames": { "$ref": "#" }, -+ "const": true, -+ "enum": { -+ "type": "array", -+ "items": true, -+ "minItems": 1, -+ "uniqueItems": true -+ }, -+ "type": { -+ "anyOf": [ -+ { "$ref": "#/definitions/simpleTypes" }, -+ { -+ "type": "array", -+ "items": { "$ref": "#/definitions/simpleTypes" }, -+ "minItems": 1, -+ "uniqueItems": true -+ } -+ ] -+ }, -+ "format": { "type": "string" }, -+ "contentMediaType": { "type": "string" }, -+ "contentEncoding": { "type": "string" }, -+ "if": {"$ref": "#"}, -+ "then": {"$ref": "#"}, -+ "else": {"$ref": "#"}, -+ "allOf": { "$ref": "#/definitions/schemaArray" }, -+ "anyOf": { "$ref": "#/definitions/schemaArray" }, -+ "oneOf": { "$ref": "#/definitions/schemaArray" }, -+ "not": { "$ref": "#" } -+ }, -+ "default": true -+} -+ -+}, -+"4azff7tM1A43KjdEPS7yUE/hUk4PIUMXkSQY7VoKJG4=": -+function (require, module, exports, __dirname, __filename) { -+const compare = require('./compare') -+const neq = (a, b, loose) => compare(a, b, loose) !== 0 -+module.exports = neq -+ -+}, -+"4cyAegQ54StVUOH50QrcIFu/qDCxesfO/+YCcNfxY/U=": -+function (require, module, exports, __dirname, __filename) { -+var bytes = require('bytes') -+ -+// NOTE: the trailing slash is not a typo -+var StringDecoder = require('string_decoder/').StringDecoder -+ -+module.exports = function (stream, options, done) { -+ if (typeof options === 'function') { -+ done = options -+ options = {} -+ } else if (!options) { -+ options = {} -+ } else if (options === true) { -+ options = { -+ encoding: 'utf8' -+ } -+ } -+ -+ // convert the limit to an integer -+ var limit = null -+ if (typeof options.limit === 'number') -+ limit = options.limit -+ if (typeof options.limit === 'string') -+ limit = bytes(options.limit) -+ -+ // convert the expected length to an integer -+ var length = null -+ if (options.length != null && !isNaN(options.length)) -+ length = parseInt(options.length, 10) -+ -+ // check the length and limit options. -+ // note: we intentionally leave the stream paused, -+ // so users should handle the stream themselves. -+ if (limit !== null && length !== null && length > limit) { -+ if (typeof stream.pause === 'function') -+ stream.pause() -+ -+ process.nextTick(function () { -+ var err = makeError('request entity too large', 'entity.too.large') -+ err.status = err.statusCode = 413 -+ err.length = err.expected = length -+ err.limit = limit -+ done(err) -+ }) -+ return defer -+ } -+ -+ // streams1: assert request encoding is buffer. -+ // streams2+: assert the stream encoding is buffer. -+ // stream._decoder: streams1 -+ // state.encoding: streams2 -+ // state.decoder: streams2, specifically < 0.10.6 -+ var state = stream._readableState -+ if (stream._decoder || (state && (state.encoding || state.decoder))) { -+ if (typeof stream.pause === 'function') -+ stream.pause() -+ -+ process.nextTick(function () { -+ var err = makeError('stream encoding should not be set', -+ 'stream.encoding.set') -+ // developer error -+ err.status = err.statusCode = 500 -+ done(err) -+ }) -+ return defer -+ } -+ -+ var received = 0 -+ // note: we delegate any invalid encodings to the constructor -+ var decoder = options.encoding -+ ? new StringDecoder(options.encoding === true ? 'utf8' : options.encoding) -+ : null -+ var buffer = decoder -+ ? '' -+ : [] -+ -+ stream.on('data', onData) -+ stream.once('end', onEnd) -+ stream.once('error', onEnd) -+ stream.once('close', cleanup) -+ -+ return defer -+ -+ // yieldable support -+ function defer(fn) { -+ done = fn -+ } -+ -+ function onData(chunk) { -+ received += chunk.length -+ decoder -+ ? buffer += decoder.write(chunk) -+ : buffer.push(chunk) -+ -+ if (limit !== null && received > limit) { -+ if (typeof stream.pause === 'function') -+ stream.pause() -+ var err = makeError('request entity too large', 'entity.too.large') -+ err.status = err.statusCode = 413 -+ err.received = received -+ err.limit = limit -+ done(err) -+ cleanup() -+ } -+ } -+ -+ function onEnd(err) { -+ if (err) { -+ if (typeof stream.pause === 'function') -+ stream.pause() -+ done(err) -+ } else if (length !== null && received !== length) { -+ err = makeError('request size did not match content length', -+ 'request.size.invalid') -+ err.status = err.statusCode = 400 -+ err.received = received -+ err.length = err.expected = length -+ done(err) -+ } else { -+ done(null, decoder -+ ? buffer + decoder.end() -+ : Buffer.concat(buffer) -+ ) -+ } -+ -+ cleanup() -+ } -+ -+ function cleanup() { -+ received = buffer = null -+ -+ stream.removeListener('data', onData) -+ stream.removeListener('end', onEnd) -+ stream.removeListener('error', onEnd) -+ stream.removeListener('close', cleanup) -+ } -+} -+ -+// to create serializable errors you must re-set message so -+// that it is enumerable and you must re configure the type -+// property so that is writable and enumerable -+function makeError(message, type) { -+ var error = new Error() -+ error.message = message -+ Object.defineProperty(error, 'type', { -+ value: type, -+ enumerable: true, -+ writable: true, -+ configurable: true -+ }) -+ return error -+} -+ -+}, -+"4e6hlDpgBYx49STpqQtL7l7JiEuZeA3njpZlkrugwuU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var StringReader = require('./stringReader'); -+var NodeBufferReader = require('./nodeBufferReader'); -+var Uint8ArrayReader = require('./uint8ArrayReader'); -+var utils = require('./utils'); -+var sig = require('./signature'); -+var ZipEntry = require('./zipEntry'); -+var support = require('./support'); -+var jszipProto = require('./object'); -+// class ZipEntries {{{ -+/** -+ * All the entries in the zip file. -+ * @constructor -+ * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. -+ * @param {Object} loadOptions Options for loading the stream. -+ */ -+function ZipEntries(data, loadOptions) { -+ this.files = []; -+ this.loadOptions = loadOptions; -+ if (data) { -+ this.load(data); -+ } -+} -+ZipEntries.prototype = { -+ /** -+ * Check that the reader is on the speficied signature. -+ * @param {string} expectedSignature the expected signature. -+ * @throws {Error} if it is an other signature. -+ */ -+ checkSignature: function(expectedSignature) { -+ var signature = this.reader.readString(4); -+ if (signature !== expectedSignature) { -+ throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")"); -+ } -+ }, -+ /** -+ * Read the end of the central directory. -+ */ -+ readBlockEndOfCentral: function() { -+ this.diskNumber = this.reader.readInt(2); -+ this.diskWithCentralDirStart = this.reader.readInt(2); -+ this.centralDirRecordsOnThisDisk = this.reader.readInt(2); -+ this.centralDirRecords = this.reader.readInt(2); -+ this.centralDirSize = this.reader.readInt(4); -+ this.centralDirOffset = this.reader.readInt(4); -+ -+ this.zipCommentLength = this.reader.readInt(2); -+ // warning : the encoding depends of the system locale -+ // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded. -+ // On a windows machine, this field is encoded with the localized windows code page. -+ this.zipComment = this.reader.readString(this.zipCommentLength); -+ // To get consistent behavior with the generation part, we will assume that -+ // this is utf8 encoded. -+ this.zipComment = jszipProto.utf8decode(this.zipComment); -+ }, -+ /** -+ * Read the end of the Zip 64 central directory. -+ * Not merged with the method readEndOfCentral : -+ * The end of central can coexist with its Zip64 brother, -+ * I don't want to read the wrong number of bytes ! -+ */ -+ readBlockZip64EndOfCentral: function() { -+ this.zip64EndOfCentralSize = this.reader.readInt(8); -+ this.versionMadeBy = this.reader.readString(2); -+ this.versionNeeded = this.reader.readInt(2); -+ this.diskNumber = this.reader.readInt(4); -+ this.diskWithCentralDirStart = this.reader.readInt(4); -+ this.centralDirRecordsOnThisDisk = this.reader.readInt(8); -+ this.centralDirRecords = this.reader.readInt(8); -+ this.centralDirSize = this.reader.readInt(8); -+ this.centralDirOffset = this.reader.readInt(8); -+ -+ this.zip64ExtensibleData = {}; -+ var extraDataSize = this.zip64EndOfCentralSize - 44, -+ index = 0, -+ extraFieldId, -+ extraFieldLength, -+ extraFieldValue; -+ while (index < extraDataSize) { -+ extraFieldId = this.reader.readInt(2); -+ extraFieldLength = this.reader.readInt(4); -+ extraFieldValue = this.reader.readString(extraFieldLength); -+ this.zip64ExtensibleData[extraFieldId] = { -+ id: extraFieldId, -+ length: extraFieldLength, -+ value: extraFieldValue -+ }; -+ } -+ }, -+ /** -+ * Read the end of the Zip 64 central directory locator. -+ */ -+ readBlockZip64EndOfCentralLocator: function() { -+ this.diskWithZip64CentralDirStart = this.reader.readInt(4); -+ this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); -+ this.disksCount = this.reader.readInt(4); -+ if (this.disksCount > 1) { -+ throw new Error("Multi-volumes zip are not supported"); -+ } -+ }, -+ /** -+ * Read the local files, based on the offset read in the central part. -+ */ -+ readLocalFiles: function() { -+ var i, file; -+ for (i = 0; i < this.files.length; i++) { -+ file = this.files[i]; -+ this.reader.setIndex(file.localHeaderOffset); -+ this.checkSignature(sig.LOCAL_FILE_HEADER); -+ file.readLocalPart(this.reader); -+ file.handleUTF8(); -+ file.processAttributes(); -+ } -+ }, -+ /** -+ * Read the central directory. -+ */ -+ readCentralDir: function() { -+ var file; -+ -+ this.reader.setIndex(this.centralDirOffset); -+ while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) { -+ file = new ZipEntry({ -+ zip64: this.zip64 -+ }, this.loadOptions); -+ file.readCentralPart(this.reader); -+ this.files.push(file); -+ } -+ }, -+ /** -+ * Read the end of central directory. -+ */ -+ readEndOfCentral: function() { -+ var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); -+ if (offset === -1) { -+ // Check if the content is a truncated zip or complete garbage. -+ // A "LOCAL_FILE_HEADER" is not required at the beginning (auto -+ // extractible zip for example) but it can give a good hint. -+ // If an ajax request was used without responseType, we will also -+ // get unreadable data. -+ var isGarbage = true; -+ try { -+ this.reader.setIndex(0); -+ this.checkSignature(sig.LOCAL_FILE_HEADER); -+ isGarbage = false; -+ } catch (e) {} -+ -+ if (isGarbage) { -+ throw new Error("Can't find end of central directory : is this a zip file ? " + -+ "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html"); -+ } else { -+ throw new Error("Corrupted zip : can't find end of central directory"); -+ } -+ } -+ this.reader.setIndex(offset); -+ this.checkSignature(sig.CENTRAL_DIRECTORY_END); -+ this.readBlockEndOfCentral(); -+ -+ -+ /* extract from the zip spec : -+ 4) If one of the fields in the end of central directory -+ record is too small to hold required data, the field -+ should be set to -1 (0xFFFF or 0xFFFFFFFF) and the -+ ZIP64 format record should be created. -+ 5) The end of central directory record and the -+ Zip64 end of central directory locator record must -+ reside on the same disk when splitting or spanning -+ an archive. -+ */ -+ if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) { -+ this.zip64 = true; -+ -+ /* -+ Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from -+ the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents -+ all numbers as 64-bit double precision IEEE 754 floating point numbers. -+ So, we have 53bits for integers and bitwise operations treat everything as 32bits. -+ see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators -+ and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5 -+ */ -+ -+ // should look for a zip64 EOCD locator -+ offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); -+ if (offset === -1) { -+ throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator"); -+ } -+ this.reader.setIndex(offset); -+ this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); -+ this.readBlockZip64EndOfCentralLocator(); -+ -+ // now the zip64 EOCD record -+ this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); -+ this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); -+ this.readBlockZip64EndOfCentral(); -+ } -+ }, -+ prepareReader: function(data) { -+ var type = utils.getTypeOf(data); -+ if (type === "string" && !support.uint8array) { -+ this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString); -+ } -+ else if (type === "nodebuffer") { -+ this.reader = new NodeBufferReader(data); -+ } -+ else { -+ this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data)); -+ } -+ }, -+ /** -+ * Read a zip file and create ZipEntries. -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. -+ */ -+ load: function(data) { -+ this.prepareReader(data); -+ this.readEndOfCentral(); -+ this.readCentralDir(); -+ this.readLocalFiles(); -+ } -+}; -+// }}} end of ZipEntries -+module.exports = ZipEntries; -+ -+}, -+"4hHZpR55JX3kj446JXr99F63UQ57PIjAh2rb88Kfal0=": -+function (require, module, exports, __dirname, __filename) { -+// @flow -+ -+/*:: -+type ConstantsType = {| -+ IDLE: "IDLE", -+ STARTING: "STARTING", -+ LISTENING: "LISTENING", -+ CLOSING: "CLOSING", -+ CLOSED: "CLOSED", -+ ERROR: "ERROR", -+ TIMEOUT: "TIMEOUT" -+|} -+*/ -+ -+const Constants /*: ConstantsType */ = { -+ IDLE: "IDLE", -+ STARTING: "STARTING", -+ LISTENING: "LISTENING", -+ CLOSING: "CLOSING", -+ CLOSED: "CLOSED", -+ ERROR: "ERROR", -+ TIMEOUT: "TIMEOUT", -+}; -+ -+module.exports = Constants; -+ -+}, -+"4iJ3sVoVwJ97QyC5yyqSHvgNbloOdXK3W0FVzoTiOdM=": -+function (require, module, exports, __dirname, __filename) { -+module.exports.enlarge = function enlargeExtent(extent, pt) { -+ if (pt[0] < extent.xmin) extent.xmin = pt[0]; -+ if (pt[0] > extent.xmax) extent.xmax = pt[0]; -+ if (pt[1] < extent.ymin) extent.ymin = pt[1]; -+ if (pt[1] > extent.ymax) extent.ymax = pt[1]; -+ return extent; -+}; -+ -+module.exports.enlargeExtent = function enlargeExtent(extent, ext) { -+ if (ext.xmax > extent.xmax) extent.xmax = ext.xmax; -+ if (ext.xmin < extent.xmin) extent.xmin = ext.xmin; -+ if (ext.ymax > extent.ymax) extent.ymax = ext.ymax; -+ if (ext.ymin < extent.ymin) extent.ymin = ext.ymin; -+ return extent; -+}; -+ -+module.exports.blank = function() { -+ return { -+ xmin: Number.MAX_VALUE, -+ ymin: Number.MAX_VALUE, -+ xmax: -Number.MAX_VALUE, -+ ymax: -Number.MAX_VALUE -+ }; -+}; -+ -+}, -+"4iLeG61xXUnT5QQh4KBmmfT+lEHeX0dvkC2SmZwcHbU=": -+function (require, module, exports, __dirname, __filename) { -+var Writable = require('readable-stream').Writable -+var inherits = require('inherits') -+var bufferFrom = require('buffer-from') -+ -+if (typeof Uint8Array === 'undefined') { -+ var U8 = require('typedarray').Uint8Array -+} else { -+ var U8 = Uint8Array -+} -+ -+function ConcatStream(opts, cb) { -+ if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb) -+ -+ if (typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ if (!opts) opts = {} -+ -+ var encoding = opts.encoding -+ var shouldInferEncoding = false -+ -+ if (!encoding) { -+ shouldInferEncoding = true -+ } else { -+ encoding = String(encoding).toLowerCase() -+ if (encoding === 'u8' || encoding === 'uint8') { -+ encoding = 'uint8array' -+ } -+ } -+ -+ Writable.call(this, { objectMode: true }) -+ -+ this.encoding = encoding -+ this.shouldInferEncoding = shouldInferEncoding -+ -+ if (cb) this.on('finish', function () { cb(this.getBody()) }) -+ this.body = [] -+} -+ -+module.exports = ConcatStream -+inherits(ConcatStream, Writable) -+ -+ConcatStream.prototype._write = function(chunk, enc, next) { -+ this.body.push(chunk) -+ next() -+} -+ -+ConcatStream.prototype.inferEncoding = function (buff) { -+ var firstBuffer = buff === undefined ? this.body[0] : buff; -+ if (Buffer.isBuffer(firstBuffer)) return 'buffer' -+ if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array' -+ if (Array.isArray(firstBuffer)) return 'array' -+ if (typeof firstBuffer === 'string') return 'string' -+ if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object' -+ return 'buffer' -+} -+ -+ConcatStream.prototype.getBody = function () { -+ if (!this.encoding && this.body.length === 0) return [] -+ if (this.shouldInferEncoding) this.encoding = this.inferEncoding() -+ if (this.encoding === 'array') return arrayConcat(this.body) -+ if (this.encoding === 'string') return stringConcat(this.body) -+ if (this.encoding === 'buffer') return bufferConcat(this.body) -+ if (this.encoding === 'uint8array') return u8Concat(this.body) -+ return this.body -+} -+ -+var isArray = Array.isArray || function (arr) { -+ return Object.prototype.toString.call(arr) == '[object Array]' -+} -+ -+function isArrayish (arr) { -+ return /Array\]$/.test(Object.prototype.toString.call(arr)) -+} -+ -+function isBufferish (p) { -+ return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function') -+} -+ -+function stringConcat (parts) { -+ var strings = [] -+ var needsToString = false -+ for (var i = 0; i < parts.length; i++) { -+ var p = parts[i] -+ if (typeof p === 'string') { -+ strings.push(p) -+ } else if (Buffer.isBuffer(p)) { -+ strings.push(p) -+ } else if (isBufferish(p)) { -+ strings.push(bufferFrom(p)) -+ } else { -+ strings.push(bufferFrom(String(p))) -+ } -+ } -+ if (Buffer.isBuffer(parts[0])) { -+ strings = Buffer.concat(strings) -+ strings = strings.toString('utf8') -+ } else { -+ strings = strings.join('') -+ } -+ return strings -+} -+ -+function bufferConcat (parts) { -+ var bufs = [] -+ for (var i = 0; i < parts.length; i++) { -+ var p = parts[i] -+ if (Buffer.isBuffer(p)) { -+ bufs.push(p) -+ } else if (isBufferish(p)) { -+ bufs.push(bufferFrom(p)) -+ } else { -+ bufs.push(bufferFrom(String(p))) -+ } -+ } -+ return Buffer.concat(bufs) -+} -+ -+function arrayConcat (parts) { -+ var res = [] -+ for (var i = 0; i < parts.length; i++) { -+ res.push.apply(res, parts[i]) -+ } -+ return res -+} -+ -+function u8Concat (parts) { -+ var len = 0 -+ for (var i = 0; i < parts.length; i++) { -+ if (typeof parts[i] === 'string') { -+ parts[i] = bufferFrom(parts[i]) -+ } -+ len += parts[i].length -+ } -+ var u8 = new U8(len) -+ for (var i = 0, offset = 0; i < parts.length; i++) { -+ var part = parts[i] -+ for (var j = 0; j < part.length; j++) { -+ u8[offset++] = part[j] -+ } -+ } -+ return u8 -+} -+ -+}, -+"4jRq3GNZ3wMuPJN7rNF8nz/x0qbyjPxDRdsYzgRvL7s=": -+function (require, module, exports, __dirname, __filename) { -+var createTopology = require('topojson-server').topology -+var mergeTopology = require('topojson-client').merge -+var dissolveLineStrings = require('geojson-linestring-dissolve') -+var geomEach = require('@turf/meta').geomEach -+var flatten = require('geojson-flatten') -+ -+module.exports = dissolve -+ -+function toArray (args) { -+ if (!args.length) return [] -+ return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args) -+} -+ -+function dissolvePolygons (geoms) { -+ // Topojson modifies in place, so we need to deep clone first -+ var objects = { -+ geoms: { -+ type: 'GeometryCollection', -+ geometries: JSON.parse(JSON.stringify(geoms)) -+ } -+ } -+ var topo = createTopology(objects) -+ return mergeTopology(topo, topo.objects.geoms.geometries) -+} -+ -+// [GeoJSON] -> String|Null -+function getHomogenousType (geoms) { -+ var type = null -+ for (var i = 0; i < geoms.length; i++) { -+ if (!type) { -+ type = geoms[i].type -+ } else if (type !== geoms[i].type) { -+ return null -+ } -+ } -+ return type -+} -+ -+// Transform function: attempts to dissolve geojson objects where possible -+// [GeoJSON] -> GeoJSON geometry -+function dissolve () { -+ // accept an array of geojson objects, or an argument list -+ var objects = toArray(arguments) -+ var geoms = objects.reduce(function (acc, o) { -+ // flatten any Multi-geom into features of simple types -+ var flat = flatten(o) -+ if (!Array.isArray(flat)) flat = [flat] -+ for (var i = 0; i < flat.length; i++) { -+ // get an array of all flatten geometry objects -+ geomEach(flat[i], function (geom) { -+ acc.push(geom) -+ }) -+ } -+ return acc -+ }, []) -+ // Assert homogenity -+ var type = getHomogenousType(geoms) -+ if (!type) { -+ throw new Error('List does not contain only homoegenous GeoJSON') -+ } -+ -+ switch (type) { -+ case 'LineString': -+ return dissolveLineStrings(geoms) -+ case 'Polygon': -+ return dissolvePolygons(geoms) -+ default: -+ return geoms -+ } -+} -+ -+ -+}, -+"4p5si9F++Yw9QhonRk9sPXGFJFowRz0MQN72J/R+r60=": -+function (require, module, exports, __dirname, __filename) { -+var varint = require('varint') -+var stream = require('readable-stream') -+var util = require('util') -+var bufferAlloc = require('buffer-alloc-unsafe') -+ -+var pool = bufferAlloc(10 * 1024) -+var used = 0 -+ -+var Encoder = function () { -+ if (!(this instanceof Encoder)) return new Encoder() -+ stream.Transform.call(this) -+ this._destroyed = false -+} -+ -+util.inherits(Encoder, stream.Transform) -+ -+Encoder.prototype._transform = function (data, enc, cb) { -+ if (this._destroyed) return cb() -+ -+ varint.encode(data.length, pool, used) -+ used += varint.encode.bytes -+ -+ this.push(pool.slice(used - varint.encode.bytes, used)) -+ this.push(data) -+ -+ if (pool.length - used < 100) { -+ pool = bufferAlloc(10 * 1024) -+ used = 0 -+ } -+ -+ cb() -+} -+ -+Encoder.prototype.destroy = function (err) { -+ if (this._destroyed) return -+ this._destroyed = true -+ if (err) this.emit('error', err) -+ this.emit('close') -+} -+ -+module.exports = Encoder -+ -+}, -+"4z6gmKkdLEG+iG+7zsrLl5n+GD2KRG8TikeGyz2AmAI=": -+function (require, module, exports, __dirname, __filename) { -+var wrappy = require('wrappy') -+var reqs = Object.create(null) -+var once = require('once') -+ -+module.exports = wrappy(inflight) -+ -+function inflight (key, cb) { -+ if (reqs[key]) { -+ reqs[key].push(cb) -+ return null -+ } else { -+ reqs[key] = [cb] -+ return makeres(key) -+ } -+} -+ -+function makeres (key) { -+ return once(function RES () { -+ var cbs = reqs[key] -+ var len = cbs.length -+ var args = slice(arguments) -+ -+ // XXX It's somewhat ambiguous whether a new callback added in this -+ // pass should be queued for later execution if something in the -+ // list of callbacks throws, or if it should just be discarded. -+ // However, it's such an edge case that it hardly matters, and either -+ // choice is likely as surprising as the other. -+ // As it happens, we do go ahead and schedule it for later execution. -+ try { -+ for (var i = 0; i < len; i++) { -+ cbs[i].apply(null, args) -+ } -+ } finally { -+ if (cbs.length > len) { -+ // added more in the interim. -+ // de-zalgo, just in case, but don't call again. -+ cbs.splice(0, len) -+ process.nextTick(function () { -+ RES.apply(null, args) -+ }) -+ } else { -+ delete reqs[key] -+ } -+ } -+ }) -+} -+ -+function slice (args) { -+ var length = args.length -+ var array = [] -+ -+ for (var i = 0; i < length; i++) array[i] = args[i] -+ return array -+} -+ -+}, -+"5+xONdlNAaLk7l3KYrj7CKx0EVlu21SzmGUfTrVjVh0=": -+function (require, module, exports, __dirname, __filename) { -+// Top level file is just a mixin of submodules & constants -+'use strict'; -+ -+var assign = require('./lib/utils/common').assign; -+ -+var deflate = require('./lib/deflate'); -+var inflate = require('./lib/inflate'); -+var constants = require('./lib/zlib/constants'); -+ -+var pako = {}; -+ -+assign(pako, deflate, inflate, constants); -+ -+module.exports = pako; -+ -+}, -+"50QJROxG+y786p/gp9fhHR/BYS5W1Raa6+jVqm532Fg=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, INTERNAL, tryConvertToPromise, -+ apiRejection, Proxyable) { -+var util = require("./util"); -+var isArray = util.isArray; -+ -+function toResolutionValue(val) { -+ switch(val) { -+ case -2: return []; -+ case -3: return {}; -+ case -6: return new Map(); -+ } -+} -+ -+function PromiseArray(values) { -+ var promise = this._promise = new Promise(INTERNAL); -+ if (values instanceof Promise) { -+ promise._propagateFrom(values, 3); -+ values.suppressUnhandledRejections(); -+ } -+ promise._setOnCancel(this); -+ this._values = values; -+ this._length = 0; -+ this._totalResolved = 0; -+ this._init(undefined, -2); -+} -+util.inherits(PromiseArray, Proxyable); -+ -+PromiseArray.prototype.length = function () { -+ return this._length; -+}; -+ -+PromiseArray.prototype.promise = function () { -+ return this._promise; -+}; -+ -+PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { -+ var values = tryConvertToPromise(this._values, this._promise); -+ if (values instanceof Promise) { -+ values = values._target(); -+ var bitField = values._bitField; -+ ; -+ this._values = values; -+ -+ if (((bitField & 50397184) === 0)) { -+ this._promise._setAsyncGuaranteed(); -+ return values._then( -+ init, -+ this._reject, -+ undefined, -+ this, -+ resolveValueIfEmpty -+ ); -+ } else if (((bitField & 33554432) !== 0)) { -+ values = values._value(); -+ } else if (((bitField & 16777216) !== 0)) { -+ return this._reject(values._reason()); -+ } else { -+ return this._cancel(); -+ } -+ } -+ values = util.asArray(values); -+ if (values === null) { -+ var err = apiRejection( -+ "expecting an array or an iterable object but got " + util.classString(values)).reason(); -+ this._promise._rejectCallback(err, false); -+ return; -+ } -+ -+ if (values.length === 0) { -+ if (resolveValueIfEmpty === -5) { -+ this._resolveEmptyArray(); -+ } -+ else { -+ this._resolve(toResolutionValue(resolveValueIfEmpty)); -+ } -+ return; -+ } -+ this._iterate(values); -+}; -+ -+PromiseArray.prototype._iterate = function(values) { -+ var len = this.getActualLength(values.length); -+ this._length = len; -+ this._values = this.shouldCopyValues() ? new Array(len) : this._values; -+ var result = this._promise; -+ var isResolved = false; -+ var bitField = null; -+ for (var i = 0; i < len; ++i) { -+ var maybePromise = tryConvertToPromise(values[i], result); -+ -+ if (maybePromise instanceof Promise) { -+ maybePromise = maybePromise._target(); -+ bitField = maybePromise._bitField; -+ } else { -+ bitField = null; -+ } -+ -+ if (isResolved) { -+ if (bitField !== null) { -+ maybePromise.suppressUnhandledRejections(); -+ } -+ } else if (bitField !== null) { -+ if (((bitField & 50397184) === 0)) { -+ maybePromise._proxy(this, i); -+ this._values[i] = maybePromise; -+ } else if (((bitField & 33554432) !== 0)) { -+ isResolved = this._promiseFulfilled(maybePromise._value(), i); -+ } else if (((bitField & 16777216) !== 0)) { -+ isResolved = this._promiseRejected(maybePromise._reason(), i); -+ } else { -+ isResolved = this._promiseCancelled(i); -+ } -+ } else { -+ isResolved = this._promiseFulfilled(maybePromise, i); -+ } -+ } -+ if (!isResolved) result._setAsyncGuaranteed(); -+}; -+ -+PromiseArray.prototype._isResolved = function () { -+ return this._values === null; -+}; -+ -+PromiseArray.prototype._resolve = function (value) { -+ this._values = null; -+ this._promise._fulfill(value); -+}; -+ -+PromiseArray.prototype._cancel = function() { -+ if (this._isResolved() || !this._promise._isCancellable()) return; -+ this._values = null; -+ this._promise._cancel(); -+}; -+ -+PromiseArray.prototype._reject = function (reason) { -+ this._values = null; -+ this._promise._rejectCallback(reason, false); -+}; -+ -+PromiseArray.prototype._promiseFulfilled = function (value, index) { -+ this._values[index] = value; -+ var totalResolved = ++this._totalResolved; -+ if (totalResolved >= this._length) { -+ this._resolve(this._values); -+ return true; -+ } -+ return false; -+}; -+ -+PromiseArray.prototype._promiseCancelled = function() { -+ this._cancel(); -+ return true; -+}; -+ -+PromiseArray.prototype._promiseRejected = function (reason) { -+ this._totalResolved++; -+ this._reject(reason); -+ return true; -+}; -+ -+PromiseArray.prototype._resultCancelled = function() { -+ if (this._isResolved()) return; -+ var values = this._values; -+ this._cancel(); -+ if (values instanceof Promise) { -+ values.cancel(); -+ } else { -+ for (var i = 0; i < values.length; ++i) { -+ if (values[i] instanceof Promise) { -+ values[i].cancel(); -+ } -+ } -+ } -+}; -+ -+PromiseArray.prototype.shouldCopyValues = function () { -+ return true; -+}; -+ -+PromiseArray.prototype.getActualLength = function (len) { -+ return len; -+}; -+ -+return PromiseArray; -+}; -+ -+}, -+"52MxkulUVdUecmF9AaAJdNw1nin/jyI5/ihjmq/HtvI=": -+function (require, module, exports, __dirname, __filename) { -+// parse out just the options we care about so we always get a consistent -+// obj with keys in a consistent order. -+const opts = ['includePrerelease', 'loose', 'rtl'] -+const parseOptions = options => -+ !options ? {} -+ : typeof options !== 'object' ? { loose: true } -+ : opts.filter(k => options[k]).reduce((options, k) => { -+ options[k] = true -+ return options -+ }, {}) -+module.exports = parseOptions -+ -+}, -+"52hNBPccP2gbXrzud6fGVbxRSmLOBU4AO/VhwPBvGEk=": -+function (require, module, exports, __dirname, __filename) { -+var ctx = require('./_ctx') -+ , invoke = require('./_invoke') -+ , html = require('./_html') -+ , cel = require('./_dom-create') -+ , global = require('./_global') -+ , process = global.process -+ , setTask = global.setImmediate -+ , clearTask = global.clearImmediate -+ , MessageChannel = global.MessageChannel -+ , counter = 0 -+ , queue = {} -+ , ONREADYSTATECHANGE = 'onreadystatechange' -+ , defer, channel, port; -+var run = function(){ -+ var id = +this; -+ if(queue.hasOwnProperty(id)){ -+ var fn = queue[id]; -+ delete queue[id]; -+ fn(); -+ } -+}; -+var listener = function(event){ -+ run.call(event.data); -+}; -+// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -+if(!setTask || !clearTask){ -+ setTask = function setImmediate(fn){ -+ var args = [], i = 1; -+ while(arguments.length > i)args.push(arguments[i++]); -+ queue[++counter] = function(){ -+ invoke(typeof fn == 'function' ? fn : Function(fn), args); -+ }; -+ defer(counter); -+ return counter; -+ }; -+ clearTask = function clearImmediate(id){ -+ delete queue[id]; -+ }; -+ // Node.js 0.8- -+ if(require('./_cof')(process) == 'process'){ -+ defer = function(id){ -+ process.nextTick(ctx(run, id, 1)); -+ }; -+ // Browsers with MessageChannel, includes WebWorkers -+ } else if(MessageChannel){ -+ channel = new MessageChannel; -+ port = channel.port2; -+ channel.port1.onmessage = listener; -+ defer = ctx(port.postMessage, port, 1); -+ // Browsers with postMessage, skip WebWorkers -+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' -+ } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ -+ defer = function(id){ -+ global.postMessage(id + '', '*'); -+ }; -+ global.addEventListener('message', listener, false); -+ // IE8- -+ } else if(ONREADYSTATECHANGE in cel('script')){ -+ defer = function(id){ -+ html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ -+ html.removeChild(this); -+ run.call(id); -+ }; -+ }; -+ // Rest old browsers -+ } else { -+ defer = function(id){ -+ setTimeout(ctx(run, id, 1), 0); -+ }; -+ } -+} -+module.exports = { -+ set: setTask, -+ clear: clearTask -+}; -+}, -+"59FndCoQfQHvBrHTkvdZp6ZVNFYIxdn7Df/9kMWQq7g=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+// rfc7231 6.1 -+const statusCodeCacheableByDefault = new Set([ -+ 200, -+ 203, -+ 204, -+ 206, -+ 300, -+ 301, -+ 404, -+ 405, -+ 410, -+ 414, -+ 501, -+]); -+ -+// This implementation does not understand partial responses (206) -+const understoodStatuses = new Set([ -+ 200, -+ 203, -+ 204, -+ 300, -+ 301, -+ 302, -+ 303, -+ 307, -+ 308, -+ 404, -+ 405, -+ 410, -+ 414, -+ 501, -+]); -+ -+const errorStatusCodes = new Set([ -+ 500, -+ 502, -+ 503, -+ 504, -+]); -+ -+const hopByHopHeaders = { -+ date: true, // included, because we add Age update Date -+ connection: true, -+ 'keep-alive': true, -+ 'proxy-authenticate': true, -+ 'proxy-authorization': true, -+ te: true, -+ trailer: true, -+ 'transfer-encoding': true, -+ upgrade: true, -+}; -+ -+const excludedFromRevalidationUpdate = { -+ // Since the old body is reused, it doesn't make sense to change properties of the body -+ 'content-length': true, -+ 'content-encoding': true, -+ 'transfer-encoding': true, -+ 'content-range': true, -+}; -+ -+function toNumberOrZero(s) { -+ const n = parseInt(s, 10); -+ return isFinite(n) ? n : 0; -+} -+ -+// RFC 5861 -+function isErrorResponse(response) { -+ // consider undefined response as faulty -+ if(!response) { -+ return true -+ } -+ return errorStatusCodes.has(response.status); -+} -+ -+function parseCacheControl(header) { -+ const cc = {}; -+ if (!header) return cc; -+ -+ // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives), -+ // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale -+ const parts = header.trim().split(/\s*,\s*/); // TODO: lame parsing -+ for (const part of parts) { -+ const [k, v] = part.split(/\s*=\s*/, 2); -+ cc[k] = v === undefined ? true : v.replace(/^"|"$/g, ''); // TODO: lame unquoting -+ } -+ -+ return cc; -+} -+ -+function formatCacheControl(cc) { -+ let parts = []; -+ for (const k in cc) { -+ const v = cc[k]; -+ parts.push(v === true ? k : k + '=' + v); -+ } -+ if (!parts.length) { -+ return undefined; -+ } -+ return parts.join(', '); -+} -+ -+module.exports = class CachePolicy { -+ constructor( -+ req, -+ res, -+ { -+ shared, -+ cacheHeuristic, -+ immutableMinTimeToLive, -+ ignoreCargoCult, -+ _fromObject, -+ } = {} -+ ) { -+ if (_fromObject) { -+ this._fromObject(_fromObject); -+ return; -+ } -+ -+ if (!res || !res.headers) { -+ throw Error('Response headers missing'); -+ } -+ this._assertRequestHasHeaders(req); -+ -+ this._responseTime = this.now(); -+ this._isShared = shared !== false; -+ this._cacheHeuristic = -+ undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE -+ this._immutableMinTtl = -+ undefined !== immutableMinTimeToLive -+ ? immutableMinTimeToLive -+ : 24 * 3600 * 1000; -+ -+ this._status = 'status' in res ? res.status : 200; -+ this._resHeaders = res.headers; -+ this._rescc = parseCacheControl(res.headers['cache-control']); -+ this._method = 'method' in req ? req.method : 'GET'; -+ this._url = req.url; -+ this._host = req.headers.host; -+ this._noAuthorization = !req.headers.authorization; -+ this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used -+ this._reqcc = parseCacheControl(req.headers['cache-control']); -+ -+ // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching, -+ // so there's no point stricly adhering to the blindly copy&pasted directives. -+ if ( -+ ignoreCargoCult && -+ 'pre-check' in this._rescc && -+ 'post-check' in this._rescc -+ ) { -+ delete this._rescc['pre-check']; -+ delete this._rescc['post-check']; -+ delete this._rescc['no-cache']; -+ delete this._rescc['no-store']; -+ delete this._rescc['must-revalidate']; -+ this._resHeaders = Object.assign({}, this._resHeaders, { -+ 'cache-control': formatCacheControl(this._rescc), -+ }); -+ delete this._resHeaders.expires; -+ delete this._resHeaders.pragma; -+ } -+ -+ // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive -+ // as having the same effect as if "Cache-Control: no-cache" were present (see Section 5.2.1). -+ if ( -+ res.headers['cache-control'] == null && -+ /no-cache/.test(res.headers.pragma) -+ ) { -+ this._rescc['no-cache'] = true; -+ } -+ } -+ -+ now() { -+ return Date.now(); -+ } -+ -+ storable() { -+ // The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it. -+ return !!( -+ !this._reqcc['no-store'] && -+ // A cache MUST NOT store a response to any request, unless: -+ // The request method is understood by the cache and defined as being cacheable, and -+ ('GET' === this._method || -+ 'HEAD' === this._method || -+ ('POST' === this._method && this._hasExplicitExpiration())) && -+ // the response status code is understood by the cache, and -+ understoodStatuses.has(this._status) && -+ // the "no-store" cache directive does not appear in request or response header fields, and -+ !this._rescc['no-store'] && -+ // the "private" response directive does not appear in the response, if the cache is shared, and -+ (!this._isShared || !this._rescc.private) && -+ // the Authorization header field does not appear in the request, if the cache is shared, -+ (!this._isShared || -+ this._noAuthorization || -+ this._allowsStoringAuthenticated()) && -+ // the response either: -+ // contains an Expires header field, or -+ (this._resHeaders.expires || -+ // contains a max-age response directive, or -+ // contains a s-maxage response directive and the cache is shared, or -+ // contains a public response directive. -+ this._rescc['max-age'] || -+ (this._isShared && this._rescc['s-maxage']) || -+ this._rescc.public || -+ // has a status code that is defined as cacheable by default -+ statusCodeCacheableByDefault.has(this._status)) -+ ); -+ } -+ -+ _hasExplicitExpiration() { -+ // 4.2.1 Calculating Freshness Lifetime -+ return ( -+ (this._isShared && this._rescc['s-maxage']) || -+ this._rescc['max-age'] || -+ this._resHeaders.expires -+ ); -+ } -+ -+ _assertRequestHasHeaders(req) { -+ if (!req || !req.headers) { -+ throw Error('Request headers missing'); -+ } -+ } -+ -+ satisfiesWithoutRevalidation(req) { -+ this._assertRequestHasHeaders(req); -+ -+ // When presented with a request, a cache MUST NOT reuse a stored response, unless: -+ // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive, -+ // unless the stored response is successfully validated (Section 4.3), and -+ const requestCC = parseCacheControl(req.headers['cache-control']); -+ if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) { -+ return false; -+ } -+ -+ if (requestCC['max-age'] && this.age() > requestCC['max-age']) { -+ return false; -+ } -+ -+ if ( -+ requestCC['min-fresh'] && -+ this.timeToLive() < 1000 * requestCC['min-fresh'] -+ ) { -+ return false; -+ } -+ -+ // the stored response is either: -+ // fresh, or allowed to be served stale -+ if (this.stale()) { -+ const allowsStale = -+ requestCC['max-stale'] && -+ !this._rescc['must-revalidate'] && -+ (true === requestCC['max-stale'] || -+ requestCC['max-stale'] > this.age() - this.maxAge()); -+ if (!allowsStale) { -+ return false; -+ } -+ } -+ -+ return this._requestMatches(req, false); -+ } -+ -+ _requestMatches(req, allowHeadMethod) { -+ // The presented effective request URI and that of the stored response match, and -+ return ( -+ (!this._url || this._url === req.url) && -+ this._host === req.headers.host && -+ // the request method associated with the stored response allows it to be used for the presented request, and -+ (!req.method || -+ this._method === req.method || -+ (allowHeadMethod && 'HEAD' === req.method)) && -+ // selecting header fields nominated by the stored response (if any) match those presented, and -+ this._varyMatches(req) -+ ); -+ } -+ -+ _allowsStoringAuthenticated() { -+ // following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage. -+ return ( -+ this._rescc['must-revalidate'] || -+ this._rescc.public || -+ this._rescc['s-maxage'] -+ ); -+ } -+ -+ _varyMatches(req) { -+ if (!this._resHeaders.vary) { -+ return true; -+ } -+ -+ // A Vary header field-value of "*" always fails to match -+ if (this._resHeaders.vary === '*') { -+ return false; -+ } -+ -+ const fields = this._resHeaders.vary -+ .trim() -+ .toLowerCase() -+ .split(/\s*,\s*/); -+ for (const name of fields) { -+ if (req.headers[name] !== this._reqHeaders[name]) return false; -+ } -+ return true; -+ } -+ -+ _copyWithoutHopByHopHeaders(inHeaders) { -+ const headers = {}; -+ for (const name in inHeaders) { -+ if (hopByHopHeaders[name]) continue; -+ headers[name] = inHeaders[name]; -+ } -+ // 9.1. Connection -+ if (inHeaders.connection) { -+ const tokens = inHeaders.connection.trim().split(/\s*,\s*/); -+ for (const name of tokens) { -+ delete headers[name]; -+ } -+ } -+ if (headers.warning) { -+ const warnings = headers.warning.split(/,/).filter(warning => { -+ return !/^\s*1[0-9][0-9]/.test(warning); -+ }); -+ if (!warnings.length) { -+ delete headers.warning; -+ } else { -+ headers.warning = warnings.join(',').trim(); -+ } -+ } -+ return headers; -+ } -+ -+ responseHeaders() { -+ const headers = this._copyWithoutHopByHopHeaders(this._resHeaders); -+ const age = this.age(); -+ -+ // A cache SHOULD generate 113 warning if it heuristically chose a freshness -+ // lifetime greater than 24 hours and the response's age is greater than 24 hours. -+ if ( -+ age > 3600 * 24 && -+ !this._hasExplicitExpiration() && -+ this.maxAge() > 3600 * 24 -+ ) { -+ headers.warning = -+ (headers.warning ? `${headers.warning}, ` : '') + -+ '113 - "rfc7234 5.5.4"'; -+ } -+ headers.age = `${Math.round(age)}`; -+ headers.date = new Date(this.now()).toUTCString(); -+ return headers; -+ } -+ -+ /** -+ * Value of the Date response header or current time if Date was invalid -+ * @return timestamp -+ */ -+ date() { -+ const serverDate = Date.parse(this._resHeaders.date); -+ if (isFinite(serverDate)) { -+ return serverDate; -+ } -+ return this._responseTime; -+ } -+ -+ /** -+ * Value of the Age header, in seconds, updated for the current time. -+ * May be fractional. -+ * -+ * @return Number -+ */ -+ age() { -+ let age = this._ageValue(); -+ -+ const residentTime = (this.now() - this._responseTime) / 1000; -+ return age + residentTime; -+ } -+ -+ _ageValue() { -+ return toNumberOrZero(this._resHeaders.age); -+ } -+ -+ /** -+ * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`. -+ * -+ * For an up-to-date value, see `timeToLive()`. -+ * -+ * @return Number -+ */ -+ maxAge() { -+ if (!this.storable() || this._rescc['no-cache']) { -+ return 0; -+ } -+ -+ // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default -+ // so this implementation requires explicit opt-in via public header -+ if ( -+ this._isShared && -+ (this._resHeaders['set-cookie'] && -+ !this._rescc.public && -+ !this._rescc.immutable) -+ ) { -+ return 0; -+ } -+ -+ if (this._resHeaders.vary === '*') { -+ return 0; -+ } -+ -+ if (this._isShared) { -+ if (this._rescc['proxy-revalidate']) { -+ return 0; -+ } -+ // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field. -+ if (this._rescc['s-maxage']) { -+ return toNumberOrZero(this._rescc['s-maxage']); -+ } -+ } -+ -+ // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field. -+ if (this._rescc['max-age']) { -+ return toNumberOrZero(this._rescc['max-age']); -+ } -+ -+ const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0; -+ -+ const serverDate = this.date(); -+ if (this._resHeaders.expires) { -+ const expires = Date.parse(this._resHeaders.expires); -+ // A cache recipient MUST interpret invalid date formats, especially the value "0", as representing a time in the past (i.e., "already expired"). -+ if (Number.isNaN(expires) || expires < serverDate) { -+ return 0; -+ } -+ return Math.max(defaultMinTtl, (expires - serverDate) / 1000); -+ } -+ -+ if (this._resHeaders['last-modified']) { -+ const lastModified = Date.parse(this._resHeaders['last-modified']); -+ if (isFinite(lastModified) && serverDate > lastModified) { -+ return Math.max( -+ defaultMinTtl, -+ ((serverDate - lastModified) / 1000) * this._cacheHeuristic -+ ); -+ } -+ } -+ -+ return defaultMinTtl; -+ } -+ -+ timeToLive() { -+ const age = this.maxAge() - this.age(); -+ const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']); -+ const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']); -+ return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000; -+ } -+ -+ stale() { -+ return this.maxAge() <= this.age(); -+ } -+ -+ _useStaleIfError() { -+ return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age(); -+ } -+ -+ useStaleWhileRevalidate() { -+ return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age(); -+ } -+ -+ static fromObject(obj) { -+ return new this(undefined, undefined, { _fromObject: obj }); -+ } -+ -+ _fromObject(obj) { -+ if (this._responseTime) throw Error('Reinitialized'); -+ if (!obj || obj.v !== 1) throw Error('Invalid serialization'); -+ -+ this._responseTime = obj.t; -+ this._isShared = obj.sh; -+ this._cacheHeuristic = obj.ch; -+ this._immutableMinTtl = -+ obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000; -+ this._status = obj.st; -+ this._resHeaders = obj.resh; -+ this._rescc = obj.rescc; -+ this._method = obj.m; -+ this._url = obj.u; -+ this._host = obj.h; -+ this._noAuthorization = obj.a; -+ this._reqHeaders = obj.reqh; -+ this._reqcc = obj.reqcc; -+ } -+ -+ toObject() { -+ return { -+ v: 1, -+ t: this._responseTime, -+ sh: this._isShared, -+ ch: this._cacheHeuristic, -+ imm: this._immutableMinTtl, -+ st: this._status, -+ resh: this._resHeaders, -+ rescc: this._rescc, -+ m: this._method, -+ u: this._url, -+ h: this._host, -+ a: this._noAuthorization, -+ reqh: this._reqHeaders, -+ reqcc: this._reqcc, -+ }; -+ } -+ -+ /** -+ * Headers for sending to the origin server to revalidate stale response. -+ * Allows server to return 304 to allow reuse of the previous response. -+ * -+ * Hop by hop headers are always stripped. -+ * Revalidation headers may be added or removed, depending on request. -+ */ -+ revalidationHeaders(incomingReq) { -+ this._assertRequestHasHeaders(incomingReq); -+ const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers); -+ -+ // This implementation does not understand range requests -+ delete headers['if-range']; -+ -+ if (!this._requestMatches(incomingReq, true) || !this.storable()) { -+ // revalidation allowed via HEAD -+ // not for the same resource, or wasn't allowed to be cached anyway -+ delete headers['if-none-match']; -+ delete headers['if-modified-since']; -+ return headers; -+ } -+ -+ /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */ -+ if (this._resHeaders.etag) { -+ headers['if-none-match'] = headers['if-none-match'] -+ ? `${headers['if-none-match']}, ${this._resHeaders.etag}` -+ : this._resHeaders.etag; -+ } -+ -+ // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request. -+ const forbidsWeakValidators = -+ headers['accept-ranges'] || -+ headers['if-match'] || -+ headers['if-unmodified-since'] || -+ (this._method && this._method != 'GET'); -+ -+ /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server. -+ Note: This implementation does not understand partial responses (206) */ -+ if (forbidsWeakValidators) { -+ delete headers['if-modified-since']; -+ -+ if (headers['if-none-match']) { -+ const etags = headers['if-none-match'] -+ .split(/,/) -+ .filter(etag => { -+ return !/^\s*W\//.test(etag); -+ }); -+ if (!etags.length) { -+ delete headers['if-none-match']; -+ } else { -+ headers['if-none-match'] = etags.join(',').trim(); -+ } -+ } -+ } else if ( -+ this._resHeaders['last-modified'] && -+ !headers['if-modified-since'] -+ ) { -+ headers['if-modified-since'] = this._resHeaders['last-modified']; -+ } -+ -+ return headers; -+ } -+ -+ /** -+ * Creates new CachePolicy with information combined from the previews response, -+ * and the new revalidation response. -+ * -+ * Returns {policy, modified} where modified is a boolean indicating -+ * whether the response body has been modified, and old cached body can't be used. -+ * -+ * @return {Object} {policy: CachePolicy, modified: Boolean} -+ */ -+ revalidatedPolicy(request, response) { -+ this._assertRequestHasHeaders(request); -+ if(this._useStaleIfError() && isErrorResponse(response)) { // I consider the revalidation request unsuccessful -+ return { -+ modified: false, -+ matches: false, -+ policy: this, -+ }; -+ } -+ if (!response || !response.headers) { -+ throw Error('Response headers missing'); -+ } -+ -+ // These aren't going to be supported exactly, since one CachePolicy object -+ // doesn't know about all the other cached objects. -+ let matches = false; -+ if (response.status !== undefined && response.status != 304) { -+ matches = false; -+ } else if ( -+ response.headers.etag && -+ !/^\s*W\//.test(response.headers.etag) -+ ) { -+ // "All of the stored responses with the same strong validator are selected. -+ // If none of the stored responses contain the same strong validator, -+ // then the cache MUST NOT use the new response to update any stored responses." -+ matches = -+ this._resHeaders.etag && -+ this._resHeaders.etag.replace(/^\s*W\//, '') === -+ response.headers.etag; -+ } else if (this._resHeaders.etag && response.headers.etag) { -+ // "If the new response contains a weak validator and that validator corresponds -+ // to one of the cache's stored responses, -+ // then the most recent of those matching stored responses is selected for update." -+ matches = -+ this._resHeaders.etag.replace(/^\s*W\//, '') === -+ response.headers.etag.replace(/^\s*W\//, ''); -+ } else if (this._resHeaders['last-modified']) { -+ matches = -+ this._resHeaders['last-modified'] === -+ response.headers['last-modified']; -+ } else { -+ // If the new response does not include any form of validator (such as in the case where -+ // a client generates an If-Modified-Since request from a source other than the Last-Modified -+ // response header field), and there is only one stored response, and that stored response also -+ // lacks a validator, then that stored response is selected for update. -+ if ( -+ !this._resHeaders.etag && -+ !this._resHeaders['last-modified'] && -+ !response.headers.etag && -+ !response.headers['last-modified'] -+ ) { -+ matches = true; -+ } -+ } -+ -+ if (!matches) { -+ return { -+ policy: new this.constructor(request, response), -+ // Client receiving 304 without body, even if it's invalid/mismatched has no option -+ // but to reuse a cached body. We don't have a good way to tell clients to do -+ // error recovery in such case. -+ modified: response.status != 304, -+ matches: false, -+ }; -+ } -+ -+ // use other header fields provided in the 304 (Not Modified) response to replace all instances -+ // of the corresponding header fields in the stored response. -+ const headers = {}; -+ for (const k in this._resHeaders) { -+ headers[k] = -+ k in response.headers && !excludedFromRevalidationUpdate[k] -+ ? response.headers[k] -+ : this._resHeaders[k]; -+ } -+ -+ const newResponse = Object.assign({}, response, { -+ status: this._status, -+ method: this._method, -+ headers, -+ }); -+ return { -+ policy: new this.constructor(request, newResponse, { -+ shared: this._isShared, -+ cacheHeuristic: this._cacheHeuristic, -+ immutableMinTimeToLive: this._immutableMinTtl, -+ }), -+ modified: false, -+ matches: true, -+ }; -+ } -+}; -+ -+}, -+"5Fv+LQlkb6dD3pAHzJb7FLI1iSqJE9GCza+HQtcI06k=": -+function (require, module, exports, __dirname, __filename) { -+(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Depricated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseType="blob",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error("could not download file")},e.send()}function d(a){var b=new XMLHttpRequest;return b.open("HEAD",a,!1),b.send(),200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.saveAs||"object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}};f.saveAs=a.saveAs=a,"undefined"!=typeof module&&(module.exports=a)}); -+ -+//# sourceMappingURL=FileSaver.min.js.map -+}, -+"5G3MEcboRPZEyjMb99XK6zrRNXylQCFdqWaPbFjGqok=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var Cache = module.exports = function Cache() { -+ this._cache = {}; -+}; -+ -+ -+Cache.prototype.put = function Cache_put(key, value) { -+ this._cache[key] = value; -+}; -+ -+ -+Cache.prototype.get = function Cache_get(key) { -+ return this._cache[key]; -+}; -+ -+ -+Cache.prototype.del = function Cache_del(key) { -+ delete this._cache[key]; -+}; -+ -+ -+Cache.prototype.clear = function Cache_clear() { -+ this._cache = {}; -+}; -+ -+}, -+"5JdwMpfbd5b8F4itNMekPm1WdsbWT+W5dU5qAUjyNng=": -+function (require, module, exports, __dirname, __filename) { -+var dP = require('./_object-dp') -+ , createDesc = require('./_property-desc'); -+module.exports = require('./_descriptors') ? function(object, key, value){ -+ return dP.f(object, key, createDesc(1, value)); -+} : function(object, key, value){ -+ object[key] = value; -+ return object; -+}; -+}, -+"5Ks4lLQHNq7c0ASHjapz6nvJcGS54Wym8dlg7p8Bkts=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function(length) { -+ if ((length |= 0) < 0) throw new Error("invalid length"); -+ var that = this; -+ return new Promise(function slice(resolve, reject) { -+ if (length === 0) return resolve(that._stream.destroyed ? null : new Buffer(0)); -+ var buffer = that._stream.read(length); -+ if (buffer != null) return resolve(buffer); -+ that._readable.then(function(done) { return done ? resolve(null) : slice(resolve, reject); }).catch(reject); -+ }); -+}; -+ -+}, -+"5SnC/HCJfoAxZJRlvDc/7PPvJ76+QYSe799ihS+skL4=": -+function (require, module, exports, __dirname, __filename) { -+var protocol = require('hypercore-protocol') -+var bitfield = require('fast-bitfield') -+var set = require('unordered-set') -+var rle = require('bitfield-rle').align(4) -+var safeBufferEquals = require('./safe-buffer-equals') -+var treeIndex = require('./tree-index') -+ -+var EMPTY = new Uint8Array(1024) -+ -+module.exports = replicate -+ -+function replicate (feed, opts) { -+ feed.ifAvailable.wait() -+ var stream = opts.stream -+ -+ if (!stream) { -+ if (!opts.expectedFeeds) opts.expectedFeeds = 1 -+ if (!opts.id) opts.id = feed.id -+ stream = protocol(opts) -+ } -+ -+ if (feed.opened) onready(null) -+ else feed.ready(onready) -+ -+ return stream -+ -+ function onready (err) { -+ feed.ifAvailable.continue() -+ if (err) return stream.destroy(err) -+ if (stream.destroyed) return -+ -+ var continueOnce = feed.ifAvailable.waitAndContinue() -+ var peer = new Peer(feed, opts) -+ peer.feed = feed -+ peer.stream = stream.feed(feed.key, {peer: peer}) -+ -+ peer.remoteId = stream.remoteId -+ stream.setMaxListeners(0) -+ stream.on('handshake', function () { -+ if (safeBufferEquals(peer.remoteId, stream.remoteId)) { -+ return -+ } -+ peer.remoteId = stream.remoteId -+ if (!triggerReady()) { -+ peer.feed.emit('remote-update', peer) -+ } -+ peer.remoteAck = stream.remoteAck -+ }) -+ stream.on('close', continueOnce) -+ stream.on('end', continueOnce) -+ stream.on('error', continueOnce) -+ var firstTime = true -+ -+ triggerReady() -+ -+ function triggerReady () { -+ if (firstTime && peer.remoteId) { -+ firstTime = false -+ -+ // stream might get destroyed on feed init in case of conf errors -+ if (stream.destroyed) return false -+ -+ continueOnce() -+ peer.ready() -+ return true -+ } -+ return false -+ } -+ } -+} -+ -+function Peer (feed, opts) { -+ this.feed = feed -+ this.stream = null // set by replicate just after creation -+ this.remoteId = null -+ this.wants = bitfield() -+ this.remoteBitfield = bitfield() -+ this.remoteLength = 0 -+ this.remoteWant = false -+ this.remoteTree = null -+ this.remoteAck = false -+ this.live = !!opts.live -+ this.sparse = feed.sparse -+ this.ack = !!opts.ack -+ -+ this.remoteDownloading = true -+ this.downloading = typeof opts.download === 'boolean' ? opts.download : !feed.writable -+ this.uploading = true -+ -+ this.updated = false -+ -+ this.maxRequests = opts.maxRequests || feed.maxRequests || 16 -+ this.inflightRequests = [] -+ this.inflightWants = 0 -+ -+ this._index = -1 -+ this._lastBytes = 0 -+ this._first = true -+ this._closed = false -+ this._destroyed = false -+ this._defaultDownloading = this.downloading -+ this._iterator = this.remoteBitfield.iterator() -+ -+ this._stats = !opts.stats ? null : { -+ uploadedBytes: 0, -+ uploadedBlocks: 0, -+ downloadedBytes: 0, -+ downloadedBlocks: 0 -+ } -+} -+ -+Peer.prototype.onwant = function (want) { -+ if ((want.start & 8191) || (want.length & 8191)) return -+ if (!this.remoteWant && this.feed.length && this.feed.bitfield.get(this.feed.length - 1)) { -+ // Eagerly send the length of the feed to the otherside -+ // TODO: only send this if the remote is not wanting a region -+ // where this is contained in -+ this.stream.have({ start: this.feed.length - 1 }) -+ } -+ this.remoteWant = true -+ var rle = this.feed.bitfield.compress(want.start, want.length) -+ this.stream.have({start: want.start, length: want.length, bitfield: rle}) -+} -+ -+Peer.prototype.ondata = function (data) { -+ var self = this -+ -+ // Ignore unrequested messages unless we allow push -+ // TODO: would be better to check if the byte range was requested instead, but this works fine -+ var allowPush = this.feed.allowPush || !data.value -+ if (!allowPush && !this.feed._reserved.get(data.index)) { -+ // If we do not have this block, send back unhave message for this index, -+ // to let the remote know we rejected it. -+ // TODO: we might want to have some "unwanted push" threshold to punish spammers -+ if (!self.feed.bitfield.get(data.index)) self.unhave({start: data.index}) -+ self._clear(data.index, !data.value) -+ return -+ } -+ -+ this.feed._putBuffer(data.index, data.value, data, this, function (err) { -+ if (err) return self.destroy(err) -+ if (data.value) self.remoteBitfield.set(data.index, false) -+ if (self.remoteAck) { -+ // Send acknowledgement. -+ // In the future this could batch several ACKs at once -+ self.stream.have({start: data.index, length: 1, ack: true}) -+ } -+ if (self._stats && data.value) { -+ self._stats.downloadedBlocks += 1 -+ self._stats.downloadedBytes += data.value.length -+ } -+ self._clear(data.index, !data.value) -+ }) -+} -+ -+Peer.prototype._clear = function (index, hash) { -+ // TODO: optimize me (no splice and do not run through all ...) -+ for (var i = 0; i < this.inflightRequests.length; i++) { -+ if (this.inflightRequests[i].index === index) { -+ this.inflightRequests.splice(i, 1) -+ i-- -+ } -+ } -+ -+ this.feed._reserved.set(index, false) -+ // TODO: only update all if we have overlapping selections -+ this.feed._updatePeers() -+} -+ -+Peer.prototype.onrequest = function (request) { -+ if (request.bytes) return this._onbytes(request) -+ -+ // lazily instantiate the remote tree -+ if (!this.remoteTree) this.remoteTree = treeIndex() -+ -+ var self = this -+ var opts = {digest: request.nodes, hash: request.hash, tree: this.remoteTree} -+ -+ this.feed.proof(request.index, opts, onproof) -+ -+ function onproof (err, proof) { -+ if (err) return self.destroy(err) -+ if (request.hash) onvalue(null, null) -+ else if (self.feed.bitfield.get(request.index)) self.feed._getBuffer(request.index, onvalue) -+ -+ function onvalue (err, value) { -+ if (err) return self.destroy(err) -+ -+ if (value) { -+ if (self._stats) { -+ self._stats.uploadedBlocks += 1 -+ self._stats.uploadedBytes += value.length -+ self.feed._stats.uploadedBlocks += 1 -+ self.feed._stats.uploadedBytes += value.length -+ } -+ self.feed.emit('upload', request.index, value, self) -+ } -+ -+ // TODO: prob not needed with new bitfield -+ if (request.index + 1 > self.remoteLength) { -+ self.remoteLength = request.index + 1 -+ self._updateEnd() -+ } -+ -+ self.stream.data({ -+ index: request.index, -+ value: value, -+ nodes: proof.nodes, -+ signature: proof.signature -+ }) -+ } -+ } -+} -+ -+Peer.prototype._onbytes = function (request) { -+ var self = this -+ -+ this.feed.seek(request.bytes, {wait: false}, function (err, index) { -+ if (err) { -+ request.bytes = 0 -+ self.onrequest(request) -+ return -+ } -+ -+ // quick'n'dirty filter for parallel bytes requests -+ // it does not matter that this doesn't catch ALL parallel requests - just a bandwidth optimization -+ if (self._lastBytes === request.bytes) return -+ self._lastBytes = request.bytes -+ -+ request.bytes = 0 -+ request.index = index -+ request.nodes = 0 -+ -+ self.onrequest(request) -+ }) -+} -+ -+Peer.prototype.ontick = function () { -+ if (!this.inflightRequests.length) return -+ -+ var first = this.inflightRequests[0] -+ if (--first.tick) return -+ -+ if (first.hash ? this.feed.tree.get(2 * first.index) : this.feed.bitfield.get(first.index)) { -+ // prob a bytes response -+ this.inflightRequests.shift() -+ this.feed._reserved.set(first.index, false) -+ return -+ } -+ -+ this.destroy(new Error('Request timeout')) -+} -+ -+Peer.prototype.onhave = function (have) { -+ if (this.ack && have.ack && !have.bitfield && this.feed.bitfield.get(have.start)) { -+ this.stream.stream.emit('ack', have) -+ return -+ } -+ -+ var updated = this._first -+ if (this._first) this._first = false -+ -+ if (have.length === 1024 * 1024) { -+ this.feed.ifAvailable.continue() -+ this.inflightWants-- -+ } -+ -+ if (have.bitfield) { // TODO: handle start !== 0 -+ if (have.length === 0 || have.length === 1) { // length === 1 is for backwards compat -+ this.wants = null // we are in backwards compat mode where we subscribe everything -+ } -+ var buf = rle.decode(have.bitfield) -+ var bits = buf.length * 8 -+ remoteAndNotLocal(this.feed.bitfield, buf, this.remoteBitfield.littleEndian, have.start) -+ this.remoteBitfield.fill(buf, have.start) -+ if (bits > this.remoteLength) { -+ this.remoteLength = this.remoteBitfield.last() + 1 -+ updated = true -+ } -+ } else { -+ // TODO: if len > something simply copy a 0b1111... buffer to the bitfield -+ -+ var start = have.start -+ var len = have.length || 1 -+ -+ while (len--) this.remoteBitfield.set(start, !this.feed.bitfield.get(start++)) -+ if (start > this.remoteLength) { -+ this.remoteLength = start -+ updated = true -+ } -+ } -+ -+ if (updated) { -+ this.updated = true -+ this.feed.emit('remote-update', this) -+ } -+ -+ this._updateEnd() -+ this.update() -+} -+ -+Peer.prototype._updateEnd = function () { -+ if (this.live || this.feed.sparse || !this.feed._selections.length) return -+ -+ var sel = this.feed._selections[0] -+ var remoteLength = this.feed.length || -1 -+ -+ for (var i = 0; i < this.feed.peers.length; i++) { -+ if (this.feed.peers[i].remoteLength > remoteLength) { -+ remoteLength = this.feed.peers[i].remoteLength -+ } -+ } -+ -+ sel.end = remoteLength -+} -+ -+Peer.prototype.onextension = function (name, message) { -+ this.feed.emit('extension', name, message, this) -+} -+ -+Peer.prototype.oninfo = function (info) { -+ this.remoteDownloading = info.downloading -+ if (info.downloading || this.live) return -+ this.update() -+ if (this.feed._selections.length && this.downloading) return -+ this.end() -+} -+ -+Peer.prototype.onunhave = function (unhave) { -+ var start = unhave.start -+ var len = unhave.length || 1 -+ -+ if (start === 0 && len >= this.remoteLength) { -+ this.remoteLength = 0 -+ this.remoteBitfield = bitfield() -+ return -+ } -+ -+ while (len--) this.remoteBitfield.set(start++, false) -+} -+ -+Peer.prototype.onunwant = -+Peer.prototype.oncancel = function () { -+ // TODO: impl all of me -+} -+ -+Peer.prototype.onclose = function () { -+ this.destroy() -+} -+ -+Peer.prototype.have = function (have) { // called by feed -+ if (this.stream && this.remoteWant) this.stream.have(have) -+ var start = have.start -+ var len = have.length -+ while (len--) this.remoteBitfield.set(start++, false) -+} -+ -+Peer.prototype.unhave = function (unhave) { // called by feed -+ if (this.stream && this.remoteWant) this.stream.unhave(unhave) -+} -+ -+Peer.prototype.haveBytes = function (bytes) { // called by feed -+ for (var i = 0; i < this.inflightRequests.length; i++) { -+ if (this.inflightRequests[i].bytes === bytes) { -+ this.feed._reserved.set(this.inflightRequests[i].index, false) -+ this.inflightRequests.splice(i, 1) -+ i-- -+ } -+ } -+ -+ this.update() -+} -+ -+Peer.prototype.update = function () { -+ // do nothing -+ while (this._update()) {} -+ this._sendWantsMaybe() -+} -+ -+Peer.prototype._update = function () { -+ // should return true if mutated false if not -+ if (!this.downloading) return false -+ -+ var selections = this.feed._selections -+ var waiting = this.feed._waiting -+ var wlen = waiting.length -+ var slen = selections.length -+ var inflight = this.inflightRequests.length -+ var offset = 0 -+ var i = 0 -+ -+ // TODO: less duplicate code here -+ // TODO: re-add priority levels -+ -+ while (inflight < this.maxRequests) { -+ offset = Math.floor(Math.random() * waiting.length) -+ -+ for (i = 0; i < waiting.length; i++) { -+ var w = waiting[offset++] -+ if (offset === waiting.length) offset = 0 -+ -+ this._downloadWaiting(w) -+ if (waiting.length !== wlen) return true // mutated -+ if (this.inflightRequests.length >= this.maxRequests) return false -+ } -+ if (inflight === this.inflightRequests.length) break -+ inflight = this.inflightRequests.length -+ } -+ -+ while (inflight < this.maxRequests) { -+ offset = Math.floor(Math.random() * selections.length) -+ -+ for (i = 0; i < selections.length; i++) { -+ var s = selections[offset++] -+ if (offset === selections.length) offset = 0 -+ -+ if (!s.iterator) s.iterator = this.feed.bitfield.iterator(s.start, s.end) -+ this._downloadRange(s) -+ if (selections.length !== slen) return true // mutated -+ if (this.inflightRequests.length >= this.maxRequests) return false -+ } -+ -+ if (inflight === this.inflightRequests.length) return false -+ inflight = this.inflightRequests.length -+ } -+ -+ return false -+} -+ -+Peer.prototype.ready = function () { -+ set.add(this.feed.peers, this) -+ this._sendWants() -+ this.feed.emit('peer-add', this) -+} -+ -+Peer.prototype.end = function () { -+ if (!this.downloading && !this.remoteDownloading && !this.live) { -+ if (!this._defaultDownloading) { -+ this.stream.info({downloading: false, uploading: false}) -+ } -+ this._close() -+ return -+ } -+ if (!this._closed) { -+ this._closed = true -+ this.downloading = false -+ this.stream.info({downloading: false, uploading: true}) -+ } else { -+ if (!this.live) this._close() -+ } -+} -+ -+Peer.prototype._close = function () { -+ if (this._index === -1) return -+ if (!this._destroyed) { -+ this.stream.close() -+ this._destroyed = true -+ } -+ set.remove(this.feed.peers, this) -+ this._index = -1 -+ for (var i = 0; i < this.inflightRequests.length; i++) { -+ this.feed._reserved.set(this.inflightRequests[i].index, false) -+ } -+ this._updateEnd() -+ this.remoteWant = false -+ this.feed._updatePeers() -+ this.feed.emit('peer-remove', this) -+ for (i = 0; i < this.inflightWants; i++) { -+ this.feed.ifAvailable.continue() -+ } -+} -+ -+Peer.prototype.destroy = function (err) { -+ if (this._index === -1 || this._destroyed) return -+ this.stream.destroy(err) -+ this._destroyed = true -+ this._close() -+} -+ -+Peer.prototype._sendWantsMaybe = function () { -+ if (this.inflightRequests.length < this.maxRequests) this._sendWants() -+} -+ -+Peer.prototype._sendWants = function () { -+ if (!this.wants || !this.downloading) return -+ if (this.inflightWants >= 16) return -+ -+ var i -+ -+ for (i = 0; i < this.feed._waiting.length; i++) { -+ var w = this.feed._waiting[i] -+ if (w.index === -1) this._sendWantRange(w) -+ else this._sendWant(w.index) -+ if (this.inflightWants >= 16) return -+ } -+ -+ for (i = 0; i < this.feed._selections.length; i++) { -+ var s = this.feed._selections[i] -+ this._sendWantRange(s) -+ if (this.inflightWants >= 16) return -+ } -+ -+ // always sub to the first range for now, usually what you want -+ this._sendWant(0) -+} -+ -+Peer.prototype._sendWantRange = function (s) { -+ var want = 0 -+ -+ while (true) { -+ if (want >= this.remoteLength) return -+ if (s.end !== -1 && want >= s.end) return -+ -+ if (this._sendWant(want)) return -+ -+ // check if region is already selected - if so try next one -+ if (!this.wants.get(Math.floor(want / 1024 / 1024))) return -+ want += 1024 * 1024 -+ } -+} -+ -+Peer.prototype._sendWant = function (index) { -+ var len = 1024 * 1024 -+ var j = Math.floor(index / len) -+ if (this.wants.get(j)) return false -+ this.wants.set(j, true) -+ this.inflightWants++ -+ this.feed.ifAvailable.wait() -+ this.stream.want({start: j * len, length: len}) -+ return true -+} -+ -+Peer.prototype._downloadWaiting = function (wait) { -+ if (!wait.bytes) { -+ if (!this.remoteBitfield.get(wait.index) || !this.feed._reserved.set(wait.index, true)) return -+ this._request(wait.index, 0, false) -+ return -+ } -+ -+ this._downloadRange(wait) -+} -+ -+Peer.prototype._downloadRange = function (range) { -+ if (!range.iterator) range.iterator = this.feed.bitfield.iterator(range.start, range.end) -+ -+ var reserved = this.feed._reserved -+ var ite = this._iterator -+ var wantedEnd = Math.min(range.end === -1 ? this.remoteLength : range.end, this.remoteLength) -+ -+ var i = range.linear ? ite.seek(range.start).next(true) : nextRandom(ite, range.start, wantedEnd) -+ var start = i -+ -+ if (i === -1 || i >= wantedEnd) { -+ if (!range.bytes && range.end > -1 && this.feed.length >= range.end && range.iterator.seek(0).next() === -1) { -+ set.remove(this.feed._selections, range) -+ range.callback(null) -+ if (!this.live && !this.sparse && !this.feed._selections.length) this.end() -+ } -+ return -+ } -+ -+ while ((range.hash && this.feed.tree.get(2 * i)) || !reserved.set(i, true)) { -+ i = ite.next(true) -+ -+ if (i > -1 && i < wantedEnd) { -+ // check this index -+ continue -+ } -+ -+ if (!range.linear && start !== 0) { -+ // retry from the beginning since we are iterating randomly and started !== 0 -+ i = ite.seek(range.start).next(true) -+ start = 0 -+ if (i > -1 && i < wantedEnd) continue -+ } -+ -+ // we have checked all indexes. -+ // if we are looking for hashes we should check if we have all now (first check only checks blocks) -+ if (range.hash) { -+ // quick'n'dirty check if have all hashes - can be optimized be checking only tree roots -+ // but we don't really request long ranges of hashes so yolo -+ for (var j = range.start; j < wantedEnd; j++) { -+ if (!this.feed.tree.get(2 * j)) return -+ } -+ if (!range.bytes) { -+ set.remove(this.feed._selections, range) -+ range.callback(null) -+ } -+ } -+ -+ // exit the update loop - nothing to do -+ return -+ } -+ -+ this._request(i, range.bytes || 0, range.hash) -+} -+ -+Peer.prototype._request = function (index, bytes, hash) { -+ var request = { -+ tick: 6, -+ bytes: bytes, -+ index: index, -+ hash: hash, -+ nodes: this.feed.digest(index) -+ } -+ -+ this.inflightRequests.push(request) -+ this.stream.request(request) -+} -+ -+Peer.prototype.extension = function (name, message) { -+ this.stream.extension(name, message) -+} -+ -+function createView (page) { -+ var buf = page ? page.buffer : EMPTY -+ return new DataView(buf.buffer, buf.byteOffset, 1024) -+} -+ -+function remoteAndNotLocal (local, buf, le, start) { -+ var remote = new DataView(buf.buffer, buf.byteOffset) -+ var len = Math.floor(buf.length / 4) -+ var arr = new Uint32Array(buf.buffer, buf.byteOffset, len) -+ var p = start / 8192 // 8192 is bits per bitfield page -+ var l = 0 -+ var page = createView(local.pages.get(p++, true)) -+ -+ for (var i = 0; i < len; i++) { -+ arr[i] = remote.getUint32(4 * i, !le) & ~page.getUint32(4 * (l++), !le) -+ -+ if (l === 256) { -+ page = createView(local.pages.get(p++, true)) -+ l = 0 -+ } -+ } -+} -+ -+function nextRandom (ite, start, end) { -+ var len = end - start -+ var i = ite.seek(Math.floor(Math.random() * len) + start).next(true) -+ return i === -1 || i >= end ? ite.seek(start).next(true) : i -+} -+ -+}, -+"5UaMptuIsNrtPY1ylecCYvWil1CJV0frMvQ4SOcr+I8=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright (C) 2011-2015 John Hewson -+// -+// Permission is hereby granted, free of charge, to any person obtaining a copy -+// of this software and associated documentation files (the "Software"), to -+// deal in the Software without restriction, including without limitation the -+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -+// sell copies of the Software, and to permit persons to whom the Software is -+// furnished to do so, subject to the following conditions: -+// -+// The above copyright notice and this permission notice shall be included in -+// all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -+// IN THE SOFTWARE. -+ -+var stream = require('stream'), -+ util = require('util'), -+ timers = require('timers'); -+ -+// convinience API -+module.exports = function(readStream, options) { -+ return module.exports.createStream(readStream, options); -+}; -+ -+// basic API -+module.exports.createStream = function(readStream, options) { -+ if (readStream) { -+ return createLineStream(readStream, options); -+ } else { -+ return new LineStream(options); -+ } -+}; -+ -+// deprecated API -+module.exports.createLineStream = function(readStream) { -+ console.log('WARNING: byline#createLineStream is deprecated and will be removed soon'); -+ return createLineStream(readStream); -+}; -+ -+function createLineStream(readStream, options) { -+ if (!readStream) { -+ throw new Error('expected readStream'); -+ } -+ if (!readStream.readable) { -+ throw new Error('readStream must be readable'); -+ } -+ var ls = new LineStream(options); -+ readStream.pipe(ls); -+ return ls; -+} -+ -+// -+// using the new node v0.10 "streams2" API -+// -+ -+module.exports.LineStream = LineStream; -+ -+function LineStream(options) { -+ stream.Transform.call(this, options); -+ options = options || {}; -+ -+ // use objectMode to stop the output from being buffered -+ // which re-concatanates the lines, just without newlines. -+ this._readableState.objectMode = true; -+ this._lineBuffer = []; -+ this._keepEmptyLines = options.keepEmptyLines || false; -+ this._lastChunkEndedWithCR = false; -+ -+ // take the source's encoding if we don't have one -+ var self = this; -+ this.on('pipe', function(src) { -+ if (!self.encoding) { -+ // but we can't do this for old-style streams -+ if (src instanceof stream.Readable) { -+ self.encoding = src._readableState.encoding; -+ } -+ } -+ }); -+} -+util.inherits(LineStream, stream.Transform); -+ -+LineStream.prototype._transform = function(chunk, encoding, done) { -+ // decode binary chunks as UTF-8 -+ encoding = encoding || 'utf8'; -+ -+ if (Buffer.isBuffer(chunk)) { -+ if (encoding == 'buffer') { -+ chunk = chunk.toString(); // utf8 -+ encoding = 'utf8'; -+ } -+ else { -+ chunk = chunk.toString(encoding); -+ } -+ } -+ this._chunkEncoding = encoding; -+ -+ // see: http://www.unicode.org/reports/tr18/#Line_Boundaries -+ var lines = chunk.split(/\r\n|[\n\v\f\r\x85\u2028\u2029]/g); -+ -+ // don't split CRLF which spans chunks -+ if (this._lastChunkEndedWithCR && chunk[0] == '\n') { -+ lines.shift(); -+ } -+ -+ if (this._lineBuffer.length > 0) { -+ this._lineBuffer[this._lineBuffer.length - 1] += lines[0]; -+ lines.shift(); -+ } -+ -+ this._lastChunkEndedWithCR = chunk[chunk.length - 1] == '\r'; -+ this._lineBuffer = this._lineBuffer.concat(lines); -+ this._pushBuffer(encoding, 1, done); -+}; -+ -+LineStream.prototype._pushBuffer = function(encoding, keep, done) { -+ // always buffer the last (possibly partial) line -+ while (this._lineBuffer.length > keep) { -+ var line = this._lineBuffer.shift(); -+ // skip empty lines -+ if (this._keepEmptyLines || line.length > 0 ) { -+ if (!this.push(this._reencode(line, encoding))) { -+ // when the high-water mark is reached, defer pushes until the next tick -+ var self = this; -+ timers.setImmediate(function() { -+ self._pushBuffer(encoding, keep, done); -+ }); -+ return; -+ } -+ } -+ } -+ done(); -+}; -+ -+LineStream.prototype._flush = function(done) { -+ this._pushBuffer(this._chunkEncoding, 0, done); -+}; -+ -+// see Readable::push -+LineStream.prototype._reencode = function(line, chunkEncoding) { -+ if (this.encoding && this.encoding != chunkEncoding) { -+ return new Buffer(line, chunkEncoding).toString(this.encoding); -+ } -+ else if (this.encoding) { -+ // this should be the most common case, i.e. we're using an encoded source stream -+ return line; -+ } -+ else { -+ return new Buffer(line, chunkEncoding); -+ } -+}; -+ -+}, -+"5V9XXXKdX0eLrjQpmlKrZJjaYfIvv76DKRFrZH20cfA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { validate: validateSchema } = require('./validation') -+const { hookRunner, hookIterator } = require('./hooks') -+const wrapThenable = require('./wrapThenable') -+ -+function handleRequest (err, request, reply) { -+ if (reply.sent === true) return -+ if (err != null) { -+ reply.send(err) -+ return -+ } -+ -+ const method = request.raw.method -+ const headers = request.headers -+ -+ if (method === 'GET' || method === 'HEAD') { -+ handler(request, reply) -+ return -+ } -+ -+ const contentType = headers['content-type'] -+ -+ if (method === 'POST' || method === 'PUT' || method === 'PATCH') { -+ if (contentType === undefined) { -+ if ( -+ headers['transfer-encoding'] === undefined && -+ (headers['content-length'] === '0' || headers['content-length'] === undefined) -+ ) { // Request has no body to parse -+ handler(request, reply) -+ } else { -+ reply.context.contentTypeParser.run('', handler, request, reply) -+ } -+ } else { -+ reply.context.contentTypeParser.run(contentType, handler, request, reply) -+ } -+ return -+ } -+ -+ if (method === 'OPTIONS' || method === 'DELETE') { -+ if ( -+ contentType !== undefined && -+ ( -+ headers['transfer-encoding'] !== undefined || -+ headers['content-length'] !== undefined -+ ) -+ ) { -+ reply.context.contentTypeParser.run(contentType, handler, request, reply) -+ } else { -+ handler(request, reply) -+ } -+ return -+ } -+ -+ // Return 404 instead of 405 see https://github.com/fastify/fastify/pull/862 for discussion -+ reply.code(404).send(new Error('Not Found')) -+} -+ -+function handler (request, reply) { -+ try { -+ if (reply.context.preValidation !== null) { -+ hookRunner( -+ reply.context.preValidation, -+ hookIterator, -+ request, -+ reply, -+ preValidationCallback -+ ) -+ } else { -+ preValidationCallback(null, request, reply) -+ } -+ } catch (err) { -+ preValidationCallback(err, request, reply) -+ } -+} -+ -+function preValidationCallback (err, request, reply) { -+ if (reply.sent === true || -+ reply.raw.writableEnded === true || -+ reply.raw.writable === false) return -+ -+ if (err != null) { -+ reply.send(err) -+ return -+ } -+ -+ const result = validateSchema(reply.context, request) -+ if (result) { -+ if (reply.context.attachValidation === false) { -+ reply.code(400).send(result) -+ return -+ } -+ -+ reply.request.validationError = result -+ } -+ -+ // preHandler hook -+ if (reply.context.preHandler !== null) { -+ hookRunner( -+ reply.context.preHandler, -+ hookIterator, -+ request, -+ reply, -+ preHandlerCallback -+ ) -+ } else { -+ preHandlerCallback(null, request, reply) -+ } -+} -+ -+function preHandlerCallback (err, request, reply) { -+ if (reply.sent || -+ reply.raw.writableEnded === true || -+ reply.raw.writable === false) return -+ -+ if (err != null) { -+ reply.send(err) -+ return -+ } -+ -+ let result -+ -+ try { -+ result = reply.context.handler(request, reply) -+ } catch (err) { -+ reply.send(err) -+ return -+ } -+ -+ if (result !== undefined) { -+ if (result !== null && typeof result.then === 'function') { -+ wrapThenable(result, reply) -+ } else { -+ reply.send(result) -+ } -+ } -+} -+ -+module.exports = handleRequest -+module.exports[Symbol.for('internals')] = { handler, preHandlerCallback } -+ -+}, -+"5Z06inBjYSz+O8+XS6IjuA2lbeKXjdbmh5PpRRJZSIA=": -+function (require, module, exports, __dirname, __filename) { -+var write = require('./write'); -+var geojson = require('./geojson'); -+var prj = require('./prj'); -+var JSZip = require('jszip'); -+ -+module.exports = function(gj, options) { -+ var zip = new JSZip(); -+ var layers = zip.folder(options && options.folder ? options.folder : 'layers'); -+ -+ [geojson.point(gj), geojson.line(gj), geojson.polygon(gj)] -+ .forEach(function(l) { -+ if (l.geometries.length && l.geometries[0].length) { -+ write( -+ // field definitions -+ l.properties, -+ // geometry type -+ l.type, -+ // geometries -+ l.geometries, -+ function(err, files) { -+ var fileName = options && options.types[l.type.toLowerCase()] ? options.types[l.type.toLowerCase()] : l.type; -+ layers.file(fileName + '.shp', files.shp.buffer, { binary: true }); -+ layers.file(fileName + '.shx', files.shx.buffer, { binary: true }); -+ layers.file(fileName + '.dbf', files.dbf.buffer, { binary: true }); -+ layers.file(fileName + '.prj', prj); -+ }); -+ } -+ }); -+ -+ return zip.generateNodeStream({type:'nodebuffer',streamFiles:true}); -+}; -+ -+}, -+"5ZjD3xAHNQn+H09e2ZrAmPZ1341nHZB7BUQ9fTz7bTg=": -+function (require, module, exports, __dirname, __filename) { -+var EventEmitter = require('events').EventEmitter -+var inherits = require('util').inherits -+var extend = require('xtend') -+var DeferredLevelDOWN = require('deferred-leveldown') -+var IteratorStream = require('level-iterator-stream') -+var Batch = require('./batch') -+var errors = require('level-errors') -+var supports = require('level-supports') -+var assert = require('assert') -+var promisify = require('./promisify') -+var getCallback = require('./common').getCallback -+var getOptions = require('./common').getOptions -+ -+var WriteError = errors.WriteError -+var ReadError = errors.ReadError -+var NotFoundError = errors.NotFoundError -+var OpenError = errors.OpenError -+var InitializationError = errors.InitializationError -+ -+// Possible AbstractLevelDOWN#status values: -+// - 'new' - newly created, not opened or closed -+// - 'opening' - waiting for the database to be opened, post open() -+// - 'open' - successfully opened the database, available for use -+// - 'closing' - waiting for the database to be closed, post close() -+// - 'closed' - database has been successfully closed, should not be -+// used except for another open() operation -+ -+function LevelUP (db, options, callback) { -+ if (!(this instanceof LevelUP)) { -+ return new LevelUP(db, options, callback) -+ } -+ -+ var error -+ var self = this -+ -+ EventEmitter.call(this) -+ this.setMaxListeners(Infinity) -+ -+ if (typeof options === 'function') { -+ callback = options -+ options = {} -+ } -+ -+ options = options || {} -+ -+ if (!db || typeof db !== 'object') { -+ error = new InitializationError('First argument must be an abstract-leveldown compliant store') -+ if (typeof callback === 'function') { -+ return process.nextTick(callback, error) -+ } -+ throw error -+ } -+ -+ assert.strictEqual(typeof db.status, 'string', '.status required, old abstract-leveldown') -+ -+ this.options = getOptions(options) -+ this._db = db -+ this.db = new DeferredLevelDOWN(db) -+ this.open(callback || function (err) { -+ if (err) self.emit('error', err) -+ }) -+ -+ // Create manifest based on deferred-leveldown's -+ this.supports = supports(this.db.supports, { -+ status: false, -+ deferredOpen: true, -+ openCallback: true, -+ promises: true, -+ streams: true -+ }) -+ -+ // Experimental: enrich levelup interface -+ Object.keys(this.supports.additionalMethods).forEach(function (method) { -+ if (this[method] != null) return -+ -+ // Don't do this.db[method].bind() because this.db is dynamic. -+ this[method] = function () { -+ return this.db[method].apply(this.db, arguments) -+ } -+ }, this) -+} -+ -+LevelUP.prototype.emit = EventEmitter.prototype.emit -+LevelUP.prototype.once = EventEmitter.prototype.once -+inherits(LevelUP, EventEmitter) -+ -+LevelUP.prototype.open = function (opts, callback) { -+ var self = this -+ var promise -+ -+ if (typeof opts === 'function') { -+ callback = opts -+ opts = null -+ } -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (!opts) { -+ opts = this.options -+ } -+ -+ if (this.isOpen()) { -+ process.nextTick(callback, null, self) -+ return promise -+ } -+ -+ if (this._isOpening()) { -+ this.once('open', function () { callback(null, self) }) -+ return promise -+ } -+ -+ this.emit('opening') -+ -+ this.db.open(opts, function (err) { -+ if (err) { -+ return callback(new OpenError(err)) -+ } -+ self.db = self._db -+ callback(null, self) -+ self.emit('open') -+ self.emit('ready') -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.close = function (callback) { -+ var self = this -+ var promise -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (this.isOpen()) { -+ this.db.close(function () { -+ self.emit('closed') -+ callback.apply(null, arguments) -+ }) -+ this.emit('closing') -+ this.db = new DeferredLevelDOWN(this._db) -+ } else if (this.isClosed()) { -+ process.nextTick(callback) -+ } else if (this.db.status === 'closing') { -+ this.once('closed', callback) -+ } else if (this._isOpening()) { -+ this.once('open', function () { -+ self.close(callback) -+ }) -+ } -+ -+ return promise -+} -+ -+LevelUP.prototype.isOpen = function () { -+ return this.db.status === 'open' -+} -+ -+LevelUP.prototype._isOpening = function () { -+ return this.db.status === 'opening' -+} -+ -+LevelUP.prototype.isClosed = function () { -+ return (/^clos|new/).test(this.db.status) -+} -+ -+LevelUP.prototype.get = function (key, options, callback) { -+ var promise -+ -+ callback = getCallback(options, callback) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (maybeError(this, callback)) { return promise } -+ -+ options = getOptions(options) -+ -+ this.db.get(key, options, function (err, value) { -+ if (err) { -+ if ((/notfound/i).test(err) || err.notFound) { -+ err = new NotFoundError('Key not found in database [' + key + ']', err) -+ } else { -+ err = new ReadError(err) -+ } -+ return callback(err) -+ } -+ callback(null, value) -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.put = function (key, value, options, callback) { -+ var self = this -+ var promise -+ -+ callback = getCallback(options, callback) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (maybeError(this, callback)) { return promise } -+ -+ options = getOptions(options) -+ -+ this.db.put(key, value, options, function (err) { -+ if (err) { -+ return callback(new WriteError(err)) -+ } -+ self.emit('put', key, value) -+ callback() -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.del = function (key, options, callback) { -+ var self = this -+ var promise -+ -+ callback = getCallback(options, callback) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (maybeError(this, callback)) { return promise } -+ -+ options = getOptions(options) -+ -+ this.db.del(key, options, function (err) { -+ if (err) { -+ return callback(new WriteError(err)) -+ } -+ self.emit('del', key) -+ callback() -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.batch = function (arr, options, callback) { -+ if (!arguments.length) { -+ return new Batch(this) -+ } -+ -+ var self = this -+ var promise -+ -+ if (typeof arr === 'function') callback = arr -+ else callback = getCallback(options, callback) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (maybeError(this, callback)) { return promise } -+ -+ options = getOptions(options) -+ -+ this.db.batch(arr, options, function (err) { -+ if (err) { -+ return callback(new WriteError(err)) -+ } -+ self.emit('batch', arr) -+ callback() -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.iterator = function (options) { -+ return this.db.iterator(options) -+} -+ -+LevelUP.prototype.clear = function (options, callback) { -+ var self = this -+ var promise -+ -+ callback = getCallback(options, callback) -+ options = getOptions(options) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ if (maybeError(this, callback)) { -+ return promise -+ } -+ -+ this.db.clear(options, function (err) { -+ if (err) { -+ return callback(new WriteError(err)) -+ } -+ self.emit('clear', options) -+ callback() -+ }) -+ -+ return promise -+} -+ -+LevelUP.prototype.readStream = -+LevelUP.prototype.createReadStream = function (options) { -+ options = extend({ keys: true, values: true }, options) -+ if (typeof options.limit !== 'number') { options.limit = -1 } -+ return new IteratorStream(this.db.iterator(options), options) -+} -+ -+LevelUP.prototype.keyStream = -+LevelUP.prototype.createKeyStream = function (options) { -+ return this.createReadStream(extend(options, { keys: true, values: false })) -+} -+ -+LevelUP.prototype.valueStream = -+LevelUP.prototype.createValueStream = function (options) { -+ return this.createReadStream(extend(options, { keys: false, values: true })) -+} -+ -+LevelUP.prototype.toString = function () { -+ return 'LevelUP' -+} -+ -+LevelUP.prototype.type = 'levelup' -+ -+function maybeError (db, callback) { -+ if (!db._isOpening() && !db.isOpen()) { -+ process.nextTick(callback, new ReadError('Database is not open')) -+ return true -+ } -+} -+ -+LevelUP.errors = errors -+module.exports = LevelUP.default = LevelUP -+ -+}, -+"5am/Y8+emoFSXuKuAVvtjWbggcT87Otg0Xkf3POKGxQ=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, INTERNAL) { -+var PromiseReduce = Promise.reduce; -+var PromiseAll = Promise.all; -+ -+function promiseAllThis() { -+ return PromiseAll(this); -+} -+ -+function PromiseMapSeries(promises, fn) { -+ return PromiseReduce(promises, fn, INTERNAL, INTERNAL); -+} -+ -+Promise.prototype.each = function (fn) { -+ return PromiseReduce(this, fn, INTERNAL, 0) -+ ._then(promiseAllThis, undefined, undefined, this, undefined); -+}; -+ -+Promise.prototype.mapSeries = function (fn) { -+ return PromiseReduce(this, fn, INTERNAL, INTERNAL); -+}; -+ -+Promise.each = function (promises, fn) { -+ return PromiseReduce(promises, fn, INTERNAL, 0) -+ ._then(promiseAllThis, undefined, undefined, promises, undefined); -+}; -+ -+Promise.mapSeries = PromiseMapSeries; -+}; -+ -+ -+}, -+"5eI6SrKMfjT6RfXCZQusCaHzl5avmmT1XzCIlG0/N0w=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "$schema": "http://json-schema.org/draft-07/schema#", -+ "$id": "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#", -+ "description": "Meta-schema for $data reference (JSON Schema extension proposal)", -+ "type": "object", -+ "required": [ "$data" ], -+ "properties": { -+ "$data": { -+ "type": "string", -+ "anyOf": [ -+ { "format": "relative-json-pointer" }, -+ { "format": "json-pointer" } -+ ] -+ } -+ }, -+ "additionalProperties": false -+} -+ -+}, -+"5g9p49oc/65drSUpDWPyOm4FClhynavE9ZzCRG2W63U=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var ip = exports; -+var Buffer = require('buffer').Buffer; -+var os = require('os'); -+ -+ip.toBuffer = function(ip, buff, offset) { -+ offset = ~~offset; -+ -+ var result; -+ -+ if (this.isV4Format(ip)) { -+ result = buff || new Buffer(offset + 4); -+ ip.split(/\./g).map(function(byte) { -+ result[offset++] = parseInt(byte, 10) & 0xff; -+ }); -+ } else if (this.isV6Format(ip)) { -+ var sections = ip.split(':', 8); -+ -+ var i; -+ for (i = 0; i < sections.length; i++) { -+ var isv4 = this.isV4Format(sections[i]); -+ var v4Buffer; -+ -+ if (isv4) { -+ v4Buffer = this.toBuffer(sections[i]); -+ sections[i] = v4Buffer.slice(0, 2).toString('hex'); -+ } -+ -+ if (v4Buffer && ++i < 8) { -+ sections.splice(i, 0, v4Buffer.slice(2, 4).toString('hex')); -+ } -+ } -+ -+ if (sections[0] === '') { -+ while (sections.length < 8) sections.unshift('0'); -+ } else if (sections[sections.length - 1] === '') { -+ while (sections.length < 8) sections.push('0'); -+ } else if (sections.length < 8) { -+ for (i = 0; i < sections.length && sections[i] !== ''; i++); -+ var argv = [ i, 1 ]; -+ for (i = 9 - sections.length; i > 0; i--) { -+ argv.push('0'); -+ } -+ sections.splice.apply(sections, argv); -+ } -+ -+ result = buff || new Buffer(offset + 16); -+ for (i = 0; i < sections.length; i++) { -+ var word = parseInt(sections[i], 16); -+ result[offset++] = (word >> 8) & 0xff; -+ result[offset++] = word & 0xff; -+ } -+ } -+ -+ if (!result) { -+ throw Error('Invalid ip address: ' + ip); -+ } -+ -+ return result; -+}; -+ -+ip.toString = function(buff, offset, length) { -+ offset = ~~offset; -+ length = length || (buff.length - offset); -+ -+ var result = []; -+ if (length === 4) { -+ // IPv4 -+ for (var i = 0; i < length; i++) { -+ result.push(buff[offset + i]); -+ } -+ result = result.join('.'); -+ } else if (length === 16) { -+ // IPv6 -+ for (var i = 0; i < length; i += 2) { -+ result.push(buff.readUInt16BE(offset + i).toString(16)); -+ } -+ result = result.join(':'); -+ result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3'); -+ result = result.replace(/:{3,4}/, '::'); -+ } -+ -+ return result; -+}; -+ -+var ipv4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/; -+var ipv6Regex = -+ /^(::)?(((\d{1,3}\.){3}(\d{1,3}){1})?([0-9a-f]){0,4}:{0,2}){1,8}(::)?$/i; -+ -+ip.isV4Format = function(ip) { -+ return ipv4Regex.test(ip); -+}; -+ -+ip.isV6Format = function(ip) { -+ return ipv6Regex.test(ip); -+}; -+function _normalizeFamily(family) { -+ return family ? family.toLowerCase() : 'ipv4'; -+} -+ -+ip.fromPrefixLen = function(prefixlen, family) { -+ if (prefixlen > 32) { -+ family = 'ipv6'; -+ } else { -+ family = _normalizeFamily(family); -+ } -+ -+ var len = 4; -+ if (family === 'ipv6') { -+ len = 16; -+ } -+ var buff = new Buffer(len); -+ -+ for (var i = 0, n = buff.length; i < n; ++i) { -+ var bits = 8; -+ if (prefixlen < 8) { -+ bits = prefixlen; -+ } -+ prefixlen -= bits; -+ -+ buff[i] = ~(0xff >> bits) & 0xff; -+ } -+ -+ return ip.toString(buff); -+}; -+ -+ip.mask = function(addr, mask) { -+ addr = ip.toBuffer(addr); -+ mask = ip.toBuffer(mask); -+ -+ var result = new Buffer(Math.max(addr.length, mask.length)); -+ -+ var i = 0; -+ // Same protocol - do bitwise and -+ if (addr.length === mask.length) { -+ for (i = 0; i < addr.length; i++) { -+ result[i] = addr[i] & mask[i]; -+ } -+ } else if (mask.length === 4) { -+ // IPv6 address and IPv4 mask -+ // (Mask low bits) -+ for (i = 0; i < mask.length; i++) { -+ result[i] = addr[addr.length - 4 + i] & mask[i]; -+ } -+ } else { -+ // IPv6 mask and IPv4 addr -+ for (var i = 0; i < result.length - 6; i++) { -+ result[i] = 0; -+ } -+ -+ // ::ffff:ipv4 -+ result[10] = 0xff; -+ result[11] = 0xff; -+ for (i = 0; i < addr.length; i++) { -+ result[i + 12] = addr[i] & mask[i + 12]; -+ } -+ i = i + 12; -+ } -+ for (; i < result.length; i++) -+ result[i] = 0; -+ -+ return ip.toString(result); -+}; -+ -+ip.cidr = function(cidrString) { -+ var cidrParts = cidrString.split('/'); -+ -+ var addr = cidrParts[0]; -+ if (cidrParts.length !== 2) -+ throw new Error('invalid CIDR subnet: ' + addr); -+ -+ var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); -+ -+ return ip.mask(addr, mask); -+}; -+ -+ip.subnet = function(addr, mask) { -+ var networkAddress = ip.toLong(ip.mask(addr, mask)); -+ -+ // Calculate the mask's length. -+ var maskBuffer = ip.toBuffer(mask); -+ var maskLength = 0; -+ -+ for (var i = 0; i < maskBuffer.length; i++) { -+ if (maskBuffer[i] === 0xff) { -+ maskLength += 8; -+ } else { -+ var octet = maskBuffer[i] & 0xff; -+ while (octet) { -+ octet = (octet << 1) & 0xff; -+ maskLength++; -+ } -+ } -+ } -+ -+ var numberOfAddresses = Math.pow(2, 32 - maskLength); -+ -+ return { -+ networkAddress: ip.fromLong(networkAddress), -+ firstAddress: numberOfAddresses <= 2 ? -+ ip.fromLong(networkAddress) : -+ ip.fromLong(networkAddress + 1), -+ lastAddress: numberOfAddresses <= 2 ? -+ ip.fromLong(networkAddress + numberOfAddresses - 1) : -+ ip.fromLong(networkAddress + numberOfAddresses - 2), -+ broadcastAddress: ip.fromLong(networkAddress + numberOfAddresses - 1), -+ subnetMask: mask, -+ subnetMaskLength: maskLength, -+ numHosts: numberOfAddresses <= 2 ? -+ numberOfAddresses : numberOfAddresses - 2, -+ length: numberOfAddresses, -+ contains: function(other) { -+ return networkAddress === ip.toLong(ip.mask(other, mask)); -+ } -+ }; -+}; -+ -+ip.cidrSubnet = function(cidrString) { -+ var cidrParts = cidrString.split('/'); -+ -+ var addr = cidrParts[0]; -+ if (cidrParts.length !== 2) -+ throw new Error('invalid CIDR subnet: ' + addr); -+ -+ var mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10)); -+ -+ return ip.subnet(addr, mask); -+}; -+ -+ip.not = function(addr) { -+ var buff = ip.toBuffer(addr); -+ for (var i = 0; i < buff.length; i++) { -+ buff[i] = 0xff ^ buff[i]; -+ } -+ return ip.toString(buff); -+}; -+ -+ip.or = function(a, b) { -+ a = ip.toBuffer(a); -+ b = ip.toBuffer(b); -+ -+ // same protocol -+ if (a.length === b.length) { -+ for (var i = 0; i < a.length; ++i) { -+ a[i] |= b[i]; -+ } -+ return ip.toString(a); -+ -+ // mixed protocols -+ } else { -+ var buff = a; -+ var other = b; -+ if (b.length > a.length) { -+ buff = b; -+ other = a; -+ } -+ -+ var offset = buff.length - other.length; -+ for (var i = offset; i < buff.length; ++i) { -+ buff[i] |= other[i - offset]; -+ } -+ -+ return ip.toString(buff); -+ } -+}; -+ -+ip.isEqual = function(a, b) { -+ a = ip.toBuffer(a); -+ b = ip.toBuffer(b); -+ -+ // Same protocol -+ if (a.length === b.length) { -+ for (var i = 0; i < a.length; i++) { -+ if (a[i] !== b[i]) return false; -+ } -+ return true; -+ } -+ -+ // Swap -+ if (b.length === 4) { -+ var t = b; -+ b = a; -+ a = t; -+ } -+ -+ // a - IPv4, b - IPv6 -+ for (var i = 0; i < 10; i++) { -+ if (b[i] !== 0) return false; -+ } -+ -+ var word = b.readUInt16BE(10); -+ if (word !== 0 && word !== 0xffff) return false; -+ -+ for (var i = 0; i < 4; i++) { -+ if (a[i] !== b[i + 12]) return false; -+ } -+ -+ return true; -+}; -+ -+ip.isPrivate = function(addr) { -+ return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i -+ .test(addr) || -+ /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || -+ /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i -+ .test(addr) || -+ /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || -+ /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || -+ /^f[cd][0-9a-f]{2}:/i.test(addr) || -+ /^fe80:/i.test(addr) || -+ /^::1$/.test(addr) || -+ /^::$/.test(addr); -+}; -+ -+ip.isPublic = function(addr) { -+ return !ip.isPrivate(addr); -+}; -+ -+ip.isLoopback = function(addr) { -+ return /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/ -+ .test(addr) || -+ /^fe80::1$/.test(addr) || -+ /^::1$/.test(addr) || -+ /^::$/.test(addr); -+}; -+ -+ip.loopback = function(family) { -+ // -+ // Default to `ipv4` -+ // -+ family = _normalizeFamily(family); -+ -+ if (family !== 'ipv4' && family !== 'ipv6') { -+ throw new Error('family must be ipv4 or ipv6'); -+ } -+ -+ return family === 'ipv4' ? '127.0.0.1' : 'fe80::1'; -+}; -+ -+// -+// ### function address (name, family) -+// #### @name {string|'public'|'private'} **Optional** Name or security -+// of the network interface. -+// #### @family {ipv4|ipv6} **Optional** IP family of the address (defaults -+// to ipv4). -+// -+// Returns the address for the network interface on the current system with -+// the specified `name`: -+// * String: First `family` address of the interface. -+// If not found see `undefined`. -+// * 'public': the first public ip address of family. -+// * 'private': the first private ip address of family. -+// * undefined: First address with `ipv4` or loopback address `127.0.0.1`. -+// -+ip.address = function(name, family) { -+ var interfaces = os.networkInterfaces(); -+ var all; -+ -+ // -+ // Default to `ipv4` -+ // -+ family = _normalizeFamily(family); -+ -+ // -+ // If a specific network interface has been named, -+ // return the address. -+ // -+ if (name && name !== 'private' && name !== 'public') { -+ var res = interfaces[name].filter(function(details) { -+ var itemFamily = details.family.toLowerCase(); -+ return itemFamily === family; -+ }); -+ if (res.length === 0) -+ return undefined; -+ return res[0].address; -+ } -+ -+ var all = Object.keys(interfaces).map(function (nic) { -+ // -+ // Note: name will only be `public` or `private` -+ // when this is called. -+ // -+ var addresses = interfaces[nic].filter(function (details) { -+ details.family = details.family.toLowerCase(); -+ if (details.family !== family || ip.isLoopback(details.address)) { -+ return false; -+ } else if (!name) { -+ return true; -+ } -+ -+ return name === 'public' ? ip.isPrivate(details.address) : -+ ip.isPublic(details.address); -+ }); -+ -+ return addresses.length ? addresses[0].address : undefined; -+ }).filter(Boolean); -+ -+ return !all.length ? ip.loopback(family) : all[0]; -+}; -+ -+ip.toLong = function(ip) { -+ var ipl = 0; -+ ip.split('.').forEach(function(octet) { -+ ipl <<= 8; -+ ipl += parseInt(octet); -+ }); -+ return(ipl >>> 0); -+}; -+ -+ip.fromLong = function(ipl) { -+ return ((ipl >>> 24) + '.' + -+ (ipl >> 16 & 255) + '.' + -+ (ipl >> 8 & 255) + '.' + -+ (ipl & 255) ); -+}; -+ -+}, -+"5gV6T8GVNipG8y0afdCR8YkabdHSzg4g25tkjKfQL0w=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var support = require('./support'); -+var compressions = require('./compressions'); -+var nodeBuffer = require('./nodeBuffer'); -+/** -+ * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. -+ * @param {string} str the string to transform. -+ * @return {String} the binary string. -+ */ -+exports.string2binary = function(str) { -+ var result = ""; -+ for (var i = 0; i < str.length; i++) { -+ result += String.fromCharCode(str.charCodeAt(i) & 0xff); -+ } -+ return result; -+}; -+exports.arrayBuffer2Blob = function(buffer, mimeType) { -+ exports.checkSupport("blob"); -+ mimeType = mimeType || 'application/zip'; -+ -+ try { -+ // Blob constructor -+ return new Blob([buffer], { -+ type: mimeType -+ }); -+ } -+ catch (e) { -+ -+ try { -+ // deprecated, browser only, old way -+ var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; -+ var builder = new Builder(); -+ builder.append(buffer); -+ return builder.getBlob(mimeType); -+ } -+ catch (e) { -+ -+ // well, fuck ?! -+ throw new Error("Bug : can't construct the Blob."); -+ } -+ } -+ -+ -+}; -+/** -+ * The identity function. -+ * @param {Object} input the input. -+ * @return {Object} the same input. -+ */ -+function identity(input) { -+ return input; -+} -+ -+/** -+ * Fill in an array with a string. -+ * @param {String} str the string to use. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). -+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. -+ */ -+function stringToArrayLike(str, array) { -+ for (var i = 0; i < str.length; ++i) { -+ array[i] = str.charCodeAt(i) & 0xFF; -+ } -+ return array; -+} -+ -+/** -+ * Transform an array-like object to a string. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. -+ * @return {String} the result. -+ */ -+function arrayLikeToString(array) { -+ // Performances notes : -+ // -------------------- -+ // String.fromCharCode.apply(null, array) is the fastest, see -+ // see http://jsperf.com/converting-a-uint8array-to-a-string/2 -+ // but the stack is limited (and we can get huge arrays !). -+ // -+ // result += String.fromCharCode(array[i]); generate too many strings ! -+ // -+ // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2 -+ var chunk = 65536; -+ var result = [], -+ len = array.length, -+ type = exports.getTypeOf(array), -+ k = 0, -+ canUseApply = true; -+ try { -+ switch(type) { -+ case "uint8array": -+ String.fromCharCode.apply(null, new Uint8Array(0)); -+ break; -+ case "nodebuffer": -+ String.fromCharCode.apply(null, nodeBuffer(0)); -+ break; -+ } -+ } catch(e) { -+ canUseApply = false; -+ } -+ -+ // no apply : slow and painful algorithm -+ // default browser on android 4.* -+ if (!canUseApply) { -+ var resultStr = ""; -+ for(var i = 0; i < array.length;i++) { -+ resultStr += String.fromCharCode(array[i]); -+ } -+ return resultStr; -+ } -+ while (k < len && chunk > 1) { -+ try { -+ if (type === "array" || type === "nodebuffer") { -+ result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))); -+ } -+ else { -+ result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))); -+ } -+ k += chunk; -+ } -+ catch (e) { -+ chunk = Math.floor(chunk / 2); -+ } -+ } -+ return result.join(""); -+} -+ -+exports.applyFromCharCode = arrayLikeToString; -+ -+ -+/** -+ * Copy the data from an array-like to an other array-like. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated. -+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array. -+ */ -+function arrayLikeToArrayLike(arrayFrom, arrayTo) { -+ for (var i = 0; i < arrayFrom.length; i++) { -+ arrayTo[i] = arrayFrom[i]; -+ } -+ return arrayTo; -+} -+ -+// a matrix containing functions to transform everything into everything. -+var transform = {}; -+ -+// string to ? -+transform["string"] = { -+ "string": identity, -+ "array": function(input) { -+ return stringToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return transform["string"]["uint8array"](input).buffer; -+ }, -+ "uint8array": function(input) { -+ return stringToArrayLike(input, new Uint8Array(input.length)); -+ }, -+ "nodebuffer": function(input) { -+ return stringToArrayLike(input, nodeBuffer(input.length)); -+ } -+}; -+ -+// array to ? -+transform["array"] = { -+ "string": arrayLikeToString, -+ "array": identity, -+ "arraybuffer": function(input) { -+ return (new Uint8Array(input)).buffer; -+ }, -+ "uint8array": function(input) { -+ return new Uint8Array(input); -+ }, -+ "nodebuffer": function(input) { -+ return nodeBuffer(input); -+ } -+}; -+ -+// arraybuffer to ? -+transform["arraybuffer"] = { -+ "string": function(input) { -+ return arrayLikeToString(new Uint8Array(input)); -+ }, -+ "array": function(input) { -+ return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength)); -+ }, -+ "arraybuffer": identity, -+ "uint8array": function(input) { -+ return new Uint8Array(input); -+ }, -+ "nodebuffer": function(input) { -+ return nodeBuffer(new Uint8Array(input)); -+ } -+}; -+ -+// uint8array to ? -+transform["uint8array"] = { -+ "string": arrayLikeToString, -+ "array": function(input) { -+ return arrayLikeToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return input.buffer; -+ }, -+ "uint8array": identity, -+ "nodebuffer": function(input) { -+ return nodeBuffer(input); -+ } -+}; -+ -+// nodebuffer to ? -+transform["nodebuffer"] = { -+ "string": arrayLikeToString, -+ "array": function(input) { -+ return arrayLikeToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return transform["nodebuffer"]["uint8array"](input).buffer; -+ }, -+ "uint8array": function(input) { -+ return arrayLikeToArrayLike(input, new Uint8Array(input.length)); -+ }, -+ "nodebuffer": identity -+}; -+ -+/** -+ * Transform an input into any type. -+ * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. -+ * If no output type is specified, the unmodified input will be returned. -+ * @param {String} outputType the output type. -+ * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. -+ * @throws {Error} an Error if the browser doesn't support the requested output type. -+ */ -+exports.transformTo = function(outputType, input) { -+ if (!input) { -+ // undefined, null, etc -+ // an empty string won't harm. -+ input = ""; -+ } -+ if (!outputType) { -+ return input; -+ } -+ exports.checkSupport(outputType); -+ var inputType = exports.getTypeOf(input); -+ var result = transform[inputType][outputType](input); -+ return result; -+}; -+ -+/** -+ * Return the type of the input. -+ * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. -+ * @param {Object} input the input to identify. -+ * @return {String} the (lowercase) type of the input. -+ */ -+exports.getTypeOf = function(input) { -+ if (typeof input === "string") { -+ return "string"; -+ } -+ if (Object.prototype.toString.call(input) === "[object Array]") { -+ return "array"; -+ } -+ if (support.nodebuffer && nodeBuffer.test(input)) { -+ return "nodebuffer"; -+ } -+ if (support.uint8array && input instanceof Uint8Array) { -+ return "uint8array"; -+ } -+ if (support.arraybuffer && input instanceof ArrayBuffer) { -+ return "arraybuffer"; -+ } -+}; -+ -+/** -+ * Throw an exception if the type is not supported. -+ * @param {String} type the type to check. -+ * @throws {Error} an Error if the browser doesn't support the requested type. -+ */ -+exports.checkSupport = function(type) { -+ var supported = support[type.toLowerCase()]; -+ if (!supported) { -+ throw new Error(type + " is not supported by this browser"); -+ } -+}; -+exports.MAX_VALUE_16BITS = 65535; -+exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1 -+ -+/** -+ * Prettify a string read as binary. -+ * @param {string} str the string to prettify. -+ * @return {string} a pretty string. -+ */ -+exports.pretty = function(str) { -+ var res = '', -+ code, i; -+ for (i = 0; i < (str || "").length; i++) { -+ code = str.charCodeAt(i); -+ res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); -+ } -+ return res; -+}; -+ -+/** -+ * Find a compression registered in JSZip. -+ * @param {string} compressionMethod the method magic to find. -+ * @return {Object|null} the JSZip compression object, null if none found. -+ */ -+exports.findCompression = function(compressionMethod) { -+ for (var method in compressions) { -+ if (!compressions.hasOwnProperty(method)) { -+ continue; -+ } -+ if (compressions[method].magic === compressionMethod) { -+ return compressions[method]; -+ } -+ } -+ return null; -+}; -+/** -+* Cross-window, cross-Node-context regular expression detection -+* @param {Object} object Anything -+* @return {Boolean} true if the object is a regular expression, -+* false otherwise -+*/ -+exports.isRegExp = function (object) { -+ return Object.prototype.toString.call(object) === "[object RegExp]"; -+}; -+ -+ -+}, -+"5qoKZcZtvr+CkDw3NE+0xZ2G0Zjcnq48+Iupk2Wkllc=": -+function (require, module, exports, __dirname, __filename) { -+var varint = require('varint'); -+ -+var POOL_SIZE = 100000; -+var MINIMUM_POOL_LENGTH = 100; -+var pool = Buffer.alloc(POOL_SIZE); -+ -+exports.read = function(stream, cb) { -+ var msglen = 0; -+ var prev = null; -+ var lock = false; -+ -+ var unlock = function() { -+ lock = false -+ }; -+ -+ var readable = function() { -+ if (lock) return; -+ lock = true; -+ -+ if (!msglen) { -+ var buf = stream.read(); -+ if (!buf) return unlock(); -+ if (prev) { -+ buf = Buffer.concat([prev, buf]); -+ prev = null; -+ } -+ -+ for (var i = 0; i < buf.length; i++) { -+ if (!(buf[i] & 0x80)) { -+ msglen = varint.decode(buf); -+ break; -+ } -+ } -+ if (!msglen) { -+ prev = buf; -+ return unlock(); -+ } -+ buf = buf.slice(varint.decode.bytes); -+ stream.unshift(buf); -+ } -+ -+ var chunk = stream.read(msglen); -+ if (!chunk) return unlock(); -+ -+ stream.removeListener('readable', readable); -+ cb(chunk) -+ }; -+ -+ stream.on('readable', readable); -+ readable(); -+}; -+ -+exports.write = function(stream, msg) { -+ if (typeof msg === 'string') msg = Buffer.from(msg); -+ varint.encode(msg.length, pool); -+ var lenBuf = pool.slice(0, varint.encode.bytes); -+ pool = pool.slice(varint.encode.bytes); -+ if (pool.length < MINIMUM_POOL_LENGTH) pool = Buffer.alloc(POOL_SIZE); -+ -+ stream.write(lenBuf); -+ stream.write(msg); -+}; -+ -+}, -+"5qpGJH3uH5dJcnqdmzHmV2W4sREagc1KWdxpor8ZrAs=": -+function (require, module, exports, __dirname, __filename) { -+var bufferAlloc = require('buffer-alloc') -+ -+var UINT_32_MAX = Math.pow(2, 32) -+ -+exports.encodingLength = function () { -+ return 8 -+} -+ -+exports.encode = function (num, buf, offset) { -+ if (!buf) buf = bufferAlloc(8) -+ if (!offset) offset = 0 -+ -+ var top = Math.floor(num / UINT_32_MAX) -+ var rem = num - top * UINT_32_MAX -+ -+ buf.writeUInt32BE(top, offset) -+ buf.writeUInt32BE(rem, offset + 4) -+ return buf -+} -+ -+exports.decode = function (buf, offset) { -+ if (!offset) offset = 0 -+ -+ var top = buf.readUInt32BE(offset) -+ var rem = buf.readUInt32BE(offset + 4) -+ -+ return top * UINT_32_MAX + rem -+} -+ -+exports.encode.bytes = 8 -+exports.decode.bytes = 8 -+ -+}, -+"5r0xl+xXJmy6nxI0bMQf+fjFAayutAvY/uzjEHajBL0=": -+function (require, module, exports, __dirname, __filename) { -+// a passthrough stream. -+// basically just the most minimal sort of Transform stream. -+// Every written chunk gets output as-is. -+ -+'use strict'; -+ -+module.exports = PassThrough; -+ -+var Transform = require('./_stream_transform'); -+ -+/**/ -+var util = require('core-util-is'); -+util.inherits = require('inherits'); -+/**/ -+ -+util.inherits(PassThrough, Transform); -+ -+function PassThrough(options) { -+ if (!(this instanceof PassThrough)) return new PassThrough(options); -+ -+ Transform.call(this, options); -+} -+ -+PassThrough.prototype._transform = function (chunk, encoding, cb) { -+ cb(null, chunk); -+}; -+}, -+"5s24T9hbJkRf1bRKxmrxbfRLR8hpv+XTnGr+V0z/hvA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var promiseLib; -+ -+exports.set = function(lib) { -+ -+ if (lib) { -+ promiseLib = parsePromiseLib(lib); -+ } else { -+ // if not ES6, native Promise is not support -+ if (typeof(Promise) === 'undefined') { -+ throw new TypeError('Promise library must be specified.'); -+ } -+ promiseLib = parsePromiseLib(Promise); -+ } -+ -+ return promiseLib; -+}; -+ -+exports.promisify = function(func) { -+ if (!promiseLib) { promiseLib = parsePromiseLib(Promise); } -+ -+ return function () { -+ var args = Array.prototype.slice.call(arguments); -+ return new promiseLib(function (resolve, reject) { -+ args.push(function (err, res) { -+ if (err) { reject(err); } -+ else { resolve(res); } -+ }); -+ func.apply(null, args); -+ }); -+ }; -+}; -+ -+function parsePromiseLib(promiseLib) { -+ -+ var libType = typeof promiseLib; -+ -+ if (libType === 'function' || libType === 'object') { -+ var root = promiseLib.Promise instanceof Function ? promiseLib.Promise : promiseLib, -+ methods = ['resolve', 'reject', 'all'], -+ success = true; -+ -+ var promise = function(func) { -+ return new root(func); -+ }; -+ -+ methods.forEach(function(method) { -+ promise[method] = root[method]; -+ success = success && root[method] instanceof Function; -+ }); -+ -+ if (success) { -+ return promise; -+ } -+ } else { -+ throw new TypeError('Invalid promise library specified.') -+ } -+} -+ -+}, -+"5vZTNz8xL4VEfuROz0Q8p8V7FwRy3C7eoKVjKPZBp2s=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * collection-visit -+ * -+ * Copyright (c) 2015, 2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var visit = require('object-visit'); -+var mapVisit = require('map-visit'); -+ -+module.exports = function(collection, method, val) { -+ var result; -+ -+ if (typeof val === 'string' && (method in collection)) { -+ var args = [].slice.call(arguments, 2); -+ result = collection[method].apply(collection, args); -+ } else if (Array.isArray(val)) { -+ result = mapVisit.apply(null, arguments); -+ } else { -+ result = visit.apply(null, arguments); -+ } -+ -+ if (typeof result !== 'undefined') { -+ return result; -+ } -+ -+ return collection; -+}; -+ -+}, -+"60aeIGKAMho4ePIzXsmKohBKFVB52O2DojApCY3M0hU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// do not edit .js files directly - edit src/index.jst -+ -+ -+ -+module.exports = function equal(a, b) { -+ if (a === b) return true; -+ -+ if (a && b && typeof a == 'object' && typeof b == 'object') { -+ if (a.constructor !== b.constructor) return false; -+ -+ var length, i, keys; -+ if (Array.isArray(a)) { -+ length = a.length; -+ if (length != b.length) return false; -+ for (i = length; i-- !== 0;) -+ if (!equal(a[i], b[i])) return false; -+ return true; -+ } -+ -+ -+ -+ if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; -+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); -+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); -+ -+ keys = Object.keys(a); -+ length = keys.length; -+ if (length !== Object.keys(b).length) return false; -+ -+ for (i = length; i-- !== 0;) -+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; -+ -+ for (i = length; i-- !== 0;) { -+ var key = keys[i]; -+ -+ if (!equal(a[key], b[key])) return false; -+ } -+ -+ return true; -+ } -+ -+ // true if both NaN, false otherwise -+ return a!==a && b!==b; -+}; -+ -+}, -+"68n5voRgLRLI40Qvj1Xe/BrgERgtO7WX94txdjGIq3g=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var utils = require('../utils/common'); -+ -+var MAXBITS = 15; -+var ENOUGH_LENS = 852; -+var ENOUGH_DISTS = 592; -+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); -+ -+var CODES = 0; -+var LENS = 1; -+var DISTS = 2; -+ -+var lbase = [ /* Length codes 257..285 base */ -+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, -+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -+]; -+ -+var lext = [ /* Length codes 257..285 extra */ -+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, -+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -+]; -+ -+var dbase = [ /* Distance codes 0..29 base */ -+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, -+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, -+ 8193, 12289, 16385, 24577, 0, 0 -+]; -+ -+var dext = [ /* Distance codes 0..29 extra */ -+ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, -+ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, -+ 28, 28, 29, 29, 64, 64 -+]; -+ -+module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -+{ -+ var bits = opts.bits; -+ //here = opts.here; /* table entry for duplication */ -+ -+ var len = 0; /* a code's length in bits */ -+ var sym = 0; /* index of code symbols */ -+ var min = 0, max = 0; /* minimum and maximum code lengths */ -+ var root = 0; /* number of index bits for root table */ -+ var curr = 0; /* number of index bits for current table */ -+ var drop = 0; /* code bits to drop for sub-table */ -+ var left = 0; /* number of prefix codes available */ -+ var used = 0; /* code entries in table used */ -+ var huff = 0; /* Huffman code */ -+ var incr; /* for incrementing code, index */ -+ var fill; /* index for replicating entries */ -+ var low; /* low bits for current root entry */ -+ var mask; /* mask for low root bits */ -+ var next; /* next available space in table */ -+ var base = null; /* base value table to use */ -+ var base_index = 0; -+// var shoextra; /* extra bits table to use */ -+ var end; /* use base and extra for symbol > end */ -+ var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ -+ var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ -+ var extra = null; -+ var extra_index = 0; -+ -+ var here_bits, here_op, here_val; -+ -+ /* -+ Process a set of code lengths to create a canonical Huffman code. The -+ code lengths are lens[0..codes-1]. Each length corresponds to the -+ symbols 0..codes-1. The Huffman code is generated by first sorting the -+ symbols by length from short to long, and retaining the symbol order -+ for codes with equal lengths. Then the code starts with all zero bits -+ for the first code of the shortest length, and the codes are integer -+ increments for the same length, and zeros are appended as the length -+ increases. For the deflate format, these bits are stored backwards -+ from their more natural integer increment ordering, and so when the -+ decoding tables are built in the large loop below, the integer codes -+ are incremented backwards. -+ -+ This routine assumes, but does not check, that all of the entries in -+ lens[] are in the range 0..MAXBITS. The caller must assure this. -+ 1..MAXBITS is interpreted as that code length. zero means that that -+ symbol does not occur in this code. -+ -+ The codes are sorted by computing a count of codes for each length, -+ creating from that a table of starting indices for each length in the -+ sorted table, and then entering the symbols in order in the sorted -+ table. The sorted table is work[], with that space being provided by -+ the caller. -+ -+ The length counts are used for other purposes as well, i.e. finding -+ the minimum and maximum length codes, determining if there are any -+ codes at all, checking for a valid set of lengths, and looking ahead -+ at length counts to determine sub-table sizes when building the -+ decoding tables. -+ */ -+ -+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ -+ for (len = 0; len <= MAXBITS; len++) { -+ count[len] = 0; -+ } -+ for (sym = 0; sym < codes; sym++) { -+ count[lens[lens_index + sym]]++; -+ } -+ -+ /* bound code lengths, force root to be within code lengths */ -+ root = bits; -+ for (max = MAXBITS; max >= 1; max--) { -+ if (count[max] !== 0) { break; } -+ } -+ if (root > max) { -+ root = max; -+ } -+ if (max === 0) { /* no symbols to code at all */ -+ //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ -+ //table.bits[opts.table_index] = 1; //here.bits = (var char)1; -+ //table.val[opts.table_index++] = 0; //here.val = (var short)0; -+ table[table_index++] = (1 << 24) | (64 << 16) | 0; -+ -+ -+ //table.op[opts.table_index] = 64; -+ //table.bits[opts.table_index] = 1; -+ //table.val[opts.table_index++] = 0; -+ table[table_index++] = (1 << 24) | (64 << 16) | 0; -+ -+ opts.bits = 1; -+ return 0; /* no symbols, but wait for decoding to report error */ -+ } -+ for (min = 1; min < max; min++) { -+ if (count[min] !== 0) { break; } -+ } -+ if (root < min) { -+ root = min; -+ } -+ -+ /* check for an over-subscribed or incomplete set of lengths */ -+ left = 1; -+ for (len = 1; len <= MAXBITS; len++) { -+ left <<= 1; -+ left -= count[len]; -+ if (left < 0) { -+ return -1; -+ } /* over-subscribed */ -+ } -+ if (left > 0 && (type === CODES || max !== 1)) { -+ return -1; /* incomplete set */ -+ } -+ -+ /* generate offsets into symbol table for each length for sorting */ -+ offs[1] = 0; -+ for (len = 1; len < MAXBITS; len++) { -+ offs[len + 1] = offs[len] + count[len]; -+ } -+ -+ /* sort symbols by length, by symbol order within each length */ -+ for (sym = 0; sym < codes; sym++) { -+ if (lens[lens_index + sym] !== 0) { -+ work[offs[lens[lens_index + sym]]++] = sym; -+ } -+ } -+ -+ /* -+ Create and fill in decoding tables. In this loop, the table being -+ filled is at next and has curr index bits. The code being used is huff -+ with length len. That code is converted to an index by dropping drop -+ bits off of the bottom. For codes where len is less than drop + curr, -+ those top drop + curr - len bits are incremented through all values to -+ fill the table with replicated entries. -+ -+ root is the number of index bits for the root table. When len exceeds -+ root, sub-tables are created pointed to by the root entry with an index -+ of the low root bits of huff. This is saved in low to check for when a -+ new sub-table should be started. drop is zero when the root table is -+ being filled, and drop is root when sub-tables are being filled. -+ -+ When a new sub-table is needed, it is necessary to look ahead in the -+ code lengths to determine what size sub-table is needed. The length -+ counts are used for this, and so count[] is decremented as codes are -+ entered in the tables. -+ -+ used keeps track of how many table entries have been allocated from the -+ provided *table space. It is checked for LENS and DIST tables against -+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in -+ the initial root table size constants. See the comments in inftrees.h -+ for more information. -+ -+ sym increments through all symbols, and the loop terminates when -+ all codes of length max, i.e. all codes, have been processed. This -+ routine permits incomplete codes, so another loop after this one fills -+ in the rest of the decoding tables with invalid code markers. -+ */ -+ -+ /* set up for code type */ -+ // poor man optimization - use if-else instead of switch, -+ // to avoid deopts in old v8 -+ if (type === CODES) { -+ base = extra = work; /* dummy value--not used */ -+ end = 19; -+ -+ } else if (type === LENS) { -+ base = lbase; -+ base_index -= 257; -+ extra = lext; -+ extra_index -= 257; -+ end = 256; -+ -+ } else { /* DISTS */ -+ base = dbase; -+ extra = dext; -+ end = -1; -+ } -+ -+ /* initialize opts for loop */ -+ huff = 0; /* starting code */ -+ sym = 0; /* starting code symbol */ -+ len = min; /* starting code length */ -+ next = table_index; /* current table to fill in */ -+ curr = root; /* current table index bits */ -+ drop = 0; /* current bits to drop from code for index */ -+ low = -1; /* trigger new sub-table when len > root */ -+ used = 1 << root; /* use root table entries */ -+ mask = used - 1; /* mask for comparing low */ -+ -+ /* check available table space */ -+ if ((type === LENS && used > ENOUGH_LENS) || -+ (type === DISTS && used > ENOUGH_DISTS)) { -+ return 1; -+ } -+ -+ var i = 0; -+ /* process all codes and make table entries */ -+ for (;;) { -+ i++; -+ /* create table entry */ -+ here_bits = len - drop; -+ if (work[sym] < end) { -+ here_op = 0; -+ here_val = work[sym]; -+ } -+ else if (work[sym] > end) { -+ here_op = extra[extra_index + work[sym]]; -+ here_val = base[base_index + work[sym]]; -+ } -+ else { -+ here_op = 32 + 64; /* end of block */ -+ here_val = 0; -+ } -+ -+ /* replicate for those indices with low len bits equal to huff */ -+ incr = 1 << (len - drop); -+ fill = 1 << curr; -+ min = fill; /* save offset to next table */ -+ do { -+ fill -= incr; -+ table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; -+ } while (fill !== 0); -+ -+ /* backwards increment the len-bit code huff */ -+ incr = 1 << (len - 1); -+ while (huff & incr) { -+ incr >>= 1; -+ } -+ if (incr !== 0) { -+ huff &= incr - 1; -+ huff += incr; -+ } else { -+ huff = 0; -+ } -+ -+ /* go to next symbol, update count, len */ -+ sym++; -+ if (--count[len] === 0) { -+ if (len === max) { break; } -+ len = lens[lens_index + work[sym]]; -+ } -+ -+ /* create new sub-table if needed */ -+ if (len > root && (huff & mask) !== low) { -+ /* if first time, transition to sub-tables */ -+ if (drop === 0) { -+ drop = root; -+ } -+ -+ /* increment past last table */ -+ next += min; /* here min is 1 << curr */ -+ -+ /* determine length of next table */ -+ curr = len - drop; -+ left = 1 << curr; -+ while (curr + drop < max) { -+ left -= count[curr + drop]; -+ if (left <= 0) { break; } -+ curr++; -+ left <<= 1; -+ } -+ -+ /* check for enough space */ -+ used += 1 << curr; -+ if ((type === LENS && used > ENOUGH_LENS) || -+ (type === DISTS && used > ENOUGH_DISTS)) { -+ return 1; -+ } -+ -+ /* point entry in root table to sub-table */ -+ low = huff & mask; -+ /*table.op[low] = curr; -+ table.bits[low] = root; -+ table.val[low] = next - opts.table_index;*/ -+ table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; -+ } -+ } -+ -+ /* fill in remaining table entry if code is incomplete (guaranteed to have -+ at most one remaining entry, since if the code is incomplete, the -+ maximum code length that was allowed to get this far is one bit) */ -+ if (huff !== 0) { -+ //table.op[next + huff] = 64; /* invalid code marker */ -+ //table.bits[next + huff] = len - drop; -+ //table.val[next + huff] = 0; -+ table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; -+ } -+ -+ /* set return parameters */ -+ //opts.table_index += used; -+ opts.bits = root; -+ return 0; -+}; -+ -+}, -+"6DCjGskhjGnja4MVlhr/PuDiXECi/KHCLjbXdp+OGGk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+/** -+* Nanomatch compilers -+*/ -+ -+module.exports = function(nanomatch, options) { -+ function slash() { -+ if (options && typeof options.slash === 'string') { -+ return options.slash; -+ } -+ if (options && typeof options.slash === 'function') { -+ return options.slash.call(nanomatch); -+ } -+ return '\\\\/'; -+ } -+ -+ function star() { -+ if (options && typeof options.star === 'string') { -+ return options.star; -+ } -+ if (options && typeof options.star === 'function') { -+ return options.star.call(nanomatch); -+ } -+ return '[^' + slash() + ']*?'; -+ } -+ -+ var ast = nanomatch.ast = nanomatch.parser.ast; -+ ast.state = nanomatch.parser.state; -+ nanomatch.compiler.state = ast.state; -+ nanomatch.compiler -+ -+ /** -+ * Negation / escaping -+ */ -+ -+ .set('not', function(node) { -+ var prev = this.prev(); -+ if (this.options.nonegate === true || prev.type !== 'bos') { -+ return this.emit('\\' + node.val, node); -+ } -+ return this.emit(node.val, node); -+ }) -+ .set('escape', function(node) { -+ if (this.options.unescape && /^[-\w_.]/.test(node.val)) { -+ return this.emit(node.val, node); -+ } -+ return this.emit('\\' + node.val, node); -+ }) -+ .set('quoted', function(node) { -+ return this.emit(node.val, node); -+ }) -+ -+ /** -+ * Regex -+ */ -+ -+ .set('dollar', function(node) { -+ if (node.parent.type === 'bracket') { -+ return this.emit(node.val, node); -+ } -+ return this.emit('\\' + node.val, node); -+ }) -+ -+ /** -+ * Dot: "." -+ */ -+ -+ .set('dot', function(node) { -+ if (node.dotfiles === true) this.dotfiles = true; -+ return this.emit('\\' + node.val, node); -+ }) -+ -+ /** -+ * Slashes: "/" and "\" -+ */ -+ -+ .set('backslash', function(node) { -+ return this.emit(node.val, node); -+ }) -+ .set('slash', function(node, nodes, i) { -+ var val = '[' + slash() + ']'; -+ var parent = node.parent; -+ var prev = this.prev(); -+ -+ // set "node.hasSlash" to true on all ancestor parens nodes -+ while (parent.type === 'paren' && !parent.hasSlash) { -+ parent.hasSlash = true; -+ parent = parent.parent; -+ } -+ -+ if (prev.addQmark) { -+ val += '?'; -+ } -+ -+ // word boundary -+ if (node.rest.slice(0, 2) === '\\b') { -+ return this.emit(val, node); -+ } -+ -+ // globstars -+ if (node.parsed === '**' || node.parsed === './**') { -+ this.output = '(?:' + this.output; -+ return this.emit(val + ')?', node); -+ } -+ -+ // negation -+ if (node.parsed === '!**' && this.options.nonegate !== true) { -+ return this.emit(val + '?\\b', node); -+ } -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Square brackets -+ */ -+ -+ .set('bracket', function(node) { -+ var close = node.close; -+ var open = !node.escaped ? '[' : '\\['; -+ var negated = node.negated; -+ var inner = node.inner; -+ var val = node.val; -+ -+ if (node.escaped === true) { -+ inner = inner.replace(/\\?(\W)/g, '\\$1'); -+ negated = ''; -+ } -+ -+ if (inner === ']-') { -+ inner = '\\]\\-'; -+ } -+ -+ if (negated && inner.indexOf('.') === -1) { -+ inner += '.'; -+ } -+ if (negated && inner.indexOf('/') === -1) { -+ inner += '/'; -+ } -+ -+ val = open + negated + inner + close; -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Square: "[.]" (only matches a single character in brackets) -+ */ -+ -+ .set('square', function(node) { -+ var val = (/^\W/.test(node.val) ? '\\' : '') + node.val; -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Question mark: "?" -+ */ -+ -+ .set('qmark', function(node) { -+ var prev = this.prev(); -+ // don't use "slash" variable so that we always avoid -+ // matching backslashes and slashes with a qmark -+ var val = '[^.\\\\/]'; -+ if (this.options.dot || (prev.type !== 'bos' && prev.type !== 'slash')) { -+ val = '[^\\\\/]'; -+ } -+ -+ if (node.parsed.slice(-1) === '(') { -+ var ch = node.rest.charAt(0); -+ if (ch === '!' || ch === '=' || ch === ':') { -+ return this.emit(node.val, node); -+ } -+ } -+ -+ if (node.val.length > 1) { -+ val += '{' + node.val.length + '}'; -+ } -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Plus -+ */ -+ -+ .set('plus', function(node) { -+ var prev = node.parsed.slice(-1); -+ if (prev === ']' || prev === ')') { -+ return this.emit(node.val, node); -+ } -+ if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { -+ return this.emit('\\+', node); -+ } -+ var ch = this.output.slice(-1); -+ if (/\w/.test(ch) && !node.inside) { -+ return this.emit('+\\+?', node); -+ } -+ return this.emit('+', node); -+ }) -+ -+ /** -+ * globstar: '**' -+ */ -+ -+ .set('globstar', function(node, nodes, i) { -+ if (!this.output) { -+ this.state.leadingGlobstar = true; -+ } -+ -+ var prev = this.prev(); -+ var before = this.prev(2); -+ var next = this.next(); -+ var after = this.next(2); -+ var type = prev.type; -+ var val = node.val; -+ -+ if (prev.type === 'slash' && next.type === 'slash') { -+ if (before.type === 'text') { -+ this.output += '?'; -+ -+ if (after.type !== 'text') { -+ this.output += '\\b'; -+ } -+ } -+ } -+ -+ var parsed = node.parsed; -+ if (parsed.charAt(0) === '!') { -+ parsed = parsed.slice(1); -+ } -+ -+ var isInside = node.isInside.paren || node.isInside.brace; -+ if (parsed && type !== 'slash' && type !== 'bos' && !isInside) { -+ val = star(); -+ } else { -+ val = this.options.dot !== true -+ ? '(?:(?!(?:[' + slash() + ']|^)\\.).)*?' -+ : '(?:(?!(?:[' + slash() + ']|^)(?:\\.{1,2})($|[' + slash() + ']))(?!\\.{2}).)*?'; -+ } -+ -+ if ((type === 'slash' || type === 'bos') && this.options.dot !== true) { -+ val = '(?!\\.)' + val; -+ } -+ -+ if (prev.type === 'slash' && next.type === 'slash' && before.type !== 'text') { -+ if (after.type === 'text' || after.type === 'star') { -+ node.addQmark = true; -+ } -+ } -+ -+ if (this.options.capture) { -+ val = '(' + val + ')'; -+ } -+ -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Star: "*" -+ */ -+ -+ .set('star', function(node, nodes, i) { -+ var prior = nodes[i - 2] || {}; -+ var prev = this.prev(); -+ var next = this.next(); -+ var type = prev.type; -+ -+ function isStart(n) { -+ return n.type === 'bos' || n.type === 'slash'; -+ } -+ -+ if (this.output === '' && this.options.contains !== true) { -+ this.output = '(?![' + slash() + '])'; -+ } -+ -+ if (type === 'bracket' && this.options.bash === false) { -+ var str = next && next.type === 'bracket' ? star() : '*?'; -+ if (!prev.nodes || prev.nodes[1].type !== 'posix') { -+ return this.emit(str, node); -+ } -+ } -+ -+ var prefix = !this.dotfiles && type !== 'text' && type !== 'escape' -+ ? (this.options.dot ? '(?!(?:^|[' + slash() + '])\\.{1,2}(?:$|[' + slash() + ']))' : '(?!\\.)') -+ : ''; -+ -+ if (isStart(prev) || (isStart(prior) && type === 'not')) { -+ if (prefix !== '(?!\\.)') { -+ prefix += '(?!(\\.{2}|\\.[' + slash() + ']))(?=.)'; -+ } else { -+ prefix += '(?=.)'; -+ } -+ } else if (prefix === '(?!\\.)') { -+ prefix = ''; -+ } -+ -+ if (prev.type === 'not' && prior.type === 'bos' && this.options.dot === true) { -+ this.output = '(?!\\.)' + this.output; -+ } -+ -+ var output = prefix + star(); -+ if (this.options.capture) { -+ output = '(' + output + ')'; -+ } -+ -+ return this.emit(output, node); -+ }) -+ -+ /** -+ * Text -+ */ -+ -+ .set('text', function(node) { -+ return this.emit(node.val, node); -+ }) -+ -+ /** -+ * End-of-string -+ */ -+ -+ .set('eos', function(node) { -+ var prev = this.prev(); -+ var val = node.val; -+ -+ this.output = '(?:\\.[' + slash() + '](?=.))?' + this.output; -+ if (this.state.metachar && prev.type !== 'qmark' && prev.type !== 'slash') { -+ val += (this.options.contains ? '[' + slash() + ']?' : '(?:[' + slash() + ']|$)'); -+ } -+ -+ return this.emit(val, node); -+ }); -+ -+ /** -+ * Allow custom compilers to be passed on options -+ */ -+ -+ if (options && typeof options.compilers === 'function') { -+ options.compilers(nanomatch.compiler); -+ } -+}; -+ -+ -+}, -+"6EFNCSsJ2lafI2G2ve/J1baBfqvghATNeB1ZA+C/vs8=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function(stream) { -+ return new StreamSource(stream); -+}; -+ -+function StreamSource(stream) { -+ var that = this; -+ that._readable = promise(that); -+ that._stream = stream.on("readable", read).on("end", end).on("close", end).on("error", error); -+ -+ function read() { -+ var resolve = that._resolve; -+ that._readable = promise(that); -+ resolve(false); -+ } -+ -+ function end() { -+ var resolve = that._resolve; -+ that._readable = Promise.resolve(true); -+ that._resolve = that._reject = noop; -+ resolve(true); -+ } -+ -+ function error(error) { -+ var reject = that._reject; -+ that._readable = Promise.reject(error); -+ that._resolve = that._reject = noop; -+ reject(error); -+ } -+} -+ -+StreamSource.prototype.read = require("./read"); -+StreamSource.prototype.slice = require("./slice"); -+StreamSource.prototype.cancel = require("./cancel"); -+ -+function noop() {} -+ -+function promise(source) { -+ return new Promise(function(resolve, reject) { -+ source._resolve = resolve; -+ source._reject = reject; -+ }); -+} -+ -+}, -+"6G4+YXaRghTGQQnkm/qpK+b2DBUKrknXrtL2J8J7FU0=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function(exec){ -+ try { -+ return !!exec(); -+ } catch(e){ -+ return true; -+ } -+}; -+}, -+"6H8g21XbayVeFrOMPa/8A1gAFXQbyGlXGbcE2R6PZ2I=": -+function (require, module, exports, __dirname, __filename) { -+var types = require('./types'), -+ dbf = require('dbf'), -+ prj = require('./prj'), -+ ext = require('./extent'), -+ getFields = require('./fields'), -+ assert = require('assert'), -+ pointWriter = require('./points'), -+ polyWriter = require('./poly'); -+ -+var writers = { -+ 1: pointWriter, -+ 5: polyWriter, -+ 3: polyWriter -+}; -+ -+var recordHeaderLength = 8; -+ -+module.exports = write; -+ -+// Low-level writing interface -+function write(rows, geometry_type, geometries, callback) { -+ -+ var TYPE = types.geometries[geometry_type], -+ writer = writers[TYPE], -+ parts = writer.parts(geometries, TYPE), -+ shpLength = 100 + (parts - geometries.length) * 4 + writer.shpLength(geometries), -+ shxLength = 100 + writer.shxLength(geometries), -+ shpBuffer = new ArrayBuffer(shpLength), -+ shpView = new DataView(shpBuffer), -+ shxBuffer = new ArrayBuffer(shxLength), -+ shxView = new DataView(shxBuffer), -+ extent = writer.extent(geometries); -+ -+ writeHeader(shpView, TYPE); -+ writeHeader(shxView, TYPE); -+ writeExtent(extent, shpView); -+ writeExtent(extent, shxView); -+ -+ writer.write(geometries, extent, -+ new DataView(shpBuffer, 100), -+ new DataView(shxBuffer, 100), -+ TYPE); -+ -+ shpView.setInt32(24, shpLength / 2); -+ shxView.setInt32(24, (50 + geometries.length * 4)); -+ -+ var dbfBuf = dbf.structure(rows); -+ -+ callback(null, { -+ shp: shpView, -+ shx: shxView, -+ dbf: dbfBuf, -+ prj: prj -+ }); -+} -+ -+function writeHeader(view, TYPE) { -+ view.setInt32(0, 9994); -+ view.setInt32(28, 1000, true); -+ view.setInt32(32, TYPE, true); -+} -+ -+function writeExtent(extent, view) { -+ view.setFloat64(36, extent.xmin, true); -+ view.setFloat64(44, extent.ymin, true); -+ view.setFloat64(52, extent.xmax, true); -+ view.setFloat64(60, extent.ymax, true); -+} -+ -+}, -+"6MSqJed9MCw4Repw1euoEf9i4Tyc0VbpjzL9N/9Nfck=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// MODULES // -+ -+var isArray = require( 'validate.io-array' ); -+var isBuffer = require( 'validate.io-buffer' ); -+var typeName = require( 'type-name' ); -+var regex = require( 'utils-regex-from-string' ); -+var copyError = require( 'utils-copy-error' ); -+var indexOf = require( 'utils-indexof' ); -+var objectKeys = require( 'object-keys' ); -+var typedArrays = require( './typedarrays.js' ); -+ -+ -+// FUNCTIONS // -+ -+/** -+* FUNCTION: cloneInstance( val ) -+* Clones a class instance. -+* -+* WARNING: this should only be used for simple cases. Any instances with privileged access to variables (e.g., within closures) cannot be cloned. This approach should be considered fragile. -+* -+* NOTE: the function is greedy, disregarding the notion of a 'level'. Instead, the function deep copies all properties, as we assume the concept of 'level' applies only to the class instance reference but not to its internal state. This prevents, in theory, two instances from sharing state. -+* -+* @private -+* @param {Object} val - class instance -+* @returns {Object} new instance -+*/ -+function cloneInstance( val ) { -+ var cache = []; -+ var refs = []; -+ var names; -+ var name; -+ var desc; -+ var tmp; -+ var ref; -+ var i; -+ -+ ref = Object.create( Object.getPrototypeOf( val ) ); -+ cache.push( val ); -+ refs.push( ref ); -+ -+ names = Object.getOwnPropertyNames( val ); -+ for ( i = 0; i < names.length; i++ ) { -+ name = names[ i ]; -+ desc = Object.getOwnPropertyDescriptor( val, name ); -+ if ( desc.hasOwnProperty( 'value' ) ) { -+ tmp = ( isArray( val[name] ) ) ? [] : {}; -+ desc.value = deepCopy( val[name], tmp, cache, refs, -1 ); -+ } -+ Object.defineProperty( ref, name, desc ); -+ } -+ if ( !Object.isExtensible( val ) ) { -+ Object.preventExtensions( ref ); -+ } -+ if ( Object.isSealed( val ) ) { -+ Object.seal( ref ); -+ } -+ if ( Object.isFrozen( val ) ) { -+ Object.freeze( ref ); -+ } -+ return ref; -+} // end FUNCTION cloneInstance() -+ -+ -+// DEEP COPY // -+ -+/** -+* FUNCTION: deepCopy( val, copy, cache, refs, level ) -+* Recursively performs a deep copy of an input object. -+* -+* @private -+* @param {Array|Object} val - value to copy -+* @param {Array|Object} copy - copy -+* @param {Array} cache - an array of visited objects -+* @param {Array} refs - an array of object references -+* @param {Number} level - copy depth -+* @returns {*} deep copy -+*/ -+function deepCopy( val, copy, cache, refs, level ) { -+ var parent; -+ var keys; -+ var name; -+ var desc; -+ var ctor; -+ var key; -+ var ref; -+ var x; -+ var i; -+ var j; -+ -+ level = level - 1; -+ -+ // Primitives and functions... -+ if ( -+ typeof val !== 'object' || -+ val === null -+ ) { -+ return val; -+ } -+ if ( isBuffer( val ) ) { -+ return new Buffer( val ); -+ } -+ if ( val instanceof Error ) { -+ return copyError( val ); -+ } -+ // Objects... -+ name = typeName( val ); -+ -+ if ( name === 'Date' ) { -+ return new Date( +val ); -+ } -+ if ( name === 'RegExp' ) { -+ return regex( val.toString() ); -+ } -+ if ( name === 'Set' ) { -+ return new Set( val ); -+ } -+ if ( name === 'Map' ) { -+ return new Map( val ); -+ } -+ if ( -+ name === 'String' || -+ name === 'Boolean' || -+ name === 'Number' -+ ) { -+ // Return an equivalent primitive! -+ return val.valueOf(); -+ } -+ ctor = typedArrays[ name ]; -+ if ( ctor ) { -+ return ctor( val ); -+ } -+ // Class instances... -+ if ( -+ name !== 'Array' && -+ name !== 'Object' -+ ) { -+ // Cloning requires ES5 or higher... -+ if ( typeof Object.freeze === 'function' ) { -+ return cloneInstance( val ); -+ } -+ return {}; -+ } -+ // Arrays and plain objects... -+ keys = objectKeys( val ); -+ if ( level > 0 ) { -+ parent = name; -+ for ( j = 0; j < keys.length; j++ ) { -+ key = keys[ j ]; -+ x = val[ key ]; -+ -+ // Primitive, Buffer, special class instance... -+ name = typeName( x ); -+ if ( -+ typeof x !== 'object' || -+ x === null || -+ ( -+ name !== 'Array' && -+ name !== 'Object' -+ ) || -+ isBuffer( x ) -+ ) { -+ if ( parent === 'Object' ) { -+ desc = Object.getOwnPropertyDescriptor( val, key ); -+ if ( desc.hasOwnProperty( 'value' ) ) { -+ desc.value = deepCopy( x ); -+ } -+ Object.defineProperty( copy, key, desc ); -+ } else { -+ copy[ key ] = deepCopy( x ); -+ } -+ continue; -+ } -+ // Circular reference... -+ i = indexOf( cache, x ); -+ if ( i !== -1 ) { -+ copy[ key ] = refs[ i ]; -+ continue; -+ } -+ // Plain array or object... -+ ref = ( isArray(x) ) ? [] : {}; -+ cache.push( x ); -+ refs.push( ref ); -+ if ( parent === 'Array' ) { -+ copy[ key ] = deepCopy( x, ref, cache, refs, level ); -+ } else { -+ desc = Object.getOwnPropertyDescriptor( val, key ); -+ if ( desc.hasOwnProperty( 'value' ) ) { -+ desc.value = deepCopy( x, ref, cache, refs, level ); -+ } -+ Object.defineProperty( copy, key, desc ); -+ } -+ } -+ } else { -+ if ( name === 'Array' ) { -+ for ( j = 0; j < keys.length; j++ ) { -+ key = keys[ j ]; -+ copy[ key ] = val[ key ]; -+ } -+ } else { -+ for ( j = 0; j < keys.length; j++ ) { -+ key = keys[ j ]; -+ desc = Object.getOwnPropertyDescriptor( val, key ); -+ Object.defineProperty( copy, key, desc ); -+ } -+ } -+ } -+ if ( !Object.isExtensible( val ) ) { -+ Object.preventExtensions( copy ); -+ } -+ if ( Object.isSealed( val ) ) { -+ Object.seal( copy ); -+ } -+ if ( Object.isFrozen( val ) ) { -+ Object.freeze( copy ); -+ } -+ return copy; -+} // end FUNCTION deepCopy() -+ -+ -+// EXPORTS // -+ -+module.exports = deepCopy; -+ -+}, -+"6NRbw8g9XPr8ZXkNq9wv1MLtc1jh5E8r+VniRcESXEg=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var Node = require('snapdragon-node'); -+var utils = require('./utils'); -+ -+/** -+ * Braces parsers -+ */ -+ -+module.exports = function(braces, options) { -+ braces.parser -+ .set('bos', function() { -+ if (!this.parsed) { -+ this.ast = this.nodes[0] = new Node(this.ast); -+ } -+ }) -+ -+ /** -+ * Character parsers -+ */ -+ -+ .set('escape', function() { -+ var pos = this.position(); -+ var m = this.match(/^(?:\\(.)|\$\{)/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ -+ var node = pos(new Node({ -+ type: 'text', -+ multiplier: 1, -+ val: m[0] -+ })); -+ -+ if (node.val === '\\\\') { -+ return node; -+ } -+ -+ if (node.val === '${') { -+ var str = this.input; -+ var idx = -1; -+ var ch; -+ -+ while ((ch = str[++idx])) { -+ this.consume(1); -+ node.val += ch; -+ if (ch === '\\') { -+ node.val += str[++idx]; -+ continue; -+ } -+ if (ch === '}') { -+ break; -+ } -+ } -+ } -+ -+ if (this.options.unescape !== false) { -+ node.val = node.val.replace(/\\([{}])/g, '$1'); -+ } -+ -+ if (last.val === '"' && this.input.charAt(0) === '"') { -+ last.val = node.val; -+ this.consume(1); -+ return; -+ } -+ -+ return concatNodes.call(this, pos, node, prev, options); -+ }) -+ -+ /** -+ * Brackets: "[...]" (basic, this is overridden by -+ * other parsers in more advanced implementations) -+ */ -+ -+ .set('bracket', function() { -+ var isInside = this.isInside('brace'); -+ var pos = this.position(); -+ var m = this.match(/^(?:\[([!^]?)([^\]]{2,}|\]-)(\]|[^*+?]+)|\[)/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var val = m[0]; -+ var negated = m[1] ? '^' : ''; -+ var inner = m[2] || ''; -+ var close = m[3] || ''; -+ -+ if (isInside && prev.type === 'brace') { -+ prev.text = prev.text || ''; -+ prev.text += val; -+ } -+ -+ var esc = this.input.slice(0, 2); -+ if (inner === '' && esc === '\\]') { -+ inner += esc; -+ this.consume(2); -+ -+ var str = this.input; -+ var idx = -1; -+ var ch; -+ -+ while ((ch = str[++idx])) { -+ this.consume(1); -+ if (ch === ']') { -+ close = ch; -+ break; -+ } -+ inner += ch; -+ } -+ } -+ -+ return pos(new Node({ -+ type: 'bracket', -+ val: val, -+ escaped: close !== ']', -+ negated: negated, -+ inner: inner, -+ close: close -+ })); -+ }) -+ -+ /** -+ * Empty braces (we capture these early to -+ * speed up processing in the compiler) -+ */ -+ -+ .set('multiplier', function() { -+ var isInside = this.isInside('brace'); -+ var pos = this.position(); -+ var m = this.match(/^\{((?:,|\{,+\})+)\}/); -+ if (!m) return; -+ -+ this.multiplier = true; -+ var prev = this.prev(); -+ var val = m[0]; -+ -+ if (isInside && prev.type === 'brace') { -+ prev.text = prev.text || ''; -+ prev.text += val; -+ } -+ -+ var node = pos(new Node({ -+ type: 'text', -+ multiplier: 1, -+ match: m, -+ val: val -+ })); -+ -+ return concatNodes.call(this, pos, node, prev, options); -+ }) -+ -+ /** -+ * Open -+ */ -+ -+ .set('brace.open', function() { -+ var pos = this.position(); -+ var m = this.match(/^\{(?!(?:[^\\}]?|,+)\})/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ -+ // if the last parsed character was an extglob character -+ // we need to _not optimize_ the brace pattern because -+ // it might be mistaken for an extglob by a downstream parser -+ if (last && last.val && isExtglobChar(last.val.slice(-1))) { -+ last.optimize = false; -+ } -+ -+ var open = pos(new Node({ -+ type: 'brace.open', -+ val: m[0] -+ })); -+ -+ var node = pos(new Node({ -+ type: 'brace', -+ nodes: [] -+ })); -+ -+ node.push(open); -+ prev.push(node); -+ this.push('brace', node); -+ }) -+ -+ /** -+ * Close -+ */ -+ -+ .set('brace.close', function() { -+ var pos = this.position(); -+ var m = this.match(/^\}/); -+ if (!m || !m[0]) return; -+ -+ var brace = this.pop('brace'); -+ var node = pos(new Node({ -+ type: 'brace.close', -+ val: m[0] -+ })); -+ -+ if (!this.isType(brace, 'brace')) { -+ if (this.options.strict) { -+ throw new Error('missing opening "{"'); -+ } -+ node.type = 'text'; -+ node.multiplier = 0; -+ node.escaped = true; -+ return node; -+ } -+ -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ if (last.text) { -+ var lastNode = utils.last(last.nodes); -+ if (lastNode.val === ')' && /[!@*?+]\(/.test(last.text)) { -+ var open = last.nodes[0]; -+ var text = last.nodes[1]; -+ if (open.type === 'brace.open' && text && text.type === 'text') { -+ text.optimize = false; -+ } -+ } -+ } -+ -+ if (brace.nodes.length > 2) { -+ var first = brace.nodes[1]; -+ if (first.type === 'text' && first.val === ',') { -+ brace.nodes.splice(1, 1); -+ brace.nodes.push(first); -+ } -+ } -+ -+ brace.push(node); -+ }) -+ -+ /** -+ * Capture boundary characters -+ */ -+ -+ .set('boundary', function() { -+ var pos = this.position(); -+ var m = this.match(/^[$^](?!\{)/); -+ if (!m) return; -+ return pos(new Node({ -+ type: 'text', -+ val: m[0] -+ })); -+ }) -+ -+ /** -+ * One or zero, non-comma characters wrapped in braces -+ */ -+ -+ .set('nobrace', function() { -+ var isInside = this.isInside('brace'); -+ var pos = this.position(); -+ var m = this.match(/^\{[^,]?\}/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var val = m[0]; -+ -+ if (isInside && prev.type === 'brace') { -+ prev.text = prev.text || ''; -+ prev.text += val; -+ } -+ -+ return pos(new Node({ -+ type: 'text', -+ multiplier: 0, -+ val: val -+ })); -+ }) -+ -+ /** -+ * Text -+ */ -+ -+ .set('text', function() { -+ var isInside = this.isInside('brace'); -+ var pos = this.position(); -+ var m = this.match(/^((?!\\)[^${}[\]])+/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var val = m[0]; -+ -+ if (isInside && prev.type === 'brace') { -+ prev.text = prev.text || ''; -+ prev.text += val; -+ } -+ -+ var node = pos(new Node({ -+ type: 'text', -+ multiplier: 1, -+ val: val -+ })); -+ -+ return concatNodes.call(this, pos, node, prev, options); -+ }); -+}; -+ -+/** -+ * Returns true if the character is an extglob character. -+ */ -+ -+function isExtglobChar(ch) { -+ return ch === '!' || ch === '@' || ch === '*' || ch === '?' || ch === '+'; -+} -+ -+/** -+ * Combine text nodes, and calculate empty sets (`{,,}`) -+ * @param {Function} `pos` Function to calculate node position -+ * @param {Object} `node` AST node -+ * @return {Object} -+ */ -+ -+function concatNodes(pos, node, parent, options) { -+ node.orig = node.val; -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ var isEscaped = false; -+ -+ if (node.val.length > 1) { -+ var a = node.val.charAt(0); -+ var b = node.val.slice(-1); -+ -+ isEscaped = (a === '"' && b === '"') -+ || (a === "'" && b === "'") -+ || (a === '`' && b === '`'); -+ } -+ -+ if (isEscaped && options.unescape !== false) { -+ node.val = node.val.slice(1, node.val.length - 1); -+ node.escaped = true; -+ } -+ -+ if (node.match) { -+ var match = node.match[1]; -+ if (!match || match.indexOf('}') === -1) { -+ match = node.match[0]; -+ } -+ -+ // replace each set with a single "," -+ var val = match.replace(/\{/g, ',').replace(/\}/g, ''); -+ node.multiplier *= val.length; -+ node.val = ''; -+ } -+ -+ var simpleText = last.type === 'text' -+ && last.multiplier === 1 -+ && node.multiplier === 1 -+ && node.val; -+ -+ if (simpleText) { -+ last.val += node.val; -+ return; -+ } -+ -+ prev.push(node); -+} -+ -+}, -+"6X3DcowbpxQU+Ey0TLTE7O/fD90cMkKl9EfgjtIMym8=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+// A bit simpler than readable streams. -+// Implement an async ._write(chunk, encoding, cb), and it'll handle all -+// the drain event emission and buffering. -+'use strict'; -+ -+module.exports = Writable; -+/* */ -+ -+function WriteReq(chunk, encoding, cb) { -+ this.chunk = chunk; -+ this.encoding = encoding; -+ this.callback = cb; -+ this.next = null; -+} // It seems a linked list but it is not -+// there will be only 2 of these for each stream -+ -+ -+function CorkedRequest(state) { -+ var _this = this; -+ -+ this.next = null; -+ this.entry = null; -+ -+ this.finish = function () { -+ onCorkedFinish(_this, state); -+ }; -+} -+/* */ -+ -+/**/ -+ -+ -+var Duplex; -+/**/ -+ -+Writable.WritableState = WritableState; -+/**/ -+ -+var internalUtil = { -+ deprecate: require('util-deprecate') -+}; -+/**/ -+ -+/**/ -+ -+var Stream = require('./internal/streams/stream'); -+/**/ -+ -+ -+var Buffer = require('buffer').Buffer; -+ -+var OurUint8Array = global.Uint8Array || function () {}; -+ -+function _uint8ArrayToBuffer(chunk) { -+ return Buffer.from(chunk); -+} -+ -+function _isUint8Array(obj) { -+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -+} -+ -+var destroyImpl = require('./internal/streams/destroy'); -+ -+var _require = require('./internal/streams/state'), -+ getHighWaterMark = _require.getHighWaterMark; -+ -+var _require$codes = require('../errors').codes, -+ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, -+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, -+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, -+ ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, -+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, -+ ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, -+ ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, -+ ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; -+ -+var errorOrDestroy = destroyImpl.errorOrDestroy; -+ -+require('inherits')(Writable, Stream); -+ -+function nop() {} -+ -+function WritableState(options, stream, isDuplex) { -+ Duplex = Duplex || require('./_stream_duplex'); -+ options = options || {}; // Duplex streams are both readable and writable, but share -+ // the same options object. -+ // However, some cases require setting options to different -+ // values for the readable and the writable sides of the duplex stream, -+ // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. -+ -+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream -+ // contains buffers or objects. -+ -+ this.objectMode = !!options.objectMode; -+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false -+ // Note: 0 is a valid value, means that we always return false if -+ // the entire buffer is not flushed immediately on write() -+ -+ this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called -+ -+ this.finalCalled = false; // drain event flag. -+ -+ this.needDrain = false; // at the start of calling end() -+ -+ this.ending = false; // when end() has been called, and returned -+ -+ this.ended = false; // when 'finish' is emitted -+ -+ this.finished = false; // has it been destroyed -+ -+ this.destroyed = false; // should we decode strings into buffers before passing to _write? -+ // this is here so that some node-core streams can optimize string -+ // handling at a lower level. -+ -+ var noDecode = options.decodeStrings === false; -+ this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string -+ // encoding is 'binary' so we have to make this configurable. -+ // Everything else in the universe uses 'utf8', though. -+ -+ this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement -+ // of how much we're waiting to get pushed to some underlying -+ // socket or file. -+ -+ this.length = 0; // a flag to see when we're in the middle of a write. -+ -+ this.writing = false; // when true all writes will be buffered until .uncork() call -+ -+ this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, -+ // or on a later tick. We set this to true at first, because any -+ // actions that shouldn't happen until "later" should generally also -+ // not happen before the first write call. -+ -+ this.sync = true; // a flag to know if we're processing previously buffered items, which -+ // may call the _write() callback in the same tick, so that we don't -+ // end up in an overlapped onwrite situation. -+ -+ this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) -+ -+ this.onwrite = function (er) { -+ onwrite(stream, er); -+ }; // the callback that the user supplies to write(chunk,encoding,cb) -+ -+ -+ this.writecb = null; // the amount that is being written when _write is called. -+ -+ this.writelen = 0; -+ this.bufferedRequest = null; -+ this.lastBufferedRequest = null; // number of pending user-supplied write callbacks -+ // this must be 0 before 'finish' can be emitted -+ -+ this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs -+ // This is relevant for synchronous Transform streams -+ -+ this.prefinished = false; // True if the error was already emitted and should not be thrown again -+ -+ this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. -+ -+ this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') -+ -+ this.autoDestroy = !!options.autoDestroy; // count buffered requests -+ -+ this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always -+ // one allocated and free to use, and we maintain at most two -+ -+ this.corkedRequestsFree = new CorkedRequest(this); -+} -+ -+WritableState.prototype.getBuffer = function getBuffer() { -+ var current = this.bufferedRequest; -+ var out = []; -+ -+ while (current) { -+ out.push(current); -+ current = current.next; -+ } -+ -+ return out; -+}; -+ -+(function () { -+ try { -+ Object.defineProperty(WritableState.prototype, 'buffer', { -+ get: internalUtil.deprecate(function writableStateBufferGetter() { -+ return this.getBuffer(); -+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') -+ }); -+ } catch (_) {} -+})(); // Test _writableState for inheritance to account for Duplex streams, -+// whose prototype chain only points to Readable. -+ -+ -+var realHasInstance; -+ -+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { -+ realHasInstance = Function.prototype[Symbol.hasInstance]; -+ Object.defineProperty(Writable, Symbol.hasInstance, { -+ value: function value(object) { -+ if (realHasInstance.call(this, object)) return true; -+ if (this !== Writable) return false; -+ return object && object._writableState instanceof WritableState; -+ } -+ }); -+} else { -+ realHasInstance = function realHasInstance(object) { -+ return object instanceof this; -+ }; -+} -+ -+function Writable(options) { -+ Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. -+ // `realHasInstance` is necessary because using plain `instanceof` -+ // would return false, as no `_writableState` property is attached. -+ // Trying to use the custom `instanceof` for Writable here will also break the -+ // Node.js LazyTransform implementation, which has a non-trivial getter for -+ // `_writableState` that would lead to infinite recursion. -+ // Checking for a Stream.Duplex instance is faster here instead of inside -+ // the WritableState constructor, at least with V8 6.5 -+ -+ var isDuplex = this instanceof Duplex; -+ if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); -+ this._writableState = new WritableState(options, this, isDuplex); // legacy. -+ -+ this.writable = true; -+ -+ if (options) { -+ if (typeof options.write === 'function') this._write = options.write; -+ if (typeof options.writev === 'function') this._writev = options.writev; -+ if (typeof options.destroy === 'function') this._destroy = options.destroy; -+ if (typeof options.final === 'function') this._final = options.final; -+ } -+ -+ Stream.call(this); -+} // Otherwise people can pipe Writable streams, which is just wrong. -+ -+ -+Writable.prototype.pipe = function () { -+ errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); -+}; -+ -+function writeAfterEnd(stream, cb) { -+ var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb -+ -+ errorOrDestroy(stream, er); -+ process.nextTick(cb, er); -+} // Checks that a user-supplied chunk is valid, especially for the particular -+// mode the stream is in. Currently this means that `null` is never accepted -+// and undefined/non-string values are only allowed in object mode. -+ -+ -+function validChunk(stream, state, chunk, cb) { -+ var er; -+ -+ if (chunk === null) { -+ er = new ERR_STREAM_NULL_VALUES(); -+ } else if (typeof chunk !== 'string' && !state.objectMode) { -+ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); -+ } -+ -+ if (er) { -+ errorOrDestroy(stream, er); -+ process.nextTick(cb, er); -+ return false; -+ } -+ -+ return true; -+} -+ -+Writable.prototype.write = function (chunk, encoding, cb) { -+ var state = this._writableState; -+ var ret = false; -+ -+ var isBuf = !state.objectMode && _isUint8Array(chunk); -+ -+ if (isBuf && !Buffer.isBuffer(chunk)) { -+ chunk = _uint8ArrayToBuffer(chunk); -+ } -+ -+ if (typeof encoding === 'function') { -+ cb = encoding; -+ encoding = null; -+ } -+ -+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; -+ if (typeof cb !== 'function') cb = nop; -+ if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { -+ state.pendingcb++; -+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); -+ } -+ return ret; -+}; -+ -+Writable.prototype.cork = function () { -+ this._writableState.corked++; -+}; -+ -+Writable.prototype.uncork = function () { -+ var state = this._writableState; -+ -+ if (state.corked) { -+ state.corked--; -+ if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); -+ } -+}; -+ -+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { -+ // node::ParseEncoding() requires lower case. -+ if (typeof encoding === 'string') encoding = encoding.toLowerCase(); -+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); -+ this._writableState.defaultEncoding = encoding; -+ return this; -+}; -+ -+Object.defineProperty(Writable.prototype, 'writableBuffer', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function get() { -+ return this._writableState && this._writableState.getBuffer(); -+ } -+}); -+ -+function decodeChunk(state, chunk, encoding) { -+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { -+ chunk = Buffer.from(chunk, encoding); -+ } -+ -+ return chunk; -+} -+ -+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function get() { -+ return this._writableState.highWaterMark; -+ } -+}); // if we're already writing something, then just put this -+// in the queue, and wait our turn. Otherwise, call _write -+// If we return false, then we need a drain event, so set that flag. -+ -+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { -+ if (!isBuf) { -+ var newChunk = decodeChunk(state, chunk, encoding); -+ -+ if (chunk !== newChunk) { -+ isBuf = true; -+ encoding = 'buffer'; -+ chunk = newChunk; -+ } -+ } -+ -+ var len = state.objectMode ? 1 : chunk.length; -+ state.length += len; -+ var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. -+ -+ if (!ret) state.needDrain = true; -+ -+ if (state.writing || state.corked) { -+ var last = state.lastBufferedRequest; -+ state.lastBufferedRequest = { -+ chunk: chunk, -+ encoding: encoding, -+ isBuf: isBuf, -+ callback: cb, -+ next: null -+ }; -+ -+ if (last) { -+ last.next = state.lastBufferedRequest; -+ } else { -+ state.bufferedRequest = state.lastBufferedRequest; -+ } -+ -+ state.bufferedRequestCount += 1; -+ } else { -+ doWrite(stream, state, false, len, chunk, encoding, cb); -+ } -+ -+ return ret; -+} -+ -+function doWrite(stream, state, writev, len, chunk, encoding, cb) { -+ state.writelen = len; -+ state.writecb = cb; -+ state.writing = true; -+ state.sync = true; -+ if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); -+ state.sync = false; -+} -+ -+function onwriteError(stream, state, sync, er, cb) { -+ --state.pendingcb; -+ -+ if (sync) { -+ // defer the callback if we are being called synchronously -+ // to avoid piling up things on the stack -+ process.nextTick(cb, er); // this can emit finish, and it will always happen -+ // after error -+ -+ process.nextTick(finishMaybe, stream, state); -+ stream._writableState.errorEmitted = true; -+ errorOrDestroy(stream, er); -+ } else { -+ // the caller expect this to happen before if -+ // it is async -+ cb(er); -+ stream._writableState.errorEmitted = true; -+ errorOrDestroy(stream, er); // this can emit finish, but finish must -+ // always follow error -+ -+ finishMaybe(stream, state); -+ } -+} -+ -+function onwriteStateUpdate(state) { -+ state.writing = false; -+ state.writecb = null; -+ state.length -= state.writelen; -+ state.writelen = 0; -+} -+ -+function onwrite(stream, er) { -+ var state = stream._writableState; -+ var sync = state.sync; -+ var cb = state.writecb; -+ if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); -+ onwriteStateUpdate(state); -+ if (er) onwriteError(stream, state, sync, er, cb);else { -+ // Check if we're actually ready to finish, but don't emit yet -+ var finished = needFinish(state) || stream.destroyed; -+ -+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { -+ clearBuffer(stream, state); -+ } -+ -+ if (sync) { -+ process.nextTick(afterWrite, stream, state, finished, cb); -+ } else { -+ afterWrite(stream, state, finished, cb); -+ } -+ } -+} -+ -+function afterWrite(stream, state, finished, cb) { -+ if (!finished) onwriteDrain(stream, state); -+ state.pendingcb--; -+ cb(); -+ finishMaybe(stream, state); -+} // Must force callback to be called on nextTick, so that we don't -+// emit 'drain' before the write() consumer gets the 'false' return -+// value, and has a chance to attach a 'drain' listener. -+ -+ -+function onwriteDrain(stream, state) { -+ if (state.length === 0 && state.needDrain) { -+ state.needDrain = false; -+ stream.emit('drain'); -+ } -+} // if there's something in the buffer waiting, then process it -+ -+ -+function clearBuffer(stream, state) { -+ state.bufferProcessing = true; -+ var entry = state.bufferedRequest; -+ -+ if (stream._writev && entry && entry.next) { -+ // Fast case, write everything using _writev() -+ var l = state.bufferedRequestCount; -+ var buffer = new Array(l); -+ var holder = state.corkedRequestsFree; -+ holder.entry = entry; -+ var count = 0; -+ var allBuffers = true; -+ -+ while (entry) { -+ buffer[count] = entry; -+ if (!entry.isBuf) allBuffers = false; -+ entry = entry.next; -+ count += 1; -+ } -+ -+ buffer.allBuffers = allBuffers; -+ doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time -+ // as the hot path ends with doWrite -+ -+ state.pendingcb++; -+ state.lastBufferedRequest = null; -+ -+ if (holder.next) { -+ state.corkedRequestsFree = holder.next; -+ holder.next = null; -+ } else { -+ state.corkedRequestsFree = new CorkedRequest(state); -+ } -+ -+ state.bufferedRequestCount = 0; -+ } else { -+ // Slow case, write chunks one-by-one -+ while (entry) { -+ var chunk = entry.chunk; -+ var encoding = entry.encoding; -+ var cb = entry.callback; -+ var len = state.objectMode ? 1 : chunk.length; -+ doWrite(stream, state, false, len, chunk, encoding, cb); -+ entry = entry.next; -+ state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then -+ // it means that we need to wait until it does. -+ // also, that means that the chunk and cb are currently -+ // being processed, so move the buffer counter past them. -+ -+ if (state.writing) { -+ break; -+ } -+ } -+ -+ if (entry === null) state.lastBufferedRequest = null; -+ } -+ -+ state.bufferedRequest = entry; -+ state.bufferProcessing = false; -+} -+ -+Writable.prototype._write = function (chunk, encoding, cb) { -+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); -+}; -+ -+Writable.prototype._writev = null; -+ -+Writable.prototype.end = function (chunk, encoding, cb) { -+ var state = this._writableState; -+ -+ if (typeof chunk === 'function') { -+ cb = chunk; -+ chunk = null; -+ encoding = null; -+ } else if (typeof encoding === 'function') { -+ cb = encoding; -+ encoding = null; -+ } -+ -+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks -+ -+ if (state.corked) { -+ state.corked = 1; -+ this.uncork(); -+ } // ignore unnecessary end() calls. -+ -+ -+ if (!state.ending) endWritable(this, state, cb); -+ return this; -+}; -+ -+Object.defineProperty(Writable.prototype, 'writableLength', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function get() { -+ return this._writableState.length; -+ } -+}); -+ -+function needFinish(state) { -+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -+} -+ -+function callFinal(stream, state) { -+ stream._final(function (err) { -+ state.pendingcb--; -+ -+ if (err) { -+ errorOrDestroy(stream, err); -+ } -+ -+ state.prefinished = true; -+ stream.emit('prefinish'); -+ finishMaybe(stream, state); -+ }); -+} -+ -+function prefinish(stream, state) { -+ if (!state.prefinished && !state.finalCalled) { -+ if (typeof stream._final === 'function' && !state.destroyed) { -+ state.pendingcb++; -+ state.finalCalled = true; -+ process.nextTick(callFinal, stream, state); -+ } else { -+ state.prefinished = true; -+ stream.emit('prefinish'); -+ } -+ } -+} -+ -+function finishMaybe(stream, state) { -+ var need = needFinish(state); -+ -+ if (need) { -+ prefinish(stream, state); -+ -+ if (state.pendingcb === 0) { -+ state.finished = true; -+ stream.emit('finish'); -+ -+ if (state.autoDestroy) { -+ // In case of duplex streams we need a way to detect -+ // if the readable side is ready for autoDestroy as well -+ var rState = stream._readableState; -+ -+ if (!rState || rState.autoDestroy && rState.endEmitted) { -+ stream.destroy(); -+ } -+ } -+ } -+ } -+ -+ return need; -+} -+ -+function endWritable(stream, state, cb) { -+ state.ending = true; -+ finishMaybe(stream, state); -+ -+ if (cb) { -+ if (state.finished) process.nextTick(cb);else stream.once('finish', cb); -+ } -+ -+ state.ended = true; -+ stream.writable = false; -+} -+ -+function onCorkedFinish(corkReq, state, err) { -+ var entry = corkReq.entry; -+ corkReq.entry = null; -+ -+ while (entry) { -+ var cb = entry.callback; -+ state.pendingcb--; -+ cb(err); -+ entry = entry.next; -+ } // reuse the free corkReq. -+ -+ -+ state.corkedRequestsFree.next = corkReq; -+} -+ -+Object.defineProperty(Writable.prototype, 'destroyed', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function get() { -+ if (this._writableState === undefined) { -+ return false; -+ } -+ -+ return this._writableState.destroyed; -+ }, -+ set: function set(value) { -+ // we ignore the value if the stream -+ // has not been initialized yet -+ if (!this._writableState) { -+ return; -+ } // backward compatibility, the user is explicitly -+ // managing destroyed -+ -+ -+ this._writableState.destroyed = value; -+ } -+}); -+Writable.prototype.destroy = destroyImpl.destroy; -+Writable.prototype._undestroy = destroyImpl.undestroy; -+ -+Writable.prototype._destroy = function (err, cb) { -+ cb(err); -+}; -+}, -+"6aXzeHgmb0QQaVVupBGmDWWL37FqqZ07KbU/1jmlqjo=": -+function (require, module, exports, __dirname, __filename) { -+exports.alphasort = alphasort -+exports.alphasorti = alphasorti -+exports.setopts = setopts -+exports.ownProp = ownProp -+exports.makeAbs = makeAbs -+exports.finish = finish -+exports.mark = mark -+exports.isIgnored = isIgnored -+exports.childrenIgnored = childrenIgnored -+ -+function ownProp (obj, field) { -+ return Object.prototype.hasOwnProperty.call(obj, field) -+} -+ -+var path = require("path") -+var minimatch = require("minimatch") -+var isAbsolute = require("path-is-absolute") -+var Minimatch = minimatch.Minimatch -+ -+function alphasorti (a, b) { -+ return a.toLowerCase().localeCompare(b.toLowerCase()) -+} -+ -+function alphasort (a, b) { -+ return a.localeCompare(b) -+} -+ -+function setupIgnores (self, options) { -+ self.ignore = options.ignore || [] -+ -+ if (!Array.isArray(self.ignore)) -+ self.ignore = [self.ignore] -+ -+ if (self.ignore.length) { -+ self.ignore = self.ignore.map(ignoreMap) -+ } -+} -+ -+// ignore patterns are always in dot:true mode. -+function ignoreMap (pattern) { -+ var gmatcher = null -+ if (pattern.slice(-3) === '/**') { -+ var gpattern = pattern.replace(/(\/\*\*)+$/, '') -+ gmatcher = new Minimatch(gpattern, { dot: true }) -+ } -+ -+ return { -+ matcher: new Minimatch(pattern, { dot: true }), -+ gmatcher: gmatcher -+ } -+} -+ -+function setopts (self, pattern, options) { -+ if (!options) -+ options = {} -+ -+ // base-matching: just use globstar for that. -+ if (options.matchBase && -1 === pattern.indexOf("/")) { -+ if (options.noglobstar) { -+ throw new Error("base matching requires globstar") -+ } -+ pattern = "**/" + pattern -+ } -+ -+ self.silent = !!options.silent -+ self.pattern = pattern -+ self.strict = options.strict !== false -+ self.realpath = !!options.realpath -+ self.realpathCache = options.realpathCache || Object.create(null) -+ self.follow = !!options.follow -+ self.dot = !!options.dot -+ self.mark = !!options.mark -+ self.nodir = !!options.nodir -+ if (self.nodir) -+ self.mark = true -+ self.sync = !!options.sync -+ self.nounique = !!options.nounique -+ self.nonull = !!options.nonull -+ self.nosort = !!options.nosort -+ self.nocase = !!options.nocase -+ self.stat = !!options.stat -+ self.noprocess = !!options.noprocess -+ self.absolute = !!options.absolute -+ -+ self.maxLength = options.maxLength || Infinity -+ self.cache = options.cache || Object.create(null) -+ self.statCache = options.statCache || Object.create(null) -+ self.symlinks = options.symlinks || Object.create(null) -+ -+ setupIgnores(self, options) -+ -+ self.changedCwd = false -+ var cwd = process.cwd() -+ if (!ownProp(options, "cwd")) -+ self.cwd = cwd -+ else { -+ self.cwd = path.resolve(options.cwd) -+ self.changedCwd = self.cwd !== cwd -+ } -+ -+ self.root = options.root || path.resolve(self.cwd, "/") -+ self.root = path.resolve(self.root) -+ if (process.platform === "win32") -+ self.root = self.root.replace(/\\/g, "/") -+ -+ // TODO: is an absolute `cwd` supposed to be resolved against `root`? -+ // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') -+ self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) -+ if (process.platform === "win32") -+ self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") -+ self.nomount = !!options.nomount -+ -+ // disable comments and negation in Minimatch. -+ // Note that they are not supported in Glob itself anyway. -+ options.nonegate = true -+ options.nocomment = true -+ -+ self.minimatch = new Minimatch(pattern, options) -+ self.options = self.minimatch.options -+} -+ -+function finish (self) { -+ var nou = self.nounique -+ var all = nou ? [] : Object.create(null) -+ -+ for (var i = 0, l = self.matches.length; i < l; i ++) { -+ var matches = self.matches[i] -+ if (!matches || Object.keys(matches).length === 0) { -+ if (self.nonull) { -+ // do like the shell, and spit out the literal glob -+ var literal = self.minimatch.globSet[i] -+ if (nou) -+ all.push(literal) -+ else -+ all[literal] = true -+ } -+ } else { -+ // had matches -+ var m = Object.keys(matches) -+ if (nou) -+ all.push.apply(all, m) -+ else -+ m.forEach(function (m) { -+ all[m] = true -+ }) -+ } -+ } -+ -+ if (!nou) -+ all = Object.keys(all) -+ -+ if (!self.nosort) -+ all = all.sort(self.nocase ? alphasorti : alphasort) -+ -+ // at *some* point we statted all of these -+ if (self.mark) { -+ for (var i = 0; i < all.length; i++) { -+ all[i] = self._mark(all[i]) -+ } -+ if (self.nodir) { -+ all = all.filter(function (e) { -+ var notDir = !(/\/$/.test(e)) -+ var c = self.cache[e] || self.cache[makeAbs(self, e)] -+ if (notDir && c) -+ notDir = c !== 'DIR' && !Array.isArray(c) -+ return notDir -+ }) -+ } -+ } -+ -+ if (self.ignore.length) -+ all = all.filter(function(m) { -+ return !isIgnored(self, m) -+ }) -+ -+ self.found = all -+} -+ -+function mark (self, p) { -+ var abs = makeAbs(self, p) -+ var c = self.cache[abs] -+ var m = p -+ if (c) { -+ var isDir = c === 'DIR' || Array.isArray(c) -+ var slash = p.slice(-1) === '/' -+ -+ if (isDir && !slash) -+ m += '/' -+ else if (!isDir && slash) -+ m = m.slice(0, -1) -+ -+ if (m !== p) { -+ var mabs = makeAbs(self, m) -+ self.statCache[mabs] = self.statCache[abs] -+ self.cache[mabs] = self.cache[abs] -+ } -+ } -+ -+ return m -+} -+ -+// lotta situps... -+function makeAbs (self, f) { -+ var abs = f -+ if (f.charAt(0) === '/') { -+ abs = path.join(self.root, f) -+ } else if (isAbsolute(f) || f === '') { -+ abs = f -+ } else if (self.changedCwd) { -+ abs = path.resolve(self.cwd, f) -+ } else { -+ abs = path.resolve(f) -+ } -+ -+ if (process.platform === 'win32') -+ abs = abs.replace(/\\/g, '/') -+ -+ return abs -+} -+ -+ -+// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -+// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -+function isIgnored (self, path) { -+ if (!self.ignore.length) -+ return false -+ -+ return self.ignore.some(function(item) { -+ return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) -+ }) -+} -+ -+function childrenIgnored (self, path) { -+ if (!self.ignore.length) -+ return false -+ -+ return self.ignore.some(function(item) { -+ return !!(item.gmatcher && item.gmatcher.match(path)) -+ }) -+} -+ -+}, -+"6cjiHPjAJPqgnQ7msmDmFm/tAsQb9frpJ44xexK9Ino=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * to-object-path -+ * -+ * Copyright (c) 2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var typeOf = require('kind-of'); -+ -+module.exports = function toPath(args) { -+ if (typeOf(args) !== 'arguments') { -+ args = arguments; -+ } -+ return filter(args).join('.'); -+}; -+ -+function filter(arr) { -+ var len = arr.length; -+ var idx = -1; -+ var res = []; -+ -+ while (++idx < len) { -+ var ele = arr[idx]; -+ if (typeOf(ele) === 'arguments' || Array.isArray(ele)) { -+ res.push.apply(res, filter(ele)); -+ } else if (typeof ele === 'string') { -+ res.push(ele); -+ } -+ } -+ return res; -+} -+ -+}, -+"6i6Txq9sCCkZXKIF7SjCw6Ea2eLFhFTcRK5dXPdger0=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var utils = require('./utils'); -+ -+/** -+ * An object to write any content to a string. -+ * @constructor -+ */ -+var StringWriter = function() { -+ this.data = []; -+}; -+StringWriter.prototype = { -+ /** -+ * Append any content to the current string. -+ * @param {Object} input the content to add. -+ */ -+ append: function(input) { -+ input = utils.transformTo("string", input); -+ this.data.push(input); -+ }, -+ /** -+ * Finalize the construction an return the result. -+ * @return {string} the generated string. -+ */ -+ finalize: function() { -+ return this.data.join(""); -+ } -+}; -+ -+module.exports = StringWriter; -+ -+}, -+"6mKNNA1g6NQevy3pcZEvRX+XuLrBLd20s4q87rRBaNA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// This is so you can have options aliasing and defaults in one place. -+ -+const defaults = require('./defaults.json'); -+const aliases = require('./aliases.json'); -+ -+module.exports = (opts) => { -+ let autoIndex = defaults.autoIndex; -+ let showDir = defaults.showDir; -+ let showDotfiles = defaults.showDotfiles; -+ let humanReadable = defaults.humanReadable; -+ let hidePermissions = defaults.hidePermissions; -+ let si = defaults.si; -+ let cache = defaults.cache; -+ let gzip = defaults.gzip; -+ let brotli = defaults.brotli; -+ let defaultExt = defaults.defaultExt; -+ let handleError = defaults.handleError; -+ const headers = {}; -+ let serverHeader = defaults.serverHeader; -+ let contentType = defaults.contentType; -+ let mimeTypes; -+ let weakEtags = defaults.weakEtags; -+ let weakCompare = defaults.weakCompare; -+ let handleOptionsMethod = defaults.handleOptionsMethod; -+ -+ function isDeclared(k) { -+ return typeof opts[k] !== 'undefined' && opts[k] !== null; -+ } -+ -+ function setHeader(str) { -+ const m = /^(.+?)\s*:\s*(.*)$/.exec(str); -+ if (!m) { -+ headers[str] = true; -+ } else { -+ headers[m[1]] = m[2]; -+ } -+ } -+ -+ -+ if (opts) { -+ aliases.autoIndex.some((k) => { -+ if (isDeclared(k)) { -+ autoIndex = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.showDir.some((k) => { -+ if (isDeclared(k)) { -+ showDir = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.showDotfiles.some((k) => { -+ if (isDeclared(k)) { -+ showDotfiles = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.humanReadable.some((k) => { -+ if (isDeclared(k)) { -+ humanReadable = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.hidePermissions.some((k) => { -+ if (isDeclared(k)) { -+ hidePermissions = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.si.some((k) => { -+ if (isDeclared(k)) { -+ si = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ if (opts.defaultExt && typeof opts.defaultExt === 'string') { -+ defaultExt = opts.defaultExt; -+ } -+ -+ if (typeof opts.cache !== 'undefined' && opts.cache !== null) { -+ if (typeof opts.cache === 'string') { -+ cache = opts.cache; -+ } else if (typeof opts.cache === 'number') { -+ cache = `max-age=${opts.cache}`; -+ } else if (typeof opts.cache === 'function') { -+ cache = opts.cache; -+ } -+ } -+ -+ if (typeof opts.gzip !== 'undefined' && opts.gzip !== null) { -+ gzip = opts.gzip; -+ } -+ -+ if (typeof opts.brotli !== 'undefined' && opts.brotli !== null) { -+ brotli = opts.brotli; -+ } -+ -+ aliases.handleError.some((k) => { -+ if (isDeclared(k)) { -+ handleError = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.cors.forEach((k) => { -+ if (isDeclared(k) && opts[k]) { -+ handleOptionsMethod = true; -+ headers['Access-Control-Allow-Origin'] = '*'; -+ headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since'; -+ } -+ }); -+ -+ aliases.headers.forEach((k) => { -+ if (isDeclared(k)) { -+ if (Array.isArray(opts[k])) { -+ opts[k].forEach(setHeader); -+ } else if (opts[k] && typeof opts[k] === 'object') { -+ Object.keys(opts[k]).forEach((key) => { -+ headers[key] = opts[k][key]; -+ }); -+ } else { -+ setHeader(opts[k]); -+ } -+ } -+ }); -+ -+ aliases.serverHeader.some((k) => { -+ if (isDeclared(k)) { -+ serverHeader = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.contentType.some((k) => { -+ if (isDeclared(k)) { -+ contentType = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.mimeType.some((k) => { -+ if (isDeclared(k)) { -+ mimeTypes = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.weakEtags.some((k) => { -+ if (isDeclared(k)) { -+ weakEtags = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.weakCompare.some((k) => { -+ if (isDeclared(k)) { -+ weakCompare = opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ -+ aliases.handleOptionsMethod.some((k) => { -+ if (isDeclared(k)) { -+ handleOptionsMethod = handleOptionsMethod || opts[k]; -+ return true; -+ } -+ return false; -+ }); -+ } -+ -+ return { -+ cache, -+ autoIndex, -+ showDir, -+ showDotfiles, -+ humanReadable, -+ hidePermissions, -+ si, -+ defaultExt, -+ baseDir: (opts && opts.baseDir) || '/', -+ gzip, -+ brotli, -+ handleError, -+ headers, -+ serverHeader, -+ contentType, -+ mimeTypes, -+ weakEtags, -+ weakCompare, -+ handleOptionsMethod, -+ }; -+}; -+ -+}, -+"6nhv7wY2oi2JNr3eSRvvsrztxhwjPKXFzedlpEM24k4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, -+ PromiseArray, -+ apiRejection, -+ tryConvertToPromise, -+ INTERNAL, -+ debug) { -+var util = require("./util"); -+var tryCatch = util.tryCatch; -+ -+function ReductionPromiseArray(promises, fn, initialValue, _each) { -+ this.constructor$(promises); -+ var context = Promise._getContext(); -+ this._fn = util.contextBind(context, fn); -+ if (initialValue !== undefined) { -+ initialValue = Promise.resolve(initialValue); -+ initialValue._attachCancellationCallback(this); -+ } -+ this._initialValue = initialValue; -+ this._currentCancellable = null; -+ if(_each === INTERNAL) { -+ this._eachValues = Array(this._length); -+ } else if (_each === 0) { -+ this._eachValues = null; -+ } else { -+ this._eachValues = undefined; -+ } -+ this._promise._captureStackTrace(); -+ this._init$(undefined, -5); -+} -+util.inherits(ReductionPromiseArray, PromiseArray); -+ -+ReductionPromiseArray.prototype._gotAccum = function(accum) { -+ if (this._eachValues !== undefined && -+ this._eachValues !== null && -+ accum !== INTERNAL) { -+ this._eachValues.push(accum); -+ } -+}; -+ -+ReductionPromiseArray.prototype._eachComplete = function(value) { -+ if (this._eachValues !== null) { -+ this._eachValues.push(value); -+ } -+ return this._eachValues; -+}; -+ -+ReductionPromiseArray.prototype._init = function() {}; -+ -+ReductionPromiseArray.prototype._resolveEmptyArray = function() { -+ this._resolve(this._eachValues !== undefined ? this._eachValues -+ : this._initialValue); -+}; -+ -+ReductionPromiseArray.prototype.shouldCopyValues = function () { -+ return false; -+}; -+ -+ReductionPromiseArray.prototype._resolve = function(value) { -+ this._promise._resolveCallback(value); -+ this._values = null; -+}; -+ -+ReductionPromiseArray.prototype._resultCancelled = function(sender) { -+ if (sender === this._initialValue) return this._cancel(); -+ if (this._isResolved()) return; -+ this._resultCancelled$(); -+ if (this._currentCancellable instanceof Promise) { -+ this._currentCancellable.cancel(); -+ } -+ if (this._initialValue instanceof Promise) { -+ this._initialValue.cancel(); -+ } -+}; -+ -+ReductionPromiseArray.prototype._iterate = function (values) { -+ this._values = values; -+ var value; -+ var i; -+ var length = values.length; -+ if (this._initialValue !== undefined) { -+ value = this._initialValue; -+ i = 0; -+ } else { -+ value = Promise.resolve(values[0]); -+ i = 1; -+ } -+ -+ this._currentCancellable = value; -+ -+ for (var j = i; j < length; ++j) { -+ var maybePromise = values[j]; -+ if (maybePromise instanceof Promise) { -+ maybePromise.suppressUnhandledRejections(); -+ } -+ } -+ -+ if (!value.isRejected()) { -+ for (; i < length; ++i) { -+ var ctx = { -+ accum: null, -+ value: values[i], -+ index: i, -+ length: length, -+ array: this -+ }; -+ -+ value = value._then(gotAccum, undefined, undefined, ctx, undefined); -+ -+ if ((i & 127) === 0) { -+ value._setNoAsyncGuarantee(); -+ } -+ } -+ } -+ -+ if (this._eachValues !== undefined) { -+ value = value -+ ._then(this._eachComplete, undefined, undefined, this, undefined); -+ } -+ value._then(completed, completed, undefined, value, this); -+}; -+ -+Promise.prototype.reduce = function (fn, initialValue) { -+ return reduce(this, fn, initialValue, null); -+}; -+ -+Promise.reduce = function (promises, fn, initialValue, _each) { -+ return reduce(promises, fn, initialValue, _each); -+}; -+ -+function completed(valueOrReason, array) { -+ if (this.isFulfilled()) { -+ array._resolve(valueOrReason); -+ } else { -+ array._reject(valueOrReason); -+ } -+} -+ -+function reduce(promises, fn, initialValue, _each) { -+ if (typeof fn !== "function") { -+ return apiRejection("expecting a function but got " + util.classString(fn)); -+ } -+ var array = new ReductionPromiseArray(promises, fn, initialValue, _each); -+ return array.promise(); -+} -+ -+function gotAccum(accum) { -+ this.accum = accum; -+ this.array._gotAccum(accum); -+ var value = tryConvertToPromise(this.value, this.array._promise); -+ if (value instanceof Promise) { -+ this.array._currentCancellable = value; -+ return value._then(gotValue, undefined, undefined, this, undefined); -+ } else { -+ return gotValue.call(this, value); -+ } -+} -+ -+function gotValue(value) { -+ var array = this.array; -+ var promise = array._promise; -+ var fn = tryCatch(array._fn); -+ promise._pushContext(); -+ var ret; -+ if (array._eachValues !== undefined) { -+ ret = fn.call(promise._boundValue(), value, this.index, this.length); -+ } else { -+ ret = fn.call(promise._boundValue(), -+ this.accum, value, this.index, this.length); -+ } -+ if (ret instanceof Promise) { -+ array._currentCancellable = ret; -+ } -+ var promiseCreated = promise._popContext(); -+ debug.checkForgottenReturns( -+ ret, -+ promiseCreated, -+ array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", -+ promise -+ ); -+ return ret; -+} -+}; -+ -+}, -+"6pBWJtMqqUvDRg/1LzGHJ8gn2vQf6ow4iWN61/28HoE=": -+function (require, module, exports, __dirname, __filename) { -+const util = require('./util'); -+const types = require('./types'); -+const sets = require('./sets'); -+const positions = require('./positions'); -+ -+ -+module.exports = (regexpStr) => { -+ var i = 0, l, c, -+ start = { type: types.ROOT, stack: []}, -+ -+ // Keep track of last clause/group and stack. -+ lastGroup = start, -+ last = start.stack, -+ groupStack = []; -+ -+ -+ var repeatErr = (i) => { -+ util.error(regexpStr, `Nothing to repeat at column ${i - 1}`); -+ }; -+ -+ // Decode a few escaped characters. -+ var str = util.strToChars(regexpStr); -+ l = str.length; -+ -+ // Iterate through each character in string. -+ while (i < l) { -+ c = str[i++]; -+ -+ switch (c) { -+ // Handle escaped characters, inclues a few sets. -+ case '\\': -+ c = str[i++]; -+ -+ switch (c) { -+ case 'b': -+ last.push(positions.wordBoundary()); -+ break; -+ -+ case 'B': -+ last.push(positions.nonWordBoundary()); -+ break; -+ -+ case 'w': -+ last.push(sets.words()); -+ break; -+ -+ case 'W': -+ last.push(sets.notWords()); -+ break; -+ -+ case 'd': -+ last.push(sets.ints()); -+ break; -+ -+ case 'D': -+ last.push(sets.notInts()); -+ break; -+ -+ case 's': -+ last.push(sets.whitespace()); -+ break; -+ -+ case 'S': -+ last.push(sets.notWhitespace()); -+ break; -+ -+ default: -+ // Check if c is integer. -+ // In which case it's a reference. -+ if (/\d/.test(c)) { -+ last.push({ type: types.REFERENCE, value: parseInt(c, 10) }); -+ -+ // Escaped character. -+ } else { -+ last.push({ type: types.CHAR, value: c.charCodeAt(0) }); -+ } -+ } -+ -+ break; -+ -+ -+ // Positionals. -+ case '^': -+ last.push(positions.begin()); -+ break; -+ -+ case '$': -+ last.push(positions.end()); -+ break; -+ -+ -+ // Handle custom sets. -+ case '[': -+ // Check if this class is 'anti' i.e. [^abc]. -+ var not; -+ if (str[i] === '^') { -+ not = true; -+ i++; -+ } else { -+ not = false; -+ } -+ -+ // Get all the characters in class. -+ var classTokens = util.tokenizeClass(str.slice(i), regexpStr); -+ -+ // Increase index by length of class. -+ i += classTokens[1]; -+ last.push({ -+ type: types.SET, -+ set: classTokens[0], -+ not, -+ }); -+ -+ break; -+ -+ -+ // Class of any character except \n. -+ case '.': -+ last.push(sets.anyChar()); -+ break; -+ -+ -+ // Push group onto stack. -+ case '(': -+ // Create group. -+ var group = { -+ type: types.GROUP, -+ stack: [], -+ remember: true, -+ }; -+ -+ c = str[i]; -+ -+ // If if this is a special kind of group. -+ if (c === '?') { -+ c = str[i + 1]; -+ i += 2; -+ -+ // Match if followed by. -+ if (c === '=') { -+ group.followedBy = true; -+ -+ // Match if not followed by. -+ } else if (c === '!') { -+ group.notFollowedBy = true; -+ -+ } else if (c !== ':') { -+ util.error(regexpStr, -+ `Invalid group, character '${c}'` + -+ ` after '?' at column ${i - 1}`); -+ } -+ -+ group.remember = false; -+ } -+ -+ // Insert subgroup into current group stack. -+ last.push(group); -+ -+ // Remember the current group for when the group closes. -+ groupStack.push(lastGroup); -+ -+ // Make this new group the current group. -+ lastGroup = group; -+ last = group.stack; -+ break; -+ -+ -+ // Pop group out of stack. -+ case ')': -+ if (groupStack.length === 0) { -+ util.error(regexpStr, `Unmatched ) at column ${i - 1}`); -+ } -+ lastGroup = groupStack.pop(); -+ -+ // Check if this group has a PIPE. -+ // To get back the correct last stack. -+ last = lastGroup.options ? -+ lastGroup.options[lastGroup.options.length - 1] : lastGroup.stack; -+ break; -+ -+ -+ // Use pipe character to give more choices. -+ case '|': -+ // Create array where options are if this is the first PIPE -+ // in this clause. -+ if (!lastGroup.options) { -+ lastGroup.options = [lastGroup.stack]; -+ delete lastGroup.stack; -+ } -+ -+ // Create a new stack and add to options for rest of clause. -+ var stack = []; -+ lastGroup.options.push(stack); -+ last = stack; -+ break; -+ -+ -+ // Repetition. -+ // For every repetition, remove last element from last stack -+ // then insert back a RANGE object. -+ // This design is chosen because there could be more than -+ // one repetition symbols in a regex i.e. `a?+{2,3}`. -+ case '{': -+ var rs = /^(\d+)(,(\d+)?)?\}/.exec(str.slice(i)), min, max; -+ if (rs !== null) { -+ if (last.length === 0) { -+ repeatErr(i); -+ } -+ min = parseInt(rs[1], 10); -+ max = rs[2] ? rs[3] ? parseInt(rs[3], 10) : Infinity : min; -+ i += rs[0].length; -+ -+ last.push({ -+ type: types.REPETITION, -+ min, -+ max, -+ value: last.pop(), -+ }); -+ } else { -+ last.push({ -+ type: types.CHAR, -+ value: 123, -+ }); -+ } -+ break; -+ -+ case '?': -+ if (last.length === 0) { -+ repeatErr(i); -+ } -+ last.push({ -+ type: types.REPETITION, -+ min: 0, -+ max: 1, -+ value: last.pop(), -+ }); -+ break; -+ -+ case '+': -+ if (last.length === 0) { -+ repeatErr(i); -+ } -+ last.push({ -+ type: types.REPETITION, -+ min: 1, -+ max: Infinity, -+ value: last.pop(), -+ }); -+ break; -+ -+ case '*': -+ if (last.length === 0) { -+ repeatErr(i); -+ } -+ last.push({ -+ type: types.REPETITION, -+ min: 0, -+ max: Infinity, -+ value: last.pop(), -+ }); -+ break; -+ -+ -+ // Default is a character that is not `\[](){}?+*^$`. -+ default: -+ last.push({ -+ type: types.CHAR, -+ value: c.charCodeAt(0), -+ }); -+ } -+ -+ } -+ -+ // Check if any groups have not been closed. -+ if (groupStack.length !== 0) { -+ util.error(regexpStr, 'Unterminated group'); -+ } -+ -+ return start; -+}; -+ -+module.exports.types = types; -+ -+}, -+"6ughD7nb+SLP27ztYWfrZ68lGfyXlaKxfOZmaai5Pig=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+/* eslint no-prototype-builtins: 0 */ -+ -+const { Readable } = require('readable-stream') -+const util = require('util') -+const cookie = require('cookie') -+const assert = require('assert') -+const warning = require('fastify-warning')() -+ -+const parseURL = require('./parseURL') -+const { EventEmitter } = require('events') -+ -+// request.connectin deprecation https://nodejs.org/api/http.html#http_request_connection -+warning.create('FastifyDeprecationLightMyRequest', 'FST_LIGHTMYREQUEST_DEP01', 'You are accessing "request.connection", use "request.socket" instead.') -+ -+/** -+ * Get hostname:port -+ * -+ * @param {URL} parsedURL -+ * @return {String} -+ */ -+function hostHeaderFromURL (parsedURL) { -+ return parsedURL.port -+ ? parsedURL.host -+ : parsedURL.hostname + (parsedURL.protocol === 'https:' ? ':443' : ':80') -+} -+ -+/** -+ * Mock socket object used to fake access to a socket for a request -+ * -+ * @constructor -+ * @param {String} remoteAddress the fake address to show consumers of the socket -+ */ -+class MockSocket extends EventEmitter { -+ constructor (remoteAddress) { -+ super() -+ this.remoteAddress = remoteAddress -+ } -+} -+ -+/** -+ * Request -+ * -+ * @constructor -+ * @param {Object} options -+ * @param {(Object|String)} options.url || options.path -+ * @param {String} [options.method='GET'] -+ * @param {String} [options.remoteAddress] -+ * @param {Object} [options.cookies] -+ * @param {Object} [options.headers] -+ * @param {Object} [options.query] -+ * @param {any} [options.payload] -+ */ -+function Request (options) { -+ Readable.call(this) -+ -+ const parsedURL = parseURL(options.url || options.path, options.query) -+ -+ this.url = parsedURL.pathname + parsedURL.search -+ -+ this.httpVersion = '1.1' -+ this.method = options.method ? options.method.toUpperCase() : 'GET' -+ -+ this.headers = {} -+ const headers = options.headers || {} -+ Object.keys(headers).forEach((field) => { -+ const value = headers[field] -+ assert(value !== undefined, 'invalid value "undefined" for header ' + field) -+ this.headers[field.toLowerCase()] = '' + value -+ }) -+ -+ this.headers['user-agent'] = this.headers['user-agent'] || 'lightMyRequest' -+ this.headers.host = this.headers.host || options.authority || hostHeaderFromURL(parsedURL) -+ -+ if (options.cookies) { -+ const { cookies } = options -+ const cookieValues = Object.keys(cookies).map(key => cookie.serialize(key, cookies[key])) -+ if (this.headers.cookie) { -+ cookieValues.unshift(this.headers.cookie) -+ } -+ this.headers.cookie = cookieValues.join('; ') -+ } -+ -+ this.socket = new MockSocket(options.remoteAddress || '127.0.0.1') -+ -+ Object.defineProperty(this, 'connection', { -+ get () { -+ warning.emit('FST_LIGHTMYREQUEST_DEP01') -+ return this.socket -+ }, -+ configurable: true -+ }) -+ -+ // we keep both payload and body for compatibility reasons -+ let payload = options.payload || options.body || null -+ if (payload && typeof payload !== 'string' && !(typeof payload.resume === 'function') && !Buffer.isBuffer(payload)) { -+ payload = JSON.stringify(payload) -+ this.headers['content-type'] = this.headers['content-type'] || 'application/json' -+ } -+ -+ // Set the content-length for the corresponding payload if none set -+ if (payload && !(typeof payload.resume === 'function') && !this.headers.hasOwnProperty('content-length')) { -+ this.headers['content-length'] = (Buffer.isBuffer(payload) ? payload.length : Buffer.byteLength(payload)).toString() -+ } -+ -+ // Use _lightMyRequest namespace to avoid collision with Node -+ this._lightMyRequest = { -+ payload, -+ isDone: false, -+ simulate: options.simulate || {} -+ } -+ -+ return this -+} -+ -+util.inherits(Request, Readable) -+ -+Request.prototype.prepare = function (next) { -+ const payload = this._lightMyRequest.payload -+ if (!payload || typeof payload.resume !== 'function') { // does not quack like a stream -+ return next() -+ } -+ -+ const chunks = [] -+ -+ payload.on('data', (chunk) => chunks.push(Buffer.from(chunk))) -+ -+ payload.on('end', () => { -+ const payload = Buffer.concat(chunks) -+ this.headers['content-length'] = this.headers['content-length'] || ('' + payload.length) -+ this._lightMyRequest.payload = payload -+ return next() -+ }) -+ -+ // Force to resume the stream. Needed for Stream 1 -+ payload.resume() -+} -+ -+Request.prototype._read = function (size) { -+ setImmediate(() => { -+ if (this._lightMyRequest.isDone) { -+ // 'end' defaults to true -+ if (this._lightMyRequest.simulate.end !== false) { -+ this.push(null) -+ } -+ -+ return -+ } -+ -+ this._lightMyRequest.isDone = true -+ -+ if (this._lightMyRequest.payload) { -+ if (this._lightMyRequest.simulate.split) { -+ this.push(this._lightMyRequest.payload.slice(0, 1)) -+ this.push(this._lightMyRequest.payload.slice(1)) -+ } else { -+ this.push(this._lightMyRequest.payload) -+ } -+ } -+ -+ if (this._lightMyRequest.simulate.error) { -+ this.emit('error', new Error('Simulated')) -+ } -+ -+ if (this._lightMyRequest.simulate.close) { -+ this.emit('close') -+ } -+ -+ // 'end' defaults to true -+ if (this._lightMyRequest.simulate.end !== false) { -+ this.push(null) -+ } -+ }) -+} -+ -+Request.prototype.destroy = function (error) { -+ if (this.destroyed) return -+ this.destroyed = true -+ -+ if (error) { -+ this._error = true -+ process.nextTick(() => this.emit('error', error)) -+ } -+ -+ process.nextTick(() => this.emit('close')) -+} -+ -+module.exports = Request -+ -+}, -+"6wjlMgmCb9E/v0dWOkSxeO7dnLftUJ1f1O3fPpL8vhI=": -+function (require, module, exports, __dirname, __filename) { -+var WriteError = require('level-errors').WriteError -+var promisify = require('./promisify') -+var getCallback = require('./common').getCallback -+var getOptions = require('./common').getOptions -+ -+function Batch (levelup) { -+ // TODO (next major): remove this._levelup alias -+ this.db = this._levelup = levelup -+ this.batch = levelup.db.batch() -+ this.ops = [] -+ this.length = 0 -+} -+ -+Batch.prototype.put = function (key, value) { -+ try { -+ this.batch.put(key, value) -+ } catch (e) { -+ throw new WriteError(e) -+ } -+ -+ this.ops.push({ type: 'put', key: key, value: value }) -+ this.length++ -+ -+ return this -+} -+ -+Batch.prototype.del = function (key) { -+ try { -+ this.batch.del(key) -+ } catch (err) { -+ throw new WriteError(err) -+ } -+ -+ this.ops.push({ type: 'del', key: key }) -+ this.length++ -+ -+ return this -+} -+ -+Batch.prototype.clear = function () { -+ try { -+ this.batch.clear() -+ } catch (err) { -+ throw new WriteError(err) -+ } -+ -+ this.ops = [] -+ this.length = 0 -+ -+ return this -+} -+ -+Batch.prototype.write = function (options, callback) { -+ var levelup = this._levelup -+ var ops = this.ops -+ var promise -+ -+ callback = getCallback(options, callback) -+ -+ if (!callback) { -+ callback = promisify() -+ promise = callback.promise -+ } -+ -+ options = getOptions(options) -+ -+ try { -+ this.batch.write(options, function (err) { -+ if (err) { return callback(new WriteError(err)) } -+ levelup.emit('batch', ops) -+ callback() -+ }) -+ } catch (err) { -+ throw new WriteError(err) -+ } -+ -+ return promise -+} -+ -+module.exports = Batch -+ -+}, -+"799fJN0kCpqmzZzXV7gue3yz0tnCFzBzRRYiP8tBYCE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_ref(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $valid = 'valid' + $lvl; -+ var $async, $refCode; -+ if ($schema == '#' || $schema == '#/') { -+ if (it.isRoot) { -+ $async = it.async; -+ $refCode = 'validate'; -+ } else { -+ $async = it.root.schema.$async === true; -+ $refCode = 'root.refVal[0]'; -+ } -+ } else { -+ var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot); -+ if ($refVal === undefined) { -+ var $message = it.MissingRefError.message(it.baseId, $schema); -+ if (it.opts.missingRefs == 'fail') { -+ it.logger.error($message); -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('$ref') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \'' + (it.util.escapeQuotes($schema)) + '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'can\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ if ($breakOnError) { -+ out += ' if (false) { '; -+ } -+ } else if (it.opts.missingRefs == 'ignore') { -+ it.logger.warn($message); -+ if ($breakOnError) { -+ out += ' if (true) { '; -+ } -+ } else { -+ throw new it.MissingRefError(it.baseId, $schema, $message); -+ } -+ } else if ($refVal.inline) { -+ var $it = it.util.copy(it); -+ $it.level++; -+ var $nextValid = 'valid' + $it.level; -+ $it.schema = $refVal.schema; -+ $it.schemaPath = ''; -+ $it.errSchemaPath = $schema; -+ var $code = it.validate($it).replace(/validate\.schema/g, $refVal.code); -+ out += ' ' + ($code) + ' '; -+ if ($breakOnError) { -+ out += ' if (' + ($nextValid) + ') { '; -+ } -+ } else { -+ $async = $refVal.$async === true || (it.async && $refVal.$async !== false); -+ $refCode = $refVal.code; -+ } -+ } -+ if ($refCode) { -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; -+ if (it.opts.passContext) { -+ out += ' ' + ($refCode) + '.call(this, '; -+ } else { -+ out += ' ' + ($refCode) + '( '; -+ } -+ out += ' ' + ($data) + ', (dataPath || \'\')'; -+ if (it.errorPath != '""') { -+ out += ' + ' + (it.errorPath); -+ } -+ var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', -+ $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; -+ out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData) '; -+ var __callValidate = out; -+ out = $$outStack.pop(); -+ if ($async) { -+ if (!it.async) throw new Error('async schema referenced by sync schema'); -+ if ($breakOnError) { -+ out += ' var ' + ($valid) + '; '; -+ } -+ out += ' try { await ' + (__callValidate) + '; '; -+ if ($breakOnError) { -+ out += ' ' + ($valid) + ' = true; '; -+ } -+ out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; '; -+ if ($breakOnError) { -+ out += ' ' + ($valid) + ' = false; '; -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' if (' + ($valid) + ') { '; -+ } -+ } else { -+ out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } '; -+ if ($breakOnError) { -+ out += ' else { '; -+ } -+ } -+ } -+ return out; -+} -+ -+}, -+"7AVYMrleJOJUEThqeJpMD5PnYjoRjkUeMNHuWEPGibI=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, PromiseArray, apiRejection, debug) { -+var util = require("./util"); -+var tryCatch = util.tryCatch; -+var errorObj = util.errorObj; -+var async = Promise._async; -+ -+Promise.prototype["break"] = Promise.prototype.cancel = function() { -+ if (!debug.cancellation()) return this._warn("cancellation is disabled"); -+ -+ var promise = this; -+ var child = promise; -+ while (promise._isCancellable()) { -+ if (!promise._cancelBy(child)) { -+ if (child._isFollowing()) { -+ child._followee().cancel(); -+ } else { -+ child._cancelBranched(); -+ } -+ break; -+ } -+ -+ var parent = promise._cancellationParent; -+ if (parent == null || !parent._isCancellable()) { -+ if (promise._isFollowing()) { -+ promise._followee().cancel(); -+ } else { -+ promise._cancelBranched(); -+ } -+ break; -+ } else { -+ if (promise._isFollowing()) promise._followee().cancel(); -+ promise._setWillBeCancelled(); -+ child = promise; -+ promise = parent; -+ } -+ } -+}; -+ -+Promise.prototype._branchHasCancelled = function() { -+ this._branchesRemainingToCancel--; -+}; -+ -+Promise.prototype._enoughBranchesHaveCancelled = function() { -+ return this._branchesRemainingToCancel === undefined || -+ this._branchesRemainingToCancel <= 0; -+}; -+ -+Promise.prototype._cancelBy = function(canceller) { -+ if (canceller === this) { -+ this._branchesRemainingToCancel = 0; -+ this._invokeOnCancel(); -+ return true; -+ } else { -+ this._branchHasCancelled(); -+ if (this._enoughBranchesHaveCancelled()) { -+ this._invokeOnCancel(); -+ return true; -+ } -+ } -+ return false; -+}; -+ -+Promise.prototype._cancelBranched = function() { -+ if (this._enoughBranchesHaveCancelled()) { -+ this._cancel(); -+ } -+}; -+ -+Promise.prototype._cancel = function() { -+ if (!this._isCancellable()) return; -+ this._setCancelled(); -+ async.invoke(this._cancelPromises, this, undefined); -+}; -+ -+Promise.prototype._cancelPromises = function() { -+ if (this._length() > 0) this._settlePromises(); -+}; -+ -+Promise.prototype._unsetOnCancel = function() { -+ this._onCancelField = undefined; -+}; -+ -+Promise.prototype._isCancellable = function() { -+ return this.isPending() && !this._isCancelled(); -+}; -+ -+Promise.prototype.isCancellable = function() { -+ return this.isPending() && !this.isCancelled(); -+}; -+ -+Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { -+ if (util.isArray(onCancelCallback)) { -+ for (var i = 0; i < onCancelCallback.length; ++i) { -+ this._doInvokeOnCancel(onCancelCallback[i], internalOnly); -+ } -+ } else if (onCancelCallback !== undefined) { -+ if (typeof onCancelCallback === "function") { -+ if (!internalOnly) { -+ var e = tryCatch(onCancelCallback).call(this._boundValue()); -+ if (e === errorObj) { -+ this._attachExtraTrace(e.e); -+ async.throwLater(e.e); -+ } -+ } -+ } else { -+ onCancelCallback._resultCancelled(this); -+ } -+ } -+}; -+ -+Promise.prototype._invokeOnCancel = function() { -+ var onCancelCallback = this._onCancel(); -+ this._unsetOnCancel(); -+ async.invoke(this._doInvokeOnCancel, this, onCancelCallback); -+}; -+ -+Promise.prototype._invokeInternalOnCancel = function() { -+ if (this._isCancellable()) { -+ this._doInvokeOnCancel(this._onCancel(), true); -+ this._unsetOnCancel(); -+ } -+}; -+ -+Promise.prototype._resultCancelled = function() { -+ this.cancel(); -+}; -+ -+}; -+ -+}, -+"7B2GUA9JeqjiD58MFpWVEVnZqQlmnQCiYc4bsis88Kk=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.getRules = exports.isJSONType = void 0; -+const _jsonTypes = ["string", "number", "integer", "boolean", "null", "object", "array"]; -+const jsonTypes = new Set(_jsonTypes); -+function isJSONType(x) { -+ return typeof x == "string" && jsonTypes.has(x); -+} -+exports.isJSONType = isJSONType; -+function getRules() { -+ const groups = { -+ number: { type: "number", rules: [] }, -+ string: { type: "string", rules: [] }, -+ array: { type: "array", rules: [] }, -+ object: { type: "object", rules: [] }, -+ }; -+ return { -+ types: { ...groups, integer: true, boolean: true, null: true }, -+ rules: [{ rules: [] }, groups.number, groups.string, groups.array, groups.object], -+ post: { rules: [] }, -+ all: {}, -+ keywords: {}, -+ }; -+} -+exports.getRules = getRules; -+//# sourceMappingURL=rules.js.map -+}, -+"7CiLe3m195cjy6st0bW29M9HaYDswOHH9XjtgO5Aq7Q=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var readerFor = require('./reader/readerFor'); -+var utils = require('./utils'); -+var sig = require('./signature'); -+var ZipEntry = require('./zipEntry'); -+var utf8 = require('./utf8'); -+var support = require('./support'); -+// class ZipEntries {{{ -+/** -+ * All the entries in the zip file. -+ * @constructor -+ * @param {Object} loadOptions Options for loading the stream. -+ */ -+function ZipEntries(loadOptions) { -+ this.files = []; -+ this.loadOptions = loadOptions; -+} -+ZipEntries.prototype = { -+ /** -+ * Check that the reader is on the specified signature. -+ * @param {string} expectedSignature the expected signature. -+ * @throws {Error} if it is an other signature. -+ */ -+ checkSignature: function(expectedSignature) { -+ if (!this.reader.readAndCheckSignature(expectedSignature)) { -+ this.reader.index -= 4; -+ var signature = this.reader.readString(4); -+ throw new Error("Corrupted zip or bug: unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")"); -+ } -+ }, -+ /** -+ * Check if the given signature is at the given index. -+ * @param {number} askedIndex the index to check. -+ * @param {string} expectedSignature the signature to expect. -+ * @return {boolean} true if the signature is here, false otherwise. -+ */ -+ isSignature: function(askedIndex, expectedSignature) { -+ var currentIndex = this.reader.index; -+ this.reader.setIndex(askedIndex); -+ var signature = this.reader.readString(4); -+ var result = signature === expectedSignature; -+ this.reader.setIndex(currentIndex); -+ return result; -+ }, -+ /** -+ * Read the end of the central directory. -+ */ -+ readBlockEndOfCentral: function() { -+ this.diskNumber = this.reader.readInt(2); -+ this.diskWithCentralDirStart = this.reader.readInt(2); -+ this.centralDirRecordsOnThisDisk = this.reader.readInt(2); -+ this.centralDirRecords = this.reader.readInt(2); -+ this.centralDirSize = this.reader.readInt(4); -+ this.centralDirOffset = this.reader.readInt(4); -+ -+ this.zipCommentLength = this.reader.readInt(2); -+ // warning : the encoding depends of the system locale -+ // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded. -+ // On a windows machine, this field is encoded with the localized windows code page. -+ var zipComment = this.reader.readData(this.zipCommentLength); -+ var decodeParamType = support.uint8array ? "uint8array" : "array"; -+ // To get consistent behavior with the generation part, we will assume that -+ // this is utf8 encoded unless specified otherwise. -+ var decodeContent = utils.transformTo(decodeParamType, zipComment); -+ this.zipComment = this.loadOptions.decodeFileName(decodeContent); -+ }, -+ /** -+ * Read the end of the Zip 64 central directory. -+ * Not merged with the method readEndOfCentral : -+ * The end of central can coexist with its Zip64 brother, -+ * I don't want to read the wrong number of bytes ! -+ */ -+ readBlockZip64EndOfCentral: function() { -+ this.zip64EndOfCentralSize = this.reader.readInt(8); -+ this.reader.skip(4); -+ // this.versionMadeBy = this.reader.readString(2); -+ // this.versionNeeded = this.reader.readInt(2); -+ this.diskNumber = this.reader.readInt(4); -+ this.diskWithCentralDirStart = this.reader.readInt(4); -+ this.centralDirRecordsOnThisDisk = this.reader.readInt(8); -+ this.centralDirRecords = this.reader.readInt(8); -+ this.centralDirSize = this.reader.readInt(8); -+ this.centralDirOffset = this.reader.readInt(8); -+ -+ this.zip64ExtensibleData = {}; -+ var extraDataSize = this.zip64EndOfCentralSize - 44, -+ index = 0, -+ extraFieldId, -+ extraFieldLength, -+ extraFieldValue; -+ while (index < extraDataSize) { -+ extraFieldId = this.reader.readInt(2); -+ extraFieldLength = this.reader.readInt(4); -+ extraFieldValue = this.reader.readData(extraFieldLength); -+ this.zip64ExtensibleData[extraFieldId] = { -+ id: extraFieldId, -+ length: extraFieldLength, -+ value: extraFieldValue -+ }; -+ } -+ }, -+ /** -+ * Read the end of the Zip 64 central directory locator. -+ */ -+ readBlockZip64EndOfCentralLocator: function() { -+ this.diskWithZip64CentralDirStart = this.reader.readInt(4); -+ this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8); -+ this.disksCount = this.reader.readInt(4); -+ if (this.disksCount > 1) { -+ throw new Error("Multi-volumes zip are not supported"); -+ } -+ }, -+ /** -+ * Read the local files, based on the offset read in the central part. -+ */ -+ readLocalFiles: function() { -+ var i, file; -+ for (i = 0; i < this.files.length; i++) { -+ file = this.files[i]; -+ this.reader.setIndex(file.localHeaderOffset); -+ this.checkSignature(sig.LOCAL_FILE_HEADER); -+ file.readLocalPart(this.reader); -+ file.handleUTF8(); -+ file.processAttributes(); -+ } -+ }, -+ /** -+ * Read the central directory. -+ */ -+ readCentralDir: function() { -+ var file; -+ -+ this.reader.setIndex(this.centralDirOffset); -+ while (this.reader.readAndCheckSignature(sig.CENTRAL_FILE_HEADER)) { -+ file = new ZipEntry({ -+ zip64: this.zip64 -+ }, this.loadOptions); -+ file.readCentralPart(this.reader); -+ this.files.push(file); -+ } -+ -+ if (this.centralDirRecords !== this.files.length) { -+ if (this.centralDirRecords !== 0 && this.files.length === 0) { -+ // We expected some records but couldn't find ANY. -+ // This is really suspicious, as if something went wrong. -+ throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length); -+ } else { -+ // We found some records but not all. -+ // Something is wrong but we got something for the user: no error here. -+ // console.warn("expected", this.centralDirRecords, "records in central dir, got", this.files.length); -+ } -+ } -+ }, -+ /** -+ * Read the end of central directory. -+ */ -+ readEndOfCentral: function() { -+ var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); -+ if (offset < 0) { -+ // Check if the content is a truncated zip or complete garbage. -+ // A "LOCAL_FILE_HEADER" is not required at the beginning (auto -+ // extractible zip for example) but it can give a good hint. -+ // If an ajax request was used without responseType, we will also -+ // get unreadable data. -+ var isGarbage = !this.isSignature(0, sig.LOCAL_FILE_HEADER); -+ -+ if (isGarbage) { -+ throw new Error("Can't find end of central directory : is this a zip file ? " + -+ "If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html"); -+ } else { -+ throw new Error("Corrupted zip: can't find end of central directory"); -+ } -+ -+ } -+ this.reader.setIndex(offset); -+ var endOfCentralDirOffset = offset; -+ this.checkSignature(sig.CENTRAL_DIRECTORY_END); -+ this.readBlockEndOfCentral(); -+ -+ -+ /* extract from the zip spec : -+ 4) If one of the fields in the end of central directory -+ record is too small to hold required data, the field -+ should be set to -1 (0xFFFF or 0xFFFFFFFF) and the -+ ZIP64 format record should be created. -+ 5) The end of central directory record and the -+ Zip64 end of central directory locator record must -+ reside on the same disk when splitting or spanning -+ an archive. -+ */ -+ if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) { -+ this.zip64 = true; -+ -+ /* -+ Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from -+ the zip file can fit into a 32bits integer. This cannot be solved : JavaScript represents -+ all numbers as 64-bit double precision IEEE 754 floating point numbers. -+ So, we have 53bits for integers and bitwise operations treat everything as 32bits. -+ see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators -+ and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5 -+ */ -+ -+ // should look for a zip64 EOCD locator -+ offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); -+ if (offset < 0) { -+ throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator"); -+ } -+ this.reader.setIndex(offset); -+ this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); -+ this.readBlockZip64EndOfCentralLocator(); -+ -+ // now the zip64 EOCD record -+ if (!this.isSignature(this.relativeOffsetEndOfZip64CentralDir, sig.ZIP64_CENTRAL_DIRECTORY_END)) { -+ // console.warn("ZIP64 end of central directory not where expected."); -+ this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); -+ if (this.relativeOffsetEndOfZip64CentralDir < 0) { -+ throw new Error("Corrupted zip: can't find the ZIP64 end of central directory"); -+ } -+ } -+ this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); -+ this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); -+ this.readBlockZip64EndOfCentral(); -+ } -+ -+ var expectedEndOfCentralDirOffset = this.centralDirOffset + this.centralDirSize; -+ if (this.zip64) { -+ expectedEndOfCentralDirOffset += 20; // end of central dir 64 locator -+ expectedEndOfCentralDirOffset += 12 /* should not include the leading 12 bytes */ + this.zip64EndOfCentralSize; -+ } -+ -+ var extraBytes = endOfCentralDirOffset - expectedEndOfCentralDirOffset; -+ -+ if (extraBytes > 0) { -+ // console.warn(extraBytes, "extra bytes at beginning or within zipfile"); -+ if (this.isSignature(endOfCentralDirOffset, sig.CENTRAL_FILE_HEADER)) { -+ // The offsets seem wrong, but we have something at the specified offset. -+ // So… we keep it. -+ } else { -+ // the offset is wrong, update the "zero" of the reader -+ // this happens if data has been prepended (crx files for example) -+ this.reader.zero = extraBytes; -+ } -+ } else if (extraBytes < 0) { -+ throw new Error("Corrupted zip: missing " + Math.abs(extraBytes) + " bytes."); -+ } -+ }, -+ prepareReader: function(data) { -+ this.reader = readerFor(data); -+ }, -+ /** -+ * Read a zip file and create ZipEntries. -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. -+ */ -+ load: function(data) { -+ this.prepareReader(data); -+ this.readEndOfCentral(); -+ this.readCentralDir(); -+ this.readLocalFiles(); -+ } -+}; -+// }}} end of ZipEntries -+module.exports = ZipEntries; -+ -+}, -+"7Drxy6SHv2NZtZ9rgOxJtk4YRj1jatr72u55ItxO7OI=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var DataReader = require('./DataReader'); -+var utils = require('../utils'); -+ -+function ArrayReader(data) { -+ DataReader.call(this, data); -+ for(var i = 0; i < this.data.length; i++) { -+ data[i] = data[i] & 0xFF; -+ } -+} -+utils.inherits(ArrayReader, DataReader); -+/** -+ * @see DataReader.byteAt -+ */ -+ArrayReader.prototype.byteAt = function(i) { -+ return this.data[this.zero + i]; -+}; -+/** -+ * @see DataReader.lastIndexOfSignature -+ */ -+ArrayReader.prototype.lastIndexOfSignature = function(sig) { -+ var sig0 = sig.charCodeAt(0), -+ sig1 = sig.charCodeAt(1), -+ sig2 = sig.charCodeAt(2), -+ sig3 = sig.charCodeAt(3); -+ for (var i = this.length - 4; i >= 0; --i) { -+ if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { -+ return i - this.zero; -+ } -+ } -+ -+ return -1; -+}; -+/** -+ * @see DataReader.readAndCheckSignature -+ */ -+ArrayReader.prototype.readAndCheckSignature = function (sig) { -+ var sig0 = sig.charCodeAt(0), -+ sig1 = sig.charCodeAt(1), -+ sig2 = sig.charCodeAt(2), -+ sig3 = sig.charCodeAt(3), -+ data = this.readData(4); -+ return sig0 === data[0] && sig1 === data[1] && sig2 === data[2] && sig3 === data[3]; -+}; -+/** -+ * @see DataReader.readData -+ */ -+ArrayReader.prototype.readData = function(size) { -+ this.checkOffset(size); -+ if(size === 0) { -+ return []; -+ } -+ var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); -+ this.index += size; -+ return result; -+}; -+module.exports = ArrayReader; -+ -+}, -+"7EaDRWk1SJk3mUxgccjvx0Qci0QREHXEBs/YfEm9cCs=": -+function (require, module, exports, __dirname, __filename) { -+var isBuffer = require('is-buffer'); -+var toString = Object.prototype.toString; -+ -+/** -+ * Get the native `typeof` a value. -+ * -+ * @param {*} `val` -+ * @return {*} Native javascript type -+ */ -+ -+module.exports = function kindOf(val) { -+ // primitivies -+ if (typeof val === 'undefined') { -+ return 'undefined'; -+ } -+ if (val === null) { -+ return 'null'; -+ } -+ if (val === true || val === false || val instanceof Boolean) { -+ return 'boolean'; -+ } -+ if (typeof val === 'string' || val instanceof String) { -+ return 'string'; -+ } -+ if (typeof val === 'number' || val instanceof Number) { -+ return 'number'; -+ } -+ -+ // functions -+ if (typeof val === 'function' || val instanceof Function) { -+ return 'function'; -+ } -+ -+ // array -+ if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { -+ return 'array'; -+ } -+ -+ // check for instances of RegExp and Date before calling `toString` -+ if (val instanceof RegExp) { -+ return 'regexp'; -+ } -+ if (val instanceof Date) { -+ return 'date'; -+ } -+ -+ // other objects -+ var type = toString.call(val); -+ -+ if (type === '[object RegExp]') { -+ return 'regexp'; -+ } -+ if (type === '[object Date]') { -+ return 'date'; -+ } -+ if (type === '[object Arguments]') { -+ return 'arguments'; -+ } -+ if (type === '[object Error]') { -+ return 'error'; -+ } -+ -+ // buffer -+ if (isBuffer(val)) { -+ return 'buffer'; -+ } -+ -+ // es6: Map, WeakMap, Set, WeakSet -+ if (type === '[object Set]') { -+ return 'set'; -+ } -+ if (type === '[object WeakSet]') { -+ return 'weakset'; -+ } -+ if (type === '[object Map]') { -+ return 'map'; -+ } -+ if (type === '[object WeakMap]') { -+ return 'weakmap'; -+ } -+ if (type === '[object Symbol]') { -+ return 'symbol'; -+ } -+ -+ // typed arrays -+ if (type === '[object Int8Array]') { -+ return 'int8array'; -+ } -+ if (type === '[object Uint8Array]') { -+ return 'uint8array'; -+ } -+ if (type === '[object Uint8ClampedArray]') { -+ return 'uint8clampedarray'; -+ } -+ if (type === '[object Int16Array]') { -+ return 'int16array'; -+ } -+ if (type === '[object Uint16Array]') { -+ return 'uint16array'; -+ } -+ if (type === '[object Int32Array]') { -+ return 'int32array'; -+ } -+ if (type === '[object Uint32Array]') { -+ return 'uint32array'; -+ } -+ if (type === '[object Float32Array]') { -+ return 'float32array'; -+ } -+ if (type === '[object Float64Array]') { -+ return 'float64array'; -+ } -+ -+ // must be a plain object -+ return 'object'; -+}; -+ -+}, -+"7GhWNb2UIDGerDlZuPRGV/ZlRfs1DRvkAsSMlVpXAy8=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, -+ apiRejection, -+ INTERNAL, -+ tryConvertToPromise, -+ Proxyable, -+ debug) { -+var errors = require("./errors"); -+var TypeError = errors.TypeError; -+var util = require("./util"); -+var errorObj = util.errorObj; -+var tryCatch = util.tryCatch; -+var yieldHandlers = []; -+ -+function promiseFromYieldHandler(value, yieldHandlers, traceParent) { -+ for (var i = 0; i < yieldHandlers.length; ++i) { -+ traceParent._pushContext(); -+ var result = tryCatch(yieldHandlers[i])(value); -+ traceParent._popContext(); -+ if (result === errorObj) { -+ traceParent._pushContext(); -+ var ret = Promise.reject(errorObj.e); -+ traceParent._popContext(); -+ return ret; -+ } -+ var maybePromise = tryConvertToPromise(result, traceParent); -+ if (maybePromise instanceof Promise) return maybePromise; -+ } -+ return null; -+} -+ -+function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { -+ if (debug.cancellation()) { -+ var internal = new Promise(INTERNAL); -+ var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); -+ this._promise = internal.lastly(function() { -+ return _finallyPromise; -+ }); -+ internal._captureStackTrace(); -+ internal._setOnCancel(this); -+ } else { -+ var promise = this._promise = new Promise(INTERNAL); -+ promise._captureStackTrace(); -+ } -+ this._stack = stack; -+ this._generatorFunction = generatorFunction; -+ this._receiver = receiver; -+ this._generator = undefined; -+ this._yieldHandlers = typeof yieldHandler === "function" -+ ? [yieldHandler].concat(yieldHandlers) -+ : yieldHandlers; -+ this._yieldedPromise = null; -+ this._cancellationPhase = false; -+} -+util.inherits(PromiseSpawn, Proxyable); -+ -+PromiseSpawn.prototype._isResolved = function() { -+ return this._promise === null; -+}; -+ -+PromiseSpawn.prototype._cleanup = function() { -+ this._promise = this._generator = null; -+ if (debug.cancellation() && this._finallyPromise !== null) { -+ this._finallyPromise._fulfill(); -+ this._finallyPromise = null; -+ } -+}; -+ -+PromiseSpawn.prototype._promiseCancelled = function() { -+ if (this._isResolved()) return; -+ var implementsReturn = typeof this._generator["return"] !== "undefined"; -+ -+ var result; -+ if (!implementsReturn) { -+ var reason = new Promise.CancellationError( -+ "generator .return() sentinel"); -+ Promise.coroutine.returnSentinel = reason; -+ this._promise._attachExtraTrace(reason); -+ this._promise._pushContext(); -+ result = tryCatch(this._generator["throw"]).call(this._generator, -+ reason); -+ this._promise._popContext(); -+ } else { -+ this._promise._pushContext(); -+ result = tryCatch(this._generator["return"]).call(this._generator, -+ undefined); -+ this._promise._popContext(); -+ } -+ this._cancellationPhase = true; -+ this._yieldedPromise = null; -+ this._continue(result); -+}; -+ -+PromiseSpawn.prototype._promiseFulfilled = function(value) { -+ this._yieldedPromise = null; -+ this._promise._pushContext(); -+ var result = tryCatch(this._generator.next).call(this._generator, value); -+ this._promise._popContext(); -+ this._continue(result); -+}; -+ -+PromiseSpawn.prototype._promiseRejected = function(reason) { -+ this._yieldedPromise = null; -+ this._promise._attachExtraTrace(reason); -+ this._promise._pushContext(); -+ var result = tryCatch(this._generator["throw"]) -+ .call(this._generator, reason); -+ this._promise._popContext(); -+ this._continue(result); -+}; -+ -+PromiseSpawn.prototype._resultCancelled = function() { -+ if (this._yieldedPromise instanceof Promise) { -+ var promise = this._yieldedPromise; -+ this._yieldedPromise = null; -+ promise.cancel(); -+ } -+}; -+ -+PromiseSpawn.prototype.promise = function () { -+ return this._promise; -+}; -+ -+PromiseSpawn.prototype._run = function () { -+ this._generator = this._generatorFunction.call(this._receiver); -+ this._receiver = -+ this._generatorFunction = undefined; -+ this._promiseFulfilled(undefined); -+}; -+ -+PromiseSpawn.prototype._continue = function (result) { -+ var promise = this._promise; -+ if (result === errorObj) { -+ this._cleanup(); -+ if (this._cancellationPhase) { -+ return promise.cancel(); -+ } else { -+ return promise._rejectCallback(result.e, false); -+ } -+ } -+ -+ var value = result.value; -+ if (result.done === true) { -+ this._cleanup(); -+ if (this._cancellationPhase) { -+ return promise.cancel(); -+ } else { -+ return promise._resolveCallback(value); -+ } -+ } else { -+ var maybePromise = tryConvertToPromise(value, this._promise); -+ if (!(maybePromise instanceof Promise)) { -+ maybePromise = -+ promiseFromYieldHandler(maybePromise, -+ this._yieldHandlers, -+ this._promise); -+ if (maybePromise === null) { -+ this._promiseRejected( -+ new TypeError( -+ "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) + -+ "From coroutine:\u000a" + -+ this._stack.split("\n").slice(1, -7).join("\n") -+ ) -+ ); -+ return; -+ } -+ } -+ maybePromise = maybePromise._target(); -+ var bitField = maybePromise._bitField; -+ ; -+ if (((bitField & 50397184) === 0)) { -+ this._yieldedPromise = maybePromise; -+ maybePromise._proxy(this, null); -+ } else if (((bitField & 33554432) !== 0)) { -+ Promise._async.invoke( -+ this._promiseFulfilled, this, maybePromise._value() -+ ); -+ } else if (((bitField & 16777216) !== 0)) { -+ Promise._async.invoke( -+ this._promiseRejected, this, maybePromise._reason() -+ ); -+ } else { -+ this._promiseCancelled(); -+ } -+ } -+}; -+ -+Promise.coroutine = function (generatorFunction, options) { -+ if (typeof generatorFunction !== "function") { -+ throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+ var yieldHandler = Object(options).yieldHandler; -+ var PromiseSpawn$ = PromiseSpawn; -+ var stack = new Error().stack; -+ return function () { -+ var generator = generatorFunction.apply(this, arguments); -+ var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, -+ stack); -+ var ret = spawn.promise(); -+ spawn._generator = generator; -+ spawn._promiseFulfilled(undefined); -+ return ret; -+ }; -+}; -+ -+Promise.coroutine.addYieldHandler = function(fn) { -+ if (typeof fn !== "function") { -+ throw new TypeError("expecting a function but got " + util.classString(fn)); -+ } -+ yieldHandlers.push(fn); -+}; -+ -+Promise.spawn = function (generatorFunction) { -+ debug.deprecated("Promise.spawn()", "Promise.coroutine()"); -+ if (typeof generatorFunction !== "function") { -+ return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+ var spawn = new PromiseSpawn(generatorFunction, this); -+ var ret = spawn.promise(); -+ spawn._run(Promise.spawn); -+ return ret; -+}; -+}; -+ -+}, -+"7IjHK2+Esz7jD16dkLDXih10KSz6/HLoKuBCZmzxQUE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var DataReader = require('./dataReader'); -+ -+function Uint8ArrayReader(data) { -+ if (data) { -+ this.data = data; -+ this.length = this.data.length; -+ this.index = 0; -+ } -+} -+Uint8ArrayReader.prototype = new DataReader(); -+/** -+ * @see DataReader.byteAt -+ */ -+Uint8ArrayReader.prototype.byteAt = function(i) { -+ return this.data[i]; -+}; -+/** -+ * @see DataReader.lastIndexOfSignature -+ */ -+Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) { -+ var sig0 = sig.charCodeAt(0), -+ sig1 = sig.charCodeAt(1), -+ sig2 = sig.charCodeAt(2), -+ sig3 = sig.charCodeAt(3); -+ for (var i = this.length - 4; i >= 0; --i) { -+ if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { -+ return i; -+ } -+ } -+ -+ return -1; -+}; -+/** -+ * @see DataReader.readData -+ */ -+Uint8ArrayReader.prototype.readData = function(size) { -+ this.checkOffset(size); -+ if(size === 0) { -+ // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. -+ return new Uint8Array(0); -+ } -+ var result = this.data.subarray(this.index, this.index + size); -+ this.index += size; -+ return result; -+}; -+module.exports = Uint8ArrayReader; -+ -+}, -+"7J4OJY8CDUN5uSSVoTeQQ59yhjcu3LfgJGUVOONU1fY=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const util_1 = require("../../compile/util"); -+const def = { -+ keyword: "allOf", -+ schemaType: "array", -+ code(cxt) { -+ const { gen, schema, it } = cxt; -+ /* istanbul ignore if */ -+ if (!Array.isArray(schema)) -+ throw new Error("ajv implementation error"); -+ const valid = gen.name("valid"); -+ schema.forEach((sch, i) => { -+ if (util_1.alwaysValidSchema(it, sch)) -+ return; -+ const schCxt = cxt.subschema({ keyword: "allOf", schemaProp: i }, valid); -+ cxt.ok(valid); -+ cxt.mergeEvaluated(schCxt); -+ }); -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=allOf.js.map -+}, -+"7ONk1h9UbeLlNt8JEDNjsRDzMBqEshHq+FwPCxwSOtw=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * ws: a node.js websocket client -+ * Copyright(c) 2011 Einar Otto Stangvik -+ * MIT Licensed -+ */ -+ -+'use strict'; -+ -+const WebSocket = require('./lib/WebSocket'); -+ -+WebSocket.Server = require('./lib/WebSocketServer'); -+WebSocket.Receiver = require('./lib/Receiver'); -+WebSocket.Sender = require('./lib/Sender'); -+ -+module.exports = WebSocket; -+ -+}, -+"7QgvyFaO8KaVwfaIfo3utL1ocVbrFVtJvKPgnmEpfuw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+/* eslint no-prototype-builtins: 0 */ -+const os = require('os') -+const stdSerializers = require('pino-std-serializers') -+const redaction = require('./lib/redaction') -+const time = require('./lib/time') -+const proto = require('./lib/proto') -+const symbols = require('./lib/symbols') -+const { assertDefaultLevelFound, mappings, genLsCache } = require('./lib/levels') -+const { -+ createArgsNormalizer, -+ asChindings, -+ final, -+ stringify, -+ buildSafeSonicBoom, -+ buildFormatters, -+ noop -+} = require('./lib/tools') -+const { version } = require('./lib/meta') -+const { -+ chindingsSym, -+ redactFmtSym, -+ serializersSym, -+ timeSym, -+ timeSliceIndexSym, -+ streamSym, -+ stringifySym, -+ stringifiersSym, -+ setLevelSym, -+ endSym, -+ formatOptsSym, -+ messageKeySym, -+ nestedKeySym, -+ mixinSym, -+ useOnlyCustomLevelsSym, -+ formattersSym, -+ hooksSym -+} = symbols -+const { epochTime, nullTime } = time -+const { pid } = process -+const hostname = os.hostname() -+const defaultErrorSerializer = stdSerializers.err -+const defaultOptions = { -+ level: 'info', -+ messageKey: 'msg', -+ nestedKey: null, -+ enabled: true, -+ prettyPrint: false, -+ base: { pid, hostname }, -+ serializers: Object.assign(Object.create(null), { -+ err: defaultErrorSerializer -+ }), -+ formatters: Object.assign(Object.create(null), { -+ bindings (bindings) { -+ return bindings -+ }, -+ level (label, number) { -+ return { level: number } -+ } -+ }), -+ hooks: { -+ logMethod: undefined -+ }, -+ timestamp: epochTime, -+ name: undefined, -+ redact: null, -+ customLevels: null, -+ levelKey: undefined, -+ useOnlyCustomLevels: false -+} -+ -+const normalize = createArgsNormalizer(defaultOptions) -+ -+const serializers = Object.assign(Object.create(null), stdSerializers) -+ -+function pino (...args) { -+ const instance = {} -+ const { opts, stream } = normalize(instance, ...args) -+ const { -+ redact, -+ crlf, -+ serializers, -+ timestamp, -+ messageKey, -+ nestedKey, -+ base, -+ name, -+ level, -+ customLevels, -+ useLevelLabels, -+ changeLevelName, -+ levelKey, -+ mixin, -+ useOnlyCustomLevels, -+ formatters, -+ hooks -+ } = opts -+ -+ const allFormatters = buildFormatters( -+ formatters.level, -+ formatters.bindings, -+ formatters.log -+ ) -+ -+ if (useLevelLabels && !(changeLevelName || levelKey)) { -+ process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001') -+ allFormatters.level = labelsFormatter -+ } else if ((changeLevelName || levelKey) && !useLevelLabels) { -+ process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002') -+ allFormatters.level = levelNameFormatter(changeLevelName || levelKey) -+ } else if ((changeLevelName || levelKey) && useLevelLabels) { -+ process.emitWarning('useLevelLabels is deprecated, use the formatters.level option instead', 'Warning', 'PINODEP001') -+ process.emitWarning('changeLevelName and levelKey are deprecated, use the formatters.level option instead', 'Warning', 'PINODEP002') -+ allFormatters.level = levelNameLabelFormatter(changeLevelName || levelKey) -+ } -+ -+ if (serializers[Symbol.for('pino.*')]) { -+ process.emitWarning('The pino.* serializer is deprecated, use the formatters.log options instead', 'Warning', 'PINODEP003') -+ allFormatters.log = serializers[Symbol.for('pino.*')] -+ } -+ -+ if (!allFormatters.bindings) { -+ allFormatters.bindings = defaultOptions.formatters.bindings -+ } -+ if (!allFormatters.level) { -+ allFormatters.level = defaultOptions.formatters.level -+ } -+ -+ const stringifiers = redact ? redaction(redact, stringify) : {} -+ const formatOpts = redact -+ ? { stringify: stringifiers[redactFmtSym] } -+ : { stringify } -+ const end = '}' + (crlf ? '\r\n' : '\n') -+ const coreChindings = asChindings.bind(null, { -+ [chindingsSym]: '', -+ [serializersSym]: serializers, -+ [stringifiersSym]: stringifiers, -+ [stringifySym]: stringify, -+ [formattersSym]: allFormatters -+ }) -+ -+ let chindings = '' -+ if (base !== null) { -+ if (name === undefined) { -+ chindings = coreChindings(base) -+ } else { -+ chindings = coreChindings(Object.assign({}, base, { name })) -+ } -+ } -+ -+ const time = (timestamp instanceof Function) -+ ? timestamp -+ : (timestamp ? epochTime : nullTime) -+ const timeSliceIndex = time().indexOf(':') + 1 -+ -+ if (useOnlyCustomLevels && !customLevels) throw Error('customLevels is required if useOnlyCustomLevels is set true') -+ if (mixin && typeof mixin !== 'function') throw Error(`Unknown mixin type "${typeof mixin}" - expected "function"`) -+ -+ assertDefaultLevelFound(level, customLevels, useOnlyCustomLevels) -+ const levels = mappings(customLevels, useOnlyCustomLevels) -+ -+ Object.assign(instance, { -+ levels, -+ [useOnlyCustomLevelsSym]: useOnlyCustomLevels, -+ [streamSym]: stream, -+ [timeSym]: time, -+ [timeSliceIndexSym]: timeSliceIndex, -+ [stringifySym]: stringify, -+ [stringifiersSym]: stringifiers, -+ [endSym]: end, -+ [formatOptsSym]: formatOpts, -+ [messageKeySym]: messageKey, -+ [nestedKeySym]: nestedKey, -+ [serializersSym]: serializers, -+ [mixinSym]: mixin, -+ [chindingsSym]: chindings, -+ [formattersSym]: allFormatters, -+ [hooksSym]: hooks, -+ silent: noop -+ }) -+ -+ Object.setPrototypeOf(instance, proto()) -+ -+ genLsCache(instance) -+ -+ instance[setLevelSym](level) -+ -+ return instance -+} -+ -+function labelsFormatter (label, number) { -+ return { level: label } -+} -+ -+function levelNameFormatter (name) { -+ return function (label, number) { -+ return { [name]: number } -+ } -+} -+ -+function levelNameLabelFormatter (name) { -+ return function (label, number) { -+ return { [name]: label } -+ } -+} -+ -+module.exports = pino -+ -+module.exports.extreme = (dest = process.stdout.fd) => { -+ process.emitWarning( -+ 'The pino.extreme() option is deprecated and will be removed in v7. Use pino.destination({ sync: false }) instead.', -+ { code: 'extreme_deprecation' } -+ ) -+ return buildSafeSonicBoom({ dest, minLength: 4096, sync: false }) -+} -+ -+module.exports.destination = (dest = process.stdout.fd) => { -+ if (typeof dest === 'object') { -+ dest.dest = dest.dest || process.stdout.fd -+ return buildSafeSonicBoom(dest) -+ } else { -+ return buildSafeSonicBoom({ dest, minLength: 0, sync: true }) -+ } -+} -+ -+module.exports.final = final -+module.exports.levels = mappings() -+module.exports.stdSerializers = serializers -+module.exports.stdTimeFunctions = Object.assign({}, time) -+module.exports.symbols = symbols -+module.exports.version = version -+ -+// Enables default and name export with TypeScript and Babel -+module.exports.default = pino -+module.exports.pino = pino -+ -+}, -+"7Uz9WKGE9bv7fIUgHv+NwSUMjtRnfQcB0AvpNWTrnc8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+let lru = require('tiny-lru') -+// Needed to handle Webpack and faux modules -+// See https://github.com/fastify/fastify/issues/2356 -+// and https://github.com/fastify/fastify/discussions/2907. -+lru = typeof lru === 'function' ? lru : lru.default -+ -+const secureJson = require('secure-json-parse') -+const { -+ kDefaultJsonParse, -+ kContentTypeParser, -+ kBodyLimit, -+ kRequestPayloadStream, -+ kState, -+ kTestInternals -+} = require('./symbols') -+ -+const { -+ FST_ERR_CTP_INVALID_TYPE, -+ FST_ERR_CTP_EMPTY_TYPE, -+ FST_ERR_CTP_ALREADY_PRESENT, -+ FST_ERR_CTP_INVALID_HANDLER, -+ FST_ERR_CTP_INVALID_PARSE_TYPE, -+ FST_ERR_CTP_BODY_TOO_LARGE, -+ FST_ERR_CTP_INVALID_MEDIA_TYPE, -+ FST_ERR_CTP_INVALID_CONTENT_LENGTH, -+ FST_ERR_CTP_EMPTY_JSON_BODY -+} = require('./errors') -+const warning = require('./warnings') -+ -+function ContentTypeParser (bodyLimit, onProtoPoisoning, onConstructorPoisoning) { -+ this[kDefaultJsonParse] = getDefaultJsonParser(onProtoPoisoning, onConstructorPoisoning) -+ this.customParsers = {} -+ this.customParsers['application/json'] = new Parser(true, false, bodyLimit, this[kDefaultJsonParse]) -+ this.customParsers['text/plain'] = new Parser(true, false, bodyLimit, defaultPlainTextParser) -+ this.parserList = ['application/json', 'text/plain'] -+ this.parserRegExpList = [] -+ this.cache = lru(100) -+} -+ -+ContentTypeParser.prototype.add = function (contentType, opts, parserFn) { -+ const contentTypeIsString = typeof contentType === 'string' -+ -+ if (!contentTypeIsString && !(contentType instanceof RegExp)) throw new FST_ERR_CTP_INVALID_TYPE() -+ if (contentTypeIsString && contentType.length === 0) throw new FST_ERR_CTP_EMPTY_TYPE() -+ if (typeof parserFn !== 'function') throw new FST_ERR_CTP_INVALID_HANDLER() -+ -+ if (this.existingParser(contentType)) { -+ throw new FST_ERR_CTP_ALREADY_PRESENT(contentType) -+ } -+ -+ if (opts.parseAs !== undefined) { -+ if (opts.parseAs !== 'string' && opts.parseAs !== 'buffer') { -+ throw new FST_ERR_CTP_INVALID_PARSE_TYPE(opts.parseAs) -+ } -+ } -+ -+ const parser = new Parser( -+ opts.parseAs === 'string', -+ opts.parseAs === 'buffer', -+ opts.bodyLimit, -+ parserFn -+ ) -+ -+ if (contentTypeIsString && contentType === '*') { -+ this.customParsers[''] = parser -+ } else { -+ if (contentTypeIsString) { -+ if (contentType !== 'application/json' && contentType !== 'text/plain') { -+ this.parserList.unshift(contentType) -+ } -+ } else { -+ this.parserRegExpList.unshift(contentType) -+ } -+ this.customParsers[contentType] = parser -+ } -+} -+ -+ContentTypeParser.prototype.hasParser = function (contentType) { -+ return contentType in this.customParsers -+} -+ -+ContentTypeParser.prototype.existingParser = function (contentType) { -+ if (contentType === 'application/json') { -+ return this.customParsers['application/json'].fn !== this[kDefaultJsonParse] -+ } -+ if (contentType === 'text/plain') { -+ return this.customParsers['text/plain'].fn !== defaultPlainTextParser -+ } -+ -+ return contentType in this.customParsers -+} -+ -+ContentTypeParser.prototype.getParser = function (contentType) { -+ // eslint-disable-next-line no-var -+ for (var i = 0; i !== this.parserList.length; ++i) { -+ const parserName = this.parserList[i] -+ if (contentType.indexOf(parserName) > -1) { -+ const parser = this.customParsers[parserName] -+ this.cache.set(contentType, parser) -+ return parser -+ } -+ } -+ -+ // eslint-disable-next-line no-var -+ for (var j = 0; j !== this.parserRegExpList.length; ++j) { -+ const parserRegExp = this.parserRegExpList[j] -+ if (parserRegExp.test(contentType)) { -+ const parser = this.customParsers[parserRegExp] -+ this.cache.set(contentType, parser) -+ return parser -+ } -+ } -+ -+ return this.customParsers[''] -+} -+ -+ContentTypeParser.prototype.run = function (contentType, handler, request, reply) { -+ const parser = this.cache.get(contentType) || this.getParser(contentType) -+ -+ if (parser === undefined) { -+ reply.send(new FST_ERR_CTP_INVALID_MEDIA_TYPE(contentType)) -+ } else if (parser.asString === true || parser.asBuffer === true) { -+ rawBody( -+ request, -+ reply, -+ reply.context._parserOptions, -+ parser, -+ done -+ ) -+ } else { -+ let result -+ -+ if (parser.isDeprecatedSignature) { -+ result = parser.fn(request[kRequestPayloadStream], done) -+ } else { -+ result = parser.fn(request, request[kRequestPayloadStream], done) -+ } -+ -+ if (result && typeof result.then === 'function') { -+ result.then(body => done(null, body), done) -+ } -+ } -+ -+ function done (error, body) { -+ if (error) { -+ reply.send(error) -+ } else { -+ request.body = body -+ handler(request, reply) -+ } -+ } -+} -+ -+function rawBody (request, reply, options, parser, done) { -+ const asString = parser.asString -+ const limit = options.limit === null ? parser.bodyLimit : options.limit -+ const contentLength = request.headers['content-length'] === undefined -+ ? NaN -+ : Number.parseInt(request.headers['content-length'], 10) -+ -+ if (contentLength > limit) { -+ reply.send(new FST_ERR_CTP_BODY_TOO_LARGE()) -+ return -+ } -+ -+ let receivedLength = 0 -+ let body = asString === true ? '' : [] -+ -+ const payload = request[kRequestPayloadStream] || request.raw -+ -+ if (asString === true) { -+ payload.setEncoding('utf8') -+ } -+ -+ payload.on('data', onData) -+ payload.on('end', onEnd) -+ payload.on('error', onEnd) -+ payload.resume() -+ -+ function onData (chunk) { -+ receivedLength += chunk.length -+ -+ if ((payload.receivedEncodedLength || receivedLength) > limit) { -+ payload.removeListener('data', onData) -+ payload.removeListener('end', onEnd) -+ payload.removeListener('error', onEnd) -+ reply.send(new FST_ERR_CTP_BODY_TOO_LARGE()) -+ return -+ } -+ -+ if (asString === true) { -+ body += chunk -+ } else { -+ body.push(chunk) -+ } -+ } -+ -+ function onEnd (err) { -+ payload.removeListener('data', onData) -+ payload.removeListener('end', onEnd) -+ payload.removeListener('error', onEnd) -+ -+ if (err !== undefined) { -+ err.statusCode = 400 -+ reply.code(err.statusCode).send(err) -+ return -+ } -+ -+ if (asString === true) { -+ receivedLength = Buffer.byteLength(body) -+ } -+ -+ if (!Number.isNaN(contentLength) && (payload.receivedEncodedLength || receivedLength) !== contentLength) { -+ reply.send(new FST_ERR_CTP_INVALID_CONTENT_LENGTH()) -+ return -+ } -+ -+ if (asString === false) { -+ body = Buffer.concat(body) -+ } -+ -+ const result = parser.fn(request, body, done) -+ if (result && typeof result.then === 'function') { -+ result.then(body => done(null, body), done) -+ } -+ } -+} -+ -+function getDefaultJsonParser (onProtoPoisoning, onConstructorPoisoning) { -+ return defaultJsonParser -+ -+ function defaultJsonParser (req, body, done) { -+ if (body === '' || body == null) { -+ return done(new FST_ERR_CTP_EMPTY_JSON_BODY(), undefined) -+ } -+ let json -+ try { -+ json = secureJson.parse(body, { protoAction: onProtoPoisoning, constructorAction: onConstructorPoisoning }) -+ } catch (err) { -+ err.statusCode = 400 -+ return done(err, undefined) -+ } -+ done(null, json) -+ } -+} -+ -+function defaultPlainTextParser (req, body, done) { -+ done(null, body) -+} -+ -+function Parser (asString, asBuffer, bodyLimit, fn) { -+ this.asString = asString -+ this.asBuffer = asBuffer -+ this.bodyLimit = bodyLimit -+ this.fn = fn -+ -+ // Check for deprecation syntax -+ if (fn.length === (fn.constructor.name === 'AsyncFunction' ? 1 : 2)) { -+ warning.emit('FSTDEP003') -+ this.isDeprecatedSignature = true -+ } -+} -+ -+function buildContentTypeParser (c) { -+ const contentTypeParser = new ContentTypeParser() -+ contentTypeParser[kDefaultJsonParse] = c[kDefaultJsonParse] -+ Object.assign(contentTypeParser.customParsers, c.customParsers) -+ contentTypeParser.parserList = c.parserList.slice() -+ return contentTypeParser -+} -+ -+function addContentTypeParser (contentType, opts, parser) { -+ if (this[kState].started) { -+ throw new Error('Cannot call "addContentTypeParser" when fastify instance is already started!') -+ } -+ -+ if (typeof opts === 'function') { -+ parser = opts -+ opts = {} -+ } -+ -+ if (!opts) opts = {} -+ if (!opts.bodyLimit) opts.bodyLimit = this[kBodyLimit] -+ -+ if (Array.isArray(contentType)) { -+ contentType.forEach((type) => this[kContentTypeParser].add(type, opts, parser)) -+ } else { -+ this[kContentTypeParser].add(contentType, opts, parser) -+ } -+ -+ return this -+} -+ -+function hasContentTypeParser (contentType) { -+ return this[kContentTypeParser].hasParser(contentType) -+} -+ -+module.exports = ContentTypeParser -+module.exports.helpers = { -+ buildContentTypeParser, -+ addContentTypeParser, -+ hasContentTypeParser -+} -+module.exports.defaultParsers = { -+ getDefaultJsonParser, -+ defaultTextParser: defaultPlainTextParser -+} -+module.exports[kTestInternals] = { rawBody } -+ -+}, -+"7X6Qyu6MWTpPQr7lyFFKZnmuH2uuxamsfFUM332M8zc=": -+function (require, module, exports, __dirname, __filename) { -+var toBuffer = require('to-buffer') -+var alloc = require('buffer-alloc') -+ -+var ZEROS = '0000000000000000000' -+var SEVENS = '7777777777777777777' -+var ZERO_OFFSET = '0'.charCodeAt(0) -+var USTAR = 'ustar\x0000' -+var MASK = parseInt('7777', 8) -+ -+var clamp = function (index, len, defaultValue) { -+ if (typeof index !== 'number') return defaultValue -+ index = ~~index // Coerce to integer. -+ if (index >= len) return len -+ if (index >= 0) return index -+ index += len -+ if (index >= 0) return index -+ return 0 -+} -+ -+var toType = function (flag) { -+ switch (flag) { -+ case 0: -+ return 'file' -+ case 1: -+ return 'link' -+ case 2: -+ return 'symlink' -+ case 3: -+ return 'character-device' -+ case 4: -+ return 'block-device' -+ case 5: -+ return 'directory' -+ case 6: -+ return 'fifo' -+ case 7: -+ return 'contiguous-file' -+ case 72: -+ return 'pax-header' -+ case 55: -+ return 'pax-global-header' -+ case 27: -+ return 'gnu-long-link-path' -+ case 28: -+ case 30: -+ return 'gnu-long-path' -+ } -+ -+ return null -+} -+ -+var toTypeflag = function (flag) { -+ switch (flag) { -+ case 'file': -+ return 0 -+ case 'link': -+ return 1 -+ case 'symlink': -+ return 2 -+ case 'character-device': -+ return 3 -+ case 'block-device': -+ return 4 -+ case 'directory': -+ return 5 -+ case 'fifo': -+ return 6 -+ case 'contiguous-file': -+ return 7 -+ case 'pax-header': -+ return 72 -+ } -+ -+ return 0 -+} -+ -+var indexOf = function (block, num, offset, end) { -+ for (; offset < end; offset++) { -+ if (block[offset] === num) return offset -+ } -+ return end -+} -+ -+var cksum = function (block) { -+ var sum = 8 * 32 -+ for (var i = 0; i < 148; i++) sum += block[i] -+ for (var j = 156; j < 512; j++) sum += block[j] -+ return sum -+} -+ -+var encodeOct = function (val, n) { -+ val = val.toString(8) -+ if (val.length > n) return SEVENS.slice(0, n) + ' ' -+ else return ZEROS.slice(0, n - val.length) + val + ' ' -+} -+ -+/* Copied from the node-tar repo and modified to meet -+ * tar-stream coding standard. -+ * -+ * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349 -+ */ -+function parse256 (buf) { -+ // first byte MUST be either 80 or FF -+ // 80 for positive, FF for 2's comp -+ var positive -+ if (buf[0] === 0x80) positive = true -+ else if (buf[0] === 0xFF) positive = false -+ else return null -+ -+ // build up a base-256 tuple from the least sig to the highest -+ var zero = false -+ var tuple = [] -+ for (var i = buf.length - 1; i > 0; i--) { -+ var byte = buf[i] -+ if (positive) tuple.push(byte) -+ else if (zero && byte === 0) tuple.push(0) -+ else if (zero) { -+ zero = false -+ tuple.push(0x100 - byte) -+ } else tuple.push(0xFF - byte) -+ } -+ -+ var sum = 0 -+ var l = tuple.length -+ for (i = 0; i < l; i++) { -+ sum += tuple[i] * Math.pow(256, i) -+ } -+ -+ return positive ? sum : -1 * sum -+} -+ -+var decodeOct = function (val, offset, length) { -+ val = val.slice(offset, offset + length) -+ offset = 0 -+ -+ // If prefixed with 0x80 then parse as a base-256 integer -+ if (val[offset] & 0x80) { -+ return parse256(val) -+ } else { -+ // Older versions of tar can prefix with spaces -+ while (offset < val.length && val[offset] === 32) offset++ -+ var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length) -+ while (offset < end && val[offset] === 0) offset++ -+ if (end === offset) return 0 -+ return parseInt(val.slice(offset, end).toString(), 8) -+ } -+} -+ -+var decodeStr = function (val, offset, length, encoding) { -+ return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding) -+} -+ -+var addLength = function (str) { -+ var len = Buffer.byteLength(str) -+ var digits = Math.floor(Math.log(len) / Math.log(10)) + 1 -+ if (len + digits >= Math.pow(10, digits)) digits++ -+ -+ return (len + digits) + str -+} -+ -+exports.decodeLongPath = function (buf, encoding) { -+ return decodeStr(buf, 0, buf.length, encoding) -+} -+ -+exports.encodePax = function (opts) { // TODO: encode more stuff in pax -+ var result = '' -+ if (opts.name) result += addLength(' path=' + opts.name + '\n') -+ if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n') -+ var pax = opts.pax -+ if (pax) { -+ for (var key in pax) { -+ result += addLength(' ' + key + '=' + pax[key] + '\n') -+ } -+ } -+ return toBuffer(result) -+} -+ -+exports.decodePax = function (buf) { -+ var result = {} -+ -+ while (buf.length) { -+ var i = 0 -+ while (i < buf.length && buf[i] !== 32) i++ -+ var len = parseInt(buf.slice(0, i).toString(), 10) -+ if (!len) return result -+ -+ var b = buf.slice(i + 1, len - 1).toString() -+ var keyIndex = b.indexOf('=') -+ if (keyIndex === -1) return result -+ result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1) -+ -+ buf = buf.slice(len) -+ } -+ -+ return result -+} -+ -+exports.encode = function (opts) { -+ var buf = alloc(512) -+ var name = opts.name -+ var prefix = '' -+ -+ if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/' -+ if (Buffer.byteLength(name) !== name.length) return null // utf-8 -+ -+ while (Buffer.byteLength(name) > 100) { -+ var i = name.indexOf('/') -+ if (i === -1) return null -+ prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i) -+ name = name.slice(i + 1) -+ } -+ -+ if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null -+ if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null -+ -+ buf.write(name) -+ buf.write(encodeOct(opts.mode & MASK, 6), 100) -+ buf.write(encodeOct(opts.uid, 6), 108) -+ buf.write(encodeOct(opts.gid, 6), 116) -+ buf.write(encodeOct(opts.size, 11), 124) -+ buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136) -+ -+ buf[156] = ZERO_OFFSET + toTypeflag(opts.type) -+ -+ if (opts.linkname) buf.write(opts.linkname, 157) -+ -+ buf.write(USTAR, 257) -+ if (opts.uname) buf.write(opts.uname, 265) -+ if (opts.gname) buf.write(opts.gname, 297) -+ buf.write(encodeOct(opts.devmajor || 0, 6), 329) -+ buf.write(encodeOct(opts.devminor || 0, 6), 337) -+ -+ if (prefix) buf.write(prefix, 345) -+ -+ buf.write(encodeOct(cksum(buf), 6), 148) -+ -+ return buf -+} -+ -+exports.decode = function (buf, filenameEncoding) { -+ var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET -+ -+ var name = decodeStr(buf, 0, 100, filenameEncoding) -+ var mode = decodeOct(buf, 100, 8) -+ var uid = decodeOct(buf, 108, 8) -+ var gid = decodeOct(buf, 116, 8) -+ var size = decodeOct(buf, 124, 12) -+ var mtime = decodeOct(buf, 136, 12) -+ var type = toType(typeflag) -+ var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding) -+ var uname = decodeStr(buf, 265, 32) -+ var gname = decodeStr(buf, 297, 32) -+ var devmajor = decodeOct(buf, 329, 8) -+ var devminor = decodeOct(buf, 337, 8) -+ -+ if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name -+ -+ // to support old tar versions that use trailing / to indicate dirs -+ if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5 -+ -+ var c = cksum(buf) -+ -+ // checksum is still initial value if header was null. -+ if (c === 8 * 32) return null -+ -+ // valid checksum -+ if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?') -+ -+ return { -+ name: name, -+ mode: mode, -+ uid: uid, -+ gid: gid, -+ size: size, -+ mtime: new Date(1000 * mtime), -+ type: type, -+ linkname: linkname, -+ uname: uname, -+ gname: gname, -+ devmajor: devmajor, -+ devminor: devminor -+ } -+} -+ -+}, -+"7XSoqXnnvuQNnLab8whJS7OLaKwNSmPU1wxLyDNEdAM=": -+function (require, module, exports, __dirname, __filename) { -+// optional / simple context binding -+var aFunction = require('./_a-function'); -+module.exports = function(fn, that, length){ -+ aFunction(fn); -+ if(that === undefined)return fn; -+ switch(length){ -+ case 1: return function(a){ -+ return fn.call(that, a); -+ }; -+ case 2: return function(a, b){ -+ return fn.call(that, a, b); -+ }; -+ case 3: return function(a, b, c){ -+ return fn.call(that, a, b, c); -+ }; -+ } -+ return function(/* ...args */){ -+ return fn.apply(that, arguments); -+ }; -+}; -+}, -+"7Xs21mvB3jBFa6LdigPzqD5mo3en4/fpZ7gtqwY3GZQ=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('crypto').randomBytes -+ -+}, -+"7arMZrpqMck7f/dDQpwcJRw2rPLOnlbAwa6D4tpOuWI=": -+function (require, module, exports, __dirname, __filename) { -+var sourceMappingURL = require("source-map-url") -+ -+var resolveUrl = require("./resolve-url") -+var decodeUriComponent = require("./decode-uri-component") -+var urix = require("urix") -+var atob = require("atob") -+ -+ -+ -+function callbackAsync(callback, error, result) { -+ setImmediate(function() { callback(error, result) }) -+} -+ -+function parseMapToJSON(string, data) { -+ try { -+ return JSON.parse(string.replace(/^\)\]\}'/, "")) -+ } catch (error) { -+ error.sourceMapData = data -+ throw error -+ } -+} -+ -+function readSync(read, url, data) { -+ var readUrl = decodeUriComponent(url) -+ try { -+ return String(read(readUrl)) -+ } catch (error) { -+ error.sourceMapData = data -+ throw error -+ } -+} -+ -+ -+ -+function resolveSourceMap(code, codeUrl, read, callback) { -+ var mapData -+ try { -+ mapData = resolveSourceMapHelper(code, codeUrl) -+ } catch (error) { -+ return callbackAsync(callback, error) -+ } -+ if (!mapData || mapData.map) { -+ return callbackAsync(callback, null, mapData) -+ } -+ var readUrl = decodeUriComponent(mapData.url) -+ read(readUrl, function(error, result) { -+ if (error) { -+ error.sourceMapData = mapData -+ return callback(error) -+ } -+ mapData.map = String(result) -+ try { -+ mapData.map = parseMapToJSON(mapData.map, mapData) -+ } catch (error) { -+ return callback(error) -+ } -+ callback(null, mapData) -+ }) -+} -+ -+function resolveSourceMapSync(code, codeUrl, read) { -+ var mapData = resolveSourceMapHelper(code, codeUrl) -+ if (!mapData || mapData.map) { -+ return mapData -+ } -+ mapData.map = readSync(read, mapData.url, mapData) -+ mapData.map = parseMapToJSON(mapData.map, mapData) -+ return mapData -+} -+ -+var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ -+ -+/** -+ * The media type for JSON text is application/json. -+ * -+ * {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations } -+ * -+ * `text/json` is non-standard media type -+ */ -+var jsonMimeTypeRegex = /^(?:application|text)\/json$/ -+ -+/** -+ * JSON text exchanged between systems that are not part of a closed ecosystem -+ * MUST be encoded using UTF-8. -+ * -+ * {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding} -+ */ -+var jsonCharacterEncoding = "utf-8" -+ -+function base64ToBuf(b64) { -+ var binStr = atob(b64) -+ var len = binStr.length -+ var arr = new Uint8Array(len) -+ for (var i = 0; i < len; i++) { -+ arr[i] = binStr.charCodeAt(i) -+ } -+ return arr -+} -+ -+function decodeBase64String(b64) { -+ if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { -+ return atob(b64) -+ } -+ var buf = base64ToBuf(b64); -+ // Note: `decoder.decode` method will throw a `DOMException` with the -+ // `"EncodingError"` value when an coding error is found. -+ var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true}) -+ return decoder.decode(buf); -+} -+ -+function resolveSourceMapHelper(code, codeUrl) { -+ codeUrl = urix(codeUrl) -+ -+ var url = sourceMappingURL.getFrom(code) -+ if (!url) { -+ return null -+ } -+ -+ var dataUri = url.match(dataUriRegex) -+ if (dataUri) { -+ var mimeType = dataUri[1] || "text/plain" -+ var lastParameter = dataUri[2] || "" -+ var encoded = dataUri[3] || "" -+ var data = { -+ sourceMappingURL: url, -+ url: null, -+ sourcesRelativeTo: codeUrl, -+ map: encoded -+ } -+ if (!jsonMimeTypeRegex.test(mimeType)) { -+ var error = new Error("Unuseful data uri mime type: " + mimeType) -+ error.sourceMapData = data -+ throw error -+ } -+ try { -+ data.map = parseMapToJSON( -+ lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), -+ data -+ ) -+ } catch (error) { -+ error.sourceMapData = data -+ throw error -+ } -+ return data -+ } -+ -+ var mapUrl = resolveUrl(codeUrl, url) -+ return { -+ sourceMappingURL: url, -+ url: mapUrl, -+ sourcesRelativeTo: mapUrl, -+ map: null -+ } -+} -+ -+ -+ -+function resolveSources(map, mapUrl, read, options, callback) { -+ if (typeof options === "function") { -+ callback = options -+ options = {} -+ } -+ var pending = map.sources ? map.sources.length : 0 -+ var result = { -+ sourcesResolved: [], -+ sourcesContent: [] -+ } -+ -+ if (pending === 0) { -+ callbackAsync(callback, null, result) -+ return -+ } -+ -+ var done = function() { -+ pending-- -+ if (pending === 0) { -+ callback(null, result) -+ } -+ } -+ -+ resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { -+ result.sourcesResolved[index] = fullUrl -+ if (typeof sourceContent === "string") { -+ result.sourcesContent[index] = sourceContent -+ callbackAsync(done, null) -+ } else { -+ var readUrl = decodeUriComponent(fullUrl) -+ read(readUrl, function(error, source) { -+ result.sourcesContent[index] = error ? error : String(source) -+ done() -+ }) -+ } -+ }) -+} -+ -+function resolveSourcesSync(map, mapUrl, read, options) { -+ var result = { -+ sourcesResolved: [], -+ sourcesContent: [] -+ } -+ -+ if (!map.sources || map.sources.length === 0) { -+ return result -+ } -+ -+ resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { -+ result.sourcesResolved[index] = fullUrl -+ if (read !== null) { -+ if (typeof sourceContent === "string") { -+ result.sourcesContent[index] = sourceContent -+ } else { -+ var readUrl = decodeUriComponent(fullUrl) -+ try { -+ result.sourcesContent[index] = String(read(readUrl)) -+ } catch (error) { -+ result.sourcesContent[index] = error -+ } -+ } -+ } -+ }) -+ -+ return result -+} -+ -+var endingSlash = /\/?$/ -+ -+function resolveSourcesHelper(map, mapUrl, options, fn) { -+ options = options || {} -+ mapUrl = urix(mapUrl) -+ var fullUrl -+ var sourceContent -+ var sourceRoot -+ for (var index = 0, len = map.sources.length; index < len; index++) { -+ sourceRoot = null -+ if (typeof options.sourceRoot === "string") { -+ sourceRoot = options.sourceRoot -+ } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { -+ sourceRoot = map.sourceRoot -+ } -+ // If the sourceRoot is the empty string, it is equivalent to not setting -+ // the property at all. -+ if (sourceRoot === null || sourceRoot === '') { -+ fullUrl = resolveUrl(mapUrl, map.sources[index]) -+ } else { -+ // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes -+ // `/scripts/subdir/`, not `/scripts/`. Pointing to a file as source root -+ // does not make sense. -+ fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]) -+ } -+ sourceContent = (map.sourcesContent || [])[index] -+ fn(fullUrl, sourceContent, index) -+ } -+} -+ -+ -+ -+function resolve(code, codeUrl, read, options, callback) { -+ if (typeof options === "function") { -+ callback = options -+ options = {} -+ } -+ if (code === null) { -+ var mapUrl = codeUrl -+ var data = { -+ sourceMappingURL: null, -+ url: mapUrl, -+ sourcesRelativeTo: mapUrl, -+ map: null -+ } -+ var readUrl = decodeUriComponent(mapUrl) -+ read(readUrl, function(error, result) { -+ if (error) { -+ error.sourceMapData = data -+ return callback(error) -+ } -+ data.map = String(result) -+ try { -+ data.map = parseMapToJSON(data.map, data) -+ } catch (error) { -+ return callback(error) -+ } -+ _resolveSources(data) -+ }) -+ } else { -+ resolveSourceMap(code, codeUrl, read, function(error, mapData) { -+ if (error) { -+ return callback(error) -+ } -+ if (!mapData) { -+ return callback(null, null) -+ } -+ _resolveSources(mapData) -+ }) -+ } -+ -+ function _resolveSources(mapData) { -+ resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { -+ if (error) { -+ return callback(error) -+ } -+ mapData.sourcesResolved = result.sourcesResolved -+ mapData.sourcesContent = result.sourcesContent -+ callback(null, mapData) -+ }) -+ } -+} -+ -+function resolveSync(code, codeUrl, read, options) { -+ var mapData -+ if (code === null) { -+ var mapUrl = codeUrl -+ mapData = { -+ sourceMappingURL: null, -+ url: mapUrl, -+ sourcesRelativeTo: mapUrl, -+ map: null -+ } -+ mapData.map = readSync(read, mapUrl, mapData) -+ mapData.map = parseMapToJSON(mapData.map, mapData) -+ } else { -+ mapData = resolveSourceMapSync(code, codeUrl, read) -+ if (!mapData) { -+ return null -+ } -+ } -+ var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options) -+ mapData.sourcesResolved = result.sourcesResolved -+ mapData.sourcesContent = result.sourcesContent -+ return mapData -+} -+ -+ -+ -+module.exports = { -+ resolveSourceMap: resolveSourceMap, -+ resolveSourceMapSync: resolveSourceMapSync, -+ resolveSources: resolveSources, -+ resolveSourcesSync: resolveSourcesSync, -+ resolve: resolve, -+ resolveSync: resolveSync, -+ parseMapToJSON: parseMapToJSON -+} -+ -+}, -+"7dKxmgPr8UWm0DkEu5zyi/1JHGyCmy5gyhcIwDmcfCE=": -+function (require, module, exports, __dirname, __filename) { -+// crc16 impl, optimized for numeric inputs -+ -+var TABLE = [ -+ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, -+ 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, -+ 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, -+ 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, -+ 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, -+ 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, -+ 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, -+ 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, -+ 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, -+ 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, -+ 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, -+ 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, -+ 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, -+ 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, -+ 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, -+ 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, -+ 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, -+ 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, -+ 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, -+ 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, -+ 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, -+ 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, -+ 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, -+ 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, -+ 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, -+ 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, -+ 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, -+ 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, -+ 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, -+ 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, -+ 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, -+ 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 -+] -+ -+module.exports = crc16 -+ -+function crc16 (n) { -+ var crc = 0 -+ var r = 0 -+ -+ for (var i = 0; i < 8; i++) { -+ r = n & 0xff -+ n = (n - r) / 256 -+ crc = ((crc << 8) ^ TABLE[((crc >> 8) ^ r) & 0xff]) & 0xffff -+ } -+ -+ return crc -+} -+ -+}, -+"7diMfpXVo9KqqhZW/H4jFYMQjqNYaF6xEyOdlaTkdDM=": -+function (require, module, exports, __dirname, __filename) { -+/** Used to match a single whitespace character. */ -+var reWhitespace = /\s/; -+ -+/** -+ * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace -+ * character of `string`. -+ * -+ * @private -+ * @param {string} string The string to inspect. -+ * @returns {number} Returns the index of the last non-whitespace character. -+ */ -+function trimmedEndIndex(string) { -+ var index = string.length; -+ -+ while (index-- && reWhitespace.test(string.charAt(index))) {} -+ return index; -+} -+ -+module.exports = trimmedEndIndex; -+ -+}, -+"7dx9QiONoZJ8rDmG8r75kUe4/dD5NToKHwDumkkACWM=": -+function (require, module, exports, __dirname, __filename) { -+var once = require('once') -+var eos = require('end-of-stream') -+var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes -+ -+var noop = function () {} -+var ancient = /^v?\.0/.test(process.version) -+ -+var isFn = function (fn) { -+ return typeof fn === 'function' -+} -+ -+var isFS = function (stream) { -+ if (!ancient) return false // newer node version do not need to care about fs is a special way -+ if (!fs) return false // browser -+ return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) -+} -+ -+var isRequest = function (stream) { -+ return stream.setHeader && isFn(stream.abort) -+} -+ -+var destroyer = function (stream, reading, writing, callback) { -+ callback = once(callback) -+ -+ var closed = false -+ stream.on('close', function () { -+ closed = true -+ }) -+ -+ eos(stream, {readable: reading, writable: writing}, function (err) { -+ if (err) return callback(err) -+ closed = true -+ callback() -+ }) -+ -+ var destroyed = false -+ return function (err) { -+ if (closed) return -+ if (destroyed) return -+ destroyed = true -+ -+ if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks -+ if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want -+ -+ if (isFn(stream.destroy)) return stream.destroy() -+ -+ callback(err || new Error('stream was destroyed')) -+ } -+} -+ -+var call = function (fn) { -+ fn() -+} -+ -+var pipe = function (from, to) { -+ return from.pipe(to) -+} -+ -+var pump = function () { -+ var streams = Array.prototype.slice.call(arguments) -+ var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop -+ -+ if (Array.isArray(streams[0])) streams = streams[0] -+ if (streams.length < 2) throw new Error('pump requires two streams per minimum') -+ -+ var error -+ var destroys = streams.map(function (stream, i) { -+ var reading = i < streams.length - 1 -+ var writing = i > 0 -+ return destroyer(stream, reading, writing, function (err) { -+ if (!error) error = err -+ if (err) destroys.forEach(call) -+ if (reading) return -+ destroys.forEach(call) -+ callback(error) -+ }) -+ }) -+ -+ streams.reduce(pipe) -+} -+ -+module.exports = pump -+ -+}, -+"7gU7nzx91h7haI9aqL9pLJC7vUTjToEs4HCpJxZCPa4=": -+function (require, module, exports, __dirname, __filename) { -+var socket = require('k-rpc-socket') -+var KBucket = require('k-bucket') -+var equals = require('buffer-equals') -+var events = require('events') -+var randombytes = require('randombytes') -+var util = require('util') -+var Buffer = require('safe-buffer').Buffer -+ -+var K = 20 -+var MAX_CONCURRENCY = 16 -+var BOOTSTRAP_NODES = [ -+ {host: 'router.bittorrent.com', port: 6881}, -+ {host: 'router.utorrent.com', port: 6881}, -+ {host: 'dht.transmissionbt.com', port: 6881} -+] -+ -+module.exports = RPC -+ -+function RPC (opts) { -+ if (!(this instanceof RPC)) return new RPC(opts) -+ if (!opts) opts = {} -+ -+ var self = this -+ -+ this._idLength = opts.idLength || 20 -+ this.id = toBuffer(opts.id || opts.nodeId || randombytes(this._idLength)) -+ this.socket = opts.krpcSocket || socket(opts) -+ this.bootstrap = toBootstrapArray(opts.nodes || opts.bootstrap) -+ this.concurrency = opts.concurrency || MAX_CONCURRENCY -+ this.backgroundConcurrency = opts.backgroundConcurrency || (this.concurrency / 4) | 0 -+ this.k = opts.k || K -+ this.destroyed = false -+ -+ this.pending = [] -+ this.nodes = null -+ -+ this.socket.setMaxListeners(0) -+ this.socket.on('query', onquery) -+ this.socket.on('response', onresponse) -+ this.socket.on('warning', onwarning) -+ this.socket.on('error', onerror) -+ this.socket.on('update', onupdate) -+ this.socket.on('listening', onlistening) -+ -+ events.EventEmitter.call(this) -+ this.clear() -+ -+ function onupdate () { -+ while (self.pending.length && self.socket.inflight < self.concurrency) { -+ var next = self.pending.shift() -+ self.query(next[0], next[1], next[2]) -+ } -+ } -+ -+ function onerror (err) { -+ self.emit('error', err) -+ } -+ -+ function onlistening () { -+ self.emit('listening') -+ } -+ -+ function onwarning (err) { -+ self.emit('warning', err) -+ } -+ -+ function onquery (query, peer) { -+ addNode(query.a, peer) -+ self.emit('query', query, peer) -+ } -+ -+ function onresponse (reply, peer) { -+ addNode(reply.r, peer) -+ } -+ -+ function addNode (data, peer) { -+ if (data && isNodeId(data.id, self._idLength) && !self.nodes.get(data.id) && !equals(data.id, self.id)) { -+ self._addNode({ -+ id: data.id, -+ host: peer.address || peer.host, -+ port: peer.port, -+ distance: 0 -+ }) -+ } -+ } -+} -+ -+util.inherits(RPC, events.EventEmitter) -+ -+RPC.prototype.response = function (node, query, response, nodes, cb) { -+ if (typeof nodes === 'function') { -+ cb = nodes -+ nodes = null -+ } -+ -+ if (!response.id) response.id = this.id -+ if (nodes) response.nodes = encodeNodes(nodes, this._idLength) -+ this.socket.response(node, query, response, cb) -+} -+ -+RPC.prototype.error = function (node, query, error, cb) { -+ this.socket.error(node, query, error, cb) -+} -+ -+// bind([port], [address], [callback]) -+RPC.prototype.bind = function () { -+ this.socket.bind.apply(this.socket, arguments) -+} -+ -+RPC.prototype.address = function () { -+ return this.socket.address() -+} -+ -+RPC.prototype.queryAll = function (nodes, message, visit, cb) { -+ if (!message.a) message.a = {} -+ if (!message.a.id) message.a.id = this.id -+ -+ var stop = false -+ var missing = nodes.length -+ var hits = 0 -+ var error = null -+ -+ if (!missing) return cb(new Error('No nodes to query'), 0) -+ -+ for (var i = 0; i < nodes.length; i++) { -+ this.query(nodes[i], message, done) -+ } -+ -+ function done (err, res, peer) { -+ if (!err) hits++ -+ else if (err.code >= 300 && err.code < 400) error = err -+ if (!err && !stop) { -+ if (visit && visit(res, peer) === false) stop = true -+ } -+ if (!--missing) cb(hits ? null : error || new Error('All queries failed'), hits) -+ } -+} -+ -+RPC.prototype.query = function (node, message, cb) { -+ if (this.socket.inflight >= this.concurrency) { -+ this.pending.push([node, message, cb]) -+ } else { -+ if (!message.a) message.a = {} -+ if (!message.a.id) message.a.id = this.id -+ if (node.token) message.a.token = node.token -+ this.socket.query(node, message, cb) -+ } -+} -+ -+RPC.prototype.destroy = function (cb) { -+ this.destroyed = true -+ this.socket.destroy(cb) -+} -+ -+RPC.prototype.clear = function () { -+ var self = this -+ -+ this.nodes = new KBucket({ -+ localNodeId: this.id, -+ numberOfNodesPerKBucket: this.k, -+ numberOfNodesToPing: this.concurrency -+ }) -+ -+ this.nodes.on('ping', onping) -+ -+ function onping (older, newer) { -+ self.emit('ping', older, newer) -+ } -+} -+ -+RPC.prototype.populate = function (target, message, cb) { -+ this._closest(target, message, true, null, cb) -+} -+ -+RPC.prototype.closest = function (target, message, visit, cb) { -+ this._closest(target, message, false, visit, cb) -+} -+ -+RPC.prototype._addNode = function (node) { -+ var old = this.nodes.get(node.id) -+ this.nodes.add(node) -+ if (!old) this.emit('node', node) -+} -+ -+RPC.prototype._closest = function (target, message, background, visit, cb) { -+ if (!cb) cb = noop -+ -+ var self = this -+ var count = 0 -+ var queried = {} -+ var pending = 0 -+ var once = true -+ var stop = false -+ -+ if (!message.a) message.a = {} -+ if (!message.a.id) message.a.id = this.id -+ -+ var table = new KBucket({ -+ localNodeId: target, -+ numberOfNodesPerKBucket: this.k, -+ numberOfNodesToPing: this.concurrency -+ }) -+ -+ var evt = background ? 'postupdate' : 'update' -+ this.socket.on(evt, kick) -+ kick() -+ -+ function kick () { -+ if (self.destroyed || self.socket.inflight >= self.concurrency) return -+ -+ var otherInflight = self.pending.length + self.socket.inflight - pending -+ if (background && self.socket.inflight >= self.backgroundConcurrency && otherInflight) return -+ -+ var closest = table.closest(target, self.k) -+ if (!closest.length || closest.length < self.bootstrap.length) { -+ closest = self.nodes.closest(target, self.k) -+ if (!closest.length || closest.length < self.bootstrap.length) bootstrap() -+ } -+ -+ for (var i = 0; i < closest.length; i++) { -+ if (stop) break -+ if (self.socket.inflight >= self.concurrency) return -+ -+ var peer = closest[i] -+ var id = peer.host + ':' + peer.port -+ if (queried[id]) continue -+ queried[id] = true -+ -+ pending++ -+ self.socket.query(peer, message, afterQuery) -+ } -+ -+ if (!pending) { -+ self.socket.removeListener(evt, kick) -+ process.nextTick(done) -+ } -+ } -+ -+ function done () { -+ cb(null, count) -+ } -+ -+ function bootstrap () { -+ if (!once) return -+ once = false -+ self.bootstrap.forEach(function (peer) { -+ pending++ -+ self.socket.query(peer, message, afterQuery) -+ }) -+ } -+ -+ function afterQuery (err, res, peer) { -+ pending-- -+ if (peer) queried[(peer.address || peer.host) + ':' + peer.port] = true // need this for bootstrap nodes -+ -+ if (peer && peer.id && self.nodes.get(peer.id)) { -+ if (err && (err.code === 'EUNEXPECTEDNODE' || err.code === 'ETIMEDOUT')) { -+ self.nodes.remove(peer.id) -+ } -+ } -+ -+ var r = res && res.r -+ if (!r) return kick() -+ -+ if (!err && isNodeId(r.id, self._idLength)) { -+ count++ -+ add({ -+ id: r.id, -+ port: peer.port, -+ host: peer.host || peer.address, -+ distance: 0 -+ }) -+ } -+ -+ var nodes = r.nodes ? parseNodes(r.nodes, self._idLength) : [] -+ for (var i = 0; i < nodes.length; i++) add(nodes[i]) -+ -+ if (visit && visit(res, peer) === false) stop = true -+ -+ kick() -+ } -+ -+ function add (node) { -+ if (equals(node.id, self.id)) return -+ table.add(node) -+ } -+} -+ -+function toBootstrapArray (val) { -+ if (val === false) return [] -+ if (val === true) return BOOTSTRAP_NODES -+ return [].concat(val || BOOTSTRAP_NODES).map(parsePeer) -+} -+ -+function isNodeId (id, idLength) { -+ return id && Buffer.isBuffer(id) && id.length === idLength -+} -+ -+function encodeNodes (nodes, idLength) { -+ var buf = Buffer.allocUnsafe(nodes.length * (idLength + 6)) -+ var ptr = 0 -+ -+ for (var i = 0; i < nodes.length; i++) { -+ var node = nodes[i] -+ if (!isNodeId(node.id, idLength)) continue -+ node.id.copy(buf, ptr) -+ ptr += idLength -+ var ip = (node.host || node.address).split('.') -+ for (var j = 0; j < 4; j++) buf[ptr++] = parseInt(ip[j] || 0, 10) -+ buf.writeUInt16BE(node.port, ptr) -+ ptr += 2 -+ } -+ -+ if (ptr === buf.length) return buf -+ return buf.slice(0, ptr) -+} -+ -+function parseNodes (buf, idLength) { -+ var contacts = [] -+ -+ try { -+ for (var i = 0; i < buf.length; i += (idLength + 6)) { -+ var port = buf.readUInt16BE(i + (idLength + 4)) -+ if (!port) continue -+ contacts.push({ -+ id: buf.slice(i, i + idLength), -+ host: parseIp(buf, i + idLength), -+ port: port, -+ distance: 0, -+ token: null -+ }) -+ } -+ } catch (err) { -+ // do nothing -+ } -+ -+ return contacts -+} -+ -+function parseIp (buf, offset) { -+ return buf[offset++] + '.' + buf[offset++] + '.' + buf[offset++] + '.' + buf[offset++] -+} -+ -+function parsePeer (peer) { -+ if (typeof peer === 'string') return {host: peer.split(':')[0], port: Number(peer.split(':')[1])} -+ return peer -+} -+ -+function noop () {} -+ -+function toBuffer (str) { -+ if (Buffer.isBuffer(str)) return str -+ if (ArrayBuffer.isView(str)) return Buffer.from(str.buffer, str.byteOffset, str.byteLength) -+ if (typeof str === 'string') return Buffer.from(str, 'hex') -+ throw new Error('Pass a buffer or a string') -+} -+ -+}, -+"7h1yDs5bhWNHYmcmUssdr0B0qzU12izIuMAC603VNro=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var ruleModules = require('../dotjs') -+ , toHash = require('./util').toHash; -+ -+module.exports = function rules() { -+ var RULES = [ -+ { type: 'number', -+ rules: [ { 'maximum': ['exclusiveMaximum'] }, -+ { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] }, -+ { type: 'string', -+ rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] }, -+ { type: 'array', -+ rules: [ 'maxItems', 'minItems', 'items', 'contains', 'uniqueItems' ] }, -+ { type: 'object', -+ rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames', -+ { 'properties': ['additionalProperties', 'patternProperties'] } ] }, -+ { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf', 'if' ] } -+ ]; -+ -+ var ALL = [ 'type', '$comment' ]; -+ var KEYWORDS = [ -+ '$schema', '$id', 'id', '$data', '$async', 'title', -+ 'description', 'default', 'definitions', -+ 'examples', 'readOnly', 'writeOnly', -+ 'contentMediaType', 'contentEncoding', -+ 'additionalItems', 'then', 'else' -+ ]; -+ var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ]; -+ RULES.all = toHash(ALL); -+ RULES.types = toHash(TYPES); -+ -+ RULES.forEach(function (group) { -+ group.rules = group.rules.map(function (keyword) { -+ var implKeywords; -+ if (typeof keyword == 'object') { -+ var key = Object.keys(keyword)[0]; -+ implKeywords = keyword[key]; -+ keyword = key; -+ implKeywords.forEach(function (k) { -+ ALL.push(k); -+ RULES.all[k] = true; -+ }); -+ } -+ ALL.push(keyword); -+ var rule = RULES.all[keyword] = { -+ keyword: keyword, -+ code: ruleModules[keyword], -+ implements: implKeywords -+ }; -+ return rule; -+ }); -+ -+ RULES.all.$comment = { -+ keyword: '$comment', -+ code: ruleModules.$comment -+ }; -+ -+ if (group.type) RULES.types[group.type] = group; -+ }); -+ -+ RULES.keywords = toHash(ALL.concat(KEYWORDS)); -+ RULES.custom = {}; -+ -+ return RULES; -+}; -+ -+}, -+"7jOAa/xBkIwk+CMQwrYlvWc/5G9mIYwto1SaTTXUWjw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var DataReader = require('./DataReader'); -+var utils = require('../utils'); -+ -+function StringReader(data) { -+ DataReader.call(this, data); -+} -+utils.inherits(StringReader, DataReader); -+/** -+ * @see DataReader.byteAt -+ */ -+StringReader.prototype.byteAt = function(i) { -+ return this.data.charCodeAt(this.zero + i); -+}; -+/** -+ * @see DataReader.lastIndexOfSignature -+ */ -+StringReader.prototype.lastIndexOfSignature = function(sig) { -+ return this.data.lastIndexOf(sig) - this.zero; -+}; -+/** -+ * @see DataReader.readAndCheckSignature -+ */ -+StringReader.prototype.readAndCheckSignature = function (sig) { -+ var data = this.readData(4); -+ return sig === data; -+}; -+/** -+ * @see DataReader.readData -+ */ -+StringReader.prototype.readData = function(size) { -+ this.checkOffset(size); -+ // this will work because the constructor applied the "& 0xff" mask. -+ var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); -+ this.index += size; -+ return result; -+}; -+module.exports = StringReader; -+ -+}, -+"7l3FC0pLNSGeAWcwqoYxsl0SJEfdffVuxEfdIC/XmtQ=": -+function (require, module, exports, __dirname, __filename) { -+const compare = require('./compare') -+const eq = (a, b, loose) => compare(a, b, loose) === 0 -+module.exports = eq -+ -+}, -+"7sX11rgSCtqc1Io8oKJTxkd3kG6DVHewkOBTQ004z2w=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// (C) 1995-2013 Jean-loup Gailly and Mark Adler -+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -+// -+// This software is provided 'as-is', without any express or implied -+// warranty. In no event will the authors be held liable for any damages -+// arising from the use of this software. -+// -+// Permission is granted to anyone to use this software for any purpose, -+// including commercial applications, and to alter it and redistribute it -+// freely, subject to the following restrictions: -+// -+// 1. The origin of this software must not be misrepresented; you must not -+// claim that you wrote the original software. If you use this software -+// in a product, an acknowledgment in the product documentation would be -+// appreciated but is not required. -+// 2. Altered source versions must be plainly marked as such, and must not be -+// misrepresented as being the original software. -+// 3. This notice may not be removed or altered from any source distribution. -+ -+module.exports = { -+ 2: 'need dictionary', /* Z_NEED_DICT 2 */ -+ 1: 'stream end', /* Z_STREAM_END 1 */ -+ 0: '', /* Z_OK 0 */ -+ '-1': 'file error', /* Z_ERRNO (-1) */ -+ '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ -+ '-3': 'data error', /* Z_DATA_ERROR (-3) */ -+ '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ -+ '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ -+ '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -+}; -+ -+}, -+"7vD6ei2JVzjA9FgEBUaItlSFjxO6IsfafCatpVRdnzk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var extend = require('extend-shallow'); -+var Snapdragon = require('snapdragon'); -+var compilers = require('./compilers'); -+var parsers = require('./parsers'); -+var utils = require('./utils'); -+ -+/** -+ * Customize Snapdragon parser and renderer -+ */ -+ -+function Braces(options) { -+ this.options = extend({}, options); -+} -+ -+/** -+ * Initialize braces -+ */ -+ -+Braces.prototype.init = function(options) { -+ if (this.isInitialized) return; -+ this.isInitialized = true; -+ var opts = utils.createOptions({}, this.options, options); -+ this.snapdragon = this.options.snapdragon || new Snapdragon(opts); -+ this.compiler = this.snapdragon.compiler; -+ this.parser = this.snapdragon.parser; -+ -+ compilers(this.snapdragon, opts); -+ parsers(this.snapdragon, opts); -+ -+ /** -+ * Call Snapdragon `.parse` method. When AST is returned, we check to -+ * see if any unclosed braces are left on the stack and, if so, we iterate -+ * over the stack and correct the AST so that compilers are called in the correct -+ * order and unbalance braces are properly escaped. -+ */ -+ -+ utils.define(this.snapdragon, 'parse', function(pattern, options) { -+ var parsed = Snapdragon.prototype.parse.apply(this, arguments); -+ this.parser.ast.input = pattern; -+ -+ var stack = this.parser.stack; -+ while (stack.length) { -+ addParent({type: 'brace.close', val: ''}, stack.pop()); -+ } -+ -+ function addParent(node, parent) { -+ utils.define(node, 'parent', parent); -+ parent.nodes.push(node); -+ } -+ -+ // add non-enumerable parser reference -+ utils.define(parsed, 'parser', this.parser); -+ return parsed; -+ }); -+}; -+ -+/** -+ * Decorate `.parse` method -+ */ -+ -+Braces.prototype.parse = function(ast, options) { -+ if (ast && typeof ast === 'object' && ast.nodes) return ast; -+ this.init(options); -+ return this.snapdragon.parse(ast, options); -+}; -+ -+/** -+ * Decorate `.compile` method -+ */ -+ -+Braces.prototype.compile = function(ast, options) { -+ if (typeof ast === 'string') { -+ ast = this.parse(ast, options); -+ } else { -+ this.init(options); -+ } -+ return this.snapdragon.compile(ast, options); -+}; -+ -+/** -+ * Expand -+ */ -+ -+Braces.prototype.expand = function(pattern) { -+ var ast = this.parse(pattern, {expand: true}); -+ return this.compile(ast, {expand: true}); -+}; -+ -+/** -+ * Optimize -+ */ -+ -+Braces.prototype.optimize = function(pattern) { -+ var ast = this.parse(pattern, {optimize: true}); -+ return this.compile(ast, {optimize: true}); -+}; -+ -+/** -+ * Expose `Braces` -+ */ -+ -+module.exports = Braces; -+ -+}, -+"7w1mBMb611UaIDwDE/kk4R2UMbkYwbzpIniaTVYQPW8=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require("fs"), -+ stream = require("stream-source"); -+ -+module.exports = function(path, options) { -+ var highWaterMark = 65536; -+ if (options && options.highWaterMark != null) highWaterMark = options.highWaterMark; -+ return new Promise(function(resolve, reject) { -+ var f = fs.createReadStream(path, {highWaterMark: highWaterMark}); -+ f.once("open", function() { resolve(stream(f)); }); -+ f.once("error", reject); -+ }); -+}; -+ -+}, -+"7y1jYS/fheFuuK+P6e7VFRvd85TYIdYhnJiu2CKyPG0=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_oneOf(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $valid = 'valid' + $lvl; -+ var $errs = 'errs__' + $lvl; -+ var $it = it.util.copy(it); -+ var $closingBraces = ''; -+ $it.level++; -+ var $nextValid = 'valid' + $it.level; -+ var $currentBaseId = $it.baseId, -+ $prevValid = 'prevValid' + $lvl, -+ $passingSchemas = 'passingSchemas' + $lvl; -+ out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; -+ var $wasComposite = it.compositeRule; -+ it.compositeRule = $it.compositeRule = true; -+ var arr1 = $schema; -+ if (arr1) { -+ var $sch, $i = -1, -+ l1 = arr1.length - 1; -+ while ($i < l1) { -+ $sch = arr1[$i += 1]; -+ if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { -+ $it.schema = $sch; -+ $it.schemaPath = $schemaPath + '[' + $i + ']'; -+ $it.errSchemaPath = $errSchemaPath + '/' + $i; -+ out += ' ' + (it.validate($it)) + ' '; -+ $it.baseId = $currentBaseId; -+ } else { -+ out += ' var ' + ($nextValid) + ' = true; '; -+ } -+ if ($i) { -+ out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; -+ $closingBraces += '}'; -+ } -+ out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; -+ } -+ } -+ it.compositeRule = $it.compositeRule = $wasComposite; -+ out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should match exactly one schema in oneOf\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError(vErrors); '; -+ } else { -+ out += ' validate.errors = vErrors; return false; '; -+ } -+ } -+ out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; -+ if (it.opts.allErrors) { -+ out += ' } '; -+ } -+ return out; -+} -+ -+}, -+"8/IutGIDGwgyZvmBCmbfxsnZoYb9XBCj98AWsGzVNf8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// We define these manually to ensure they're always copied -+// even if they would move up the prototype chain -+// https://nodejs.org/api/http.html#http_class_http_incomingmessage -+const knownProps = [ -+ 'destroy', -+ 'setTimeout', -+ 'socket', -+ 'headers', -+ 'trailers', -+ 'rawHeaders', -+ 'statusCode', -+ 'httpVersion', -+ 'httpVersionMinor', -+ 'httpVersionMajor', -+ 'rawTrailers', -+ 'statusMessage' -+]; -+ -+module.exports = (fromStream, toStream) => { -+ const fromProps = new Set(Object.keys(fromStream).concat(knownProps)); -+ -+ for (const prop of fromProps) { -+ // Don't overwrite existing properties -+ if (prop in toStream) { -+ continue; -+ } -+ -+ toStream[prop] = typeof fromStream[prop] === 'function' ? fromStream[prop].bind(fromStream) : fromStream[prop]; -+ } -+}; -+ -+}, -+"8/okJx1F67QhLST20QDLwQamFSpFx/aQBwxbUqyClRM=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+class LRU { -+ constructor (max = 0, ttl = 0) { -+ this.first = null; -+ this.items = Object.create(null); -+ this.last = null; -+ this.max = max; -+ this.size = 0; -+ this.ttl = ttl; -+ } -+ -+ has (key) { -+ return key in this.items; -+ } -+ -+ clear () { -+ this.first = null; -+ this.items = Object.create(null); -+ this.last = null; -+ this.size = 0; -+ -+ return this; -+ } -+ -+ delete (key) { -+ if (this.has(key)) { -+ const item = this.items[key]; -+ -+ delete this.items[key]; -+ this.size--; -+ -+ if (item.prev !== null) { -+ item.prev.next = item.next; -+ } -+ -+ if (item.next !== null) { -+ item.next.prev = item.prev; -+ } -+ -+ if (this.first === item) { -+ this.first = item.next; -+ } -+ -+ if (this.last === item) { -+ this.last = item.prev; -+ } -+ } -+ -+ return this; -+ } -+ -+ evict () { -+ const item = this.first; -+ -+ delete this.items[item.key]; -+ this.first = item.next; -+ this.first.prev = null; -+ this.size--; -+ -+ return this; -+ } -+ -+ get (key) { -+ let result; -+ -+ if (this.has(key)) { -+ const item = this.items[key]; -+ -+ if (this.ttl > 0 && item.expiry <= new Date().getTime()) { -+ this.delete(key); -+ } else { -+ result = item.value; -+ this.set(key, result, true); -+ } -+ } -+ -+ return result; -+ } -+ -+ keys () { -+ return Object.keys(this.items); -+ } -+ -+ set (key, value, bypass = false) { -+ let item; -+ -+ if (bypass || this.has(key)) { -+ item = this.items[key]; -+ item.value = value; -+ -+ if (bypass === false) { -+ item.expiry = this.ttl > 0 ? new Date().getTime() + this.ttl : this.ttl; -+ } -+ -+ if (this.last !== item) { -+ const last = this.last, -+ next = item.next, -+ prev = item.prev; -+ -+ if (this.first === item) { -+ this.first = item.next; -+ } -+ -+ item.next = null; -+ item.prev = this.last; -+ last.next = item; -+ -+ if (prev !== null) { -+ prev.next = next; -+ } -+ -+ if (next !== null) { -+ next.prev = prev; -+ } -+ } -+ } else { -+ if (this.max > 0 && this.size === this.max) { -+ this.evict(); -+ } -+ -+ item = this.items[key] = { -+ expiry: this.ttl > 0 ? new Date().getTime() + this.ttl : this.ttl, -+ key: key, -+ prev: this.last, -+ next: null, -+ value -+ }; -+ -+ if (++this.size === 1) { -+ this.first = item; -+ } else { -+ this.last.next = item; -+ } -+ } -+ -+ this.last = item; -+ -+ return this; -+ } -+ } -+ -+ function factory (max = 1000, ttl = 0) { -+ if (isNaN(max) || max < 0) { -+ throw new TypeError("Invalid max value"); -+ } -+ -+ if (isNaN(ttl) || ttl < 0) { -+ throw new TypeError("Invalid ttl value"); -+ } -+ -+ return new LRU(max, ttl); -+ } -+ -+module.exports = factory; -+ -+}, -+"80B+Uo9U7AeHvQpx7qwMmf/9mERZFvy+EW3GnKO+kos=": -+function (require, module, exports, __dirname, __filename) { -+/* -*- Mode: js; js-indent-level: 2; -*- */ -+/* -+ * Copyright 2011 Mozilla Foundation and contributors -+ * Licensed under the New BSD license. See LICENSE or: -+ * http://opensource.org/licenses/BSD-3-Clause -+ * -+ * Based on the Base 64 VLQ implementation in Closure Compiler: -+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java -+ * -+ * Copyright 2011 The Closure Compiler Authors. All rights reserved. -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions are -+ * met: -+ * -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above -+ * copyright notice, this list of conditions and the following -+ * disclaimer in the documentation and/or other materials provided -+ * with the distribution. -+ * * Neither the name of Google Inc. nor the names of its -+ * contributors may be used to endorse or promote products derived -+ * from this software without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+var base64 = require('./base64'); -+ -+// A single base 64 digit can contain 6 bits of data. For the base 64 variable -+// length quantities we use in the source map spec, the first bit is the sign, -+// the next four bits are the actual value, and the 6th bit is the -+// continuation bit. The continuation bit tells us whether there are more -+// digits in this value following this digit. -+// -+// Continuation -+// | Sign -+// | | -+// V V -+// 101011 -+ -+var VLQ_BASE_SHIFT = 5; -+ -+// binary: 100000 -+var VLQ_BASE = 1 << VLQ_BASE_SHIFT; -+ -+// binary: 011111 -+var VLQ_BASE_MASK = VLQ_BASE - 1; -+ -+// binary: 100000 -+var VLQ_CONTINUATION_BIT = VLQ_BASE; -+ -+/** -+ * Converts from a two-complement value to a value where the sign bit is -+ * placed in the least significant bit. For example, as decimals: -+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) -+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) -+ */ -+function toVLQSigned(aValue) { -+ return aValue < 0 -+ ? ((-aValue) << 1) + 1 -+ : (aValue << 1) + 0; -+} -+ -+/** -+ * Converts to a two-complement value from a value where the sign bit is -+ * placed in the least significant bit. For example, as decimals: -+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 -+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 -+ */ -+function fromVLQSigned(aValue) { -+ var isNegative = (aValue & 1) === 1; -+ var shifted = aValue >> 1; -+ return isNegative -+ ? -shifted -+ : shifted; -+} -+ -+/** -+ * Returns the base 64 VLQ encoded value. -+ */ -+exports.encode = function base64VLQ_encode(aValue) { -+ var encoded = ""; -+ var digit; -+ -+ var vlq = toVLQSigned(aValue); -+ -+ do { -+ digit = vlq & VLQ_BASE_MASK; -+ vlq >>>= VLQ_BASE_SHIFT; -+ if (vlq > 0) { -+ // There are still more digits in this value, so we must make sure the -+ // continuation bit is marked. -+ digit |= VLQ_CONTINUATION_BIT; -+ } -+ encoded += base64.encode(digit); -+ } while (vlq > 0); -+ -+ return encoded; -+}; -+ -+/** -+ * Decodes the next base 64 VLQ value from the given string and returns the -+ * value and the rest of the string via the out parameter. -+ */ -+exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { -+ var strLen = aStr.length; -+ var result = 0; -+ var shift = 0; -+ var continuation, digit; -+ -+ do { -+ if (aIndex >= strLen) { -+ throw new Error("Expected more digits in base 64 VLQ value."); -+ } -+ -+ digit = base64.decode(aStr.charCodeAt(aIndex++)); -+ if (digit === -1) { -+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); -+ } -+ -+ continuation = !!(digit & VLQ_CONTINUATION_BIT); -+ digit &= VLQ_BASE_MASK; -+ result = result + (digit << shift); -+ shift += VLQ_BASE_SHIFT; -+ } while (continuation); -+ -+ aOutParam.value = fromVLQSigned(result); -+ aOutParam.rest = aIndex; -+}; -+ -+}, -+"82g5zvC5/VbZoaKQi0dVEcTIIeM//3k3q1cEqD8mMus=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function (Promise, apiRejection, tryConvertToPromise, -+ createContext, INTERNAL, debug) { -+ var util = require("./util"); -+ var TypeError = require("./errors").TypeError; -+ var inherits = require("./util").inherits; -+ var errorObj = util.errorObj; -+ var tryCatch = util.tryCatch; -+ var NULL = {}; -+ -+ function thrower(e) { -+ setTimeout(function(){throw e;}, 0); -+ } -+ -+ function castPreservingDisposable(thenable) { -+ var maybePromise = tryConvertToPromise(thenable); -+ if (maybePromise !== thenable && -+ typeof thenable._isDisposable === "function" && -+ typeof thenable._getDisposer === "function" && -+ thenable._isDisposable()) { -+ maybePromise._setDisposable(thenable._getDisposer()); -+ } -+ return maybePromise; -+ } -+ function dispose(resources, inspection) { -+ var i = 0; -+ var len = resources.length; -+ var ret = new Promise(INTERNAL); -+ function iterator() { -+ if (i >= len) return ret._fulfill(); -+ var maybePromise = castPreservingDisposable(resources[i++]); -+ if (maybePromise instanceof Promise && -+ maybePromise._isDisposable()) { -+ try { -+ maybePromise = tryConvertToPromise( -+ maybePromise._getDisposer().tryDispose(inspection), -+ resources.promise); -+ } catch (e) { -+ return thrower(e); -+ } -+ if (maybePromise instanceof Promise) { -+ return maybePromise._then(iterator, thrower, -+ null, null, null); -+ } -+ } -+ iterator(); -+ } -+ iterator(); -+ return ret; -+ } -+ -+ function Disposer(data, promise, context) { -+ this._data = data; -+ this._promise = promise; -+ this._context = context; -+ } -+ -+ Disposer.prototype.data = function () { -+ return this._data; -+ }; -+ -+ Disposer.prototype.promise = function () { -+ return this._promise; -+ }; -+ -+ Disposer.prototype.resource = function () { -+ if (this.promise().isFulfilled()) { -+ return this.promise().value(); -+ } -+ return NULL; -+ }; -+ -+ Disposer.prototype.tryDispose = function(inspection) { -+ var resource = this.resource(); -+ var context = this._context; -+ if (context !== undefined) context._pushContext(); -+ var ret = resource !== NULL -+ ? this.doDispose(resource, inspection) : null; -+ if (context !== undefined) context._popContext(); -+ this._promise._unsetDisposable(); -+ this._data = null; -+ return ret; -+ }; -+ -+ Disposer.isDisposer = function (d) { -+ return (d != null && -+ typeof d.resource === "function" && -+ typeof d.tryDispose === "function"); -+ }; -+ -+ function FunctionDisposer(fn, promise, context) { -+ this.constructor$(fn, promise, context); -+ } -+ inherits(FunctionDisposer, Disposer); -+ -+ FunctionDisposer.prototype.doDispose = function (resource, inspection) { -+ var fn = this.data(); -+ return fn.call(resource, resource, inspection); -+ }; -+ -+ function maybeUnwrapDisposer(value) { -+ if (Disposer.isDisposer(value)) { -+ this.resources[this.index]._setDisposable(value); -+ return value.promise(); -+ } -+ return value; -+ } -+ -+ function ResourceList(length) { -+ this.length = length; -+ this.promise = null; -+ this[length-1] = null; -+ } -+ -+ ResourceList.prototype._resultCancelled = function() { -+ var len = this.length; -+ for (var i = 0; i < len; ++i) { -+ var item = this[i]; -+ if (item instanceof Promise) { -+ item.cancel(); -+ } -+ } -+ }; -+ -+ Promise.using = function () { -+ var len = arguments.length; -+ if (len < 2) return apiRejection( -+ "you must pass at least 2 arguments to Promise.using"); -+ var fn = arguments[len - 1]; -+ if (typeof fn !== "function") { -+ return apiRejection("expecting a function but got " + util.classString(fn)); -+ } -+ var input; -+ var spreadArgs = true; -+ if (len === 2 && Array.isArray(arguments[0])) { -+ input = arguments[0]; -+ len = input.length; -+ spreadArgs = false; -+ } else { -+ input = arguments; -+ len--; -+ } -+ var resources = new ResourceList(len); -+ for (var i = 0; i < len; ++i) { -+ var resource = input[i]; -+ if (Disposer.isDisposer(resource)) { -+ var disposer = resource; -+ resource = resource.promise(); -+ resource._setDisposable(disposer); -+ } else { -+ var maybePromise = tryConvertToPromise(resource); -+ if (maybePromise instanceof Promise) { -+ resource = -+ maybePromise._then(maybeUnwrapDisposer, null, null, { -+ resources: resources, -+ index: i -+ }, undefined); -+ } -+ } -+ resources[i] = resource; -+ } -+ -+ var reflectedResources = new Array(resources.length); -+ for (var i = 0; i < reflectedResources.length; ++i) { -+ reflectedResources[i] = Promise.resolve(resources[i]).reflect(); -+ } -+ -+ var resultPromise = Promise.all(reflectedResources) -+ .then(function(inspections) { -+ for (var i = 0; i < inspections.length; ++i) { -+ var inspection = inspections[i]; -+ if (inspection.isRejected()) { -+ errorObj.e = inspection.error(); -+ return errorObj; -+ } else if (!inspection.isFulfilled()) { -+ resultPromise.cancel(); -+ return; -+ } -+ inspections[i] = inspection.value(); -+ } -+ promise._pushContext(); -+ -+ fn = tryCatch(fn); -+ var ret = spreadArgs -+ ? fn.apply(undefined, inspections) : fn(inspections); -+ var promiseCreated = promise._popContext(); -+ debug.checkForgottenReturns( -+ ret, promiseCreated, "Promise.using", promise); -+ return ret; -+ }); -+ -+ var promise = resultPromise.lastly(function() { -+ var inspection = new Promise.PromiseInspection(resultPromise); -+ return dispose(resources, inspection); -+ }); -+ resources.promise = promise; -+ promise._setOnCancel(resources); -+ return promise; -+ }; -+ -+ Promise.prototype._setDisposable = function (disposer) { -+ this._bitField = this._bitField | 131072; -+ this._disposer = disposer; -+ }; -+ -+ Promise.prototype._isDisposable = function () { -+ return (this._bitField & 131072) > 0; -+ }; -+ -+ Promise.prototype._getDisposer = function () { -+ return this._disposer; -+ }; -+ -+ Promise.prototype._unsetDisposable = function () { -+ this._bitField = this._bitField & (~131072); -+ this._disposer = undefined; -+ }; -+ -+ Promise.prototype.disposer = function (fn) { -+ if (typeof fn === "function") { -+ return new FunctionDisposer(fn, this, createContext()); -+ } -+ throw new TypeError(); -+ }; -+ -+}; -+ -+}, -+"883xJseXyl11PHXIlEpgTB7NkK60wF+UopQEHmLTjZk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const fs = require('./wrapped-fs') -+const path = require('path') -+const tmp = require('tmp-promise') -+const UINT64 = require('cuint').UINT64 -+ -+const UINT32_MAX = 4294967295 -+ -+class Filesystem { -+ constructor (src) { -+ this.src = path.resolve(src) -+ this.header = { files: {} } -+ this.offset = UINT64(0) -+ } -+ -+ searchNodeFromDirectory (p) { -+ let json = this.header -+ const dirs = p.split(path.sep) -+ for (const dir of dirs) { -+ if (dir !== '.') { -+ json = json.files[dir] -+ } -+ } -+ return json -+ } -+ -+ searchNodeFromPath (p) { -+ p = path.relative(this.src, p) -+ if (!p) { return this.header } -+ const name = path.basename(p) -+ const node = this.searchNodeFromDirectory(path.dirname(p)) -+ if (node.files == null) { -+ node.files = {} -+ } -+ if (node.files[name] == null) { -+ node.files[name] = {} -+ } -+ return node.files[name] -+ } -+ -+ insertDirectory (p, shouldUnpack) { -+ const node = this.searchNodeFromPath(p) -+ if (shouldUnpack) { -+ node.unpacked = shouldUnpack -+ } -+ node.files = {} -+ return node.files -+ } -+ -+ async insertFile (p, shouldUnpack, file, options) { -+ const dirNode = this.searchNodeFromPath(path.dirname(p)) -+ const node = this.searchNodeFromPath(p) -+ if (shouldUnpack || dirNode.unpacked) { -+ node.size = file.stat.size -+ node.unpacked = true -+ return Promise.resolve() -+ } -+ -+ const handler = (resolve, reject) => { -+ const size = file.transformed ? file.transformed.stat.size : file.stat.size -+ -+ // JavaScript can not precisely present integers >= UINT32_MAX. -+ if (size > UINT32_MAX) { -+ const error = new Error(`${p}: file size can not be larger than 4.2GB`) -+ if (reject) { -+ return reject(error) -+ } else { -+ throw error -+ } -+ } -+ -+ node.size = size -+ node.offset = this.offset.toString() -+ if (process.platform !== 'win32' && (file.stat.mode & 0o100)) { -+ node.executable = true -+ } -+ this.offset.add(UINT64(size)) -+ -+ return resolve ? resolve() : Promise.resolve() -+ } -+ -+ const transformed = options.transform && options.transform(p) -+ if (transformed) { -+ const tmpfile = await tmp.file() -+ return new Promise((resolve, reject) => { -+ const out = fs.createWriteStream(tmpfile.path) -+ const stream = fs.createReadStream(p) -+ -+ stream.pipe(transformed).pipe(out) -+ return out.on('close', async () => { -+ file.transformed = { -+ path: tmpfile.path, -+ stat: await fs.lstat(tmpfile.path) -+ } -+ return handler(resolve, reject) -+ }) -+ }) -+ } else { -+ return handler() -+ } -+ } -+ -+ insertLink (p) { -+ const link = path.relative(fs.realpathSync(this.src), fs.realpathSync(p)) -+ if (link.substr(0, 2) === '..') { -+ throw new Error(`${p}: file links out of the package`) -+ } -+ const node = this.searchNodeFromPath(p) -+ node.link = link -+ return link -+ } -+ -+ listFiles (options) { -+ const files = [] -+ -+ const fillFilesFromMetadata = function (basePath, metadata) { -+ if (!metadata.files) { -+ return -+ } -+ -+ for (const [childPath, childMetadata] of Object.entries(metadata.files)) { -+ const fullPath = path.join(basePath, childPath) -+ const packState = childMetadata.unpacked ? 'unpack' : 'pack ' -+ files.push((options && options.isPack) ? `${packState} : ${fullPath}` : fullPath) -+ fillFilesFromMetadata(fullPath, childMetadata) -+ } -+ } -+ -+ fillFilesFromMetadata('/', this.header) -+ return files -+ } -+ -+ getNode (p) { -+ const node = this.searchNodeFromDirectory(path.dirname(p)) -+ const name = path.basename(p) -+ if (name) { -+ return node.files[name] -+ } else { -+ return node -+ } -+ } -+ -+ getFile (p, followLinks) { -+ followLinks = typeof followLinks === 'undefined' ? true : followLinks -+ const info = this.getNode(p) -+ -+ // if followLinks is false we don't resolve symlinks -+ if (info.link && followLinks) { -+ return this.getFile(info.link) -+ } else { -+ return info -+ } -+ } -+} -+ -+module.exports = Filesystem -+ -+}, -+"8BslEdcMlpAWDotZKd337wadtnUwv/HNEuho6lorL+k=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var utils = require('./utils'); -+var define = require('define-property'); -+ -+/** -+ * Text regex -+ */ -+ -+var TEXT_REGEX = '(\\[(?=.*\\])|\\])+'; -+var not = utils.createRegex(TEXT_REGEX); -+ -+/** -+ * Brackets parsers -+ */ -+ -+function parsers(brackets) { -+ brackets.state = brackets.state || {}; -+ brackets.parser.sets.bracket = brackets.parser.sets.bracket || []; -+ brackets.parser -+ -+ .capture('escape', function() { -+ if (this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(/^\\(.)/); -+ if (!m) return; -+ -+ return pos({ -+ type: 'escape', -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * Text parser -+ */ -+ -+ .capture('text', function() { -+ if (this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(not); -+ if (!m || !m[0]) return; -+ -+ return pos({ -+ type: 'text', -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * POSIX character classes: "[[:alpha:][:digits:]]" -+ */ -+ -+ .capture('posix', function() { -+ var pos = this.position(); -+ var m = this.match(/^\[:(.*?):\](?=.*\])/); -+ if (!m) return; -+ -+ var inside = this.isInside('bracket'); -+ if (inside) { -+ brackets.posix++; -+ } -+ -+ return pos({ -+ type: 'posix', -+ insideBracket: inside, -+ inner: m[1], -+ val: m[0] -+ }); -+ }) -+ -+ /** -+ * Bracket (noop) -+ */ -+ -+ .capture('bracket', function() {}) -+ -+ /** -+ * Open: '[' -+ */ -+ -+ .capture('bracket.open', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(/^\[(?=.*\])/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ -+ if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { -+ last.val = last.val.slice(0, last.val.length - 1); -+ return pos({ -+ type: 'escape', -+ val: m[0] -+ }); -+ } -+ -+ var open = pos({ -+ type: 'bracket.open', -+ val: m[0] -+ }); -+ -+ if (last.type === 'bracket.open' || this.isInside('bracket')) { -+ open.val = '\\' + open.val; -+ open.type = 'bracket.inner'; -+ open.escaped = true; -+ return open; -+ } -+ -+ var node = pos({ -+ type: 'bracket', -+ nodes: [open] -+ }); -+ -+ define(node, 'parent', prev); -+ define(open, 'parent', node); -+ this.push('bracket', node); -+ prev.nodes.push(node); -+ }) -+ -+ /** -+ * Bracket text -+ */ -+ -+ .capture('bracket.inner', function() { -+ if (!this.isInside('bracket')) return; -+ var pos = this.position(); -+ var m = this.match(not); -+ if (!m || !m[0]) return; -+ -+ var next = this.input.charAt(0); -+ var val = m[0]; -+ -+ var node = pos({ -+ type: 'bracket.inner', -+ val: val -+ }); -+ -+ if (val === '\\\\') { -+ return node; -+ } -+ -+ var first = val.charAt(0); -+ var last = val.slice(-1); -+ -+ if (first === '!') { -+ val = '^' + val.slice(1); -+ } -+ -+ if (last === '\\' || (val === '^' && next === ']')) { -+ val += this.input[0]; -+ this.consume(1); -+ } -+ -+ node.val = val; -+ return node; -+ }) -+ -+ /** -+ * Close: ']' -+ */ -+ -+ .capture('bracket.close', function() { -+ var parsed = this.parsed; -+ var pos = this.position(); -+ var m = this.match(/^\]/); -+ if (!m) return; -+ -+ var prev = this.prev(); -+ var last = utils.last(prev.nodes); -+ -+ if (parsed.slice(-1) === '\\' && !this.isInside('bracket')) { -+ last.val = last.val.slice(0, last.val.length - 1); -+ -+ return pos({ -+ type: 'escape', -+ val: m[0] -+ }); -+ } -+ -+ var node = pos({ -+ type: 'bracket.close', -+ rest: this.input, -+ val: m[0] -+ }); -+ -+ if (last.type === 'bracket.open') { -+ node.type = 'bracket.inner'; -+ node.escaped = true; -+ return node; -+ } -+ -+ var bracket = this.pop('bracket'); -+ if (!this.isType(bracket, 'bracket')) { -+ if (this.options.strict) { -+ throw new Error('missing opening "["'); -+ } -+ node.type = 'bracket.inner'; -+ node.escaped = true; -+ return node; -+ } -+ -+ bracket.nodes.push(node); -+ define(node, 'parent', bracket); -+ }); -+} -+ -+/** -+ * Brackets parsers -+ */ -+ -+module.exports = parsers; -+ -+/** -+ * Expose text regex -+ */ -+ -+module.exports.TEXT_REGEX = TEXT_REGEX; -+ -+}, -+"8EwE6eQOoa2peh5BStJthx+qB3jjsfsNX8Zuxqy8JD8=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = globSync -+globSync.GlobSync = GlobSync -+ -+var fs = require('fs') -+var rp = require('fs.realpath') -+var minimatch = require('minimatch') -+var Minimatch = minimatch.Minimatch -+var Glob = require('./glob.js').Glob -+var util = require('util') -+var path = require('path') -+var assert = require('assert') -+var isAbsolute = require('path-is-absolute') -+var common = require('./common.js') -+var alphasort = common.alphasort -+var alphasorti = common.alphasorti -+var setopts = common.setopts -+var ownProp = common.ownProp -+var childrenIgnored = common.childrenIgnored -+var isIgnored = common.isIgnored -+ -+function globSync (pattern, options) { -+ if (typeof options === 'function' || arguments.length === 3) -+ throw new TypeError('callback provided to sync glob\n'+ -+ 'See: https://github.com/isaacs/node-glob/issues/167') -+ -+ return new GlobSync(pattern, options).found -+} -+ -+function GlobSync (pattern, options) { -+ if (!pattern) -+ throw new Error('must provide pattern') -+ -+ if (typeof options === 'function' || arguments.length === 3) -+ throw new TypeError('callback provided to sync glob\n'+ -+ 'See: https://github.com/isaacs/node-glob/issues/167') -+ -+ if (!(this instanceof GlobSync)) -+ return new GlobSync(pattern, options) -+ -+ setopts(this, pattern, options) -+ -+ if (this.noprocess) -+ return this -+ -+ var n = this.minimatch.set.length -+ this.matches = new Array(n) -+ for (var i = 0; i < n; i ++) { -+ this._process(this.minimatch.set[i], i, false) -+ } -+ this._finish() -+} -+ -+GlobSync.prototype._finish = function () { -+ assert(this instanceof GlobSync) -+ if (this.realpath) { -+ var self = this -+ this.matches.forEach(function (matchset, index) { -+ var set = self.matches[index] = Object.create(null) -+ for (var p in matchset) { -+ try { -+ p = self._makeAbs(p) -+ var real = rp.realpathSync(p, self.realpathCache) -+ set[real] = true -+ } catch (er) { -+ if (er.syscall === 'stat') -+ set[self._makeAbs(p)] = true -+ else -+ throw er -+ } -+ } -+ }) -+ } -+ common.finish(this) -+} -+ -+ -+GlobSync.prototype._process = function (pattern, index, inGlobStar) { -+ assert(this instanceof GlobSync) -+ -+ // Get the first [n] parts of pattern that are all strings. -+ var n = 0 -+ while (typeof pattern[n] === 'string') { -+ n ++ -+ } -+ // now n is the index of the first one that is *not* a string. -+ -+ // See if there's anything else -+ var prefix -+ switch (n) { -+ // if not, then this is rather simple -+ case pattern.length: -+ this._processSimple(pattern.join('/'), index) -+ return -+ -+ case 0: -+ // pattern *starts* with some non-trivial item. -+ // going to readdir(cwd), but not include the prefix in matches. -+ prefix = null -+ break -+ -+ default: -+ // pattern has some string bits in the front. -+ // whatever it starts with, whether that's 'absolute' like /foo/bar, -+ // or 'relative' like '../baz' -+ prefix = pattern.slice(0, n).join('/') -+ break -+ } -+ -+ var remain = pattern.slice(n) -+ -+ // get the list of entries. -+ var read -+ if (prefix === null) -+ read = '.' -+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { -+ if (!prefix || !isAbsolute(prefix)) -+ prefix = '/' + prefix -+ read = prefix -+ } else -+ read = prefix -+ -+ var abs = this._makeAbs(read) -+ -+ //if ignored, skip processing -+ if (childrenIgnored(this, read)) -+ return -+ -+ var isGlobStar = remain[0] === minimatch.GLOBSTAR -+ if (isGlobStar) -+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) -+ else -+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -+} -+ -+ -+GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { -+ var entries = this._readdir(abs, inGlobStar) -+ -+ // if the abs isn't a dir, then nothing can match! -+ if (!entries) -+ return -+ -+ // It will only match dot entries if it starts with a dot, or if -+ // dot is set. Stuff like @(.foo|.bar) isn't allowed. -+ var pn = remain[0] -+ var negate = !!this.minimatch.negate -+ var rawGlob = pn._glob -+ var dotOk = this.dot || rawGlob.charAt(0) === '.' -+ -+ var matchedEntries = [] -+ for (var i = 0; i < entries.length; i++) { -+ var e = entries[i] -+ if (e.charAt(0) !== '.' || dotOk) { -+ var m -+ if (negate && !prefix) { -+ m = !e.match(pn) -+ } else { -+ m = e.match(pn) -+ } -+ if (m) -+ matchedEntries.push(e) -+ } -+ } -+ -+ var len = matchedEntries.length -+ // If there are no matched entries, then nothing matches. -+ if (len === 0) -+ return -+ -+ // if this is the last remaining pattern bit, then no need for -+ // an additional stat *unless* the user has specified mark or -+ // stat explicitly. We know they exist, since readdir returned -+ // them. -+ -+ if (remain.length === 1 && !this.mark && !this.stat) { -+ if (!this.matches[index]) -+ this.matches[index] = Object.create(null) -+ -+ for (var i = 0; i < len; i ++) { -+ var e = matchedEntries[i] -+ if (prefix) { -+ if (prefix.slice(-1) !== '/') -+ e = prefix + '/' + e -+ else -+ e = prefix + e -+ } -+ -+ if (e.charAt(0) === '/' && !this.nomount) { -+ e = path.join(this.root, e) -+ } -+ this._emitMatch(index, e) -+ } -+ // This was the last one, and no stats were needed -+ return -+ } -+ -+ // now test all matched entries as stand-ins for that part -+ // of the pattern. -+ remain.shift() -+ for (var i = 0; i < len; i ++) { -+ var e = matchedEntries[i] -+ var newPattern -+ if (prefix) -+ newPattern = [prefix, e] -+ else -+ newPattern = [e] -+ this._process(newPattern.concat(remain), index, inGlobStar) -+ } -+} -+ -+ -+GlobSync.prototype._emitMatch = function (index, e) { -+ if (isIgnored(this, e)) -+ return -+ -+ var abs = this._makeAbs(e) -+ -+ if (this.mark) -+ e = this._mark(e) -+ -+ if (this.absolute) { -+ e = abs -+ } -+ -+ if (this.matches[index][e]) -+ return -+ -+ if (this.nodir) { -+ var c = this.cache[abs] -+ if (c === 'DIR' || Array.isArray(c)) -+ return -+ } -+ -+ this.matches[index][e] = true -+ -+ if (this.stat) -+ this._stat(e) -+} -+ -+ -+GlobSync.prototype._readdirInGlobStar = function (abs) { -+ // follow all symlinked directories forever -+ // just proceed as if this is a non-globstar situation -+ if (this.follow) -+ return this._readdir(abs, false) -+ -+ var entries -+ var lstat -+ var stat -+ try { -+ lstat = fs.lstatSync(abs) -+ } catch (er) { -+ if (er.code === 'ENOENT') { -+ // lstat failed, doesn't exist -+ return null -+ } -+ } -+ -+ var isSym = lstat && lstat.isSymbolicLink() -+ this.symlinks[abs] = isSym -+ -+ // If it's not a symlink or a dir, then it's definitely a regular file. -+ // don't bother doing a readdir in that case. -+ if (!isSym && lstat && !lstat.isDirectory()) -+ this.cache[abs] = 'FILE' -+ else -+ entries = this._readdir(abs, false) -+ -+ return entries -+} -+ -+GlobSync.prototype._readdir = function (abs, inGlobStar) { -+ var entries -+ -+ if (inGlobStar && !ownProp(this.symlinks, abs)) -+ return this._readdirInGlobStar(abs) -+ -+ if (ownProp(this.cache, abs)) { -+ var c = this.cache[abs] -+ if (!c || c === 'FILE') -+ return null -+ -+ if (Array.isArray(c)) -+ return c -+ } -+ -+ try { -+ return this._readdirEntries(abs, fs.readdirSync(abs)) -+ } catch (er) { -+ this._readdirError(abs, er) -+ return null -+ } -+} -+ -+GlobSync.prototype._readdirEntries = function (abs, entries) { -+ // if we haven't asked to stat everything, then just -+ // assume that everything in there exists, so we can avoid -+ // having to stat it a second time. -+ if (!this.mark && !this.stat) { -+ for (var i = 0; i < entries.length; i ++) { -+ var e = entries[i] -+ if (abs === '/') -+ e = abs + e -+ else -+ e = abs + '/' + e -+ this.cache[e] = true -+ } -+ } -+ -+ this.cache[abs] = entries -+ -+ // mark and cache dir-ness -+ return entries -+} -+ -+GlobSync.prototype._readdirError = function (f, er) { -+ // handle errors, and cache the information -+ switch (er.code) { -+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 -+ case 'ENOTDIR': // totally normal. means it *does* exist. -+ var abs = this._makeAbs(f) -+ this.cache[abs] = 'FILE' -+ if (abs === this.cwdAbs) { -+ var error = new Error(er.code + ' invalid cwd ' + this.cwd) -+ error.path = this.cwd -+ error.code = er.code -+ throw error -+ } -+ break -+ -+ case 'ENOENT': // not terribly unusual -+ case 'ELOOP': -+ case 'ENAMETOOLONG': -+ case 'UNKNOWN': -+ this.cache[this._makeAbs(f)] = false -+ break -+ -+ default: // some unusual error. Treat as failure. -+ this.cache[this._makeAbs(f)] = false -+ if (this.strict) -+ throw er -+ if (!this.silent) -+ console.error('glob error', er) -+ break -+ } -+} -+ -+GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { -+ -+ var entries = this._readdir(abs, inGlobStar) -+ -+ // no entries means not a dir, so it can never have matches -+ // foo.txt/** doesn't match foo.txt -+ if (!entries) -+ return -+ -+ // test without the globstar, and with every child both below -+ // and replacing the globstar. -+ var remainWithoutGlobStar = remain.slice(1) -+ var gspref = prefix ? [ prefix ] : [] -+ var noGlobStar = gspref.concat(remainWithoutGlobStar) -+ -+ // the noGlobStar pattern exits the inGlobStar state -+ this._process(noGlobStar, index, false) -+ -+ var len = entries.length -+ var isSym = this.symlinks[abs] -+ -+ // If it's a symlink, and we're in a globstar, then stop -+ if (isSym && inGlobStar) -+ return -+ -+ for (var i = 0; i < len; i++) { -+ var e = entries[i] -+ if (e.charAt(0) === '.' && !this.dot) -+ continue -+ -+ // these two cases enter the inGlobStar state -+ var instead = gspref.concat(entries[i], remainWithoutGlobStar) -+ this._process(instead, index, true) -+ -+ var below = gspref.concat(entries[i], remain) -+ this._process(below, index, true) -+ } -+} -+ -+GlobSync.prototype._processSimple = function (prefix, index) { -+ // XXX review this. Shouldn't it be doing the mounting etc -+ // before doing stat? kinda weird? -+ var exists = this._stat(prefix) -+ -+ if (!this.matches[index]) -+ this.matches[index] = Object.create(null) -+ -+ // If it doesn't exist, then just mark the lack of results -+ if (!exists) -+ return -+ -+ if (prefix && isAbsolute(prefix) && !this.nomount) { -+ var trail = /[\/\\]$/.test(prefix) -+ if (prefix.charAt(0) === '/') { -+ prefix = path.join(this.root, prefix) -+ } else { -+ prefix = path.resolve(this.root, prefix) -+ if (trail) -+ prefix += '/' -+ } -+ } -+ -+ if (process.platform === 'win32') -+ prefix = prefix.replace(/\\/g, '/') -+ -+ // Mark this as a match -+ this._emitMatch(index, prefix) -+} -+ -+// Returns either 'DIR', 'FILE', or false -+GlobSync.prototype._stat = function (f) { -+ var abs = this._makeAbs(f) -+ var needDir = f.slice(-1) === '/' -+ -+ if (f.length > this.maxLength) -+ return false -+ -+ if (!this.stat && ownProp(this.cache, abs)) { -+ var c = this.cache[abs] -+ -+ if (Array.isArray(c)) -+ c = 'DIR' -+ -+ // It exists, but maybe not how we need it -+ if (!needDir || c === 'DIR') -+ return c -+ -+ if (needDir && c === 'FILE') -+ return false -+ -+ // otherwise we have to stat, because maybe c=true -+ // if we know it exists, but not what it is. -+ } -+ -+ var exists -+ var stat = this.statCache[abs] -+ if (!stat) { -+ var lstat -+ try { -+ lstat = fs.lstatSync(abs) -+ } catch (er) { -+ if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { -+ this.statCache[abs] = false -+ return false -+ } -+ } -+ -+ if (lstat && lstat.isSymbolicLink()) { -+ try { -+ stat = fs.statSync(abs) -+ } catch (er) { -+ stat = lstat -+ } -+ } else { -+ stat = lstat -+ } -+ } -+ -+ this.statCache[abs] = stat -+ -+ var c = true -+ if (stat) -+ c = stat.isDirectory() ? 'DIR' : 'FILE' -+ -+ this.cache[abs] = this.cache[abs] || c -+ -+ if (needDir && c === 'FILE') -+ return false -+ -+ return c -+} -+ -+GlobSync.prototype._mark = function (p) { -+ return common.mark(this, p) -+} -+ -+GlobSync.prototype._makeAbs = function (f) { -+ return common.makeAbs(this, f) -+} -+ -+}, -+"8FyTKAVbuin4WIiyKaG/r1dp0nyehRD0OV1TGdIavAI=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { inherits, format } = require('util') -+ -+function createError (code, message, statusCode = 500, Base = Error) { -+ if (!code) throw new Error('Fastify error code must not be empty') -+ if (!message) throw new Error('Fastify error message must not be empty') -+ -+ code = code.toUpperCase() -+ -+ function FastifyError (a, b, c) { -+ if (!(this instanceof FastifyError)) { -+ return new FastifyError(a, b, c) -+ } -+ Error.captureStackTrace(this, FastifyError) -+ this.name = 'FastifyError' -+ this.code = code -+ -+ // more performant than spread (...) operator -+ if (a && b && c) { -+ this.message = format(message, a, b, c) -+ } else if (a && b) { -+ this.message = format(message, a, b) -+ } else if (a) { -+ this.message = format(message, a) -+ } else { -+ this.message = message -+ } -+ -+ this.statusCode = statusCode || undefined -+ } -+ FastifyError.prototype[Symbol.toStringTag] = 'Error' -+ -+ FastifyError.prototype.toString = function () { -+ return `${this.name} [${this.code}]: ${this.message}` -+ } -+ -+ inherits(FastifyError, Base) -+ -+ return FastifyError -+} -+ -+module.exports = createError -+ -+}, -+"8ONFYfiyE4wPFW1U9VJlj01HQAr6TNXEhpI94umHjHE=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+'use strict'; -+ -+/**/ -+ -+var pna = require('process-nextick-args'); -+/**/ -+ -+module.exports = Readable; -+ -+/**/ -+var isArray = require('isarray'); -+/**/ -+ -+/**/ -+var Duplex; -+/**/ -+ -+Readable.ReadableState = ReadableState; -+ -+/**/ -+var EE = require('events').EventEmitter; -+ -+var EElistenerCount = function (emitter, type) { -+ return emitter.listeners(type).length; -+}; -+/**/ -+ -+/**/ -+var Stream = require('./internal/streams/stream'); -+/**/ -+ -+/**/ -+ -+var Buffer = require('safe-buffer').Buffer; -+var OurUint8Array = global.Uint8Array || function () {}; -+function _uint8ArrayToBuffer(chunk) { -+ return Buffer.from(chunk); -+} -+function _isUint8Array(obj) { -+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -+} -+ -+/**/ -+ -+/**/ -+var util = Object.create(require('core-util-is')); -+util.inherits = require('inherits'); -+/**/ -+ -+/**/ -+var debugUtil = require('util'); -+var debug = void 0; -+if (debugUtil && debugUtil.debuglog) { -+ debug = debugUtil.debuglog('stream'); -+} else { -+ debug = function () {}; -+} -+/**/ -+ -+var BufferList = require('./internal/streams/BufferList'); -+var destroyImpl = require('./internal/streams/destroy'); -+var StringDecoder; -+ -+util.inherits(Readable, Stream); -+ -+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; -+ -+function prependListener(emitter, event, fn) { -+ // Sadly this is not cacheable as some libraries bundle their own -+ // event emitter implementation with them. -+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); -+ -+ // This is a hack to make sure that our error handler is attached before any -+ // userland ones. NEVER DO THIS. This is here only because this code needs -+ // to continue to work with older versions of Node.js that do not include -+ // the prependListener() method. The goal is to eventually remove this hack. -+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -+} -+ -+function ReadableState(options, stream) { -+ Duplex = Duplex || require('./_stream_duplex'); -+ -+ options = options || {}; -+ -+ // Duplex streams are both readable and writable, but share -+ // the same options object. -+ // However, some cases require setting options to different -+ // values for the readable and the writable sides of the duplex stream. -+ // These options can be provided separately as readableXXX and writableXXX. -+ var isDuplex = stream instanceof Duplex; -+ -+ // object stream flag. Used to make read(n) ignore n and to -+ // make all the buffer merging and length checks go away -+ this.objectMode = !!options.objectMode; -+ -+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; -+ -+ // the point at which it stops calling _read() to fill the buffer -+ // Note: 0 is a valid value, means "don't call _read preemptively ever" -+ var hwm = options.highWaterMark; -+ var readableHwm = options.readableHighWaterMark; -+ var defaultHwm = this.objectMode ? 16 : 16 * 1024; -+ -+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; -+ -+ // cast to ints. -+ this.highWaterMark = Math.floor(this.highWaterMark); -+ -+ // A linked list is used to store data chunks instead of an array because the -+ // linked list can remove elements from the beginning faster than -+ // array.shift() -+ this.buffer = new BufferList(); -+ this.length = 0; -+ this.pipes = null; -+ this.pipesCount = 0; -+ this.flowing = null; -+ this.ended = false; -+ this.endEmitted = false; -+ this.reading = false; -+ -+ // a flag to be able to tell if the event 'readable'/'data' is emitted -+ // immediately, or on a later tick. We set this to true at first, because -+ // any actions that shouldn't happen until "later" should generally also -+ // not happen before the first read call. -+ this.sync = true; -+ -+ // whenever we return null, then we set a flag to say -+ // that we're awaiting a 'readable' event emission. -+ this.needReadable = false; -+ this.emittedReadable = false; -+ this.readableListening = false; -+ this.resumeScheduled = false; -+ -+ // has it been destroyed -+ this.destroyed = false; -+ -+ // Crypto is kind of old and crusty. Historically, its default string -+ // encoding is 'binary' so we have to make this configurable. -+ // Everything else in the universe uses 'utf8', though. -+ this.defaultEncoding = options.defaultEncoding || 'utf8'; -+ -+ // the number of writers that are awaiting a drain event in .pipe()s -+ this.awaitDrain = 0; -+ -+ // if true, a maybeReadMore has been scheduled -+ this.readingMore = false; -+ -+ this.decoder = null; -+ this.encoding = null; -+ if (options.encoding) { -+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; -+ this.decoder = new StringDecoder(options.encoding); -+ this.encoding = options.encoding; -+ } -+} -+ -+function Readable(options) { -+ Duplex = Duplex || require('./_stream_duplex'); -+ -+ if (!(this instanceof Readable)) return new Readable(options); -+ -+ this._readableState = new ReadableState(options, this); -+ -+ // legacy -+ this.readable = true; -+ -+ if (options) { -+ if (typeof options.read === 'function') this._read = options.read; -+ -+ if (typeof options.destroy === 'function') this._destroy = options.destroy; -+ } -+ -+ Stream.call(this); -+} -+ -+Object.defineProperty(Readable.prototype, 'destroyed', { -+ get: function () { -+ if (this._readableState === undefined) { -+ return false; -+ } -+ return this._readableState.destroyed; -+ }, -+ set: function (value) { -+ // we ignore the value if the stream -+ // has not been initialized yet -+ if (!this._readableState) { -+ return; -+ } -+ -+ // backward compatibility, the user is explicitly -+ // managing destroyed -+ this._readableState.destroyed = value; -+ } -+}); -+ -+Readable.prototype.destroy = destroyImpl.destroy; -+Readable.prototype._undestroy = destroyImpl.undestroy; -+Readable.prototype._destroy = function (err, cb) { -+ this.push(null); -+ cb(err); -+}; -+ -+// Manually shove something into the read() buffer. -+// This returns true if the highWaterMark has not been hit yet, -+// similar to how Writable.write() returns true if you should -+// write() some more. -+Readable.prototype.push = function (chunk, encoding) { -+ var state = this._readableState; -+ var skipChunkCheck; -+ -+ if (!state.objectMode) { -+ if (typeof chunk === 'string') { -+ encoding = encoding || state.defaultEncoding; -+ if (encoding !== state.encoding) { -+ chunk = Buffer.from(chunk, encoding); -+ encoding = ''; -+ } -+ skipChunkCheck = true; -+ } -+ } else { -+ skipChunkCheck = true; -+ } -+ -+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -+}; -+ -+// Unshift should *always* be something directly out of read() -+Readable.prototype.unshift = function (chunk) { -+ return readableAddChunk(this, chunk, null, true, false); -+}; -+ -+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { -+ var state = stream._readableState; -+ if (chunk === null) { -+ state.reading = false; -+ onEofChunk(stream, state); -+ } else { -+ var er; -+ if (!skipChunkCheck) er = chunkInvalid(state, chunk); -+ if (er) { -+ stream.emit('error', er); -+ } else if (state.objectMode || chunk && chunk.length > 0) { -+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { -+ chunk = _uint8ArrayToBuffer(chunk); -+ } -+ -+ if (addToFront) { -+ if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); -+ } else if (state.ended) { -+ stream.emit('error', new Error('stream.push() after EOF')); -+ } else { -+ state.reading = false; -+ if (state.decoder && !encoding) { -+ chunk = state.decoder.write(chunk); -+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); -+ } else { -+ addChunk(stream, state, chunk, false); -+ } -+ } -+ } else if (!addToFront) { -+ state.reading = false; -+ } -+ } -+ -+ return needMoreData(state); -+} -+ -+function addChunk(stream, state, chunk, addToFront) { -+ if (state.flowing && state.length === 0 && !state.sync) { -+ stream.emit('data', chunk); -+ stream.read(0); -+ } else { -+ // update the buffer info. -+ state.length += state.objectMode ? 1 : chunk.length; -+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); -+ -+ if (state.needReadable) emitReadable(stream); -+ } -+ maybeReadMore(stream, state); -+} -+ -+function chunkInvalid(state, chunk) { -+ var er; -+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { -+ er = new TypeError('Invalid non-string/buffer chunk'); -+ } -+ return er; -+} -+ -+// if it's past the high water mark, we can push in some more. -+// Also, if we have no data yet, we can stand some -+// more bytes. This is to work around cases where hwm=0, -+// such as the repl. Also, if the push() triggered a -+// readable event, and the user called read(largeNumber) such that -+// needReadable was set, then we ought to push more, so that another -+// 'readable' event will be triggered. -+function needMoreData(state) { -+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -+} -+ -+Readable.prototype.isPaused = function () { -+ return this._readableState.flowing === false; -+}; -+ -+// backwards compatibility. -+Readable.prototype.setEncoding = function (enc) { -+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; -+ this._readableState.decoder = new StringDecoder(enc); -+ this._readableState.encoding = enc; -+ return this; -+}; -+ -+// Don't raise the hwm > 8MB -+var MAX_HWM = 0x800000; -+function computeNewHighWaterMark(n) { -+ if (n >= MAX_HWM) { -+ n = MAX_HWM; -+ } else { -+ // Get the next highest power of 2 to prevent increasing hwm excessively in -+ // tiny amounts -+ n--; -+ n |= n >>> 1; -+ n |= n >>> 2; -+ n |= n >>> 4; -+ n |= n >>> 8; -+ n |= n >>> 16; -+ n++; -+ } -+ return n; -+} -+ -+// This function is designed to be inlinable, so please take care when making -+// changes to the function body. -+function howMuchToRead(n, state) { -+ if (n <= 0 || state.length === 0 && state.ended) return 0; -+ if (state.objectMode) return 1; -+ if (n !== n) { -+ // Only flow one buffer at a time -+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; -+ } -+ // If we're asking for more than the current hwm, then raise the hwm. -+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); -+ if (n <= state.length) return n; -+ // Don't have enough -+ if (!state.ended) { -+ state.needReadable = true; -+ return 0; -+ } -+ return state.length; -+} -+ -+// you can override either this method, or the async _read(n) below. -+Readable.prototype.read = function (n) { -+ debug('read', n); -+ n = parseInt(n, 10); -+ var state = this._readableState; -+ var nOrig = n; -+ -+ if (n !== 0) state.emittedReadable = false; -+ -+ // if we're doing read(0) to trigger a readable event, but we -+ // already have a bunch of data in the buffer, then just trigger -+ // the 'readable' event and move on. -+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { -+ debug('read: emitReadable', state.length, state.ended); -+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); -+ return null; -+ } -+ -+ n = howMuchToRead(n, state); -+ -+ // if we've ended, and we're now clear, then finish it up. -+ if (n === 0 && state.ended) { -+ if (state.length === 0) endReadable(this); -+ return null; -+ } -+ -+ // All the actual chunk generation logic needs to be -+ // *below* the call to _read. The reason is that in certain -+ // synthetic stream cases, such as passthrough streams, _read -+ // may be a completely synchronous operation which may change -+ // the state of the read buffer, providing enough data when -+ // before there was *not* enough. -+ // -+ // So, the steps are: -+ // 1. Figure out what the state of things will be after we do -+ // a read from the buffer. -+ // -+ // 2. If that resulting state will trigger a _read, then call _read. -+ // Note that this may be asynchronous, or synchronous. Yes, it is -+ // deeply ugly to write APIs this way, but that still doesn't mean -+ // that the Readable class should behave improperly, as streams are -+ // designed to be sync/async agnostic. -+ // Take note if the _read call is sync or async (ie, if the read call -+ // has returned yet), so that we know whether or not it's safe to emit -+ // 'readable' etc. -+ // -+ // 3. Actually pull the requested chunks out of the buffer and return. -+ -+ // if we need a readable event, then we need to do some reading. -+ var doRead = state.needReadable; -+ debug('need readable', doRead); -+ -+ // if we currently have less than the highWaterMark, then also read some -+ if (state.length === 0 || state.length - n < state.highWaterMark) { -+ doRead = true; -+ debug('length less than watermark', doRead); -+ } -+ -+ // however, if we've ended, then there's no point, and if we're already -+ // reading, then it's unnecessary. -+ if (state.ended || state.reading) { -+ doRead = false; -+ debug('reading or ended', doRead); -+ } else if (doRead) { -+ debug('do read'); -+ state.reading = true; -+ state.sync = true; -+ // if the length is currently zero, then we *need* a readable event. -+ if (state.length === 0) state.needReadable = true; -+ // call internal read method -+ this._read(state.highWaterMark); -+ state.sync = false; -+ // If _read pushed data synchronously, then `reading` will be false, -+ // and we need to re-evaluate how much data we can return to the user. -+ if (!state.reading) n = howMuchToRead(nOrig, state); -+ } -+ -+ var ret; -+ if (n > 0) ret = fromList(n, state);else ret = null; -+ -+ if (ret === null) { -+ state.needReadable = true; -+ n = 0; -+ } else { -+ state.length -= n; -+ } -+ -+ if (state.length === 0) { -+ // If we have nothing in the buffer, then we want to know -+ // as soon as we *do* get something into the buffer. -+ if (!state.ended) state.needReadable = true; -+ -+ // If we tried to read() past the EOF, then emit end on the next tick. -+ if (nOrig !== n && state.ended) endReadable(this); -+ } -+ -+ if (ret !== null) this.emit('data', ret); -+ -+ return ret; -+}; -+ -+function onEofChunk(stream, state) { -+ if (state.ended) return; -+ if (state.decoder) { -+ var chunk = state.decoder.end(); -+ if (chunk && chunk.length) { -+ state.buffer.push(chunk); -+ state.length += state.objectMode ? 1 : chunk.length; -+ } -+ } -+ state.ended = true; -+ -+ // emit 'readable' now to make sure it gets picked up. -+ emitReadable(stream); -+} -+ -+// Don't emit readable right away in sync mode, because this can trigger -+// another read() call => stack overflow. This way, it might trigger -+// a nextTick recursion warning, but that's not so bad. -+function emitReadable(stream) { -+ var state = stream._readableState; -+ state.needReadable = false; -+ if (!state.emittedReadable) { -+ debug('emitReadable', state.flowing); -+ state.emittedReadable = true; -+ if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); -+ } -+} -+ -+function emitReadable_(stream) { -+ debug('emit readable'); -+ stream.emit('readable'); -+ flow(stream); -+} -+ -+// at this point, the user has presumably seen the 'readable' event, -+// and called read() to consume some data. that may have triggered -+// in turn another _read(n) call, in which case reading = true if -+// it's in progress. -+// However, if we're not ended, or reading, and the length < hwm, -+// then go ahead and try to read some more preemptively. -+function maybeReadMore(stream, state) { -+ if (!state.readingMore) { -+ state.readingMore = true; -+ pna.nextTick(maybeReadMore_, stream, state); -+ } -+} -+ -+function maybeReadMore_(stream, state) { -+ var len = state.length; -+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { -+ debug('maybeReadMore read 0'); -+ stream.read(0); -+ if (len === state.length) -+ // didn't get any data, stop spinning. -+ break;else len = state.length; -+ } -+ state.readingMore = false; -+} -+ -+// abstract method. to be overridden in specific implementation classes. -+// call cb(er, data) where data is <= n in length. -+// for virtual (non-string, non-buffer) streams, "length" is somewhat -+// arbitrary, and perhaps not very meaningful. -+Readable.prototype._read = function (n) { -+ this.emit('error', new Error('_read() is not implemented')); -+}; -+ -+Readable.prototype.pipe = function (dest, pipeOpts) { -+ var src = this; -+ var state = this._readableState; -+ -+ switch (state.pipesCount) { -+ case 0: -+ state.pipes = dest; -+ break; -+ case 1: -+ state.pipes = [state.pipes, dest]; -+ break; -+ default: -+ state.pipes.push(dest); -+ break; -+ } -+ state.pipesCount += 1; -+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); -+ -+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; -+ -+ var endFn = doEnd ? onend : unpipe; -+ if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); -+ -+ dest.on('unpipe', onunpipe); -+ function onunpipe(readable, unpipeInfo) { -+ debug('onunpipe'); -+ if (readable === src) { -+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) { -+ unpipeInfo.hasUnpiped = true; -+ cleanup(); -+ } -+ } -+ } -+ -+ function onend() { -+ debug('onend'); -+ dest.end(); -+ } -+ -+ // when the dest drains, it reduces the awaitDrain counter -+ // on the source. This would be more elegant with a .once() -+ // handler in flow(), but adding and removing repeatedly is -+ // too slow. -+ var ondrain = pipeOnDrain(src); -+ dest.on('drain', ondrain); -+ -+ var cleanedUp = false; -+ function cleanup() { -+ debug('cleanup'); -+ // cleanup event handlers once the pipe is broken -+ dest.removeListener('close', onclose); -+ dest.removeListener('finish', onfinish); -+ dest.removeListener('drain', ondrain); -+ dest.removeListener('error', onerror); -+ dest.removeListener('unpipe', onunpipe); -+ src.removeListener('end', onend); -+ src.removeListener('end', unpipe); -+ src.removeListener('data', ondata); -+ -+ cleanedUp = true; -+ -+ // if the reader is waiting for a drain event from this -+ // specific writer, then it would cause it to never start -+ // flowing again. -+ // So, if this is awaiting a drain, then we just call it now. -+ // If we don't know, then assume that we are waiting for one. -+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); -+ } -+ -+ // If the user pushes more data while we're writing to dest then we'll end up -+ // in ondata again. However, we only want to increase awaitDrain once because -+ // dest will only emit one 'drain' event for the multiple writes. -+ // => Introduce a guard on increasing awaitDrain. -+ var increasedAwaitDrain = false; -+ src.on('data', ondata); -+ function ondata(chunk) { -+ debug('ondata'); -+ increasedAwaitDrain = false; -+ var ret = dest.write(chunk); -+ if (false === ret && !increasedAwaitDrain) { -+ // If the user unpiped during `dest.write()`, it is possible -+ // to get stuck in a permanently paused state if that write -+ // also returned false. -+ // => Check whether `dest` is still a piping destination. -+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { -+ debug('false write response, pause', src._readableState.awaitDrain); -+ src._readableState.awaitDrain++; -+ increasedAwaitDrain = true; -+ } -+ src.pause(); -+ } -+ } -+ -+ // if the dest has an error, then stop piping into it. -+ // however, don't suppress the throwing behavior for this. -+ function onerror(er) { -+ debug('onerror', er); -+ unpipe(); -+ dest.removeListener('error', onerror); -+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); -+ } -+ -+ // Make sure our error handler is attached before userland ones. -+ prependListener(dest, 'error', onerror); -+ -+ // Both close and finish should trigger unpipe, but only once. -+ function onclose() { -+ dest.removeListener('finish', onfinish); -+ unpipe(); -+ } -+ dest.once('close', onclose); -+ function onfinish() { -+ debug('onfinish'); -+ dest.removeListener('close', onclose); -+ unpipe(); -+ } -+ dest.once('finish', onfinish); -+ -+ function unpipe() { -+ debug('unpipe'); -+ src.unpipe(dest); -+ } -+ -+ // tell the dest that it's being piped to -+ dest.emit('pipe', src); -+ -+ // start the flow if it hasn't been started already. -+ if (!state.flowing) { -+ debug('pipe resume'); -+ src.resume(); -+ } -+ -+ return dest; -+}; -+ -+function pipeOnDrain(src) { -+ return function () { -+ var state = src._readableState; -+ debug('pipeOnDrain', state.awaitDrain); -+ if (state.awaitDrain) state.awaitDrain--; -+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { -+ state.flowing = true; -+ flow(src); -+ } -+ }; -+} -+ -+Readable.prototype.unpipe = function (dest) { -+ var state = this._readableState; -+ var unpipeInfo = { hasUnpiped: false }; -+ -+ // if we're not piping anywhere, then do nothing. -+ if (state.pipesCount === 0) return this; -+ -+ // just one destination. most common case. -+ if (state.pipesCount === 1) { -+ // passed in one, but it's not the right one. -+ if (dest && dest !== state.pipes) return this; -+ -+ if (!dest) dest = state.pipes; -+ -+ // got a match. -+ state.pipes = null; -+ state.pipesCount = 0; -+ state.flowing = false; -+ if (dest) dest.emit('unpipe', this, unpipeInfo); -+ return this; -+ } -+ -+ // slow case. multiple pipe destinations. -+ -+ if (!dest) { -+ // remove all. -+ var dests = state.pipes; -+ var len = state.pipesCount; -+ state.pipes = null; -+ state.pipesCount = 0; -+ state.flowing = false; -+ -+ for (var i = 0; i < len; i++) { -+ dests[i].emit('unpipe', this, unpipeInfo); -+ }return this; -+ } -+ -+ // try to find the right one. -+ var index = indexOf(state.pipes, dest); -+ if (index === -1) return this; -+ -+ state.pipes.splice(index, 1); -+ state.pipesCount -= 1; -+ if (state.pipesCount === 1) state.pipes = state.pipes[0]; -+ -+ dest.emit('unpipe', this, unpipeInfo); -+ -+ return this; -+}; -+ -+// set up data events if they are asked for -+// Ensure readable listeners eventually get something -+Readable.prototype.on = function (ev, fn) { -+ var res = Stream.prototype.on.call(this, ev, fn); -+ -+ if (ev === 'data') { -+ // Start flowing on next tick if stream isn't explicitly paused -+ if (this._readableState.flowing !== false) this.resume(); -+ } else if (ev === 'readable') { -+ var state = this._readableState; -+ if (!state.endEmitted && !state.readableListening) { -+ state.readableListening = state.needReadable = true; -+ state.emittedReadable = false; -+ if (!state.reading) { -+ pna.nextTick(nReadingNextTick, this); -+ } else if (state.length) { -+ emitReadable(this); -+ } -+ } -+ } -+ -+ return res; -+}; -+Readable.prototype.addListener = Readable.prototype.on; -+ -+function nReadingNextTick(self) { -+ debug('readable nexttick read 0'); -+ self.read(0); -+} -+ -+// pause() and resume() are remnants of the legacy readable stream API -+// If the user uses them, then switch into old mode. -+Readable.prototype.resume = function () { -+ var state = this._readableState; -+ if (!state.flowing) { -+ debug('resume'); -+ state.flowing = true; -+ resume(this, state); -+ } -+ return this; -+}; -+ -+function resume(stream, state) { -+ if (!state.resumeScheduled) { -+ state.resumeScheduled = true; -+ pna.nextTick(resume_, stream, state); -+ } -+} -+ -+function resume_(stream, state) { -+ if (!state.reading) { -+ debug('resume read 0'); -+ stream.read(0); -+ } -+ -+ state.resumeScheduled = false; -+ state.awaitDrain = 0; -+ stream.emit('resume'); -+ flow(stream); -+ if (state.flowing && !state.reading) stream.read(0); -+} -+ -+Readable.prototype.pause = function () { -+ debug('call pause flowing=%j', this._readableState.flowing); -+ if (false !== this._readableState.flowing) { -+ debug('pause'); -+ this._readableState.flowing = false; -+ this.emit('pause'); -+ } -+ return this; -+}; -+ -+function flow(stream) { -+ var state = stream._readableState; -+ debug('flow', state.flowing); -+ while (state.flowing && stream.read() !== null) {} -+} -+ -+// wrap an old-style stream as the async data source. -+// This is *not* part of the readable stream interface. -+// It is an ugly unfortunate mess of history. -+Readable.prototype.wrap = function (stream) { -+ var _this = this; -+ -+ var state = this._readableState; -+ var paused = false; -+ -+ stream.on('end', function () { -+ debug('wrapped end'); -+ if (state.decoder && !state.ended) { -+ var chunk = state.decoder.end(); -+ if (chunk && chunk.length) _this.push(chunk); -+ } -+ -+ _this.push(null); -+ }); -+ -+ stream.on('data', function (chunk) { -+ debug('wrapped data'); -+ if (state.decoder) chunk = state.decoder.write(chunk); -+ -+ // don't skip over falsy values in objectMode -+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; -+ -+ var ret = _this.push(chunk); -+ if (!ret) { -+ paused = true; -+ stream.pause(); -+ } -+ }); -+ -+ // proxy all the other methods. -+ // important when wrapping filters and duplexes. -+ for (var i in stream) { -+ if (this[i] === undefined && typeof stream[i] === 'function') { -+ this[i] = function (method) { -+ return function () { -+ return stream[method].apply(stream, arguments); -+ }; -+ }(i); -+ } -+ } -+ -+ // proxy certain important events. -+ for (var n = 0; n < kProxyEvents.length; n++) { -+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); -+ } -+ -+ // when we try to consume some more bytes, simply unpause the -+ // underlying stream. -+ this._read = function (n) { -+ debug('wrapped _read', n); -+ if (paused) { -+ paused = false; -+ stream.resume(); -+ } -+ }; -+ -+ return this; -+}; -+ -+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { -+ // making it explicit this property is not enumerable -+ // because otherwise some prototype manipulation in -+ // userland will fail -+ enumerable: false, -+ get: function () { -+ return this._readableState.highWaterMark; -+ } -+}); -+ -+// exposed for testing purposes only. -+Readable._fromList = fromList; -+ -+// Pluck off n bytes from an array of buffers. -+// Length is the combined lengths of all the buffers in the list. -+// This function is designed to be inlinable, so please take care when making -+// changes to the function body. -+function fromList(n, state) { -+ // nothing buffered -+ if (state.length === 0) return null; -+ -+ var ret; -+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { -+ // read it all, truncate the list -+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); -+ state.buffer.clear(); -+ } else { -+ // read part of list -+ ret = fromListPartial(n, state.buffer, state.decoder); -+ } -+ -+ return ret; -+} -+ -+// Extracts only enough buffered data to satisfy the amount requested. -+// This function is designed to be inlinable, so please take care when making -+// changes to the function body. -+function fromListPartial(n, list, hasStrings) { -+ var ret; -+ if (n < list.head.data.length) { -+ // slice is the same for buffers and strings -+ ret = list.head.data.slice(0, n); -+ list.head.data = list.head.data.slice(n); -+ } else if (n === list.head.data.length) { -+ // first chunk is a perfect match -+ ret = list.shift(); -+ } else { -+ // result spans more than one buffer -+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); -+ } -+ return ret; -+} -+ -+// Copies a specified amount of characters from the list of buffered data -+// chunks. -+// This function is designed to be inlinable, so please take care when making -+// changes to the function body. -+function copyFromBufferString(n, list) { -+ var p = list.head; -+ var c = 1; -+ var ret = p.data; -+ n -= ret.length; -+ while (p = p.next) { -+ var str = p.data; -+ var nb = n > str.length ? str.length : n; -+ if (nb === str.length) ret += str;else ret += str.slice(0, n); -+ n -= nb; -+ if (n === 0) { -+ if (nb === str.length) { -+ ++c; -+ if (p.next) list.head = p.next;else list.head = list.tail = null; -+ } else { -+ list.head = p; -+ p.data = str.slice(nb); -+ } -+ break; -+ } -+ ++c; -+ } -+ list.length -= c; -+ return ret; -+} -+ -+// Copies a specified amount of bytes from the list of buffered data chunks. -+// This function is designed to be inlinable, so please take care when making -+// changes to the function body. -+function copyFromBuffer(n, list) { -+ var ret = Buffer.allocUnsafe(n); -+ var p = list.head; -+ var c = 1; -+ p.data.copy(ret); -+ n -= p.data.length; -+ while (p = p.next) { -+ var buf = p.data; -+ var nb = n > buf.length ? buf.length : n; -+ buf.copy(ret, ret.length - n, 0, nb); -+ n -= nb; -+ if (n === 0) { -+ if (nb === buf.length) { -+ ++c; -+ if (p.next) list.head = p.next;else list.head = list.tail = null; -+ } else { -+ list.head = p; -+ p.data = buf.slice(nb); -+ } -+ break; -+ } -+ ++c; -+ } -+ list.length -= c; -+ return ret; -+} -+ -+function endReadable(stream) { -+ var state = stream._readableState; -+ -+ // If we get here before consuming all the bytes, then that is a -+ // bug in node. Should never happen. -+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); -+ -+ if (!state.endEmitted) { -+ state.ended = true; -+ pna.nextTick(endReadableNT, state, stream); -+ } -+} -+ -+function endReadableNT(state, stream) { -+ // Check that we didn't get one last unshift. -+ if (!state.endEmitted && state.length === 0) { -+ state.endEmitted = true; -+ stream.readable = false; -+ stream.emit('end'); -+ } -+} -+ -+function indexOf(xs, x) { -+ for (var i = 0, l = xs.length; i < l; i++) { -+ if (xs[i] === x) return i; -+ } -+ return -1; -+} -+}, -+"8Ph2jPDVcHo1sVJCWUg9FGql+KtVyPDkOwbcluIYV20=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_validate(it, $keyword, $ruleType) { -+ var out = ''; -+ var $async = it.schema.$async === true, -+ $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), -+ $id = it.self._getId(it.schema); -+ if (it.opts.strictKeywords) { -+ var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); -+ if ($unknownKwd) { -+ var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; -+ if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); -+ else throw new Error($keywordsMsg); -+ } -+ } -+ if (it.isTop) { -+ out += ' var validate = '; -+ if ($async) { -+ it.async = true; -+ out += 'async '; -+ } -+ out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; -+ if ($id && (it.opts.sourceCode || it.opts.processCode)) { -+ out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; -+ } -+ } -+ if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { -+ var $keyword = 'false schema'; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $errorKeyword; -+ var $data = 'data' + ($dataLvl || ''); -+ var $valid = 'valid' + $lvl; -+ if (it.schema === false) { -+ if (it.isTop) { -+ $breakOnError = true; -+ } else { -+ out += ' var ' + ($valid) + ' = false; '; -+ } -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'boolean schema is false\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ } else { -+ if (it.isTop) { -+ if ($async) { -+ out += ' return data; '; -+ } else { -+ out += ' validate.errors = null; return true; '; -+ } -+ } else { -+ out += ' var ' + ($valid) + ' = true; '; -+ } -+ } -+ if (it.isTop) { -+ out += ' }; return validate; '; -+ } -+ return out; -+ } -+ if (it.isTop) { -+ var $top = it.isTop, -+ $lvl = it.level = 0, -+ $dataLvl = it.dataLevel = 0, -+ $data = 'data'; -+ it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); -+ it.baseId = it.baseId || it.rootId; -+ delete it.isTop; -+ it.dataPathArr = [""]; -+ if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { -+ var $defaultMsg = 'default is ignored in the schema root'; -+ if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); -+ else throw new Error($defaultMsg); -+ } -+ out += ' var vErrors = null; '; -+ out += ' var errors = 0; '; -+ out += ' if (rootData === undefined) rootData = data; '; -+ } else { -+ var $lvl = it.level, -+ $dataLvl = it.dataLevel, -+ $data = 'data' + ($dataLvl || ''); -+ if ($id) it.baseId = it.resolve.url(it.baseId, $id); -+ if ($async && !it.async) throw new Error('async schema in sync schema'); -+ out += ' var errs_' + ($lvl) + ' = errors;'; -+ } -+ var $valid = 'valid' + $lvl, -+ $breakOnError = !it.opts.allErrors, -+ $closingBraces1 = '', -+ $closingBraces2 = ''; -+ var $errorKeyword; -+ var $typeSchema = it.schema.type, -+ $typeIsArray = Array.isArray($typeSchema); -+ if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { -+ if ($typeIsArray) { -+ if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); -+ } else if ($typeSchema != 'null') { -+ $typeSchema = [$typeSchema, 'null']; -+ $typeIsArray = true; -+ } -+ } -+ if ($typeIsArray && $typeSchema.length == 1) { -+ $typeSchema = $typeSchema[0]; -+ $typeIsArray = false; -+ } -+ if (it.schema.$ref && $refKeywords) { -+ if (it.opts.extendRefs == 'fail') { -+ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); -+ } else if (it.opts.extendRefs !== true) { -+ $refKeywords = false; -+ it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); -+ } -+ } -+ if (it.schema.$comment && it.opts.$comment) { -+ out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); -+ } -+ if ($typeSchema) { -+ if (it.opts.coerceTypes) { -+ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); -+ } -+ var $rulesGroup = it.RULES.types[$typeSchema]; -+ if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { -+ var $schemaPath = it.schemaPath + '.type', -+ $errSchemaPath = it.errSchemaPath + '/type'; -+ var $schemaPath = it.schemaPath + '.type', -+ $errSchemaPath = it.errSchemaPath + '/type', -+ $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; -+ out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; -+ if ($coerceToTypes) { -+ var $dataType = 'dataType' + $lvl, -+ $coerced = 'coerced' + $lvl; -+ out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; -+ if (it.opts.coerceTypes == 'array') { -+ out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; -+ } -+ out += ' if (' + ($coerced) + ' !== undefined) ; '; -+ var arr1 = $coerceToTypes; -+ if (arr1) { -+ var $type, $i = -1, -+ l1 = arr1.length - 1; -+ while ($i < l1) { -+ $type = arr1[$i += 1]; -+ if ($type == 'string') { -+ out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; -+ } else if ($type == 'number' || $type == 'integer') { -+ out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; -+ if ($type == 'integer') { -+ out += ' && !(' + ($data) + ' % 1)'; -+ } -+ out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; -+ } else if ($type == 'boolean') { -+ out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; -+ } else if ($type == 'null') { -+ out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; -+ } else if (it.opts.coerceTypes == 'array' && $type == 'array') { -+ out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; -+ } -+ } -+ } -+ out += ' else { '; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should be '; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += ' } if (' + ($coerced) + ' !== undefined) { '; -+ var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', -+ $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; -+ out += ' ' + ($data) + ' = ' + ($coerced) + '; '; -+ if (!$dataLvl) { -+ out += 'if (' + ($parentData) + ' !== undefined)'; -+ } -+ out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; -+ } else { -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should be '; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ } -+ out += ' } '; -+ } -+ } -+ if (it.schema.$ref && !$refKeywords) { -+ out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; -+ if ($breakOnError) { -+ out += ' } if (errors === '; -+ if ($top) { -+ out += '0'; -+ } else { -+ out += 'errs_' + ($lvl); -+ } -+ out += ') { '; -+ $closingBraces2 += '}'; -+ } -+ } else { -+ var arr2 = it.RULES; -+ if (arr2) { -+ var $rulesGroup, i2 = -1, -+ l2 = arr2.length - 1; -+ while (i2 < l2) { -+ $rulesGroup = arr2[i2 += 1]; -+ if ($shouldUseGroup($rulesGroup)) { -+ if ($rulesGroup.type) { -+ out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; -+ } -+ if (it.opts.useDefaults) { -+ if ($rulesGroup.type == 'object' && it.schema.properties) { -+ var $schema = it.schema.properties, -+ $schemaKeys = Object.keys($schema); -+ var arr3 = $schemaKeys; -+ if (arr3) { -+ var $propertyKey, i3 = -1, -+ l3 = arr3.length - 1; -+ while (i3 < l3) { -+ $propertyKey = arr3[i3 += 1]; -+ var $sch = $schema[$propertyKey]; -+ if ($sch.default !== undefined) { -+ var $passData = $data + it.util.getProperty($propertyKey); -+ if (it.compositeRule) { -+ if (it.opts.strictDefaults) { -+ var $defaultMsg = 'default is ignored for: ' + $passData; -+ if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); -+ else throw new Error($defaultMsg); -+ } -+ } else { -+ out += ' if (' + ($passData) + ' === undefined '; -+ if (it.opts.useDefaults == 'empty') { -+ out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; -+ } -+ out += ' ) ' + ($passData) + ' = '; -+ if (it.opts.useDefaults == 'shared') { -+ out += ' ' + (it.useDefault($sch.default)) + ' '; -+ } else { -+ out += ' ' + (JSON.stringify($sch.default)) + ' '; -+ } -+ out += '; '; -+ } -+ } -+ } -+ } -+ } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { -+ var arr4 = it.schema.items; -+ if (arr4) { -+ var $sch, $i = -1, -+ l4 = arr4.length - 1; -+ while ($i < l4) { -+ $sch = arr4[$i += 1]; -+ if ($sch.default !== undefined) { -+ var $passData = $data + '[' + $i + ']'; -+ if (it.compositeRule) { -+ if (it.opts.strictDefaults) { -+ var $defaultMsg = 'default is ignored for: ' + $passData; -+ if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); -+ else throw new Error($defaultMsg); -+ } -+ } else { -+ out += ' if (' + ($passData) + ' === undefined '; -+ if (it.opts.useDefaults == 'empty') { -+ out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; -+ } -+ out += ' ) ' + ($passData) + ' = '; -+ if (it.opts.useDefaults == 'shared') { -+ out += ' ' + (it.useDefault($sch.default)) + ' '; -+ } else { -+ out += ' ' + (JSON.stringify($sch.default)) + ' '; -+ } -+ out += '; '; -+ } -+ } -+ } -+ } -+ } -+ } -+ var arr5 = $rulesGroup.rules; -+ if (arr5) { -+ var $rule, i5 = -1, -+ l5 = arr5.length - 1; -+ while (i5 < l5) { -+ $rule = arr5[i5 += 1]; -+ if ($shouldUseRule($rule)) { -+ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); -+ if ($code) { -+ out += ' ' + ($code) + ' '; -+ if ($breakOnError) { -+ $closingBraces1 += '}'; -+ } -+ } -+ } -+ } -+ } -+ if ($breakOnError) { -+ out += ' ' + ($closingBraces1) + ' '; -+ $closingBraces1 = ''; -+ } -+ if ($rulesGroup.type) { -+ out += ' } '; -+ if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { -+ out += ' else { '; -+ var $schemaPath = it.schemaPath + '.type', -+ $errSchemaPath = it.errSchemaPath + '/type'; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should be '; -+ if ($typeIsArray) { -+ out += '' + ($typeSchema.join(",")); -+ } else { -+ out += '' + ($typeSchema); -+ } -+ out += '\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += ' } '; -+ } -+ } -+ if ($breakOnError) { -+ out += ' if (errors === '; -+ if ($top) { -+ out += '0'; -+ } else { -+ out += 'errs_' + ($lvl); -+ } -+ out += ') { '; -+ $closingBraces2 += '}'; -+ } -+ } -+ } -+ } -+ } -+ if ($breakOnError) { -+ out += ' ' + ($closingBraces2) + ' '; -+ } -+ if ($top) { -+ if ($async) { -+ out += ' if (errors === 0) return data; '; -+ out += ' else throw new ValidationError(vErrors); '; -+ } else { -+ out += ' validate.errors = vErrors; '; -+ out += ' return errors === 0; '; -+ } -+ out += ' }; return validate;'; -+ } else { -+ out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; -+ } -+ -+ function $shouldUseGroup($rulesGroup) { -+ var rules = $rulesGroup.rules; -+ for (var i = 0; i < rules.length; i++) -+ if ($shouldUseRule(rules[i])) return true; -+ } -+ -+ function $shouldUseRule($rule) { -+ return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); -+ } -+ -+ function $ruleImplementsSomeKeyword($rule) { -+ var impl = $rule.implements; -+ for (var i = 0; i < impl.length; i++) -+ if (it.schema[impl[i]] !== undefined) return true; -+ } -+ return out; -+} -+ -+}, -+"8RXnTqxlRTiDjrf7lxvznSVIsorpDiW3WMZ/FkUEhPY=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = -+function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { -+var util = require("./util"); -+var tryCatch = util.tryCatch; -+ -+Promise.method = function (fn) { -+ if (typeof fn !== "function") { -+ throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); -+ } -+ return function () { -+ var ret = new Promise(INTERNAL); -+ ret._captureStackTrace(); -+ ret._pushContext(); -+ var value = tryCatch(fn).apply(this, arguments); -+ var promiseCreated = ret._popContext(); -+ debug.checkForgottenReturns( -+ value, promiseCreated, "Promise.method", ret); -+ ret._resolveFromSyncValue(value); -+ return ret; -+ }; -+}; -+ -+Promise.attempt = Promise["try"] = function (fn) { -+ if (typeof fn !== "function") { -+ return apiRejection("expecting a function but got " + util.classString(fn)); -+ } -+ var ret = new Promise(INTERNAL); -+ ret._captureStackTrace(); -+ ret._pushContext(); -+ var value; -+ if (arguments.length > 1) { -+ debug.deprecated("calling Promise.try with more than 1 argument"); -+ var arg = arguments[1]; -+ var ctx = arguments[2]; -+ value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) -+ : tryCatch(fn).call(ctx, arg); -+ } else { -+ value = tryCatch(fn)(); -+ } -+ var promiseCreated = ret._popContext(); -+ debug.checkForgottenReturns( -+ value, promiseCreated, "Promise.try", ret); -+ ret._resolveFromSyncValue(value); -+ return ret; -+}; -+ -+Promise.prototype._resolveFromSyncValue = function (value) { -+ if (value === util.errorObj) { -+ this._rejectCallback(value.e, false); -+ } else { -+ this._resolveCallback(value, true); -+ } -+}; -+}; -+ -+}, -+"8VN/G0FnOnWgucYKBkfGKFYertTy+uPYGIuySr8zPtw=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+var es5 = require("./es5"); -+var Objectfreeze = es5.freeze; -+var util = require("./util"); -+var inherits = util.inherits; -+var notEnumerableProp = util.notEnumerableProp; -+ -+function subError(nameProperty, defaultMessage) { -+ function SubError(message) { -+ if (!(this instanceof SubError)) return new SubError(message); -+ notEnumerableProp(this, "message", -+ typeof message === "string" ? message : defaultMessage); -+ notEnumerableProp(this, "name", nameProperty); -+ if (Error.captureStackTrace) { -+ Error.captureStackTrace(this, this.constructor); -+ } else { -+ Error.call(this); -+ } -+ } -+ inherits(SubError, Error); -+ return SubError; -+} -+ -+var _TypeError, _RangeError; -+var Warning = subError("Warning", "warning"); -+var CancellationError = subError("CancellationError", "cancellation error"); -+var TimeoutError = subError("TimeoutError", "timeout error"); -+var AggregateError = subError("AggregateError", "aggregate error"); -+try { -+ _TypeError = TypeError; -+ _RangeError = RangeError; -+} catch(e) { -+ _TypeError = subError("TypeError", "type error"); -+ _RangeError = subError("RangeError", "range error"); -+} -+ -+var methods = ("join pop push shift unshift slice filter forEach some " + -+ "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); -+ -+for (var i = 0; i < methods.length; ++i) { -+ if (typeof Array.prototype[methods[i]] === "function") { -+ AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; -+ } -+} -+ -+es5.defineProperty(AggregateError.prototype, "length", { -+ value: 0, -+ configurable: false, -+ writable: true, -+ enumerable: true -+}); -+AggregateError.prototype["isOperational"] = true; -+var level = 0; -+AggregateError.prototype.toString = function() { -+ var indent = Array(level * 4 + 1).join(" "); -+ var ret = "\n" + indent + "AggregateError of:" + "\n"; -+ level++; -+ indent = Array(level * 4 + 1).join(" "); -+ for (var i = 0; i < this.length; ++i) { -+ var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; -+ var lines = str.split("\n"); -+ for (var j = 0; j < lines.length; ++j) { -+ lines[j] = indent + lines[j]; -+ } -+ str = lines.join("\n"); -+ ret += str + "\n"; -+ } -+ level--; -+ return ret; -+}; -+ -+function OperationalError(message) { -+ if (!(this instanceof OperationalError)) -+ return new OperationalError(message); -+ notEnumerableProp(this, "name", "OperationalError"); -+ notEnumerableProp(this, "message", message); -+ this.cause = message; -+ this["isOperational"] = true; -+ -+ if (message instanceof Error) { -+ notEnumerableProp(this, "message", message.message); -+ notEnumerableProp(this, "stack", message.stack); -+ } else if (Error.captureStackTrace) { -+ Error.captureStackTrace(this, this.constructor); -+ } -+ -+} -+inherits(OperationalError, Error); -+ -+var errorTypes = Error["__BluebirdErrorTypes__"]; -+if (!errorTypes) { -+ errorTypes = Objectfreeze({ -+ CancellationError: CancellationError, -+ TimeoutError: TimeoutError, -+ OperationalError: OperationalError, -+ RejectionError: OperationalError, -+ AggregateError: AggregateError -+ }); -+ es5.defineProperty(Error, "__BluebirdErrorTypes__", { -+ value: errorTypes, -+ writable: false, -+ enumerable: false, -+ configurable: false -+ }); -+} -+ -+module.exports = { -+ Error: Error, -+ TypeError: _TypeError, -+ RangeError: _RangeError, -+ CancellationError: errorTypes.CancellationError, -+ OperationalError: errorTypes.OperationalError, -+ TimeoutError: errorTypes.TimeoutError, -+ AggregateError: errorTypes.AggregateError, -+ Warning: Warning -+}; -+ -+}, -+"8VrBuJYFr1CCWsoXDJHGVBF4bUc/5mIG5GaZz1yTwN0=": -+function (require, module, exports, __dirname, __filename) { -+!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.routes=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o*/ -+ -+var Buffer = require('safe-buffer').Buffer; -+/**/ -+ -+var isEncoding = Buffer.isEncoding || function (encoding) { -+ encoding = '' + encoding; -+ switch (encoding && encoding.toLowerCase()) { -+ case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': -+ return true; -+ default: -+ return false; -+ } -+}; -+ -+function _normalizeEncoding(enc) { -+ if (!enc) return 'utf8'; -+ var retried; -+ while (true) { -+ switch (enc) { -+ case 'utf8': -+ case 'utf-8': -+ return 'utf8'; -+ case 'ucs2': -+ case 'ucs-2': -+ case 'utf16le': -+ case 'utf-16le': -+ return 'utf16le'; -+ case 'latin1': -+ case 'binary': -+ return 'latin1'; -+ case 'base64': -+ case 'ascii': -+ case 'hex': -+ return enc; -+ default: -+ if (retried) return; // undefined -+ enc = ('' + enc).toLowerCase(); -+ retried = true; -+ } -+ } -+}; -+ -+// Do not cache `Buffer.isEncoding` when checking encoding names as some -+// modules monkey-patch it to support additional encodings -+function normalizeEncoding(enc) { -+ var nenc = _normalizeEncoding(enc); -+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); -+ return nenc || enc; -+} -+ -+// StringDecoder provides an interface for efficiently splitting a series of -+// buffers into a series of JS strings without breaking apart multi-byte -+// characters. -+exports.StringDecoder = StringDecoder; -+function StringDecoder(encoding) { -+ this.encoding = normalizeEncoding(encoding); -+ var nb; -+ switch (this.encoding) { -+ case 'utf16le': -+ this.text = utf16Text; -+ this.end = utf16End; -+ nb = 4; -+ break; -+ case 'utf8': -+ this.fillLast = utf8FillLast; -+ nb = 4; -+ break; -+ case 'base64': -+ this.text = base64Text; -+ this.end = base64End; -+ nb = 3; -+ break; -+ default: -+ this.write = simpleWrite; -+ this.end = simpleEnd; -+ return; -+ } -+ this.lastNeed = 0; -+ this.lastTotal = 0; -+ this.lastChar = Buffer.allocUnsafe(nb); -+} -+ -+StringDecoder.prototype.write = function (buf) { -+ if (buf.length === 0) return ''; -+ var r; -+ var i; -+ if (this.lastNeed) { -+ r = this.fillLast(buf); -+ if (r === undefined) return ''; -+ i = this.lastNeed; -+ this.lastNeed = 0; -+ } else { -+ i = 0; -+ } -+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); -+ return r || ''; -+}; -+ -+StringDecoder.prototype.end = utf8End; -+ -+// Returns only complete characters in a Buffer -+StringDecoder.prototype.text = utf8Text; -+ -+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -+StringDecoder.prototype.fillLast = function (buf) { -+ if (this.lastNeed <= buf.length) { -+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); -+ return this.lastChar.toString(this.encoding, 0, this.lastTotal); -+ } -+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); -+ this.lastNeed -= buf.length; -+}; -+ -+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -+// continuation byte. If an invalid byte is detected, -2 is returned. -+function utf8CheckByte(byte) { -+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; -+ return byte >> 6 === 0x02 ? -1 : -2; -+} -+ -+// Checks at most 3 bytes at the end of a Buffer in order to detect an -+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -+// needed to complete the UTF-8 character (if applicable) are returned. -+function utf8CheckIncomplete(self, buf, i) { -+ var j = buf.length - 1; -+ if (j < i) return 0; -+ var nb = utf8CheckByte(buf[j]); -+ if (nb >= 0) { -+ if (nb > 0) self.lastNeed = nb - 1; -+ return nb; -+ } -+ if (--j < i || nb === -2) return 0; -+ nb = utf8CheckByte(buf[j]); -+ if (nb >= 0) { -+ if (nb > 0) self.lastNeed = nb - 2; -+ return nb; -+ } -+ if (--j < i || nb === -2) return 0; -+ nb = utf8CheckByte(buf[j]); -+ if (nb >= 0) { -+ if (nb > 0) { -+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3; -+ } -+ return nb; -+ } -+ return 0; -+} -+ -+// Validates as many continuation bytes for a multi-byte UTF-8 character as -+// needed or are available. If we see a non-continuation byte where we expect -+// one, we "replace" the validated continuation bytes we've seen so far with -+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding -+// behavior. The continuation byte check is included three times in the case -+// where all of the continuation bytes for a character exist in the same buffer. -+// It is also done this way as a slight performance increase instead of using a -+// loop. -+function utf8CheckExtraBytes(self, buf, p) { -+ if ((buf[0] & 0xC0) !== 0x80) { -+ self.lastNeed = 0; -+ return '\ufffd'; -+ } -+ if (self.lastNeed > 1 && buf.length > 1) { -+ if ((buf[1] & 0xC0) !== 0x80) { -+ self.lastNeed = 1; -+ return '\ufffd'; -+ } -+ if (self.lastNeed > 2 && buf.length > 2) { -+ if ((buf[2] & 0xC0) !== 0x80) { -+ self.lastNeed = 2; -+ return '\ufffd'; -+ } -+ } -+ } -+} -+ -+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -+function utf8FillLast(buf) { -+ var p = this.lastTotal - this.lastNeed; -+ var r = utf8CheckExtraBytes(this, buf, p); -+ if (r !== undefined) return r; -+ if (this.lastNeed <= buf.length) { -+ buf.copy(this.lastChar, p, 0, this.lastNeed); -+ return this.lastChar.toString(this.encoding, 0, this.lastTotal); -+ } -+ buf.copy(this.lastChar, p, 0, buf.length); -+ this.lastNeed -= buf.length; -+} -+ -+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -+// partial character, the character's bytes are buffered until the required -+// number of bytes are available. -+function utf8Text(buf, i) { -+ var total = utf8CheckIncomplete(this, buf, i); -+ if (!this.lastNeed) return buf.toString('utf8', i); -+ this.lastTotal = total; -+ var end = buf.length - (total - this.lastNeed); -+ buf.copy(this.lastChar, 0, end); -+ return buf.toString('utf8', i, end); -+} -+ -+// For UTF-8, a replacement character is added when ending on a partial -+// character. -+function utf8End(buf) { -+ var r = buf && buf.length ? this.write(buf) : ''; -+ if (this.lastNeed) return r + '\ufffd'; -+ return r; -+} -+ -+// UTF-16LE typically needs two bytes per character, but even if we have an even -+// number of bytes available, we need to check if we end on a leading/high -+// surrogate. In that case, we need to wait for the next two bytes in order to -+// decode the last character properly. -+function utf16Text(buf, i) { -+ if ((buf.length - i) % 2 === 0) { -+ var r = buf.toString('utf16le', i); -+ if (r) { -+ var c = r.charCodeAt(r.length - 1); -+ if (c >= 0xD800 && c <= 0xDBFF) { -+ this.lastNeed = 2; -+ this.lastTotal = 4; -+ this.lastChar[0] = buf[buf.length - 2]; -+ this.lastChar[1] = buf[buf.length - 1]; -+ return r.slice(0, -1); -+ } -+ } -+ return r; -+ } -+ this.lastNeed = 1; -+ this.lastTotal = 2; -+ this.lastChar[0] = buf[buf.length - 1]; -+ return buf.toString('utf16le', i, buf.length - 1); -+} -+ -+// For UTF-16LE we do not explicitly append special replacement characters if we -+// end on a partial character, we simply let v8 handle that. -+function utf16End(buf) { -+ var r = buf && buf.length ? this.write(buf) : ''; -+ if (this.lastNeed) { -+ var end = this.lastTotal - this.lastNeed; -+ return r + this.lastChar.toString('utf16le', 0, end); -+ } -+ return r; -+} -+ -+function base64Text(buf, i) { -+ var n = (buf.length - i) % 3; -+ if (n === 0) return buf.toString('base64', i); -+ this.lastNeed = 3 - n; -+ this.lastTotal = 3; -+ if (n === 1) { -+ this.lastChar[0] = buf[buf.length - 1]; -+ } else { -+ this.lastChar[0] = buf[buf.length - 2]; -+ this.lastChar[1] = buf[buf.length - 1]; -+ } -+ return buf.toString('base64', i, buf.length - n); -+} -+ -+function base64End(buf) { -+ var r = buf && buf.length ? this.write(buf) : ''; -+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); -+ return r; -+} -+ -+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -+function simpleWrite(buf) { -+ return buf.toString(this.encoding); -+} -+ -+function simpleEnd(buf) { -+ return buf && buf.length ? this.write(buf) : ''; -+} -+}, -+"8eJvMSKQiuqd806j82V6H/oF5fWJq8Hm4glAWUly/40=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('inherits') -+var EventEmitter = require('events').EventEmitter -+var IndexState = require('./lib/state') -+var clone = require('clone') -+ -+module.exports = Indexer -+ -+var State = { -+ PreIndexing: 'preindexing', -+ Indexing: 'indexing', -+ Idle: 'idle', -+ Paused: 'paused', -+ Error: 'error' -+} -+ -+function Indexer (opts) { -+ if (!(this instanceof Indexer)) return new Indexer(opts) -+ -+ if (!opts) throw new Error('missing opts param') -+ if (!opts.log) throw new Error('missing opts param "log"') -+ if (!opts.batch) throw new Error('missing opts param "batch"') -+ if (!allOrNone(!!opts.storeState, !!opts.fetchState)) { -+ throw new Error('either none or all of (opts.storeState, opts.fetchState) must be provided') -+ } -+ if (!unset(opts.version) && typeof opts.version !== 'number') throw new Error('opts.version must be a number') -+ // TODO: support forward & backward indexing from newest -+ -+ this._version = unset(opts.version) ? 1 : opts.version -+ this._log = opts.log -+ this._batch = opts.batch -+ this._maxBatch = unset(opts.maxBatch) ? 50 : opts.maxBatch -+ -+ // Is there another pending indexing run? -+ this._pending = false -+ -+ this._state = { -+ state: State.Indexing, -+ context: { -+ totalBlocks: 0, -+ indexedBlocks: 0, -+ prevIndexedBlocks: 0, -+ indexStartTime: Date.now(), -+ error: null -+ } -+ } -+ -+ this._at = null -+ // bind methods to this so we can pass them directly to event listeners -+ this._freshRun = this._run.bind(this, false) -+ this._onNewFeed = this._onNewFeed.bind(this) -+ -+ if (!opts.storeState && !opts.fetchState && !opts.clearIndex) { -+ // In-memory storage implementation -+ var state -+ this._storeIndexState = function (buf, cb) { -+ state = buf -+ process.nextTick(cb) -+ } -+ this._fetchIndexState = function (cb) { -+ process.nextTick(cb, null, state) -+ } -+ this._clearIndex = function (cb) { -+ state = null -+ process.nextTick(cb) -+ } -+ } else { -+ this._storeIndexState = opts.storeState -+ this._fetchIndexState = opts.fetchState -+ this._clearIndex = opts.clearIndex || null -+ } -+ -+ var self = this -+ -+ this._onError = function (err) { -+ self._setState(State.Error, { error: err }) -+ self.emit('error', err) -+ } -+ -+ this._log.ready(function () { -+ self._fetchIndexState(function (err, state) { -+ if (err && !err.notFound) { -+ self._onError(err) -+ return -+ } -+ if (!state) { -+ start() -+ return -+ } -+ -+ try { -+ state = IndexState.deserialize(state) -+ } catch (e) { -+ self._onError(e) -+ return -+ } -+ -+ // Wipe existing index if versions don't match (and there's a 'clearIndex' implementation) -+ var storedVersion = state.version -+ if (storedVersion !== self._version && self._clearIndex) { -+ self._clearIndex(function (err) { -+ if (err) { -+ self._onError(err) -+ } else { -+ start() -+ } -+ }) -+ } else { -+ start() -+ } -+ }) -+ }) -+ -+ function start () { -+ self._setState(State.Idle) -+ self._freshRun() -+ } -+ -+ this._log.on('feed', this._onNewFeed) -+ -+ this.setMaxListeners(1024) -+} -+ -+inherits(Indexer, EventEmitter) -+ -+Indexer.prototype._onNewFeed = function (feed, idx) { -+ var self = this -+ feed.setMaxListeners(128) -+ feed.ready(function () { -+ // It's possible these listeners are already attached. Ensure they are -+ // removed before attaching them to avoid attaching them twice -+ feed.removeListener('append', self._freshRun) -+ feed.removeListener('download', self._freshRun) -+ feed.on('append', self._freshRun) -+ feed.on('download', self._freshRun) -+ if (self._state.state === State.Idle) self._freshRun() -+ }) -+} -+ -+Indexer.prototype.pause = function (cb) { -+ cb = cb || function () {} -+ var self = this -+ -+ if (this._state.state === State.Paused || this._wantPause) { -+ process.nextTick(cb) -+ } else if (this._state.state === State.Idle) { -+ self._setState(State.Paused) -+ process.nextTick(cb) -+ } else { -+ this._wantPause = true -+ this.once('pause', function () { -+ self._wantPause = false -+ self._setState(State.Paused) -+ cb() -+ }) -+ } -+} -+ -+Indexer.prototype.resume = function () { -+ if (this._state.state !== State.Paused) return -+ -+ this._setState(State.Idle) -+ this._freshRun() -+} -+ -+Indexer.prototype.ready = function (fn) { -+ if (this._state.state === State.Idle || this._state.state === State.Paused) process.nextTick(fn) -+ else this.once('ready', fn) -+} -+ -+Indexer.prototype._run = function (continuedRun) { -+ if (this._wantPause) { -+ this._wantPause = false -+ this._pending = true -+ this.emit('pause') -+ return -+ } -+ if (!continuedRun && this._state.state !== State.Idle) { -+ this._pending = true -+ return -+ } -+ var self = this -+ -+ this._state.state = State.PreIndexing -+ -+ var didWork = false -+ -+ // load state from storage -+ if (!this._at) { -+ this._fetchIndexState(function (err, state) { -+ if (err && !err.notFound) return self._onError(err) -+ if (!state) { -+ if (!self._clearIndex) return resetAt() -+ self._clearIndex(function (err) { -+ if (err) return self._onError(err) -+ resetAt() -+ }) -+ } else { -+ self._at = IndexState.deserialize(state).keys -+ withState() -+ } -+ -+ function resetAt () { -+ self._at = {} -+ self._log.feeds().forEach(function (feed) { -+ self._at[feed.key.toString('hex')] = { -+ key: feed.key, -+ min: 0, -+ max: 0 -+ } -+ }) -+ withState() -+ } -+ -+ function withState () { -+ self._log.feeds().forEach(function (feed) { -+ feed.setMaxListeners(128) -+ // The ready() method also adds these events listeners. Try to remove -+ // them first so that they aren't added twice. -+ feed.removeListener('append', self._freshRun) -+ feed.removeListener('download', self._freshRun) -+ feed.on('append', self._freshRun) -+ feed.on('download', self._freshRun) -+ }) -+ -+ work() -+ } -+ }) -+ } else { -+ work() -+ } -+ -+ function work () { -+ var feeds = self._log.feeds() -+ var nodes = [] -+ -+ // Check if there is anything new. -+ var indexedBlocks = Object.values(self._at).reduce((accum, entry) => accum + entry.max, 0) -+ var totalBlocks = self._log.feeds().reduce((accum, feed) => accum + feed.length, 0) -+ -+ // Bail if no work needs to happen. -+ if (indexedBlocks === totalBlocks) { -+ return done() -+ } -+ -+ if (!continuedRun) { -+ const context = { -+ indexStartTime: Date.now(), -+ prevIndexedBlocks: self._state.context.indexedBlocks, -+ indexedBlocks: indexedBlocks, -+ totalBlocks: totalBlocks -+ } -+ self._setState(State.Indexing, context) -+ } -+ -+ ;(function collect (i) { -+ if (i >= feeds.length) return done() -+ -+ feeds[i].ready(function () { -+ var key = feeds[i].key.toString('hex') -+ -+ if (self._at[key] === undefined) { -+ self._at[key] = { key: feeds[i].key, min: 0, max: 0 } -+ } -+ -+ // prefer to process forward -+ var at = self._at[key].max -+ var to = Math.min(feeds[i].length, at + self._maxBatch) -+ -+ if (!feeds[i].has(at, to)) { -+ return collect(i + 1) -+ } else if (at < to) { -+ // TODO: This waits for all of the blocks to be available, and -+ // actually blocks ALL indexing until it's ready. The intention is to -+ // get min(maxBatch, feed.length-at) CONTIGUOUS entries -+ feeds[i].getBatch(at, to, {wait: false}, function (err, res) { -+ if (err || !res.length) { -+ return collect(i + 1) -+ } -+ for (var j = 0; j < res.length; j++) { -+ var node = res[j] -+ nodes.push({ -+ key: feeds[i].key.toString('hex'), -+ seq: j + at, -+ value: node -+ }) -+ } -+ -+ didWork = true -+ self._batch(nodes, function (err) { -+ if (err) return done(err) -+ self._at[key].max += nodes.length -+ self._storeIndexState(IndexState.serialize(self._at, self._version), function (err) { -+ if (err) return done(err) -+ self.emit('indexed', nodes) -+ done() -+ }) -+ }) -+ }) -+ } else { -+ collect(i + 1) -+ } -+ }) -+ })(0) -+ -+ function done (err) { -+ if (err) { -+ self._onError(err) -+ return -+ } -+ -+ if (didWork || self._pending) { -+ self._state.context.totalBlocks = self._log.feeds().reduce( -+ (accum, feed) => accum + feed.length, 0) -+ self._state.context.indexedBlocks = Object.values(self._at).reduce( -+ (accum, entry) => accum + entry.max, 0) -+ -+ self._pending = false -+ self._run(true) -+ } else { -+ if (self._wantPause) { -+ self._wantPause = false -+ self._pending = true -+ self.emit('pause') -+ } else { -+ // Don't do a proper state change if this is the first run and -+ // nothing had to be indexed, since it would look like Idle -> Idle -+ // to API consumers. -+ if (continuedRun) self._setState(State.Idle) -+ else self._state.state = State.Idle -+ -+ self.emit('ready') -+ } -+ } -+ } -+ } -+} -+ -+// Set state to `state` and apply updates `context` to the state context. Also -+// emits a `state-update` event. -+Indexer.prototype._setState = function (state, context) { -+ if (state === this._state.state) return -+ -+ if (!context) context = {} -+ -+ this._state.state = state -+ this._state.context = Object.assign({}, this._state.context, context) -+ this.emit('state-update', clone(this._state, false)) -+} -+ -+Indexer.prototype.getState = function () { -+ const state = clone(this._state, false) -+ -+ // hidden states -+ if (state.state === State.PreIndexing) state.state = State.Idle -+ -+ return state -+} -+ -+function allOrNone (a, b) { -+ return (!!a && !!b) || (!a && !b) -+} -+ -+function unset (x) { -+ return x === null || x === undefined -+} -+ -+}, -+"8huOHw3YpnUEc1jFrINmH4jp6rW0mevIIW9iBROyNio=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var Uint8ArrayReader = require('./uint8ArrayReader'); -+ -+function NodeBufferReader(data) { -+ this.data = data; -+ this.length = this.data.length; -+ this.index = 0; -+} -+NodeBufferReader.prototype = new Uint8ArrayReader(); -+ -+/** -+ * @see DataReader.readData -+ */ -+NodeBufferReader.prototype.readData = function(size) { -+ this.checkOffset(size); -+ var result = this.data.slice(this.index, this.index + size); -+ this.index += size; -+ return result; -+}; -+module.exports = NodeBufferReader; -+ -+}, -+"8iQAAf3DoioB+OWyEg2oSEmYq2CPfD4N2nWCRo1BnUo=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+/** -+ * Module dependencies -+ */ -+ -+var util = require('util'); -+var toRegex = require('to-regex'); -+var extend = require('extend-shallow'); -+ -+/** -+ * Local dependencies -+ */ -+ -+var compilers = require('./lib/compilers'); -+var parsers = require('./lib/parsers'); -+var cache = require('./lib/cache'); -+var utils = require('./lib/utils'); -+var MAX_LENGTH = 1024 * 64; -+ -+/** -+ * The main function takes a list of strings and one or more -+ * glob patterns to use for matching. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm(list, patterns[, options]); -+ * -+ * console.log(nm(['a.js', 'a.txt'], ['*.js'])); -+ * //=> [ 'a.js' ] -+ * ``` -+ * @param {Array} `list` A list of strings to match -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Array} Returns an array of matches -+ * @summary false -+ * @api public -+ */ -+ -+function nanomatch(list, patterns, options) { -+ patterns = utils.arrayify(patterns); -+ list = utils.arrayify(list); -+ -+ var len = patterns.length; -+ if (list.length === 0 || len === 0) { -+ return []; -+ } -+ -+ if (len === 1) { -+ return nanomatch.match(list, patterns[0], options); -+ } -+ -+ var negated = false; -+ var omit = []; -+ var keep = []; -+ var idx = -1; -+ -+ while (++idx < len) { -+ var pattern = patterns[idx]; -+ -+ if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { -+ omit.push.apply(omit, nanomatch.match(list, pattern.slice(1), options)); -+ negated = true; -+ } else { -+ keep.push.apply(keep, nanomatch.match(list, pattern, options)); -+ } -+ } -+ -+ // minimatch.match parity -+ if (negated && keep.length === 0) { -+ if (options && options.unixify === false) { -+ keep = list.slice(); -+ } else { -+ var unixify = utils.unixify(options); -+ for (var i = 0; i < list.length; i++) { -+ keep.push(unixify(list[i])); -+ } -+ } -+ } -+ -+ var matches = utils.diff(keep, omit); -+ if (!options || options.nodupes !== false) { -+ return utils.unique(matches); -+ } -+ -+ return matches; -+} -+ -+/** -+ * Similar to the main function, but `pattern` must be a string. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.match(list, pattern[, options]); -+ * -+ * console.log(nm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); -+ * //=> ['a.a', 'a.aa'] -+ * ``` -+ * @param {Array} `list` Array of strings to match -+ * @param {String} `pattern` Glob pattern to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Array} Returns an array of matches -+ * @api public -+ */ -+ -+nanomatch.match = function(list, pattern, options) { -+ if (Array.isArray(pattern)) { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ var unixify = utils.unixify(options); -+ var isMatch = memoize('match', pattern, options, nanomatch.matcher); -+ var matches = []; -+ -+ list = utils.arrayify(list); -+ var len = list.length; -+ var idx = -1; -+ -+ while (++idx < len) { -+ var ele = list[idx]; -+ if (ele === pattern || isMatch(ele)) { -+ matches.push(utils.value(ele, unixify, options)); -+ } -+ } -+ -+ // if no options were passed, uniquify results and return -+ if (typeof options === 'undefined') { -+ return utils.unique(matches); -+ } -+ -+ if (matches.length === 0) { -+ if (options.failglob === true) { -+ throw new Error('no matches found for "' + pattern + '"'); -+ } -+ if (options.nonull === true || options.nullglob === true) { -+ return [options.unescape ? utils.unescape(pattern) : pattern]; -+ } -+ } -+ -+ // if `opts.ignore` was defined, diff ignored list -+ if (options.ignore) { -+ matches = nanomatch.not(matches, options.ignore, options); -+ } -+ -+ return options.nodupes !== false ? utils.unique(matches) : matches; -+}; -+ -+/** -+ * Returns true if the specified `string` matches the given glob `pattern`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.isMatch(string, pattern[, options]); -+ * -+ * console.log(nm.isMatch('a.a', '*.a')); -+ * //=> true -+ * console.log(nm.isMatch('a.b', '*.a')); -+ * //=> false -+ * ``` -+ * @param {String} `string` String to match -+ * @param {String} `pattern` Glob pattern to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if the string matches the glob pattern. -+ * @api public -+ */ -+ -+nanomatch.isMatch = function(str, pattern, options) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string: "' + util.inspect(str) + '"'); -+ } -+ -+ if (utils.isEmptyString(str) || utils.isEmptyString(pattern)) { -+ return false; -+ } -+ -+ var equals = utils.equalsPattern(options); -+ if (equals(str)) { -+ return true; -+ } -+ -+ var isMatch = memoize('isMatch', pattern, options, nanomatch.matcher); -+ return isMatch(str); -+}; -+ -+/** -+ * Returns true if some of the elements in the given `list` match any of the -+ * given glob `patterns`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.some(list, patterns[, options]); -+ * -+ * console.log(nm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); -+ * // true -+ * console.log(nm.some(['foo.js'], ['*.js', '!foo.js'])); -+ * // false -+ * ``` -+ * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if any patterns match `str` -+ * @api public -+ */ -+ -+nanomatch.some = function(list, patterns, options) { -+ if (typeof list === 'string') { -+ list = [list]; -+ } -+ -+ for (var i = 0; i < list.length; i++) { -+ if (nanomatch(list[i], patterns, options).length === 1) { -+ return true; -+ } -+ } -+ -+ return false; -+}; -+ -+/** -+ * Returns true if every element in the given `list` matches -+ * at least one of the given glob `patterns`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.every(list, patterns[, options]); -+ * -+ * console.log(nm.every('foo.js', ['foo.js'])); -+ * // true -+ * console.log(nm.every(['foo.js', 'bar.js'], ['*.js'])); -+ * // true -+ * console.log(nm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); -+ * // false -+ * console.log(nm.every(['foo.js'], ['*.js', '!foo.js'])); -+ * // false -+ * ``` -+ * @param {String|Array} `list` The string or array of strings to test. -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if any patterns match `str` -+ * @api public -+ */ -+ -+nanomatch.every = function(list, patterns, options) { -+ if (typeof list === 'string') { -+ list = [list]; -+ } -+ -+ for (var i = 0; i < list.length; i++) { -+ if (nanomatch(list[i], patterns, options).length !== 1) { -+ return false; -+ } -+ } -+ -+ return true; -+}; -+ -+/** -+ * Returns true if **any** of the given glob `patterns` -+ * match the specified `string`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.any(string, patterns[, options]); -+ * -+ * console.log(nm.any('a.a', ['b.*', '*.a'])); -+ * //=> true -+ * console.log(nm.any('a.a', 'b.*')); -+ * //=> false -+ * ``` -+ * @param {String|Array} `str` The string to test. -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if any patterns match `str` -+ * @api public -+ */ -+ -+nanomatch.any = function(str, patterns, options) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string: "' + util.inspect(str) + '"'); -+ } -+ -+ if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { -+ return false; -+ } -+ -+ if (typeof patterns === 'string') { -+ patterns = [patterns]; -+ } -+ -+ for (var i = 0; i < patterns.length; i++) { -+ if (nanomatch.isMatch(str, patterns[i], options)) { -+ return true; -+ } -+ } -+ return false; -+}; -+ -+/** -+ * Returns true if **all** of the given `patterns` -+ * match the specified string. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.all(string, patterns[, options]); -+ * -+ * console.log(nm.all('foo.js', ['foo.js'])); -+ * // true -+ * -+ * console.log(nm.all('foo.js', ['*.js', '!foo.js'])); -+ * // false -+ * -+ * console.log(nm.all('foo.js', ['*.js', 'foo.js'])); -+ * // true -+ * -+ * console.log(nm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); -+ * // true -+ * ``` -+ * @param {String|Array} `str` The string to test. -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if any patterns match `str` -+ * @api public -+ */ -+ -+nanomatch.all = function(str, patterns, options) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string: "' + util.inspect(str) + '"'); -+ } -+ -+ if (typeof patterns === 'string') { -+ patterns = [patterns]; -+ } -+ -+ for (var i = 0; i < patterns.length; i++) { -+ if (!nanomatch.isMatch(str, patterns[i], options)) { -+ return false; -+ } -+ } -+ return true; -+}; -+ -+/** -+ * Returns a list of strings that _**do not match any**_ of the given `patterns`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.not(list, patterns[, options]); -+ * -+ * console.log(nm.not(['a.a', 'b.b', 'c.c'], '*.a')); -+ * //=> ['b.b', 'c.c'] -+ * ``` -+ * @param {Array} `list` Array of strings to match. -+ * @param {String|Array} `patterns` One or more glob pattern to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Array} Returns an array of strings that **do not match** the given patterns. -+ * @api public -+ */ -+ -+nanomatch.not = function(list, patterns, options) { -+ var opts = extend({}, options); -+ var ignore = opts.ignore; -+ delete opts.ignore; -+ -+ list = utils.arrayify(list); -+ -+ var matches = utils.diff(list, nanomatch(list, patterns, opts)); -+ if (ignore) { -+ matches = utils.diff(matches, nanomatch(list, ignore)); -+ } -+ -+ return opts.nodupes !== false ? utils.unique(matches) : matches; -+}; -+ -+/** -+ * Returns true if the given `string` contains the given pattern. Similar -+ * to [.isMatch](#isMatch) but the pattern can match any part of the string. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.contains(string, pattern[, options]); -+ * -+ * console.log(nm.contains('aa/bb/cc', '*b')); -+ * //=> true -+ * console.log(nm.contains('aa/bb/cc', '*d')); -+ * //=> false -+ * ``` -+ * @param {String} `str` The string to match. -+ * @param {String|Array} `patterns` Glob pattern to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns true if the patter matches any part of `str`. -+ * @api public -+ */ -+ -+nanomatch.contains = function(str, patterns, options) { -+ if (typeof str !== 'string') { -+ throw new TypeError('expected a string: "' + util.inspect(str) + '"'); -+ } -+ -+ if (typeof patterns === 'string') { -+ if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) { -+ return false; -+ } -+ -+ var equals = utils.equalsPattern(patterns, options); -+ if (equals(str)) { -+ return true; -+ } -+ var contains = utils.containsPattern(patterns, options); -+ if (contains(str)) { -+ return true; -+ } -+ } -+ -+ var opts = extend({}, options, {contains: true}); -+ return nanomatch.any(str, patterns, opts); -+}; -+ -+/** -+ * Returns true if the given pattern and options should enable -+ * the `matchBase` option. -+ * @return {Boolean} -+ * @api private -+ */ -+ -+nanomatch.matchBase = function(pattern, options) { -+ if (pattern && pattern.indexOf('/') !== -1 || !options) return false; -+ return options.basename === true || options.matchBase === true; -+}; -+ -+/** -+ * Filter the keys of the given object with the given `glob` pattern -+ * and `options`. Does not attempt to match nested keys. If you need this feature, -+ * use [glob-object][] instead. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.matchKeys(object, patterns[, options]); -+ * -+ * var obj = { aa: 'a', ab: 'b', ac: 'c' }; -+ * console.log(nm.matchKeys(obj, '*b')); -+ * //=> { ab: 'b' } -+ * ``` -+ * @param {Object} `object` The object with keys to filter. -+ * @param {String|Array} `patterns` One or more glob patterns to use for matching. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Object} Returns an object with only keys that match the given patterns. -+ * @api public -+ */ -+ -+nanomatch.matchKeys = function(obj, patterns, options) { -+ if (!utils.isObject(obj)) { -+ throw new TypeError('expected the first argument to be an object'); -+ } -+ var keys = nanomatch(Object.keys(obj), patterns, options); -+ return utils.pick(obj, keys); -+}; -+ -+/** -+ * Returns a memoized matcher function from the given glob `pattern` and `options`. -+ * The returned function takes a string to match as its only argument and returns -+ * true if the string is a match. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.matcher(pattern[, options]); -+ * -+ * var isMatch = nm.matcher('*.!(*a)'); -+ * console.log(isMatch('a.a')); -+ * //=> false -+ * console.log(isMatch('a.b')); -+ * //=> true -+ * ``` -+ * @param {String} `pattern` Glob pattern -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed. -+ * @return {Function} Returns a matcher function. -+ * @api public -+ */ -+ -+nanomatch.matcher = function matcher(pattern, options) { -+ if (utils.isEmptyString(pattern)) { -+ return function() { -+ return false; -+ }; -+ } -+ -+ if (Array.isArray(pattern)) { -+ return compose(pattern, options, matcher); -+ } -+ -+ // if pattern is a regex -+ if (pattern instanceof RegExp) { -+ return test(pattern); -+ } -+ -+ // if pattern is invalid -+ if (!utils.isString(pattern)) { -+ throw new TypeError('expected pattern to be an array, string or regex'); -+ } -+ -+ // if pattern is a non-glob string -+ if (!utils.hasSpecialChars(pattern)) { -+ if (options && options.nocase === true) { -+ pattern = pattern.toLowerCase(); -+ } -+ return utils.matchPath(pattern, options); -+ } -+ -+ // if pattern is a glob string -+ var re = nanomatch.makeRe(pattern, options); -+ -+ // if `options.matchBase` or `options.basename` is defined -+ if (nanomatch.matchBase(pattern, options)) { -+ return utils.matchBasename(re, options); -+ } -+ -+ function test(regex) { -+ var equals = utils.equalsPattern(options); -+ var unixify = utils.unixify(options); -+ -+ return function(str) { -+ if (equals(str)) { -+ return true; -+ } -+ -+ if (regex.test(unixify(str))) { -+ return true; -+ } -+ return false; -+ }; -+ } -+ -+ // create matcher function -+ var matcherFn = test(re); -+ // set result object from compiler on matcher function, -+ // as a non-enumerable property. useful for debugging -+ utils.define(matcherFn, 'result', re.result); -+ return matcherFn; -+}; -+ -+/** -+ * Returns an array of matches captured by `pattern` in `string, or -+ * `null` if the pattern did not match. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.capture(pattern, string[, options]); -+ * -+ * console.log(nm.capture('test/*.js', 'test/foo.js')); -+ * //=> ['foo'] -+ * console.log(nm.capture('test/*.js', 'foo/bar.css')); -+ * //=> null -+ * ``` -+ * @param {String} `pattern` Glob pattern to use for matching. -+ * @param {String} `string` String to match -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed -+ * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`. -+ * @api public -+ */ -+ -+nanomatch.capture = function(pattern, str, options) { -+ var re = nanomatch.makeRe(pattern, extend({capture: true}, options)); -+ var unixify = utils.unixify(options); -+ -+ function match() { -+ return function(string) { -+ var match = re.exec(unixify(string)); -+ if (!match) { -+ return null; -+ } -+ -+ return match.slice(1); -+ }; -+ } -+ -+ var capture = memoize('capture', pattern, options, match); -+ return capture(str); -+}; -+ -+/** -+ * Create a regular expression from the given glob `pattern`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.makeRe(pattern[, options]); -+ * -+ * console.log(nm.makeRe('*.js')); -+ * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ -+ * ``` -+ * @param {String} `pattern` A glob pattern to convert to regex. -+ * @param {Object} `options` See available [options](#options) for changing how matches are performed. -+ * @return {RegExp} Returns a regex created from the given pattern. -+ * @api public -+ */ -+ -+nanomatch.makeRe = function(pattern, options) { -+ if (pattern instanceof RegExp) { -+ return pattern; -+ } -+ -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected pattern to be a string'); -+ } -+ -+ if (pattern.length > MAX_LENGTH) { -+ throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); -+ } -+ -+ function makeRe() { -+ var opts = utils.extend({wrap: false}, options); -+ var result = nanomatch.create(pattern, opts); -+ var regex = toRegex(result.output, opts); -+ utils.define(regex, 'result', result); -+ return regex; -+ } -+ -+ return memoize('makeRe', pattern, options, makeRe); -+}; -+ -+/** -+ * Parses the given glob `pattern` and returns an object with the compiled `output` -+ * and optional source `map`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.create(pattern[, options]); -+ * -+ * console.log(nm.create('abc/*.js')); -+ * // { options: { source: 'string', sourcemap: true }, -+ * // state: {}, -+ * // compilers: -+ * // { ... }, -+ * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', -+ * // ast: -+ * // { type: 'root', -+ * // errors: [], -+ * // nodes: -+ * // [ ... ], -+ * // dot: false, -+ * // input: 'abc/*.js' }, -+ * // parsingErrors: [], -+ * // map: -+ * // { version: 3, -+ * // sources: [ 'string' ], -+ * // names: [], -+ * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', -+ * // sourcesContent: [ 'abc/*.js' ] }, -+ * // position: { line: 1, column: 28 }, -+ * // content: {}, -+ * // files: {}, -+ * // idx: 6 } -+ * ``` -+ * @param {String} `pattern` Glob pattern to parse and compile. -+ * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. -+ * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. -+ * @api public -+ */ -+ -+nanomatch.create = function(pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected a string'); -+ } -+ function create() { -+ return nanomatch.compile(nanomatch.parse(pattern, options), options); -+ } -+ return memoize('create', pattern, options, create); -+}; -+ -+/** -+ * Parse the given `str` with the given `options`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.parse(pattern[, options]); -+ * -+ * var ast = nm.parse('a/{b,c}/d'); -+ * console.log(ast); -+ * // { type: 'root', -+ * // errors: [], -+ * // input: 'a/{b,c}/d', -+ * // nodes: -+ * // [ { type: 'bos', val: '' }, -+ * // { type: 'text', val: 'a/' }, -+ * // { type: 'brace', -+ * // nodes: -+ * // [ { type: 'brace.open', val: '{' }, -+ * // { type: 'text', val: 'b,c' }, -+ * // { type: 'brace.close', val: '}' } ] }, -+ * // { type: 'text', val: '/d' }, -+ * // { type: 'eos', val: '' } ] } -+ * ``` -+ * @param {String} `str` -+ * @param {Object} `options` -+ * @return {Object} Returns an AST -+ * @api public -+ */ -+ -+nanomatch.parse = function(pattern, options) { -+ if (typeof pattern !== 'string') { -+ throw new TypeError('expected a string'); -+ } -+ -+ function parse() { -+ var snapdragon = utils.instantiate(null, options); -+ parsers(snapdragon, options); -+ -+ var ast = snapdragon.parse(pattern, options); -+ utils.define(ast, 'snapdragon', snapdragon); -+ ast.input = pattern; -+ return ast; -+ } -+ -+ return memoize('parse', pattern, options, parse); -+}; -+ -+/** -+ * Compile the given `ast` or string with the given `options`. -+ * -+ * ```js -+ * var nm = require('nanomatch'); -+ * nm.compile(ast[, options]); -+ * -+ * var ast = nm.parse('a/{b,c}/d'); -+ * console.log(nm.compile(ast)); -+ * // { options: { source: 'string' }, -+ * // state: {}, -+ * // compilers: -+ * // { eos: [Function], -+ * // noop: [Function], -+ * // bos: [Function], -+ * // brace: [Function], -+ * // 'brace.open': [Function], -+ * // text: [Function], -+ * // 'brace.close': [Function] }, -+ * // output: [ 'a/(b|c)/d' ], -+ * // ast: -+ * // { ... }, -+ * // parsingErrors: [] } -+ * ``` -+ * @param {Object|String} `ast` -+ * @param {Object} `options` -+ * @return {Object} Returns an object that has an `output` property with the compiled string. -+ * @api public -+ */ -+ -+nanomatch.compile = function(ast, options) { -+ if (typeof ast === 'string') { -+ ast = nanomatch.parse(ast, options); -+ } -+ -+ function compile() { -+ var snapdragon = utils.instantiate(ast, options); -+ compilers(snapdragon, options); -+ return snapdragon.compile(ast, options); -+ } -+ -+ return memoize('compile', ast.input, options, compile); -+}; -+ -+/** -+ * Clear the regex cache. -+ * -+ * ```js -+ * nm.clearCache(); -+ * ``` -+ * @api public -+ */ -+ -+nanomatch.clearCache = function() { -+ nanomatch.cache.__data__ = {}; -+}; -+ -+/** -+ * Compose a matcher function with the given patterns. -+ * This allows matcher functions to be compiled once and -+ * called multiple times. -+ */ -+ -+function compose(patterns, options, matcher) { -+ var matchers; -+ -+ return memoize('compose', String(patterns), options, function() { -+ return function(file) { -+ // delay composition until it's invoked the first time, -+ // after that it won't be called again -+ if (!matchers) { -+ matchers = []; -+ for (var i = 0; i < patterns.length; i++) { -+ matchers.push(matcher(patterns[i], options)); -+ } -+ } -+ -+ var len = matchers.length; -+ while (len--) { -+ if (matchers[len](file) === true) { -+ return true; -+ } -+ } -+ return false; -+ }; -+ }); -+} -+ -+/** -+ * Memoize a generated regex or function. A unique key is generated -+ * from the `type` (usually method name), the `pattern`, and -+ * user-defined options. -+ */ -+ -+function memoize(type, pattern, options, fn) { -+ var key = utils.createKey(type + '=' + pattern, options); -+ -+ if (options && options.cache === false) { -+ return fn(pattern, options); -+ } -+ -+ if (cache.has(type, key)) { -+ return cache.get(type, key); -+ } -+ -+ var val = fn(pattern, options); -+ cache.set(type, key, val); -+ return val; -+} -+ -+/** -+ * Expose compiler, parser and cache on `nanomatch` -+ */ -+ -+nanomatch.compilers = compilers; -+nanomatch.parsers = parsers; -+nanomatch.cache = cache; -+ -+/** -+ * Expose `nanomatch` -+ * @type {Function} -+ */ -+ -+module.exports = nanomatch; -+ -+}, -+"8jety1KEnefBKPV+BGi1I1PFKabINBgQR3wOcUQ1lVk=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * Module dependencies. -+ */ -+ -+const tty = require('tty'); -+const util = require('util'); -+ -+/** -+ * This is the Node.js implementation of `debug()`. -+ */ -+ -+exports.init = init; -+exports.log = log; -+exports.formatArgs = formatArgs; -+exports.save = save; -+exports.load = load; -+exports.useColors = useColors; -+exports.destroy = util.deprecate( -+ () => {}, -+ 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' -+); -+ -+/** -+ * Colors. -+ */ -+ -+exports.colors = [6, 2, 3, 4, 5, 1]; -+ -+try { -+ // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) -+ // eslint-disable-next-line import/no-extraneous-dependencies -+ const supportsColor = require('supports-color'); -+ -+ if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { -+ exports.colors = [ -+ 20, -+ 21, -+ 26, -+ 27, -+ 32, -+ 33, -+ 38, -+ 39, -+ 40, -+ 41, -+ 42, -+ 43, -+ 44, -+ 45, -+ 56, -+ 57, -+ 62, -+ 63, -+ 68, -+ 69, -+ 74, -+ 75, -+ 76, -+ 77, -+ 78, -+ 79, -+ 80, -+ 81, -+ 92, -+ 93, -+ 98, -+ 99, -+ 112, -+ 113, -+ 128, -+ 129, -+ 134, -+ 135, -+ 148, -+ 149, -+ 160, -+ 161, -+ 162, -+ 163, -+ 164, -+ 165, -+ 166, -+ 167, -+ 168, -+ 169, -+ 170, -+ 171, -+ 172, -+ 173, -+ 178, -+ 179, -+ 184, -+ 185, -+ 196, -+ 197, -+ 198, -+ 199, -+ 200, -+ 201, -+ 202, -+ 203, -+ 204, -+ 205, -+ 206, -+ 207, -+ 208, -+ 209, -+ 214, -+ 215, -+ 220, -+ 221 -+ ]; -+ } -+} catch (error) { -+ // Swallow - we only care if `supports-color` is available; it doesn't have to be. -+} -+ -+/** -+ * Build up the default `inspectOpts` object from the environment variables. -+ * -+ * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js -+ */ -+ -+exports.inspectOpts = Object.keys(process.env).filter(key => { -+ return /^debug_/i.test(key); -+}).reduce((obj, key) => { -+ // Camel-case -+ const prop = key -+ .substring(6) -+ .toLowerCase() -+ .replace(/_([a-z])/g, (_, k) => { -+ return k.toUpperCase(); -+ }); -+ -+ // Coerce string value into JS value -+ let val = process.env[key]; -+ if (/^(yes|on|true|enabled)$/i.test(val)) { -+ val = true; -+ } else if (/^(no|off|false|disabled)$/i.test(val)) { -+ val = false; -+ } else if (val === 'null') { -+ val = null; -+ } else { -+ val = Number(val); -+ } -+ -+ obj[prop] = val; -+ return obj; -+}, {}); -+ -+/** -+ * Is stdout a TTY? Colored output is enabled when `true`. -+ */ -+ -+function useColors() { -+ return 'colors' in exports.inspectOpts ? -+ Boolean(exports.inspectOpts.colors) : -+ tty.isatty(process.stderr.fd); -+} -+ -+/** -+ * Adds ANSI color escape codes if enabled. -+ * -+ * @api public -+ */ -+ -+function formatArgs(args) { -+ const {namespace: name, useColors} = this; -+ -+ if (useColors) { -+ const c = this.color; -+ const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); -+ const prefix = ` ${colorCode};1m${name} \u001B[0m`; -+ -+ args[0] = prefix + args[0].split('\n').join('\n' + prefix); -+ args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); -+ } else { -+ args[0] = getDate() + name + ' ' + args[0]; -+ } -+} -+ -+function getDate() { -+ if (exports.inspectOpts.hideDate) { -+ return ''; -+ } -+ return new Date().toISOString() + ' '; -+} -+ -+/** -+ * Invokes `util.format()` with the specified arguments and writes to stderr. -+ */ -+ -+function log(...args) { -+ return process.stderr.write(util.format(...args) + '\n'); -+} -+ -+/** -+ * Save `namespaces`. -+ * -+ * @param {String} namespaces -+ * @api private -+ */ -+function save(namespaces) { -+ if (namespaces) { -+ process.env.DEBUG = namespaces; -+ } else { -+ // If you set a process.env field to null or undefined, it gets cast to the -+ // string 'null' or 'undefined'. Just delete instead. -+ delete process.env.DEBUG; -+ } -+} -+ -+/** -+ * Load `namespaces`. -+ * -+ * @return {String} returns the previously persisted debug modes -+ * @api private -+ */ -+ -+function load() { -+ return process.env.DEBUG; -+} -+ -+/** -+ * Init logic for `debug` instances. -+ * -+ * Create a new `inspectOpts` object in case `useColors` is set -+ * differently for a particular `debug` instance. -+ */ -+ -+function init(debug) { -+ debug.inspectOpts = {}; -+ -+ const keys = Object.keys(exports.inspectOpts); -+ for (let i = 0; i < keys.length; i++) { -+ debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; -+ } -+} -+ -+module.exports = require('./common')(exports); -+ -+const {formatters} = module.exports; -+ -+/** -+ * Map %o to `util.inspect()`, all on a single line. -+ */ -+ -+formatters.o = function (v) { -+ this.inspectOpts.colors = this.useColors; -+ return util.inspect(v, this.inspectOpts) -+ .split('\n') -+ .map(str => str.trim()) -+ .join(' '); -+}; -+ -+/** -+ * Map %O to `util.inspect()`, allowing multiple lines if needed. -+ */ -+ -+formatters.O = function (v) { -+ this.inspectOpts.colors = this.useColors; -+ return util.inspect(v, this.inspectOpts); -+}; -+ -+}, -+"8ohhEiNrWrrdudvVxJYvA3+5qYebb80HZRWOzbcYjfo=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+function noop () { } -+ -+const proto = { -+ fatal: noop, -+ error: noop, -+ warn: noop, -+ info: noop, -+ debug: noop, -+ trace: noop -+} -+ -+Object.defineProperty(module, 'exports', { -+ get () { -+ return Object.create(proto) -+ } -+}) -+ -+}, -+"8wF+4EyFx3/wyXwCOpAJhOUDfJuk0j5h8qQvvDaldZ0=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * is-data-descriptor -+ * -+ * Copyright (c) 2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var typeOf = require('kind-of'); -+ -+// data descriptor properties -+var data = { -+ configurable: 'boolean', -+ enumerable: 'boolean', -+ writable: 'boolean' -+}; -+ -+function isDataDescriptor(obj, prop) { -+ if (typeOf(obj) !== 'object') { -+ return false; -+ } -+ -+ if (typeof prop === 'string') { -+ var val = Object.getOwnPropertyDescriptor(obj, prop); -+ return typeof val !== 'undefined'; -+ } -+ -+ if (!('value' in obj) && !('writable' in obj)) { -+ return false; -+ } -+ -+ for (var key in obj) { -+ if (key === 'value') continue; -+ -+ if (!data.hasOwnProperty(key)) { -+ continue; -+ } -+ -+ if (typeOf(obj[key]) === data[key]) { -+ continue; -+ } -+ -+ if (typeof obj[key] !== 'undefined') { -+ return false; -+ } -+ } -+ return true; -+} -+ -+/** -+ * Expose `isDataDescriptor` -+ */ -+ -+module.exports = isDataDescriptor; -+ -+}, -+"9+IcLWVqFSRy5obtvEuiq+NqI8D8gFXjV8w/UyL12ng=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var utils = require('./utils'); -+var support = require('./support'); -+// private property -+var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; -+ -+ -+// public method for encoding -+exports.encode = function(input) { -+ var output = []; -+ var chr1, chr2, chr3, enc1, enc2, enc3, enc4; -+ var i = 0, len = input.length, remainingBytes = len; -+ -+ var isArray = utils.getTypeOf(input) !== "string"; -+ while (i < input.length) { -+ remainingBytes = len - i; -+ -+ if (!isArray) { -+ chr1 = input.charCodeAt(i++); -+ chr2 = i < len ? input.charCodeAt(i++) : 0; -+ chr3 = i < len ? input.charCodeAt(i++) : 0; -+ } else { -+ chr1 = input[i++]; -+ chr2 = i < len ? input[i++] : 0; -+ chr3 = i < len ? input[i++] : 0; -+ } -+ -+ enc1 = chr1 >> 2; -+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); -+ enc3 = remainingBytes > 1 ? (((chr2 & 15) << 2) | (chr3 >> 6)) : 64; -+ enc4 = remainingBytes > 2 ? (chr3 & 63) : 64; -+ -+ output.push(_keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4)); -+ -+ } -+ -+ return output.join(""); -+}; -+ -+// public method for decoding -+exports.decode = function(input) { -+ var chr1, chr2, chr3; -+ var enc1, enc2, enc3, enc4; -+ var i = 0, resultIndex = 0; -+ -+ var dataUrlPrefix = "data:"; -+ -+ if (input.substr(0, dataUrlPrefix.length) === dataUrlPrefix) { -+ // This is a common error: people give a data url -+ // (data:image/png;base64,iVBOR...) with a {base64: true} and -+ // wonders why things don't work. -+ // We can detect that the string input looks like a data url but we -+ // *can't* be sure it is one: removing everything up to the comma would -+ // be too dangerous. -+ throw new Error("Invalid base64 input, it looks like a data url."); -+ } -+ -+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); -+ -+ var totalLength = input.length * 3 / 4; -+ if(input.charAt(input.length - 1) === _keyStr.charAt(64)) { -+ totalLength--; -+ } -+ if(input.charAt(input.length - 2) === _keyStr.charAt(64)) { -+ totalLength--; -+ } -+ if (totalLength % 1 !== 0) { -+ // totalLength is not an integer, the length does not match a valid -+ // base64 content. That can happen if: -+ // - the input is not a base64 content -+ // - the input is *almost* a base64 content, with a extra chars at the -+ // beginning or at the end -+ // - the input uses a base64 variant (base64url for example) -+ throw new Error("Invalid base64 input, bad content length."); -+ } -+ var output; -+ if (support.uint8array) { -+ output = new Uint8Array(totalLength|0); -+ } else { -+ output = new Array(totalLength|0); -+ } -+ -+ while (i < input.length) { -+ -+ enc1 = _keyStr.indexOf(input.charAt(i++)); -+ enc2 = _keyStr.indexOf(input.charAt(i++)); -+ enc3 = _keyStr.indexOf(input.charAt(i++)); -+ enc4 = _keyStr.indexOf(input.charAt(i++)); -+ -+ chr1 = (enc1 << 2) | (enc2 >> 4); -+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); -+ chr3 = ((enc3 & 3) << 6) | enc4; -+ -+ output[resultIndex++] = chr1; -+ -+ if (enc3 !== 64) { -+ output[resultIndex++] = chr2; -+ } -+ if (enc4 !== 64) { -+ output[resultIndex++] = chr3; -+ } -+ -+ } -+ -+ return output; -+}; -+ -+}, -+"9+wce2G4P9tVRIRBhw7hYB3xV1zzl0E6/LLP1g4+Tis=": -+function (require, module, exports, __dirname, __filename) { -+var calcIx = require('./calc-index.js') -+ -+module.exports = function (rows, opts) { -+ var B = opts.branchFactor -+ var dim = opts.dim -+ var write = opts.write -+ ;(function walk (rows, depth, index) { -+ if (rows.length === 1) { -+ write(index, rows[0]) -+ } -+ if (rows.length <= 1) return -+ var axis = depth % dim -+ rows.sort(function (a, b) { -+ return a.point[axis] < b.point[axis] ? -1 : +1 -+ }) -+ var step = (rows.length) / B -+ var j = 0, k = 0, n = 0 -+ var pk = -1 -+ var subi, subrows -+ for (var i = step; i < rows.length; i += step) { -+ k = Math.floor(i) -+ if (k === pk) break -+ pk = k -+ write(index+n,rows[k]) -+ subrows = rows.slice(j,k) -+ subi = calcIx(B,index,n) -+ walk(subrows, depth+1, subi) -+ j = k + 1 -+ n++ -+ } -+ subrows = rows.slice(j,rows.length) -+ subi = calcIx(B,index,n) -+ walk(subrows, depth+1, subi) -+ })(rows, 0, 0) -+} -+ -+}, -+"95vWSqg5NrICvrzCNi4gaau6urQmwa2TANHb8YMcxws=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+ -+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -+ -+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -+ -+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -+ -+// From https://github.com/openstf/adbkit-apkreader -+var NodeType = { -+ ELEMENT_NODE: 1, -+ ATTRIBUTE_NODE: 2, -+ CDATA_SECTION_NODE: 4 -+}; -+var ChunkType = { -+ NULL: 0x0000, -+ STRING_POOL: 0x0001, -+ TABLE: 0x0002, -+ XML: 0x0003, -+ XML_FIRST_CHUNK: 0x0100, -+ XML_START_NAMESPACE: 0x0100, -+ XML_END_NAMESPACE: 0x0101, -+ XML_START_ELEMENT: 0x0102, -+ XML_END_ELEMENT: 0x0103, -+ XML_CDATA: 0x0104, -+ XML_LAST_CHUNK: 0x017f, -+ XML_RESOURCE_MAP: 0x0180, -+ TABLE_PACKAGE: 0x0200, -+ TABLE_TYPE: 0x0201, -+ TABLE_TYPE_SPEC: 0x0202 -+}; -+var StringFlags = { -+ SORTED: 1 << 0, -+ UTF8: 1 << 8 -+}; // Taken from android.util.TypedValue -+ -+var TypedValue = { -+ COMPLEX_MANTISSA_MASK: 0x00ffffff, -+ COMPLEX_MANTISSA_SHIFT: 0x00000008, -+ COMPLEX_RADIX_0p23: 0x00000003, -+ COMPLEX_RADIX_16p7: 0x00000001, -+ COMPLEX_RADIX_23p0: 0x00000000, -+ COMPLEX_RADIX_8p15: 0x00000002, -+ COMPLEX_RADIX_MASK: 0x00000003, -+ COMPLEX_RADIX_SHIFT: 0x00000004, -+ COMPLEX_UNIT_DIP: 0x00000001, -+ COMPLEX_UNIT_FRACTION: 0x00000000, -+ COMPLEX_UNIT_FRACTION_PARENT: 0x00000001, -+ COMPLEX_UNIT_IN: 0x00000004, -+ COMPLEX_UNIT_MASK: 0x0000000f, -+ COMPLEX_UNIT_MM: 0x00000005, -+ COMPLEX_UNIT_PT: 0x00000003, -+ COMPLEX_UNIT_PX: 0x00000000, -+ COMPLEX_UNIT_SHIFT: 0x00000000, -+ COMPLEX_UNIT_SP: 0x00000002, -+ DENSITY_DEFAULT: 0x00000000, -+ DENSITY_NONE: 0x0000ffff, -+ TYPE_ATTRIBUTE: 0x00000002, -+ TYPE_DIMENSION: 0x00000005, -+ TYPE_FIRST_COLOR_INT: 0x0000001c, -+ TYPE_FIRST_INT: 0x00000010, -+ TYPE_FLOAT: 0x00000004, -+ TYPE_FRACTION: 0x00000006, -+ TYPE_INT_BOOLEAN: 0x00000012, -+ TYPE_INT_COLOR_ARGB4: 0x0000001e, -+ TYPE_INT_COLOR_ARGB8: 0x0000001c, -+ TYPE_INT_COLOR_RGB4: 0x0000001f, -+ TYPE_INT_COLOR_RGB8: 0x0000001d, -+ TYPE_INT_DEC: 0x00000010, -+ TYPE_INT_HEX: 0x00000011, -+ TYPE_LAST_COLOR_INT: 0x0000001f, -+ TYPE_LAST_INT: 0x0000001f, -+ TYPE_NULL: 0x00000000, -+ TYPE_REFERENCE: 0x00000001, -+ TYPE_STRING: 0x00000003 -+}; -+ -+var BinaryXmlParser = /*#__PURE__*/function () { -+ function BinaryXmlParser(buffer) { -+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -+ -+ _classCallCheck(this, BinaryXmlParser); -+ -+ this.buffer = buffer; -+ this.cursor = 0; -+ this.strings = []; -+ this.resources = []; -+ this.document = null; -+ this.parent = null; -+ this.stack = []; -+ this.debug = options.debug || false; -+ } -+ -+ _createClass(BinaryXmlParser, [{ -+ key: "readU8", -+ value: function readU8() { -+ this.debug && console.group('readU8'); -+ this.debug && console.debug('cursor:', this.cursor); -+ var val = this.buffer[this.cursor]; -+ this.debug && console.debug('value:', val); -+ this.cursor += 1; -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readU16", -+ value: function readU16() { -+ this.debug && console.group('readU16'); -+ this.debug && console.debug('cursor:', this.cursor); -+ var val = this.buffer.readUInt16LE(this.cursor); -+ this.debug && console.debug('value:', val); -+ this.cursor += 2; -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readS32", -+ value: function readS32() { -+ this.debug && console.group('readS32'); -+ this.debug && console.debug('cursor:', this.cursor); -+ var val = this.buffer.readInt32LE(this.cursor); -+ this.debug && console.debug('value:', val); -+ this.cursor += 4; -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readU32", -+ value: function readU32() { -+ this.debug && console.group('readU32'); -+ this.debug && console.debug('cursor:', this.cursor); -+ var val = this.buffer.readUInt32LE(this.cursor); -+ this.debug && console.debug('value:', val); -+ this.cursor += 4; -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readLength8", -+ value: function readLength8() { -+ this.debug && console.group('readLength8'); -+ var len = this.readU8(); -+ -+ if (len & 0x80) { -+ len = (len & 0x7f) << 8; -+ len += this.readU8(); -+ } -+ -+ this.debug && console.debug('length:', len); -+ this.debug && console.groupEnd(); -+ return len; -+ } -+ }, { -+ key: "readLength16", -+ value: function readLength16() { -+ this.debug && console.group('readLength16'); -+ var len = this.readU16(); -+ -+ if (len & 0x8000) { -+ len = (len & 0x7fff) << 16; -+ len += this.readU16(); -+ } -+ -+ this.debug && console.debug('length:', len); -+ this.debug && console.groupEnd(); -+ return len; -+ } -+ }, { -+ key: "readDimension", -+ value: function readDimension() { -+ this.debug && console.group('readDimension'); -+ var dimension = { -+ value: null, -+ unit: null, -+ rawUnit: null -+ }; -+ var value = this.readU32(); -+ var unit = dimension.value & 0xff; -+ dimension.value = value >> 8; -+ dimension.rawUnit = unit; -+ -+ switch (unit) { -+ case TypedValue.COMPLEX_UNIT_MM: -+ dimension.unit = 'mm'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_PX: -+ dimension.unit = 'px'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_DIP: -+ dimension.unit = 'dp'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_SP: -+ dimension.unit = 'sp'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_PT: -+ dimension.unit = 'pt'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_IN: -+ dimension.unit = 'in'; -+ break; -+ } -+ -+ this.debug && console.groupEnd(); -+ return dimension; -+ } -+ }, { -+ key: "readFraction", -+ value: function readFraction() { -+ this.debug && console.group('readFraction'); -+ var fraction = { -+ value: null, -+ type: null, -+ rawType: null -+ }; -+ var value = this.readU32(); -+ var type = value & 0xf; -+ fraction.value = this.convertIntToFloat(value >> 4); -+ fraction.rawType = type; -+ -+ switch (type) { -+ case TypedValue.COMPLEX_UNIT_FRACTION: -+ fraction.type = '%'; -+ break; -+ -+ case TypedValue.COMPLEX_UNIT_FRACTION_PARENT: -+ fraction.type = '%p'; -+ break; -+ } -+ -+ this.debug && console.groupEnd(); -+ return fraction; -+ } -+ }, { -+ key: "readHex24", -+ value: function readHex24() { -+ this.debug && console.group('readHex24'); -+ var val = (this.readU32() & 0xffffff).toString(16); -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readHex32", -+ value: function readHex32() { -+ this.debug && console.group('readHex32'); -+ var val = this.readU32().toString(16); -+ this.debug && console.groupEnd(); -+ return val; -+ } -+ }, { -+ key: "readTypedValue", -+ value: function readTypedValue() { -+ this.debug && console.group('readTypedValue'); -+ var typedValue = { -+ value: null, -+ type: null, -+ rawType: null -+ }; -+ var start = this.cursor; -+ var size = this.readU16(); -+ /* const zero = */ -+ -+ this.readU8(); -+ var dataType = this.readU8(); // Yes, there has been a real world APK where the size is malformed. -+ -+ if (size === 0) { -+ size = 8; -+ } -+ -+ typedValue.rawType = dataType; -+ -+ switch (dataType) { -+ case TypedValue.TYPE_INT_DEC: -+ typedValue.value = this.readS32(); -+ typedValue.type = 'int_dec'; -+ break; -+ -+ case TypedValue.TYPE_INT_HEX: -+ typedValue.value = this.readS32(); -+ typedValue.type = 'int_hex'; -+ break; -+ -+ case TypedValue.TYPE_STRING: -+ var ref = this.readS32(); -+ typedValue.value = ref > 0 ? this.strings[ref] : ''; -+ typedValue.type = 'string'; -+ break; -+ -+ case TypedValue.TYPE_REFERENCE: -+ var id = this.readU32(); -+ typedValue.value = "resourceId:0x".concat(id.toString(16)); -+ typedValue.type = 'reference'; -+ break; -+ -+ case TypedValue.TYPE_INT_BOOLEAN: -+ typedValue.value = this.readS32() !== 0; -+ typedValue.type = 'boolean'; -+ break; -+ -+ case TypedValue.TYPE_NULL: -+ this.readU32(); -+ typedValue.value = null; -+ typedValue.type = 'null'; -+ break; -+ -+ case TypedValue.TYPE_INT_COLOR_RGB8: -+ typedValue.value = this.readHex24(); -+ typedValue.type = 'rgb8'; -+ break; -+ -+ case TypedValue.TYPE_INT_COLOR_RGB4: -+ typedValue.value = this.readHex24(); -+ typedValue.type = 'rgb4'; -+ break; -+ -+ case TypedValue.TYPE_INT_COLOR_ARGB8: -+ typedValue.value = this.readHex32(); -+ typedValue.type = 'argb8'; -+ break; -+ -+ case TypedValue.TYPE_INT_COLOR_ARGB4: -+ typedValue.value = this.readHex32(); -+ typedValue.type = 'argb4'; -+ break; -+ -+ case TypedValue.TYPE_DIMENSION: -+ typedValue.value = this.readDimension(); -+ typedValue.type = 'dimension'; -+ break; -+ -+ case TypedValue.TYPE_FRACTION: -+ typedValue.value = this.readFraction(); -+ typedValue.type = 'fraction'; -+ break; -+ -+ default: -+ { -+ var type = dataType.toString(16); -+ console.debug("Not sure what to do with typed value of type 0x".concat(type, ", falling back to reading an uint32.")); -+ typedValue.value = this.readU32(); -+ typedValue.type = 'unknown'; -+ } -+ } // Ensure we consume the whole value -+ -+ -+ var end = start + size; -+ -+ if (this.cursor !== end) { -+ var _type = dataType.toString(16); -+ -+ var diff = end - this.cursor; -+ console.debug("Cursor is off by ".concat(diff, " bytes at ").concat(this.cursor, " at supposed end of typed value of type 0x").concat(_type, ". The typed value started at offset ").concat(start, " and is supposed to end at offset ").concat(end, ". Ignoring the rest of the value.")); -+ this.cursor = end; -+ } -+ -+ this.debug && console.groupEnd(); -+ return typedValue; -+ } // https://twitter.com/kawasima/status/427730289201139712 -+ -+ }, { -+ key: "convertIntToFloat", -+ value: function convertIntToFloat(_int) { -+ var buf = new ArrayBuffer(4); -+ new Int32Array(buf)[0] = _int; -+ return new Float32Array(buf)[0]; -+ } -+ }, { -+ key: "readString", -+ value: function readString(encoding) { -+ this.debug && console.group('readString', encoding); -+ -+ switch (encoding) { -+ case 'utf-8': -+ var stringLength = this.readLength8(encoding); -+ this.debug && console.debug('stringLength:', stringLength); -+ var byteLength = this.readLength8(encoding); -+ this.debug && console.debug('byteLength:', byteLength); -+ var value = this.buffer.toString(encoding, this.cursor, this.cursor += byteLength); -+ this.debug && console.debug('value:', value); -+ this.debug && console.groupEnd(); -+ return value; -+ -+ case 'ucs2': -+ stringLength = this.readLength16(encoding); -+ this.debug && console.debug('stringLength:', stringLength); -+ byteLength = stringLength * 2; -+ this.debug && console.debug('byteLength:', byteLength); -+ value = this.buffer.toString(encoding, this.cursor, this.cursor += byteLength); -+ this.debug && console.debug('value:', value); -+ this.debug && console.groupEnd(); -+ return value; -+ -+ default: -+ throw new Error("Unsupported encoding '".concat(encoding, "'")); -+ } -+ } -+ }, { -+ key: "readChunkHeader", -+ value: function readChunkHeader() { -+ this.debug && console.group('readChunkHeader'); -+ var header = { -+ startOffset: this.cursor, -+ chunkType: this.readU16(), -+ headerSize: this.readU16(), -+ chunkSize: this.readU32() -+ }; -+ this.debug && console.debug('startOffset:', header.startOffset); -+ this.debug && console.debug('chunkType:', header.chunkType); -+ this.debug && console.debug('headerSize:', header.headerSize); -+ this.debug && console.debug('chunkSize:', header.chunkSize); -+ this.debug && console.groupEnd(); -+ return header; -+ } -+ }, { -+ key: "readStringPool", -+ value: function readStringPool(header) { -+ this.debug && console.group('readStringPool'); -+ header.stringCount = this.readU32(); -+ this.debug && console.debug('stringCount:', header.stringCount); -+ header.styleCount = this.readU32(); -+ this.debug && console.debug('styleCount:', header.styleCount); -+ header.flags = this.readU32(); -+ this.debug && console.debug('flags:', header.flags); -+ header.stringsStart = this.readU32(); -+ this.debug && console.debug('stringsStart:', header.stringsStart); -+ header.stylesStart = this.readU32(); -+ this.debug && console.debug('stylesStart:', header.stylesStart); -+ -+ if (header.chunkType !== ChunkType.STRING_POOL) { -+ throw new Error('Invalid string pool header'); -+ } -+ -+ var offsets = []; -+ -+ for (var i = 0, l = header.stringCount; i < l; ++i) { -+ this.debug && console.debug('offset:', i); -+ offsets.push(this.readU32()); -+ } -+ -+ var sorted = (header.flags & StringFlags.SORTED) === StringFlags.SORTED; -+ this.debug && console.debug('sorted:', sorted); -+ var encoding = (header.flags & StringFlags.UTF8) === StringFlags.UTF8 ? 'utf-8' : 'ucs2'; -+ this.debug && console.debug('encoding:', encoding); -+ var stringsStart = header.startOffset + header.stringsStart; -+ this.cursor = stringsStart; -+ -+ for (var _i = 0, _l = header.stringCount; _i < _l; ++_i) { -+ this.debug && console.debug('string:', _i); -+ this.debug && console.debug('offset:', offsets[_i]); -+ this.cursor = stringsStart + offsets[_i]; -+ this.strings.push(this.readString(encoding)); -+ } // Skip styles -+ -+ -+ this.cursor = header.startOffset + header.chunkSize; -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "readResourceMap", -+ value: function readResourceMap(header) { -+ this.debug && console.group('readResourceMap'); -+ var count = Math.floor((header.chunkSize - header.headerSize) / 4); -+ -+ for (var i = 0; i < count; ++i) { -+ this.resources.push(this.readU32()); -+ } -+ -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "readXmlNamespaceStart", -+ value: function readXmlNamespaceStart() -+ /* header */ -+ { -+ this.debug && console.group('readXmlNamespaceStart'); -+ /* const line = */ -+ -+ this.readU32(); -+ /* const commentRef = */ -+ -+ this.readU32(); -+ /* const prefixRef = */ -+ -+ this.readS32(); -+ /* const uriRef = */ -+ -+ this.readS32(); // We don't currently care about the values, but they could -+ // be accessed like so: -+ // -+ // namespaceURI.prefix = this.strings[prefixRef] // if prefixRef > 0 -+ // namespaceURI.uri = this.strings[uriRef] // if uriRef > 0 -+ -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "readXmlNamespaceEnd", -+ value: function readXmlNamespaceEnd() -+ /* header */ -+ { -+ this.debug && console.group('readXmlNamespaceEnd'); -+ /* const line = */ -+ -+ this.readU32(); -+ /* const commentRef = */ -+ -+ this.readU32(); -+ /* const prefixRef = */ -+ -+ this.readS32(); -+ /* const uriRef = */ -+ -+ this.readS32(); // We don't currently care about the values, but they could -+ // be accessed like so: -+ // -+ // namespaceURI.prefix = this.strings[prefixRef] // if prefixRef > 0 -+ // namespaceURI.uri = this.strings[uriRef] // if uriRef > 0 -+ -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "readXmlElementStart", -+ value: function readXmlElementStart() -+ /* header */ -+ { -+ this.debug && console.group('readXmlElementStart'); -+ var node = { -+ namespaceURI: null, -+ nodeType: NodeType.ELEMENT_NODE, -+ nodeName: null, -+ attributes: [], -+ childNodes: [] -+ }; -+ /* const line = */ -+ -+ this.readU32(); -+ /* const commentRef = */ -+ -+ this.readU32(); -+ var nsRef = this.readS32(); -+ var nameRef = this.readS32(); -+ -+ if (nsRef > 0) { -+ node.namespaceURI = this.strings[nsRef]; -+ } -+ -+ node.nodeName = this.strings[nameRef]; -+ /* const attrStart = */ -+ -+ this.readU16(); -+ /* const attrSize = */ -+ -+ this.readU16(); -+ var attrCount = this.readU16(); -+ /* const idIndex = */ -+ -+ this.readU16(); -+ /* const classIndex = */ -+ -+ this.readU16(); -+ /* const styleIndex = */ -+ -+ this.readU16(); -+ -+ for (var i = 0; i < attrCount; ++i) { -+ node.attributes.push(this.readXmlAttribute()); -+ } -+ -+ if (this.document) { -+ this.parent.childNodes.push(node); -+ this.parent = node; -+ } else { -+ this.document = this.parent = node; -+ } -+ -+ this.stack.push(node); -+ this.debug && console.groupEnd(); -+ return node; -+ } -+ }, { -+ key: "readXmlAttribute", -+ value: function readXmlAttribute() { -+ this.debug && console.group('readXmlAttribute'); -+ var attr = { -+ namespaceURI: null, -+ nodeType: NodeType.ATTRIBUTE_NODE, -+ nodeName: null, -+ name: null, -+ value: null, -+ typedValue: null -+ }; -+ var nsRef = this.readS32(); -+ var nameRef = this.readS32(); -+ var valueRef = this.readS32(); -+ -+ if (nsRef > 0) { -+ attr.namespaceURI = this.strings[nsRef]; -+ } -+ -+ attr.nodeName = attr.name = this.strings[nameRef]; -+ -+ if (valueRef > 0) { -+ attr.value = this.strings[valueRef]; -+ } -+ -+ attr.typedValue = this.readTypedValue(); -+ this.debug && console.groupEnd(); -+ return attr; -+ } -+ }, { -+ key: "readXmlElementEnd", -+ value: function readXmlElementEnd() -+ /* header */ -+ { -+ this.debug && console.group('readXmlCData'); -+ /* const line = */ -+ -+ this.readU32(); -+ /* const commentRef = */ -+ -+ this.readU32(); -+ /* const nsRef = */ -+ -+ this.readS32(); -+ /* const nameRef = */ -+ -+ this.readS32(); -+ this.stack.pop(); -+ this.parent = this.stack[this.stack.length - 1]; -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "readXmlCData", -+ value: function readXmlCData() -+ /* header */ -+ { -+ this.debug && console.group('readXmlCData'); -+ var cdata = { -+ namespaceURI: null, -+ nodeType: NodeType.CDATA_SECTION_NODE, -+ nodeName: '#cdata', -+ data: null, -+ typedValue: null -+ }; -+ /* const line = */ -+ -+ this.readU32(); -+ /* const commentRef = */ -+ -+ this.readU32(); -+ var dataRef = this.readS32(); -+ -+ if (dataRef > 0) { -+ cdata.data = this.strings[dataRef]; -+ } -+ -+ cdata.typedValue = this.readTypedValue(); -+ this.parent.childNodes.push(cdata); -+ this.debug && console.groupEnd(); -+ return cdata; -+ } -+ }, { -+ key: "readNull", -+ value: function readNull(header) { -+ this.debug && console.group('readNull'); -+ this.cursor += header.chunkSize - header.headerSize; -+ this.debug && console.groupEnd(); -+ return null; -+ } -+ }, { -+ key: "parse", -+ value: function parse() { -+ this.debug && console.group('BinaryXmlParser.parse'); -+ var xmlHeader = this.readChunkHeader(); -+ -+ if (xmlHeader.chunkType !== ChunkType.XML) { -+ throw new Error('Invalid XML header'); -+ } -+ -+ while (this.cursor < this.buffer.length) { -+ this.debug && console.group('chunk'); -+ var start = this.cursor; -+ var header = this.readChunkHeader(); -+ -+ switch (header.chunkType) { -+ case ChunkType.STRING_POOL: -+ this.readStringPool(header); -+ break; -+ -+ case ChunkType.XML_RESOURCE_MAP: -+ this.readResourceMap(header); -+ break; -+ -+ case ChunkType.XML_START_NAMESPACE: -+ this.readXmlNamespaceStart(header); -+ break; -+ -+ case ChunkType.XML_END_NAMESPACE: -+ this.readXmlNamespaceEnd(header); -+ break; -+ -+ case ChunkType.XML_START_ELEMENT: -+ this.readXmlElementStart(header); -+ break; -+ -+ case ChunkType.XML_END_ELEMENT: -+ this.readXmlElementEnd(header); -+ break; -+ -+ case ChunkType.XML_CDATA: -+ this.readXmlCData(header); -+ break; -+ -+ case ChunkType.NULL: -+ this.readNull(header); -+ break; -+ -+ default: -+ throw new Error("Unsupported chunk type '".concat(header.chunkType, "'")); -+ } // Ensure we consume the whole chunk -+ -+ -+ var end = start + header.chunkSize; -+ -+ if (this.cursor !== end) { -+ var diff = end - this.cursor; -+ var type = header.chunkType.toString(16); -+ console.debug("Cursor is off by ".concat(diff, " bytes at ").concat(this.cursor, " at supposed end of chunk of type 0x").concat(type, ". The chunk started at offset ").concat(start, " and is supposed to end at offset ").concat(end, ". Ignoring the rest of the chunk.")); -+ this.cursor = end; -+ } -+ -+ this.debug && console.groupEnd(); -+ } -+ -+ this.debug && console.groupEnd(); -+ return this.document; -+ } -+ }]); -+ -+ return BinaryXmlParser; -+}(); -+ -+module.exports = BinaryXmlParser; -+}, -+"99rBK2oIF5CIIeGzE4sRQLOOWb/A6R/x1b80rDokoxw=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * copy-descriptor -+ * -+ * Copyright (c) 2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+/** -+ * Copy a descriptor from one object to another. -+ * -+ * ```js -+ * function App() { -+ * this.cache = {}; -+ * } -+ * App.prototype.set = function(key, val) { -+ * this.cache[key] = val; -+ * return this; -+ * }; -+ * Object.defineProperty(App.prototype, 'count', { -+ * get: function() { -+ * return Object.keys(this.cache).length; -+ * } -+ * }); -+ * -+ * copy(App.prototype, 'count', 'len'); -+ * -+ * // create an instance -+ * var app = new App(); -+ * -+ * app.set('a', true); -+ * app.set('b', true); -+ * app.set('c', true); -+ * -+ * console.log(app.count); -+ * //=> 3 -+ * console.log(app.len); -+ * //=> 3 -+ * ``` -+ * @name copy -+ * @param {Object} `receiver` The target object -+ * @param {Object} `provider` The provider object -+ * @param {String} `from` The key to copy on provider. -+ * @param {String} `to` Optionally specify a new key name to use. -+ * @return {Object} -+ * @api public -+ */ -+ -+module.exports = function copyDescriptor(receiver, provider, from, to) { -+ if (!isObject(provider) && typeof provider !== 'function') { -+ to = from; -+ from = provider; -+ provider = receiver; -+ } -+ if (!isObject(receiver) && typeof receiver !== 'function') { -+ throw new TypeError('expected the first argument to be an object'); -+ } -+ if (!isObject(provider) && typeof provider !== 'function') { -+ throw new TypeError('expected provider to be an object'); -+ } -+ -+ if (typeof to !== 'string') { -+ to = from; -+ } -+ if (typeof from !== 'string') { -+ throw new TypeError('expected key to be a string'); -+ } -+ -+ if (!(from in provider)) { -+ throw new Error('property "' + from + '" does not exist'); -+ } -+ -+ var val = Object.getOwnPropertyDescriptor(provider, from); -+ if (val) Object.defineProperty(receiver, to, val); -+}; -+ -+function isObject(val) { -+ return {}.toString.call(val) === '[object Object]'; -+} -+ -+ -+}, -+"9CDhARuV4ntUxYMjp+1P+9CojNtElvdxu2eCwqoi0j4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const id_1 = require("./id"); -+const ref_1 = require("./ref"); -+const core = [ -+ "$schema", -+ "$id", -+ "$defs", -+ "$vocabulary", -+ { keyword: "$comment" }, -+ "definitions", -+ id_1.default, -+ ref_1.default, -+]; -+exports.default = core; -+//# sourceMappingURL=index.js.map -+}, -+"9H0dv8YiSEtnkngyDtosoNnHICkLlvRRQ91zJarqpGk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const FindMyWay = require('find-my-way') -+const Context = require('./context') -+const handleRequest = require('./handleRequest') -+const { hookRunner, hookIterator, lifecycleHooks } = require('./hooks') -+const supportedMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT', 'OPTIONS'] -+const { normalizeSchema } = require('./schemas') -+const { parseHeadOnSendHandlers } = require('./headRoute') -+const warning = require('./warnings') -+ -+const { -+ compileSchemasForValidation, -+ compileSchemasForSerialization -+} = require('./validation') -+ -+const { -+ FST_ERR_SCH_VALIDATION_BUILD, -+ FST_ERR_SCH_SERIALIZATION_BUILD, -+ FST_ERR_DEFAULT_ROUTE_INVALID_TYPE -+} = require('./errors') -+ -+const { -+ kRoutePrefix, -+ kLogLevel, -+ kLogSerializers, -+ kHooks, -+ kHooksDeprecatedPreParsing, -+ kSchemaController, -+ kOptions, -+ kContentTypeParser, -+ kReply, -+ kReplySerializerDefault, -+ kReplyIsError, -+ kRequest, -+ kRequestPayloadStream, -+ kDisableRequestLogging, -+ kSchemaErrorFormatter, -+ kErrorHandler -+} = require('./symbols.js') -+ -+function buildRouting (options) { -+ const router = FindMyWay(options.config) -+ -+ let avvio -+ let fourOhFour -+ let requestIdHeader -+ let querystringParser -+ let requestIdLogLabel -+ let logger -+ let hasLogger -+ let setupResponseListeners -+ let throwIfAlreadyStarted -+ let genReqId -+ let disableRequestLogging -+ let ignoreTrailingSlash -+ let return503OnClosing -+ let globalExposeHeadRoutes -+ -+ let closing = false -+ -+ return { -+ setup (options, fastifyArgs) { -+ avvio = fastifyArgs.avvio -+ fourOhFour = fastifyArgs.fourOhFour -+ logger = fastifyArgs.logger -+ hasLogger = fastifyArgs.hasLogger -+ setupResponseListeners = fastifyArgs.setupResponseListeners -+ throwIfAlreadyStarted = fastifyArgs.throwIfAlreadyStarted -+ -+ globalExposeHeadRoutes = options.exposeHeadRoutes -+ requestIdHeader = options.requestIdHeader -+ querystringParser = options.querystringParser -+ requestIdLogLabel = options.requestIdLogLabel -+ genReqId = options.genReqId -+ disableRequestLogging = options.disableRequestLogging -+ ignoreTrailingSlash = options.ignoreTrailingSlash -+ return503OnClosing = Object.prototype.hasOwnProperty.call(options, 'return503OnClosing') ? options.return503OnClosing : true -+ }, -+ routing: router.lookup.bind(router), // router func to find the right handler to call -+ route, // configure a route in the fastify instance -+ prepareRoute, -+ getDefaultRoute: function () { -+ return router.defaultRoute -+ }, -+ setDefaultRoute: function (defaultRoute) { -+ if (typeof defaultRoute !== 'function') { -+ throw new FST_ERR_DEFAULT_ROUTE_INVALID_TYPE() -+ } -+ -+ router.defaultRoute = defaultRoute -+ }, -+ routeHandler, -+ closeRoutes: () => { closing = true }, -+ printRoutes: router.prettyPrint.bind(router) -+ } -+ -+ // Convert shorthand to extended route declaration -+ function prepareRoute (method, url, options, handler) { -+ if (!handler && typeof options === 'function') { -+ handler = options // for support over direct function calls such as fastify.get() options are reused as the handler -+ options = {} -+ } else if (handler && typeof handler === 'function') { -+ if (Object.prototype.toString.call(options) !== '[object Object]') { -+ throw new Error(`Options for ${method}:${url} route must be an object`) -+ } else if (options.handler) { -+ if (typeof options.handler === 'function') { -+ throw new Error(`Duplicate handler for ${method}:${url} route is not allowed!`) -+ } else { -+ throw new Error(`Handler for ${method}:${url} route must be a function`) -+ } -+ } -+ } -+ -+ options = Object.assign({}, options, { -+ method, -+ url, -+ path: url, -+ handler: handler || (options && options.handler) -+ }) -+ -+ return route.call(this, options) -+ } -+ -+ // Route management -+ function route (options) { -+ // Since we are mutating/assigning only top level props, it is fine to have a shallow copy using the spread operator -+ const opts = { ...options } -+ -+ throwIfAlreadyStarted('Cannot add route when fastify instance is already started!') -+ -+ if (Array.isArray(opts.method)) { -+ // eslint-disable-next-line no-var -+ for (var i = 0; i < opts.method.length; ++i) { -+ const method = opts.method[i] -+ if (supportedMethods.indexOf(method) === -1) { -+ throw new Error(`${method} method is not supported!`) -+ } -+ } -+ } else { -+ if (supportedMethods.indexOf(opts.method) === -1) { -+ throw new Error(`${opts.method} method is not supported!`) -+ } -+ } -+ -+ if (!opts.handler) { -+ throw new Error(`Missing handler function for ${opts.method}:${opts.url} route.`) -+ } -+ -+ if (opts.errorHandler !== undefined && typeof opts.errorHandler !== 'function') { -+ throw new Error(`Error Handler for ${opts.method}:${opts.url} route, if defined, must be a function`) -+ } -+ -+ validateBodyLimitOption(opts.bodyLimit) -+ -+ const prefix = this[kRoutePrefix] -+ -+ this.after((notHandledErr, done) => { -+ const path = opts.url || opts.path -+ if (path === '/' && prefix.length && opts.method !== 'HEAD') { -+ switch (opts.prefixTrailingSlash) { -+ case 'slash': -+ afterRouteAdded.call(this, { path }, notHandledErr, done) -+ break -+ case 'no-slash': -+ afterRouteAdded.call(this, { path: '' }, notHandledErr, done) -+ break -+ case 'both': -+ default: -+ afterRouteAdded.call(this, { path: '' }, notHandledErr, done) -+ // If ignoreTrailingSlash is set to true we need to add only the '' route to prevent adding an incomplete one. -+ if (ignoreTrailingSlash !== true) { -+ afterRouteAdded.call(this, { path, prefixing: true }, notHandledErr, done) -+ } -+ } -+ } else if (path && path[0] === '/' && prefix.endsWith('/')) { -+ // Ensure that '/prefix/' + '/route' gets registered as '/prefix/route' -+ afterRouteAdded.call(this, { path: path.slice(1) }, notHandledErr, done) -+ } else { -+ afterRouteAdded.call(this, { path }, notHandledErr, done) -+ } -+ }) -+ -+ // chainable api -+ return this -+ -+ /** -+ * This function sets up a new route, its log serializers, and triggers route hooks. -+ * -+ * @param {object} opts contains route `path` and `prefixing` flag which indicates if this is an auto-prefixed route, e.g. `fastify.register(routes, { prefix: '/foo' })` -+ * @param {*} notHandledErr error object to be passed back to the original invoker -+ * @param {*} done callback -+ */ -+ function afterRouteAdded ({ path, prefixing = false }, notHandledErr, done) { -+ const url = prefix + path -+ -+ opts.url = url -+ opts.path = url -+ opts.routePath = path -+ opts.prefix = prefix -+ opts.logLevel = opts.logLevel || this[kLogLevel] -+ -+ if (this[kLogSerializers] || opts.logSerializers) { -+ opts.logSerializers = Object.assign(Object.create(this[kLogSerializers]), opts.logSerializers) -+ } -+ -+ if (opts.attachValidation == null) { -+ opts.attachValidation = false -+ } -+ -+ if (prefixing === false) { -+ // run 'onRoute' hooks -+ for (const hook of this[kHooks].onRoute) { -+ try { -+ hook.call(this, opts) -+ } catch (error) { -+ done(error) -+ return -+ } -+ } -+ } -+ -+ const config = { -+ ...opts.config, -+ url, -+ method: opts.method -+ } -+ const constraints = opts.constraints || {} -+ if (opts.version) { -+ warning.emit('FSTDEP006') -+ constraints.version = opts.version -+ } -+ -+ const context = new Context( -+ opts.schema, -+ opts.handler.bind(this), -+ this[kReply], -+ this[kRequest], -+ this[kContentTypeParser], -+ config, -+ opts.errorHandler || this[kErrorHandler], -+ opts.bodyLimit, -+ opts.logLevel, -+ opts.logSerializers, -+ opts.attachValidation, -+ this[kReplySerializerDefault], -+ opts.schemaErrorFormatter || this[kSchemaErrorFormatter] -+ ) -+ -+ const headRouteExists = router.find('HEAD', path) != null -+ -+ try { -+ router.on(opts.method, opts.url, { constraints }, routeHandler, context) -+ } catch (err) { -+ done(err) -+ return -+ } -+ -+ const { exposeHeadRoute } = opts -+ const hasRouteExposeHeadRouteFlag = exposeHeadRoute != null -+ const shouldExposeHead = hasRouteExposeHeadRouteFlag ? exposeHeadRoute : globalExposeHeadRoutes -+ -+ if (shouldExposeHead && options.method === 'GET' && !headRouteExists) { -+ const onSendHandlers = parseHeadOnSendHandlers(opts.onSend) -+ prepareRoute.call(this, 'HEAD', path, { ...opts, onSend: onSendHandlers }) -+ } else if (headRouteExists && exposeHeadRoute) { -+ warning.emit('FSTDEP007') -+ } -+ -+ // It can happen that a user registers a plugin with some hooks *after* -+ // the route registration. To be sure to also load those hooks, -+ // we must listen for the avvio's preReady event, and update the context object accordingly. -+ avvio.once('preReady', () => { -+ for (const hook of lifecycleHooks) { -+ const toSet = this[kHooks][hook] -+ .concat(opts[hook] || []) -+ .map(h => { -+ const bound = h.bind(this) -+ -+ // Track hooks deprecation markers -+ if (hook === 'preParsing') { -+ // Check for deprecation syntax -+ if (h.length === (h.constructor.name === 'AsyncFunction' ? 2 : 3)) { -+ warning.emit('FSTDEP004') -+ bound[kHooksDeprecatedPreParsing] = true -+ } -+ } -+ -+ return bound -+ }) -+ context[hook] = toSet.length ? toSet : null -+ } -+ -+ // Must store the 404 Context in 'preReady' because it is only guaranteed to -+ // be available after all of the plugins and routes have been loaded. -+ fourOhFour.setContext(this, context) -+ -+ if (opts.schema) { -+ context.schema = normalizeSchema(context.schema) -+ -+ const schemaController = this[kSchemaController] -+ if (!opts.validatorCompiler && (opts.schema.body || opts.schema.headers || opts.schema.querystring || opts.schema.params)) { -+ schemaController.setupValidator(this[kOptions]) -+ } -+ try { -+ compileSchemasForValidation(context, opts.validatorCompiler || schemaController.validatorCompiler) -+ } catch (error) { -+ throw new FST_ERR_SCH_VALIDATION_BUILD(opts.method, url, error.message) -+ } -+ -+ if (opts.schema.response && !opts.serializerCompiler) { -+ schemaController.setupSerializer(this[kOptions]) -+ } -+ try { -+ compileSchemasForSerialization(context, opts.serializerCompiler || schemaController.serializerCompiler) -+ } catch (error) { -+ throw new FST_ERR_SCH_SERIALIZATION_BUILD(opts.method, url, error.message) -+ } -+ } -+ }) -+ -+ done(notHandledErr) -+ } -+ } -+ -+ // HTTP request entry point, the routing has already been executed -+ function routeHandler (req, res, params, context) { -+ if (closing === true) { -+ if (req.httpVersionMajor !== 2) { -+ res.once('finish', () => req.destroy()) -+ res.setHeader('Connection', 'close') -+ } -+ -+ if (return503OnClosing) { -+ const headers = { -+ 'Content-Type': 'application/json', -+ 'Content-Length': '80' -+ } -+ res.writeHead(503, headers) -+ res.end('{"error":"Service Unavailable","message":"Service Unavailable","statusCode":503}') -+ return -+ } -+ } -+ -+ const id = req.headers[requestIdHeader] || genReqId(req) -+ -+ const loggerOpts = { -+ [requestIdLogLabel]: id, -+ level: context.logLevel -+ } -+ -+ if (context.logSerializers) { -+ loggerOpts.serializers = context.logSerializers -+ } -+ const childLogger = logger.child(loggerOpts) -+ childLogger[kDisableRequestLogging] = disableRequestLogging -+ -+ const queryPrefix = req.url.indexOf('?') -+ const query = querystringParser(queryPrefix > -1 ? req.url.slice(queryPrefix + 1) : '') -+ const request = new context.Request(id, params, req, query, childLogger, context) -+ const reply = new context.Reply(res, request, childLogger) -+ -+ if (disableRequestLogging === false) { -+ childLogger.info({ req: request }, 'incoming request') -+ } -+ -+ if (hasLogger === true || context.onResponse !== null) { -+ setupResponseListeners(reply) -+ } -+ -+ if (context.onRequest !== null) { -+ hookRunner( -+ context.onRequest, -+ hookIterator, -+ request, -+ reply, -+ runPreParsing -+ ) -+ } else { -+ runPreParsing(null, request, reply) -+ } -+ -+ if (context.onTimeout !== null) { -+ if (!request.raw.socket._meta) { -+ request.raw.socket.on('timeout', handleTimeout) -+ } -+ request.raw.socket._meta = { context, request, reply } -+ } -+ } -+} -+ -+function handleTimeout () { -+ const { context, request, reply } = this._meta -+ hookRunner( -+ context.onTimeout, -+ hookIterator, -+ request, -+ reply, -+ noop -+ ) -+} -+ -+function validateBodyLimitOption (bodyLimit) { -+ if (bodyLimit === undefined) return -+ if (!Number.isInteger(bodyLimit) || bodyLimit <= 0) { -+ throw new TypeError(`'bodyLimit' option must be an integer > 0. Got '${bodyLimit}'`) -+ } -+} -+ -+function runPreParsing (err, request, reply) { -+ if (reply.sent === true) return -+ if (err != null) { -+ reply.send(err) -+ return -+ } -+ -+ request[kRequestPayloadStream] = request.raw -+ -+ if (reply.context.preParsing !== null) { -+ preParsingHookRunner(reply.context.preParsing, request, reply, handleRequest) -+ } else { -+ handleRequest(null, request, reply) -+ } -+} -+ -+function preParsingHookRunner (functions, request, reply, cb) { -+ let i = 0 -+ -+ function next (err, stream) { -+ if (reply.sent) { -+ return -+ } -+ -+ if (typeof stream !== 'undefined') { -+ request[kRequestPayloadStream] = stream -+ } -+ -+ if (err || i === functions.length) { -+ if (err && !(err instanceof Error)) { -+ reply[kReplyIsError] = true -+ } -+ -+ cb(err, request, reply) -+ return -+ } -+ -+ const fn = functions[i++] -+ let result -+ try { -+ if (fn[kHooksDeprecatedPreParsing]) { -+ result = fn(request, reply, next) -+ } else { -+ result = fn(request, reply, request[kRequestPayloadStream], next) -+ } -+ } catch (error) { -+ next(error) -+ return -+ } -+ -+ if (result && typeof result.then === 'function') { -+ result.then(handleResolve, handleReject) -+ } -+ } -+ -+ function handleResolve (stream) { -+ next(null, stream) -+ } -+ -+ function handleReject (err) { -+ next(err) -+ } -+ -+ next(null, request[kRequestPayloadStream]) -+} -+ -+function noop () { } -+ -+module.exports = { buildRouting, validateBodyLimitOption } -+ -+}, -+"9JFUXTkqYTto+p8jULlnZAnTI9gBN/nO7TBijDd7ves=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * @param {string} str -+ * @param {number} len -+ * @param {string} char -+ * @returns {string} -+ */ -+module.exports.lpad = function lpad(str, len, char) { -+ while (str.length < len) { str = char + str; } return str; -+}; -+ -+/** -+ * @param {string} str -+ * @param {number} len -+ * @param {string} char -+ * @returns {string} -+ */ -+module.exports.rpad = function rpad(str, len, char) { -+ while (str.length < len) { str = str + char; } return str; -+}; -+ -+/** -+ * @param {object} view -+ * @param {number} fieldLength -+ * @param {string} str -+ * @param {number} offset -+ * @returns {number} -+ */ -+module.exports.writeField = function writeField(view, fieldLength, str, offset) { -+ for (var i = 0; i < fieldLength; i++) { -+ view.setUint8(offset, str.charCodeAt(i)); offset++; -+ } -+ return offset; -+}; -+ -+}, -+"9SfSOGpiZrm/Z9JkGUlIz3QbEtqhn+oZ41N0FO4x+ac=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+// A linked list to keep track of recently-used-ness -+const Yallist = require('yallist') -+ -+const MAX = Symbol('max') -+const LENGTH = Symbol('length') -+const LENGTH_CALCULATOR = Symbol('lengthCalculator') -+const ALLOW_STALE = Symbol('allowStale') -+const MAX_AGE = Symbol('maxAge') -+const DISPOSE = Symbol('dispose') -+const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') -+const LRU_LIST = Symbol('lruList') -+const CACHE = Symbol('cache') -+const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') -+ -+const naiveLength = () => 1 -+ -+// lruList is a yallist where the head is the youngest -+// item, and the tail is the oldest. the list contains the Hit -+// objects as the entries. -+// Each Hit object has a reference to its Yallist.Node. This -+// never changes. -+// -+// cache is a Map (or PseudoMap) that matches the keys to -+// the Yallist.Node object. -+class LRUCache { -+ constructor (options) { -+ if (typeof options === 'number') -+ options = { max: options } -+ -+ if (!options) -+ options = {} -+ -+ if (options.max && (typeof options.max !== 'number' || options.max < 0)) -+ throw new TypeError('max must be a non-negative number') -+ // Kind of weird to have a default max of Infinity, but oh well. -+ const max = this[MAX] = options.max || Infinity -+ -+ const lc = options.length || naiveLength -+ this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc -+ this[ALLOW_STALE] = options.stale || false -+ if (options.maxAge && typeof options.maxAge !== 'number') -+ throw new TypeError('maxAge must be a number') -+ this[MAX_AGE] = options.maxAge || 0 -+ this[DISPOSE] = options.dispose -+ this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false -+ this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false -+ this.reset() -+ } -+ -+ // resize the cache when the max changes. -+ set max (mL) { -+ if (typeof mL !== 'number' || mL < 0) -+ throw new TypeError('max must be a non-negative number') -+ -+ this[MAX] = mL || Infinity -+ trim(this) -+ } -+ get max () { -+ return this[MAX] -+ } -+ -+ set allowStale (allowStale) { -+ this[ALLOW_STALE] = !!allowStale -+ } -+ get allowStale () { -+ return this[ALLOW_STALE] -+ } -+ -+ set maxAge (mA) { -+ if (typeof mA !== 'number') -+ throw new TypeError('maxAge must be a non-negative number') -+ -+ this[MAX_AGE] = mA -+ trim(this) -+ } -+ get maxAge () { -+ return this[MAX_AGE] -+ } -+ -+ // resize the cache when the lengthCalculator changes. -+ set lengthCalculator (lC) { -+ if (typeof lC !== 'function') -+ lC = naiveLength -+ -+ if (lC !== this[LENGTH_CALCULATOR]) { -+ this[LENGTH_CALCULATOR] = lC -+ this[LENGTH] = 0 -+ this[LRU_LIST].forEach(hit => { -+ hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) -+ this[LENGTH] += hit.length -+ }) -+ } -+ trim(this) -+ } -+ get lengthCalculator () { return this[LENGTH_CALCULATOR] } -+ -+ get length () { return this[LENGTH] } -+ get itemCount () { return this[LRU_LIST].length } -+ -+ rforEach (fn, thisp) { -+ thisp = thisp || this -+ for (let walker = this[LRU_LIST].tail; walker !== null;) { -+ const prev = walker.prev -+ forEachStep(this, fn, walker, thisp) -+ walker = prev -+ } -+ } -+ -+ forEach (fn, thisp) { -+ thisp = thisp || this -+ for (let walker = this[LRU_LIST].head; walker !== null;) { -+ const next = walker.next -+ forEachStep(this, fn, walker, thisp) -+ walker = next -+ } -+ } -+ -+ keys () { -+ return this[LRU_LIST].toArray().map(k => k.key) -+ } -+ -+ values () { -+ return this[LRU_LIST].toArray().map(k => k.value) -+ } -+ -+ reset () { -+ if (this[DISPOSE] && -+ this[LRU_LIST] && -+ this[LRU_LIST].length) { -+ this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) -+ } -+ -+ this[CACHE] = new Map() // hash of items by key -+ this[LRU_LIST] = new Yallist() // list of items in order of use recency -+ this[LENGTH] = 0 // length of items in the list -+ } -+ -+ dump () { -+ return this[LRU_LIST].map(hit => -+ isStale(this, hit) ? false : { -+ k: hit.key, -+ v: hit.value, -+ e: hit.now + (hit.maxAge || 0) -+ }).toArray().filter(h => h) -+ } -+ -+ dumpLru () { -+ return this[LRU_LIST] -+ } -+ -+ set (key, value, maxAge) { -+ maxAge = maxAge || this[MAX_AGE] -+ -+ if (maxAge && typeof maxAge !== 'number') -+ throw new TypeError('maxAge must be a number') -+ -+ const now = maxAge ? Date.now() : 0 -+ const len = this[LENGTH_CALCULATOR](value, key) -+ -+ if (this[CACHE].has(key)) { -+ if (len > this[MAX]) { -+ del(this, this[CACHE].get(key)) -+ return false -+ } -+ -+ const node = this[CACHE].get(key) -+ const item = node.value -+ -+ // dispose of the old one before overwriting -+ // split out into 2 ifs for better coverage tracking -+ if (this[DISPOSE]) { -+ if (!this[NO_DISPOSE_ON_SET]) -+ this[DISPOSE](key, item.value) -+ } -+ -+ item.now = now -+ item.maxAge = maxAge -+ item.value = value -+ this[LENGTH] += len - item.length -+ item.length = len -+ this.get(key) -+ trim(this) -+ return true -+ } -+ -+ const hit = new Entry(key, value, len, now, maxAge) -+ -+ // oversized objects fall out of cache automatically. -+ if (hit.length > this[MAX]) { -+ if (this[DISPOSE]) -+ this[DISPOSE](key, value) -+ -+ return false -+ } -+ -+ this[LENGTH] += hit.length -+ this[LRU_LIST].unshift(hit) -+ this[CACHE].set(key, this[LRU_LIST].head) -+ trim(this) -+ return true -+ } -+ -+ has (key) { -+ if (!this[CACHE].has(key)) return false -+ const hit = this[CACHE].get(key).value -+ return !isStale(this, hit) -+ } -+ -+ get (key) { -+ return get(this, key, true) -+ } -+ -+ peek (key) { -+ return get(this, key, false) -+ } -+ -+ pop () { -+ const node = this[LRU_LIST].tail -+ if (!node) -+ return null -+ -+ del(this, node) -+ return node.value -+ } -+ -+ del (key) { -+ del(this, this[CACHE].get(key)) -+ } -+ -+ load (arr) { -+ // reset the cache -+ this.reset() -+ -+ const now = Date.now() -+ // A previous serialized cache has the most recent items first -+ for (let l = arr.length - 1; l >= 0; l--) { -+ const hit = arr[l] -+ const expiresAt = hit.e || 0 -+ if (expiresAt === 0) -+ // the item was created without expiration in a non aged cache -+ this.set(hit.k, hit.v) -+ else { -+ const maxAge = expiresAt - now -+ // dont add already expired items -+ if (maxAge > 0) { -+ this.set(hit.k, hit.v, maxAge) -+ } -+ } -+ } -+ } -+ -+ prune () { -+ this[CACHE].forEach((value, key) => get(this, key, false)) -+ } -+} -+ -+const get = (self, key, doUse) => { -+ const node = self[CACHE].get(key) -+ if (node) { -+ const hit = node.value -+ if (isStale(self, hit)) { -+ del(self, node) -+ if (!self[ALLOW_STALE]) -+ return undefined -+ } else { -+ if (doUse) { -+ if (self[UPDATE_AGE_ON_GET]) -+ node.value.now = Date.now() -+ self[LRU_LIST].unshiftNode(node) -+ } -+ } -+ return hit.value -+ } -+} -+ -+const isStale = (self, hit) => { -+ if (!hit || (!hit.maxAge && !self[MAX_AGE])) -+ return false -+ -+ const diff = Date.now() - hit.now -+ return hit.maxAge ? diff > hit.maxAge -+ : self[MAX_AGE] && (diff > self[MAX_AGE]) -+} -+ -+const trim = self => { -+ if (self[LENGTH] > self[MAX]) { -+ for (let walker = self[LRU_LIST].tail; -+ self[LENGTH] > self[MAX] && walker !== null;) { -+ // We know that we're about to delete this one, and also -+ // what the next least recently used key will be, so just -+ // go ahead and set it now. -+ const prev = walker.prev -+ del(self, walker) -+ walker = prev -+ } -+ } -+} -+ -+const del = (self, node) => { -+ if (node) { -+ const hit = node.value -+ if (self[DISPOSE]) -+ self[DISPOSE](hit.key, hit.value) -+ -+ self[LENGTH] -= hit.length -+ self[CACHE].delete(hit.key) -+ self[LRU_LIST].removeNode(node) -+ } -+} -+ -+class Entry { -+ constructor (key, value, length, now, maxAge) { -+ this.key = key -+ this.value = value -+ this.length = length -+ this.now = now -+ this.maxAge = maxAge || 0 -+ } -+} -+ -+const forEachStep = (self, fn, node, thisp) => { -+ let hit = node.value -+ if (isStale(self, hit)) { -+ del(self, node) -+ if (!self[ALLOW_STALE]) -+ hit = undefined -+ } -+ if (hit) -+ fn.call(thisp, hit.value, hit.key, self) -+} -+ -+module.exports = LRUCache -+ -+}, -+"9TngD91nTlfOwWrHqowNEEg7Mb8BwcPx9LsgIBSygMo=": -+function (require, module, exports, __dirname, __filename) { -+const parse = require('./parse') -+const clean = (version, options) => { -+ const s = parse(version.trim().replace(/^[=v]+/, ''), options) -+ return s ? s.version : null -+} -+module.exports = clean -+ -+}, -+"9VJwpbefVqUYz7c0A71Appnwv3SpHvlIuhDhpXA3uSU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var zlib_deflate = require('./zlib/deflate'); -+var utils = require('./utils/common'); -+var strings = require('./utils/strings'); -+var msg = require('./zlib/messages'); -+var ZStream = require('./zlib/zstream'); -+ -+var toString = Object.prototype.toString; -+ -+/* Public constants ==========================================================*/ -+/* ===========================================================================*/ -+ -+var Z_NO_FLUSH = 0; -+var Z_FINISH = 4; -+ -+var Z_OK = 0; -+var Z_STREAM_END = 1; -+var Z_SYNC_FLUSH = 2; -+ -+var Z_DEFAULT_COMPRESSION = -1; -+ -+var Z_DEFAULT_STRATEGY = 0; -+ -+var Z_DEFLATED = 8; -+ -+/* ===========================================================================*/ -+ -+ -+/** -+ * class Deflate -+ * -+ * Generic JS-style wrapper for zlib calls. If you don't need -+ * streaming behaviour - use more simple functions: [[deflate]], -+ * [[deflateRaw]] and [[gzip]]. -+ **/ -+ -+/* internal -+ * Deflate.chunks -> Array -+ * -+ * Chunks of output data, if [[Deflate#onData]] not overriden. -+ **/ -+ -+/** -+ * Deflate.result -> Uint8Array|Array -+ * -+ * Compressed result, generated by default [[Deflate#onData]] -+ * and [[Deflate#onEnd]] handlers. Filled after you push last chunk -+ * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you -+ * push a chunk with explicit flush (call [[Deflate#push]] with -+ * `Z_SYNC_FLUSH` param). -+ **/ -+ -+/** -+ * Deflate.err -> Number -+ * -+ * Error code after deflate finished. 0 (Z_OK) on success. -+ * You will not need it in real life, because deflate errors -+ * are possible only on wrong options or bad `onData` / `onEnd` -+ * custom handlers. -+ **/ -+ -+/** -+ * Deflate.msg -> String -+ * -+ * Error message, if [[Deflate.err]] != 0 -+ **/ -+ -+ -+/** -+ * new Deflate(options) -+ * - options (Object): zlib deflate options. -+ * -+ * Creates new deflator instance with specified params. Throws exception -+ * on bad params. Supported options: -+ * -+ * - `level` -+ * - `windowBits` -+ * - `memLevel` -+ * - `strategy` -+ * - `dictionary` -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information on these. -+ * -+ * Additional options, for internal needs: -+ * -+ * - `chunkSize` - size of generated data chunks (16K by default) -+ * - `raw` (Boolean) - do raw deflate -+ * - `gzip` (Boolean) - create gzip wrapper -+ * - `to` (String) - if equal to 'string', then result will be "binary string" -+ * (each char code [0..255]) -+ * - `header` (Object) - custom header for gzip -+ * - `text` (Boolean) - true if compressed data believed to be text -+ * - `time` (Number) - modification time, unix timestamp -+ * - `os` (Number) - operation system code -+ * - `extra` (Array) - array of bytes with extra data (max 65536) -+ * - `name` (String) - file name (binary string) -+ * - `comment` (String) - comment (binary string) -+ * - `hcrc` (Boolean) - true if header crc should be added -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) -+ * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); -+ * -+ * var deflate = new pako.Deflate({ level: 3}); -+ * -+ * deflate.push(chunk1, false); -+ * deflate.push(chunk2, true); // true -> last chunk -+ * -+ * if (deflate.err) { throw new Error(deflate.err); } -+ * -+ * console.log(deflate.result); -+ * ``` -+ **/ -+function Deflate(options) { -+ if (!(this instanceof Deflate)) return new Deflate(options); -+ -+ this.options = utils.assign({ -+ level: Z_DEFAULT_COMPRESSION, -+ method: Z_DEFLATED, -+ chunkSize: 16384, -+ windowBits: 15, -+ memLevel: 8, -+ strategy: Z_DEFAULT_STRATEGY, -+ to: '' -+ }, options || {}); -+ -+ var opt = this.options; -+ -+ if (opt.raw && (opt.windowBits > 0)) { -+ opt.windowBits = -opt.windowBits; -+ } -+ -+ else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { -+ opt.windowBits += 16; -+ } -+ -+ this.err = 0; // error code, if happens (0 = Z_OK) -+ this.msg = ''; // error message -+ this.ended = false; // used to avoid multiple onEnd() calls -+ this.chunks = []; // chunks of compressed data -+ -+ this.strm = new ZStream(); -+ this.strm.avail_out = 0; -+ -+ var status = zlib_deflate.deflateInit2( -+ this.strm, -+ opt.level, -+ opt.method, -+ opt.windowBits, -+ opt.memLevel, -+ opt.strategy -+ ); -+ -+ if (status !== Z_OK) { -+ throw new Error(msg[status]); -+ } -+ -+ if (opt.header) { -+ zlib_deflate.deflateSetHeader(this.strm, opt.header); -+ } -+ -+ if (opt.dictionary) { -+ var dict; -+ // Convert data if needed -+ if (typeof opt.dictionary === 'string') { -+ // If we need to compress text, change encoding to utf8. -+ dict = strings.string2buf(opt.dictionary); -+ } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { -+ dict = new Uint8Array(opt.dictionary); -+ } else { -+ dict = opt.dictionary; -+ } -+ -+ status = zlib_deflate.deflateSetDictionary(this.strm, dict); -+ -+ if (status !== Z_OK) { -+ throw new Error(msg[status]); -+ } -+ -+ this._dict_set = true; -+ } -+} -+ -+/** -+ * Deflate#push(data[, mode]) -> Boolean -+ * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be -+ * converted to utf8 byte sequence. -+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. -+ * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. -+ * -+ * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with -+ * new compressed chunks. Returns `true` on success. The last data block must have -+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call -+ * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you -+ * can use mode Z_SYNC_FLUSH, keeping the compression context. -+ * -+ * On fail call [[Deflate#onEnd]] with error code and return false. -+ * -+ * We strongly recommend to use `Uint8Array` on input for best speed (output -+ * array format is detected automatically). Also, don't skip last param and always -+ * use the same type in your code (boolean or number). That will improve JS speed. -+ * -+ * For regular `Array`-s make sure all elements are [0..255]. -+ * -+ * ##### Example -+ * -+ * ```javascript -+ * push(chunk, false); // push one of data chunks -+ * ... -+ * push(chunk, true); // push last chunk -+ * ``` -+ **/ -+Deflate.prototype.push = function (data, mode) { -+ var strm = this.strm; -+ var chunkSize = this.options.chunkSize; -+ var status, _mode; -+ -+ if (this.ended) { return false; } -+ -+ _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH); -+ -+ // Convert data if needed -+ if (typeof data === 'string') { -+ // If we need to compress text, change encoding to utf8. -+ strm.input = strings.string2buf(data); -+ } else if (toString.call(data) === '[object ArrayBuffer]') { -+ strm.input = new Uint8Array(data); -+ } else { -+ strm.input = data; -+ } -+ -+ strm.next_in = 0; -+ strm.avail_in = strm.input.length; -+ -+ do { -+ if (strm.avail_out === 0) { -+ strm.output = new utils.Buf8(chunkSize); -+ strm.next_out = 0; -+ strm.avail_out = chunkSize; -+ } -+ status = zlib_deflate.deflate(strm, _mode); /* no bad return value */ -+ -+ if (status !== Z_STREAM_END && status !== Z_OK) { -+ this.onEnd(status); -+ this.ended = true; -+ return false; -+ } -+ if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) { -+ if (this.options.to === 'string') { -+ this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); -+ } else { -+ this.onData(utils.shrinkBuf(strm.output, strm.next_out)); -+ } -+ } -+ } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END); -+ -+ // Finalize on the last chunk. -+ if (_mode === Z_FINISH) { -+ status = zlib_deflate.deflateEnd(this.strm); -+ this.onEnd(status); -+ this.ended = true; -+ return status === Z_OK; -+ } -+ -+ // callback interim results if Z_SYNC_FLUSH. -+ if (_mode === Z_SYNC_FLUSH) { -+ this.onEnd(Z_OK); -+ strm.avail_out = 0; -+ return true; -+ } -+ -+ return true; -+}; -+ -+ -+/** -+ * Deflate#onData(chunk) -> Void -+ * - chunk (Uint8Array|Array|String): ouput data. Type of array depends -+ * on js engine support. When string output requested, each chunk -+ * will be string. -+ * -+ * By default, stores data blocks in `chunks[]` property and glue -+ * those in `onEnd`. Override this handler, if you need another behaviour. -+ **/ -+Deflate.prototype.onData = function (chunk) { -+ this.chunks.push(chunk); -+}; -+ -+ -+/** -+ * Deflate#onEnd(status) -> Void -+ * - status (Number): deflate status. 0 (Z_OK) on success, -+ * other if not. -+ * -+ * Called once after you tell deflate that the input stream is -+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) -+ * or if an error happened. By default - join collected chunks, -+ * free memory and fill `results` / `err` properties. -+ **/ -+Deflate.prototype.onEnd = function (status) { -+ // On success - join -+ if (status === Z_OK) { -+ if (this.options.to === 'string') { -+ this.result = this.chunks.join(''); -+ } else { -+ this.result = utils.flattenChunks(this.chunks); -+ } -+ } -+ this.chunks = []; -+ this.err = status; -+ this.msg = this.strm.msg; -+}; -+ -+ -+/** -+ * deflate(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to compress. -+ * - options (Object): zlib deflate options. -+ * -+ * Compress `data` with deflate algorithm and `options`. -+ * -+ * Supported options are: -+ * -+ * - level -+ * - windowBits -+ * - memLevel -+ * - strategy -+ * - dictionary -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information on these. -+ * -+ * Sugar (options): -+ * -+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify -+ * negative windowBits implicitly. -+ * - `to` (String) - if equal to 'string', then result will be "binary string" -+ * (each char code [0..255]) -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , data = Uint8Array([1,2,3,4,5,6,7,8,9]); -+ * -+ * console.log(pako.deflate(data)); -+ * ``` -+ **/ -+function deflate(input, options) { -+ var deflator = new Deflate(options); -+ -+ deflator.push(input, true); -+ -+ // That will never happens, if you don't cheat with options :) -+ if (deflator.err) { throw deflator.msg; } -+ -+ return deflator.result; -+} -+ -+ -+/** -+ * deflateRaw(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to compress. -+ * - options (Object): zlib deflate options. -+ * -+ * The same as [[deflate]], but creates raw data, without wrapper -+ * (header and adler32 crc). -+ **/ -+function deflateRaw(input, options) { -+ options = options || {}; -+ options.raw = true; -+ return deflate(input, options); -+} -+ -+ -+/** -+ * gzip(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to compress. -+ * - options (Object): zlib deflate options. -+ * -+ * The same as [[deflate]], but create gzip wrapper instead of -+ * deflate one. -+ **/ -+function gzip(input, options) { -+ options = options || {}; -+ options.gzip = true; -+ return deflate(input, options); -+} -+ -+ -+exports.Deflate = Deflate; -+exports.deflate = deflate; -+exports.deflateRaw = deflateRaw; -+exports.gzip = gzip; -+ -+}, -+"9VcNilZ3nIjr3EdqAiIYybaxXotfah2udZQFj7zGi/I=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]'; -+ -+}, -+"9VvHEyeWOS4VzqJnlf2SkzEz64yDqlWdepZOgPXA0uQ=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const resolve_1 = require("./resolve"); -+class MissingRefError extends Error { -+ constructor(baseId, ref, msg) { -+ super(msg || `can't resolve reference ${ref} from id ${baseId}`); -+ this.missingRef = resolve_1.resolveUrl(baseId, ref); -+ this.missingSchema = resolve_1.normalizeId(resolve_1.getFullPath(this.missingRef)); -+ } -+} -+exports.default = MissingRefError; -+//# sourceMappingURL=ref_error.js.map -+}, -+"9WIkMme+D8oq5P1vgQwPW/j0Ow9ITQKqD+oP5K4UjFA=": -+function (require, module, exports, __dirname, __filename) { -+exports.add = add -+exports.has = has -+exports.remove = remove -+exports.swap = swap -+ -+function add (list, item) { -+ if (has(list, item)) return item -+ item._index = list.length -+ list.push(item) -+ return item -+} -+ -+function has (list, item) { -+ return item._index < list.length && list[item._index] === item -+} -+ -+function remove (list, item) { -+ if (!has(list, item)) return null -+ -+ var last = list.pop() -+ if (last !== item) { -+ list[item._index] = last -+ last._index = item._index -+ } -+ -+ return item -+} -+ -+function swap (list, a, b) { -+ if (!has(list, a) || !has(list, b)) return -+ var tmp = a._index -+ a._index = b._index -+ list[a._index] = a -+ b._index = tmp -+ list[b._index] = b -+} -+ -+}, -+"9XB/oOmtwNa96LdB+Dcpz50rT8G22XrBL0ESA4B7Zs4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const code_1 = require("../code"); -+const codegen_1 = require("../../compile/codegen"); -+const names_1 = require("../../compile/names"); -+const util_1 = require("../../compile/util"); -+const error = { -+ message: "must NOT have additional properties", -+ params: ({ params }) => codegen_1._ `{additionalProperty: ${params.additionalProperty}}`, -+}; -+const def = { -+ keyword: "additionalProperties", -+ type: ["object"], -+ schemaType: ["boolean", "object"], -+ allowUndefined: true, -+ trackErrors: true, -+ error, -+ code(cxt) { -+ const { gen, schema, parentSchema, data, errsCount, it } = cxt; -+ /* istanbul ignore if */ -+ if (!errsCount) -+ throw new Error("ajv implementation error"); -+ const { allErrors, opts } = it; -+ it.props = true; -+ if (opts.removeAdditional !== "all" && util_1.alwaysValidSchema(it, schema)) -+ return; -+ const props = code_1.allSchemaProperties(parentSchema.properties); -+ const patProps = code_1.allSchemaProperties(parentSchema.patternProperties); -+ checkAdditionalProperties(); -+ cxt.ok(codegen_1._ `${errsCount} === ${names_1.default.errors}`); -+ function checkAdditionalProperties() { -+ gen.forIn("key", data, (key) => { -+ if (!props.length && !patProps.length) -+ additionalPropertyCode(key); -+ else -+ gen.if(isAdditional(key), () => additionalPropertyCode(key)); -+ }); -+ } -+ function isAdditional(key) { -+ let definedProp; -+ if (props.length > 8) { -+ // TODO maybe an option instead of hard-coded 8? -+ const propsSchema = util_1.schemaRefOrVal(it, parentSchema.properties, "properties"); -+ definedProp = code_1.isOwnProperty(gen, propsSchema, key); -+ } -+ else if (props.length) { -+ definedProp = codegen_1.or(...props.map((p) => codegen_1._ `${key} === ${p}`)); -+ } -+ else { -+ definedProp = codegen_1.nil; -+ } -+ if (patProps.length) { -+ definedProp = codegen_1.or(definedProp, ...patProps.map((p) => codegen_1._ `${code_1.usePattern(cxt, p)}.test(${key})`)); -+ } -+ return codegen_1.not(definedProp); -+ } -+ function deleteAdditional(key) { -+ gen.code(codegen_1._ `delete ${data}[${key}]`); -+ } -+ function additionalPropertyCode(key) { -+ if (opts.removeAdditional === "all" || (opts.removeAdditional && schema === false)) { -+ deleteAdditional(key); -+ return; -+ } -+ if (schema === false) { -+ cxt.setParams({ additionalProperty: key }); -+ cxt.error(); -+ if (!allErrors) -+ gen.break(); -+ return; -+ } -+ if (typeof schema == "object" && !util_1.alwaysValidSchema(it, schema)) { -+ const valid = gen.name("valid"); -+ if (opts.removeAdditional === "failing") { -+ applyAdditionalSchema(key, valid, false); -+ gen.if(codegen_1.not(valid), () => { -+ cxt.reset(); -+ deleteAdditional(key); -+ }); -+ } -+ else { -+ applyAdditionalSchema(key, valid); -+ if (!allErrors) -+ gen.if(codegen_1.not(valid), () => gen.break()); -+ } -+ } -+ } -+ function applyAdditionalSchema(key, valid, errors) { -+ const subschema = { -+ keyword: "additionalProperties", -+ dataProp: key, -+ dataPropType: util_1.Type.Str, -+ }; -+ if (errors === false) { -+ Object.assign(subschema, { -+ compositeRule: true, -+ createErrors: false, -+ allErrors: false, -+ }); -+ } -+ cxt.subschema(subschema, valid); -+ } -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=additionalProperties.js.map -+}, -+"9YOJgFw4qG5w2jTWwMeXsjiAPoXYSL7UdPQ/FU0OQCs=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const EventEmitter = require('events'); -+const tls = require('tls'); -+const http2 = require('http2'); -+const QuickLRU = require('quick-lru'); -+ -+const kCurrentStreamsCount = Symbol('currentStreamsCount'); -+const kRequest = Symbol('request'); -+const kOriginSet = Symbol('cachedOriginSet'); -+const kGracefullyClosing = Symbol('gracefullyClosing'); -+ -+const nameKeys = [ -+ // `http2.connect()` options -+ 'maxDeflateDynamicTableSize', -+ 'maxSessionMemory', -+ 'maxHeaderListPairs', -+ 'maxOutstandingPings', -+ 'maxReservedRemoteStreams', -+ 'maxSendHeaderBlockLength', -+ 'paddingStrategy', -+ -+ // `tls.connect()` options -+ 'localAddress', -+ 'path', -+ 'rejectUnauthorized', -+ 'minDHSize', -+ -+ // `tls.createSecureContext()` options -+ 'ca', -+ 'cert', -+ 'clientCertEngine', -+ 'ciphers', -+ 'key', -+ 'pfx', -+ 'servername', -+ 'minVersion', -+ 'maxVersion', -+ 'secureProtocol', -+ 'crl', -+ 'honorCipherOrder', -+ 'ecdhCurve', -+ 'dhparam', -+ 'secureOptions', -+ 'sessionIdContext' -+]; -+ -+const getSortedIndex = (array, value, compare) => { -+ let low = 0; -+ let high = array.length; -+ -+ while (low < high) { -+ const mid = (low + high) >>> 1; -+ -+ /* istanbul ignore next */ -+ if (compare(array[mid], value)) { -+ // This never gets called because we use descending sort. Better to have this anyway. -+ low = mid + 1; -+ } else { -+ high = mid; -+ } -+ } -+ -+ return low; -+}; -+ -+const compareSessions = (a, b) => { -+ return a.remoteSettings.maxConcurrentStreams > b.remoteSettings.maxConcurrentStreams; -+}; -+ -+// See https://tools.ietf.org/html/rfc8336 -+const closeCoveredSessions = (where, session) => { -+ // Clients SHOULD NOT emit new requests on any connection whose Origin -+ // Set is a proper subset of another connection's Origin Set, and they -+ // SHOULD close it once all outstanding requests are satisfied. -+ for (const coveredSession of where) { -+ if ( -+ // The set is a proper subset when its length is less than the other set. -+ coveredSession[kOriginSet].length < session[kOriginSet].length && -+ -+ // And the other set includes all elements of the subset. -+ coveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) && -+ -+ // Makes sure that the session can handle all requests from the covered session. -+ coveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams -+ ) { -+ // This allows pending requests to finish and prevents making new requests. -+ gracefullyClose(coveredSession); -+ } -+ } -+}; -+ -+// This is basically inverted `closeCoveredSessions(...)`. -+const closeSessionIfCovered = (where, coveredSession) => { -+ for (const session of where) { -+ if ( -+ coveredSession[kOriginSet].length < session[kOriginSet].length && -+ coveredSession[kOriginSet].every(origin => session[kOriginSet].includes(origin)) && -+ coveredSession[kCurrentStreamsCount] + session[kCurrentStreamsCount] <= session.remoteSettings.maxConcurrentStreams -+ ) { -+ gracefullyClose(coveredSession); -+ } -+ } -+}; -+ -+const getSessions = ({agent, isFree}) => { -+ const result = {}; -+ -+ // eslint-disable-next-line guard-for-in -+ for (const normalizedOptions in agent.sessions) { -+ const sessions = agent.sessions[normalizedOptions]; -+ -+ const filtered = sessions.filter(session => { -+ const result = session[Agent.kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams; -+ -+ return isFree ? result : !result; -+ }); -+ -+ if (filtered.length !== 0) { -+ result[normalizedOptions] = filtered; -+ } -+ } -+ -+ return result; -+}; -+ -+const gracefullyClose = session => { -+ session[kGracefullyClosing] = true; -+ -+ if (session[kCurrentStreamsCount] === 0) { -+ session.close(); -+ } -+}; -+ -+class Agent extends EventEmitter { -+ constructor({timeout = 60000, maxSessions = Infinity, maxFreeSessions = 10, maxCachedTlsSessions = 100} = {}) { -+ super(); -+ -+ // A session is considered busy when its current streams count -+ // is equal to or greater than the `maxConcurrentStreams` value. -+ -+ // A session is considered free when its current streams count -+ // is less than the `maxConcurrentStreams` value. -+ -+ // SESSIONS[NORMALIZED_OPTIONS] = []; -+ this.sessions = {}; -+ -+ // The queue for creating new sessions. It looks like this: -+ // QUEUE[NORMALIZED_OPTIONS][NORMALIZED_ORIGIN] = ENTRY_FUNCTION -+ // -+ // The entry function has `listeners`, `completed` and `destroyed` properties. -+ // `listeners` is an array of objects containing `resolve` and `reject` functions. -+ // `completed` is a boolean. It's set to true after ENTRY_FUNCTION is executed. -+ // `destroyed` is a boolean. If it's set to true, the session will be destroyed if hasn't connected yet. -+ this.queue = {}; -+ -+ // Each session will use this timeout value. -+ this.timeout = timeout; -+ -+ // Max sessions in total -+ this.maxSessions = maxSessions; -+ -+ // Max free sessions in total -+ // TODO: decreasing `maxFreeSessions` should close some sessions -+ this.maxFreeSessions = maxFreeSessions; -+ -+ this._freeSessionsCount = 0; -+ this._sessionsCount = 0; -+ -+ // We don't support push streams by default. -+ this.settings = { -+ enablePush: false -+ }; -+ -+ // Reusing TLS sessions increases performance. -+ this.tlsSessionCache = new QuickLRU({maxSize: maxCachedTlsSessions}); -+ } -+ -+ static normalizeOrigin(url, servername) { -+ if (typeof url === 'string') { -+ url = new URL(url); -+ } -+ -+ if (servername && url.hostname !== servername) { -+ url.hostname = servername; -+ } -+ -+ return url.origin; -+ } -+ -+ normalizeOptions(options) { -+ let normalized = ''; -+ -+ if (options) { -+ for (const key of nameKeys) { -+ if (options[key]) { -+ normalized += `:${options[key]}`; -+ } -+ } -+ } -+ -+ return normalized; -+ } -+ -+ _tryToCreateNewSession(normalizedOptions, normalizedOrigin) { -+ if (!(normalizedOptions in this.queue) || !(normalizedOrigin in this.queue[normalizedOptions])) { -+ return; -+ } -+ -+ const item = this.queue[normalizedOptions][normalizedOrigin]; -+ -+ // The entry function can be run only once. -+ // BUG: The session may be never created when: -+ // - the first condition is false AND -+ // - this function is never called with the same arguments in the future. -+ if (this._sessionsCount < this.maxSessions && !item.completed) { -+ item.completed = true; -+ -+ item(); -+ } -+ } -+ -+ getSession(origin, options, listeners) { -+ return new Promise((resolve, reject) => { -+ if (Array.isArray(listeners)) { -+ listeners = [...listeners]; -+ -+ // Resolve the current promise ASAP, we're just moving the listeners. -+ // They will be executed at a different time. -+ resolve(); -+ } else { -+ listeners = [{resolve, reject}]; -+ } -+ -+ const normalizedOptions = this.normalizeOptions(options); -+ const normalizedOrigin = Agent.normalizeOrigin(origin, options && options.servername); -+ -+ if (normalizedOrigin === undefined) { -+ for (const {reject} of listeners) { -+ reject(new TypeError('The `origin` argument needs to be a string or an URL object')); -+ } -+ -+ return; -+ } -+ -+ if (normalizedOptions in this.sessions) { -+ const sessions = this.sessions[normalizedOptions]; -+ -+ let maxConcurrentStreams = -1; -+ let currentStreamsCount = -1; -+ let optimalSession; -+ -+ // We could just do this.sessions[normalizedOptions].find(...) but that isn't optimal. -+ // Additionally, we are looking for session which has biggest current pending streams count. -+ for (const session of sessions) { -+ const sessionMaxConcurrentStreams = session.remoteSettings.maxConcurrentStreams; -+ -+ if (sessionMaxConcurrentStreams < maxConcurrentStreams) { -+ break; -+ } -+ -+ if (session[kOriginSet].includes(normalizedOrigin)) { -+ const sessionCurrentStreamsCount = session[kCurrentStreamsCount]; -+ -+ if ( -+ sessionCurrentStreamsCount >= sessionMaxConcurrentStreams || -+ session[kGracefullyClosing] || -+ // Unfortunately the `close` event isn't called immediately, -+ // so `session.destroyed` is `true`, but `session.closed` is `false`. -+ session.destroyed -+ ) { -+ continue; -+ } -+ -+ // We only need set this once. -+ if (!optimalSession) { -+ maxConcurrentStreams = sessionMaxConcurrentStreams; -+ } -+ -+ // We're looking for the session which has biggest current pending stream count, -+ // in order to minimalize the amount of active sessions. -+ if (sessionCurrentStreamsCount > currentStreamsCount) { -+ optimalSession = session; -+ currentStreamsCount = sessionCurrentStreamsCount; -+ } -+ } -+ } -+ -+ if (optimalSession) { -+ /* istanbul ignore next: safety check */ -+ if (listeners.length !== 1) { -+ for (const {reject} of listeners) { -+ const error = new Error( -+ `Expected the length of listeners to be 1, got ${listeners.length}.\n` + -+ 'Please report this to https://github.com/szmarczak/http2-wrapper/' -+ ); -+ -+ reject(error); -+ } -+ -+ return; -+ } -+ -+ listeners[0].resolve(optimalSession); -+ return; -+ } -+ } -+ -+ if (normalizedOptions in this.queue) { -+ if (normalizedOrigin in this.queue[normalizedOptions]) { -+ // There's already an item in the queue, just attach ourselves to it. -+ this.queue[normalizedOptions][normalizedOrigin].listeners.push(...listeners); -+ -+ // This shouldn't be executed here. -+ // See the comment inside _tryToCreateNewSession. -+ this._tryToCreateNewSession(normalizedOptions, normalizedOrigin); -+ return; -+ } -+ } else { -+ this.queue[normalizedOptions] = {}; -+ } -+ -+ // The entry must be removed from the queue IMMEDIATELY when: -+ // 1. the session connects successfully, -+ // 2. an error occurs. -+ const removeFromQueue = () => { -+ // Our entry can be replaced. We cannot remove the new one. -+ if (normalizedOptions in this.queue && this.queue[normalizedOptions][normalizedOrigin] === entry) { -+ delete this.queue[normalizedOptions][normalizedOrigin]; -+ -+ if (Object.keys(this.queue[normalizedOptions]).length === 0) { -+ delete this.queue[normalizedOptions]; -+ } -+ } -+ }; -+ -+ // The main logic is here -+ const entry = () => { -+ const name = `${normalizedOrigin}:${normalizedOptions}`; -+ let receivedSettings = false; -+ -+ try { -+ const session = http2.connect(origin, { -+ createConnection: this.createConnection, -+ settings: this.settings, -+ session: this.tlsSessionCache.get(name), -+ ...options -+ }); -+ session[kCurrentStreamsCount] = 0; -+ session[kGracefullyClosing] = false; -+ -+ const isFree = () => session[kCurrentStreamsCount] < session.remoteSettings.maxConcurrentStreams; -+ let wasFree = true; -+ -+ session.socket.once('session', tlsSession => { -+ this.tlsSessionCache.set(name, tlsSession); -+ }); -+ -+ session.once('error', error => { -+ // Listeners are empty when the session successfully connected. -+ for (const {reject} of listeners) { -+ reject(error); -+ } -+ -+ // The connection got broken, purge the cache. -+ this.tlsSessionCache.delete(name); -+ }); -+ -+ session.setTimeout(this.timeout, () => { -+ // Terminates all streams owned by this session. -+ // TODO: Maybe the streams should have a "Session timed out" error? -+ session.destroy(); -+ }); -+ -+ session.once('close', () => { -+ if (receivedSettings) { -+ // 1. If it wasn't free then no need to decrease because -+ // it has been decreased already in session.request(). -+ // 2. `stream.once('close')` won't increment the count -+ // because the session is already closed. -+ if (wasFree) { -+ this._freeSessionsCount--; -+ } -+ -+ this._sessionsCount--; -+ -+ // This cannot be moved to the stream logic, -+ // because there may be a session that hadn't made a single request. -+ const where = this.sessions[normalizedOptions]; -+ where.splice(where.indexOf(session), 1); -+ -+ if (where.length === 0) { -+ delete this.sessions[normalizedOptions]; -+ } -+ } else { -+ // Broken connection -+ const error = new Error('Session closed without receiving a SETTINGS frame'); -+ error.code = 'HTTP2WRAPPER_NOSETTINGS'; -+ -+ for (const {reject} of listeners) { -+ reject(error); -+ } -+ -+ removeFromQueue(); -+ } -+ -+ // There may be another session awaiting. -+ this._tryToCreateNewSession(normalizedOptions, normalizedOrigin); -+ }); -+ -+ // Iterates over the queue and processes listeners. -+ const processListeners = () => { -+ if (!(normalizedOptions in this.queue) || !isFree()) { -+ return; -+ } -+ -+ for (const origin of session[kOriginSet]) { -+ if (origin in this.queue[normalizedOptions]) { -+ const {listeners} = this.queue[normalizedOptions][origin]; -+ -+ // Prevents session overloading. -+ while (listeners.length !== 0 && isFree()) { -+ // We assume `resolve(...)` calls `request(...)` *directly*, -+ // otherwise the session will get overloaded. -+ listeners.shift().resolve(session); -+ } -+ -+ const where = this.queue[normalizedOptions]; -+ if (where[origin].listeners.length === 0) { -+ delete where[origin]; -+ -+ if (Object.keys(where).length === 0) { -+ delete this.queue[normalizedOptions]; -+ break; -+ } -+ } -+ -+ // We're no longer free, no point in continuing. -+ if (!isFree()) { -+ break; -+ } -+ } -+ } -+ }; -+ -+ // The Origin Set cannot shrink. No need to check if it suddenly became covered by another one. -+ session.on('origin', () => { -+ session[kOriginSet] = session.originSet; -+ -+ if (!isFree()) { -+ // The session is full. -+ return; -+ } -+ -+ processListeners(); -+ -+ // Close covered sessions (if possible). -+ closeCoveredSessions(this.sessions[normalizedOptions], session); -+ }); -+ -+ session.once('remoteSettings', () => { -+ // Fix Node.js bug preventing the process from exiting -+ session.ref(); -+ session.unref(); -+ -+ this._sessionsCount++; -+ -+ // The Agent could have been destroyed already. -+ if (entry.destroyed) { -+ const error = new Error('Agent has been destroyed'); -+ -+ for (const listener of listeners) { -+ listener.reject(error); -+ } -+ -+ session.destroy(); -+ return; -+ } -+ -+ session[kOriginSet] = session.originSet; -+ -+ { -+ const where = this.sessions; -+ -+ if (normalizedOptions in where) { -+ const sessions = where[normalizedOptions]; -+ sessions.splice(getSortedIndex(sessions, session, compareSessions), 0, session); -+ } else { -+ where[normalizedOptions] = [session]; -+ } -+ } -+ -+ this._freeSessionsCount += 1; -+ receivedSettings = true; -+ -+ this.emit('session', session); -+ -+ processListeners(); -+ removeFromQueue(); -+ -+ // TODO: Close last recently used (or least used?) session -+ if (session[kCurrentStreamsCount] === 0 && this._freeSessionsCount > this.maxFreeSessions) { -+ session.close(); -+ } -+ -+ // Check if we haven't managed to execute all listeners. -+ if (listeners.length !== 0) { -+ // Request for a new session with predefined listeners. -+ this.getSession(normalizedOrigin, options, listeners); -+ listeners.length = 0; -+ } -+ -+ // `session.remoteSettings.maxConcurrentStreams` might get increased -+ session.on('remoteSettings', () => { -+ processListeners(); -+ -+ // In case the Origin Set changes -+ closeCoveredSessions(this.sessions[normalizedOptions], session); -+ }); -+ }); -+ -+ // Shim `session.request()` in order to catch all streams -+ session[kRequest] = session.request; -+ session.request = (headers, streamOptions) => { -+ if (session[kGracefullyClosing]) { -+ throw new Error('The session is gracefully closing. No new streams are allowed.'); -+ } -+ -+ const stream = session[kRequest](headers, streamOptions); -+ -+ // The process won't exit until the session is closed or all requests are gone. -+ session.ref(); -+ -+ ++session[kCurrentStreamsCount]; -+ -+ if (session[kCurrentStreamsCount] === session.remoteSettings.maxConcurrentStreams) { -+ this._freeSessionsCount--; -+ } -+ -+ stream.once('close', () => { -+ wasFree = isFree(); -+ -+ --session[kCurrentStreamsCount]; -+ -+ if (!session.destroyed && !session.closed) { -+ closeSessionIfCovered(this.sessions[normalizedOptions], session); -+ -+ if (isFree() && !session.closed) { -+ if (!wasFree) { -+ this._freeSessionsCount++; -+ -+ wasFree = true; -+ } -+ -+ const isEmpty = session[kCurrentStreamsCount] === 0; -+ -+ if (isEmpty) { -+ session.unref(); -+ } -+ -+ if ( -+ isEmpty && -+ ( -+ this._freeSessionsCount > this.maxFreeSessions || -+ session[kGracefullyClosing] -+ ) -+ ) { -+ session.close(); -+ } else { -+ closeCoveredSessions(this.sessions[normalizedOptions], session); -+ processListeners(); -+ } -+ } -+ } -+ }); -+ -+ return stream; -+ }; -+ } catch (error) { -+ for (const listener of listeners) { -+ listener.reject(error); -+ } -+ -+ removeFromQueue(); -+ } -+ }; -+ -+ entry.listeners = listeners; -+ entry.completed = false; -+ entry.destroyed = false; -+ -+ this.queue[normalizedOptions][normalizedOrigin] = entry; -+ this._tryToCreateNewSession(normalizedOptions, normalizedOrigin); -+ }); -+ } -+ -+ request(origin, options, headers, streamOptions) { -+ return new Promise((resolve, reject) => { -+ this.getSession(origin, options, [{ -+ reject, -+ resolve: session => { -+ try { -+ resolve(session.request(headers, streamOptions)); -+ } catch (error) { -+ reject(error); -+ } -+ } -+ }]); -+ }); -+ } -+ -+ createConnection(origin, options) { -+ return Agent.connect(origin, options); -+ } -+ -+ static connect(origin, options) { -+ options.ALPNProtocols = ['h2']; -+ -+ const port = origin.port || 443; -+ const host = origin.hostname || origin.host; -+ -+ if (typeof options.servername === 'undefined') { -+ options.servername = host; -+ } -+ -+ return tls.connect(port, host, options); -+ } -+ -+ closeFreeSessions() { -+ for (const sessions of Object.values(this.sessions)) { -+ for (const session of sessions) { -+ if (session[kCurrentStreamsCount] === 0) { -+ session.close(); -+ } -+ } -+ } -+ } -+ -+ destroy(reason) { -+ for (const sessions of Object.values(this.sessions)) { -+ for (const session of sessions) { -+ session.destroy(reason); -+ } -+ } -+ -+ for (const entriesOfAuthority of Object.values(this.queue)) { -+ for (const entry of Object.values(entriesOfAuthority)) { -+ entry.destroyed = true; -+ } -+ } -+ -+ // New requests should NOT attach to destroyed sessions -+ this.queue = {}; -+ } -+ -+ get freeSessions() { -+ return getSessions({agent: this, isFree: true}); -+ } -+ -+ get busySessions() { -+ return getSessions({agent: this, isFree: false}); -+ } -+} -+ -+Agent.kCurrentStreamsCount = kCurrentStreamsCount; -+Agent.kGracefullyClosing = kGracefullyClosing; -+ -+module.exports = { -+ Agent, -+ globalAgent: new Agent() -+}; -+ -+}, -+"9cXBddZ221H6N8hzUh2IvCB9+MzjbrHxGgpNzl0Rr6g=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var zlib_inflate = require('./zlib/inflate'); -+var utils = require('./utils/common'); -+var strings = require('./utils/strings'); -+var c = require('./zlib/constants'); -+var msg = require('./zlib/messages'); -+var ZStream = require('./zlib/zstream'); -+var GZheader = require('./zlib/gzheader'); -+ -+var toString = Object.prototype.toString; -+ -+/** -+ * class Inflate -+ * -+ * Generic JS-style wrapper for zlib calls. If you don't need -+ * streaming behaviour - use more simple functions: [[inflate]] -+ * and [[inflateRaw]]. -+ **/ -+ -+/* internal -+ * inflate.chunks -> Array -+ * -+ * Chunks of output data, if [[Inflate#onData]] not overriden. -+ **/ -+ -+/** -+ * Inflate.result -> Uint8Array|Array|String -+ * -+ * Uncompressed result, generated by default [[Inflate#onData]] -+ * and [[Inflate#onEnd]] handlers. Filled after you push last chunk -+ * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you -+ * push a chunk with explicit flush (call [[Inflate#push]] with -+ * `Z_SYNC_FLUSH` param). -+ **/ -+ -+/** -+ * Inflate.err -> Number -+ * -+ * Error code after inflate finished. 0 (Z_OK) on success. -+ * Should be checked if broken data possible. -+ **/ -+ -+/** -+ * Inflate.msg -> String -+ * -+ * Error message, if [[Inflate.err]] != 0 -+ **/ -+ -+ -+/** -+ * new Inflate(options) -+ * - options (Object): zlib inflate options. -+ * -+ * Creates new inflator instance with specified params. Throws exception -+ * on bad params. Supported options: -+ * -+ * - `windowBits` -+ * - `dictionary` -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information on these. -+ * -+ * Additional options, for internal needs: -+ * -+ * - `chunkSize` - size of generated data chunks (16K by default) -+ * - `raw` (Boolean) - do raw inflate -+ * - `to` (String) - if equal to 'string', then result will be converted -+ * from utf8 to utf16 (javascript) string. When string output requested, -+ * chunk length can differ from `chunkSize`, depending on content. -+ * -+ * By default, when no options set, autodetect deflate/gzip data format via -+ * wrapper header. -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) -+ * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); -+ * -+ * var inflate = new pako.Inflate({ level: 3}); -+ * -+ * inflate.push(chunk1, false); -+ * inflate.push(chunk2, true); // true -> last chunk -+ * -+ * if (inflate.err) { throw new Error(inflate.err); } -+ * -+ * console.log(inflate.result); -+ * ``` -+ **/ -+function Inflate(options) { -+ if (!(this instanceof Inflate)) return new Inflate(options); -+ -+ this.options = utils.assign({ -+ chunkSize: 16384, -+ windowBits: 0, -+ to: '' -+ }, options || {}); -+ -+ var opt = this.options; -+ -+ // Force window size for `raw` data, if not set directly, -+ // because we have no header for autodetect. -+ if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { -+ opt.windowBits = -opt.windowBits; -+ if (opt.windowBits === 0) { opt.windowBits = -15; } -+ } -+ -+ // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate -+ if ((opt.windowBits >= 0) && (opt.windowBits < 16) && -+ !(options && options.windowBits)) { -+ opt.windowBits += 32; -+ } -+ -+ // Gzip header has no info about windows size, we can do autodetect only -+ // for deflate. So, if window size not set, force it to max when gzip possible -+ if ((opt.windowBits > 15) && (opt.windowBits < 48)) { -+ // bit 3 (16) -> gzipped data -+ // bit 4 (32) -> autodetect gzip/deflate -+ if ((opt.windowBits & 15) === 0) { -+ opt.windowBits |= 15; -+ } -+ } -+ -+ this.err = 0; // error code, if happens (0 = Z_OK) -+ this.msg = ''; // error message -+ this.ended = false; // used to avoid multiple onEnd() calls -+ this.chunks = []; // chunks of compressed data -+ -+ this.strm = new ZStream(); -+ this.strm.avail_out = 0; -+ -+ var status = zlib_inflate.inflateInit2( -+ this.strm, -+ opt.windowBits -+ ); -+ -+ if (status !== c.Z_OK) { -+ throw new Error(msg[status]); -+ } -+ -+ this.header = new GZheader(); -+ -+ zlib_inflate.inflateGetHeader(this.strm, this.header); -+} -+ -+/** -+ * Inflate#push(data[, mode]) -> Boolean -+ * - data (Uint8Array|Array|ArrayBuffer|String): input data -+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. -+ * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. -+ * -+ * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with -+ * new output chunks. Returns `true` on success. The last data block must have -+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call -+ * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you -+ * can use mode Z_SYNC_FLUSH, keeping the decompression context. -+ * -+ * On fail call [[Inflate#onEnd]] with error code and return false. -+ * -+ * We strongly recommend to use `Uint8Array` on input for best speed (output -+ * format is detected automatically). Also, don't skip last param and always -+ * use the same type in your code (boolean or number). That will improve JS speed. -+ * -+ * For regular `Array`-s make sure all elements are [0..255]. -+ * -+ * ##### Example -+ * -+ * ```javascript -+ * push(chunk, false); // push one of data chunks -+ * ... -+ * push(chunk, true); // push last chunk -+ * ``` -+ **/ -+Inflate.prototype.push = function (data, mode) { -+ var strm = this.strm; -+ var chunkSize = this.options.chunkSize; -+ var dictionary = this.options.dictionary; -+ var status, _mode; -+ var next_out_utf8, tail, utf8str; -+ var dict; -+ -+ // Flag to properly process Z_BUF_ERROR on testing inflate call -+ // when we check that all output data was flushed. -+ var allowBufError = false; -+ -+ if (this.ended) { return false; } -+ _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); -+ -+ // Convert data if needed -+ if (typeof data === 'string') { -+ // Only binary strings can be decompressed on practice -+ strm.input = strings.binstring2buf(data); -+ } else if (toString.call(data) === '[object ArrayBuffer]') { -+ strm.input = new Uint8Array(data); -+ } else { -+ strm.input = data; -+ } -+ -+ strm.next_in = 0; -+ strm.avail_in = strm.input.length; -+ -+ do { -+ if (strm.avail_out === 0) { -+ strm.output = new utils.Buf8(chunkSize); -+ strm.next_out = 0; -+ strm.avail_out = chunkSize; -+ } -+ -+ status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ -+ -+ if (status === c.Z_NEED_DICT && dictionary) { -+ // Convert data if needed -+ if (typeof dictionary === 'string') { -+ dict = strings.string2buf(dictionary); -+ } else if (toString.call(dictionary) === '[object ArrayBuffer]') { -+ dict = new Uint8Array(dictionary); -+ } else { -+ dict = dictionary; -+ } -+ -+ status = zlib_inflate.inflateSetDictionary(this.strm, dict); -+ -+ } -+ -+ if (status === c.Z_BUF_ERROR && allowBufError === true) { -+ status = c.Z_OK; -+ allowBufError = false; -+ } -+ -+ if (status !== c.Z_STREAM_END && status !== c.Z_OK) { -+ this.onEnd(status); -+ this.ended = true; -+ return false; -+ } -+ -+ if (strm.next_out) { -+ if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) { -+ -+ if (this.options.to === 'string') { -+ -+ next_out_utf8 = strings.utf8border(strm.output, strm.next_out); -+ -+ tail = strm.next_out - next_out_utf8; -+ utf8str = strings.buf2string(strm.output, next_out_utf8); -+ -+ // move tail -+ strm.next_out = tail; -+ strm.avail_out = chunkSize - tail; -+ if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } -+ -+ this.onData(utf8str); -+ -+ } else { -+ this.onData(utils.shrinkBuf(strm.output, strm.next_out)); -+ } -+ } -+ } -+ -+ // When no more input data, we should check that internal inflate buffers -+ // are flushed. The only way to do it when avail_out = 0 - run one more -+ // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. -+ // Here we set flag to process this error properly. -+ // -+ // NOTE. Deflate does not return error in this case and does not needs such -+ // logic. -+ if (strm.avail_in === 0 && strm.avail_out === 0) { -+ allowBufError = true; -+ } -+ -+ } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END); -+ -+ if (status === c.Z_STREAM_END) { -+ _mode = c.Z_FINISH; -+ } -+ -+ // Finalize on the last chunk. -+ if (_mode === c.Z_FINISH) { -+ status = zlib_inflate.inflateEnd(this.strm); -+ this.onEnd(status); -+ this.ended = true; -+ return status === c.Z_OK; -+ } -+ -+ // callback interim results if Z_SYNC_FLUSH. -+ if (_mode === c.Z_SYNC_FLUSH) { -+ this.onEnd(c.Z_OK); -+ strm.avail_out = 0; -+ return true; -+ } -+ -+ return true; -+}; -+ -+ -+/** -+ * Inflate#onData(chunk) -> Void -+ * - chunk (Uint8Array|Array|String): ouput data. Type of array depends -+ * on js engine support. When string output requested, each chunk -+ * will be string. -+ * -+ * By default, stores data blocks in `chunks[]` property and glue -+ * those in `onEnd`. Override this handler, if you need another behaviour. -+ **/ -+Inflate.prototype.onData = function (chunk) { -+ this.chunks.push(chunk); -+}; -+ -+ -+/** -+ * Inflate#onEnd(status) -> Void -+ * - status (Number): inflate status. 0 (Z_OK) on success, -+ * other if not. -+ * -+ * Called either after you tell inflate that the input stream is -+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) -+ * or if an error happened. By default - join collected chunks, -+ * free memory and fill `results` / `err` properties. -+ **/ -+Inflate.prototype.onEnd = function (status) { -+ // On success - join -+ if (status === c.Z_OK) { -+ if (this.options.to === 'string') { -+ // Glue & convert here, until we teach pako to send -+ // utf8 alligned strings to onData -+ this.result = this.chunks.join(''); -+ } else { -+ this.result = utils.flattenChunks(this.chunks); -+ } -+ } -+ this.chunks = []; -+ this.err = status; -+ this.msg = this.strm.msg; -+}; -+ -+ -+/** -+ * inflate(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * Decompress `data` with inflate/ungzip and `options`. Autodetect -+ * format via wrapper header by default. That's why we don't provide -+ * separate `ungzip` method. -+ * -+ * Supported options are: -+ * -+ * - windowBits -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information. -+ * -+ * Sugar (options): -+ * -+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify -+ * negative windowBits implicitly. -+ * - `to` (String) - if equal to 'string', then result will be converted -+ * from utf8 to utf16 (javascript) string. When string output requested, -+ * chunk length can differ from `chunkSize`, depending on content. -+ * -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) -+ * , output; -+ * -+ * try { -+ * output = pako.inflate(input); -+ * } catch (err) -+ * console.log(err); -+ * } -+ * ``` -+ **/ -+function inflate(input, options) { -+ var inflator = new Inflate(options); -+ -+ inflator.push(input, true); -+ -+ // That will never happens, if you don't cheat with options :) -+ if (inflator.err) { throw inflator.msg; } -+ -+ return inflator.result; -+} -+ -+ -+/** -+ * inflateRaw(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * The same as [[inflate]], but creates raw data, without wrapper -+ * (header and adler32 crc). -+ **/ -+function inflateRaw(input, options) { -+ options = options || {}; -+ options.raw = true; -+ return inflate(input, options); -+} -+ -+ -+/** -+ * ungzip(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * Just shortcut to [[inflate]], because it autodetects format -+ * by header.content. Done for convenience. -+ **/ -+ -+ -+exports.Inflate = Inflate; -+exports.inflate = inflate; -+exports.inflateRaw = inflateRaw; -+exports.ungzip = inflate; -+ -+}, -+"9cwM4EYty0lt2bjplT9byR/1F6uA8iWGUJn+RXoiEYM=": -+function (require, module, exports, __dirname, __filename) { -+var decodeUriComponent = require("decode-uri-component") -+ -+function customDecodeUriComponent(string) { -+ // `decodeUriComponent` turns `+` into ` `, but that's not wanted. -+ return decodeUriComponent(string.replace(/\+/g, "%2B")) -+} -+ -+module.exports = customDecodeUriComponent -+ -+}, -+"9fd1k5ZkeTwPk3R00CrHjPFwfqfnoN2YXmDjJiyUzgE=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('inherits') -+var Readable = require('readable-stream').Readable -+var extend = require('xtend') -+ -+module.exports = ReadStream -+inherits(ReadStream, Readable) -+ -+function ReadStream (iterator, options) { -+ if (!(this instanceof ReadStream)) return new ReadStream(iterator, options) -+ options = options || {} -+ Readable.call(this, extend(options, { -+ objectMode: true -+ })) -+ this._iterator = iterator -+ this._options = options -+ this.on('end', this.destroy.bind(this, null, null)) -+} -+ -+ReadStream.prototype._read = function () { -+ var self = this -+ var options = this._options -+ if (this.destroyed) return -+ -+ this._iterator.next(function (err, key, value) { -+ if (self.destroyed) return -+ if (err) return self.destroy(err) -+ -+ if (key === undefined && value === undefined) { -+ self.push(null) -+ } else if (options.keys !== false && options.values === false) { -+ self.push(key) -+ } else if (options.keys === false && options.values !== false) { -+ self.push(value) -+ } else { -+ self.push({ key: key, value: value }) -+ } -+ }) -+} -+ -+ReadStream.prototype._destroy = function (err, callback) { -+ this._iterator.end(function (err2) { -+ callback(err || err2) -+ }) -+} -+ -+}, -+"9fml02JTwCzWZyfsrgPLKqOF7EK7d5hYYNf4O1P/3Ec=": -+function (require, module, exports, __dirname, __filename) { -+var exportGeoJson = require('osm-p2p-geojson') -+ -+var matchPreset = require('./preset-matcher') -+var isPolygonFeature = require('./polygon-feature') -+ -+module.exports = function (osm, opts) { -+ if (!opts) opts = {} -+ var presets = opts.presets -+ var matcher = presets ? matchPreset(presets.presets) : null -+ function featureMap (f) { -+ var newProps = {} -+ Object.keys(f.properties).forEach(function (key) { -+ if (key === 'id' || key === 'version') return -+ var newKey = key.replace(':', '_') -+ newProps[newKey] = f.properties[key] -+ }) -+ delete f.id -+ f.properties = newProps -+ if (matcher) { -+ var match = matcher(f) -+ if (match) { -+ f.properties.icon = match.icon -+ f.properties.preset = match.id -+ } -+ } -+ return f -+ } -+ -+ var polygonFeatures = presets && isPolygonFeature(presets.presets) -+ -+ return exportGeoJson(osm, { -+ map: featureMap, -+ polygonFeatures -+ }) -+} -+ -+}, -+"9hgaXGLLIl4qLJFZGO0K4/+TaPQIRXY9CpKYAn6E7V4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var isExtendable = require('is-extendable'); -+var forIn = require('for-in'); -+ -+function mixinDeep(target, objects) { -+ var len = arguments.length, i = 0; -+ while (++i < len) { -+ var obj = arguments[i]; -+ if (isObject(obj)) { -+ forIn(obj, copy, target); -+ } -+ } -+ return target; -+} -+ -+/** -+ * Copy properties from the source object to the -+ * target object. -+ * -+ * @param {*} `val` -+ * @param {String} `key` -+ */ -+ -+function copy(val, key) { -+ if (!isValidKey(key)) { -+ return; -+ } -+ -+ var obj = this[key]; -+ if (isObject(val) && isObject(obj)) { -+ mixinDeep(obj, val); -+ } else { -+ this[key] = val; -+ } -+} -+ -+/** -+ * Returns true if `val` is an object or function. -+ * -+ * @param {any} val -+ * @return {Boolean} -+ */ -+ -+function isObject(val) { -+ return isExtendable(val) && !Array.isArray(val); -+} -+ -+/** -+ * Returns true if `key` is a valid key to use when extending objects. -+ * -+ * @param {String} `key` -+ * @return {Boolean} -+ */ -+ -+function isValidKey(key) { -+ return key !== '__proto__' && key !== 'constructor' && key !== 'prototype'; -+}; -+ -+/** -+ * Expose `mixinDeep` -+ */ -+ -+module.exports = mixinDeep; -+ -+}, -+"9hjAc+owUz/h1Siot9sQiSE4j2MtQ31lHCYIGwo9o6A=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var brackets = require('expand-brackets'); -+ -+/** -+ * Extglob compilers -+ */ -+ -+module.exports = function(extglob) { -+ function star() { -+ if (typeof extglob.options.star === 'function') { -+ return extglob.options.star.apply(this, arguments); -+ } -+ if (typeof extglob.options.star === 'string') { -+ return extglob.options.star; -+ } -+ return '.*?'; -+ } -+ -+ /** -+ * Use `expand-brackets` compilers -+ */ -+ -+ extglob.use(brackets.compilers); -+ extglob.compiler -+ -+ /** -+ * Escaped: "\\*" -+ */ -+ -+ .set('escape', function(node) { -+ return this.emit(node.val, node); -+ }) -+ -+ /** -+ * Dot: "." -+ */ -+ -+ .set('dot', function(node) { -+ return this.emit('\\' + node.val, node); -+ }) -+ -+ /** -+ * Question mark: "?" -+ */ -+ -+ .set('qmark', function(node) { -+ var val = '[^\\\\/.]'; -+ var prev = this.prev(); -+ -+ if (node.parsed.slice(-1) === '(') { -+ var ch = node.rest.charAt(0); -+ if (ch !== '!' && ch !== '=' && ch !== ':') { -+ return this.emit(val, node); -+ } -+ return this.emit(node.val, node); -+ } -+ -+ if (prev.type === 'text' && prev.val) { -+ return this.emit(val, node); -+ } -+ -+ if (node.val.length > 1) { -+ val += '{' + node.val.length + '}'; -+ } -+ return this.emit(val, node); -+ }) -+ -+ /** -+ * Plus: "+" -+ */ -+ -+ .set('plus', function(node) { -+ var prev = node.parsed.slice(-1); -+ if (prev === ']' || prev === ')') { -+ return this.emit(node.val, node); -+ } -+ var ch = this.output.slice(-1); -+ if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) { -+ return this.emit('\\+', node); -+ } -+ if (/\w/.test(ch) && !node.inside) { -+ return this.emit('+\\+?', node); -+ } -+ return this.emit('+', node); -+ }) -+ -+ /** -+ * Star: "*" -+ */ -+ -+ .set('star', function(node) { -+ var prev = this.prev(); -+ var prefix = prev.type !== 'text' && prev.type !== 'escape' -+ ? '(?!\\.)' -+ : ''; -+ -+ return this.emit(prefix + star.call(this, node), node); -+ }) -+ -+ /** -+ * Parens -+ */ -+ -+ .set('paren', function(node) { -+ return this.mapVisit(node.nodes); -+ }) -+ .set('paren.open', function(node) { -+ var capture = this.options.capture ? '(' : ''; -+ -+ switch (node.parent.prefix) { -+ case '!': -+ case '^': -+ return this.emit(capture + '(?:(?!(?:', node); -+ case '*': -+ case '+': -+ case '?': -+ case '@': -+ return this.emit(capture + '(?:', node); -+ default: { -+ var val = node.val; -+ if (this.options.bash === true) { -+ val = '\\' + val; -+ } else if (!this.options.capture && val === '(' && node.parent.rest[0] !== '?') { -+ val += '?:'; -+ } -+ -+ return this.emit(val, node); -+ } -+ } -+ }) -+ .set('paren.close', function(node) { -+ var capture = this.options.capture ? ')' : ''; -+ -+ switch (node.prefix) { -+ case '!': -+ case '^': -+ var prefix = /^(\)|$)/.test(node.rest) ? '$' : ''; -+ var str = star.call(this, node); -+ -+ // if the extglob has a slash explicitly defined, we know the user wants -+ // to match slashes, so we need to ensure the "star" regex allows for it -+ if (node.parent.hasSlash && !this.options.star && this.options.slash !== false) { -+ str = '.*?'; -+ } -+ -+ return this.emit(prefix + ('))' + str + ')') + capture, node); -+ case '*': -+ case '+': -+ case '?': -+ return this.emit(')' + node.prefix + capture, node); -+ case '@': -+ return this.emit(')' + capture, node); -+ default: { -+ var val = (this.options.bash === true ? '\\' : '') + ')'; -+ return this.emit(val, node); -+ } -+ } -+ }) -+ -+ /** -+ * Text -+ */ -+ -+ .set('text', function(node) { -+ var val = node.val.replace(/[\[\]]/g, '\\$&'); -+ return this.emit(val, node); -+ }); -+}; -+ -+}, -+"9n4VvtedWSJrSjZRsmpwDji1FTqXm4ZehCUMAUl92mI=": -+function (require, module, exports, __dirname, __filename) { -+class ExtendableError extends Error { -+ constructor (message) { -+ super(message) -+ -+ this.name = this.constructor.name -+ -+ if (typeof Error.captureStackTrace === 'function') { -+ Error.captureStackTrace(this, this.constructor) -+ } else { -+ this.stack = (new Error(message)).stack -+ } -+ } -+} -+ -+module.exports = ExtendableError -+ -+}, -+"9nOtlymYR2mZaEkDDe8csLjach1JKjub7t/jbbxr4Rc=": -+function (require, module, exports, __dirname, __filename) { -+var Buffer = require('buffer').Buffer; -+ -+var CRC_TABLE = [ -+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, -+ 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, -+ 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, -+ 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, -+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, -+ 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, -+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, -+ 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, -+ 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, -+ 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, -+ 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, -+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, -+ 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, -+ 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, -+ 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, -+ 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, -+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, -+ 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, -+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, -+ 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, -+ 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, -+ 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, -+ 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, -+ 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, -+ 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, -+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, -+ 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, -+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, -+ 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, -+ 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, -+ 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, -+ 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, -+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, -+ 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, -+ 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, -+ 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, -+ 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, -+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, -+ 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, -+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, -+ 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, -+ 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, -+ 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, -+ 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, -+ 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, -+ 0x2d02ef8d -+]; -+ -+if (typeof Int32Array !== 'undefined') { -+ CRC_TABLE = new Int32Array(CRC_TABLE); -+} -+ -+function ensureBuffer(input) { -+ if (Buffer.isBuffer(input)) { -+ return input; -+ } -+ -+ var hasNewBufferAPI = -+ typeof Buffer.alloc === "function" && -+ typeof Buffer.from === "function"; -+ -+ if (typeof input === "number") { -+ return hasNewBufferAPI ? Buffer.alloc(input) : new Buffer(input); -+ } -+ else if (typeof input === "string") { -+ return hasNewBufferAPI ? Buffer.from(input) : new Buffer(input); -+ } -+ else { -+ throw new Error("input must be buffer, number, or string, received " + -+ typeof input); -+ } -+} -+ -+function bufferizeInt(num) { -+ var tmp = ensureBuffer(4); -+ tmp.writeInt32BE(num, 0); -+ return tmp; -+} -+ -+function _crc32(buf, previous) { -+ buf = ensureBuffer(buf); -+ if (Buffer.isBuffer(previous)) { -+ previous = previous.readUInt32BE(0); -+ } -+ var crc = ~~previous ^ -1; -+ for (var n = 0; n < buf.length; n++) { -+ crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); -+ } -+ return (crc ^ -1); -+} -+ -+function crc32() { -+ return bufferizeInt(_crc32.apply(null, arguments)); -+} -+crc32.signed = function () { -+ return _crc32.apply(null, arguments); -+}; -+crc32.unsigned = function () { -+ return _crc32.apply(null, arguments) >>> 0; -+}; -+ -+module.exports = crc32; -+ -+}, -+"9pTOMaqm5VECp2WIZYwZPBsz54VN+G//yf5+gfasueE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var GenericWorker = require("./stream/GenericWorker"); -+ -+exports.STORE = { -+ magic: "\x00\x00", -+ compressWorker : function (compressionOptions) { -+ return new GenericWorker("STORE compression"); -+ }, -+ uncompressWorker : function () { -+ return new GenericWorker("STORE decompression"); -+ } -+}; -+exports.DEFLATE = require('./flate'); -+ -+}, -+"9xMxN1iFUZO5rprWUlfUWn0gor/GjPxqXi4eovLWH3o=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs') -+var path = require('path') -+var pump = require('pump') -+var RWLock = require('rwlock') -+var through = require('through2') -+var readonly = require('read-only-stream') -+var IndexedTarball = require('./single') -+ -+module.exports = MultiTarball -+ -+function MultiTarball (filepath, opts) { -+ opts = opts || {} -+ -+ this.filepath = filepath -+ this.tarballs = [] -+ this.maxFileSize = opts.maxFileSize || (Math.pow(2, 32) - 1) -+ -+ this.lock = new RWLock() -+ -+ // Find all of the tarballs belonging to the set. -+ this._setupTarballs() -+} -+ -+MultiTarball.prototype.append = function (filepath, size, cb) { -+ if (!cb && typeof size === 'function') { -+ cb = size -+ size = null -+ } -+ var self = this -+ -+ var t = through() -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ // Find the last tarball in the set. -+ self._getLastTarball(function (err, tarball, index) { -+ if (err) return done(err) -+ -+ // Check if the new file to be added will cause the tarball to exceed its -+ // maximum size. -+ tarball.archive.value(function (err, archive) { -+ if (err) return done(err) -+ var totalAddedSize = 512 + roundUp(size, 512) -+ -+ // Overflow into a brand new tarball -+ if (archive.fileSize + totalAddedSize > self.maxFileSize) { -+ var newFilepath = self.filepath + '.' + (index + 1) -+ tarball = new IndexedTarball(newFilepath) -+ self.tarballs.push(tarball) -+ } -+ -+ var ws = tarball.append(filepath, done) -+ t.pipe(ws) -+ }) -+ }) -+ }) -+ -+ return t -+} -+ -+MultiTarball.prototype.list = function (cb) { -+ var self = this -+ this.lock.readLock(function (release) { -+ var error -+ var pending = self.tarballs.length -+ var res = {} -+ -+ self.tarballs.forEach(list) -+ -+ function done (err) { -+ error = err || error -+ pending-- -+ if (!pending) { -+ release() -+ cb(error, error ? undefined : Object.keys(res)) -+ } -+ } -+ -+ function list (tarball) { -+ tarball.list(function (err, files) { -+ if (err) return done(err) -+ for (var idx in files) { -+ res[files[idx]] = true -+ } -+ done() -+ }) -+ } -+ }) -+} -+ -+MultiTarball.prototype.read = function (filepath) { -+ var self = this -+ var stream = through() -+ -+ this.lock.readLock(function (release) { -+ self._getFullIndex(function (err, index) { -+ if (err) stream.emit('error', err) -+ else if (!index[filepath]) stream.emit('error', new Error('not found')) -+ else { -+ pump(index[filepath].tarball.read(filepath), stream, function (err) { -+ if (err) stream.emit('error', err) -+ }) -+ } -+ release() -+ }) -+ }) -+ -+ return readonly(stream) -+} -+ -+MultiTarball.prototype.pop = function (cb) { -+ var self = this -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ self._getLastPopulatedTarball(function (err, tarball) { -+ if (err) return done(err) -+ else if (!tarball) return done() -+ tarball.pop(done) -+ }) -+ }) -+} -+ -+MultiTarball.prototype._setupTarballs = function (cb) { -+ var self = this -+ cb = cb || noop -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ var dir = path.dirname(self.filepath) -+ fs.readdir(dir, function (err, contents) { -+ if (err) return done(err) -+ // TODO: test that the sort function is working & these are in order -+ self.tarballs = contents -+ .filter(function (name) { return parseIndexFromFilename(name) !== null }) -+ .map(function (name) { return new IndexedTarball(name) }) -+ .sort(tarballCmp) -+ done() -+ }) -+ }) -+} -+ -+// Returns the final tarball in the set. A new one will be created if it doesn't exist. -+MultiTarball.prototype._getLastTarball = function (cb) { -+ cb = cb || noop -+ var tarball -+ -+ if (!this.tarballs.length) { -+ tarball = new IndexedTarball(this.filepath) -+ this.tarballs.push(tarball) -+ cb(null, tarball, 0) -+ } else { -+ tarball = this.tarballs[this.tarballs.length - 1] -+ var index = parseIndexFromFilename(tarball.filepath) -+ cb(null, tarball, index) -+ } -+} -+ -+// Returns the final *populated* tarball in the set. Returns 'null' if none are -+// populated. -+MultiTarball.prototype._getLastPopulatedTarball = function (cb) { -+ cb = cb || noop -+ var self = this -+ var tarball -+ -+ ;(function checkPrevious (idx) { -+ if (idx < 0) return cb(null) // all empty tarballs! -+ tarball = self.tarballs[idx] -+ tarball.archive.value(function (err, meta) { -+ if (err) return cb(err) -+ if (meta && meta.index && Object.keys(meta.index).length > 0) { -+ var index = parseIndexFromFilename(tarball.filepath) -+ cb(null, tarball, index) -+ } else { -+ checkPrevious(idx - 1) -+ } -+ }) -+ })(this.tarballs.length - 1) -+} -+ -+// Read the index of *all* tarballs to build a full index. -+MultiTarball.prototype._getFullIndex = function (cb) { -+ var self = this -+ var index = {} -+ -+ // Process tarballs *in order*. This is necessary to avoid earlier duplicate -+ // filenames overwriting newer ones. -+ ;(function next (idx) { -+ if (idx >= self.tarballs.length) return cb(null, index) -+ -+ var tarball = self.tarballs[idx] -+ tarball.archive.value(function (err, _meta) { -+ if (err) return cb(err) -+ var _index = _meta.index -+ for (var key in _index) { -+ index[key] = Object.assign({}, _index[key]) -+ index[key].tarball = tarball -+ } -+ next(idx + 1) -+ }) -+ })(0) -+} -+ -+function noop () {} -+ -+// Compares two IndexedTarball instances; sorting them so that the biggest indexed tarball filename comes last. -+function tarballCmp (a, b) { -+ var an = parseIndexFromFilename(a.filepath) -+ var bn = parseIndexFromFilename(b.filepath) -+ if (an === null || bn === null) return 0 -+ if (an < bn) return -1 -+ else if (an > bn) return 1 -+ else return 0 -+} -+ -+// "foobar.tar.2" => 2 -+// "foobar.tar.3" => 3 -+// "foobar.tar" => 0 -+// "foobar.tar.hi" => null -+function parseIndexFromFilename (filename) { -+ if (/\.tar\.[0-9]+$/.test(filename)) { -+ try { -+ return parseInt(filename.match(/\.tar\.([0-9]+)$/)[1]) -+ } catch (e) { -+ return null -+ } -+ } else { -+ return 0 -+ } -+} -+ -+function roundUp (n, nearest) { -+ var more = 512 - (n % nearest) -+ return n + more -+} -+ -+}, -+"A/56fOCbmGMCOVCBPB3y6Zv1J7ByECbXSJrSPkhM8ac=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -+ if (k2 === undefined) k2 = k; -+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -+}) : (function(o, m, k, k2) { -+ if (k2 === undefined) k2 = k; -+ o[k2] = m[k]; -+})); -+var __exportStar = (this && this.__exportStar) || function(m, exports) { -+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -+}; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const events_1 = require("events"); -+const is_1 = require("@sindresorhus/is"); -+const PCancelable = require("p-cancelable"); -+const types_1 = require("./types"); -+const parse_body_1 = require("./parse-body"); -+const core_1 = require("../core"); -+const proxy_events_1 = require("../core/utils/proxy-events"); -+const get_buffer_1 = require("../core/utils/get-buffer"); -+const is_response_ok_1 = require("../core/utils/is-response-ok"); -+const proxiedRequestEvents = [ -+ 'request', -+ 'response', -+ 'redirect', -+ 'uploadProgress', -+ 'downloadProgress' -+]; -+function asPromise(normalizedOptions) { -+ let globalRequest; -+ let globalResponse; -+ const emitter = new events_1.EventEmitter(); -+ const promise = new PCancelable((resolve, reject, onCancel) => { -+ const makeRequest = (retryCount) => { -+ const request = new core_1.default(undefined, normalizedOptions); -+ request.retryCount = retryCount; -+ request._noPipe = true; -+ onCancel(() => request.destroy()); -+ onCancel.shouldReject = false; -+ onCancel(() => reject(new types_1.CancelError(request))); -+ globalRequest = request; -+ request.once('response', async (response) => { -+ var _a; -+ response.retryCount = retryCount; -+ if (response.request.aborted) { -+ // Canceled while downloading - will throw a `CancelError` or `TimeoutError` error -+ return; -+ } -+ // Download body -+ let rawBody; -+ try { -+ rawBody = await get_buffer_1.default(request); -+ response.rawBody = rawBody; -+ } -+ catch (_b) { -+ // The same error is caught below. -+ // See request.once('error') -+ return; -+ } -+ if (request._isAboutToError) { -+ return; -+ } -+ // Parse body -+ const contentEncoding = ((_a = response.headers['content-encoding']) !== null && _a !== void 0 ? _a : '').toLowerCase(); -+ const isCompressed = ['gzip', 'deflate', 'br'].includes(contentEncoding); -+ const { options } = request; -+ if (isCompressed && !options.decompress) { -+ response.body = rawBody; -+ } -+ else { -+ try { -+ response.body = parse_body_1.default(response, options.responseType, options.parseJson, options.encoding); -+ } -+ catch (error) { -+ // Fallback to `utf8` -+ response.body = rawBody.toString(); -+ if (is_response_ok_1.isResponseOk(response)) { -+ request._beforeError(error); -+ return; -+ } -+ } -+ } -+ try { -+ for (const [index, hook] of options.hooks.afterResponse.entries()) { -+ // @ts-expect-error TS doesn't notice that CancelableRequest is a Promise -+ // eslint-disable-next-line no-await-in-loop -+ response = await hook(response, async (updatedOptions) => { -+ const typedOptions = core_1.default.normalizeArguments(undefined, { -+ ...updatedOptions, -+ retry: { -+ calculateDelay: () => 0 -+ }, -+ throwHttpErrors: false, -+ resolveBodyOnly: false -+ }, options); -+ // Remove any further hooks for that request, because we'll call them anyway. -+ // The loop continues. We don't want duplicates (asPromise recursion). -+ typedOptions.hooks.afterResponse = typedOptions.hooks.afterResponse.slice(0, index); -+ for (const hook of typedOptions.hooks.beforeRetry) { -+ // eslint-disable-next-line no-await-in-loop -+ await hook(typedOptions); -+ } -+ const promise = asPromise(typedOptions); -+ onCancel(() => { -+ promise.catch(() => { }); -+ promise.cancel(); -+ }); -+ return promise; -+ }); -+ } -+ } -+ catch (error) { -+ request._beforeError(new types_1.RequestError(error.message, error, request)); -+ return; -+ } -+ if (!is_response_ok_1.isResponseOk(response)) { -+ request._beforeError(new types_1.HTTPError(response)); -+ return; -+ } -+ globalResponse = response; -+ resolve(request.options.resolveBodyOnly ? response.body : response); -+ }); -+ const onError = (error) => { -+ if (promise.isCanceled) { -+ return; -+ } -+ const { options } = request; -+ if (error instanceof types_1.HTTPError && !options.throwHttpErrors) { -+ const { response } = error; -+ resolve(request.options.resolveBodyOnly ? response.body : response); -+ return; -+ } -+ reject(error); -+ }; -+ request.once('error', onError); -+ const previousBody = request.options.body; -+ request.once('retry', (newRetryCount, error) => { -+ var _a, _b; -+ if (previousBody === ((_a = error.request) === null || _a === void 0 ? void 0 : _a.options.body) && is_1.default.nodeStream((_b = error.request) === null || _b === void 0 ? void 0 : _b.options.body)) { -+ onError(error); -+ return; -+ } -+ makeRequest(newRetryCount); -+ }); -+ proxy_events_1.default(request, emitter, proxiedRequestEvents); -+ }; -+ makeRequest(0); -+ }); -+ promise.on = (event, fn) => { -+ emitter.on(event, fn); -+ return promise; -+ }; -+ const shortcut = (responseType) => { -+ const newPromise = (async () => { -+ // Wait until downloading has ended -+ await promise; -+ const { options } = globalResponse.request; -+ return parse_body_1.default(globalResponse, responseType, options.parseJson, options.encoding); -+ })(); -+ Object.defineProperties(newPromise, Object.getOwnPropertyDescriptors(promise)); -+ return newPromise; -+ }; -+ promise.json = () => { -+ const { headers } = globalRequest.options; -+ if (!globalRequest.writableFinished && headers.accept === undefined) { -+ headers.accept = 'application/json'; -+ } -+ return shortcut('json'); -+ }; -+ promise.buffer = () => shortcut('buffer'); -+ promise.text = () => shortcut('text'); -+ return promise; -+} -+exports.default = asPromise; -+__exportStar(require("./types"), exports); -+ -+}, -+"A0GcZrmsHGM60Y4BxMUQ63Kgc/d5iuzJt+4OdsFrKps=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const applicationHooks = [ -+ 'onRoute', -+ 'onRegister', -+ 'onReady', -+ 'onClose' -+] -+const lifecycleHooks = [ -+ 'onTimeout', -+ 'onRequest', -+ 'preParsing', -+ 'preValidation', -+ 'preSerialization', -+ 'preHandler', -+ 'onSend', -+ 'onResponse', -+ 'onError' -+] -+const supportedHooks = lifecycleHooks.concat(applicationHooks) -+const { -+ FST_ERR_HOOK_INVALID_TYPE, -+ FST_ERR_HOOK_INVALID_HANDLER, -+ FST_ERR_SEND_UNDEFINED_ERR -+} = require('./errors') -+ -+const { -+ kReplyIsError, -+ kChildren, -+ kHooks -+} = require('./symbols') -+ -+function Hooks () { -+ this.onRequest = [] -+ this.preParsing = [] -+ this.preValidation = [] -+ this.preSerialization = [] -+ this.preHandler = [] -+ this.onResponse = [] -+ this.onSend = [] -+ this.onError = [] -+ this.onRoute = [] -+ this.onRegister = [] -+ this.onReady = [] -+ this.onTimeout = [] -+} -+ -+Hooks.prototype.validate = function (hook, fn) { -+ if (typeof hook !== 'string') throw new FST_ERR_HOOK_INVALID_TYPE() -+ if (typeof fn !== 'function') throw new FST_ERR_HOOK_INVALID_HANDLER() -+ if (supportedHooks.indexOf(hook) === -1) { -+ throw new Error(`${hook} hook not supported!`) -+ } -+} -+ -+Hooks.prototype.add = function (hook, fn) { -+ this.validate(hook, fn) -+ this[hook].push(fn) -+} -+ -+function buildHooks (h) { -+ const hooks = new Hooks() -+ hooks.onRequest = h.onRequest.slice() -+ hooks.preParsing = h.preParsing.slice() -+ hooks.preValidation = h.preValidation.slice() -+ hooks.preSerialization = h.preSerialization.slice() -+ hooks.preHandler = h.preHandler.slice() -+ hooks.onSend = h.onSend.slice() -+ hooks.onResponse = h.onResponse.slice() -+ hooks.onError = h.onError.slice() -+ hooks.onRoute = h.onRoute.slice() -+ hooks.onRegister = h.onRegister.slice() -+ hooks.onTimeout = h.onTimeout.slice() -+ hooks.onReady = [] -+ return hooks -+} -+ -+function hookRunnerApplication (hookName, boot, server, cb) { -+ const hooks = server[kHooks][hookName] -+ let i = 0 -+ let c = 0 -+ -+ next() -+ -+ function exit (err) { -+ if (err) { -+ cb(err) -+ return -+ } -+ cb() -+ } -+ -+ function next (err) { -+ if (err) { -+ exit(err) -+ return -+ } -+ -+ if (i === hooks.length && c === server[kChildren].length) { -+ if (i === 0 && c === 0) { // speed up start -+ exit() -+ } else { -+ // This is the last function executed for every fastify instance -+ boot(function manageTimeout (err, done) { -+ // this callback is needed by fastify to provide an hook interface without the error -+ // as first parameter and managing it on behalf the user -+ exit(err) -+ -+ // this callback is needed by avvio to continue the loading of the next `register` plugins -+ done(err) -+ }) -+ } -+ return -+ } -+ -+ if (i === hooks.length && c < server[kChildren].length) { -+ const child = server[kChildren][c++] -+ hookRunnerApplication(hookName, boot, child, next) -+ return -+ } -+ -+ boot(wrap(hooks[i++], server)) -+ next() -+ } -+ -+ function wrap (fn, server) { -+ return function (err, done) { -+ if (err) { -+ done(err) -+ return -+ } -+ -+ if (fn.length === 1) { -+ try { -+ fn.call(server, done) -+ } catch (error) { -+ done(error) -+ } -+ return -+ } -+ -+ const ret = fn.call(server) -+ if (ret && typeof ret.then === 'function') { -+ ret.then(done, done) -+ return -+ } -+ -+ done(err) // auto done -+ } -+ } -+} -+ -+function hookRunner (functions, runner, request, reply, cb) { -+ let i = 0 -+ -+ function next (err) { -+ if (err || i === functions.length) { -+ cb(err, request, reply) -+ return -+ } -+ -+ let result -+ try { -+ result = runner(functions[i++], request, reply, next) -+ } catch (error) { -+ next(error) -+ return -+ } -+ if (result && typeof result.then === 'function') { -+ result.then(handleResolve, handleReject) -+ } -+ } -+ -+ function handleResolve () { -+ next() -+ } -+ -+ function handleReject (err) { -+ if (!err) { -+ err = new FST_ERR_SEND_UNDEFINED_ERR() -+ } else if (!(err instanceof Error)) { -+ reply[kReplyIsError] = true -+ } -+ cb(err, request, reply) -+ } -+ -+ next() -+} -+ -+function onSendHookRunner (functions, request, reply, payload, cb) { -+ let i = 0 -+ -+ function next (err, newPayload) { -+ if (err) { -+ cb(err, request, reply, payload) -+ return -+ } -+ -+ if (newPayload !== undefined) { -+ payload = newPayload -+ } -+ -+ if (i === functions.length) { -+ try { -+ cb(null, request, reply, payload) -+ } catch (err) { -+ handleReject(err) -+ } -+ return -+ } -+ -+ let result -+ try { -+ result = functions[i++](request, reply, payload, next) -+ } catch (error) { -+ next(error) -+ return -+ } -+ if (result && typeof result.then === 'function') { -+ result.then(handleResolve, handleReject) -+ } -+ } -+ -+ function handleResolve (newPayload) { -+ next(null, newPayload) -+ } -+ -+ function handleReject (err) { -+ cb(err, request, reply, payload) -+ } -+ -+ next() -+} -+ -+function hookIterator (fn, request, reply, next) { -+ if (reply.sent === true) return undefined -+ return fn(request, reply, next) -+} -+ -+module.exports = { -+ Hooks, -+ buildHooks, -+ hookRunner, -+ onSendHookRunner, -+ hookIterator, -+ hookRunnerApplication, -+ lifecycleHooks -+} -+ -+}, -+"A7hX6nalepxuZf8m+zgrsBTGVxKyGhzlgKfVS24FZUs=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// EXPORTS // -+ -+module.exports = Number.POSITIVE_INFINITY; -+ -+}, -+"ABjESk9Fd+1+lLZtdo6rOoIryW/akTHPt+TeqZ6xubA=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('fs').constants || require('constants') -+ -+}, -+"AFAXLTUHDGLY0hd2+mPHE0zwwTUqWIWbvWwlmZacYx0=": -+function (require, module, exports, __dirname, __filename) { -+var varint = require('varint') -+exports.encode = function encode (v, b, o) { -+ v = v >= 0 ? v*2 : v*-2 - 1 -+ var r = varint.encode(v, b, o) -+ encode.bytes = varint.encode.bytes -+ return r -+} -+exports.decode = function decode (b, o) { -+ var v = varint.decode(b, o) -+ decode.bytes = varint.decode.bytes -+ return v & 1 ? (v+1) / -2 : v / 2 -+} -+ -+exports.encodingLength = function (v) { -+ return varint.encodingLength(v >= 0 ? v*2 : v*-2 - 1) -+} -+ -+}, -+"AIlKPdcBbjdRVgVpzHkcFcLgYHw1qRvTOY2rZ1Am/PM=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+function reusify (Constructor) { -+ var head = new Constructor() -+ var tail = head -+ -+ function get () { -+ var current = head -+ -+ if (current.next) { -+ head = current.next -+ } else { -+ head = new Constructor() -+ tail = head -+ } -+ -+ current.next = null -+ -+ return current -+ } -+ -+ function release (obj) { -+ tail.next = obj -+ tail = obj -+ } -+ -+ return { -+ get: get, -+ release: release -+ } -+} -+ -+module.exports = reusify -+ -+}, -+"ANo+DrPod25nfW0D2uQk6tKaO8IAiq2+WH+ZFBg3pxw=": -+function (require, module, exports, __dirname, __filename) { -+var fieldSize = require('./fieldsize'); -+ -+var types = { -+ string: 'C', -+ number: 'N', -+ boolean: 'L', -+ // type to use if all values of a field are null -+ null: 'C' -+}; -+ -+module.exports.multi = multi; -+module.exports.bytesPer = bytesPer; -+module.exports.obj = obj; -+ -+function multi(features) { -+ var fields = {}; -+ features.forEach(collect); -+ function collect(f) { inherit(fields, f); } -+ return obj(fields); -+} -+ -+/** -+ * @param {Object} a -+ * @param {Object} b -+ * @returns {Object} -+ */ -+function inherit(a, b) { -+ for (var i in b) { -+ var isDef = typeof b[i] !== 'undefined' && b[i] !== null; -+ if (typeof a[i] === 'undefined' || isDef) { -+ a[i] = b[i]; -+ } -+ } -+ return a; -+} -+ -+function obj(_) { -+ var fields = {}, o = []; -+ for (var p in _) fields[p] = _[p] === null ? 'null' : typeof _[p]; -+ for (var n in fields) { -+ var t = types[fields[n]]; -+ if(t){ -+ o.push({ -+ name: n, -+ type: t, -+ size: fieldSize[t] -+ }); -+ } -+ } -+ return o; -+} -+ -+/** -+ * @param {Array} fields -+ * @returns {Array} -+ */ -+function bytesPer(fields) { -+ // deleted flag -+ return fields.reduce(function(memo, f) { return memo + f.size; }, 1); -+} -+ -+}, -+"AO1UdbCLSiOYNrxdZnv680P08kEs12FtKq83vd2FgsI=": -+function (require, module, exports, __dirname, __filename) { -+/* -*- Mode: js; js-indent-level: 2; -*- */ -+/* -+ * Copyright 2011 Mozilla Foundation and contributors -+ * Licensed under the New BSD license. See LICENSE or: -+ * http://opensource.org/licenses/BSD-3-Clause -+ */ -+ -+// It turns out that some (most?) JavaScript engines don't self-host -+// `Array.prototype.sort`. This makes sense because C++ will likely remain -+// faster than JS when doing raw CPU-intensive sorting. However, when using a -+// custom comparator function, calling back and forth between the VM's C++ and -+// JIT'd JS is rather slow *and* loses JIT type information, resulting in -+// worse generated code for the comparator function than would be optimal. In -+// fact, when sorting with a comparator, these costs outweigh the benefits of -+// sorting in C++. By using our own JS-implemented Quick Sort (below), we get -+// a ~3500ms mean speed-up in `bench/bench.html`. -+ -+/** -+ * Swap the elements indexed by `x` and `y` in the array `ary`. -+ * -+ * @param {Array} ary -+ * The array. -+ * @param {Number} x -+ * The index of the first item. -+ * @param {Number} y -+ * The index of the second item. -+ */ -+function swap(ary, x, y) { -+ var temp = ary[x]; -+ ary[x] = ary[y]; -+ ary[y] = temp; -+} -+ -+/** -+ * Returns a random integer within the range `low .. high` inclusive. -+ * -+ * @param {Number} low -+ * The lower bound on the range. -+ * @param {Number} high -+ * The upper bound on the range. -+ */ -+function randomIntInRange(low, high) { -+ return Math.round(low + (Math.random() * (high - low))); -+} -+ -+/** -+ * The Quick Sort algorithm. -+ * -+ * @param {Array} ary -+ * An array to sort. -+ * @param {function} comparator -+ * Function to use to compare two items. -+ * @param {Number} p -+ * Start index of the array -+ * @param {Number} r -+ * End index of the array -+ */ -+function doQuickSort(ary, comparator, p, r) { -+ // If our lower bound is less than our upper bound, we (1) partition the -+ // array into two pieces and (2) recurse on each half. If it is not, this is -+ // the empty array and our base case. -+ -+ if (p < r) { -+ // (1) Partitioning. -+ // -+ // The partitioning chooses a pivot between `p` and `r` and moves all -+ // elements that are less than or equal to the pivot to the before it, and -+ // all the elements that are greater than it after it. The effect is that -+ // once partition is done, the pivot is in the exact place it will be when -+ // the array is put in sorted order, and it will not need to be moved -+ // again. This runs in O(n) time. -+ -+ // Always choose a random pivot so that an input array which is reverse -+ // sorted does not cause O(n^2) running time. -+ var pivotIndex = randomIntInRange(p, r); -+ var i = p - 1; -+ -+ swap(ary, pivotIndex, r); -+ var pivot = ary[r]; -+ -+ // Immediately after `j` is incremented in this loop, the following hold -+ // true: -+ // -+ // * Every element in `ary[p .. i]` is less than or equal to the pivot. -+ // -+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. -+ for (var j = p; j < r; j++) { -+ if (comparator(ary[j], pivot) <= 0) { -+ i += 1; -+ swap(ary, i, j); -+ } -+ } -+ -+ swap(ary, i + 1, j); -+ var q = i + 1; -+ -+ // (2) Recurse on each half. -+ -+ doQuickSort(ary, comparator, p, q - 1); -+ doQuickSort(ary, comparator, q + 1, r); -+ } -+} -+ -+/** -+ * Sort the given array in-place with the given comparator function. -+ * -+ * @param {Array} ary -+ * An array to sort. -+ * @param {function} comparator -+ * Function to use to compare two items. -+ */ -+exports.quickSort = function (ary, comparator) { -+ doQuickSort(ary, comparator, 0, ary.length - 1); -+}; -+ -+}, -+"AT1fb8qqgTAt2UuMGeWxqNbh3UQJ3OHTLzs6jLKdS5A=": -+function (require, module, exports, __dirname, __filename) { -+const randombytes = require('randombytes') -+const events = require('events') -+const pumpify = require('pumpify') -+const through = require('through2') -+const parallel = require('run-parallel') -+const pump = require('pump') -+const fs = require('fs') -+const shapefile = require('shp-write') -+const concat = require('concat-stream') -+const duplexify = require('duplexify') -+const throughFilter = require('through2-filter') -+const compileFilter = require('mapeo-entity-filter') -+ -+const exportGeoJson = require('./lib/export-geojson') -+const Importer = require('./lib/importer') -+const Sync = require('./sync') -+const errors = require('./errors') -+ -+const CURRENT_SCHEMA = 3 -+ -+class Mapeo extends events.EventEmitter { -+ constructor (osm, media, opts) { -+ super() -+ if (!opts) opts = {} -+ this.sync = new Sync(osm, media, opts) -+ this.sync.on('error', (err) => { -+ this.emit('error', err) -+ }) -+ this.osm = osm -+ this.media = media -+ this.importer = Importer(osm) -+ } -+ -+ observationCreate (obs, cb) { -+ try { -+ validateObservation(obs) -+ } catch (err) { -+ return cb(errors.InvalidFields(err.message)) -+ } -+ -+ const newObs = whitelistProps(obs) -+ newObs.type = 'observation' -+ newObs.schemaVersion = obs.schemaVersion || CURRENT_SCHEMA -+ newObs.timestamp = (new Date().toISOString()) -+ newObs.created_at = (new Date()).toISOString() -+ if (obs.id) this.osm.put(obs.id, newObs, done) -+ else this.osm.create(newObs, done) -+ -+ function done (err, node) { -+ if (err) return cb(err) -+ cb(null, node) -+ } -+ } -+ -+ observationGet (id, cb) { -+ this.osm.get(id, function (err, elms) { -+ if (err) return cb(err) -+ else return cb(null, elms) -+ }) -+ } -+ -+ observationConvert (id, cb) { -+ var self = this -+ // 1. get the observation -+ this.osm.get(id, function (err, obses) { -+ if (err) return cb(err) -+ if (!obses.length) { -+ return cb(new Error('failed to lookup observation: not found')) -+ } -+ -+ // 2. see if tags.element_id already present (short circuit) -+ var obs = obses[0] -+ if (obs.tags && obs.tags.element_id) { -+ cb(null, obs.tags.element_id) -+ return -+ } -+ -+ var batch = [] -+ -+ // 3. create node -+ batch.push({ -+ type: 'put', -+ id: randombytes(8).toString('hex'), -+ value: Object.assign({}, obs, { -+ type: 'node' -+ }) -+ }) -+ -+ // 4. modify observation tags -+ obs.tags = obs.tags || {} -+ obs.tags.element_id = batch[0].id -+ delete obs.links // otherwise [] will be used, signalling that this is a fork -+ batch.push({ -+ type: 'put', -+ id: id, -+ value: obs -+ }) -+ -+ // 5. batch modification -+ self.osm.batch(batch, function (err) { -+ if (err) return cb(err) -+ return cb(null, obs.tags.element_id) -+ }) -+ }) -+ } -+ -+ observationUpdate (newObs, cb) { -+ var self = this -+ if (typeof newObs.version !== 'string') { -+ return cb(new Error('the given observation must have a "version" set')) -+ } -+ var id = newObs.id -+ -+ try { -+ validateObservation(newObs) -+ } catch (err) { -+ return cb(errors.InvalidFields(err.message)) -+ } -+ -+ this.osm.getByVersion(newObs.version, function (err, obs) { -+ if (err && !err.notFound) return cb(err) -+ if (err && err.notFound) return cb(errors.NoVersion()) -+ if (obs.id !== id) return cb(errors.TypeMismatch(obs.id, id)) -+ -+ var opts = { -+ links: [newObs.version] -+ } -+ -+ var finalObs = whitelistProps(newObs) -+ finalObs.type = 'observation' -+ finalObs.timestamp = new Date().toISOString() -+ finalObs = Object.assign(obs, finalObs) -+ -+ self.osm.put(id, finalObs, opts, function (err, node) { -+ if (err) return cb(err) -+ return cb(null, node) -+ }) -+ }) -+ } -+ -+ observationDelete (id, cb) { -+ this.observationGet(id, (err, obses) => { -+ if (err) return cb(err) -+ if (!obses.length) return cb(new Error('Observation with id does not exist')) -+ this.osm.del(id, {}, (err) => { -+ if (err) return cb(err) -+ var tasks = [] -+ -+ var attachmentIds = {} -+ obses.forEach(obs => { -+ if (!obs.attachments) return -+ obs.attachments.map((a) => { -+ // only delete files once -+ if (attachmentIds[a.id]) return -+ attachmentIds[a.id] = true -+ // okay delete now -+ tasks.push((done) => { -+ var filename = 'original/' + a.id -+ this.media.remove(filename, done) -+ }) -+ tasks.push((done) => { -+ var filename = 'preview/' + a.id -+ this.media.remove(filename, done) -+ }) -+ tasks.push((done) => { -+ var filename = 'thumbnail/' + a.id -+ this.media.remove(filename, done) -+ }) -+ }) -+ }) -+ parallel(tasks, cb) -+ }) -+ }) -+ } -+ -+ observationList (opts, cb) { -+ if (typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ var results = [] -+ this.observationStream(opts) -+ .on('data', function (obs) { -+ results.push(obs) -+ }) -+ .once('end', function () { -+ cb(null, results) -+ }) -+ .once('error', function (err) { -+ cb(err) -+ }) -+ } -+ -+ observationStream (opts) { -+ opts = opts || {} -+ -+ var latest = {} -+ var removeForks = through.obj(function (row, enc, next) { -+ if (!latest[row.id]) latest[row.id] = row -+ else if (row.timestamp > latest[row.id].timestamp) latest[row.id] = row -+ // If the timestamps are equal (can happen!) then return by latest version -+ // to ensure that the results are deterministic. Equal timestamps is only -+ // likely to occur on the same hypercore anyway, so this will return the -+ // latest sequence number if timestamps are equal. -+ else if (row.timestamp === latest[row.id].timestamp && row.version > latest[row.id].version) latest[row.id] = row -+ next() -+ }, function (cb) { -+ Object.keys(latest).forEach(k => this.push(latest[k])) -+ cb() -+ }) -+ -+ var removeDeleted = through.obj(function (row, enc, next) { -+ if (row.deleted) next() -+ else next(null, row) -+ }) -+ -+ if (opts.forks) { -+ return pumpify.obj(this.osm.byType('observation', opts), removeDeleted) -+ } else { -+ return pumpify.obj(this.osm.byType('observation', opts), removeDeleted, removeForks) -+ } -+ } -+ -+ exportData (filename, opts, cb) { -+ if (!cb && typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ return pump(this.createDataStream(opts), fs.createWriteStream(filename), cb) -+ } -+ -+ createDataStream (opts = {}) { -+ if (!opts.format) opts.format = 'geojson' -+ var bbox = opts.bbox || [ -Infinity, -Infinity, Infinity, Infinity ] -+ var filterFn = opts.filter ? compileFilter(opts.filter) : identity -+ var osmReadStream = this.osm.query(bbox, opts) -+ var filterStream = throughFilter.obj(filterFn) -+ var geoJSONStream = exportGeoJson(this.osm, opts) -+ var outputStream = duplexify() -+ outputStream.setWritable(null) -+ switch (opts.format) { -+ case 'geojson': -+ outputStream.setReadable(geoJSONStream) -+ break -+ case 'shapefile': -+ geoJSONStream.pipe(concat((geojson) => { -+ outputStream.setReadable(shapefile.zipStream(JSON.parse(geojson))) -+ })) -+ break -+ default: -+ process.nextTick(() => { -+ outputStream.emit( -+ 'error', -+ new Error('Unsupported format, must be either `geojson` or `shapefile`.') -+ ) -+ }) -+ } -+ pump(osmReadStream, filterStream, geoJSONStream, (err) => { -+ if (err) outputStream.emit('error', err) -+ }) -+ return outputStream -+ } -+ -+ getDeviceId (cb) { -+ cb = cb || noop -+ this.osm.ready(() => { -+ cb(null, this.osm.writer.key.toString('hex')) -+ }) -+ } -+ -+ getFeedStatus (cb) { -+ this.osm.ready(() => { -+ var res = [] -+ -+ var feeds = this.osm.core._logs.feeds() -+ feeds.forEach((feed) => { -+ res.push({ -+ id: feed.key.toString('hex'), -+ sofar: feed.downloaded(), -+ total: feed.length -+ }) -+ }) -+ cb(null, res) -+ }) -+ } -+ -+ close (cb) { -+ this.sync.close(() => { -+ this.osm.core.pause(() => { -+ // This calls multifeed.close() which closes the hypercore feeds -+ this.osm.core._logs.close(() => { -+ this.emit('close') -+ if (cb) cb() -+ }) -+ }) -+ }) -+ } -+} -+ -+function validateObservation (obs) { -+ if (!obs) throw new Error('Observation is undefined') -+ if (obs.type !== 'observation') throw new Error('Observation must be of type `observation`') -+ if (obs.attachments) { -+ if (!Array.isArray(obs.attachments)) throw new Error('Observation attachments must be an array') -+ obs.attachments.forEach(function (att, i) { -+ if (!att) throw new Error('Attachment at index `' + i + '` is undefined') -+ if (typeof att.id !== 'string') throw new Error('Attachment must have a string id property (at index `' + i + '`)') -+ }) -+ } -+ if (typeof obs.lat !== 'undefined' || typeof obs.lon !== 'undefined') { -+ if (typeof obs.lat === 'undefined' || typeof obs.lon === 'undefined') { -+ throw new Error('one of lat and lon are undefined') -+ } -+ if (typeof obs.lat !== 'number' || typeof obs.lon !== 'number') { -+ throw new Error('lon and lat must be a number') -+ } -+ } -+} -+ -+// Top-level props that can be modified by the user/client -+var USER_UPDATABLE_PROPS = [ -+ 'lon', -+ 'lat', -+ 'attachments', -+ 'tags', -+ 'ref', -+ 'metadata', -+ 'fields', -+ 'schemaVersion' -+] -+ -+// Filter whitelisted props the user can update -+function whitelistProps (obs) { -+ var newObs = {} -+ USER_UPDATABLE_PROPS.forEach(function (prop) { -+ if (obs[prop]) newObs[prop] = obs[prop] -+ }) -+ return newObs -+} -+ -+function noop () {} -+ -+function identity (v) { -+ return v -+} -+ -+Mapeo.errors = errors -+Mapeo.CURRENT_SCHEMA = CURRENT_SCHEMA -+module.exports = Mapeo -+ -+}, -+"AUSralK5MwxWfeEaXDpK6jXNrEekwQZIKqJK6AVM3G8=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * This is the web browser implementation of `debug()`. -+ * -+ * Expose `debug()` as the module. -+ */ -+ -+exports = module.exports = require('./debug'); -+exports.log = log; -+exports.formatArgs = formatArgs; -+exports.save = save; -+exports.load = load; -+exports.useColors = useColors; -+exports.storage = 'undefined' != typeof chrome -+ && 'undefined' != typeof chrome.storage -+ ? chrome.storage.local -+ : localstorage(); -+ -+/** -+ * Colors. -+ */ -+ -+exports.colors = [ -+ 'lightseagreen', -+ 'forestgreen', -+ 'goldenrod', -+ 'dodgerblue', -+ 'darkorchid', -+ 'crimson' -+]; -+ -+/** -+ * Currently only WebKit-based Web Inspectors, Firefox >= v31, -+ * and the Firebug extension (any Firefox version) are known -+ * to support "%c" CSS customizations. -+ * -+ * TODO: add a `localStorage` variable to explicitly enable/disable colors -+ */ -+ -+function useColors() { -+ // NB: In an Electron preload script, document will be defined but not fully -+ // initialized. Since we know we're in Chrome, we'll just detect this case -+ // explicitly -+ if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { -+ return true; -+ } -+ -+ // is webkit? http://stackoverflow.com/a/16459606/376773 -+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 -+ return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || -+ // is firebug? http://stackoverflow.com/a/398120/376773 -+ (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || -+ // is firefox >= v31? -+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages -+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || -+ // double check webkit in userAgent just in case we are in a worker -+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -+} -+ -+/** -+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. -+ */ -+ -+exports.formatters.j = function(v) { -+ try { -+ return JSON.stringify(v); -+ } catch (err) { -+ return '[UnexpectedJSONParseError]: ' + err.message; -+ } -+}; -+ -+ -+/** -+ * Colorize log arguments if enabled. -+ * -+ * @api public -+ */ -+ -+function formatArgs(args) { -+ var useColors = this.useColors; -+ -+ args[0] = (useColors ? '%c' : '') -+ + this.namespace -+ + (useColors ? ' %c' : ' ') -+ + args[0] -+ + (useColors ? '%c ' : ' ') -+ + '+' + exports.humanize(this.diff); -+ -+ if (!useColors) return; -+ -+ var c = 'color: ' + this.color; -+ args.splice(1, 0, c, 'color: inherit') -+ -+ // the final "%c" is somewhat tricky, because there could be other -+ // arguments passed either before or after the %c, so we need to -+ // figure out the correct index to insert the CSS into -+ var index = 0; -+ var lastC = 0; -+ args[0].replace(/%[a-zA-Z%]/g, function(match) { -+ if ('%%' === match) return; -+ index++; -+ if ('%c' === match) { -+ // we only are interested in the *last* %c -+ // (the user may have provided their own) -+ lastC = index; -+ } -+ }); -+ -+ args.splice(lastC, 0, c); -+} -+ -+/** -+ * Invokes `console.log()` when available. -+ * No-op when `console.log` is not a "function". -+ * -+ * @api public -+ */ -+ -+function log() { -+ // this hackery is required for IE8/9, where -+ // the `console.log` function doesn't have 'apply' -+ return 'object' === typeof console -+ && console.log -+ && Function.prototype.apply.call(console.log, console, arguments); -+} -+ -+/** -+ * Save `namespaces`. -+ * -+ * @param {String} namespaces -+ * @api private -+ */ -+ -+function save(namespaces) { -+ try { -+ if (null == namespaces) { -+ exports.storage.removeItem('debug'); -+ } else { -+ exports.storage.debug = namespaces; -+ } -+ } catch(e) {} -+} -+ -+/** -+ * Load `namespaces`. -+ * -+ * @return {String} returns the previously persisted debug modes -+ * @api private -+ */ -+ -+function load() { -+ var r; -+ try { -+ r = exports.storage.debug; -+ } catch(e) {} -+ -+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG -+ if (!r && typeof process !== 'undefined' && 'env' in process) { -+ r = process.env.DEBUG; -+ } -+ -+ return r; -+} -+ -+/** -+ * Enable namespaces listed in `localStorage.debug` initially. -+ */ -+ -+exports.enable(load()); -+ -+/** -+ * Localstorage attempts to return the localstorage. -+ * -+ * This is necessary because safari throws -+ * when a user disables cookies/localstorage -+ * and you attempt to access it. -+ * -+ * @return {LocalStorage} -+ * @api private -+ */ -+ -+function localstorage() { -+ try { -+ return window.localStorage; -+ } catch (e) {} -+} -+ -+}, -+"AUfqIGHaeqgHZVO+TXnsIBexaNXL2zdXjxT+RHd3rUA=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('inherits') -+var events = require('events') -+var randombytes = require('randombytes') -+ -+function hex2dec (hexStr) { -+ return parseInt(hexStr, 16).toString(10) -+} -+ -+function genId () { -+ return hex2dec(randombytes(8).toString('hex')) -+} -+ -+module.exports = Importer -+ -+function Importer (osm) { -+ if (!(this instanceof Importer)) return new Importer(osm) -+ events.EventEmitter.call(this) -+ this.osm = osm -+ this.importing = false -+} -+ -+inherits(Importer, events.EventEmitter) -+ -+Importer.prototype.importFeatureCollection = function (geojson, cb) { -+ var self = this -+ var docs = [] -+ if (self.importing) return cb(new Error('Import currently in progress.')) -+ this.importing = true -+ if (!geojson || !geojson.features) return cb(new Error('Import expects geojson FeatureCollection object.')) -+ geojson.features.forEach(function addFeature (feature) { -+ var geo = feature.geometry -+ if (geo.type === 'Point') { -+ var doc = { -+ type: 'node', -+ tags: feature.properties || {}, -+ lat: geo.coordinates[1], -+ lon: geo.coordinates[0] -+ } -+ docs.push(doc) -+ } else if (geo.type === 'MultiPoint') { -+ var rdoc = { -+ type: 'relation', -+ members: [], -+ tags: feature.properties || {} -+ } -+ docs.push(rdoc) -+ geo.coordinates.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ lat: pt[1], -+ lon: pt[0], -+ id: genId() -+ } -+ docs.push(doc) -+ rdoc.members.push({ type: 'node', ref: doc.id, id: doc.id }) -+ }) -+ } else if (geo.type === 'LineString') { -+ var wdoc = { -+ type: 'way', -+ refs: [], -+ tags: feature.properties || {} -+ } -+ docs.push(wdoc) -+ geo.coordinates.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ id: genId(), -+ lat: pt[1], -+ lon: pt[0] -+ } -+ docs.push(doc) -+ wdoc.refs.push(doc.id) -+ }) -+ } else if (geo.type === 'MultiLineString') { -+ var rdoc = { -+ type: 'relation', -+ members: [], -+ tags: feature.properties || {} -+ } -+ docs.push(rdoc) -+ geo.coordinates.forEach(function (pts) { -+ var wdoc = { -+ type: 'way', -+ id: genId(), -+ refs: [] -+ } -+ docs.push(wdoc) -+ rdoc.members.push({ type: 'way', id: wdoc.id, ref: wdoc.id }) -+ -+ pts.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ id: genId(), -+ lat: pt[1], -+ lon: pt[0] -+ } -+ docs.push(doc) -+ wdoc.refs.push(doc.id) -+ }) -+ }) -+ } else if (geo.type === 'Polygon' && geo.coordinates.length === 1) { -+ // simple way case -+ var pts = geo.coordinates[0] -+ var wdoc = { -+ type: 'way', -+ id: genId(), -+ refs: [], -+ tags: Object.assign({ -+ area: 'yes' -+ }, feature.properties || {}) -+ } -+ docs.push(wdoc) -+ -+ var i = 0 -+ pts.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ id: genId(), -+ lat: pt[1], -+ lon: pt[0] -+ } -+ docs.push(doc) -+ wdoc.refs.push(doc.id) -+ i++ -+ if (i === 1) first = doc.id -+ }) -+ // areas need the last one to connect to the first one again. -+ wdoc.refs.push(first) -+ } else if (geo.type === 'Polygon' && geo.coordinates.length > 1) { -+ // complex multipolygon! -+ // TODO: this is *incomplete*! missing 'role' information, and possibly also 'type=boundary' tag -+ // see: https://wiki.openstreetmap.org/wiki/Relation:multipolygon -+ var rdoc = { -+ type: 'relation', -+ id: genId(), -+ members: [], -+ tags: feature.properties || {} -+ } -+ docs.push(rdoc) -+ -+ geo.coordinates.forEach(function (pts) { -+ var wdoc = { -+ type: 'way', -+ id: genId(), -+ refs: [], -+ tags: { -+ area: 'yes' -+ } -+ } -+ docs.push(wdoc) -+ rdoc.members.push({ type: 'relation', id: wdoc.id, ref: wdoc.id }) -+ -+ var i = 0 -+ pts.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ id: genId(), -+ lat: pt[1], -+ lon: pt[0] -+ } -+ docs.push(doc) -+ wdoc.refs.push(doc.id) -+ i++ -+ if (i === 1) first = doc.id -+ }) -+ // areas need the last one to connect to the first one again. -+ wdoc.refs.push(first) -+ }) -+ } else if (geo.type === 'MultiPolygon') { -+ var srdoc = { -+ type: 'relation', -+ members: [], -+ tags: feature.properties || {} -+ } -+ docs.push(srdoc) -+ geo.coordinates.forEach(function (xpts) { -+ var rdoc = { -+ type: 'relation', -+ id: genId(), -+ members: [] -+ } -+ srdoc.members.push({ type: 'relation', id: rdoc.id, ref: rdoc.id }) -+ docs.push(rdoc) -+ -+ xpts.forEach(function (pts) { -+ var wdoc = { -+ type: 'way', -+ id: genId(), -+ refs: [], -+ tags: { -+ area: 'yes' -+ } -+ } -+ docs.push(wdoc) -+ rdoc.members.push({ type: 'way', id: wdoc.id, ref: wdoc.id }) -+ -+ pts.forEach(function (pt) { -+ var doc = { -+ type: 'node', -+ id: genId(), -+ lat: pt[1], -+ lon: pt[0] -+ } -+ docs.push(doc) -+ wdoc.refs.push(doc.id) -+ }) -+ }) -+ }) -+ } else if (geo.type === 'GeometryCollection') { -+ geo.features.forEach(addFeature) -+ } -+ }) -+ function done (err) { -+ if (err) self.emit('error', err) -+ else self.emit('done') -+ self.importing = false -+ cb(err) -+ } -+ -+ var batch = [] -+ -+ for (var index=0; index < docs.length; index++) { -+ var doc = docs[index] -+ if (doc.id === undefined) { -+ doc.changeset = geojson.changeset -+ batch.push({ -+ type: 'put', -+ value: doc -+ }) -+ } else { -+ var id = doc.id -+ delete doc.id -+ doc.changeset = geojson.changeset -+ batch.push({ -+ type: 'put', -+ id: id, -+ value: doc -+ }) -+ } -+ } -+ self.osm.batch(batch, done) -+} -+ -+}, -+"AXD+pBrtRt1e65STKEzBbMbcJ8ufZQKc4zt2voL/pf4=": -+function (require, module, exports, __dirname, __filename) { -+// hoisted class for cyclic dependency -+class Range { -+ constructor (range, options) { -+ options = parseOptions(options) -+ -+ if (range instanceof Range) { -+ if ( -+ range.loose === !!options.loose && -+ range.includePrerelease === !!options.includePrerelease -+ ) { -+ return range -+ } else { -+ return new Range(range.raw, options) -+ } -+ } -+ -+ if (range instanceof Comparator) { -+ // just put it in the set and return -+ this.raw = range.value -+ this.set = [[range]] -+ this.format() -+ return this -+ } -+ -+ this.options = options -+ this.loose = !!options.loose -+ this.includePrerelease = !!options.includePrerelease -+ -+ // First, split based on boolean or || -+ this.raw = range -+ this.set = range -+ .split(/\s*\|\|\s*/) -+ // map the range to a 2d array of comparators -+ .map(range => this.parseRange(range.trim())) -+ // throw out any comparator lists that are empty -+ // this generally means that it was not a valid range, which is allowed -+ // in loose mode, but will still throw if the WHOLE range is invalid. -+ .filter(c => c.length) -+ -+ if (!this.set.length) { -+ throw new TypeError(`Invalid SemVer Range: ${range}`) -+ } -+ -+ // if we have any that are not the null set, throw out null sets. -+ if (this.set.length > 1) { -+ // keep the first one, in case they're all null sets -+ const first = this.set[0] -+ this.set = this.set.filter(c => !isNullSet(c[0])) -+ if (this.set.length === 0) -+ this.set = [first] -+ else if (this.set.length > 1) { -+ // if we have any that are *, then the range is just * -+ for (const c of this.set) { -+ if (c.length === 1 && isAny(c[0])) { -+ this.set = [c] -+ break -+ } -+ } -+ } -+ } -+ -+ this.format() -+ } -+ -+ format () { -+ this.range = this.set -+ .map((comps) => { -+ return comps.join(' ').trim() -+ }) -+ .join('||') -+ .trim() -+ return this.range -+ } -+ -+ toString () { -+ return this.range -+ } -+ -+ parseRange (range) { -+ range = range.trim() -+ -+ // memoize range parsing for performance. -+ // this is a very hot path, and fully deterministic. -+ const memoOpts = Object.keys(this.options).join(',') -+ const memoKey = `parseRange:${memoOpts}:${range}` -+ const cached = cache.get(memoKey) -+ if (cached) -+ return cached -+ -+ const loose = this.options.loose -+ // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` -+ const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] -+ range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) -+ debug('hyphen replace', range) -+ // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` -+ range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) -+ debug('comparator trim', range, re[t.COMPARATORTRIM]) -+ -+ // `~ 1.2.3` => `~1.2.3` -+ range = range.replace(re[t.TILDETRIM], tildeTrimReplace) -+ -+ // `^ 1.2.3` => `^1.2.3` -+ range = range.replace(re[t.CARETTRIM], caretTrimReplace) -+ -+ // normalize spaces -+ range = range.split(/\s+/).join(' ') -+ -+ // At this point, the range is completely trimmed and -+ // ready to be split into comparators. -+ -+ const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] -+ const rangeList = range -+ .split(' ') -+ .map(comp => parseComparator(comp, this.options)) -+ .join(' ') -+ .split(/\s+/) -+ // >=0.0.0 is equivalent to * -+ .map(comp => replaceGTE0(comp, this.options)) -+ // in loose mode, throw out any that are not valid comparators -+ .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true) -+ .map(comp => new Comparator(comp, this.options)) -+ -+ // if any comparators are the null set, then replace with JUST null set -+ // if more than one comparator, remove any * comparators -+ // also, don't include the same comparator more than once -+ const l = rangeList.length -+ const rangeMap = new Map() -+ for (const comp of rangeList) { -+ if (isNullSet(comp)) -+ return [comp] -+ rangeMap.set(comp.value, comp) -+ } -+ if (rangeMap.size > 1 && rangeMap.has('')) -+ rangeMap.delete('') -+ -+ const result = [...rangeMap.values()] -+ cache.set(memoKey, result) -+ return result -+ } -+ -+ intersects (range, options) { -+ if (!(range instanceof Range)) { -+ throw new TypeError('a Range is required') -+ } -+ -+ return this.set.some((thisComparators) => { -+ return ( -+ isSatisfiable(thisComparators, options) && -+ range.set.some((rangeComparators) => { -+ return ( -+ isSatisfiable(rangeComparators, options) && -+ thisComparators.every((thisComparator) => { -+ return rangeComparators.every((rangeComparator) => { -+ return thisComparator.intersects(rangeComparator, options) -+ }) -+ }) -+ ) -+ }) -+ ) -+ }) -+ } -+ -+ // if ANY of the sets match ALL of its comparators, then pass -+ test (version) { -+ if (!version) { -+ return false -+ } -+ -+ if (typeof version === 'string') { -+ try { -+ version = new SemVer(version, this.options) -+ } catch (er) { -+ return false -+ } -+ } -+ -+ for (let i = 0; i < this.set.length; i++) { -+ if (testSet(this.set[i], version, this.options)) { -+ return true -+ } -+ } -+ return false -+ } -+} -+module.exports = Range -+ -+const LRU = require('lru-cache') -+const cache = new LRU({ max: 1000 }) -+ -+const parseOptions = require('../internal/parse-options') -+const Comparator = require('./comparator') -+const debug = require('../internal/debug') -+const SemVer = require('./semver') -+const { -+ re, -+ t, -+ comparatorTrimReplace, -+ tildeTrimReplace, -+ caretTrimReplace -+} = require('../internal/re') -+ -+const isNullSet = c => c.value === '<0.0.0-0' -+const isAny = c => c.value === '' -+ -+// take a set of comparators and determine whether there -+// exists a version which can satisfy it -+const isSatisfiable = (comparators, options) => { -+ let result = true -+ const remainingComparators = comparators.slice() -+ let testComparator = remainingComparators.pop() -+ -+ while (result && remainingComparators.length) { -+ result = remainingComparators.every((otherComparator) => { -+ return testComparator.intersects(otherComparator, options) -+ }) -+ -+ testComparator = remainingComparators.pop() -+ } -+ -+ return result -+} -+ -+// comprised of xranges, tildes, stars, and gtlt's at this point. -+// already replaced the hyphen ranges -+// turn into a set of JUST comparators. -+const parseComparator = (comp, options) => { -+ debug('comp', comp, options) -+ comp = replaceCarets(comp, options) -+ debug('caret', comp) -+ comp = replaceTildes(comp, options) -+ debug('tildes', comp) -+ comp = replaceXRanges(comp, options) -+ debug('xrange', comp) -+ comp = replaceStars(comp, options) -+ debug('stars', comp) -+ return comp -+} -+ -+const isX = id => !id || id.toLowerCase() === 'x' || id === '*' -+ -+// ~, ~> --> * (any, kinda silly) -+// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 -+// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 -+// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 -+// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 -+// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 -+const replaceTildes = (comp, options) => -+ comp.trim().split(/\s+/).map((comp) => { -+ return replaceTilde(comp, options) -+ }).join(' ') -+ -+const replaceTilde = (comp, options) => { -+ const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] -+ return comp.replace(r, (_, M, m, p, pr) => { -+ debug('tilde', comp, _, M, m, p, pr) -+ let ret -+ -+ if (isX(M)) { -+ ret = '' -+ } else if (isX(m)) { -+ ret = `>=${M}.0.0 <${+M + 1}.0.0-0` -+ } else if (isX(p)) { -+ // ~1.2 == >=1.2.0 <1.3.0-0 -+ ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` -+ } else if (pr) { -+ debug('replaceTilde pr', pr) -+ ret = `>=${M}.${m}.${p}-${pr -+ } <${M}.${+m + 1}.0-0` -+ } else { -+ // ~1.2.3 == >=1.2.3 <1.3.0-0 -+ ret = `>=${M}.${m}.${p -+ } <${M}.${+m + 1}.0-0` -+ } -+ -+ debug('tilde return', ret) -+ return ret -+ }) -+} -+ -+// ^ --> * (any, kinda silly) -+// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 -+// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 -+// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 -+// ^1.2.3 --> >=1.2.3 <2.0.0-0 -+// ^1.2.0 --> >=1.2.0 <2.0.0-0 -+const replaceCarets = (comp, options) => -+ comp.trim().split(/\s+/).map((comp) => { -+ return replaceCaret(comp, options) -+ }).join(' ') -+ -+const replaceCaret = (comp, options) => { -+ debug('caret', comp, options) -+ const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] -+ const z = options.includePrerelease ? '-0' : '' -+ return comp.replace(r, (_, M, m, p, pr) => { -+ debug('caret', comp, _, M, m, p, pr) -+ let ret -+ -+ if (isX(M)) { -+ ret = '' -+ } else if (isX(m)) { -+ ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` -+ } else if (isX(p)) { -+ if (M === '0') { -+ ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` -+ } else { -+ ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` -+ } -+ } else if (pr) { -+ debug('replaceCaret pr', pr) -+ if (M === '0') { -+ if (m === '0') { -+ ret = `>=${M}.${m}.${p}-${pr -+ } <${M}.${m}.${+p + 1}-0` -+ } else { -+ ret = `>=${M}.${m}.${p}-${pr -+ } <${M}.${+m + 1}.0-0` -+ } -+ } else { -+ ret = `>=${M}.${m}.${p}-${pr -+ } <${+M + 1}.0.0-0` -+ } -+ } else { -+ debug('no pr') -+ if (M === '0') { -+ if (m === '0') { -+ ret = `>=${M}.${m}.${p -+ }${z} <${M}.${m}.${+p + 1}-0` -+ } else { -+ ret = `>=${M}.${m}.${p -+ }${z} <${M}.${+m + 1}.0-0` -+ } -+ } else { -+ ret = `>=${M}.${m}.${p -+ } <${+M + 1}.0.0-0` -+ } -+ } -+ -+ debug('caret return', ret) -+ return ret -+ }) -+} -+ -+const replaceXRanges = (comp, options) => { -+ debug('replaceXRanges', comp, options) -+ return comp.split(/\s+/).map((comp) => { -+ return replaceXRange(comp, options) -+ }).join(' ') -+} -+ -+const replaceXRange = (comp, options) => { -+ comp = comp.trim() -+ const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] -+ return comp.replace(r, (ret, gtlt, M, m, p, pr) => { -+ debug('xRange', comp, ret, gtlt, M, m, p, pr) -+ const xM = isX(M) -+ const xm = xM || isX(m) -+ const xp = xm || isX(p) -+ const anyX = xp -+ -+ if (gtlt === '=' && anyX) { -+ gtlt = '' -+ } -+ -+ // if we're including prereleases in the match, then we need -+ // to fix this to -0, the lowest possible prerelease value -+ pr = options.includePrerelease ? '-0' : '' -+ -+ if (xM) { -+ if (gtlt === '>' || gtlt === '<') { -+ // nothing is allowed -+ ret = '<0.0.0-0' -+ } else { -+ // nothing is forbidden -+ ret = '*' -+ } -+ } else if (gtlt && anyX) { -+ // we know patch is an x, because we have any x at all. -+ // replace X with 0 -+ if (xm) { -+ m = 0 -+ } -+ p = 0 -+ -+ if (gtlt === '>') { -+ // >1 => >=2.0.0 -+ // >1.2 => >=1.3.0 -+ gtlt = '>=' -+ if (xm) { -+ M = +M + 1 -+ m = 0 -+ p = 0 -+ } else { -+ m = +m + 1 -+ p = 0 -+ } -+ } else if (gtlt === '<=') { -+ // <=0.7.x is actually <0.8.0, since any 0.7.x should -+ // pass. Similarly, <=7.x is actually <8.0.0, etc. -+ gtlt = '<' -+ if (xm) { -+ M = +M + 1 -+ } else { -+ m = +m + 1 -+ } -+ } -+ -+ if (gtlt === '<') -+ pr = '-0' -+ -+ ret = `${gtlt + M}.${m}.${p}${pr}` -+ } else if (xm) { -+ ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` -+ } else if (xp) { -+ ret = `>=${M}.${m}.0${pr -+ } <${M}.${+m + 1}.0-0` -+ } -+ -+ debug('xRange return', ret) -+ -+ return ret -+ }) -+} -+ -+// Because * is AND-ed with everything else in the comparator, -+// and '' means "any version", just remove the *s entirely. -+const replaceStars = (comp, options) => { -+ debug('replaceStars', comp, options) -+ // Looseness is ignored here. star is always as loose as it gets! -+ return comp.trim().replace(re[t.STAR], '') -+} -+ -+const replaceGTE0 = (comp, options) => { -+ debug('replaceGTE0', comp, options) -+ return comp.trim() -+ .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') -+} -+ -+// This function is passed to string.replace(re[t.HYPHENRANGE]) -+// M, m, patch, prerelease, build -+// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -+// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do -+// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 -+const hyphenReplace = incPr => ($0, -+ from, fM, fm, fp, fpr, fb, -+ to, tM, tm, tp, tpr, tb) => { -+ if (isX(fM)) { -+ from = '' -+ } else if (isX(fm)) { -+ from = `>=${fM}.0.0${incPr ? '-0' : ''}` -+ } else if (isX(fp)) { -+ from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` -+ } else if (fpr) { -+ from = `>=${from}` -+ } else { -+ from = `>=${from}${incPr ? '-0' : ''}` -+ } -+ -+ if (isX(tM)) { -+ to = '' -+ } else if (isX(tm)) { -+ to = `<${+tM + 1}.0.0-0` -+ } else if (isX(tp)) { -+ to = `<${tM}.${+tm + 1}.0-0` -+ } else if (tpr) { -+ to = `<=${tM}.${tm}.${tp}-${tpr}` -+ } else if (incPr) { -+ to = `<${tM}.${tm}.${+tp + 1}-0` -+ } else { -+ to = `<=${to}` -+ } -+ -+ return (`${from} ${to}`).trim() -+} -+ -+const testSet = (set, version, options) => { -+ for (let i = 0; i < set.length; i++) { -+ if (!set[i].test(version)) { -+ return false -+ } -+ } -+ -+ if (version.prerelease.length && !options.includePrerelease) { -+ // Find the set of versions that are allowed to have prereleases -+ // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 -+ // That should allow `1.2.3-pr.2` to pass. -+ // However, `1.2.4-alpha.notready` should NOT be allowed, -+ // even though it's within the range set by the comparators. -+ for (let i = 0; i < set.length; i++) { -+ debug(set[i].semver) -+ if (set[i].semver === Comparator.ANY) { -+ continue -+ } -+ -+ if (set[i].semver.prerelease.length > 0) { -+ const allowed = set[i].semver -+ if (allowed.major === version.major && -+ allowed.minor === version.minor && -+ allowed.patch === version.patch) { -+ return true -+ } -+ } -+ } -+ -+ // Version has a -pre, but it's not one of the ones we like. -+ return false -+ } -+ -+ return true -+} -+ -+}, -+"AXuXDJlk7cyvAuh6ZWwRlZ4BSaoaVPhzqGRC3EJXrrk=": -+function (require, module, exports, __dirname, __filename) { -+(function(root, factory) { -+ 'use strict'; -+ // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers. -+ -+ /* istanbul ignore next */ -+ if (typeof define === 'function' && define.amd) { -+ define('stackframe', [], factory); -+ } else if (typeof exports === 'object') { -+ module.exports = factory(); -+ } else { -+ root.StackFrame = factory(); -+ } -+}(this, function() { -+ 'use strict'; -+ function _isNumber(n) { -+ return !isNaN(parseFloat(n)) && isFinite(n); -+ } -+ -+ function _capitalize(str) { -+ return str.charAt(0).toUpperCase() + str.substring(1); -+ } -+ -+ function _getter(p) { -+ return function() { -+ return this[p]; -+ }; -+ } -+ -+ var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel']; -+ var numericProps = ['columnNumber', 'lineNumber']; -+ var stringProps = ['fileName', 'functionName', 'source']; -+ var arrayProps = ['args']; -+ var objectProps = ['evalOrigin']; -+ -+ var props = booleanProps.concat(numericProps, stringProps, arrayProps, objectProps); -+ -+ function StackFrame(obj) { -+ if (!obj) return; -+ for (var i = 0; i < props.length; i++) { -+ if (obj[props[i]] !== undefined) { -+ this['set' + _capitalize(props[i])](obj[props[i]]); -+ } -+ } -+ } -+ -+ StackFrame.prototype = { -+ getArgs: function() { -+ return this.args; -+ }, -+ setArgs: function(v) { -+ if (Object.prototype.toString.call(v) !== '[object Array]') { -+ throw new TypeError('Args must be an Array'); -+ } -+ this.args = v; -+ }, -+ -+ getEvalOrigin: function() { -+ return this.evalOrigin; -+ }, -+ setEvalOrigin: function(v) { -+ if (v instanceof StackFrame) { -+ this.evalOrigin = v; -+ } else if (v instanceof Object) { -+ this.evalOrigin = new StackFrame(v); -+ } else { -+ throw new TypeError('Eval Origin must be an Object or StackFrame'); -+ } -+ }, -+ -+ toString: function() { -+ var fileName = this.getFileName() || ''; -+ var lineNumber = this.getLineNumber() || ''; -+ var columnNumber = this.getColumnNumber() || ''; -+ var functionName = this.getFunctionName() || ''; -+ if (this.getIsEval()) { -+ if (fileName) { -+ return '[eval] (' + fileName + ':' + lineNumber + ':' + columnNumber + ')'; -+ } -+ return '[eval]:' + lineNumber + ':' + columnNumber; -+ } -+ if (functionName) { -+ return functionName + ' (' + fileName + ':' + lineNumber + ':' + columnNumber + ')'; -+ } -+ return fileName + ':' + lineNumber + ':' + columnNumber; -+ } -+ }; -+ -+ StackFrame.fromString = function StackFrame$$fromString(str) { -+ var argsStartIndex = str.indexOf('('); -+ var argsEndIndex = str.lastIndexOf(')'); -+ -+ var functionName = str.substring(0, argsStartIndex); -+ var args = str.substring(argsStartIndex + 1, argsEndIndex).split(','); -+ var locationString = str.substring(argsEndIndex + 1); -+ -+ if (locationString.indexOf('@') === 0) { -+ var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, ''); -+ var fileName = parts[1]; -+ var lineNumber = parts[2]; -+ var columnNumber = parts[3]; -+ } -+ -+ return new StackFrame({ -+ functionName: functionName, -+ args: args || undefined, -+ fileName: fileName, -+ lineNumber: lineNumber || undefined, -+ columnNumber: columnNumber || undefined -+ }); -+ }; -+ -+ for (var i = 0; i < booleanProps.length; i++) { -+ StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]); -+ StackFrame.prototype['set' + _capitalize(booleanProps[i])] = (function(p) { -+ return function(v) { -+ this[p] = Boolean(v); -+ }; -+ })(booleanProps[i]); -+ } -+ -+ for (var j = 0; j < numericProps.length; j++) { -+ StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]); -+ StackFrame.prototype['set' + _capitalize(numericProps[j])] = (function(p) { -+ return function(v) { -+ if (!_isNumber(v)) { -+ throw new TypeError(p + ' must be a Number'); -+ } -+ this[p] = Number(v); -+ }; -+ })(numericProps[j]); -+ } -+ -+ for (var k = 0; k < stringProps.length; k++) { -+ StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]); -+ StackFrame.prototype['set' + _capitalize(stringProps[k])] = (function(p) { -+ return function(v) { -+ this[p] = String(v); -+ }; -+ })(stringProps[k]); -+ } -+ -+ return StackFrame; -+})); -+ -+}, -+"AbO5usk7t+EYAGGH6x/LrK8a24b7wQ8FSAe62n5TYTE=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ C-like unsigned 32 bits integers in Javascript -+ Copyright (C) 2013, Pierre Curto -+ MIT license -+ */ -+;(function (root) { -+ -+ // Local cache for typical radices -+ var radixPowerCache = { -+ 36: UINT32( Math.pow(36, 5) ) -+ , 16: UINT32( Math.pow(16, 7) ) -+ , 10: UINT32( Math.pow(10, 9) ) -+ , 2: UINT32( Math.pow(2, 30) ) -+ } -+ var radixCache = { -+ 36: UINT32(36) -+ , 16: UINT32(16) -+ , 10: UINT32(10) -+ , 2: UINT32(2) -+ } -+ -+ /** -+ * Represents an unsigned 32 bits integer -+ * @constructor -+ * @param {Number|String|Number} low bits | integer as a string | integer as a number -+ * @param {Number|Number|Undefined} high bits | radix (optional, default=10) -+ * @return -+ */ -+ function UINT32 (l, h) { -+ if ( !(this instanceof UINT32) ) -+ return new UINT32(l, h) -+ -+ this._low = 0 -+ this._high = 0 -+ this.remainder = null -+ if (typeof h == 'undefined') -+ return fromNumber.call(this, l) -+ -+ if (typeof l == 'string') -+ return fromString.call(this, l, h) -+ -+ fromBits.call(this, l, h) -+ } -+ -+ /** -+ * Set the current _UINT32_ object with its low and high bits -+ * @method fromBits -+ * @param {Number} low bits -+ * @param {Number} high bits -+ * @return ThisExpression -+ */ -+ function fromBits (l, h) { -+ this._low = l | 0 -+ this._high = h | 0 -+ -+ return this -+ } -+ UINT32.prototype.fromBits = fromBits -+ -+ /** -+ * Set the current _UINT32_ object from a number -+ * @method fromNumber -+ * @param {Number} number -+ * @return ThisExpression -+ */ -+ function fromNumber (value) { -+ this._low = value & 0xFFFF -+ this._high = value >>> 16 -+ -+ return this -+ } -+ UINT32.prototype.fromNumber = fromNumber -+ -+ /** -+ * Set the current _UINT32_ object from a string -+ * @method fromString -+ * @param {String} integer as a string -+ * @param {Number} radix (optional, default=10) -+ * @return ThisExpression -+ */ -+ function fromString (s, radix) { -+ var value = parseInt(s, radix || 10) -+ -+ this._low = value & 0xFFFF -+ this._high = value >>> 16 -+ -+ return this -+ } -+ UINT32.prototype.fromString = fromString -+ -+ /** -+ * Convert this _UINT32_ to a number -+ * @method toNumber -+ * @return {Number} the converted UINT32 -+ */ -+ UINT32.prototype.toNumber = function () { -+ return (this._high * 65536) + this._low -+ } -+ -+ /** -+ * Convert this _UINT32_ to a string -+ * @method toString -+ * @param {Number} radix (optional, default=10) -+ * @return {String} the converted UINT32 -+ */ -+ UINT32.prototype.toString = function (radix) { -+ return this.toNumber().toString(radix || 10) -+ } -+ -+ /** -+ * Add two _UINT32_. The current _UINT32_ stores the result -+ * @method add -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.add = function (other) { -+ var a00 = this._low + other._low -+ var a16 = a00 >>> 16 -+ -+ a16 += this._high + other._high -+ -+ this._low = a00 & 0xFFFF -+ this._high = a16 & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Subtract two _UINT32_. The current _UINT32_ stores the result -+ * @method subtract -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.subtract = function (other) { -+ //TODO inline -+ return this.add( other.clone().negate() ) -+ } -+ -+ /** -+ * Multiply two _UINT32_. The current _UINT32_ stores the result -+ * @method multiply -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.multiply = function (other) { -+ /* -+ a = a00 + a16 -+ b = b00 + b16 -+ a*b = (a00 + a16)(b00 + b16) -+ = a00b00 + a00b16 + a16b00 + a16b16 -+ -+ a16b16 overflows the 32bits -+ */ -+ var a16 = this._high -+ var a00 = this._low -+ var b16 = other._high -+ var b00 = other._low -+ -+/* Removed to increase speed under normal circumstances (i.e. not multiplying by 0 or 1) -+ // this == 0 or other == 1: nothing to do -+ if ((a00 == 0 && a16 == 0) || (b00 == 1 && b16 == 0)) return this -+ -+ // other == 0 or this == 1: this = other -+ if ((b00 == 0 && b16 == 0) || (a00 == 1 && a16 == 0)) { -+ this._low = other._low -+ this._high = other._high -+ return this -+ } -+*/ -+ -+ var c16, c00 -+ c00 = a00 * b00 -+ c16 = c00 >>> 16 -+ -+ c16 += a16 * b00 -+ c16 &= 0xFFFF // Not required but improves performance -+ c16 += a00 * b16 -+ -+ this._low = c00 & 0xFFFF -+ this._high = c16 & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Divide two _UINT32_. The current _UINT32_ stores the result. -+ * The remainder is made available as the _remainder_ property on -+ * the _UINT32_ object. It can be null, meaning there are no remainder. -+ * @method div -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.div = function (other) { -+ if ( (other._low == 0) && (other._high == 0) ) throw Error('division by zero') -+ -+ // other == 1 -+ if (other._high == 0 && other._low == 1) { -+ this.remainder = new UINT32(0) -+ return this -+ } -+ -+ // other > this: 0 -+ if ( other.gt(this) ) { -+ this.remainder = this.clone() -+ this._low = 0 -+ this._high = 0 -+ return this -+ } -+ // other == this: 1 -+ if ( this.eq(other) ) { -+ this.remainder = new UINT32(0) -+ this._low = 1 -+ this._high = 0 -+ return this -+ } -+ -+ // Shift the divisor left until it is higher than the dividend -+ var _other = other.clone() -+ var i = -1 -+ while ( !this.lt(_other) ) { -+ // High bit can overflow the default 16bits -+ // Its ok since we right shift after this loop -+ // The overflown bit must be kept though -+ _other.shiftLeft(1, true) -+ i++ -+ } -+ -+ // Set the remainder -+ this.remainder = this.clone() -+ // Initialize the current result to 0 -+ this._low = 0 -+ this._high = 0 -+ for (; i >= 0; i--) { -+ _other.shiftRight(1) -+ // If shifted divisor is smaller than the dividend -+ // then subtract it from the dividend -+ if ( !this.remainder.lt(_other) ) { -+ this.remainder.subtract(_other) -+ // Update the current result -+ if (i >= 16) { -+ this._high |= 1 << (i - 16) -+ } else { -+ this._low |= 1 << i -+ } -+ } -+ } -+ -+ return this -+ } -+ -+ /** -+ * Negate the current _UINT32_ -+ * @method negate -+ * @return ThisExpression -+ */ -+ UINT32.prototype.negate = function () { -+ var v = ( ~this._low & 0xFFFF ) + 1 -+ this._low = v & 0xFFFF -+ this._high = (~this._high + (v >>> 16)) & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Equals -+ * @method eq -+ * @param {Object} other UINT32 -+ * @return {Boolean} -+ */ -+ UINT32.prototype.equals = UINT32.prototype.eq = function (other) { -+ return (this._low == other._low) && (this._high == other._high) -+ } -+ -+ /** -+ * Greater than (strict) -+ * @method gt -+ * @param {Object} other UINT32 -+ * @return {Boolean} -+ */ -+ UINT32.prototype.greaterThan = UINT32.prototype.gt = function (other) { -+ if (this._high > other._high) return true -+ if (this._high < other._high) return false -+ return this._low > other._low -+ } -+ -+ /** -+ * Less than (strict) -+ * @method lt -+ * @param {Object} other UINT32 -+ * @return {Boolean} -+ */ -+ UINT32.prototype.lessThan = UINT32.prototype.lt = function (other) { -+ if (this._high < other._high) return true -+ if (this._high > other._high) return false -+ return this._low < other._low -+ } -+ -+ /** -+ * Bitwise OR -+ * @method or -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.or = function (other) { -+ this._low |= other._low -+ this._high |= other._high -+ -+ return this -+ } -+ -+ /** -+ * Bitwise AND -+ * @method and -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.and = function (other) { -+ this._low &= other._low -+ this._high &= other._high -+ -+ return this -+ } -+ -+ /** -+ * Bitwise NOT -+ * @method not -+ * @return ThisExpression -+ */ -+ UINT32.prototype.not = function() { -+ this._low = ~this._low & 0xFFFF -+ this._high = ~this._high & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Bitwise XOR -+ * @method xor -+ * @param {Object} other UINT32 -+ * @return ThisExpression -+ */ -+ UINT32.prototype.xor = function (other) { -+ this._low ^= other._low -+ this._high ^= other._high -+ -+ return this -+ } -+ -+ /** -+ * Bitwise shift right -+ * @method shiftRight -+ * @param {Number} number of bits to shift -+ * @return ThisExpression -+ */ -+ UINT32.prototype.shiftRight = UINT32.prototype.shiftr = function (n) { -+ if (n > 16) { -+ this._low = this._high >> (n - 16) -+ this._high = 0 -+ } else if (n == 16) { -+ this._low = this._high -+ this._high = 0 -+ } else { -+ this._low = (this._low >> n) | ( (this._high << (16-n)) & 0xFFFF ) -+ this._high >>= n -+ } -+ -+ return this -+ } -+ -+ /** -+ * Bitwise shift left -+ * @method shiftLeft -+ * @param {Number} number of bits to shift -+ * @param {Boolean} allow overflow -+ * @return ThisExpression -+ */ -+ UINT32.prototype.shiftLeft = UINT32.prototype.shiftl = function (n, allowOverflow) { -+ if (n > 16) { -+ this._high = this._low << (n - 16) -+ this._low = 0 -+ if (!allowOverflow) { -+ this._high &= 0xFFFF -+ } -+ } else if (n == 16) { -+ this._high = this._low -+ this._low = 0 -+ } else { -+ this._high = (this._high << n) | (this._low >> (16-n)) -+ this._low = (this._low << n) & 0xFFFF -+ if (!allowOverflow) { -+ // Overflow only allowed on the high bits... -+ this._high &= 0xFFFF -+ } -+ } -+ -+ return this -+ } -+ -+ /** -+ * Bitwise rotate left -+ * @method rotl -+ * @param {Number} number of bits to rotate -+ * @return ThisExpression -+ */ -+ UINT32.prototype.rotateLeft = UINT32.prototype.rotl = function (n) { -+ var v = (this._high << 16) | this._low -+ v = (v << n) | (v >>> (32 - n)) -+ this._low = v & 0xFFFF -+ this._high = v >>> 16 -+ -+ return this -+ } -+ -+ /** -+ * Bitwise rotate right -+ * @method rotr -+ * @param {Number} number of bits to rotate -+ * @return ThisExpression -+ */ -+ UINT32.prototype.rotateRight = UINT32.prototype.rotr = function (n) { -+ var v = (this._high << 16) | this._low -+ v = (v >>> n) | (v << (32 - n)) -+ this._low = v & 0xFFFF -+ this._high = v >>> 16 -+ -+ return this -+ } -+ -+ /** -+ * Clone the current _UINT32_ -+ * @method clone -+ * @return {Object} cloned UINT32 -+ */ -+ UINT32.prototype.clone = function () { -+ return new UINT32(this._low, this._high) -+ } -+ -+ if (typeof define != 'undefined' && define.amd) { -+ // AMD / RequireJS -+ define([], function () { -+ return UINT32 -+ }) -+ } else if (typeof module != 'undefined' && module.exports) { -+ // Node.js -+ module.exports = UINT32 -+ } else { -+ // Browser -+ root['UINT32'] = UINT32 -+ } -+ -+})(this) -+ -+}, -+"AkGRt0evrAGyj/EddE6fgnILutX3FhY7pcli62KqI1A=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var traverse = module.exports = function (schema, opts, cb) { -+ // Legacy support for v0.3.1 and earlier. -+ if (typeof opts == 'function') { -+ cb = opts; -+ opts = {}; -+ } -+ -+ cb = opts.cb || cb; -+ var pre = (typeof cb == 'function') ? cb : cb.pre || function() {}; -+ var post = cb.post || function() {}; -+ -+ _traverse(opts, pre, post, schema, '', schema); -+}; -+ -+ -+traverse.keywords = { -+ additionalItems: true, -+ items: true, -+ contains: true, -+ additionalProperties: true, -+ propertyNames: true, -+ not: true, -+ if: true, -+ then: true, -+ else: true -+}; -+ -+traverse.arrayKeywords = { -+ items: true, -+ allOf: true, -+ anyOf: true, -+ oneOf: true -+}; -+ -+traverse.propsKeywords = { -+ $defs: true, -+ definitions: true, -+ properties: true, -+ patternProperties: true, -+ dependencies: true -+}; -+ -+traverse.skipKeywords = { -+ default: true, -+ enum: true, -+ const: true, -+ required: true, -+ maximum: true, -+ minimum: true, -+ exclusiveMaximum: true, -+ exclusiveMinimum: true, -+ multipleOf: true, -+ maxLength: true, -+ minLength: true, -+ pattern: true, -+ format: true, -+ maxItems: true, -+ minItems: true, -+ uniqueItems: true, -+ maxProperties: true, -+ minProperties: true -+}; -+ -+ -+function _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) { -+ if (schema && typeof schema == 'object' && !Array.isArray(schema)) { -+ pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex); -+ for (var key in schema) { -+ var sch = schema[key]; -+ if (Array.isArray(sch)) { -+ if (key in traverse.arrayKeywords) { -+ for (var i=0; i"') -+ } -+ -+ // If it satisfies the range it is not outside -+ if (satisfies(version, range, options)) { -+ return false -+ } -+ -+ // From now on, variable terms are as if we're in "gtr" mode. -+ // but note that everything is flipped for the "ltr" function. -+ -+ for (let i = 0; i < range.set.length; ++i) { -+ const comparators = range.set[i] -+ -+ let high = null -+ let low = null -+ -+ comparators.forEach((comparator) => { -+ if (comparator.semver === ANY) { -+ comparator = new Comparator('>=0.0.0') -+ } -+ high = high || comparator -+ low = low || comparator -+ if (gtfn(comparator.semver, high.semver, options)) { -+ high = comparator -+ } else if (ltfn(comparator.semver, low.semver, options)) { -+ low = comparator -+ } -+ }) -+ -+ // If the edge version comparator has a operator then our version -+ // isn't outside it -+ if (high.operator === comp || high.operator === ecomp) { -+ return false -+ } -+ -+ // If the lowest version comparator has an operator and our version -+ // is less than it then it isn't higher than the range -+ if ((!low.operator || low.operator === comp) && -+ ltefn(version, low.semver)) { -+ return false -+ } else if (low.operator === ecomp && ltfn(version, low.semver)) { -+ return false -+ } -+ } -+ return true -+} -+ -+module.exports = outside -+ -+}, -+"Ar6sQ6CG6m2QQQK1yCxY7SzZq7r3gePFVK0611dC0fM=": -+function (require, module, exports, __dirname, __filename) { -+ -+var N1 = Math.pow(2, 7) -+var N2 = Math.pow(2, 14) -+var N3 = Math.pow(2, 21) -+var N4 = Math.pow(2, 28) -+var N5 = Math.pow(2, 35) -+var N6 = Math.pow(2, 42) -+var N7 = Math.pow(2, 49) -+ -+module.exports = function (value) { -+ return ( -+ value < N1 ? 1 -+ : value < N2 ? 2 -+ : value < N3 ? 3 -+ : value < N4 ? 4 -+ : value < N5 ? 5 -+ : value < N6 ? 6 -+ : value < N7 ? 7 -+ : 8 -+ ) -+} -+ -+}, -+"AubryZDMuoHEN1rgQM947c+/6H/Ds6DlbKl7Qbhhy3I=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var isMergeableObject = function isMergeableObject(value) { -+ return isNonNullObject(value) -+ && !isSpecial(value) -+}; -+ -+function isNonNullObject(value) { -+ return !!value && typeof value === 'object' -+} -+ -+function isSpecial(value) { -+ var stringValue = Object.prototype.toString.call(value); -+ -+ return stringValue === '[object RegExp]' -+ || stringValue === '[object Date]' -+ || isReactElement(value) -+} -+ -+// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 -+var canUseSymbol = typeof Symbol === 'function' && Symbol.for; -+var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; -+ -+function isReactElement(value) { -+ return value.$$typeof === REACT_ELEMENT_TYPE -+} -+ -+function emptyTarget(val) { -+ return Array.isArray(val) ? [] : {} -+} -+ -+function cloneUnlessOtherwiseSpecified(value, options) { -+ return (options.clone !== false && options.isMergeableObject(value)) -+ ? deepmerge(emptyTarget(value), value, options) -+ : value -+} -+ -+function defaultArrayMerge(target, source, options) { -+ return target.concat(source).map(function(element) { -+ return cloneUnlessOtherwiseSpecified(element, options) -+ }) -+} -+ -+function getMergeFunction(key, options) { -+ if (!options.customMerge) { -+ return deepmerge -+ } -+ var customMerge = options.customMerge(key); -+ return typeof customMerge === 'function' ? customMerge : deepmerge -+} -+ -+function getEnumerableOwnPropertySymbols(target) { -+ return Object.getOwnPropertySymbols -+ ? Object.getOwnPropertySymbols(target).filter(function(symbol) { -+ return target.propertyIsEnumerable(symbol) -+ }) -+ : [] -+} -+ -+function getKeys(target) { -+ return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) -+} -+ -+function propertyIsOnObject(object, property) { -+ try { -+ return property in object -+ } catch(_) { -+ return false -+ } -+} -+ -+// Protects from prototype poisoning and unexpected merging up the prototype chain. -+function propertyIsUnsafe(target, key) { -+ return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, -+ && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, -+ && Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable. -+} -+ -+function mergeObject(target, source, options) { -+ var destination = {}; -+ if (options.isMergeableObject(target)) { -+ getKeys(target).forEach(function(key) { -+ destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); -+ }); -+ } -+ getKeys(source).forEach(function(key) { -+ if (propertyIsUnsafe(target, key)) { -+ return -+ } -+ -+ if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { -+ destination[key] = getMergeFunction(key, options)(target[key], source[key], options); -+ } else { -+ destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); -+ } -+ }); -+ return destination -+} -+ -+function deepmerge(target, source, options) { -+ options = options || {}; -+ options.arrayMerge = options.arrayMerge || defaultArrayMerge; -+ options.isMergeableObject = options.isMergeableObject || isMergeableObject; -+ // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() -+ // implementations can use it. The caller may not replace it. -+ options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; -+ -+ var sourceIsArray = Array.isArray(source); -+ var targetIsArray = Array.isArray(target); -+ var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; -+ -+ if (!sourceAndTargetTypesMatch) { -+ return cloneUnlessOtherwiseSpecified(source, options) -+ } else if (sourceIsArray) { -+ return options.arrayMerge(target, source, options) -+ } else { -+ return mergeObject(target, source, options) -+ } -+} -+ -+deepmerge.all = function deepmergeAll(array, options) { -+ if (!Array.isArray(array)) { -+ throw new Error('first argument should be an array') -+ } -+ -+ return array.reduce(function(prev, next) { -+ return deepmerge(prev, next, options) -+ }, {}) -+}; -+ -+var deepmerge_1 = deepmerge; -+ -+module.exports = deepmerge_1; -+ -+}, -+"AyWoKlH1O5F3CdmphTgpgk+vTNNc3gzQvdGnxgOE5fc=": -+function (require, module, exports, __dirname, __filename) { -+const binding = require('./binding') -+const stream = require('readable-stream') -+const util = require('util') -+const unordered = require('unordered-set') -+const dns = require('dns') -+const timeout = require('timeout-refresh') -+ -+const EMPTY = Buffer.alloc(0) -+const UTP_ERRORS = [ -+ 'UTP_ECONNREFUSED', -+ 'UTP_ECONNRESET', -+ 'UTP_ETIMEDOUT', -+ 'UTP_UNKNOWN' -+] -+ -+module.exports = Connection -+ -+function Connection (utp, port, address, handle, halfOpen) { -+ stream.Duplex.call(this) -+ -+ this.remoteAddress = address -+ this.remoteFamily = 'IPv4' -+ this.remotePort = port -+ this.destroyed = false -+ -+ this._index = -1 -+ this._utp = utp -+ this._handle = handle || Buffer.alloc(binding.sizeof_utp_napi_connection_t) -+ this._buffer = Buffer.allocUnsafe(65536 * 2) -+ this._offset = 0 -+ this._view = new Uint32Array(this._handle.buffer, this._handle.byteOffset, 2) -+ this._callback = null -+ this._writing = null -+ this._error = null -+ this._connected = false -+ this._needsConnect = !handle -+ this._timeout = null -+ this._contentSize = 0 -+ this._allowOpen = halfOpen ? 2 : 1 -+ -+ this.on('finish', this._shutdown) -+ -+ binding.utp_napi_connection_init(this._handle, this, this._buffer, -+ this._onread, -+ this._ondrain, -+ this._onend, -+ this._onerror, -+ this._onclose, -+ this._onconnect, -+ this._realloc -+ ) -+ -+ unordered.add(utp.connections, this) -+ if (utp.maxConnections && utp.connections.length >= utp.maxConnections) { -+ utp.firewall(true) -+ } -+} -+ -+util.inherits(Connection, stream.Duplex) -+ -+Connection.prototype.setTimeout = function (ms, ontimeout) { -+ if (ontimeout) this.once('timeout', ontimeout) -+ if (this._timeout) this._timeout.destroy() -+ this._timeout = timeout(ms, this._ontimeout, this) -+} -+ -+Connection.prototype._ontimeout = function () { -+ this.emit('timeout') -+} -+ -+Connection.prototype.setInteractive = function (interactive) { -+ this.setPacketSize(this.interactive ? 0 : 65536) -+} -+ -+Connection.prototype.setContentSize = function (size) { -+ this._view[0] = size < 65536 ? (size >= 0 ? size : 0) : 65536 -+ this._contentSize = size -+} -+ -+Connection.prototype.setPacketSize = function (size) { -+ if (size > 65536) size = 65536 -+ this._view[0] = size -+ this._contentSize = 0 -+} -+ -+Connection.prototype.address = function () { -+ if (this.destroyed) return null -+ return this._utp.address() -+} -+ -+Connection.prototype._read = function () { -+ // TODO: backpressure -+} -+ -+Connection.prototype._write = function (data, enc, cb) { -+ if (this.destroyed) return -+ -+ if (!this._connected || !binding.utp_napi_connection_write(this._handle, data)) { -+ this._callback = cb -+ this._writing = new Array(1) -+ this._writing[0] = data -+ return -+ } -+ -+ cb(null) -+} -+ -+Connection.prototype._writev = function (datas, cb) { -+ if (this.destroyed) return -+ -+ const bufs = new Array(datas.length) -+ for (var i = 0; i < datas.length; i++) bufs[i] = datas[i].chunk -+ -+ if (bufs.length > 256) return this._write(Buffer.concat(bufs), null, cb) -+ -+ if (!binding.utp_napi_connection_writev(this._handle, bufs)) { -+ this._callback = cb -+ this._writing = bufs -+ return -+ } -+ -+ cb(null) -+} -+ -+Connection.prototype._realloc = function () { -+ this._buffer = Buffer.allocUnsafe(this._buffer.length) -+ this._offset = 0 -+ return this._buffer -+} -+ -+Connection.prototype._onread = function (size) { -+ if (!this._connected) this._onconnect() // makes the server wait for reads before writes -+ if (this._timeout) this._timeout.refresh() -+ -+ const buf = this._buffer.slice(this._offset, this._offset += size) -+ -+ if (this._contentSize) { -+ if (size > this._contentSize) size = this._contentSize -+ this._contentSize -= size -+ if (this._contentSize < 65536) this._view[0] = this._contentSize -+ } -+ -+ this.push(buf) -+ -+ // 64kb + 4kb as max package buffer is 64kb and we wanna make sure we have room for that -+ // plus the next udp package -+ if (this._buffer.length - this._offset <= 69632) { -+ this._buffer = Buffer.allocUnsafe(this._buffer.length) -+ this._offset = 0 -+ return this._buffer -+ } -+ -+ return EMPTY -+} -+ -+Connection.prototype._ondrain = function () { -+ this._writing = null -+ const cb = this._callback -+ this._callback = null -+ cb(null) -+} -+ -+Connection.prototype._onclose = function () { -+ unordered.remove(this._utp.connections, this) -+ if (!this._utp.maxConnections || this._utp.connections.length < this._utp.maxConnections) { -+ this._utp.firewall(false) -+ } -+ this._handle = null -+ if (this._error) this.emit('error', this._error) -+ this.emit('close') -+ this._utp._closeMaybe() -+} -+ -+Connection.prototype._onerror = function (status) { -+ this.destroy(createUTPError(status)) -+} -+ -+Connection.prototype._onend = function () { -+ if (this._timeout) this._timeout.destroy() -+ this.push(null) -+ this._destroyMaybe() -+} -+ -+Connection.prototype._resolveAndConnect = function (port, host) { -+ const self = this -+ dns.lookup(host, function (err, ip) { -+ if (err) return self.destroy(err) -+ if (!ip) return self.destroy(new Error('Could not resolve ' + host)) -+ self._connect(port, ip) -+ }) -+} -+ -+Connection.prototype._connect = function (port, ip) { -+ if (this.destroyed) return -+ this._needsConnect = false -+ this.remoteAddress = ip -+ binding.utp_napi_connect(this._utp._handle, this._handle, port, ip) -+} -+ -+Connection.prototype._onconnect = function () { -+ if (this._timeout) this._timeout.refresh() -+ -+ this._connected = true -+ if (this._writing) { -+ const cb = this._callback -+ const data = this._writing[0] -+ this._callback = null -+ this._writing = null -+ this._write(data, null, cb) -+ } -+ this.emit('connect') -+} -+ -+Connection.prototype.destroy = function (err) { -+ if (this.destroyed) return -+ this.destroyed = true -+ if (err) this._error = err -+ if (this._needsConnect) return process.nextTick(onbindingclose, this) -+ binding.utp_napi_connection_close(this._handle) -+} -+ -+Connection.prototype._destroyMaybe = function () { -+ if (this._allowOpen && !--this._allowOpen) this.destroy() -+} -+ -+Connection.prototype._shutdown = function () { -+ if (this.destroyed) return -+ binding.utp_napi_connection_shutdown(this._handle) -+ this._destroyMaybe() -+} -+ -+function onbindingclose (self) { -+ binding.utp_napi_connection_on_close(self._handle) -+} -+ -+function createUTPError (code) { -+ const str = UTP_ERRORS[code < 0 ? 3 : code] -+ const err = new Error(str) -+ err.code = str -+ err.errno = code -+ return err -+} -+ -+}, -+"B3bspx8oDzaaIPbtvQPBkrFyLf5qBoHEDWN5i7gaZFk=": -+function (require, module, exports, __dirname, __filename) { -+const compare = require('./compare') -+const gt = (a, b, loose) => compare(a, b, loose) > 0 -+module.exports = gt -+ -+}, -+"B3gQk/LqPvfLTaHJb+SUs1YjE3oKuYVGyZfYSX92Bj4=": -+function (require, module, exports, __dirname, __filename) { -+const binding = require('node-gyp-build')(__dirname) -+ -+lock.unlock = unlock -+module.exports = lock -+ -+function lock (fd) { -+ return !!binding.fd_lock(fd) -+} -+ -+function unlock (fd) { -+ return !!binding.fd_unlock(fd) -+} -+ -+}, -+"B5dhZy7XwU+hkkgsCHl4BA/8fXcpVQOgLFlGQtQPspk=": -+function (require, module, exports, __dirname, __filename) { -+var toString = Object.prototype.toString; -+ -+module.exports = function kindOf(val) { -+ if (val === void 0) return 'undefined'; -+ if (val === null) return 'null'; -+ -+ var type = typeof val; -+ if (type === 'boolean') return 'boolean'; -+ if (type === 'string') return 'string'; -+ if (type === 'number') return 'number'; -+ if (type === 'symbol') return 'symbol'; -+ if (type === 'function') { -+ return isGeneratorFn(val) ? 'generatorfunction' : 'function'; -+ } -+ -+ if (isArray(val)) return 'array'; -+ if (isBuffer(val)) return 'buffer'; -+ if (isArguments(val)) return 'arguments'; -+ if (isDate(val)) return 'date'; -+ if (isError(val)) return 'error'; -+ if (isRegexp(val)) return 'regexp'; -+ -+ switch (ctorName(val)) { -+ case 'Symbol': return 'symbol'; -+ case 'Promise': return 'promise'; -+ -+ // Set, Map, WeakSet, WeakMap -+ case 'WeakMap': return 'weakmap'; -+ case 'WeakSet': return 'weakset'; -+ case 'Map': return 'map'; -+ case 'Set': return 'set'; -+ -+ // 8-bit typed arrays -+ case 'Int8Array': return 'int8array'; -+ case 'Uint8Array': return 'uint8array'; -+ case 'Uint8ClampedArray': return 'uint8clampedarray'; -+ -+ // 16-bit typed arrays -+ case 'Int16Array': return 'int16array'; -+ case 'Uint16Array': return 'uint16array'; -+ -+ // 32-bit typed arrays -+ case 'Int32Array': return 'int32array'; -+ case 'Uint32Array': return 'uint32array'; -+ case 'Float32Array': return 'float32array'; -+ case 'Float64Array': return 'float64array'; -+ } -+ -+ if (isGeneratorObj(val)) { -+ return 'generator'; -+ } -+ -+ // Non-plain objects -+ type = toString.call(val); -+ switch (type) { -+ case '[object Object]': return 'object'; -+ // iterators -+ case '[object Map Iterator]': return 'mapiterator'; -+ case '[object Set Iterator]': return 'setiterator'; -+ case '[object String Iterator]': return 'stringiterator'; -+ case '[object Array Iterator]': return 'arrayiterator'; -+ } -+ -+ // other -+ return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); -+}; -+ -+function ctorName(val) { -+ return typeof val.constructor === 'function' ? val.constructor.name : null; -+} -+ -+function isArray(val) { -+ if (Array.isArray) return Array.isArray(val); -+ return val instanceof Array; -+} -+ -+function isError(val) { -+ return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'); -+} -+ -+function isDate(val) { -+ if (val instanceof Date) return true; -+ return typeof val.toDateString === 'function' -+ && typeof val.getDate === 'function' -+ && typeof val.setDate === 'function'; -+} -+ -+function isRegexp(val) { -+ if (val instanceof RegExp) return true; -+ return typeof val.flags === 'string' -+ && typeof val.ignoreCase === 'boolean' -+ && typeof val.multiline === 'boolean' -+ && typeof val.global === 'boolean'; -+} -+ -+function isGeneratorFn(name, val) { -+ return ctorName(name) === 'GeneratorFunction'; -+} -+ -+function isGeneratorObj(val) { -+ return typeof val.throw === 'function' -+ && typeof val.return === 'function' -+ && typeof val.next === 'function'; -+} -+ -+function isArguments(val) { -+ try { -+ if (typeof val.length === 'number' && typeof val.callee === 'function') { -+ return true; -+ } -+ } catch (err) { -+ if (err.message.indexOf('callee') !== -1) { -+ return true; -+ } -+ } -+ return false; -+} -+ -+/** -+ * If you need to support Safari 5-7 (8-10 yr-old browser), -+ * take a look at https://github.com/feross/is-buffer -+ */ -+ -+function isBuffer(val) { -+ if (val.constructor && typeof val.constructor.isBuffer === 'function') { -+ return val.constructor.isBuffer(val); -+ } -+ return false; -+} -+ -+}, -+"B7QKFhqLlbvKNkhpHo/DgX3/ohCGlBuLmwBQfMetapE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var isObject = require('isobject'); -+var define = require('define-property'); -+var utils = require('snapdragon-util'); -+var ownNames; -+ -+/** -+ * Create a new AST `Node` with the given `val` and `type`. -+ * -+ * ```js -+ * var node = new Node('*', 'Star'); -+ * var node = new Node({type: 'star', val: '*'}); -+ * ``` -+ * @name Node -+ * @param {String|Object} `val` Pass a matched substring, or an object to merge onto the node. -+ * @param {String} `type` The node type to use when `val` is a string. -+ * @return {Object} node instance -+ * @api public -+ */ -+ -+function Node(val, type, parent) { -+ if (typeof type !== 'string') { -+ parent = type; -+ type = null; -+ } -+ -+ define(this, 'parent', parent); -+ define(this, 'isNode', true); -+ define(this, 'expect', null); -+ -+ if (typeof type !== 'string' && isObject(val)) { -+ lazyKeys(); -+ var keys = Object.keys(val); -+ for (var i = 0; i < keys.length; i++) { -+ var key = keys[i]; -+ if (ownNames.indexOf(key) === -1) { -+ this[key] = val[key]; -+ } -+ } -+ } else { -+ this.type = type; -+ this.val = val; -+ } -+} -+ -+/** -+ * Returns true if the given value is a node. -+ * -+ * ```js -+ * var Node = require('snapdragon-node'); -+ * var node = new Node({type: 'foo'}); -+ * console.log(Node.isNode(node)); //=> true -+ * console.log(Node.isNode({})); //=> false -+ * ``` -+ * @param {Object} `node` -+ * @returns {Boolean} -+ * @api public -+ */ -+ -+Node.isNode = function(node) { -+ return utils.isNode(node); -+}; -+ -+/** -+ * Define a non-enumberable property on the node instance. -+ * Useful for adding properties that shouldn't be extended -+ * or visible during debugging. -+ * -+ * ```js -+ * var node = new Node(); -+ * node.define('foo', 'something non-enumerable'); -+ * ``` -+ * @param {String} `name` -+ * @param {any} `val` -+ * @return {Object} returns the node instance -+ * @api public -+ */ -+ -+Node.prototype.define = function(name, val) { -+ define(this, name, val); -+ return this; -+}; -+ -+/** -+ * Returns true if `node.val` is an empty string, or `node.nodes` does -+ * not contain any non-empty text nodes. -+ * -+ * ```js -+ * var node = new Node({type: 'text'}); -+ * node.isEmpty(); //=> true -+ * node.val = 'foo'; -+ * node.isEmpty(); //=> false -+ * ``` -+ * @param {Function} `fn` (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes. -+ * @return {Boolean} -+ * @api public -+ */ -+ -+Node.prototype.isEmpty = function(fn) { -+ return utils.isEmpty(this, fn); -+}; -+ -+/** -+ * Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and -+ * set `foo` as `bar.parent`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * foo.push(bar); -+ * ``` -+ * @param {Object} `node` -+ * @return {Number} Returns the length of `node.nodes` -+ * @api public -+ */ -+ -+Node.prototype.push = function(node) { -+ assert(Node.isNode(node), 'expected node to be an instance of Node'); -+ define(node, 'parent', this); -+ -+ this.nodes = this.nodes || []; -+ return this.nodes.push(node); -+}; -+ -+/** -+ * Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and -+ * set `foo` as `bar.parent`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * foo.unshift(bar); -+ * ``` -+ * @param {Object} `node` -+ * @return {Number} Returns the length of `node.nodes` -+ * @api public -+ */ -+ -+Node.prototype.unshift = function(node) { -+ assert(Node.isNode(node), 'expected node to be an instance of Node'); -+ define(node, 'parent', this); -+ -+ this.nodes = this.nodes || []; -+ return this.nodes.unshift(node); -+}; -+ -+/** -+ * Pop a node from `node.nodes`. -+ * -+ * ```js -+ * var node = new Node({type: 'foo'}); -+ * node.push(new Node({type: 'a'})); -+ * node.push(new Node({type: 'b'})); -+ * node.push(new Node({type: 'c'})); -+ * node.push(new Node({type: 'd'})); -+ * console.log(node.nodes.length); -+ * //=> 4 -+ * node.pop(); -+ * console.log(node.nodes.length); -+ * //=> 3 -+ * ``` -+ * @return {Number} Returns the popped `node` -+ * @api public -+ */ -+ -+Node.prototype.pop = function() { -+ return this.nodes && this.nodes.pop(); -+}; -+ -+/** -+ * Shift a node from `node.nodes`. -+ * -+ * ```js -+ * var node = new Node({type: 'foo'}); -+ * node.push(new Node({type: 'a'})); -+ * node.push(new Node({type: 'b'})); -+ * node.push(new Node({type: 'c'})); -+ * node.push(new Node({type: 'd'})); -+ * console.log(node.nodes.length); -+ * //=> 4 -+ * node.shift(); -+ * console.log(node.nodes.length); -+ * //=> 3 -+ * ``` -+ * @return {Object} Returns the shifted `node` -+ * @api public -+ */ -+ -+Node.prototype.shift = function() { -+ return this.nodes && this.nodes.shift(); -+}; -+ -+/** -+ * Remove `node` from `node.nodes`. -+ * -+ * ```js -+ * node.remove(childNode); -+ * ``` -+ * @param {Object} `node` -+ * @return {Object} Returns the removed node. -+ * @api public -+ */ -+ -+Node.prototype.remove = function(node) { -+ assert(Node.isNode(node), 'expected node to be an instance of Node'); -+ this.nodes = this.nodes || []; -+ var idx = node.index; -+ if (idx !== -1) { -+ node.index = -1; -+ return this.nodes.splice(idx, 1); -+ } -+ return null; -+}; -+ -+/** -+ * Get the first child node from `node.nodes` that matches the given `type`. -+ * If `type` is a number, the child node at that index is returned. -+ * -+ * ```js -+ * var child = node.find(1); //<= index of the node to get -+ * var child = node.find('foo'); //<= node.type of a child node -+ * var child = node.find(/^(foo|bar)$/); //<= regex to match node.type -+ * var child = node.find(['foo', 'bar']); //<= array of node.type(s) -+ * ``` -+ * @param {String} `type` -+ * @return {Object} Returns a child node or undefined. -+ * @api public -+ */ -+ -+Node.prototype.find = function(type) { -+ return utils.findNode(this.nodes, type); -+}; -+ -+/** -+ * Return true if the node is the given `type`. -+ * -+ * ```js -+ * var node = new Node({type: 'bar'}); -+ * cosole.log(node.isType('foo')); // false -+ * cosole.log(node.isType(/^(foo|bar)$/)); // true -+ * cosole.log(node.isType(['foo', 'bar'])); // true -+ * ``` -+ * @param {String} `type` -+ * @return {Boolean} -+ * @api public -+ */ -+ -+Node.prototype.isType = function(type) { -+ return utils.isType(this, type); -+}; -+ -+/** -+ * Return true if the `node.nodes` has the given `type`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * foo.push(bar); -+ * -+ * cosole.log(foo.hasType('qux')); // false -+ * cosole.log(foo.hasType(/^(qux|bar)$/)); // true -+ * cosole.log(foo.hasType(['qux', 'bar'])); // true -+ * ``` -+ * @param {String} `type` -+ * @return {Boolean} -+ * @api public -+ */ -+ -+Node.prototype.hasType = function(type) { -+ return utils.hasType(this, type); -+}; -+ -+/** -+ * Get the siblings array, or `null` if it doesn't exist. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * -+ * console.log(bar.siblings.length) // 2 -+ * console.log(baz.siblings.length) // 2 -+ * ``` -+ * @return {Array} -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'siblings', { -+ set: function() { -+ throw new Error('node.siblings is a getter and cannot be defined'); -+ }, -+ get: function() { -+ return this.parent ? this.parent.nodes : null; -+ } -+}); -+ -+/** -+ * Get the node's current index from `node.parent.nodes`. -+ * This should always be correct, even when the parent adds nodes. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * var qux = new Node({type: 'qux'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * foo.unshift(qux); -+ * -+ * console.log(bar.index) // 1 -+ * console.log(baz.index) // 2 -+ * console.log(qux.index) // 0 -+ * ``` -+ * @return {Number} -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'index', { -+ set: function(index) { -+ define(this, 'idx', index); -+ }, -+ get: function() { -+ if (!Array.isArray(this.siblings)) { -+ return -1; -+ } -+ var tok = this.idx !== -1 ? this.siblings[this.idx] : null; -+ if (tok !== this) { -+ this.idx = this.siblings.indexOf(this); -+ } -+ return this.idx; -+ } -+}); -+ -+/** -+ * Get the previous node from the siblings array or `null`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * -+ * console.log(baz.prev.type) // 'bar' -+ * ``` -+ * @return {Object} -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'prev', { -+ set: function() { -+ throw new Error('node.prev is a getter and cannot be defined'); -+ }, -+ get: function() { -+ if (Array.isArray(this.siblings)) { -+ return this.siblings[this.index - 1] || this.parent.prev; -+ } -+ return null; -+ } -+}); -+ -+/** -+ * Get the siblings array, or `null` if it doesn't exist. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * -+ * console.log(bar.siblings.length) // 2 -+ * console.log(baz.siblings.length) // 2 -+ * ``` -+ * @return {Object} -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'next', { -+ set: function() { -+ throw new Error('node.next is a getter and cannot be defined'); -+ }, -+ get: function() { -+ if (Array.isArray(this.siblings)) { -+ return this.siblings[this.index + 1] || this.parent.next; -+ } -+ return null; -+ } -+}); -+ -+/** -+ * Get the first node from `node.nodes`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * var qux = new Node({type: 'qux'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * foo.push(qux); -+ * -+ * console.log(foo.first.type) // 'bar' -+ * ``` -+ * @return {Object} The first node, or undefiend -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'first', { -+ get: function() { -+ return this.nodes ? this.nodes[0] : null; -+ } -+}); -+ -+/** -+ * Get the last node from `node.nodes`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * var qux = new Node({type: 'qux'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * foo.push(qux); -+ * -+ * console.log(foo.last.type) // 'qux' -+ * ``` -+ * @return {Object} The last node, or undefiend -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'last', { -+ get: function() { -+ return this.nodes ? utils.last(this.nodes) : null; -+ } -+}); -+ -+/** -+ * Get the last node from `node.nodes`. -+ * -+ * ```js -+ * var foo = new Node({type: 'foo'}); -+ * var bar = new Node({type: 'bar'}); -+ * var baz = new Node({type: 'baz'}); -+ * var qux = new Node({type: 'qux'}); -+ * foo.push(bar); -+ * foo.push(baz); -+ * foo.push(qux); -+ * -+ * console.log(foo.last.type) // 'qux' -+ * ``` -+ * @return {Object} The last node, or undefiend -+ * @api public -+ */ -+ -+Object.defineProperty(Node.prototype, 'scope', { -+ get: function() { -+ if (this.isScope !== true) { -+ return this.parent ? this.parent.scope : this; -+ } -+ return this; -+ } -+}); -+ -+/** -+ * Get own property names from Node prototype, but only the -+ * first time `Node` is instantiated -+ */ -+ -+function lazyKeys() { -+ if (!ownNames) { -+ ownNames = Object.getOwnPropertyNames(Node.prototype); -+ } -+} -+ -+/** -+ * Simplified assertion. Throws an error is `val` is falsey. -+ */ -+ -+function assert(val, message) { -+ if (!val) throw new Error(message); -+} -+ -+/** -+ * Expose `Node` -+ */ -+ -+exports = module.exports = Node; -+ -+}, -+"BAOEpFL9RyVGNJOb7AWBj7iHCHl0m53WRSTkB1Tdj0E=": -+function (require, module, exports, __dirname, __filename) { -+var Router = require('routes') -+var url = require('url') -+var querystring = require('querystring') -+ -+var Api = require('./api') -+ -+module.exports = function (osm, media, opts) { -+ var router = Router() -+ var api = Api(osm, media, opts) -+ -+ // Device -+ router.addRoute('GET /device/id', api.deviceId.bind(api)) -+ -+ // Observations -+ router.addRoute('GET /observations', api.observationList.bind(api)) -+ router.addRoute('GET /observations/:id', api.observationGet.bind(api)) -+ router.addRoute('POST /observations', api.observationCreate.bind(api)) -+ router.addRoute('PUT /observations/:id', api.observationUpdate.bind(api)) -+ router.addRoute('DELETE /observations/:id', api.observationDelete.bind(api)) -+ router.addRoute('PUT /observations/to-element/:id', api.observationConvert.bind(api)) -+ -+ // Presets -+ router.addRoute('GET /presets', api.presetsList.bind(api)) -+ router.addRoute('GET /presets/:id/*', api.presetsGet.bind(api)) -+ -+ // Media -+ router.addRoute('GET /media/:type/:id', api.mediaGet.bind(api)) -+ router.addRoute('POST /media', api.mediaPost.bind(api)) -+ -+ // Styles 'n Tiles -+ router.addRoute('GET /styles', api.stylesList.bind(api)) -+ router.addRoute('GET /styles/:id/tiles/:tileid/:z/:y/:x.:ext', -+ api.stylesGet.bind(api)) -+ router.addRoute('GET /styles/:id/tiles/:tileid/:z/:y/:x', -+ api.stylesGet.bind(api)) -+ -+ // Here, id is assumed to be the same as tileid -+ router.addRoute('GET /styles/:id/tiles/:z/:y/:x.:ext', -+ api.stylesGet.bind(api)) -+ router.addRoute('GET /styles/:id/tiles/:z/:y/:x', -+ api.stylesGet.bind(api)) -+ -+ router.addRoute('GET /styles/:id/style.json', api.stylesGetStyle.bind(api)) -+ router.addRoute('GET /styles/:id/*', api.stylesGetStatic.bind(api)) -+ -+ // Sync -+ router.addRoute('GET /sync/start', api.syncStart.bind(api)) -+ router.addRoute('GET /sync/peers', api.syncPeers.bind(api)) -+ router.addRoute('GET /sync/listen', api.syncListen.bind(api)) -+ router.addRoute('GET /sync/destroy', api.syncDestroy.bind(api)) -+ router.addRoute('GET /sync/join', api.syncJoin.bind(api)) -+ router.addRoute('GET /sync/leave', api.syncLeave.bind(api)) -+ -+ return { -+ api, -+ handle: function (req, res) { -+ var parsed = url.parse(req.url) // eslint-disable-line node/no-deprecated-api -+ var q = querystring.parse(parsed.query) -+ var m = router.match(req.method + ' ' + parsed.pathname) -+ if (m) { -+ m.fn(req, res, m.params, q) -+ return true -+ } else { -+ return false -+ } -+ } -+ } -+} -+ -+}, -+"BB9wtupHk2ZiQMPhlD5pgoCuFL9O5BRZKfQmiX4qoeU=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function( -+ Promise, PromiseArray, tryConvertToPromise, apiRejection) { -+var util = require("./util"); -+var isObject = util.isObject; -+var es5 = require("./es5"); -+var Es6Map; -+if (typeof Map === "function") Es6Map = Map; -+ -+var mapToEntries = (function() { -+ var index = 0; -+ var size = 0; -+ -+ function extractEntry(value, key) { -+ this[index] = value; -+ this[index + size] = key; -+ index++; -+ } -+ -+ return function mapToEntries(map) { -+ size = map.size; -+ index = 0; -+ var ret = new Array(map.size * 2); -+ map.forEach(extractEntry, ret); -+ return ret; -+ }; -+})(); -+ -+var entriesToMap = function(entries) { -+ var ret = new Es6Map(); -+ var length = entries.length / 2 | 0; -+ for (var i = 0; i < length; ++i) { -+ var key = entries[length + i]; -+ var value = entries[i]; -+ ret.set(key, value); -+ } -+ return ret; -+}; -+ -+function PropertiesPromiseArray(obj) { -+ var isMap = false; -+ var entries; -+ if (Es6Map !== undefined && obj instanceof Es6Map) { -+ entries = mapToEntries(obj); -+ isMap = true; -+ } else { -+ var keys = es5.keys(obj); -+ var len = keys.length; -+ entries = new Array(len * 2); -+ for (var i = 0; i < len; ++i) { -+ var key = keys[i]; -+ entries[i] = obj[key]; -+ entries[i + len] = key; -+ } -+ } -+ this.constructor$(entries); -+ this._isMap = isMap; -+ this._init$(undefined, isMap ? -6 : -3); -+} -+util.inherits(PropertiesPromiseArray, PromiseArray); -+ -+PropertiesPromiseArray.prototype._init = function () {}; -+ -+PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { -+ this._values[index] = value; -+ var totalResolved = ++this._totalResolved; -+ if (totalResolved >= this._length) { -+ var val; -+ if (this._isMap) { -+ val = entriesToMap(this._values); -+ } else { -+ val = {}; -+ var keyOffset = this.length(); -+ for (var i = 0, len = this.length(); i < len; ++i) { -+ val[this._values[i + keyOffset]] = this._values[i]; -+ } -+ } -+ this._resolve(val); -+ return true; -+ } -+ return false; -+}; -+ -+PropertiesPromiseArray.prototype.shouldCopyValues = function () { -+ return false; -+}; -+ -+PropertiesPromiseArray.prototype.getActualLength = function (len) { -+ return len >> 1; -+}; -+ -+function props(promises) { -+ var ret; -+ var castValue = tryConvertToPromise(promises); -+ -+ if (!isObject(castValue)) { -+ return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } else if (castValue instanceof Promise) { -+ ret = castValue._then( -+ Promise.props, undefined, undefined, undefined, undefined); -+ } else { -+ ret = new PropertiesPromiseArray(castValue).promise(); -+ } -+ -+ if (castValue instanceof Promise) { -+ ret._propagateFrom(castValue, 2); -+ } -+ return ret; -+} -+ -+Promise.prototype.props = function () { -+ return props(this); -+}; -+ -+Promise.props = function (promises) { -+ return props(promises); -+}; -+}; -+ -+}, -+"BFCHEl/beRx0OFD3F6L2QJFXfN1ljPidFpkhxl/LH4I=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise) { -+var util = require("./util"); -+var async = Promise._async; -+var tryCatch = util.tryCatch; -+var errorObj = util.errorObj; -+ -+function spreadAdapter(val, nodeback) { -+ var promise = this; -+ if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); -+ var ret = -+ tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); -+ if (ret === errorObj) { -+ async.throwLater(ret.e); -+ } -+} -+ -+function successAdapter(val, nodeback) { -+ var promise = this; -+ var receiver = promise._boundValue(); -+ var ret = val === undefined -+ ? tryCatch(nodeback).call(receiver, null) -+ : tryCatch(nodeback).call(receiver, null, val); -+ if (ret === errorObj) { -+ async.throwLater(ret.e); -+ } -+} -+function errorAdapter(reason, nodeback) { -+ var promise = this; -+ if (!reason) { -+ var newReason = new Error(reason + ""); -+ newReason.cause = reason; -+ reason = newReason; -+ } -+ var ret = tryCatch(nodeback).call(promise._boundValue(), reason); -+ if (ret === errorObj) { -+ async.throwLater(ret.e); -+ } -+} -+ -+Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, -+ options) { -+ if (typeof nodeback == "function") { -+ var adapter = successAdapter; -+ if (options !== undefined && Object(options).spread) { -+ adapter = spreadAdapter; -+ } -+ this._then( -+ adapter, -+ errorAdapter, -+ undefined, -+ this, -+ nodeback -+ ); -+ } -+ return this; -+}; -+}; -+ -+}, -+"BJhvFouPFvTyUjfQYIzfV7bKFPEA/tYsApW9olWasks=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = extend -+ -+var hasOwnProperty = Object.prototype.hasOwnProperty; -+ -+function extend() { -+ var target = {} -+ -+ for (var i = 0; i < arguments.length; i++) { -+ var source = arguments[i] -+ -+ for (var key in source) { -+ if (hasOwnProperty.call(source, key)) { -+ target[key] = source[key] -+ } -+ } -+ } -+ -+ return target -+} -+ -+}, -+"BNbJjedNKbypQdsKiYVo9dA5+b6VNm1eKjckIWfdUak=": -+function (require, module, exports, __dirname, __filename) { -+try { -+ if (process.env.SODIUM_NATIVE === 'disable') throw new Error('Use sodium-javascript') -+ module.exports = require('sodium-native') -+} catch (err) { -+ module.exports = require('sodium-javascript') -+} -+ -+}, -+"BRK5UfrAX9OlSPGIElImT3fuH3XdYBZ00epEe+2xB84=": -+function (require, module, exports, __dirname, __filename) { -+var varint = require('varint') -+var stream = require('readable-stream') -+var util = require('util') -+var bufferAlloc = require('buffer-alloc-unsafe') -+ -+var Decoder = function (opts) { -+ if (!(this instanceof Decoder)) return new Decoder(opts) -+ stream.Transform.call(this) -+ -+ this._destroyed = false -+ this._missing = 0 -+ this._message = null -+ this._limit = opts && opts.limit || 0 -+ this._allowEmpty = !!(opts && opts.allowEmpty) -+ this._prefix = bufferAlloc(this._limit ? varint.encodingLength(this._limit) : 100) -+ this._ptr = 0 -+ -+ if (this._allowEmpty) { -+ this._readableState.highWaterMark = 16 -+ this._readableState.objectMode = true -+ } -+} -+ -+util.inherits(Decoder, stream.Transform) -+ -+Decoder.prototype._push = function (message) { -+ this._ptr = 0 -+ this._missing = 0 -+ this._message = null -+ this.push(message) -+} -+ -+Decoder.prototype._parseLength = function (data, offset) { -+ for (offset; offset < data.length; offset++) { -+ if (this._ptr >= this._prefix.length) return this._prefixError(data) -+ this._prefix[this._ptr++] = data[offset] -+ if (!(data[offset] & 0x80)) { -+ this._missing = varint.decode(this._prefix) -+ if (this._limit && this._missing > this._limit) return this._prefixError(data) -+ if (!this._missing && this._allowEmpty) this._push(bufferAlloc(0)) -+ this._ptr = 0 -+ return offset + 1 -+ } -+ } -+ return data.length -+} -+ -+Decoder.prototype._prefixError = function (data) { -+ this.destroy(new Error('Message is larger than max length')) -+ return data.length -+} -+ -+Decoder.prototype._parseMessage = function (data, offset) { -+ var free = data.length - offset -+ var missing = this._missing -+ -+ if (!this._message) { -+ if (missing <= free) { // fast track - no copy -+ this._push(data.slice(offset, offset + missing)) -+ return offset + missing -+ } -+ this._message = bufferAlloc(missing) -+ } -+ -+ // TODO: add opt-in "partial mode" to completely avoid copys -+ data.copy(this._message, this._ptr, offset, offset + missing) -+ -+ if (missing <= free) { -+ this._push(this._message) -+ return offset + missing -+ } -+ -+ this._missing -= free -+ this._ptr += free -+ -+ return data.length -+} -+ -+Decoder.prototype._transform = function (data, enc, cb) { -+ var offset = 0 -+ -+ while (!this._destroyed && offset < data.length) { -+ if (this._missing) offset = this._parseMessage(data, offset) -+ else offset = this._parseLength(data, offset) -+ } -+ -+ cb() -+} -+ -+Decoder.prototype.destroy = function (err) { -+ if (this._destroyed) return -+ this._destroyed = true -+ if (err) this.emit('error', err) -+ this.emit('close') -+} -+ -+module.exports = Decoder -+ -+}, -+"BaV3TdSi2TnKCPgwCFNxAy43v0c3uMIKC7vpQ6CviZs=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const codegen_1 = require("../../compile/codegen"); -+const util_1 = require("../../compile/util"); -+const error = { -+ message: "property name must be valid", -+ params: ({ params }) => codegen_1._ `{propertyName: ${params.propertyName}}`, -+}; -+const def = { -+ keyword: "propertyNames", -+ type: "object", -+ schemaType: ["object", "boolean"], -+ error, -+ code(cxt) { -+ const { gen, schema, data, it } = cxt; -+ if (util_1.alwaysValidSchema(it, schema)) -+ return; -+ const valid = gen.name("valid"); -+ gen.forIn("key", data, (key) => { -+ cxt.setParams({ propertyName: key }); -+ cxt.subschema({ -+ keyword: "propertyNames", -+ data: key, -+ dataTypes: ["string"], -+ propertyName: key, -+ compositeRule: true, -+ }, valid); -+ gen.if(codegen_1.not(valid), () => { -+ cxt.error(true); -+ if (!it.allErrors) -+ gen.break(); -+ }); -+ }); -+ cxt.ok(valid); -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=propertyNames.js.map -+}, -+"BcY8RqC7QtsLRjh1Q+555lGNdyvdmEtrJMGltjbgJyc=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+ -+function objectType(o) { -+ return Object.prototype.toString.call(o).slice(8, -1).toLowerCase(); -+} -+ -+function isArray(o) { -+ return objectType(o) === 'array'; -+} -+ -+function isObject(o) { -+ return objectType(o) === 'object'; -+} -+ -+function isPrimitive(o) { -+ return o === null || ['boolean', 'number', 'string', 'undefined'].includes(objectType(o)); -+} -+ -+function isBrowser() { -+ return typeof window !== 'undefined' && typeof document !== 'undefined'; -+} -+/** -+ * map file place with resourceMap -+ * @param {Object} apkInfo // json info parsed from .apk file -+ * @param {Object} resourceMap // resourceMap -+ */ -+ -+ -+function mapInfoResource(apkInfo, resourceMap) { -+ iteratorObj(apkInfo); -+ return apkInfo; -+ -+ function iteratorObj(obj) { -+ for (var i in obj) { -+ if (isArray(obj[i])) { -+ iteratorArray(obj[i]); -+ } else if (isObject(obj[i])) { -+ iteratorObj(obj[i]); -+ } else if (isPrimitive(obj[i])) { -+ if (isResources(obj[i])) { -+ obj[i] = resourceMap[transKeyToMatchResourceMap(obj[i])]; -+ } -+ } -+ } -+ } -+ -+ function iteratorArray(array) { -+ var l = array.length; -+ -+ for (var i = 0; i < l; i++) { -+ if (isArray(array[i])) { -+ iteratorArray(array[i]); -+ } else if (isObject(array[i])) { -+ iteratorObj(array[i]); -+ } else if (isPrimitive(array[i])) { -+ if (isResources(array[i])) { -+ array[i] = resourceMap[transKeyToMatchResourceMap(array[i])]; -+ } -+ } -+ } -+ } -+ -+ function isResources(attrValue) { -+ if (!attrValue) return false; -+ -+ if (typeof attrValue !== 'string') { -+ attrValue = attrValue.toString(); -+ } -+ -+ return attrValue.indexOf('resourceId:') === 0; -+ } -+ -+ function transKeyToMatchResourceMap(resourceId) { -+ return '@' + resourceId.replace('resourceId:0x', '').toUpperCase(); -+ } -+} -+/** -+ * find .apk file's icon path from json info -+ * @param info // json info parsed from .apk file -+ */ -+ -+ -+function findApkIconPath(info) { -+ if (!info.application.icon || !info.application.icon.splice) { -+ return ''; -+ } -+ -+ var rulesMap = { -+ mdpi: 48, -+ hdpi: 72, -+ xhdpi: 96, -+ xxdpi: 144, -+ xxxhdpi: 192 -+ }; -+ var resultMap = {}; -+ var maxDpiIcon = { -+ dpi: 120, -+ icon: '' -+ }; -+ -+ var _loop = function _loop(i) { -+ info.application.icon.some(function (icon) { -+ if (icon && icon.indexOf(i) !== -1) { -+ resultMap['application-icon-' + rulesMap[i]] = icon; -+ return true; -+ } -+ }); // get the maximal size icon -+ -+ if (resultMap['application-icon-' + rulesMap[i]] && rulesMap[i] >= maxDpiIcon.dpi) { -+ maxDpiIcon.dpi = rulesMap[i]; -+ maxDpiIcon.icon = resultMap['application-icon-' + rulesMap[i]]; -+ } -+ }; -+ -+ for (var i in rulesMap) { -+ _loop(i); -+ } -+ -+ if (Object.keys(resultMap).length === 0 || !maxDpiIcon.icon) { -+ maxDpiIcon.dpi = 120; -+ maxDpiIcon.icon = info.application.icon[0] || ''; -+ resultMap['applicataion-icon-120'] = maxDpiIcon.icon; -+ } -+ -+ return maxDpiIcon.icon; -+} -+/** -+ * find .ipa file's icon path from json info -+ * @param info // json info parsed from .ipa file -+ */ -+ -+ -+function findIpaIconPath(info) { -+ if (info.CFBundleIcons && info.CFBundleIcons.CFBundlePrimaryIcon && info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles && info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles.length) { -+ return info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles[info.CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles.length - 1]; -+ } else if (info.CFBundleIconFiles && info.CFBundleIconFiles.length) { -+ return info.CFBundleIconFiles[info.CFBundleIconFiles.length - 1]; -+ } else { -+ return '.app/Icon.png'; -+ } -+} -+/** -+ * transform buffer to base64 -+ * @param {Buffer} buffer -+ */ -+ -+ -+function getBase64FromBuffer(buffer) { -+ return 'data:image/png;base64,' + buffer.toString('base64'); -+} -+/** -+ * 去除unicode空字符 -+ * @param {String} str -+ */ -+ -+ -+function decodeNullUnicode(str) { -+ if (typeof str === 'string') { -+ // eslint-disable-next-line -+ str = str.replace(/\u0000/g, ''); -+ } -+ -+ return str; -+} -+ -+module.exports = { -+ isArray: isArray, -+ isObject: isObject, -+ isPrimitive: isPrimitive, -+ isBrowser: isBrowser, -+ mapInfoResource: mapInfoResource, -+ findApkIconPath: findApkIconPath, -+ findIpaIconPath: findIpaIconPath, -+ getBase64FromBuffer: getBase64FromBuffer, -+ decodeNullUnicode: decodeNullUnicode -+}; -+}, -+"Bd7Im6+rABM1V5XDCYwqwCMnqaaUuuyWswxMLHlLyYc=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * map-cache -+ * -+ * Copyright (c) 2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var hasOwn = Object.prototype.hasOwnProperty; -+ -+/** -+ * Expose `MapCache` -+ */ -+ -+module.exports = MapCache; -+ -+/** -+ * Creates a cache object to store key/value pairs. -+ * -+ * ```js -+ * var cache = new MapCache(); -+ * ``` -+ * -+ * @api public -+ */ -+ -+function MapCache(data) { -+ this.__data__ = data || {}; -+} -+ -+/** -+ * Adds `value` to `key` on the cache. -+ * -+ * ```js -+ * cache.set('foo', 'bar'); -+ * ``` -+ * -+ * @param {String} `key` The key of the value to cache. -+ * @param {*} `value` The value to cache. -+ * @returns {Object} Returns the `Cache` object for chaining. -+ * @api public -+ */ -+ -+MapCache.prototype.set = function mapSet(key, value) { -+ if (key !== '__proto__') { -+ this.__data__[key] = value; -+ } -+ return this; -+}; -+ -+/** -+ * Gets the cached value for `key`. -+ * -+ * ```js -+ * cache.get('foo'); -+ * //=> 'bar' -+ * ``` -+ * -+ * @param {String} `key` The key of the value to get. -+ * @returns {*} Returns the cached value. -+ * @api public -+ */ -+ -+MapCache.prototype.get = function mapGet(key) { -+ return key === '__proto__' ? undefined : this.__data__[key]; -+}; -+ -+/** -+ * Checks if a cached value for `key` exists. -+ * -+ * ```js -+ * cache.has('foo'); -+ * //=> true -+ * ``` -+ * -+ * @param {String} `key` The key of the entry to check. -+ * @returns {Boolean} Returns `true` if an entry for `key` exists, else `false`. -+ * @api public -+ */ -+ -+MapCache.prototype.has = function mapHas(key) { -+ return key !== '__proto__' && hasOwn.call(this.__data__, key); -+}; -+ -+/** -+ * Removes `key` and its value from the cache. -+ * -+ * ```js -+ * cache.del('foo'); -+ * ``` -+ * @title .del -+ * @param {String} `key` The key of the value to remove. -+ * @returns {Boolean} Returns `true` if the entry was removed successfully, else `false`. -+ * @api public -+ */ -+ -+MapCache.prototype.del = function mapDelete(key) { -+ return this.has(key) && delete this.__data__[key]; -+}; -+ -+}, -+"BdTvMgHcJRZ69G9/6UvUNV6uD3+ZsL1ur8akbETaLTk=": -+function (require, module, exports, __dirname, __filename) { -+var blake2b = require('blake2b') -+ -+module.exports.crypto_generichash_PRIMITIVE = 'blake2b' -+module.exports.crypto_generichash_BYTES_MIN = blake2b.BYTES_MIN -+module.exports.crypto_generichash_BYTES_MAX = blake2b.BYTES_MAX -+module.exports.crypto_generichash_BYTES = blake2b.BYTES -+module.exports.crypto_generichash_KEYBYTES_MIN = blake2b.KEYBYTES_MIN -+module.exports.crypto_generichash_KEYBYTES_MAX = blake2b.KEYBYTES_MAX -+module.exports.crypto_generichash_KEYBYTES = blake2b.KEYBYTES -+module.exports.crypto_generichash_WASM_SUPPORTED = blake2b.WASM_SUPPORTED -+module.exports.crypto_generichash_WASM_LOADED = false -+ -+module.exports.crypto_generichash = function (output, input, key) { -+ blake2b(output.length, key).update(input).final(output) -+} -+ -+module.exports.crypto_generichash_ready = blake2b.ready -+ -+module.exports.crypto_generichash_batch = function (output, inputArray, key) { -+ var ctx = blake2b(output.length, key) -+ for (var i = 0; i < inputArray.length; i++) { -+ ctx.update(inputArray[i]) -+ } -+ ctx.final(output) -+} -+ -+module.exports.crypto_generichash_instance = function (key, outlen) { -+ if (outlen == null) outlen = module.exports.crypto_generichash_BYTES -+ return blake2b(outlen, key) -+} -+ -+blake2b.ready(function (err) { -+ module.exports.crypto_generichash_WASM_LOADED = blake2b.WASM_LOADED -+}) -+ -+}, -+"BfAq/j4QX5evjFxsGyncOI1/9xyYAcFJWhPcNNvhFfA=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs'); -+var util = require('util'); -+var stream = require('stream'); -+var Readable = stream.Readable; -+var Writable = stream.Writable; -+var PassThrough = stream.PassThrough; -+var Pend = require('pend'); -+var EventEmitter = require('events').EventEmitter; -+ -+exports.createFromBuffer = createFromBuffer; -+exports.createFromFd = createFromFd; -+exports.BufferSlicer = BufferSlicer; -+exports.FdSlicer = FdSlicer; -+ -+util.inherits(FdSlicer, EventEmitter); -+function FdSlicer(fd, options) { -+ options = options || {}; -+ EventEmitter.call(this); -+ -+ this.fd = fd; -+ this.pend = new Pend(); -+ this.pend.max = 1; -+ this.refCount = 0; -+ this.autoClose = !!options.autoClose; -+} -+ -+FdSlicer.prototype.read = function(buffer, offset, length, position, callback) { -+ var self = this; -+ self.pend.go(function(cb) { -+ fs.read(self.fd, buffer, offset, length, position, function(err, bytesRead, buffer) { -+ cb(); -+ callback(err, bytesRead, buffer); -+ }); -+ }); -+}; -+ -+FdSlicer.prototype.write = function(buffer, offset, length, position, callback) { -+ var self = this; -+ self.pend.go(function(cb) { -+ fs.write(self.fd, buffer, offset, length, position, function(err, written, buffer) { -+ cb(); -+ callback(err, written, buffer); -+ }); -+ }); -+}; -+ -+FdSlicer.prototype.createReadStream = function(options) { -+ return new ReadStream(this, options); -+}; -+ -+FdSlicer.prototype.createWriteStream = function(options) { -+ return new WriteStream(this, options); -+}; -+ -+FdSlicer.prototype.ref = function() { -+ this.refCount += 1; -+}; -+ -+FdSlicer.prototype.unref = function() { -+ var self = this; -+ self.refCount -= 1; -+ -+ if (self.refCount > 0) return; -+ if (self.refCount < 0) throw new Error("invalid unref"); -+ -+ if (self.autoClose) { -+ fs.close(self.fd, onCloseDone); -+ } -+ -+ function onCloseDone(err) { -+ if (err) { -+ self.emit('error', err); -+ } else { -+ self.emit('close'); -+ } -+ } -+}; -+ -+util.inherits(ReadStream, Readable); -+function ReadStream(context, options) { -+ options = options || {}; -+ Readable.call(this, options); -+ -+ this.context = context; -+ this.context.ref(); -+ -+ this.start = options.start || 0; -+ this.endOffset = options.end; -+ this.pos = this.start; -+ this.destroyed = false; -+} -+ -+ReadStream.prototype._read = function(n) { -+ var self = this; -+ if (self.destroyed) return; -+ -+ var toRead = Math.min(self._readableState.highWaterMark, n); -+ if (self.endOffset != null) { -+ toRead = Math.min(toRead, self.endOffset - self.pos); -+ } -+ if (toRead <= 0) { -+ self.destroyed = true; -+ self.push(null); -+ self.context.unref(); -+ return; -+ } -+ self.context.pend.go(function(cb) { -+ if (self.destroyed) return cb(); -+ var buffer = new Buffer(toRead); -+ fs.read(self.context.fd, buffer, 0, toRead, self.pos, function(err, bytesRead) { -+ if (err) { -+ self.destroy(err); -+ } else if (bytesRead === 0) { -+ self.destroyed = true; -+ self.push(null); -+ self.context.unref(); -+ } else { -+ self.pos += bytesRead; -+ self.push(buffer.slice(0, bytesRead)); -+ } -+ cb(); -+ }); -+ }); -+}; -+ -+ReadStream.prototype.destroy = function(err) { -+ if (this.destroyed) return; -+ err = err || new Error("stream destroyed"); -+ this.destroyed = true; -+ this.emit('error', err); -+ this.context.unref(); -+}; -+ -+util.inherits(WriteStream, Writable); -+function WriteStream(context, options) { -+ options = options || {}; -+ Writable.call(this, options); -+ -+ this.context = context; -+ this.context.ref(); -+ -+ this.start = options.start || 0; -+ this.endOffset = (options.end == null) ? Infinity : +options.end; -+ this.bytesWritten = 0; -+ this.pos = this.start; -+ this.destroyed = false; -+ -+ this.on('finish', this.destroy.bind(this)); -+} -+ -+WriteStream.prototype._write = function(buffer, encoding, callback) { -+ var self = this; -+ if (self.destroyed) return; -+ -+ if (self.pos + buffer.length > self.endOffset) { -+ var err = new Error("maximum file length exceeded"); -+ err.code = 'ETOOBIG'; -+ self.destroy(); -+ callback(err); -+ return; -+ } -+ self.context.pend.go(function(cb) { -+ if (self.destroyed) return cb(); -+ fs.write(self.context.fd, buffer, 0, buffer.length, self.pos, function(err, bytes) { -+ if (err) { -+ self.destroy(); -+ cb(); -+ callback(err); -+ } else { -+ self.bytesWritten += bytes; -+ self.pos += bytes; -+ self.emit('progress'); -+ cb(); -+ callback(); -+ } -+ }); -+ }); -+}; -+ -+WriteStream.prototype.destroy = function() { -+ if (this.destroyed) return; -+ this.destroyed = true; -+ this.context.unref(); -+}; -+ -+util.inherits(BufferSlicer, EventEmitter); -+function BufferSlicer(buffer, options) { -+ EventEmitter.call(this); -+ -+ options = options || {}; -+ this.refCount = 0; -+ this.buffer = buffer; -+ this.maxChunkSize = options.maxChunkSize || Number.MAX_SAFE_INTEGER; -+} -+ -+BufferSlicer.prototype.read = function(buffer, offset, length, position, callback) { -+ var end = position + length; -+ var delta = end - this.buffer.length; -+ var written = (delta > 0) ? delta : length; -+ this.buffer.copy(buffer, offset, position, end); -+ setImmediate(function() { -+ callback(null, written); -+ }); -+}; -+ -+BufferSlicer.prototype.write = function(buffer, offset, length, position, callback) { -+ buffer.copy(this.buffer, position, offset, offset + length); -+ setImmediate(function() { -+ callback(null, length, buffer); -+ }); -+}; -+ -+BufferSlicer.prototype.createReadStream = function(options) { -+ options = options || {}; -+ var readStream = new PassThrough(options); -+ readStream.destroyed = false; -+ readStream.start = options.start || 0; -+ readStream.endOffset = options.end; -+ // by the time this function returns, we'll be done. -+ readStream.pos = readStream.endOffset || this.buffer.length; -+ -+ // respect the maxChunkSize option to slice up the chunk into smaller pieces. -+ var entireSlice = this.buffer.slice(readStream.start, readStream.pos); -+ var offset = 0; -+ while (true) { -+ var nextOffset = offset + this.maxChunkSize; -+ if (nextOffset >= entireSlice.length) { -+ // last chunk -+ if (offset < entireSlice.length) { -+ readStream.write(entireSlice.slice(offset, entireSlice.length)); -+ } -+ break; -+ } -+ readStream.write(entireSlice.slice(offset, nextOffset)); -+ offset = nextOffset; -+ } -+ -+ readStream.end(); -+ readStream.destroy = function() { -+ readStream.destroyed = true; -+ }; -+ return readStream; -+}; -+ -+BufferSlicer.prototype.createWriteStream = function(options) { -+ var bufferSlicer = this; -+ options = options || {}; -+ var writeStream = new Writable(options); -+ writeStream.start = options.start || 0; -+ writeStream.endOffset = (options.end == null) ? this.buffer.length : +options.end; -+ writeStream.bytesWritten = 0; -+ writeStream.pos = writeStream.start; -+ writeStream.destroyed = false; -+ writeStream._write = function(buffer, encoding, callback) { -+ if (writeStream.destroyed) return; -+ -+ var end = writeStream.pos + buffer.length; -+ if (end > writeStream.endOffset) { -+ var err = new Error("maximum file length exceeded"); -+ err.code = 'ETOOBIG'; -+ writeStream.destroyed = true; -+ callback(err); -+ return; -+ } -+ buffer.copy(bufferSlicer.buffer, writeStream.pos, 0, buffer.length); -+ -+ writeStream.bytesWritten += buffer.length; -+ writeStream.pos = end; -+ writeStream.emit('progress'); -+ callback(); -+ }; -+ writeStream.destroy = function() { -+ writeStream.destroyed = true; -+ }; -+ return writeStream; -+}; -+ -+BufferSlicer.prototype.ref = function() { -+ this.refCount += 1; -+}; -+ -+BufferSlicer.prototype.unref = function() { -+ this.refCount -= 1; -+ -+ if (this.refCount < 0) { -+ throw new Error("invalid unref"); -+ } -+}; -+ -+function createFromBuffer(buffer, options) { -+ return new BufferSlicer(buffer, options); -+} -+ -+function createFromFd(fd, options) { -+ return new FdSlicer(fd, options); -+} -+ -+}, -+"BiEY9atjIUdHNqNOhcB34cANf7aWZ37epnB3FdFZCYk=": -+function (require, module, exports, __dirname, __filename) { -+var SingleTarball = require('./single') -+var MultiTarball = require('./multi') -+ -+module.exports = IndexedTarball -+ -+function IndexedTarball (filepath, opts) { -+ if (!(this instanceof IndexedTarball)) return new IndexedTarball(filepath, opts) -+ opts = opts || {} -+ -+ var impl -+ if (opts.multifile) impl = new MultiTarball(filepath, opts) -+ else impl = new SingleTarball(filepath, opts) -+ -+ this.impl = impl -+} -+ -+IndexedTarball.prototype.append = function (filepath, size, cb) { -+ return this.impl.append(filepath, size, cb) -+} -+ -+IndexedTarball.prototype.list = function (cb) { -+ this.impl.list(cb) -+} -+ -+IndexedTarball.prototype.read = function (filepath) { -+ return this.impl.read(filepath) -+} -+ -+IndexedTarball.prototype.pop = function (name, cb) { -+ this.impl.pop(name, cb) -+} -+ -+}, -+"BpMh+N1PkrmJMP0OfHDTCe0lbSzegoExypmxx5qixxk=": -+function (require, module, exports, __dirname, __filename) { -+var lpstream = require('length-prefixed-stream') -+var duplexify = require('duplexify') -+var collect = require('collect-stream') -+var missing = require('./missing') -+var debug = require('debug')('blob-store-replication-stream') -+ -+function noop () {} -+ -+module.exports = function (store, opts) { -+ opts = opts || {} -+ var ID = Math.round(Math.random() * 50) -+ -+ var filesToXfer = 0 -+ var filesXferred = 0 -+ -+ var encoder = lpstream.encode() -+ var decoder = lpstream.decode({allowEmpty:true}) -+ -+ var dup = duplexify(decoder, encoder) -+ var localHaves = null -+ var remoteHaves = null -+ -+ var state = 'wait-remote-haves' -+ var numFilesToRecv = null -+ var pendingFilename = null -+ var filesSent = false -+ var remoteDone = false -+ var localDone = false -+ -+ // sync -+ // 1. send your haves -+ // 2. await their haves -+ // 3. figure out what you want from them -+ // 4. send your wants -+ // 5. await their wants -+ // 6. get their wants and start sending them (# of entries, then entries) -+ -+ // pull -+ // 1. await their haves -+ // 2. send your haves (just the ones you have in common) -+ // 3. figure out what you want from them (everything you don't have) -+ // 4. send your wants -+ // 5. await their wants -+ // 6. get their wants and start sending them (# of entries, then entries) -+ -+ // push -+ // 1. await their haves -+ // 2. send your haves -+ // 3. figure out what you want from them (always nothing) -+ // 4. send your wants -+ // 5. await their wants -+ // 6. get their wants and start sending them (# of entries, then entries) -+ -+ function onData (data) { -+ if (data.toString() === '"done"') { -+ debug(''+ID, 'remote done') -+ remoteDone = true -+ } -+ switch (state) { -+ case 'wait-remote-haves': -+ state = 'wait-remote-wants' -+ decoder.pause() -+ handleRemoteHaves(data) -+ sendWants() -+ decoder.resume() -+ break -+ case 'wait-remote-wants': -+ state = 'wait-remote-files-length' -+ var remoteWants = handleRemoteWants(data) -+ filesToXfer += remoteWants.length -+ sendRequested(remoteWants, function () { -+ debug('' + ID, 'ALL SENT') -+ filesSent = true -+ if (numFilesToRecv === 0) terminate() -+ }) -+ break -+ case 'wait-remote-files-length': -+ state = 'wait-remote-file-name' -+ numFilesToRecv = Number(JSON.parse(data.toString())) -+ debug(''+ID, 'got # of remote files incoming', numFilesToRecv) -+ if (numFilesToRecv === 0 && filesSent) terminate() -+ break -+ case 'wait-remote-file-name': -+ state = 'wait-remote-file-data' -+ pendingFilename = data.toString() -+ debug(''+ID, 'got a filename', pendingFilename) -+ break -+ case 'wait-remote-file-data': -+ var fn = pendingFilename -+ debug(''+ID, 'recving a remote file', fn) -+ decoder.pause() -+ var ws = store.createWriteStream(fn, function (err) { -+ if (err) return dup.emit('error', err) -+ filesXferred++ -+ emitProgress() -+ decoder.resume() -+ debug(''+ID, 'recv\'d a remote file', fn) -+ if (--numFilesToRecv === 0) { -+ debug('' + ID, 'ALL RECEIVED') -+ if (filesSent) terminate() -+ } -+ }) -+ ws.end(data) -+ -+ if (numFilesToRecv <= 1) state = 'wait-remote-done' -+ else state = 'wait-remote-file-name' -+ break -+ case 'wait-remote-done': -+ if (numFilesToRecv > 0 || !filesSent) break -+ if (data.toString() === '"done"') { -+ terminate() -+ } else { -+ console.error('unexpected msg', data) -+ } -+ break -+ } -+ } -+ -+ function terminate () { -+ if (remoteDone) { -+ debug('' + ID, 'replication done') -+ debug('' + ID, 'TERMINATING') -+ // TODO: terminate replication -+ if (!localDone) encoder.write(JSON.stringify('done')) -+ encoder.end() -+ } else { -+ encoder.write(JSON.stringify('done')) -+ debug('' + ID, 'waiting for remote done') -+ state = 'wait-remote-done' -+ } -+ localDone = true -+ } -+ -+ ;(store.list || store._list).call(store, function (err, names) { -+ if (err) return dup.emit('error', err) -+ else { -+ if (opts.filter) names = names.filter(opts.filter) -+ debug('' + ID, 'lhave', names) -+ localHaves = names -+ -+ // Defer on sending haves if in pull-only mode -+ if (opts.mode !== 'pull') sendHaves() -+ -+ // begin reading -+ decoder.on('data', onData) -+ } -+ }) -+ -+ function sendHaves () { -+ // send local haves -+ debug('' + ID, 'sent local haves') -+ encoder.write(JSON.stringify(localHaves)) -+ } -+ -+ function handleRemoteHaves (data) { -+ debug('' + ID, 'got remote haves', data.toString()) -+ remoteHaves = JSON.parse(data.toString()) -+ -+ // In push mode: deduplicate the entries both sides have in common; just -+ // ask for the ones missing from the local store -+ if (opts.mode === 'pull') { -+ localHaves = intersect(localHaves, remoteHaves) -+ sendHaves() -+ } -+ } -+ -+ function sendWants () { -+ // send local wants -+ var wants = missing(localHaves, remoteHaves) -+ -+ // In 'push' mode, we never want anything -+ if (opts.mode === 'push') wants = [] -+ -+ filesToXfer += wants.length -+ debug('' + ID, 'wrote local wants', JSON.stringify(wants)) -+ encoder.write(JSON.stringify(wants)) -+ } -+ -+ function handleRemoteWants (data) { -+ // recv remote wants -+ debug('' + ID, 'got remote wants', data.toString()) -+ return JSON.parse(data.toString()) -+ } -+ -+ function sendRequested (toSend, done) { -+ debug('' + ID, 'writing', toSend.length) -+ encoder.write(JSON.stringify(toSend.length)) -+ debug('' + ID, 'wrote # of entries count') -+ -+ if (toSend.length === 0) return process.nextTick(done) -+ -+ function next (n) { -+ var name = toSend[n] -+ debug('' + ID, 'collecting', name) -+ // TODO: stream content from disk straight to the encoder stream -+ collect(store.createReadStream(name), function (err, data) { -+ if (err) return dup.emit('error', err) -+ var res = encoder.write(name) -+ if (data.length) res = encoder.write(data) -+ else encoder.write(Buffer.alloc(0)) -+ -+ filesXferred++ -+ emitProgress() -+ -+ debug('' + ID, 'collected + wrote', name, err, data && data.length) -+ -+ -+ if (n === toSend.length - 1) return done() -+ -+ if (!res) { -+ encoder.once('drain', function () { -+ next(n+1) -+ }) -+ } else { -+ next(n+1) -+ } -+ }) -+ } -+ next(0) -+ } -+ -+ return dup -+ -+ function emitProgress () { -+ dup.emit('progress', filesXferred, filesToXfer) -+ } -+} -+ -+// [x], [x] -> [x] -+// What is common to a and b? -+function intersect (a, b) { -+ var m = [] -+ var amap = {} -+ a.forEach(function (v) { amap[v] = true }) -+ -+ b.forEach(function (v) { -+ if (amap[v]) m.push(v) -+ }) -+ -+ return m -+} -+ -+}, -+"BtLdblp1noWLYXR8QEAXlwfcCmB7m/PeMT7bAg18gJc=": -+function (require, module, exports, __dirname, __filename) { -+var toString = Object.prototype.toString; -+ -+/** -+ * Get the native `typeof` a value. -+ * -+ * @param {*} `val` -+ * @return {*} Native javascript type -+ */ -+ -+module.exports = function kindOf(val) { -+ var type = typeof val; -+ -+ // primitivies -+ if (type === 'undefined') { -+ return 'undefined'; -+ } -+ if (val === null) { -+ return 'null'; -+ } -+ if (val === true || val === false || val instanceof Boolean) { -+ return 'boolean'; -+ } -+ if (type === 'string' || val instanceof String) { -+ return 'string'; -+ } -+ if (type === 'number' || val instanceof Number) { -+ return 'number'; -+ } -+ -+ // functions -+ if (type === 'function' || val instanceof Function) { -+ if (typeof val.constructor.name !== 'undefined' && val.constructor.name.slice(0, 9) === 'Generator') { -+ return 'generatorfunction'; -+ } -+ return 'function'; -+ } -+ -+ // array -+ if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { -+ return 'array'; -+ } -+ -+ // check for instances of RegExp and Date before calling `toString` -+ if (val instanceof RegExp) { -+ return 'regexp'; -+ } -+ if (val instanceof Date) { -+ return 'date'; -+ } -+ -+ // other objects -+ type = toString.call(val); -+ -+ if (type === '[object RegExp]') { -+ return 'regexp'; -+ } -+ if (type === '[object Date]') { -+ return 'date'; -+ } -+ if (type === '[object Arguments]') { -+ return 'arguments'; -+ } -+ if (type === '[object Error]') { -+ return 'error'; -+ } -+ if (type === '[object Promise]') { -+ return 'promise'; -+ } -+ -+ // buffer -+ if (isBuffer(val)) { -+ return 'buffer'; -+ } -+ -+ // es6: Map, WeakMap, Set, WeakSet -+ if (type === '[object Set]') { -+ return 'set'; -+ } -+ if (type === '[object WeakSet]') { -+ return 'weakset'; -+ } -+ if (type === '[object Map]') { -+ return 'map'; -+ } -+ if (type === '[object WeakMap]') { -+ return 'weakmap'; -+ } -+ if (type === '[object Symbol]') { -+ return 'symbol'; -+ } -+ -+ if (type === '[object Map Iterator]') { -+ return 'mapiterator'; -+ } -+ if (type === '[object Set Iterator]') { -+ return 'setiterator'; -+ } -+ if (type === '[object String Iterator]') { -+ return 'stringiterator'; -+ } -+ if (type === '[object Array Iterator]') { -+ return 'arrayiterator'; -+ } -+ -+ // typed arrays -+ if (type === '[object Int8Array]') { -+ return 'int8array'; -+ } -+ if (type === '[object Uint8Array]') { -+ return 'uint8array'; -+ } -+ if (type === '[object Uint8ClampedArray]') { -+ return 'uint8clampedarray'; -+ } -+ if (type === '[object Int16Array]') { -+ return 'int16array'; -+ } -+ if (type === '[object Uint16Array]') { -+ return 'uint16array'; -+ } -+ if (type === '[object Int32Array]') { -+ return 'int32array'; -+ } -+ if (type === '[object Uint32Array]') { -+ return 'uint32array'; -+ } -+ if (type === '[object Float32Array]') { -+ return 'float32array'; -+ } -+ if (type === '[object Float64Array]') { -+ return 'float64array'; -+ } -+ -+ // must be a plain object -+ return 'object'; -+}; -+ -+/** -+ * If you need to support Safari 5-7 (8-10 yr-old browser), -+ * take a look at https://github.com/feross/is-buffer -+ */ -+ -+function isBuffer(val) { -+ return val.constructor -+ && typeof val.constructor.isBuffer === 'function' -+ && val.constructor.isBuffer(val); -+} -+ -+}, -+"BwIfJmM3vlPZDBNXUiC5MKpTHceW1VImYLyC5Oy9nKY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { -+ kAvvioBoot, -+ kChildren, -+ kRoutePrefix, -+ kLogLevel, -+ kLogSerializers, -+ kHooks, -+ kSchemaController, -+ kContentTypeParser, -+ kReply, -+ kRequest, -+ kFourOhFour, -+ kPluginNameChain -+} = require('./symbols.js') -+ -+const Reply = require('./reply') -+const Request = require('./request') -+const SchemaController = require('./schema-controller') -+const ContentTypeParser = require('./contentTypeParser') -+const { buildHooks } = require('./hooks') -+const pluginUtils = require('./pluginUtils') -+ -+// Function that runs the encapsulation magic. -+// Everything that need to be encapsulated must be handled in this function. -+module.exports = function override (old, fn, opts) { -+ const shouldSkipOverride = pluginUtils.registerPlugin.call(old, fn) -+ -+ if (shouldSkipOverride) { -+ // after every plugin registration we will enter a new name -+ old[kPluginNameChain].push(pluginUtils.getDisplayName(fn)) -+ return old -+ } -+ -+ const instance = Object.create(old) -+ old[kChildren].push(instance) -+ instance.ready = old[kAvvioBoot].bind(instance) -+ instance[kChildren] = [] -+ instance[kReply] = Reply.buildReply(instance[kReply]) -+ instance[kRequest] = Request.buildRequest(instance[kRequest]) -+ instance[kContentTypeParser] = ContentTypeParser.helpers.buildContentTypeParser(instance[kContentTypeParser]) -+ instance[kHooks] = buildHooks(instance[kHooks]) -+ instance[kRoutePrefix] = buildRoutePrefix(instance[kRoutePrefix], opts.prefix) -+ instance[kLogLevel] = opts.logLevel || instance[kLogLevel] -+ instance[kSchemaController] = SchemaController.buildSchemaController(old[kSchemaController]) -+ instance.getSchema = instance[kSchemaController].getSchema.bind(instance[kSchemaController]) -+ instance.getSchemas = instance[kSchemaController].getSchemas.bind(instance[kSchemaController]) -+ instance[pluginUtils.registeredPlugins] = Object.create(instance[pluginUtils.registeredPlugins]) -+ instance[kPluginNameChain] = [pluginUtils.getPluginName(fn) || pluginUtils.getFuncPreview(fn)] -+ -+ if (instance[kLogSerializers] || opts.logSerializers) { -+ instance[kLogSerializers] = Object.assign(Object.create(instance[kLogSerializers]), opts.logSerializers) -+ } -+ -+ if (opts.prefix) { -+ instance[kFourOhFour].arrange404(instance) -+ } -+ -+ for (const hook of instance[kHooks].onRegister) hook.call(this, instance, opts) -+ -+ return instance -+} -+ -+function buildRoutePrefix (instancePrefix, pluginPrefix) { -+ if (!pluginPrefix) { -+ return instancePrefix -+ } -+ -+ // Ensure that there is a '/' between the prefixes -+ if (instancePrefix.endsWith('/') && pluginPrefix[0] === '/') { -+ // Remove the extra '/' to avoid: '/first//second' -+ pluginPrefix = pluginPrefix.slice(1) -+ } else if (pluginPrefix[0] !== '/') { -+ pluginPrefix = '/' + pluginPrefix -+ } -+ -+ return instancePrefix + pluginPrefix -+} -+ -+}, -+"ByRagnF/m/oqY7l4QoSht/xD/1/LSvKpS85fg2EdSi8=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+var pathModule = require('path'); -+var isWindows = process.platform === 'win32'; -+var fs = require('fs'); -+ -+// JavaScript implementation of realpath, ported from node pre-v6 -+ -+var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); -+ -+function rethrow() { -+ // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and -+ // is fairly slow to generate. -+ var callback; -+ if (DEBUG) { -+ var backtrace = new Error; -+ callback = debugCallback; -+ } else -+ callback = missingCallback; -+ -+ return callback; -+ -+ function debugCallback(err) { -+ if (err) { -+ backtrace.message = err.message; -+ err = backtrace; -+ missingCallback(err); -+ } -+ } -+ -+ function missingCallback(err) { -+ if (err) { -+ if (process.throwDeprecation) -+ throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs -+ else if (!process.noDeprecation) { -+ var msg = 'fs: missing callback ' + (err.stack || err.message); -+ if (process.traceDeprecation) -+ console.trace(msg); -+ else -+ console.error(msg); -+ } -+ } -+ } -+} -+ -+function maybeCallback(cb) { -+ return typeof cb === 'function' ? cb : rethrow(); -+} -+ -+var normalize = pathModule.normalize; -+ -+// Regexp that finds the next partion of a (partial) path -+// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -+if (isWindows) { -+ var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -+} else { -+ var nextPartRe = /(.*?)(?:[\/]+|$)/g; -+} -+ -+// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -+if (isWindows) { -+ var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -+} else { -+ var splitRootRe = /^[\/]*/; -+} -+ -+exports.realpathSync = function realpathSync(p, cache) { -+ // make p is absolute -+ p = pathModule.resolve(p); -+ -+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { -+ return cache[p]; -+ } -+ -+ var original = p, -+ seenLinks = {}, -+ knownHard = {}; -+ -+ // current character position in p -+ var pos; -+ // the partial path so far, including a trailing slash if any -+ var current; -+ // the partial path without a trailing slash (except when pointing at a root) -+ var base; -+ // the partial path scanned in the previous round, with slash -+ var previous; -+ -+ start(); -+ -+ function start() { -+ // Skip over roots -+ var m = splitRootRe.exec(p); -+ pos = m[0].length; -+ current = m[0]; -+ base = m[0]; -+ previous = ''; -+ -+ // On windows, check that the root exists. On unix there is no need. -+ if (isWindows && !knownHard[base]) { -+ fs.lstatSync(base); -+ knownHard[base] = true; -+ } -+ } -+ -+ // walk down the path, swapping out linked pathparts for their real -+ // values -+ // NB: p.length changes. -+ while (pos < p.length) { -+ // find the next part -+ nextPartRe.lastIndex = pos; -+ var result = nextPartRe.exec(p); -+ previous = current; -+ current += result[0]; -+ base = previous + result[1]; -+ pos = nextPartRe.lastIndex; -+ -+ // continue if not a symlink -+ if (knownHard[base] || (cache && cache[base] === base)) { -+ continue; -+ } -+ -+ var resolvedLink; -+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { -+ // some known symbolic link. no need to stat again. -+ resolvedLink = cache[base]; -+ } else { -+ var stat = fs.lstatSync(base); -+ if (!stat.isSymbolicLink()) { -+ knownHard[base] = true; -+ if (cache) cache[base] = base; -+ continue; -+ } -+ -+ // read the link if it wasn't read before -+ // dev/ino always return 0 on windows, so skip the check. -+ var linkTarget = null; -+ if (!isWindows) { -+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); -+ if (seenLinks.hasOwnProperty(id)) { -+ linkTarget = seenLinks[id]; -+ } -+ } -+ if (linkTarget === null) { -+ fs.statSync(base); -+ linkTarget = fs.readlinkSync(base); -+ } -+ resolvedLink = pathModule.resolve(previous, linkTarget); -+ // track this, if given a cache. -+ if (cache) cache[base] = resolvedLink; -+ if (!isWindows) seenLinks[id] = linkTarget; -+ } -+ -+ // resolve the link, then start over -+ p = pathModule.resolve(resolvedLink, p.slice(pos)); -+ start(); -+ } -+ -+ if (cache) cache[original] = p; -+ -+ return p; -+}; -+ -+ -+exports.realpath = function realpath(p, cache, cb) { -+ if (typeof cb !== 'function') { -+ cb = maybeCallback(cache); -+ cache = null; -+ } -+ -+ // make p is absolute -+ p = pathModule.resolve(p); -+ -+ if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { -+ return process.nextTick(cb.bind(null, null, cache[p])); -+ } -+ -+ var original = p, -+ seenLinks = {}, -+ knownHard = {}; -+ -+ // current character position in p -+ var pos; -+ // the partial path so far, including a trailing slash if any -+ var current; -+ // the partial path without a trailing slash (except when pointing at a root) -+ var base; -+ // the partial path scanned in the previous round, with slash -+ var previous; -+ -+ start(); -+ -+ function start() { -+ // Skip over roots -+ var m = splitRootRe.exec(p); -+ pos = m[0].length; -+ current = m[0]; -+ base = m[0]; -+ previous = ''; -+ -+ // On windows, check that the root exists. On unix there is no need. -+ if (isWindows && !knownHard[base]) { -+ fs.lstat(base, function(err) { -+ if (err) return cb(err); -+ knownHard[base] = true; -+ LOOP(); -+ }); -+ } else { -+ process.nextTick(LOOP); -+ } -+ } -+ -+ // walk down the path, swapping out linked pathparts for their real -+ // values -+ function LOOP() { -+ // stop if scanned past end of path -+ if (pos >= p.length) { -+ if (cache) cache[original] = p; -+ return cb(null, p); -+ } -+ -+ // find the next part -+ nextPartRe.lastIndex = pos; -+ var result = nextPartRe.exec(p); -+ previous = current; -+ current += result[0]; -+ base = previous + result[1]; -+ pos = nextPartRe.lastIndex; -+ -+ // continue if not a symlink -+ if (knownHard[base] || (cache && cache[base] === base)) { -+ return process.nextTick(LOOP); -+ } -+ -+ if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { -+ // known symbolic link. no need to stat again. -+ return gotResolvedLink(cache[base]); -+ } -+ -+ return fs.lstat(base, gotStat); -+ } -+ -+ function gotStat(err, stat) { -+ if (err) return cb(err); -+ -+ // if not a symlink, skip to the next path part -+ if (!stat.isSymbolicLink()) { -+ knownHard[base] = true; -+ if (cache) cache[base] = base; -+ return process.nextTick(LOOP); -+ } -+ -+ // stat & read the link if not read before -+ // call gotTarget as soon as the link target is known -+ // dev/ino always return 0 on windows, so skip the check. -+ if (!isWindows) { -+ var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); -+ if (seenLinks.hasOwnProperty(id)) { -+ return gotTarget(null, seenLinks[id], base); -+ } -+ } -+ fs.stat(base, function(err) { -+ if (err) return cb(err); -+ -+ fs.readlink(base, function(err, target) { -+ if (!isWindows) seenLinks[id] = target; -+ gotTarget(err, target); -+ }); -+ }); -+ } -+ -+ function gotTarget(err, target, base) { -+ if (err) return cb(err); -+ -+ var resolvedLink = pathModule.resolve(previous, target); -+ if (cache) cache[base] = resolvedLink; -+ gotResolvedLink(resolvedLink); -+ } -+ -+ function gotResolvedLink(resolvedLink) { -+ // resolve the link, then start over -+ p = pathModule.resolve(resolvedLink, p.slice(pos)); -+ start(); -+ } -+}; -+ -+}, -+"C+Fa4D4KwtHhB4UUQDZrG8Os9ZjqHiO/Tj8pHVY55Qk=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * type-name - Just a reasonable typeof -+ * -+ * https://github.com/twada/type-name -+ * -+ * Copyright (c) 2014-2016 Takuto Wada -+ * Licensed under the MIT license. -+ * https://github.com/twada/type-name/blob/master/LICENSE -+ */ -+'use strict'; -+ -+var toStr = Object.prototype.toString; -+ -+function funcName (f) { -+ if (f.name) { -+ return f.name; -+ } -+ var match = /^\s*function\s*([^\(]*)/im.exec(f.toString()); -+ return match ? match[1] : ''; -+} -+ -+function ctorName (obj) { -+ var strName = toStr.call(obj).slice(8, -1); -+ if ((strName === 'Object' || strName === 'Error') && obj.constructor) { -+ return funcName(obj.constructor); -+ } -+ return strName; -+} -+ -+function typeName (val) { -+ var type; -+ if (val === null) { -+ return 'null'; -+ } -+ type = typeof val; -+ if (type === 'object') { -+ return ctorName(val); -+ } -+ return type; -+} -+ -+module.exports = typeName; -+ -+}, -+"C+ivEWFI0w2zK8qtVhRef6rcmNeyvM/6G81gnHLLgj8=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.formatNames = exports.fastFormats = exports.fullFormats = void 0; -+function fmtDef(validate, compare) { -+ return { validate, compare }; -+} -+exports.fullFormats = { -+ // date: http://tools.ietf.org/html/rfc3339#section-5.6 -+ date: fmtDef(date, compareDate), -+ // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 -+ time: fmtDef(time, compareTime), -+ "date-time": fmtDef(date_time, compareDateTime), -+ // duration: https://tools.ietf.org/html/rfc3339#appendix-A -+ duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/, -+ uri, -+ "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i, -+ // uri-template: https://tools.ietf.org/html/rfc6570 -+ "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i, -+ // For the source: https://gist.github.com/dperini/729294 -+ // For test cases: https://mathiasbynens.be/demo/url-regex -+ url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu, -+ email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, -+ hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i, -+ // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html -+ ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, -+ ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i, -+ regex, -+ // uuid: http://tools.ietf.org/html/rfc4122 -+ uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i, -+ // JSON-pointer: https://tools.ietf.org/html/rfc6901 -+ // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A -+ "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/, -+ "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i, -+ // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 -+ "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/, -+ // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types -+ // byte: https://github.com/miguelmota/is-base64 -+ byte: /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm, -+ // signed 32 bit integer -+ int32: { type: "number", validate: validateInt32 }, -+ // signed 64 bit integer -+ int64: { type: "number", validate: validateInt64 }, -+ // C-type float -+ float: { type: "number", validate: validateNumber }, -+ // C-type double -+ double: { type: "number", validate: validateNumber }, -+ // hint to the UI to hide input strings -+ password: true, -+ // unchecked string payload -+ binary: true, -+}; -+exports.fastFormats = { -+ ...exports.fullFormats, -+ date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate), -+ time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareTime), -+ "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime), -+ // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js -+ uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, -+ "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, -+ // email (sources from jsen validator): -+ // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 -+ // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation') -+ email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, -+}; -+exports.formatNames = Object.keys(exports.fullFormats); -+function isLeapYear(year) { -+ // https://tools.ietf.org/html/rfc3339#appendix-C -+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); -+} -+const DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/; -+const DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; -+function date(str) { -+ // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 -+ const matches = DATE.exec(str); -+ if (!matches) -+ return false; -+ const year = +matches[1]; -+ const month = +matches[2]; -+ const day = +matches[3]; -+ return (month >= 1 && -+ month <= 12 && -+ day >= 1 && -+ day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month])); -+} -+function compareDate(d1, d2) { -+ if (!(d1 && d2)) -+ return undefined; -+ if (d1 > d2) -+ return 1; -+ if (d1 < d2) -+ return -1; -+ return 0; -+} -+const TIME = /^(\d\d):(\d\d):(\d\d)(\.\d+)?(z|[+-]\d\d(?::?\d\d)?)?$/i; -+function time(str, withTimeZone) { -+ const matches = TIME.exec(str); -+ if (!matches) -+ return false; -+ const hour = +matches[1]; -+ const minute = +matches[2]; -+ const second = +matches[3]; -+ const timeZone = matches[5]; -+ return (((hour <= 23 && minute <= 59 && second <= 59) || -+ (hour === 23 && minute === 59 && second === 60)) && -+ (!withTimeZone || timeZone !== "")); -+} -+function compareTime(t1, t2) { -+ if (!(t1 && t2)) -+ return undefined; -+ const a1 = TIME.exec(t1); -+ const a2 = TIME.exec(t2); -+ if (!(a1 && a2)) -+ return undefined; -+ t1 = a1[1] + a1[2] + a1[3] + (a1[4] || ""); -+ t2 = a2[1] + a2[2] + a2[3] + (a2[4] || ""); -+ if (t1 > t2) -+ return 1; -+ if (t1 < t2) -+ return -1; -+ return 0; -+} -+const DATE_TIME_SEPARATOR = /t|\s/i; -+function date_time(str) { -+ // http://tools.ietf.org/html/rfc3339#section-5.6 -+ const dateTime = str.split(DATE_TIME_SEPARATOR); -+ return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1], true); -+} -+function compareDateTime(dt1, dt2) { -+ if (!(dt1 && dt2)) -+ return undefined; -+ const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR); -+ const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR); -+ const res = compareDate(d1, d2); -+ if (res === undefined) -+ return undefined; -+ return res || compareTime(t1, t2); -+} -+const NOT_URI_FRAGMENT = /\/|:/; -+const URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i; -+function uri(str) { -+ // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." -+ return NOT_URI_FRAGMENT.test(str) && URI.test(str); -+} -+const MIN_INT32 = -(2 ** 31); -+const MAX_INT32 = 2 ** 31 - 1; -+function validateInt32(value) { -+ return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32; -+} -+function validateInt64(value) { -+ // JSON and javascript max Int is 2**53, so any int that passes isInteger is valid for Int64 -+ return Number.isInteger(value); -+} -+function validateNumber() { -+ return true; -+} -+const Z_ANCHOR = /[^\\]\\Z/; -+function regex(str) { -+ if (Z_ANCHOR.test(str)) -+ return false; -+ try { -+ new RegExp(str); -+ return true; -+ } -+ catch (e) { -+ return false; -+ } -+} -+//# sourceMappingURL=formats.js.map -+}, -+"C6JMNaWD81lu+bcpgprszO1qTPKfAMpdaGYfCbFn1N0=": -+function (require, module, exports, __dirname, __filename) { -+var stream = require('readable-stream') -+var inherits = require('inherits') -+var varint = require('varint') -+var sodium = require('sodium-universal') -+var indexOf = require('sorted-indexof') -+var feed = require('./feed') -+var messages = require('./messages') -+var bufferAlloc = require('buffer-alloc-unsafe') -+var bufferFrom = require('buffer-from') -+ -+module.exports = Protocol -+ -+function Protocol (opts) { -+ if (!(this instanceof Protocol)) return new Protocol(opts) -+ if (!opts) opts = {} -+ -+ stream.Duplex.call(this) -+ var self = this -+ -+ this.id = opts.id || randomBytes(32) -+ this.live = !!opts.live -+ this.ack = !!opts.ack -+ this.userData = opts.userData || null -+ this.remoteId = null -+ this.remoteLive = false -+ this.remoteUserData = null -+ -+ this.destroyed = false -+ this.encrypted = opts.encrypt !== false -+ this.key = null -+ this.discoveryKey = null -+ this.remoteDiscoveryKey = null -+ this.feeds = [] -+ this.expectedFeeds = opts.expectedFeeds || 0 -+ this.extensions = opts.extensions || [] -+ this.remoteExtensions = null -+ this.maxFeeds = opts.maxFeeds || 256 -+ -+ this._localFeeds = [] -+ this._remoteFeeds = [] -+ this._feeds = {} -+ -+ this._nonce = null -+ this._remoteNonce = null -+ this._xor = null -+ this._remoteXor = null -+ this._needsKey = false -+ this._length = bufferAlloc(varint.encodingLength(8388608)) -+ this._missing = 0 -+ this._buf = null -+ this._pointer = 0 -+ this._data = null -+ this._start = 0 -+ this._cb = null -+ this._interval = null -+ this._keepAlive = 0 -+ this._remoteKeepAlive = 0 -+ this._maybeFinalize = maybeFinalize -+ this._utp = null -+ -+ if (opts.timeout !== 0 && opts.timeout !== false) this.setTimeout(opts.timeout || 5000, this._ontimeout) -+ this.on('finish', this.finalize) -+ this.on('pipe', this._onpipe) -+ -+ function maybeFinalize (err) { -+ if (err) return self.destroy(err) -+ if (!self.expectedFeeds) self.finalize() -+ } -+} -+ -+inherits(Protocol, stream.Duplex) -+ -+Protocol.prototype._onpipe = function (stream) { -+ if (typeof stream.setContentSize === 'function') this._utp = stream -+} -+ -+Protocol.prototype._prefinalize = function () { -+ if (!this.emit('prefinalize', this._maybeFinalize)) this.finalize() -+} -+ -+Protocol.prototype.setTimeout = function (ms, ontimeout) { -+ if (this.destroyed) return -+ if (ontimeout) this.once('timeout', ontimeout) -+ -+ var self = this -+ -+ this._keepAlive = 0 -+ this._remoteKeepAlive = 0 -+ -+ clearInterval(this._interval) -+ if (!ms) return -+ -+ this._interval = setInterval(kick, (ms / 4) | 0) -+ if (this._interval.unref) this._interval.unref() -+ -+ function kick () { -+ self._kick() -+ } -+} -+ -+Protocol.prototype.has = function (key) { -+ var hex = discoveryKey(key).toString('hex') -+ var ch = this._feeds[hex] -+ return !!ch -+} -+ -+Protocol.prototype.feed = function (key, opts) { -+ if (this.destroyed) return null -+ if (!opts) opts = {} -+ -+ var dk = opts.discoveryKey || discoveryKey(key) -+ var ch = this._feed(dk) -+ -+ if (ch.id > -1) { -+ if (opts.peer) ch.peer = opts.peer -+ return ch -+ } -+ -+ if (this._localFeeds.length >= this.maxFeeds) { -+ this._tooManyFeeds() -+ return null -+ } -+ -+ ch.id = this._localFeeds.push(ch) - 1 -+ ch.header = ch.id << 4 -+ ch.headerLength = varint.encodingLength(ch.header) -+ ch.key = key -+ ch.discoveryKey = dk -+ if (opts.peer) ch.peer = opts.peer -+ -+ this.feeds.push(ch) -+ -+ var first = !this.key -+ var feed = { -+ discoveryKey: dk, -+ nonce: null -+ } -+ -+ if (first) { -+ this.key = key -+ this.discoveryKey = dk -+ -+ if (!this._sameKey()) return null -+ -+ if (this.encrypted) { -+ feed.nonce = this._nonce = randomBytes(24) -+ this._xor = sodium.crypto_stream_xor_instance(this._nonce, this.key) -+ if (this._remoteNonce) { -+ this._remoteXor = sodium.crypto_stream_xor_instance(this._remoteNonce, this.key) -+ } -+ } -+ -+ if (this._needsKey) { -+ this._needsKey = false -+ this._resume() -+ } -+ } -+ -+ var box = encodeFeed(feed, ch.id) -+ if (!feed.nonce && this.encrypted) this._xor.update(box, box) -+ this._keepAlive = 0 -+ this.push(box) -+ -+ if (this.destroyed) return null -+ -+ if (first) { -+ ch.handshake({ -+ id: this.id, -+ live: this.live, -+ userData: this.userData, -+ extensions: this.extensions, -+ ack: this.ack -+ }) -+ } -+ -+ if (ch._buffer.length) ch._resume() -+ else ch._buffer = null -+ -+ return ch -+} -+ -+Protocol.prototype._resume = function () { -+ var self = this -+ process.nextTick(resume) -+ -+ function resume () { -+ if (!self._data) return -+ -+ var data = self._data -+ var start = self._start -+ var cb = self._cb -+ -+ self._data = null -+ self._start = 0 -+ self._cb = null -+ self._parse(data, start, cb) -+ } -+} -+ -+Protocol.prototype._kick = function () { -+ if (this._remoteKeepAlive > 4) { -+ clearInterval(this._interval) -+ this.emit('timeout') -+ return -+ } -+ -+ for (var i = 0; i < this.feeds.length; i++) { -+ var ch = this.feeds[i] -+ if (ch.peer) ch.peer.ontick() -+ else ch.emit('tick') -+ } -+ -+ this._remoteKeepAlive++ -+ -+ if (this._keepAlive > 2) { -+ this.ping() -+ this._keepAlive = 0 -+ } else { -+ this._keepAlive++ -+ } -+} -+ -+Protocol.prototype.ping = function () { -+ if (!this.key) return true -+ var ping = bufferFrom([0]) -+ if (this._xor) this._xor.update(ping, ping) -+ return this.push(ping) -+} -+ -+Protocol.prototype.destroy = function (err) { -+ if (this.destroyed) return -+ this.destroyed = true -+ if (err) this.emit('error', err) -+ this._close() -+ this.emit('close') -+} -+ -+Protocol.prototype.finalize = function () { -+ if (this.destroyed) return -+ this.destroyed = true -+ this._close() -+ this.push(null) -+} -+ -+Protocol.prototype._close = function () { -+ clearInterval(this._interval) -+ -+ var feeds = this.feeds -+ this.feeds = [] -+ for (var i = 0; i < feeds.length; i++) feeds[i]._onclose() -+ -+ if (this._xor) { -+ this._xor.final() -+ this._xor = null -+ } -+} -+ -+Protocol.prototype._read = function () { -+ // do nothing, user back-pressures -+} -+ -+Protocol.prototype._push = function (data) { -+ if (this.destroyed) return -+ this._keepAlive = 0 -+ if (this._xor) this._xor.update(data, data) -+ return this.push(data) -+} -+ -+Protocol.prototype._write = function (data, enc, cb) { -+ this._remoteKeepAlive = 0 -+ this._parse(data, 0, cb) -+} -+ -+Protocol.prototype._feed = function (dk) { -+ var hex = dk.toString('hex') -+ var ch = this._feeds[hex] -+ if (ch) return ch -+ ch = this._feeds[hex] = feed(this) -+ return ch -+} -+ -+Protocol.prototype.remoteSupports = function (name) { -+ var i = this.extensions.indexOf(name) -+ return i > -1 && !!this.remoteExtensions && this.remoteExtensions.indexOf(i) > -1 -+} -+ -+Protocol.prototype._onhandshake = function (handshake) { -+ if (this.remoteId) return -+ -+ this.remoteId = handshake.id || randomBytes(32) -+ this.remoteLive = handshake.live -+ this.remoteUserData = handshake.userData -+ this.remoteExtensions = indexOf(this.extensions, handshake.extensions) -+ this.remoteAck = handshake.ack -+ -+ this.emit('handshake') -+} -+ -+Protocol.prototype._onopen = function (id, data, start, end) { -+ var feed = decodeFeed(data, start, end) -+ -+ if (!feed) return this._badFeed() -+ -+ if (!this.remoteDiscoveryKey) { -+ this.remoteDiscoveryKey = feed.discoveryKey -+ if (!this._sameKey()) return -+ -+ if (this.encrypted && !this._remoteNonce) { -+ if (!feed.nonce) { -+ this.destroy(new Error('Remote did not include a nonce')) -+ return -+ } -+ this._remoteNonce = feed.nonce -+ } -+ -+ if (this.encrypted && this.key && !this._remoteXor) { -+ this._remoteXor = sodium.crypto_stream_xor_instance(this._remoteNonce, this.key) -+ } -+ } -+ -+ this._remoteFeeds[id] = this._feed(feed.discoveryKey) -+ this._remoteFeeds[id].remoteId = id -+ -+ this.emit('feed', feed.discoveryKey) -+} -+ -+Protocol.prototype._onmessage = function (data, start, end) { -+ if (end - start < 2) return -+ -+ var header = decodeHeader(data, start) -+ if (header === -1) return this.destroy(new Error('Remote sent invalid header')) -+ -+ start += varint.decode.bytes -+ -+ var id = header >> 4 -+ var type = header & 15 -+ -+ if (id >= this.maxFeeds) return this._tooManyFeeds() -+ while (this._remoteFeeds.length < id) this._remoteFeeds.push(null) -+ -+ var ch = this._remoteFeeds[id] -+ -+ if (type === 0) { -+ if (ch) ch._onclose() -+ return this._onopen(id, data, start, end) -+ } -+ -+ if (!ch) return this._badFeed() -+ if (type === 15) return ch._onextension(data, start, end) -+ ch._onmessage(type, data, start, end) -+} -+ -+Protocol.prototype._parse = function (data, start, cb) { -+ var decrypted = !!this._remoteXor -+ -+ if (start) { -+ data = data.slice(start) -+ start = 0 -+ } -+ -+ if (this._remoteXor) this._remoteXor.update(data, data) -+ -+ while (start < data.length && !this.destroyed) { -+ if (this._missing) start = this._parseMessage(data, start) -+ else start = this._parseLength(data, start) -+ -+ if (this._needsKey) { -+ this._data = data -+ this._start = start -+ this._cb = cb -+ return -+ } -+ -+ if (!decrypted && this._remoteXor) { -+ return this._parse(data, start, cb) -+ } -+ } -+ -+ cb() -+} -+ -+Protocol.prototype._parseMessage = function (data, start) { -+ var end = start + this._missing -+ -+ if (end <= data.length) { -+ var ret = end -+ -+ if (this._buf) { -+ data.copy(this._buf, this._pointer, start) -+ data = this._buf -+ start = 0 -+ end = data.length -+ this._buf = null -+ } -+ -+ this._missing = 0 -+ this._pointer = 0 -+ if (this.encrypted && !this.key) this._needsKey = true -+ this._onmessage(data, start, end) -+ -+ return ret -+ } -+ -+ if (!this._buf) { -+ this._buf = bufferAlloc(this._missing) -+ this._pointer = 0 -+ } -+ -+ var rem = data.length - start -+ -+ data.copy(this._buf, this._pointer, start) -+ this._pointer += rem -+ this._missing -= rem -+ -+ return data.length -+} -+ -+Protocol.prototype._parseLength = function (data, start) { -+ while (!this._missing && start < data.length) { -+ var byte = this._length[this._pointer++] = data[start++] -+ -+ if (!(byte & 0x80)) { -+ this._missing = varint.decode(this._length) -+ this._pointer = 0 -+ if (this._missing > 8388608) return this._tooBig(data.length) -+ if (this._utp) { -+ var reallyMissing = this._missing - (data.length - start) -+ if (reallyMissing > 0 && !this._needsKey) this._utp.setContentSize(reallyMissing) -+ } -+ return start -+ } -+ -+ if (this._pointer >= this._length.length) return this._tooBig(data.length) -+ } -+ -+ return start -+} -+ -+Protocol.prototype._sameKey = function () { -+ if (!this.encrypted) return true -+ if (!this.discoveryKey || !this.remoteDiscoveryKey) return true -+ if (this.remoteDiscoveryKey.toString('hex') === this.discoveryKey.toString('hex')) return true -+ this.destroy(new Error('First shared hypercore must be the same')) -+ return false -+} -+ -+Protocol.prototype._tooManyFeeds = function () { -+ this.destroy(new Error('Only ' + this.maxFeeds + ' feeds currently supported. Open a Github issue if you need more')) -+} -+ -+Protocol.prototype._tooBig = function (len) { -+ this.destroy(new Error('Remote message is larger than 8MB (max allowed)')) -+ return len -+} -+ -+Protocol.prototype._badFeed = function () { -+ this.destroy(new Error('Remote sent invalid feed message')) -+} -+ -+Protocol.prototype._ontimeout = function () { -+ this.destroy(new Error('Remote timed out')) -+} -+ -+function decodeHeader (data, start) { -+ try { -+ return varint.decode(data, start) -+ } catch (err) { -+ return -1 -+ } -+} -+ -+function decodeFeed (data, start, end) { -+ var feed = null -+ -+ try { -+ feed = messages.Feed.decode(data, start, end) -+ } catch (err) { -+ return null -+ } -+ -+ if (feed.discoveryKey.length !== 32) return null -+ if (feed.nonce && feed.nonce.length !== 24) return null -+ -+ return feed -+} -+ -+function encodeFeed (feed, id) { -+ var header = id << 4 -+ var len = varint.encodingLength(header) + messages.Feed.encodingLength(feed) -+ var box = bufferAlloc(varint.encodingLength(len) + len) -+ var offset = 0 -+ -+ varint.encode(len, box, offset) -+ offset += varint.encode.bytes -+ -+ varint.encode(header, box, offset) -+ offset += varint.encode.bytes -+ -+ messages.Feed.encode(feed, box, offset) -+ return box -+} -+ -+function discoveryKey (key) { -+ var buf = bufferAlloc(32) -+ sodium.crypto_generichash(buf, bufferFrom('hypercore'), key) -+ return buf -+} -+ -+function randomBytes (n) { -+ var buf = bufferAlloc(n) -+ sodium.randombytes_buf(buf) -+ return buf -+} -+ -+}, -+"C6uP99ixlryq58E5aBhWw20TPsKCsJjl+gojkHuDlXA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const { promisify } = require('util') -+ -+const fs = require('./wrapped-fs') -+const glob = promisify(require('glob')) -+ -+async function determineFileType (filename) { -+ const stat = await fs.lstat(filename) -+ if (stat.isFile()) { -+ return { type: 'file', stat } -+ } else if (stat.isDirectory()) { -+ return { type: 'directory', stat } -+ } else if (stat.isSymbolicLink()) { -+ return { type: 'link', stat } -+ } -+} -+ -+module.exports = async function (dir, options) { -+ const metadata = {} -+ const crawled = await glob(dir, options) -+ const results = await Promise.all(crawled.map(async filename => [filename, await determineFileType(filename)])) -+ const filenames = results.map(([filename, type]) => { -+ if (type) { -+ metadata[filename] = type -+ } -+ return filename -+ }) -+ return [filenames, metadata] -+} -+module.exports.determineFileType = determineFileType -+ -+}, -+"C8FdP19Zsn0pm38Knbyd72QMv9ExoWSToDO+MDyJops=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// Note: adler32 takes 12% for level 0 and 2% for level 6. -+// It doesn't worth to make additional optimizationa as in original. -+// Small size is preferable. -+ -+function adler32(adler, buf, len, pos) { -+ var s1 = (adler & 0xffff) |0, -+ s2 = ((adler >>> 16) & 0xffff) |0, -+ n = 0; -+ -+ while (len !== 0) { -+ // Set limit ~ twice less than 5552, to keep -+ // s2 in 31-bits, because we force signed ints. -+ // in other case %= will fail. -+ n = len > 2000 ? 2000 : len; -+ len -= n; -+ -+ do { -+ s1 = (s1 + buf[pos++]) |0; -+ s2 = (s2 + s1) |0; -+ } while (--n); -+ -+ s1 %= 65521; -+ s2 %= 65521; -+ } -+ -+ return (s1 | (s2 << 16)) |0; -+} -+ -+ -+module.exports = adler32; -+ -+}, -+"CRtl13gzdZnQFAs11TwDhgPRcy0nwzv+OeA4calpJrI=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function (xs, fn) { -+ var res = []; -+ for (var i = 0; i < xs.length; i++) { -+ var x = fn(xs[i], i); -+ if (isArray(x)) res.push.apply(res, x); -+ else res.push(x); -+ } -+ return res; -+}; -+ -+var isArray = Array.isArray || function (xs) { -+ return Object.prototype.toString.call(xs) === '[object Array]'; -+}; -+ -+}, -+"CXa3ejjhV13sEyge5Yy2d22OqTWgqxWsESN/F7349n4=": -+function (require, module, exports, __dirname, __filename) { -+module.exports.RADIUS = 6378137; -+module.exports.FLATTENING = 1/298.257223563; -+module.exports.POLAR_RADIUS = 6356752.3142; -+ -+}, -+"CfHlq1apDxyvxNN9jsnAkBsqxAABdbD2jXKJ9fQuDWU=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var toRegex = require('to-regex'); -+var regexNot = require('regex-not'); -+var cached; -+ -+/** -+ * Get the last element from `array` -+ * @param {Array} `array` -+ * @return {*} -+ */ -+ -+exports.last = function(arr) { -+ return arr[arr.length - 1]; -+}; -+ -+/** -+ * Create and cache regex to use for text nodes -+ */ -+ -+exports.createRegex = function(pattern, include) { -+ if (cached) return cached; -+ var opts = {contains: true, strictClose: false}; -+ var not = regexNot.create(pattern, opts); -+ var re; -+ -+ if (typeof include === 'string') { -+ re = toRegex('^(?:' + include + '|' + not + ')', opts); -+ } else { -+ re = toRegex(not, opts); -+ } -+ -+ return (cached = re); -+}; -+ -+}, -+"CjfLPLw5pKYJjFwwfnK1LqD40bHODIKANt92dhqs7VY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var utils = require('./utils'); -+ -+/** -+ * An object to write any content to an Uint8Array. -+ * @constructor -+ * @param {number} length The length of the array. -+ */ -+var Uint8ArrayWriter = function(length) { -+ this.data = new Uint8Array(length); -+ this.index = 0; -+}; -+Uint8ArrayWriter.prototype = { -+ /** -+ * Append any content to the current array. -+ * @param {Object} input the content to add. -+ */ -+ append: function(input) { -+ if (input.length !== 0) { -+ // with an empty Uint8Array, Opera fails with a "Offset larger than array size" -+ input = utils.transformTo("uint8array", input); -+ this.data.set(input, this.index); -+ this.index += input.length; -+ } -+ }, -+ /** -+ * Finalize the construction an return the result. -+ * @return {Uint8Array} the generated array. -+ */ -+ finalize: function() { -+ return this.data; -+ } -+}; -+ -+module.exports = Uint8ArrayWriter; -+ -+}, -+"CvsbdS7lgmvzdIlOkRHnAFfQJ9PUw0DTeIfF7QvGYGA=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "name": "multifeed", -+ "description": "multi-writer hypercore", -+ "author": "Stephen Whitmore ", -+ "version": "4.3.0", -+ "repository": { -+ "url": "git://github.com/noffle/multifeed.git" -+ }, -+ "homepage": "https://github.com/noffle/multifeed", -+ "bugs": "https://github.com/noffle/multifeed/issues", -+ "main": "index.js", -+ "scripts": { -+ "test": "tape test/*.js", -+ "lint": "standard" -+ }, -+ "keywords": [], -+ "dependencies": { -+ "debug": "^4.1.0", -+ "hypercore-protocol": "^6.8.0", -+ "inherits": "^2.0.3", -+ "mutexify": "^1.2.0", -+ "once": "^1.4.0", -+ "random-access-file": "^2.0.1", -+ "random-access-memory": "^3.1.1", -+ "through2": "^3.0.0" -+ }, -+ "devDependencies": { -+ "hypercore": "^6.18.1", -+ "pump": "^3.0.0", -+ "pumpify": "^1.5.1", -+ "random-access-latency": "^1.0.0", -+ "rimraf": "^2.6.3", -+ "standard": "~10.0.0", -+ "tape": "~4.6.2", -+ "tmp": "0.0.33" -+ }, -+ "license": "ISC" -+ -+,"_resolved": "https://registry.npmjs.org/multifeed/-/multifeed-4.3.0.tgz" -+,"_integrity": "sha512-7RLBHilfBA9FTdTw98YbFv/UEg/44dIEefLRn/ALDnB1MMjB7gxGcgXqE01AH63oW8/uS30mndoFCBx/GyC7fg==" -+,"_from": "multifeed@4.3.0" -+} -+}, -+"D38Wco2QbCUAglhUEqY6Vg2myEa3IBAtFpI/iym3dbk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var has = Object.prototype.hasOwnProperty; -+ -+/** -+ * An auto incrementing id which we can use to create "unique" Ultron instances -+ * so we can track the event emitters that are added through the Ultron -+ * interface. -+ * -+ * @type {Number} -+ * @private -+ */ -+var id = 0; -+ -+/** -+ * Ultron is high-intelligence robot. It gathers intelligence so it can start improving -+ * upon his rudimentary design. It will learn from your EventEmitting patterns -+ * and exterminate them. -+ * -+ * @constructor -+ * @param {EventEmitter} ee EventEmitter instance we need to wrap. -+ * @api public -+ */ -+function Ultron(ee) { -+ if (!(this instanceof Ultron)) return new Ultron(ee); -+ -+ this.id = id++; -+ this.ee = ee; -+} -+ -+/** -+ * Register a new EventListener for the given event. -+ * -+ * @param {String} event Name of the event. -+ * @param {Functon} fn Callback function. -+ * @param {Mixed} context The context of the function. -+ * @returns {Ultron} -+ * @api public -+ */ -+Ultron.prototype.on = function on(event, fn, context) { -+ fn.__ultron = this.id; -+ this.ee.on(event, fn, context); -+ -+ return this; -+}; -+/** -+ * Add an EventListener that's only called once. -+ * -+ * @param {String} event Name of the event. -+ * @param {Function} fn Callback function. -+ * @param {Mixed} context The context of the function. -+ * @returns {Ultron} -+ * @api public -+ */ -+Ultron.prototype.once = function once(event, fn, context) { -+ fn.__ultron = this.id; -+ this.ee.once(event, fn, context); -+ -+ return this; -+}; -+ -+/** -+ * Remove the listeners we assigned for the given event. -+ * -+ * @returns {Ultron} -+ * @api public -+ */ -+Ultron.prototype.remove = function remove() { -+ var args = arguments -+ , ee = this.ee -+ , event; -+ -+ // -+ // When no event names are provided we assume that we need to clear all the -+ // events that were assigned through us. -+ // -+ if (args.length === 1 && 'string' === typeof args[0]) { -+ args = args[0].split(/[, ]+/); -+ } else if (!args.length) { -+ if (ee.eventNames) { -+ args = ee.eventNames(); -+ } else if (ee._events) { -+ args = []; -+ -+ for (event in ee._events) { -+ if (has.call(ee._events, event)) args.push(event); -+ } -+ -+ if (Object.getOwnPropertySymbols) { -+ args = args.concat(Object.getOwnPropertySymbols(ee._events)); -+ } -+ } -+ } -+ -+ for (var i = 0; i < args.length; i++) { -+ var listeners = ee.listeners(args[i]); -+ -+ for (var j = 0; j < listeners.length; j++) { -+ event = listeners[j]; -+ -+ // -+ // Once listeners have a `listener` property that stores the real listener -+ // in the EventEmitter that ships with Node.js. -+ // -+ if (event.listener) { -+ if (event.listener.__ultron !== this.id) continue; -+ } else if (event.__ultron !== this.id) { -+ continue; -+ } -+ -+ ee.removeListener(args[i], event); -+ } -+ } -+ -+ return this; -+}; -+ -+/** -+ * Destroy the Ultron instance, remove all listeners and release all references. -+ * -+ * @returns {Boolean} -+ * @api public -+ */ -+Ultron.prototype.destroy = function destroy() { -+ if (!this.ee) return false; -+ -+ this.remove(); -+ this.ee = null; -+ -+ return true; -+}; -+ -+// -+// Expose the module. -+// -+module.exports = Ultron; -+ -+}, -+"D6fTq+TIdHVTLplTZkCKNz6um4K0lZCgpvPYfb3Ah1k=": -+function (require, module, exports, __dirname, __filename) { -+var root = require('./_root'); -+ -+/** -+ * Gets the timestamp of the number of milliseconds that have elapsed since -+ * the Unix epoch (1 January 1970 00:00:00 UTC). -+ * -+ * @static -+ * @memberOf _ -+ * @since 2.4.0 -+ * @category Date -+ * @returns {number} Returns the timestamp. -+ * @example -+ * -+ * _.defer(function(stamp) { -+ * console.log(_.now() - stamp); -+ * }, _.now()); -+ * // => Logs the number of milliseconds it took for the deferred invocation. -+ */ -+var now = function() { -+ return root.Date.now(); -+}; -+ -+module.exports = now; -+ -+}, -+"DBUDS3ZKmSk3HiG7trq4FNpEEWVX+G/UCwst0yDxDjM=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "$schema": "http://json-schema.org/draft-07/schema#", -+ "$id": "http://json-schema.org/draft-07/schema#", -+ "title": "Core schema meta-schema", -+ "definitions": { -+ "schemaArray": { -+ "type": "array", -+ "minItems": 1, -+ "items": {"$ref": "#"} -+ }, -+ "nonNegativeInteger": { -+ "type": "integer", -+ "minimum": 0 -+ }, -+ "nonNegativeIntegerDefault0": { -+ "allOf": [{"$ref": "#/definitions/nonNegativeInteger"}, {"default": 0}] -+ }, -+ "simpleTypes": { -+ "enum": ["array", "boolean", "integer", "null", "number", "object", "string"] -+ }, -+ "stringArray": { -+ "type": "array", -+ "items": {"type": "string"}, -+ "uniqueItems": true, -+ "default": [] -+ } -+ }, -+ "type": ["object", "boolean"], -+ "properties": { -+ "$id": { -+ "type": "string", -+ "format": "uri-reference" -+ }, -+ "$schema": { -+ "type": "string", -+ "format": "uri" -+ }, -+ "$ref": { -+ "type": "string", -+ "format": "uri-reference" -+ }, -+ "$comment": { -+ "type": "string" -+ }, -+ "title": { -+ "type": "string" -+ }, -+ "description": { -+ "type": "string" -+ }, -+ "default": true, -+ "readOnly": { -+ "type": "boolean", -+ "default": false -+ }, -+ "examples": { -+ "type": "array", -+ "items": true -+ }, -+ "multipleOf": { -+ "type": "number", -+ "exclusiveMinimum": 0 -+ }, -+ "maximum": { -+ "type": "number" -+ }, -+ "exclusiveMaximum": { -+ "type": "number" -+ }, -+ "minimum": { -+ "type": "number" -+ }, -+ "exclusiveMinimum": { -+ "type": "number" -+ }, -+ "maxLength": {"$ref": "#/definitions/nonNegativeInteger"}, -+ "minLength": {"$ref": "#/definitions/nonNegativeIntegerDefault0"}, -+ "pattern": { -+ "type": "string", -+ "format": "regex" -+ }, -+ "additionalItems": {"$ref": "#"}, -+ "items": { -+ "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/schemaArray"}], -+ "default": true -+ }, -+ "maxItems": {"$ref": "#/definitions/nonNegativeInteger"}, -+ "minItems": {"$ref": "#/definitions/nonNegativeIntegerDefault0"}, -+ "uniqueItems": { -+ "type": "boolean", -+ "default": false -+ }, -+ "contains": {"$ref": "#"}, -+ "maxProperties": {"$ref": "#/definitions/nonNegativeInteger"}, -+ "minProperties": {"$ref": "#/definitions/nonNegativeIntegerDefault0"}, -+ "required": {"$ref": "#/definitions/stringArray"}, -+ "additionalProperties": {"$ref": "#"}, -+ "definitions": { -+ "type": "object", -+ "additionalProperties": {"$ref": "#"}, -+ "default": {} -+ }, -+ "properties": { -+ "type": "object", -+ "additionalProperties": {"$ref": "#"}, -+ "default": {} -+ }, -+ "patternProperties": { -+ "type": "object", -+ "additionalProperties": {"$ref": "#"}, -+ "propertyNames": {"format": "regex"}, -+ "default": {} -+ }, -+ "dependencies": { -+ "type": "object", -+ "additionalProperties": { -+ "anyOf": [{"$ref": "#"}, {"$ref": "#/definitions/stringArray"}] -+ } -+ }, -+ "propertyNames": {"$ref": "#"}, -+ "const": true, -+ "enum": { -+ "type": "array", -+ "items": true, -+ "minItems": 1, -+ "uniqueItems": true -+ }, -+ "type": { -+ "anyOf": [ -+ {"$ref": "#/definitions/simpleTypes"}, -+ { -+ "type": "array", -+ "items": {"$ref": "#/definitions/simpleTypes"}, -+ "minItems": 1, -+ "uniqueItems": true -+ } -+ ] -+ }, -+ "format": {"type": "string"}, -+ "contentMediaType": {"type": "string"}, -+ "contentEncoding": {"type": "string"}, -+ "if": {"$ref": "#"}, -+ "then": {"$ref": "#"}, -+ "else": {"$ref": "#"}, -+ "allOf": {"$ref": "#/definitions/schemaArray"}, -+ "anyOf": {"$ref": "#/definitions/schemaArray"}, -+ "oneOf": {"$ref": "#/definitions/schemaArray"}, -+ "not": {"$ref": "#"} -+ }, -+ "default": true -+} -+ -+}, -+"DJfebftuHYnyn54z6f0cGUYtD/cEnMgc2n65/43XO/Q=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "autoIndex": true, -+ "showDir": true, -+ "showDotfiles": true, -+ "humanReadable": true, -+ "hidePermissions": false, -+ "si": false, -+ "cache": "max-age=3600", -+ "cors": false, -+ "gzip": true, -+ "brotli": false, -+ "defaultExt": ".html", -+ "handleError": true, -+ "serverHeader": true, -+ "contentType": "application/octet-stream", -+ "weakEtags": true, -+ "weakCompare": true, -+ "handleOptionsMethod": false -+} -+ -+}, -+"DNUSOl791pLPnEtBHaGIRrTQqCSXGNiPkBssEhpFTXA=": -+function (require, module, exports, __dirname, __filename) { -+// This file is auto generated by the protocol-buffers compiler -+ -+/* eslint-disable quotes */ -+/* eslint-disable indent */ -+/* eslint-disable no-redeclare */ -+/* eslint-disable camelcase */ -+ -+// Remember to `npm install --save protocol-buffers-encodings` -+var encodings = require('protocol-buffers-encodings') -+var varint = encodings.varint -+var skip = encodings.skip -+ -+var Feed = exports.Feed = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Handshake = exports.Handshake = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Info = exports.Info = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Have = exports.Have = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Unhave = exports.Unhave = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Want = exports.Want = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Unwant = exports.Unwant = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Request = exports.Request = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Cancel = exports.Cancel = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+var Data = exports.Data = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+} -+ -+defineFeed() -+defineHandshake() -+defineInfo() -+defineHave() -+defineUnhave() -+defineWant() -+defineUnwant() -+defineRequest() -+defineCancel() -+defineData() -+ -+function defineFeed () { -+ var enc = [ -+ encodings.bytes -+ ] -+ -+ Feed.encodingLength = encodingLength -+ Feed.encode = encode -+ Feed.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.discoveryKey)) throw new Error("discoveryKey is required") -+ var len = enc[0].encodingLength(obj.discoveryKey) -+ length += 1 + len -+ if (defined(obj.nonce)) { -+ var len = enc[0].encodingLength(obj.nonce) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.discoveryKey)) throw new Error("discoveryKey is required") -+ buf[offset++] = 10 -+ enc[0].encode(obj.discoveryKey, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.nonce)) { -+ buf[offset++] = 18 -+ enc[0].encode(obj.nonce, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ discoveryKey: null, -+ nonce: null -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.discoveryKey = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.nonce = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineHandshake () { -+ var enc = [ -+ encodings.bytes, -+ encodings.bool, -+ encodings.string -+ ] -+ -+ Handshake.encodingLength = encodingLength -+ Handshake.encode = encode -+ Handshake.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (defined(obj.id)) { -+ var len = enc[0].encodingLength(obj.id) -+ length += 1 + len -+ } -+ if (defined(obj.live)) { -+ var len = enc[1].encodingLength(obj.live) -+ length += 1 + len -+ } -+ if (defined(obj.userData)) { -+ var len = enc[0].encodingLength(obj.userData) -+ length += 1 + len -+ } -+ if (defined(obj.extensions)) { -+ for (var i = 0; i < obj.extensions.length; i++) { -+ if (!defined(obj.extensions[i])) continue -+ var len = enc[2].encodingLength(obj.extensions[i]) -+ length += 1 + len -+ } -+ } -+ if (defined(obj.ack)) { -+ var len = enc[1].encodingLength(obj.ack) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (defined(obj.id)) { -+ buf[offset++] = 10 -+ enc[0].encode(obj.id, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.live)) { -+ buf[offset++] = 16 -+ enc[1].encode(obj.live, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ if (defined(obj.userData)) { -+ buf[offset++] = 26 -+ enc[0].encode(obj.userData, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.extensions)) { -+ for (var i = 0; i < obj.extensions.length; i++) { -+ if (!defined(obj.extensions[i])) continue -+ buf[offset++] = 34 -+ enc[2].encode(obj.extensions[i], buf, offset) -+ offset += enc[2].encode.bytes -+ } -+ } -+ if (defined(obj.ack)) { -+ buf[offset++] = 40 -+ enc[1].encode(obj.ack, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ id: null, -+ live: false, -+ userData: null, -+ extensions: [], -+ ack: false -+ } -+ while (true) { -+ if (end <= offset) { -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.id = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 2: -+ obj.live = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ case 3: -+ obj.userData = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 4: -+ obj.extensions.push(enc[2].decode(buf, offset)) -+ offset += enc[2].decode.bytes -+ break -+ case 5: -+ obj.ack = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineInfo () { -+ var enc = [ -+ encodings.bool -+ ] -+ -+ Info.encodingLength = encodingLength -+ Info.encode = encode -+ Info.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (defined(obj.uploading)) { -+ var len = enc[0].encodingLength(obj.uploading) -+ length += 1 + len -+ } -+ if (defined(obj.downloading)) { -+ var len = enc[0].encodingLength(obj.downloading) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (defined(obj.uploading)) { -+ buf[offset++] = 8 -+ enc[0].encode(obj.uploading, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.downloading)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.downloading, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ uploading: false, -+ downloading: false -+ } -+ while (true) { -+ if (end <= offset) { -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.uploading = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 2: -+ obj.downloading = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineHave () { -+ var enc = [ -+ encodings.varint, -+ encodings.bytes, -+ encodings.bool -+ ] -+ -+ Have.encodingLength = encodingLength -+ Have.encode = encode -+ Have.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.start)) throw new Error("start is required") -+ var len = enc[0].encodingLength(obj.start) -+ length += 1 + len -+ if (defined(obj.length)) { -+ var len = enc[0].encodingLength(obj.length) -+ length += 1 + len -+ } -+ if (defined(obj.bitfield)) { -+ var len = enc[1].encodingLength(obj.bitfield) -+ length += 1 + len -+ } -+ if (defined(obj.ack)) { -+ var len = enc[2].encodingLength(obj.ack) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.start)) throw new Error("start is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.start, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.length)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.length, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.bitfield)) { -+ buf[offset++] = 26 -+ enc[1].encode(obj.bitfield, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ if (defined(obj.ack)) { -+ buf[offset++] = 32 -+ enc[2].encode(obj.ack, buf, offset) -+ offset += enc[2].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ start: 0, -+ length: 1, -+ bitfield: null, -+ ack: false -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.start = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.length = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 3: -+ obj.bitfield = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ case 4: -+ obj.ack = enc[2].decode(buf, offset) -+ offset += enc[2].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineUnhave () { -+ var enc = [ -+ encodings.varint -+ ] -+ -+ Unhave.encodingLength = encodingLength -+ Unhave.encode = encode -+ Unhave.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.start)) throw new Error("start is required") -+ var len = enc[0].encodingLength(obj.start) -+ length += 1 + len -+ if (defined(obj.length)) { -+ var len = enc[0].encodingLength(obj.length) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.start)) throw new Error("start is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.start, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.length)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.length, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ start: 0, -+ length: 1 -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.start = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.length = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineWant () { -+ var enc = [ -+ encodings.varint -+ ] -+ -+ Want.encodingLength = encodingLength -+ Want.encode = encode -+ Want.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.start)) throw new Error("start is required") -+ var len = enc[0].encodingLength(obj.start) -+ length += 1 + len -+ if (defined(obj.length)) { -+ var len = enc[0].encodingLength(obj.length) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.start)) throw new Error("start is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.start, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.length)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.length, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ start: 0, -+ length: 0 -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.start = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.length = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineUnwant () { -+ var enc = [ -+ encodings.varint -+ ] -+ -+ Unwant.encodingLength = encodingLength -+ Unwant.encode = encode -+ Unwant.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.start)) throw new Error("start is required") -+ var len = enc[0].encodingLength(obj.start) -+ length += 1 + len -+ if (defined(obj.length)) { -+ var len = enc[0].encodingLength(obj.length) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.start)) throw new Error("start is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.start, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.length)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.length, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ start: 0, -+ length: 0 -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.start = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.length = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineRequest () { -+ var enc = [ -+ encodings.varint, -+ encodings.bool -+ ] -+ -+ Request.encodingLength = encodingLength -+ Request.encode = encode -+ Request.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.index)) throw new Error("index is required") -+ var len = enc[0].encodingLength(obj.index) -+ length += 1 + len -+ if (defined(obj.bytes)) { -+ var len = enc[0].encodingLength(obj.bytes) -+ length += 1 + len -+ } -+ if (defined(obj.hash)) { -+ var len = enc[1].encodingLength(obj.hash) -+ length += 1 + len -+ } -+ if (defined(obj.nodes)) { -+ var len = enc[0].encodingLength(obj.nodes) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.index)) throw new Error("index is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.index, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.bytes)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.bytes, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.hash)) { -+ buf[offset++] = 24 -+ enc[1].encode(obj.hash, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ if (defined(obj.nodes)) { -+ buf[offset++] = 32 -+ enc[0].encode(obj.nodes, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ index: 0, -+ bytes: 0, -+ hash: false, -+ nodes: 0 -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.index = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.bytes = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 3: -+ obj.hash = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ case 4: -+ obj.nodes = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineCancel () { -+ var enc = [ -+ encodings.varint, -+ encodings.bool -+ ] -+ -+ Cancel.encodingLength = encodingLength -+ Cancel.encode = encode -+ Cancel.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.index)) throw new Error("index is required") -+ var len = enc[0].encodingLength(obj.index) -+ length += 1 + len -+ if (defined(obj.bytes)) { -+ var len = enc[0].encodingLength(obj.bytes) -+ length += 1 + len -+ } -+ if (defined(obj.hash)) { -+ var len = enc[1].encodingLength(obj.hash) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.index)) throw new Error("index is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.index, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.bytes)) { -+ buf[offset++] = 16 -+ enc[0].encode(obj.bytes, buf, offset) -+ offset += enc[0].encode.bytes -+ } -+ if (defined(obj.hash)) { -+ buf[offset++] = 24 -+ enc[1].encode(obj.hash, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ index: 0, -+ bytes: 0, -+ hash: false -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.index = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.bytes = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ break -+ case 3: -+ obj.hash = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defineData () { -+ var Node = Data.Node = { -+ buffer: true, -+ encodingLength: null, -+ encode: null, -+ decode: null -+ } -+ -+ defineNode() -+ -+ function defineNode () { -+ var enc = [ -+ encodings.varint, -+ encodings.bytes -+ ] -+ -+ Node.encodingLength = encodingLength -+ Node.encode = encode -+ Node.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.index)) throw new Error("index is required") -+ var len = enc[0].encodingLength(obj.index) -+ length += 1 + len -+ if (!defined(obj.hash)) throw new Error("hash is required") -+ var len = enc[1].encodingLength(obj.hash) -+ length += 1 + len -+ if (!defined(obj.size)) throw new Error("size is required") -+ var len = enc[0].encodingLength(obj.size) -+ length += 1 + len -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.index)) throw new Error("index is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.index, buf, offset) -+ offset += enc[0].encode.bytes -+ if (!defined(obj.hash)) throw new Error("hash is required") -+ buf[offset++] = 18 -+ enc[1].encode(obj.hash, buf, offset) -+ offset += enc[1].encode.bytes -+ if (!defined(obj.size)) throw new Error("size is required") -+ buf[offset++] = 24 -+ enc[0].encode(obj.size, buf, offset) -+ offset += enc[0].encode.bytes -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ index: 0, -+ hash: null, -+ size: 0 -+ } -+ var found0 = false -+ var found1 = false -+ var found2 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0 || !found1 || !found2) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.index = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.hash = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ found1 = true -+ break -+ case 3: -+ obj.size = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found2 = true -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+ } -+ -+ var enc = [ -+ encodings.varint, -+ encodings.bytes, -+ Node -+ ] -+ -+ Data.encodingLength = encodingLength -+ Data.encode = encode -+ Data.decode = decode -+ -+ function encodingLength (obj) { -+ var length = 0 -+ if (!defined(obj.index)) throw new Error("index is required") -+ var len = enc[0].encodingLength(obj.index) -+ length += 1 + len -+ if (defined(obj.value)) { -+ var len = enc[1].encodingLength(obj.value) -+ length += 1 + len -+ } -+ if (defined(obj.nodes)) { -+ for (var i = 0; i < obj.nodes.length; i++) { -+ if (!defined(obj.nodes[i])) continue -+ var len = enc[2].encodingLength(obj.nodes[i]) -+ length += varint.encodingLength(len) -+ length += 1 + len -+ } -+ } -+ if (defined(obj.signature)) { -+ var len = enc[1].encodingLength(obj.signature) -+ length += 1 + len -+ } -+ return length -+ } -+ -+ function encode (obj, buf, offset) { -+ if (!offset) offset = 0 -+ if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) -+ var oldOffset = offset -+ if (!defined(obj.index)) throw new Error("index is required") -+ buf[offset++] = 8 -+ enc[0].encode(obj.index, buf, offset) -+ offset += enc[0].encode.bytes -+ if (defined(obj.value)) { -+ buf[offset++] = 18 -+ enc[1].encode(obj.value, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ if (defined(obj.nodes)) { -+ for (var i = 0; i < obj.nodes.length; i++) { -+ if (!defined(obj.nodes[i])) continue -+ buf[offset++] = 26 -+ varint.encode(enc[2].encodingLength(obj.nodes[i]), buf, offset) -+ offset += varint.encode.bytes -+ enc[2].encode(obj.nodes[i], buf, offset) -+ offset += enc[2].encode.bytes -+ } -+ } -+ if (defined(obj.signature)) { -+ buf[offset++] = 34 -+ enc[1].encode(obj.signature, buf, offset) -+ offset += enc[1].encode.bytes -+ } -+ encode.bytes = offset - oldOffset -+ return buf -+ } -+ -+ function decode (buf, offset, end) { -+ if (!offset) offset = 0 -+ if (!end) end = buf.length -+ if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") -+ var oldOffset = offset -+ var obj = { -+ index: 0, -+ value: null, -+ nodes: [], -+ signature: null -+ } -+ var found0 = false -+ while (true) { -+ if (end <= offset) { -+ if (!found0) throw new Error("Decoded message is not valid") -+ decode.bytes = offset - oldOffset -+ return obj -+ } -+ var prefix = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ var tag = prefix >> 3 -+ switch (tag) { -+ case 1: -+ obj.index = enc[0].decode(buf, offset) -+ offset += enc[0].decode.bytes -+ found0 = true -+ break -+ case 2: -+ obj.value = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ case 3: -+ var len = varint.decode(buf, offset) -+ offset += varint.decode.bytes -+ obj.nodes.push(enc[2].decode(buf, offset, offset + len)) -+ offset += enc[2].decode.bytes -+ break -+ case 4: -+ obj.signature = enc[1].decode(buf, offset) -+ offset += enc[1].decode.bytes -+ break -+ default: -+ offset = skip(prefix & 7, buf, offset) -+ } -+ } -+ } -+} -+ -+function defined (val) { -+ return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val)) -+} -+ -+}, -+"DP1FhVZSQp2/snEvCP3omVFy7boN/fdmQWlH4RPN66k=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const { -+ V4MAPPED, -+ ADDRCONFIG, -+ ALL, -+ promises: { -+ Resolver: AsyncResolver -+ }, -+ lookup: dnsLookup -+} = require('dns'); -+const {promisify} = require('util'); -+const os = require('os'); -+ -+const kCacheableLookupCreateConnection = Symbol('cacheableLookupCreateConnection'); -+const kCacheableLookupInstance = Symbol('cacheableLookupInstance'); -+const kExpires = Symbol('expires'); -+ -+const supportsALL = typeof ALL === 'number'; -+ -+const verifyAgent = agent => { -+ if (!(agent && typeof agent.createConnection === 'function')) { -+ throw new Error('Expected an Agent instance as the first argument'); -+ } -+}; -+ -+const map4to6 = entries => { -+ for (const entry of entries) { -+ if (entry.family === 6) { -+ continue; -+ } -+ -+ entry.address = `::ffff:${entry.address}`; -+ entry.family = 6; -+ } -+}; -+ -+const getIfaceInfo = () => { -+ let has4 = false; -+ let has6 = false; -+ -+ for (const device of Object.values(os.networkInterfaces())) { -+ for (const iface of device) { -+ if (iface.internal) { -+ continue; -+ } -+ -+ if (iface.family === 'IPv6') { -+ has6 = true; -+ } else { -+ has4 = true; -+ } -+ -+ if (has4 && has6) { -+ return {has4, has6}; -+ } -+ } -+ } -+ -+ return {has4, has6}; -+}; -+ -+const isIterable = map => { -+ return Symbol.iterator in map; -+}; -+ -+const ttl = {ttl: true}; -+const all = {all: true}; -+ -+class CacheableLookup { -+ constructor({ -+ cache = new Map(), -+ maxTtl = Infinity, -+ fallbackDuration = 3600, -+ errorTtl = 0.15, -+ resolver = new AsyncResolver(), -+ lookup = dnsLookup -+ } = {}) { -+ this.maxTtl = maxTtl; -+ this.errorTtl = errorTtl; -+ -+ this._cache = cache; -+ this._resolver = resolver; -+ this._dnsLookup = promisify(lookup); -+ -+ if (this._resolver instanceof AsyncResolver) { -+ this._resolve4 = this._resolver.resolve4.bind(this._resolver); -+ this._resolve6 = this._resolver.resolve6.bind(this._resolver); -+ } else { -+ this._resolve4 = promisify(this._resolver.resolve4.bind(this._resolver)); -+ this._resolve6 = promisify(this._resolver.resolve6.bind(this._resolver)); -+ } -+ -+ this._iface = getIfaceInfo(); -+ -+ this._pending = {}; -+ this._nextRemovalTime = false; -+ this._hostnamesToFallback = new Set(); -+ -+ if (fallbackDuration < 1) { -+ this._fallback = false; -+ } else { -+ this._fallback = true; -+ -+ const interval = setInterval(() => { -+ this._hostnamesToFallback.clear(); -+ }, fallbackDuration * 1000); -+ -+ /* istanbul ignore next: There is no `interval.unref()` when running inside an Electron renderer */ -+ if (interval.unref) { -+ interval.unref(); -+ } -+ } -+ -+ this.lookup = this.lookup.bind(this); -+ this.lookupAsync = this.lookupAsync.bind(this); -+ } -+ -+ set servers(servers) { -+ this.clear(); -+ -+ this._resolver.setServers(servers); -+ } -+ -+ get servers() { -+ return this._resolver.getServers(); -+ } -+ -+ lookup(hostname, options, callback) { -+ if (typeof options === 'function') { -+ callback = options; -+ options = {}; -+ } else if (typeof options === 'number') { -+ options = { -+ family: options -+ }; -+ } -+ -+ if (!callback) { -+ throw new Error('Callback must be a function.'); -+ } -+ -+ // eslint-disable-next-line promise/prefer-await-to-then -+ this.lookupAsync(hostname, options).then(result => { -+ if (options.all) { -+ callback(null, result); -+ } else { -+ callback(null, result.address, result.family, result.expires, result.ttl); -+ } -+ }, callback); -+ } -+ -+ async lookupAsync(hostname, options = {}) { -+ if (typeof options === 'number') { -+ options = { -+ family: options -+ }; -+ } -+ -+ let cached = await this.query(hostname); -+ -+ if (options.family === 6) { -+ const filtered = cached.filter(entry => entry.family === 6); -+ -+ if (options.hints & V4MAPPED) { -+ if ((supportsALL && options.hints & ALL) || filtered.length === 0) { -+ map4to6(cached); -+ } else { -+ cached = filtered; -+ } -+ } else { -+ cached = filtered; -+ } -+ } else if (options.family === 4) { -+ cached = cached.filter(entry => entry.family === 4); -+ } -+ -+ if (options.hints & ADDRCONFIG) { -+ const {_iface} = this; -+ cached = cached.filter(entry => entry.family === 6 ? _iface.has6 : _iface.has4); -+ } -+ -+ if (cached.length === 0) { -+ const error = new Error(`cacheableLookup ENOTFOUND ${hostname}`); -+ error.code = 'ENOTFOUND'; -+ error.hostname = hostname; -+ -+ throw error; -+ } -+ -+ if (options.all) { -+ return cached; -+ } -+ -+ return cached[0]; -+ } -+ -+ async query(hostname) { -+ let cached = await this._cache.get(hostname); -+ -+ if (!cached) { -+ const pending = this._pending[hostname]; -+ -+ if (pending) { -+ cached = await pending; -+ } else { -+ const newPromise = this.queryAndCache(hostname); -+ this._pending[hostname] = newPromise; -+ -+ try { -+ cached = await newPromise; -+ } finally { -+ delete this._pending[hostname]; -+ } -+ } -+ } -+ -+ cached = cached.map(entry => { -+ return {...entry}; -+ }); -+ -+ return cached; -+ } -+ -+ async _resolve(hostname) { -+ const wrap = async promise => { -+ try { -+ return await promise; -+ } catch (error) { -+ if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') { -+ return []; -+ } -+ -+ throw error; -+ } -+ }; -+ -+ // ANY is unsafe as it doesn't trigger new queries in the underlying server. -+ const [A, AAAA] = await Promise.all([ -+ this._resolve4(hostname, ttl), -+ this._resolve6(hostname, ttl) -+ ].map(promise => wrap(promise))); -+ -+ let aTtl = 0; -+ let aaaaTtl = 0; -+ let cacheTtl = 0; -+ -+ const now = Date.now(); -+ -+ for (const entry of A) { -+ entry.family = 4; -+ entry.expires = now + (entry.ttl * 1000); -+ -+ aTtl = Math.max(aTtl, entry.ttl); -+ } -+ -+ for (const entry of AAAA) { -+ entry.family = 6; -+ entry.expires = now + (entry.ttl * 1000); -+ -+ aaaaTtl = Math.max(aaaaTtl, entry.ttl); -+ } -+ -+ if (A.length > 0) { -+ if (AAAA.length > 0) { -+ cacheTtl = Math.min(aTtl, aaaaTtl); -+ } else { -+ cacheTtl = aTtl; -+ } -+ } else { -+ cacheTtl = aaaaTtl; -+ } -+ -+ return { -+ entries: [ -+ ...A, -+ ...AAAA -+ ], -+ cacheTtl -+ }; -+ } -+ -+ async _lookup(hostname) { -+ try { -+ const entries = await this._dnsLookup(hostname, { -+ all: true -+ }); -+ -+ return { -+ entries, -+ cacheTtl: 0 -+ }; -+ } catch (_) { -+ return { -+ entries: [], -+ cacheTtl: 0 -+ }; -+ } -+ } -+ -+ async _set(hostname, data, cacheTtl) { -+ if (this.maxTtl > 0 && cacheTtl > 0) { -+ cacheTtl = Math.min(cacheTtl, this.maxTtl) * 1000; -+ data[kExpires] = Date.now() + cacheTtl; -+ -+ try { -+ await this._cache.set(hostname, data, cacheTtl); -+ } catch (error) { -+ this.lookupAsync = async () => { -+ const cacheError = new Error('Cache Error. Please recreate the CacheableLookup instance.'); -+ cacheError.cause = error; -+ -+ throw cacheError; -+ }; -+ } -+ -+ if (isIterable(this._cache)) { -+ this._tick(cacheTtl); -+ } -+ } -+ } -+ -+ async queryAndCache(hostname) { -+ if (this._hostnamesToFallback.has(hostname)) { -+ return this._dnsLookup(hostname, all); -+ } -+ -+ let query = await this._resolve(hostname); -+ -+ if (query.entries.length === 0 && this._fallback) { -+ query = await this._lookup(hostname); -+ -+ if (query.entries.length !== 0) { -+ // Use `dns.lookup(...)` for that particular hostname -+ this._hostnamesToFallback.add(hostname); -+ } -+ } -+ -+ const cacheTtl = query.entries.length === 0 ? this.errorTtl : query.cacheTtl; -+ await this._set(hostname, query.entries, cacheTtl); -+ -+ return query.entries; -+ } -+ -+ _tick(ms) { -+ const nextRemovalTime = this._nextRemovalTime; -+ -+ if (!nextRemovalTime || ms < nextRemovalTime) { -+ clearTimeout(this._removalTimeout); -+ -+ this._nextRemovalTime = ms; -+ -+ this._removalTimeout = setTimeout(() => { -+ this._nextRemovalTime = false; -+ -+ let nextExpiry = Infinity; -+ -+ const now = Date.now(); -+ -+ for (const [hostname, entries] of this._cache) { -+ const expires = entries[kExpires]; -+ -+ if (now >= expires) { -+ this._cache.delete(hostname); -+ } else if (expires < nextExpiry) { -+ nextExpiry = expires; -+ } -+ } -+ -+ if (nextExpiry !== Infinity) { -+ this._tick(nextExpiry - now); -+ } -+ }, ms); -+ -+ /* istanbul ignore next: There is no `timeout.unref()` when running inside an Electron renderer */ -+ if (this._removalTimeout.unref) { -+ this._removalTimeout.unref(); -+ } -+ } -+ } -+ -+ install(agent) { -+ verifyAgent(agent); -+ -+ if (kCacheableLookupCreateConnection in agent) { -+ throw new Error('CacheableLookup has been already installed'); -+ } -+ -+ agent[kCacheableLookupCreateConnection] = agent.createConnection; -+ agent[kCacheableLookupInstance] = this; -+ -+ agent.createConnection = (options, callback) => { -+ if (!('lookup' in options)) { -+ options.lookup = this.lookup; -+ } -+ -+ return agent[kCacheableLookupCreateConnection](options, callback); -+ }; -+ } -+ -+ uninstall(agent) { -+ verifyAgent(agent); -+ -+ if (agent[kCacheableLookupCreateConnection]) { -+ if (agent[kCacheableLookupInstance] !== this) { -+ throw new Error('The agent is not owned by this CacheableLookup instance'); -+ } -+ -+ agent.createConnection = agent[kCacheableLookupCreateConnection]; -+ -+ delete agent[kCacheableLookupCreateConnection]; -+ delete agent[kCacheableLookupInstance]; -+ } -+ } -+ -+ updateInterfaceInfo() { -+ const {_iface} = this; -+ -+ this._iface = getIfaceInfo(); -+ -+ if ((_iface.has4 && !this._iface.has4) || (_iface.has6 && !this._iface.has6)) { -+ this._cache.clear(); -+ } -+ } -+ -+ clear(hostname) { -+ if (hostname) { -+ this._cache.delete(hostname); -+ return; -+ } -+ -+ this._cache.clear(); -+ } -+} -+ -+module.exports = CacheableLookup; -+module.exports.default = CacheableLookup; -+ -+}, -+"DR0vy+NgqrmJOPJkI6Hw4SLB8ox2DZOJ9T1ygtpAMNw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+const pDefer = () => { -+ const deferred = {}; -+ -+ deferred.promise = new Promise((resolve, reject) => { -+ deferred.resolve = resolve; -+ deferred.reject = reject; -+ }); -+ -+ return deferred; -+}; -+ -+module.exports = pDefer; -+ -+}, -+"DXXfKbAphgprnGucwAObDiWVGdiiOJVxCWatmtMl3qE=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+ -+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } -+ -+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -+ -+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -+ -+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -+ -+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } -+ -+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } -+ -+function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } -+ -+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } -+ -+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } -+ -+function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -+ -+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } -+ -+var Zip = require('./zip'); -+ -+var _require = require('./utils'), -+ mapInfoResource = _require.mapInfoResource, -+ findApkIconPath = _require.findApkIconPath, -+ getBase64FromBuffer = _require.getBase64FromBuffer; -+ -+var ManifestName = /^androidmanifest\.xml$/; -+var ResourceName = /^resources\.arsc$/; -+ -+var ManifestXmlParser = require('./xml-parser/manifest'); -+ -+var ResourceFinder = require('./resource-finder'); -+ -+var ApkParser = /*#__PURE__*/function (_Zip) { -+ _inherits(ApkParser, _Zip); -+ -+ var _super = _createSuper(ApkParser); -+ -+ /** -+ * parser for parsing .apk file -+ * @param {String | File | Blob} file // file's path in Node, instance of File or Blob in Browser -+ */ -+ function ApkParser(file) { -+ var _this; -+ -+ _classCallCheck(this, ApkParser); -+ -+ _this = _super.call(this, file); -+ -+ if (!(_assertThisInitialized(_this) instanceof ApkParser)) { -+ return _possibleConstructorReturn(_this, new ApkParser(file)); -+ } -+ -+ return _this; -+ } -+ -+ _createClass(ApkParser, [{ -+ key: "parse", -+ value: function parse() { -+ var _this2 = this; -+ -+ return new Promise(function (resolve, reject) { -+ _this2.getEntries([ManifestName, ResourceName]).then(function (buffers) { -+ if (!buffers[ManifestName]) { -+ throw new Error('AndroidManifest.xml can\'t be found.'); -+ } -+ -+ var apkInfo = _this2._parseManifest(buffers[ManifestName]); -+ -+ var resourceMap; -+ -+ if (!buffers[ResourceName]) { -+ resolve(apkInfo); -+ } else { -+ // parse resourceMap -+ resourceMap = _this2._parseResourceMap(buffers[ResourceName]); // update apkInfo with resourceMap -+ -+ apkInfo = mapInfoResource(apkInfo, resourceMap); // find icon path and parse icon -+ -+ var iconPath = findApkIconPath(apkInfo); -+ -+ if (iconPath) { -+ _this2.getEntry(iconPath).then(function (iconBuffer) { -+ apkInfo.icon = iconBuffer ? getBase64FromBuffer(iconBuffer) : null; -+ resolve(apkInfo); -+ })["catch"](function (e) { -+ apkInfo.icon = null; -+ resolve(apkInfo); -+ console.warn('[Warning] failed to parse icon: ', e); -+ }); -+ } else { -+ apkInfo.icon = null; -+ resolve(apkInfo); -+ } -+ } -+ })["catch"](function (e) { -+ reject(e); -+ }); -+ }); -+ } -+ /** -+ * Parse manifest -+ * @param {Buffer} buffer // manifest file's buffer -+ */ -+ -+ }, { -+ key: "_parseManifest", -+ value: function _parseManifest(buffer) { -+ try { -+ var parser = new ManifestXmlParser(buffer, { -+ ignore: ['application.activity', 'application.service', 'application.receiver', 'application.provider', 'permission-group'] -+ }); -+ return parser.parse(); -+ } catch (e) { -+ throw new Error('Parse AndroidManifest.xml error: ', e); -+ } -+ } -+ /** -+ * Parse resourceMap -+ * @param {Buffer} buffer // resourceMap file's buffer -+ */ -+ -+ }, { -+ key: "_parseResourceMap", -+ value: function _parseResourceMap(buffer) { -+ try { -+ return new ResourceFinder().processResourceTable(buffer); -+ } catch (e) { -+ throw new Error('Parser resources.arsc error: ' + e); -+ } -+ } -+ }]); -+ -+ return ApkParser; -+}(Zip); -+ -+module.exports = ApkParser; -+}, -+"Dbns7vUiTbw0wiTDmLUO70uZ+TfIDIH2YJKGFaJI7U8=": -+function (require, module, exports, __dirname, __filename) { -+exports.extract = require('./extract') -+exports.pack = require('./pack') -+ -+}, -+"DiQdSMDiqAZCbhHbeO1QMcF85yeEZuMST+y0PI+uWeM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const core_1 = require("./core"); -+const validation_1 = require("./validation"); -+const applicator_1 = require("./applicator"); -+const format_1 = require("./format"); -+const metadata_1 = require("./metadata"); -+const draft7Vocabularies = [ -+ core_1.default, -+ validation_1.default, -+ applicator_1.default(), -+ format_1.default, -+ metadata_1.metadataVocabulary, -+ metadata_1.contentVocabulary, -+]; -+exports.default = draft7Vocabularies; -+//# sourceMappingURL=draft7.js.map -+}, -+"Dk/JEn5osLnZQr72dKA1L3Pwh0xvZvNALQWnoR22e5g=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { -+var util = require("./util"); -+var CancellationError = Promise.CancellationError; -+var errorObj = util.errorObj; -+var catchFilter = require("./catch_filter")(NEXT_FILTER); -+ -+function PassThroughHandlerContext(promise, type, handler) { -+ this.promise = promise; -+ this.type = type; -+ this.handler = handler; -+ this.called = false; -+ this.cancelPromise = null; -+} -+ -+PassThroughHandlerContext.prototype.isFinallyHandler = function() { -+ return this.type === 0; -+}; -+ -+function FinallyHandlerCancelReaction(finallyHandler) { -+ this.finallyHandler = finallyHandler; -+} -+ -+FinallyHandlerCancelReaction.prototype._resultCancelled = function() { -+ checkCancel(this.finallyHandler); -+}; -+ -+function checkCancel(ctx, reason) { -+ if (ctx.cancelPromise != null) { -+ if (arguments.length > 1) { -+ ctx.cancelPromise._reject(reason); -+ } else { -+ ctx.cancelPromise._cancel(); -+ } -+ ctx.cancelPromise = null; -+ return true; -+ } -+ return false; -+} -+ -+function succeed() { -+ return finallyHandler.call(this, this.promise._target()._settledValue()); -+} -+function fail(reason) { -+ if (checkCancel(this, reason)) return; -+ errorObj.e = reason; -+ return errorObj; -+} -+function finallyHandler(reasonOrValue) { -+ var promise = this.promise; -+ var handler = this.handler; -+ -+ if (!this.called) { -+ this.called = true; -+ var ret = this.isFinallyHandler() -+ ? handler.call(promise._boundValue()) -+ : handler.call(promise._boundValue(), reasonOrValue); -+ if (ret === NEXT_FILTER) { -+ return ret; -+ } else if (ret !== undefined) { -+ promise._setReturnedNonUndefined(); -+ var maybePromise = tryConvertToPromise(ret, promise); -+ if (maybePromise instanceof Promise) { -+ if (this.cancelPromise != null) { -+ if (maybePromise._isCancelled()) { -+ var reason = -+ new CancellationError("late cancellation observer"); -+ promise._attachExtraTrace(reason); -+ errorObj.e = reason; -+ return errorObj; -+ } else if (maybePromise.isPending()) { -+ maybePromise._attachCancellationCallback( -+ new FinallyHandlerCancelReaction(this)); -+ } -+ } -+ return maybePromise._then( -+ succeed, fail, undefined, this, undefined); -+ } -+ } -+ } -+ -+ if (promise.isRejected()) { -+ checkCancel(this); -+ errorObj.e = reasonOrValue; -+ return errorObj; -+ } else { -+ checkCancel(this); -+ return reasonOrValue; -+ } -+} -+ -+Promise.prototype._passThrough = function(handler, type, success, fail) { -+ if (typeof handler !== "function") return this.then(); -+ return this._then(success, -+ fail, -+ undefined, -+ new PassThroughHandlerContext(this, type, handler), -+ undefined); -+}; -+ -+Promise.prototype.lastly = -+Promise.prototype["finally"] = function (handler) { -+ return this._passThrough(handler, -+ 0, -+ finallyHandler, -+ finallyHandler); -+}; -+ -+ -+Promise.prototype.tap = function (handler) { -+ return this._passThrough(handler, 1, finallyHandler); -+}; -+ -+Promise.prototype.tapCatch = function (handlerOrPredicate) { -+ var len = arguments.length; -+ if(len === 1) { -+ return this._passThrough(handlerOrPredicate, -+ 1, -+ undefined, -+ finallyHandler); -+ } else { -+ var catchInstances = new Array(len - 1), -+ j = 0, i; -+ for (i = 0; i < len - 1; ++i) { -+ var item = arguments[i]; -+ if (util.isObject(item)) { -+ catchInstances[j++] = item; -+ } else { -+ return Promise.reject(new TypeError( -+ "tapCatch statement predicate: " -+ + "expecting an object but got " + util.classString(item) -+ )); -+ } -+ } -+ catchInstances.length = j; -+ var handler = arguments[i]; -+ return this._passThrough(catchFilter(catchInstances, handler, this), -+ 1, -+ undefined, -+ finallyHandler); -+ } -+ -+}; -+ -+return PassThroughHandlerContext; -+}; -+ -+}, -+"DkkZbe5ksYq2P6yKPKVjuZlLe5EeryvMy2er4hRcYrQ=": -+function (require, module, exports, __dirname, __filename) { -+var Transform = require('readable-stream').Transform -+ , inherits = require('util').inherits -+ , xtend = require('xtend') -+ -+function DestroyableTransform(opts) { -+ Transform.call(this, opts) -+ this._destroyed = false -+} -+ -+inherits(DestroyableTransform, Transform) -+ -+DestroyableTransform.prototype.destroy = function(err) { -+ if (this._destroyed) return -+ this._destroyed = true -+ -+ var self = this -+ process.nextTick(function() { -+ if (err) -+ self.emit('error', err) -+ self.emit('close') -+ }) -+} -+ -+// a noop _transform function -+function noop (chunk, enc, callback) { -+ callback(null, chunk) -+} -+ -+ -+// create a new export function, used by both the main export and -+// the .ctor export, contains common logic for dealing with arguments -+function through2 (construct) { -+ return function (options, transform, flush) { -+ if (typeof options == 'function') { -+ flush = transform -+ transform = options -+ options = {} -+ } -+ -+ if (typeof transform != 'function') -+ transform = noop -+ -+ if (typeof flush != 'function') -+ flush = null -+ -+ return construct(options, transform, flush) -+ } -+} -+ -+ -+// main export, just make me a transform stream! -+module.exports = through2(function (options, transform, flush) { -+ var t2 = new DestroyableTransform(options) -+ -+ t2._transform = transform -+ -+ if (flush) -+ t2._flush = flush -+ -+ return t2 -+}) -+ -+ -+// make me a reusable prototype that I can `new`, or implicitly `new` -+// with a constructor call -+module.exports.ctor = through2(function (options, transform, flush) { -+ function Through2 (override) { -+ if (!(this instanceof Through2)) -+ return new Through2(override) -+ -+ this.options = xtend(options, override) -+ -+ DestroyableTransform.call(this, this.options) -+ } -+ -+ inherits(Through2, DestroyableTransform) -+ -+ Through2.prototype._transform = transform -+ -+ if (flush) -+ Through2.prototype._flush = flush -+ -+ return Through2 -+}) -+ -+ -+module.exports.obj = through2(function (options, transform, flush) { -+ var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) -+ -+ t2._transform = transform -+ -+ if (flush) -+ t2._flush = flush -+ -+ return t2 -+}) -+ -+}, -+"DlXRibkONkSDfky+AJljhptkbmtxZwH/lYNONuomzdY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var utils = require('../utils/common'); -+var trees = require('./trees'); -+var adler32 = require('./adler32'); -+var crc32 = require('./crc32'); -+var msg = require('./messages'); -+ -+/* Public constants ==========================================================*/ -+/* ===========================================================================*/ -+ -+ -+/* Allowed flush values; see deflate() and inflate() below for details */ -+var Z_NO_FLUSH = 0; -+var Z_PARTIAL_FLUSH = 1; -+//var Z_SYNC_FLUSH = 2; -+var Z_FULL_FLUSH = 3; -+var Z_FINISH = 4; -+var Z_BLOCK = 5; -+//var Z_TREES = 6; -+ -+ -+/* Return codes for the compression/decompression functions. Negative values -+ * are errors, positive values are used for special but normal events. -+ */ -+var Z_OK = 0; -+var Z_STREAM_END = 1; -+//var Z_NEED_DICT = 2; -+//var Z_ERRNO = -1; -+var Z_STREAM_ERROR = -2; -+var Z_DATA_ERROR = -3; -+//var Z_MEM_ERROR = -4; -+var Z_BUF_ERROR = -5; -+//var Z_VERSION_ERROR = -6; -+ -+ -+/* compression levels */ -+//var Z_NO_COMPRESSION = 0; -+//var Z_BEST_SPEED = 1; -+//var Z_BEST_COMPRESSION = 9; -+var Z_DEFAULT_COMPRESSION = -1; -+ -+ -+var Z_FILTERED = 1; -+var Z_HUFFMAN_ONLY = 2; -+var Z_RLE = 3; -+var Z_FIXED = 4; -+var Z_DEFAULT_STRATEGY = 0; -+ -+/* Possible values of the data_type field (though see inflate()) */ -+//var Z_BINARY = 0; -+//var Z_TEXT = 1; -+//var Z_ASCII = 1; // = Z_TEXT -+var Z_UNKNOWN = 2; -+ -+ -+/* The deflate compression method */ -+var Z_DEFLATED = 8; -+ -+/*============================================================================*/ -+ -+ -+var MAX_MEM_LEVEL = 9; -+/* Maximum value for memLevel in deflateInit2 */ -+var MAX_WBITS = 15; -+/* 32K LZ77 window */ -+var DEF_MEM_LEVEL = 8; -+ -+ -+var LENGTH_CODES = 29; -+/* number of length codes, not counting the special END_BLOCK code */ -+var LITERALS = 256; -+/* number of literal bytes 0..255 */ -+var L_CODES = LITERALS + 1 + LENGTH_CODES; -+/* number of Literal or Length codes, including the END_BLOCK code */ -+var D_CODES = 30; -+/* number of distance codes */ -+var BL_CODES = 19; -+/* number of codes used to transfer the bit lengths */ -+var HEAP_SIZE = 2 * L_CODES + 1; -+/* maximum heap size */ -+var MAX_BITS = 15; -+/* All codes must not exceed MAX_BITS bits */ -+ -+var MIN_MATCH = 3; -+var MAX_MATCH = 258; -+var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); -+ -+var PRESET_DICT = 0x20; -+ -+var INIT_STATE = 42; -+var EXTRA_STATE = 69; -+var NAME_STATE = 73; -+var COMMENT_STATE = 91; -+var HCRC_STATE = 103; -+var BUSY_STATE = 113; -+var FINISH_STATE = 666; -+ -+var BS_NEED_MORE = 1; /* block not completed, need more input or more output */ -+var BS_BLOCK_DONE = 2; /* block flush performed */ -+var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ -+var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ -+ -+var OS_CODE = 0x03; // Unix :) . Don't detect, use this default. -+ -+function err(strm, errorCode) { -+ strm.msg = msg[errorCode]; -+ return errorCode; -+} -+ -+function rank(f) { -+ return ((f) << 1) - ((f) > 4 ? 9 : 0); -+} -+ -+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } -+ -+ -+/* ========================================================================= -+ * Flush as much pending output as possible. All deflate() output goes -+ * through this function so some applications may wish to modify it -+ * to avoid allocating a large strm->output buffer and copying into it. -+ * (See also read_buf()). -+ */ -+function flush_pending(strm) { -+ var s = strm.state; -+ -+ //_tr_flush_bits(s); -+ var len = s.pending; -+ if (len > strm.avail_out) { -+ len = strm.avail_out; -+ } -+ if (len === 0) { return; } -+ -+ utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out); -+ strm.next_out += len; -+ s.pending_out += len; -+ strm.total_out += len; -+ strm.avail_out -= len; -+ s.pending -= len; -+ if (s.pending === 0) { -+ s.pending_out = 0; -+ } -+} -+ -+ -+function flush_block_only(s, last) { -+ trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); -+ s.block_start = s.strstart; -+ flush_pending(s.strm); -+} -+ -+ -+function put_byte(s, b) { -+ s.pending_buf[s.pending++] = b; -+} -+ -+ -+/* ========================================================================= -+ * Put a short in the pending buffer. The 16-bit value is put in MSB order. -+ * IN assertion: the stream state is correct and there is enough room in -+ * pending_buf. -+ */ -+function putShortMSB(s, b) { -+// put_byte(s, (Byte)(b >> 8)); -+// put_byte(s, (Byte)(b & 0xff)); -+ s.pending_buf[s.pending++] = (b >>> 8) & 0xff; -+ s.pending_buf[s.pending++] = b & 0xff; -+} -+ -+ -+/* =========================================================================== -+ * Read a new buffer from the current input stream, update the adler32 -+ * and total number of bytes read. All deflate() input goes through -+ * this function so some applications may wish to modify it to avoid -+ * allocating a large strm->input buffer and copying from it. -+ * (See also flush_pending()). -+ */ -+function read_buf(strm, buf, start, size) { -+ var len = strm.avail_in; -+ -+ if (len > size) { len = size; } -+ if (len === 0) { return 0; } -+ -+ strm.avail_in -= len; -+ -+ // zmemcpy(buf, strm->next_in, len); -+ utils.arraySet(buf, strm.input, strm.next_in, len, start); -+ if (strm.state.wrap === 1) { -+ strm.adler = adler32(strm.adler, buf, len, start); -+ } -+ -+ else if (strm.state.wrap === 2) { -+ strm.adler = crc32(strm.adler, buf, len, start); -+ } -+ -+ strm.next_in += len; -+ strm.total_in += len; -+ -+ return len; -+} -+ -+ -+/* =========================================================================== -+ * Set match_start to the longest match starting at the given string and -+ * return its length. Matches shorter or equal to prev_length are discarded, -+ * in which case the result is equal to prev_length and match_start is -+ * garbage. -+ * IN assertions: cur_match is the head of the hash chain for the current -+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 -+ * OUT assertion: the match length is not greater than s->lookahead. -+ */ -+function longest_match(s, cur_match) { -+ var chain_length = s.max_chain_length; /* max hash chain length */ -+ var scan = s.strstart; /* current string */ -+ var match; /* matched string */ -+ var len; /* length of current match */ -+ var best_len = s.prev_length; /* best match length so far */ -+ var nice_match = s.nice_match; /* stop if match long enough */ -+ var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? -+ s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; -+ -+ var _win = s.window; // shortcut -+ -+ var wmask = s.w_mask; -+ var prev = s.prev; -+ -+ /* Stop when cur_match becomes <= limit. To simplify the code, -+ * we prevent matches with the string of window index 0. -+ */ -+ -+ var strend = s.strstart + MAX_MATCH; -+ var scan_end1 = _win[scan + best_len - 1]; -+ var scan_end = _win[scan + best_len]; -+ -+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. -+ * It is easy to get rid of this optimization if necessary. -+ */ -+ // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); -+ -+ /* Do not waste too much time if we already have a good match: */ -+ if (s.prev_length >= s.good_match) { -+ chain_length >>= 2; -+ } -+ /* Do not look for matches beyond the end of the input. This is necessary -+ * to make deflate deterministic. -+ */ -+ if (nice_match > s.lookahead) { nice_match = s.lookahead; } -+ -+ // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); -+ -+ do { -+ // Assert(cur_match < s->strstart, "no future"); -+ match = cur_match; -+ -+ /* Skip to next match if the match length cannot increase -+ * or if the match length is less than 2. Note that the checks below -+ * for insufficient lookahead only occur occasionally for performance -+ * reasons. Therefore uninitialized memory will be accessed, and -+ * conditional jumps will be made that depend on those values. -+ * However the length of the match is limited to the lookahead, so -+ * the output of deflate is not affected by the uninitialized values. -+ */ -+ -+ if (_win[match + best_len] !== scan_end || -+ _win[match + best_len - 1] !== scan_end1 || -+ _win[match] !== _win[scan] || -+ _win[++match] !== _win[scan + 1]) { -+ continue; -+ } -+ -+ /* The check at best_len-1 can be removed because it will be made -+ * again later. (This heuristic is not always a win.) -+ * It is not necessary to compare scan[2] and match[2] since they -+ * are always equal when the other bytes match, given that -+ * the hash keys are equal and that HASH_BITS >= 8. -+ */ -+ scan += 2; -+ match++; -+ // Assert(*scan == *match, "match[2]?"); -+ -+ /* We check for insufficient lookahead only every 8th comparison; -+ * the 256th check will be made at strstart+258. -+ */ -+ do { -+ /*jshint noempty:false*/ -+ } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && -+ _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && -+ _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && -+ _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && -+ scan < strend); -+ -+ // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); -+ -+ len = MAX_MATCH - (strend - scan); -+ scan = strend - MAX_MATCH; -+ -+ if (len > best_len) { -+ s.match_start = cur_match; -+ best_len = len; -+ if (len >= nice_match) { -+ break; -+ } -+ scan_end1 = _win[scan + best_len - 1]; -+ scan_end = _win[scan + best_len]; -+ } -+ } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); -+ -+ if (best_len <= s.lookahead) { -+ return best_len; -+ } -+ return s.lookahead; -+} -+ -+ -+/* =========================================================================== -+ * Fill the window when the lookahead becomes insufficient. -+ * Updates strstart and lookahead. -+ * -+ * IN assertion: lookahead < MIN_LOOKAHEAD -+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD -+ * At least one byte has been read, or avail_in == 0; reads are -+ * performed for at least two bytes (required for the zip translate_eol -+ * option -- not supported here). -+ */ -+function fill_window(s) { -+ var _w_size = s.w_size; -+ var p, n, m, more, str; -+ -+ //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); -+ -+ do { -+ more = s.window_size - s.lookahead - s.strstart; -+ -+ // JS ints have 32 bit, block below not needed -+ /* Deal with !@#$% 64K limit: */ -+ //if (sizeof(int) <= 2) { -+ // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { -+ // more = wsize; -+ // -+ // } else if (more == (unsigned)(-1)) { -+ // /* Very unlikely, but possible on 16 bit machine if -+ // * strstart == 0 && lookahead == 1 (input done a byte at time) -+ // */ -+ // more--; -+ // } -+ //} -+ -+ -+ /* If the window is almost full and there is insufficient lookahead, -+ * move the upper half to the lower one to make room in the upper half. -+ */ -+ if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { -+ -+ utils.arraySet(s.window, s.window, _w_size, _w_size, 0); -+ s.match_start -= _w_size; -+ s.strstart -= _w_size; -+ /* we now have strstart >= MAX_DIST */ -+ s.block_start -= _w_size; -+ -+ /* Slide the hash table (could be avoided with 32 bit values -+ at the expense of memory usage). We slide even when level == 0 -+ to keep the hash table consistent if we switch back to level > 0 -+ later. (Using level 0 permanently is not an optimal usage of -+ zlib, so we don't care about this pathological case.) -+ */ -+ -+ n = s.hash_size; -+ p = n; -+ do { -+ m = s.head[--p]; -+ s.head[p] = (m >= _w_size ? m - _w_size : 0); -+ } while (--n); -+ -+ n = _w_size; -+ p = n; -+ do { -+ m = s.prev[--p]; -+ s.prev[p] = (m >= _w_size ? m - _w_size : 0); -+ /* If n is not on any hash chain, prev[n] is garbage but -+ * its value will never be used. -+ */ -+ } while (--n); -+ -+ more += _w_size; -+ } -+ if (s.strm.avail_in === 0) { -+ break; -+ } -+ -+ /* If there was no sliding: -+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && -+ * more == window_size - lookahead - strstart -+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) -+ * => more >= window_size - 2*WSIZE + 2 -+ * In the BIG_MEM or MMAP case (not yet supported), -+ * window_size == input_size + MIN_LOOKAHEAD && -+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. -+ * Otherwise, window_size == 2*WSIZE so more >= 2. -+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2. -+ */ -+ //Assert(more >= 2, "more < 2"); -+ n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); -+ s.lookahead += n; -+ -+ /* Initialize the hash value now that we have some input: */ -+ if (s.lookahead + s.insert >= MIN_MATCH) { -+ str = s.strstart - s.insert; -+ s.ins_h = s.window[str]; -+ -+ /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask; -+//#if MIN_MATCH != 3 -+// Call update_hash() MIN_MATCH-3 more times -+//#endif -+ while (s.insert) { -+ /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; -+ -+ s.prev[str & s.w_mask] = s.head[s.ins_h]; -+ s.head[s.ins_h] = str; -+ str++; -+ s.insert--; -+ if (s.lookahead + s.insert < MIN_MATCH) { -+ break; -+ } -+ } -+ } -+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, -+ * but this is not important since only literal bytes will be emitted. -+ */ -+ -+ } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); -+ -+ /* If the WIN_INIT bytes after the end of the current data have never been -+ * written, then zero those bytes in order to avoid memory check reports of -+ * the use of uninitialized (or uninitialised as Julian writes) bytes by -+ * the longest match routines. Update the high water mark for the next -+ * time through here. WIN_INIT is set to MAX_MATCH since the longest match -+ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. -+ */ -+// if (s.high_water < s.window_size) { -+// var curr = s.strstart + s.lookahead; -+// var init = 0; -+// -+// if (s.high_water < curr) { -+// /* Previous high water mark below current data -- zero WIN_INIT -+// * bytes or up to end of window, whichever is less. -+// */ -+// init = s.window_size - curr; -+// if (init > WIN_INIT) -+// init = WIN_INIT; -+// zmemzero(s->window + curr, (unsigned)init); -+// s->high_water = curr + init; -+// } -+// else if (s->high_water < (ulg)curr + WIN_INIT) { -+// /* High water mark at or above current data, but below current data -+// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up -+// * to end of window, whichever is less. -+// */ -+// init = (ulg)curr + WIN_INIT - s->high_water; -+// if (init > s->window_size - s->high_water) -+// init = s->window_size - s->high_water; -+// zmemzero(s->window + s->high_water, (unsigned)init); -+// s->high_water += init; -+// } -+// } -+// -+// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, -+// "not enough room for search"); -+} -+ -+/* =========================================================================== -+ * Copy without compression as much as possible from the input stream, return -+ * the current block state. -+ * This function does not insert new strings in the dictionary since -+ * uncompressible data is probably not useful. This function is used -+ * only for the level=0 compression option. -+ * NOTE: this function should be optimized to avoid extra copying from -+ * window to pending_buf. -+ */ -+function deflate_stored(s, flush) { -+ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited -+ * to pending_buf_size, and each stored block has a 5 byte header: -+ */ -+ var max_block_size = 0xffff; -+ -+ if (max_block_size > s.pending_buf_size - 5) { -+ max_block_size = s.pending_buf_size - 5; -+ } -+ -+ /* Copy as much as possible from input to output: */ -+ for (;;) { -+ /* Fill the window as much as possible: */ -+ if (s.lookahead <= 1) { -+ -+ //Assert(s->strstart < s->w_size+MAX_DIST(s) || -+ // s->block_start >= (long)s->w_size, "slide too late"); -+// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) || -+// s.block_start >= s.w_size)) { -+// throw new Error("slide too late"); -+// } -+ -+ fill_window(s); -+ if (s.lookahead === 0 && flush === Z_NO_FLUSH) { -+ return BS_NEED_MORE; -+ } -+ -+ if (s.lookahead === 0) { -+ break; -+ } -+ /* flush the current block */ -+ } -+ //Assert(s->block_start >= 0L, "block gone"); -+// if (s.block_start < 0) throw new Error("block gone"); -+ -+ s.strstart += s.lookahead; -+ s.lookahead = 0; -+ -+ /* Emit a stored block if pending_buf will be full: */ -+ var max_start = s.block_start + max_block_size; -+ -+ if (s.strstart === 0 || s.strstart >= max_start) { -+ /* strstart == 0 is possible when wraparound on 16-bit machine */ -+ s.lookahead = s.strstart - max_start; -+ s.strstart = max_start; -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ -+ -+ } -+ /* Flush if we may have to slide, otherwise block_start may become -+ * negative and the data will be gone: -+ */ -+ if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ } -+ -+ s.insert = 0; -+ -+ if (flush === Z_FINISH) { -+ /*** FLUSH_BLOCK(s, 1); ***/ -+ flush_block_only(s, true); -+ if (s.strm.avail_out === 0) { -+ return BS_FINISH_STARTED; -+ } -+ /***/ -+ return BS_FINISH_DONE; -+ } -+ -+ if (s.strstart > s.block_start) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ -+ return BS_NEED_MORE; -+} -+ -+/* =========================================================================== -+ * Compress as much as possible from the input stream, return the current -+ * block state. -+ * This function does not perform lazy evaluation of matches and inserts -+ * new strings in the dictionary only for unmatched strings or for short -+ * matches. It is used only for the fast compression options. -+ */ -+function deflate_fast(s, flush) { -+ var hash_head; /* head of the hash chain */ -+ var bflush; /* set if current block must be flushed */ -+ -+ for (;;) { -+ /* Make sure that we always have enough lookahead, except -+ * at the end of the input file. We need MAX_MATCH bytes -+ * for the next match, plus MIN_MATCH bytes to insert the -+ * string following the next match. -+ */ -+ if (s.lookahead < MIN_LOOKAHEAD) { -+ fill_window(s); -+ if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { -+ return BS_NEED_MORE; -+ } -+ if (s.lookahead === 0) { -+ break; /* flush the current block */ -+ } -+ } -+ -+ /* Insert the string window[strstart .. strstart+2] in the -+ * dictionary, and set hash_head to the head of the hash chain: -+ */ -+ hash_head = 0/*NIL*/; -+ if (s.lookahead >= MIN_MATCH) { -+ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; -+ hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; -+ s.head[s.ins_h] = s.strstart; -+ /***/ -+ } -+ -+ /* Find the longest match, discarding those <= prev_length. -+ * At this point we have always match_length < MIN_MATCH -+ */ -+ if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { -+ /* To simplify the code, we prevent matches with the string -+ * of window index 0 (in particular we have to avoid a match -+ * of the string with itself at the start of the input file). -+ */ -+ s.match_length = longest_match(s, hash_head); -+ /* longest_match() sets match_start */ -+ } -+ if (s.match_length >= MIN_MATCH) { -+ // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only -+ -+ /*** _tr_tally_dist(s, s.strstart - s.match_start, -+ s.match_length - MIN_MATCH, bflush); ***/ -+ bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); -+ -+ s.lookahead -= s.match_length; -+ -+ /* Insert new strings in the hash table only if the match length -+ * is not too large. This saves time but degrades compression. -+ */ -+ if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { -+ s.match_length--; /* string at strstart already in table */ -+ do { -+ s.strstart++; -+ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; -+ hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; -+ s.head[s.ins_h] = s.strstart; -+ /***/ -+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are -+ * always MIN_MATCH bytes ahead. -+ */ -+ } while (--s.match_length !== 0); -+ s.strstart++; -+ } else -+ { -+ s.strstart += s.match_length; -+ s.match_length = 0; -+ s.ins_h = s.window[s.strstart]; -+ /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask; -+ -+//#if MIN_MATCH != 3 -+// Call UPDATE_HASH() MIN_MATCH-3 more times -+//#endif -+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not -+ * matter since it will be recomputed at next deflate call. -+ */ -+ } -+ } else { -+ /* No match, output a literal byte */ -+ //Tracevv((stderr,"%c", s.window[s.strstart])); -+ /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ -+ bflush = trees._tr_tally(s, 0, s.window[s.strstart]); -+ -+ s.lookahead--; -+ s.strstart++; -+ } -+ if (bflush) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ } -+ s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); -+ if (flush === Z_FINISH) { -+ /*** FLUSH_BLOCK(s, 1); ***/ -+ flush_block_only(s, true); -+ if (s.strm.avail_out === 0) { -+ return BS_FINISH_STARTED; -+ } -+ /***/ -+ return BS_FINISH_DONE; -+ } -+ if (s.last_lit) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ return BS_BLOCK_DONE; -+} -+ -+/* =========================================================================== -+ * Same as above, but achieves better compression. We use a lazy -+ * evaluation for matches: a match is finally adopted only if there is -+ * no better match at the next window position. -+ */ -+function deflate_slow(s, flush) { -+ var hash_head; /* head of hash chain */ -+ var bflush; /* set if current block must be flushed */ -+ -+ var max_insert; -+ -+ /* Process the input block. */ -+ for (;;) { -+ /* Make sure that we always have enough lookahead, except -+ * at the end of the input file. We need MAX_MATCH bytes -+ * for the next match, plus MIN_MATCH bytes to insert the -+ * string following the next match. -+ */ -+ if (s.lookahead < MIN_LOOKAHEAD) { -+ fill_window(s); -+ if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) { -+ return BS_NEED_MORE; -+ } -+ if (s.lookahead === 0) { break; } /* flush the current block */ -+ } -+ -+ /* Insert the string window[strstart .. strstart+2] in the -+ * dictionary, and set hash_head to the head of the hash chain: -+ */ -+ hash_head = 0/*NIL*/; -+ if (s.lookahead >= MIN_MATCH) { -+ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; -+ hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; -+ s.head[s.ins_h] = s.strstart; -+ /***/ -+ } -+ -+ /* Find the longest match, discarding those <= prev_length. -+ */ -+ s.prev_length = s.match_length; -+ s.prev_match = s.match_start; -+ s.match_length = MIN_MATCH - 1; -+ -+ if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && -+ s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { -+ /* To simplify the code, we prevent matches with the string -+ * of window index 0 (in particular we have to avoid a match -+ * of the string with itself at the start of the input file). -+ */ -+ s.match_length = longest_match(s, hash_head); -+ /* longest_match() sets match_start */ -+ -+ if (s.match_length <= 5 && -+ (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { -+ -+ /* If prev_match is also MIN_MATCH, match_start is garbage -+ * but we will ignore the current match anyway. -+ */ -+ s.match_length = MIN_MATCH - 1; -+ } -+ } -+ /* If there was a match at the previous step and the current -+ * match is not better, output the previous match: -+ */ -+ if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { -+ max_insert = s.strstart + s.lookahead - MIN_MATCH; -+ /* Do not insert strings in hash table beyond this. */ -+ -+ //check_match(s, s.strstart-1, s.prev_match, s.prev_length); -+ -+ /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, -+ s.prev_length - MIN_MATCH, bflush);***/ -+ bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); -+ /* Insert in hash table all strings up to the end of the match. -+ * strstart-1 and strstart are already inserted. If there is not -+ * enough lookahead, the last two strings are not inserted in -+ * the hash table. -+ */ -+ s.lookahead -= s.prev_length - 1; -+ s.prev_length -= 2; -+ do { -+ if (++s.strstart <= max_insert) { -+ /*** INSERT_STRING(s, s.strstart, hash_head); ***/ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask; -+ hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; -+ s.head[s.ins_h] = s.strstart; -+ /***/ -+ } -+ } while (--s.prev_length !== 0); -+ s.match_available = 0; -+ s.match_length = MIN_MATCH - 1; -+ s.strstart++; -+ -+ if (bflush) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ -+ } else if (s.match_available) { -+ /* If there was no match at the previous position, output a -+ * single literal. If there was a match but the current match -+ * is longer, truncate the previous match to a single literal. -+ */ -+ //Tracevv((stderr,"%c", s->window[s->strstart-1])); -+ /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ -+ bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); -+ -+ if (bflush) { -+ /*** FLUSH_BLOCK_ONLY(s, 0) ***/ -+ flush_block_only(s, false); -+ /***/ -+ } -+ s.strstart++; -+ s.lookahead--; -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ } else { -+ /* There is no previous match to compare with, wait for -+ * the next step to decide. -+ */ -+ s.match_available = 1; -+ s.strstart++; -+ s.lookahead--; -+ } -+ } -+ //Assert (flush != Z_NO_FLUSH, "no flush?"); -+ if (s.match_available) { -+ //Tracevv((stderr,"%c", s->window[s->strstart-1])); -+ /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ -+ bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); -+ -+ s.match_available = 0; -+ } -+ s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; -+ if (flush === Z_FINISH) { -+ /*** FLUSH_BLOCK(s, 1); ***/ -+ flush_block_only(s, true); -+ if (s.strm.avail_out === 0) { -+ return BS_FINISH_STARTED; -+ } -+ /***/ -+ return BS_FINISH_DONE; -+ } -+ if (s.last_lit) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ -+ return BS_BLOCK_DONE; -+} -+ -+ -+/* =========================================================================== -+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance -+ * one. Do not maintain a hash table. (It will be regenerated if this run of -+ * deflate switches away from Z_RLE.) -+ */ -+function deflate_rle(s, flush) { -+ var bflush; /* set if current block must be flushed */ -+ var prev; /* byte at distance one to match */ -+ var scan, strend; /* scan goes up to strend for length of run */ -+ -+ var _win = s.window; -+ -+ for (;;) { -+ /* Make sure that we always have enough lookahead, except -+ * at the end of the input file. We need MAX_MATCH bytes -+ * for the longest run, plus one for the unrolled loop. -+ */ -+ if (s.lookahead <= MAX_MATCH) { -+ fill_window(s); -+ if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) { -+ return BS_NEED_MORE; -+ } -+ if (s.lookahead === 0) { break; } /* flush the current block */ -+ } -+ -+ /* See how many times the previous byte repeats */ -+ s.match_length = 0; -+ if (s.lookahead >= MIN_MATCH && s.strstart > 0) { -+ scan = s.strstart - 1; -+ prev = _win[scan]; -+ if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { -+ strend = s.strstart + MAX_MATCH; -+ do { -+ /*jshint noempty:false*/ -+ } while (prev === _win[++scan] && prev === _win[++scan] && -+ prev === _win[++scan] && prev === _win[++scan] && -+ prev === _win[++scan] && prev === _win[++scan] && -+ prev === _win[++scan] && prev === _win[++scan] && -+ scan < strend); -+ s.match_length = MAX_MATCH - (strend - scan); -+ if (s.match_length > s.lookahead) { -+ s.match_length = s.lookahead; -+ } -+ } -+ //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); -+ } -+ -+ /* Emit match if have run of MIN_MATCH or longer, else emit literal */ -+ if (s.match_length >= MIN_MATCH) { -+ //check_match(s, s.strstart, s.strstart - 1, s.match_length); -+ -+ /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ -+ bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH); -+ -+ s.lookahead -= s.match_length; -+ s.strstart += s.match_length; -+ s.match_length = 0; -+ } else { -+ /* No match, output a literal byte */ -+ //Tracevv((stderr,"%c", s->window[s->strstart])); -+ /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ -+ bflush = trees._tr_tally(s, 0, s.window[s.strstart]); -+ -+ s.lookahead--; -+ s.strstart++; -+ } -+ if (bflush) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ } -+ s.insert = 0; -+ if (flush === Z_FINISH) { -+ /*** FLUSH_BLOCK(s, 1); ***/ -+ flush_block_only(s, true); -+ if (s.strm.avail_out === 0) { -+ return BS_FINISH_STARTED; -+ } -+ /***/ -+ return BS_FINISH_DONE; -+ } -+ if (s.last_lit) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ return BS_BLOCK_DONE; -+} -+ -+/* =========================================================================== -+ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. -+ * (It will be regenerated if this run of deflate switches away from Huffman.) -+ */ -+function deflate_huff(s, flush) { -+ var bflush; /* set if current block must be flushed */ -+ -+ for (;;) { -+ /* Make sure that we have a literal to write. */ -+ if (s.lookahead === 0) { -+ fill_window(s); -+ if (s.lookahead === 0) { -+ if (flush === Z_NO_FLUSH) { -+ return BS_NEED_MORE; -+ } -+ break; /* flush the current block */ -+ } -+ } -+ -+ /* Output a literal byte */ -+ s.match_length = 0; -+ //Tracevv((stderr,"%c", s->window[s->strstart])); -+ /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ -+ bflush = trees._tr_tally(s, 0, s.window[s.strstart]); -+ s.lookahead--; -+ s.strstart++; -+ if (bflush) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ } -+ s.insert = 0; -+ if (flush === Z_FINISH) { -+ /*** FLUSH_BLOCK(s, 1); ***/ -+ flush_block_only(s, true); -+ if (s.strm.avail_out === 0) { -+ return BS_FINISH_STARTED; -+ } -+ /***/ -+ return BS_FINISH_DONE; -+ } -+ if (s.last_lit) { -+ /*** FLUSH_BLOCK(s, 0); ***/ -+ flush_block_only(s, false); -+ if (s.strm.avail_out === 0) { -+ return BS_NEED_MORE; -+ } -+ /***/ -+ } -+ return BS_BLOCK_DONE; -+} -+ -+/* Values for max_lazy_match, good_match and max_chain_length, depending on -+ * the desired pack level (0..9). The values given below have been tuned to -+ * exclude worst case performance for pathological files. Better values may be -+ * found for specific files. -+ */ -+function Config(good_length, max_lazy, nice_length, max_chain, func) { -+ this.good_length = good_length; -+ this.max_lazy = max_lazy; -+ this.nice_length = nice_length; -+ this.max_chain = max_chain; -+ this.func = func; -+} -+ -+var configuration_table; -+ -+configuration_table = [ -+ /* good lazy nice chain */ -+ new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ -+ new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ -+ new Config(4, 5, 16, 8, deflate_fast), /* 2 */ -+ new Config(4, 6, 32, 32, deflate_fast), /* 3 */ -+ -+ new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ -+ new Config(8, 16, 32, 32, deflate_slow), /* 5 */ -+ new Config(8, 16, 128, 128, deflate_slow), /* 6 */ -+ new Config(8, 32, 128, 256, deflate_slow), /* 7 */ -+ new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ -+ new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ -+]; -+ -+ -+/* =========================================================================== -+ * Initialize the "longest match" routines for a new zlib stream -+ */ -+function lm_init(s) { -+ s.window_size = 2 * s.w_size; -+ -+ /*** CLEAR_HASH(s); ***/ -+ zero(s.head); // Fill with NIL (= 0); -+ -+ /* Set the default configuration parameters: -+ */ -+ s.max_lazy_match = configuration_table[s.level].max_lazy; -+ s.good_match = configuration_table[s.level].good_length; -+ s.nice_match = configuration_table[s.level].nice_length; -+ s.max_chain_length = configuration_table[s.level].max_chain; -+ -+ s.strstart = 0; -+ s.block_start = 0; -+ s.lookahead = 0; -+ s.insert = 0; -+ s.match_length = s.prev_length = MIN_MATCH - 1; -+ s.match_available = 0; -+ s.ins_h = 0; -+} -+ -+ -+function DeflateState() { -+ this.strm = null; /* pointer back to this zlib stream */ -+ this.status = 0; /* as the name implies */ -+ this.pending_buf = null; /* output still pending */ -+ this.pending_buf_size = 0; /* size of pending_buf */ -+ this.pending_out = 0; /* next pending byte to output to the stream */ -+ this.pending = 0; /* nb of bytes in the pending buffer */ -+ this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ -+ this.gzhead = null; /* gzip header information to write */ -+ this.gzindex = 0; /* where in extra, name, or comment */ -+ this.method = Z_DEFLATED; /* can only be DEFLATED */ -+ this.last_flush = -1; /* value of flush param for previous deflate call */ -+ -+ this.w_size = 0; /* LZ77 window size (32K by default) */ -+ this.w_bits = 0; /* log2(w_size) (8..16) */ -+ this.w_mask = 0; /* w_size - 1 */ -+ -+ this.window = null; -+ /* Sliding window. Input bytes are read into the second half of the window, -+ * and move to the first half later to keep a dictionary of at least wSize -+ * bytes. With this organization, matches are limited to a distance of -+ * wSize-MAX_MATCH bytes, but this ensures that IO is always -+ * performed with a length multiple of the block size. -+ */ -+ -+ this.window_size = 0; -+ /* Actual size of window: 2*wSize, except when the user input buffer -+ * is directly used as sliding window. -+ */ -+ -+ this.prev = null; -+ /* Link to older string with same hash index. To limit the size of this -+ * array to 64K, this link is maintained only for the last 32K strings. -+ * An index in this array is thus a window index modulo 32K. -+ */ -+ -+ this.head = null; /* Heads of the hash chains or NIL. */ -+ -+ this.ins_h = 0; /* hash index of string to be inserted */ -+ this.hash_size = 0; /* number of elements in hash table */ -+ this.hash_bits = 0; /* log2(hash_size) */ -+ this.hash_mask = 0; /* hash_size-1 */ -+ -+ this.hash_shift = 0; -+ /* Number of bits by which ins_h must be shifted at each input -+ * step. It must be such that after MIN_MATCH steps, the oldest -+ * byte no longer takes part in the hash key, that is: -+ * hash_shift * MIN_MATCH >= hash_bits -+ */ -+ -+ this.block_start = 0; -+ /* Window position at the beginning of the current output block. Gets -+ * negative when the window is moved backwards. -+ */ -+ -+ this.match_length = 0; /* length of best match */ -+ this.prev_match = 0; /* previous match */ -+ this.match_available = 0; /* set if previous match exists */ -+ this.strstart = 0; /* start of string to insert */ -+ this.match_start = 0; /* start of matching string */ -+ this.lookahead = 0; /* number of valid bytes ahead in window */ -+ -+ this.prev_length = 0; -+ /* Length of the best match at previous step. Matches not greater than this -+ * are discarded. This is used in the lazy match evaluation. -+ */ -+ -+ this.max_chain_length = 0; -+ /* To speed up deflation, hash chains are never searched beyond this -+ * length. A higher limit improves compression ratio but degrades the -+ * speed. -+ */ -+ -+ this.max_lazy_match = 0; -+ /* Attempt to find a better match only when the current match is strictly -+ * smaller than this value. This mechanism is used only for compression -+ * levels >= 4. -+ */ -+ // That's alias to max_lazy_match, don't use directly -+ //this.max_insert_length = 0; -+ /* Insert new strings in the hash table only if the match length is not -+ * greater than this length. This saves time but degrades compression. -+ * max_insert_length is used only for compression levels <= 3. -+ */ -+ -+ this.level = 0; /* compression level (1..9) */ -+ this.strategy = 0; /* favor or force Huffman coding*/ -+ -+ this.good_match = 0; -+ /* Use a faster search when the previous match is longer than this */ -+ -+ this.nice_match = 0; /* Stop searching when current match exceeds this */ -+ -+ /* used by trees.c: */ -+ -+ /* Didn't use ct_data typedef below to suppress compiler warning */ -+ -+ // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ -+ // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ -+ // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ -+ -+ // Use flat array of DOUBLE size, with interleaved fata, -+ // because JS does not support effective -+ this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); -+ this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); -+ this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); -+ zero(this.dyn_ltree); -+ zero(this.dyn_dtree); -+ zero(this.bl_tree); -+ -+ this.l_desc = null; /* desc. for literal tree */ -+ this.d_desc = null; /* desc. for distance tree */ -+ this.bl_desc = null; /* desc. for bit length tree */ -+ -+ //ush bl_count[MAX_BITS+1]; -+ this.bl_count = new utils.Buf16(MAX_BITS + 1); -+ /* number of codes at each bit length for an optimal tree */ -+ -+ //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ -+ this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ -+ zero(this.heap); -+ -+ this.heap_len = 0; /* number of elements in the heap */ -+ this.heap_max = 0; /* element of largest frequency */ -+ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. -+ * The same heap array is used to build all trees. -+ */ -+ -+ this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; -+ zero(this.depth); -+ /* Depth of each subtree used as tie breaker for trees of equal frequency -+ */ -+ -+ this.l_buf = 0; /* buffer index for literals or lengths */ -+ -+ this.lit_bufsize = 0; -+ /* Size of match buffer for literals/lengths. There are 4 reasons for -+ * limiting lit_bufsize to 64K: -+ * - frequencies can be kept in 16 bit counters -+ * - if compression is not successful for the first block, all input -+ * data is still in the window so we can still emit a stored block even -+ * when input comes from standard input. (This can also be done for -+ * all blocks if lit_bufsize is not greater than 32K.) -+ * - if compression is not successful for a file smaller than 64K, we can -+ * even emit a stored file instead of a stored block (saving 5 bytes). -+ * This is applicable only for zip (not gzip or zlib). -+ * - creating new Huffman trees less frequently may not provide fast -+ * adaptation to changes in the input data statistics. (Take for -+ * example a binary file with poorly compressible code followed by -+ * a highly compressible string table.) Smaller buffer sizes give -+ * fast adaptation but have of course the overhead of transmitting -+ * trees more frequently. -+ * - I can't count above 4 -+ */ -+ -+ this.last_lit = 0; /* running index in l_buf */ -+ -+ this.d_buf = 0; -+ /* Buffer index for distances. To simplify the code, d_buf and l_buf have -+ * the same number of elements. To use different lengths, an extra flag -+ * array would be necessary. -+ */ -+ -+ this.opt_len = 0; /* bit length of current block with optimal trees */ -+ this.static_len = 0; /* bit length of current block with static trees */ -+ this.matches = 0; /* number of string matches in current block */ -+ this.insert = 0; /* bytes at end of window left to insert */ -+ -+ -+ this.bi_buf = 0; -+ /* Output buffer. bits are inserted starting at the bottom (least -+ * significant bits). -+ */ -+ this.bi_valid = 0; -+ /* Number of valid bits in bi_buf. All bits above the last valid bit -+ * are always zero. -+ */ -+ -+ // Used for window memory init. We safely ignore it for JS. That makes -+ // sense only for pointers and memory check tools. -+ //this.high_water = 0; -+ /* High water mark offset in window for initialized bytes -- bytes above -+ * this are set to zero in order to avoid memory check warnings when -+ * longest match routines access bytes past the input. This is then -+ * updated to the new high water mark. -+ */ -+} -+ -+ -+function deflateResetKeep(strm) { -+ var s; -+ -+ if (!strm || !strm.state) { -+ return err(strm, Z_STREAM_ERROR); -+ } -+ -+ strm.total_in = strm.total_out = 0; -+ strm.data_type = Z_UNKNOWN; -+ -+ s = strm.state; -+ s.pending = 0; -+ s.pending_out = 0; -+ -+ if (s.wrap < 0) { -+ s.wrap = -s.wrap; -+ /* was made negative by deflate(..., Z_FINISH); */ -+ } -+ s.status = (s.wrap ? INIT_STATE : BUSY_STATE); -+ strm.adler = (s.wrap === 2) ? -+ 0 // crc32(0, Z_NULL, 0) -+ : -+ 1; // adler32(0, Z_NULL, 0) -+ s.last_flush = Z_NO_FLUSH; -+ trees._tr_init(s); -+ return Z_OK; -+} -+ -+ -+function deflateReset(strm) { -+ var ret = deflateResetKeep(strm); -+ if (ret === Z_OK) { -+ lm_init(strm.state); -+ } -+ return ret; -+} -+ -+ -+function deflateSetHeader(strm, head) { -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; } -+ strm.state.gzhead = head; -+ return Z_OK; -+} -+ -+ -+function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { -+ if (!strm) { // === Z_NULL -+ return Z_STREAM_ERROR; -+ } -+ var wrap = 1; -+ -+ if (level === Z_DEFAULT_COMPRESSION) { -+ level = 6; -+ } -+ -+ if (windowBits < 0) { /* suppress zlib wrapper */ -+ wrap = 0; -+ windowBits = -windowBits; -+ } -+ -+ else if (windowBits > 15) { -+ wrap = 2; /* write gzip wrapper instead */ -+ windowBits -= 16; -+ } -+ -+ -+ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || -+ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || -+ strategy < 0 || strategy > Z_FIXED) { -+ return err(strm, Z_STREAM_ERROR); -+ } -+ -+ -+ if (windowBits === 8) { -+ windowBits = 9; -+ } -+ /* until 256-byte window bug fixed */ -+ -+ var s = new DeflateState(); -+ -+ strm.state = s; -+ s.strm = strm; -+ -+ s.wrap = wrap; -+ s.gzhead = null; -+ s.w_bits = windowBits; -+ s.w_size = 1 << s.w_bits; -+ s.w_mask = s.w_size - 1; -+ -+ s.hash_bits = memLevel + 7; -+ s.hash_size = 1 << s.hash_bits; -+ s.hash_mask = s.hash_size - 1; -+ s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); -+ -+ s.window = new utils.Buf8(s.w_size * 2); -+ s.head = new utils.Buf16(s.hash_size); -+ s.prev = new utils.Buf16(s.w_size); -+ -+ // Don't need mem init magic for JS. -+ //s.high_water = 0; /* nothing written to s->window yet */ -+ -+ s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ -+ -+ s.pending_buf_size = s.lit_bufsize * 4; -+ -+ //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); -+ //s->pending_buf = (uchf *) overlay; -+ s.pending_buf = new utils.Buf8(s.pending_buf_size); -+ -+ // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) -+ //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); -+ s.d_buf = 1 * s.lit_bufsize; -+ -+ //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; -+ s.l_buf = (1 + 2) * s.lit_bufsize; -+ -+ s.level = level; -+ s.strategy = strategy; -+ s.method = method; -+ -+ return deflateReset(strm); -+} -+ -+function deflateInit(strm, level) { -+ return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); -+} -+ -+ -+function deflate(strm, flush) { -+ var old_flush, s; -+ var beg, val; // for gzip header write only -+ -+ if (!strm || !strm.state || -+ flush > Z_BLOCK || flush < 0) { -+ return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR; -+ } -+ -+ s = strm.state; -+ -+ if (!strm.output || -+ (!strm.input && strm.avail_in !== 0) || -+ (s.status === FINISH_STATE && flush !== Z_FINISH)) { -+ return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR); -+ } -+ -+ s.strm = strm; /* just in case */ -+ old_flush = s.last_flush; -+ s.last_flush = flush; -+ -+ /* Write the header */ -+ if (s.status === INIT_STATE) { -+ -+ if (s.wrap === 2) { // GZIP header -+ strm.adler = 0; //crc32(0L, Z_NULL, 0); -+ put_byte(s, 31); -+ put_byte(s, 139); -+ put_byte(s, 8); -+ if (!s.gzhead) { // s->gzhead == Z_NULL -+ put_byte(s, 0); -+ put_byte(s, 0); -+ put_byte(s, 0); -+ put_byte(s, 0); -+ put_byte(s, 0); -+ put_byte(s, s.level === 9 ? 2 : -+ (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? -+ 4 : 0)); -+ put_byte(s, OS_CODE); -+ s.status = BUSY_STATE; -+ } -+ else { -+ put_byte(s, (s.gzhead.text ? 1 : 0) + -+ (s.gzhead.hcrc ? 2 : 0) + -+ (!s.gzhead.extra ? 0 : 4) + -+ (!s.gzhead.name ? 0 : 8) + -+ (!s.gzhead.comment ? 0 : 16) -+ ); -+ put_byte(s, s.gzhead.time & 0xff); -+ put_byte(s, (s.gzhead.time >> 8) & 0xff); -+ put_byte(s, (s.gzhead.time >> 16) & 0xff); -+ put_byte(s, (s.gzhead.time >> 24) & 0xff); -+ put_byte(s, s.level === 9 ? 2 : -+ (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? -+ 4 : 0)); -+ put_byte(s, s.gzhead.os & 0xff); -+ if (s.gzhead.extra && s.gzhead.extra.length) { -+ put_byte(s, s.gzhead.extra.length & 0xff); -+ put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); -+ } -+ if (s.gzhead.hcrc) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0); -+ } -+ s.gzindex = 0; -+ s.status = EXTRA_STATE; -+ } -+ } -+ else // DEFLATE header -+ { -+ var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8; -+ var level_flags = -1; -+ -+ if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { -+ level_flags = 0; -+ } else if (s.level < 6) { -+ level_flags = 1; -+ } else if (s.level === 6) { -+ level_flags = 2; -+ } else { -+ level_flags = 3; -+ } -+ header |= (level_flags << 6); -+ if (s.strstart !== 0) { header |= PRESET_DICT; } -+ header += 31 - (header % 31); -+ -+ s.status = BUSY_STATE; -+ putShortMSB(s, header); -+ -+ /* Save the adler32 of the preset dictionary: */ -+ if (s.strstart !== 0) { -+ putShortMSB(s, strm.adler >>> 16); -+ putShortMSB(s, strm.adler & 0xffff); -+ } -+ strm.adler = 1; // adler32(0L, Z_NULL, 0); -+ } -+ } -+ -+//#ifdef GZIP -+ if (s.status === EXTRA_STATE) { -+ if (s.gzhead.extra/* != Z_NULL*/) { -+ beg = s.pending; /* start of bytes to update crc */ -+ -+ while (s.gzindex < (s.gzhead.extra.length & 0xffff)) { -+ if (s.pending === s.pending_buf_size) { -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ flush_pending(strm); -+ beg = s.pending; -+ if (s.pending === s.pending_buf_size) { -+ break; -+ } -+ } -+ put_byte(s, s.gzhead.extra[s.gzindex] & 0xff); -+ s.gzindex++; -+ } -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ if (s.gzindex === s.gzhead.extra.length) { -+ s.gzindex = 0; -+ s.status = NAME_STATE; -+ } -+ } -+ else { -+ s.status = NAME_STATE; -+ } -+ } -+ if (s.status === NAME_STATE) { -+ if (s.gzhead.name/* != Z_NULL*/) { -+ beg = s.pending; /* start of bytes to update crc */ -+ //int val; -+ -+ do { -+ if (s.pending === s.pending_buf_size) { -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ flush_pending(strm); -+ beg = s.pending; -+ if (s.pending === s.pending_buf_size) { -+ val = 1; -+ break; -+ } -+ } -+ // JS specific: little magic to add zero terminator to end of string -+ if (s.gzindex < s.gzhead.name.length) { -+ val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; -+ } else { -+ val = 0; -+ } -+ put_byte(s, val); -+ } while (val !== 0); -+ -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ if (val === 0) { -+ s.gzindex = 0; -+ s.status = COMMENT_STATE; -+ } -+ } -+ else { -+ s.status = COMMENT_STATE; -+ } -+ } -+ if (s.status === COMMENT_STATE) { -+ if (s.gzhead.comment/* != Z_NULL*/) { -+ beg = s.pending; /* start of bytes to update crc */ -+ //int val; -+ -+ do { -+ if (s.pending === s.pending_buf_size) { -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ flush_pending(strm); -+ beg = s.pending; -+ if (s.pending === s.pending_buf_size) { -+ val = 1; -+ break; -+ } -+ } -+ // JS specific: little magic to add zero terminator to end of string -+ if (s.gzindex < s.gzhead.comment.length) { -+ val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; -+ } else { -+ val = 0; -+ } -+ put_byte(s, val); -+ } while (val !== 0); -+ -+ if (s.gzhead.hcrc && s.pending > beg) { -+ strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); -+ } -+ if (val === 0) { -+ s.status = HCRC_STATE; -+ } -+ } -+ else { -+ s.status = HCRC_STATE; -+ } -+ } -+ if (s.status === HCRC_STATE) { -+ if (s.gzhead.hcrc) { -+ if (s.pending + 2 > s.pending_buf_size) { -+ flush_pending(strm); -+ } -+ if (s.pending + 2 <= s.pending_buf_size) { -+ put_byte(s, strm.adler & 0xff); -+ put_byte(s, (strm.adler >> 8) & 0xff); -+ strm.adler = 0; //crc32(0L, Z_NULL, 0); -+ s.status = BUSY_STATE; -+ } -+ } -+ else { -+ s.status = BUSY_STATE; -+ } -+ } -+//#endif -+ -+ /* Flush as much pending output as possible */ -+ if (s.pending !== 0) { -+ flush_pending(strm); -+ if (strm.avail_out === 0) { -+ /* Since avail_out is 0, deflate will be called again with -+ * more output space, but possibly with both pending and -+ * avail_in equal to zero. There won't be anything to do, -+ * but this is not an error situation so make sure we -+ * return OK instead of BUF_ERROR at next call of deflate: -+ */ -+ s.last_flush = -1; -+ return Z_OK; -+ } -+ -+ /* Make sure there is something to do and avoid duplicate consecutive -+ * flushes. For repeated and useless calls with Z_FINISH, we keep -+ * returning Z_STREAM_END instead of Z_BUF_ERROR. -+ */ -+ } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && -+ flush !== Z_FINISH) { -+ return err(strm, Z_BUF_ERROR); -+ } -+ -+ /* User must not provide more input after the first FINISH: */ -+ if (s.status === FINISH_STATE && strm.avail_in !== 0) { -+ return err(strm, Z_BUF_ERROR); -+ } -+ -+ /* Start a new block or continue the current one. -+ */ -+ if (strm.avail_in !== 0 || s.lookahead !== 0 || -+ (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) { -+ var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) : -+ (s.strategy === Z_RLE ? deflate_rle(s, flush) : -+ configuration_table[s.level].func(s, flush)); -+ -+ if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { -+ s.status = FINISH_STATE; -+ } -+ if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { -+ if (strm.avail_out === 0) { -+ s.last_flush = -1; -+ /* avoid BUF_ERROR next call, see above */ -+ } -+ return Z_OK; -+ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call -+ * of deflate should use the same flush parameter to make sure -+ * that the flush is complete. So we don't have to output an -+ * empty block here, this will be done at next call. This also -+ * ensures that for a very small output buffer, we emit at most -+ * one empty block. -+ */ -+ } -+ if (bstate === BS_BLOCK_DONE) { -+ if (flush === Z_PARTIAL_FLUSH) { -+ trees._tr_align(s); -+ } -+ else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ -+ -+ trees._tr_stored_block(s, 0, 0, false); -+ /* For a full flush, this empty block will be recognized -+ * as a special marker by inflate_sync(). -+ */ -+ if (flush === Z_FULL_FLUSH) { -+ /*** CLEAR_HASH(s); ***/ /* forget history */ -+ zero(s.head); // Fill with NIL (= 0); -+ -+ if (s.lookahead === 0) { -+ s.strstart = 0; -+ s.block_start = 0; -+ s.insert = 0; -+ } -+ } -+ } -+ flush_pending(strm); -+ if (strm.avail_out === 0) { -+ s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ -+ return Z_OK; -+ } -+ } -+ } -+ //Assert(strm->avail_out > 0, "bug2"); -+ //if (strm.avail_out <= 0) { throw new Error("bug2");} -+ -+ if (flush !== Z_FINISH) { return Z_OK; } -+ if (s.wrap <= 0) { return Z_STREAM_END; } -+ -+ /* Write the trailer */ -+ if (s.wrap === 2) { -+ put_byte(s, strm.adler & 0xff); -+ put_byte(s, (strm.adler >> 8) & 0xff); -+ put_byte(s, (strm.adler >> 16) & 0xff); -+ put_byte(s, (strm.adler >> 24) & 0xff); -+ put_byte(s, strm.total_in & 0xff); -+ put_byte(s, (strm.total_in >> 8) & 0xff); -+ put_byte(s, (strm.total_in >> 16) & 0xff); -+ put_byte(s, (strm.total_in >> 24) & 0xff); -+ } -+ else -+ { -+ putShortMSB(s, strm.adler >>> 16); -+ putShortMSB(s, strm.adler & 0xffff); -+ } -+ -+ flush_pending(strm); -+ /* If avail_out is zero, the application will call deflate again -+ * to flush the rest. -+ */ -+ if (s.wrap > 0) { s.wrap = -s.wrap; } -+ /* write the trailer only once! */ -+ return s.pending !== 0 ? Z_OK : Z_STREAM_END; -+} -+ -+function deflateEnd(strm) { -+ var status; -+ -+ if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { -+ return Z_STREAM_ERROR; -+ } -+ -+ status = strm.state.status; -+ if (status !== INIT_STATE && -+ status !== EXTRA_STATE && -+ status !== NAME_STATE && -+ status !== COMMENT_STATE && -+ status !== HCRC_STATE && -+ status !== BUSY_STATE && -+ status !== FINISH_STATE -+ ) { -+ return err(strm, Z_STREAM_ERROR); -+ } -+ -+ strm.state = null; -+ -+ return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; -+} -+ -+ -+/* ========================================================================= -+ * Initializes the compression dictionary from the given byte -+ * sequence without producing any compressed output. -+ */ -+function deflateSetDictionary(strm, dictionary) { -+ var dictLength = dictionary.length; -+ -+ var s; -+ var str, n; -+ var wrap; -+ var avail; -+ var next; -+ var input; -+ var tmpDict; -+ -+ if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { -+ return Z_STREAM_ERROR; -+ } -+ -+ s = strm.state; -+ wrap = s.wrap; -+ -+ if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { -+ return Z_STREAM_ERROR; -+ } -+ -+ /* when using zlib wrappers, compute Adler-32 for provided dictionary */ -+ if (wrap === 1) { -+ /* adler32(strm->adler, dictionary, dictLength); */ -+ strm.adler = adler32(strm.adler, dictionary, dictLength, 0); -+ } -+ -+ s.wrap = 0; /* avoid computing Adler-32 in read_buf */ -+ -+ /* if dictionary would fill window, just replace the history */ -+ if (dictLength >= s.w_size) { -+ if (wrap === 0) { /* already empty otherwise */ -+ /*** CLEAR_HASH(s); ***/ -+ zero(s.head); // Fill with NIL (= 0); -+ s.strstart = 0; -+ s.block_start = 0; -+ s.insert = 0; -+ } -+ /* use the tail */ -+ // dictionary = dictionary.slice(dictLength - s.w_size); -+ tmpDict = new utils.Buf8(s.w_size); -+ utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); -+ dictionary = tmpDict; -+ dictLength = s.w_size; -+ } -+ /* insert dictionary into window and hash */ -+ avail = strm.avail_in; -+ next = strm.next_in; -+ input = strm.input; -+ strm.avail_in = dictLength; -+ strm.next_in = 0; -+ strm.input = dictionary; -+ fill_window(s); -+ while (s.lookahead >= MIN_MATCH) { -+ str = s.strstart; -+ n = s.lookahead - (MIN_MATCH - 1); -+ do { -+ /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ -+ s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; -+ -+ s.prev[str & s.w_mask] = s.head[s.ins_h]; -+ -+ s.head[s.ins_h] = str; -+ str++; -+ } while (--n); -+ s.strstart = str; -+ s.lookahead = MIN_MATCH - 1; -+ fill_window(s); -+ } -+ s.strstart += s.lookahead; -+ s.block_start = s.strstart; -+ s.insert = s.lookahead; -+ s.lookahead = 0; -+ s.match_length = s.prev_length = MIN_MATCH - 1; -+ s.match_available = 0; -+ strm.next_in = next; -+ strm.input = input; -+ strm.avail_in = avail; -+ s.wrap = wrap; -+ return Z_OK; -+} -+ -+ -+exports.deflateInit = deflateInit; -+exports.deflateInit2 = deflateInit2; -+exports.deflateReset = deflateReset; -+exports.deflateResetKeep = deflateResetKeep; -+exports.deflateSetHeader = deflateSetHeader; -+exports.deflate = deflate; -+exports.deflateEnd = deflateEnd; -+exports.deflateSetDictionary = deflateSetDictionary; -+exports.deflateInfo = 'pako deflate (from Nodeca project)'; -+ -+/* Not implemented -+exports.deflateBound = deflateBound; -+exports.deflateCopy = deflateCopy; -+exports.deflateParams = deflateParams; -+exports.deflatePending = deflatePending; -+exports.deflatePrime = deflatePrime; -+exports.deflateTune = deflateTune; -+*/ -+ -+}, -+"DlqYxWogbWfCUVvGxSSIutkDEzpgGBAnYSKmowZUeDo=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * fill-range -+ * -+ * Copyright (c) 2014-2015, 2017, Jon Schlinkert. -+ * Released under the MIT License. -+ */ -+ -+'use strict'; -+ -+var util = require('util'); -+var isNumber = require('is-number'); -+var extend = require('extend-shallow'); -+var repeat = require('repeat-string'); -+var toRegex = require('to-regex-range'); -+ -+/** -+ * Return a range of numbers or letters. -+ * -+ * @param {String} `start` Start of the range -+ * @param {String} `stop` End of the range -+ * @param {String} `step` Increment or decrement to use. -+ * @param {Function} `fn` Custom function to modify each element in the range. -+ * @return {Array} -+ */ -+ -+function fillRange(start, stop, step, options) { -+ if (typeof start === 'undefined') { -+ return []; -+ } -+ -+ if (typeof stop === 'undefined' || start === stop) { -+ // special case, for handling negative zero -+ var isString = typeof start === 'string'; -+ if (isNumber(start) && !toNumber(start)) { -+ return [isString ? '0' : 0]; -+ } -+ return [start]; -+ } -+ -+ if (typeof step !== 'number' && typeof step !== 'string') { -+ options = step; -+ step = undefined; -+ } -+ -+ if (typeof options === 'function') { -+ options = { transform: options }; -+ } -+ -+ var opts = extend({step: step}, options); -+ if (opts.step && !isValidNumber(opts.step)) { -+ if (opts.strictRanges === true) { -+ throw new TypeError('expected options.step to be a number'); -+ } -+ return []; -+ } -+ -+ opts.isNumber = isValidNumber(start) && isValidNumber(stop); -+ if (!opts.isNumber && !isValid(start, stop)) { -+ if (opts.strictRanges === true) { -+ throw new RangeError('invalid range arguments: ' + util.inspect([start, stop])); -+ } -+ return []; -+ } -+ -+ opts.isPadded = isPadded(start) || isPadded(stop); -+ opts.toString = opts.stringify -+ || typeof opts.step === 'string' -+ || typeof start === 'string' -+ || typeof stop === 'string' -+ || !opts.isNumber; -+ -+ if (opts.isPadded) { -+ opts.maxLength = Math.max(String(start).length, String(stop).length); -+ } -+ -+ // support legacy minimatch/fill-range options -+ if (typeof opts.optimize === 'boolean') opts.toRegex = opts.optimize; -+ if (typeof opts.makeRe === 'boolean') opts.toRegex = opts.makeRe; -+ return expand(start, stop, opts); -+} -+ -+function expand(start, stop, options) { -+ var a = options.isNumber ? toNumber(start) : start.charCodeAt(0); -+ var b = options.isNumber ? toNumber(stop) : stop.charCodeAt(0); -+ -+ var step = Math.abs(toNumber(options.step)) || 1; -+ if (options.toRegex && step === 1) { -+ return toRange(a, b, start, stop, options); -+ } -+ -+ var zero = {greater: [], lesser: []}; -+ var asc = a < b; -+ var arr = new Array(Math.round((asc ? b - a : a - b) / step)); -+ var idx = 0; -+ -+ while (asc ? a <= b : a >= b) { -+ var val = options.isNumber ? a : String.fromCharCode(a); -+ if (options.toRegex && (val >= 0 || !options.isNumber)) { -+ zero.greater.push(val); -+ } else { -+ zero.lesser.push(Math.abs(val)); -+ } -+ -+ if (options.isPadded) { -+ val = zeros(val, options); -+ } -+ -+ if (options.toString) { -+ val = String(val); -+ } -+ -+ if (typeof options.transform === 'function') { -+ arr[idx++] = options.transform(val, a, b, step, idx, arr, options); -+ } else { -+ arr[idx++] = val; -+ } -+ -+ if (asc) { -+ a += step; -+ } else { -+ a -= step; -+ } -+ } -+ -+ if (options.toRegex === true) { -+ return toSequence(arr, zero, options); -+ } -+ return arr; -+} -+ -+function toRange(a, b, start, stop, options) { -+ if (options.isPadded) { -+ return toRegex(start, stop, options); -+ } -+ -+ if (options.isNumber) { -+ return toRegex(Math.min(a, b), Math.max(a, b), options); -+ } -+ -+ var start = String.fromCharCode(Math.min(a, b)); -+ var stop = String.fromCharCode(Math.max(a, b)); -+ return '[' + start + '-' + stop + ']'; -+} -+ -+function toSequence(arr, zeros, options) { -+ var greater = '', lesser = ''; -+ if (zeros.greater.length) { -+ greater = zeros.greater.join('|'); -+ } -+ if (zeros.lesser.length) { -+ lesser = '-(' + zeros.lesser.join('|') + ')'; -+ } -+ var res = greater && lesser -+ ? greater + '|' + lesser -+ : greater || lesser; -+ -+ if (options.capture) { -+ return '(' + res + ')'; -+ } -+ return res; -+} -+ -+function zeros(val, options) { -+ if (options.isPadded) { -+ var str = String(val); -+ var len = str.length; -+ var dash = ''; -+ if (str.charAt(0) === '-') { -+ dash = '-'; -+ str = str.slice(1); -+ } -+ var diff = options.maxLength - len; -+ var pad = repeat('0', diff); -+ val = (dash + pad + str); -+ } -+ if (options.stringify) { -+ return String(val); -+ } -+ return val; -+} -+ -+function toNumber(val) { -+ return Number(val) || 0; -+} -+ -+function isPadded(str) { -+ return /^-?0\d/.test(str); -+} -+ -+function isValid(min, max) { -+ return (isValidNumber(min) || isValidLetter(min)) -+ && (isValidNumber(max) || isValidLetter(max)); -+} -+ -+function isValidLetter(ch) { -+ return typeof ch === 'string' && ch.length === 1 && /^\w+$/.test(ch); -+} -+ -+function isValidNumber(n) { -+ return isNumber(n) && !/\./.test(n); -+} -+ -+/** -+ * Expose `fillRange` -+ * @type {Function} -+ */ -+ -+module.exports = fillRange; -+ -+}, -+"DmsrtAH1Am5WIIw6snJDbSF/BQh/RWsLpTp9Mv8MyRA=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var support = require('./support'); -+var base64 = require('./base64'); -+var nodejsUtils = require('./nodejsUtils'); -+var setImmediate = require('core-js/library/fn/set-immediate'); -+var external = require("./external"); -+ -+ -+/** -+ * Convert a string that pass as a "binary string": it should represent a byte -+ * array but may have > 255 char codes. Be sure to take only the first byte -+ * and returns the byte array. -+ * @param {String} str the string to transform. -+ * @return {Array|Uint8Array} the string in a binary format. -+ */ -+function string2binary(str) { -+ var result = null; -+ if (support.uint8array) { -+ result = new Uint8Array(str.length); -+ } else { -+ result = new Array(str.length); -+ } -+ return stringToArrayLike(str, result); -+} -+ -+/** -+ * Create a new blob with the given content and the given type. -+ * @param {String|ArrayBuffer} part the content to put in the blob. DO NOT use -+ * an Uint8Array because the stock browser of android 4 won't accept it (it -+ * will be silently converted to a string, "[object Uint8Array]"). -+ * -+ * Use only ONE part to build the blob to avoid a memory leak in IE11 / Edge: -+ * when a large amount of Array is used to create the Blob, the amount of -+ * memory consumed is nearly 100 times the original data amount. -+ * -+ * @param {String} type the mime type of the blob. -+ * @return {Blob} the created blob. -+ */ -+exports.newBlob = function(part, type) { -+ exports.checkSupport("blob"); -+ -+ try { -+ // Blob constructor -+ return new Blob([part], { -+ type: type -+ }); -+ } -+ catch (e) { -+ -+ try { -+ // deprecated, browser only, old way -+ var Builder = self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder; -+ var builder = new Builder(); -+ builder.append(part); -+ return builder.getBlob(type); -+ } -+ catch (e) { -+ -+ // well, fuck ?! -+ throw new Error("Bug : can't construct the Blob."); -+ } -+ } -+ -+ -+}; -+/** -+ * The identity function. -+ * @param {Object} input the input. -+ * @return {Object} the same input. -+ */ -+function identity(input) { -+ return input; -+} -+ -+/** -+ * Fill in an array with a string. -+ * @param {String} str the string to use. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). -+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. -+ */ -+function stringToArrayLike(str, array) { -+ for (var i = 0; i < str.length; ++i) { -+ array[i] = str.charCodeAt(i) & 0xFF; -+ } -+ return array; -+} -+ -+/** -+ * An helper for the function arrayLikeToString. -+ * This contains static informations and functions that -+ * can be optimized by the browser JIT compiler. -+ */ -+var arrayToStringHelper = { -+ /** -+ * Transform an array of int into a string, chunk by chunk. -+ * See the performances notes on arrayLikeToString. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. -+ * @param {String} type the type of the array. -+ * @param {Integer} chunk the chunk size. -+ * @return {String} the resulting string. -+ * @throws Error if the chunk is too big for the stack. -+ */ -+ stringifyByChunk: function(array, type, chunk) { -+ var result = [], k = 0, len = array.length; -+ // shortcut -+ if (len <= chunk) { -+ return String.fromCharCode.apply(null, array); -+ } -+ while (k < len) { -+ if (type === "array" || type === "nodebuffer") { -+ result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len)))); -+ } -+ else { -+ result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len)))); -+ } -+ k += chunk; -+ } -+ return result.join(""); -+ }, -+ /** -+ * Call String.fromCharCode on every item in the array. -+ * This is the naive implementation, which generate A LOT of intermediate string. -+ * This should be used when everything else fail. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. -+ * @return {String} the result. -+ */ -+ stringifyByChar: function(array){ -+ var resultStr = ""; -+ for(var i = 0; i < array.length; i++) { -+ resultStr += String.fromCharCode(array[i]); -+ } -+ return resultStr; -+ }, -+ applyCanBeUsed : { -+ /** -+ * true if the browser accepts to use String.fromCharCode on Uint8Array -+ */ -+ uint8array : (function () { -+ try { -+ return support.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1; -+ } catch (e) { -+ return false; -+ } -+ })(), -+ /** -+ * true if the browser accepts to use String.fromCharCode on nodejs Buffer. -+ */ -+ nodebuffer : (function () { -+ try { -+ return support.nodebuffer && String.fromCharCode.apply(null, nodejsUtils.allocBuffer(1)).length === 1; -+ } catch (e) { -+ return false; -+ } -+ })() -+ } -+}; -+ -+/** -+ * Transform an array-like object to a string. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. -+ * @return {String} the result. -+ */ -+function arrayLikeToString(array) { -+ // Performances notes : -+ // -------------------- -+ // String.fromCharCode.apply(null, array) is the fastest, see -+ // see http://jsperf.com/converting-a-uint8array-to-a-string/2 -+ // but the stack is limited (and we can get huge arrays !). -+ // -+ // result += String.fromCharCode(array[i]); generate too many strings ! -+ // -+ // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2 -+ // TODO : we now have workers that split the work. Do we still need that ? -+ var chunk = 65536, -+ type = exports.getTypeOf(array), -+ canUseApply = true; -+ if (type === "uint8array") { -+ canUseApply = arrayToStringHelper.applyCanBeUsed.uint8array; -+ } else if (type === "nodebuffer") { -+ canUseApply = arrayToStringHelper.applyCanBeUsed.nodebuffer; -+ } -+ -+ if (canUseApply) { -+ while (chunk > 1) { -+ try { -+ return arrayToStringHelper.stringifyByChunk(array, type, chunk); -+ } catch (e) { -+ chunk = Math.floor(chunk / 2); -+ } -+ } -+ } -+ -+ // no apply or chunk error : slow and painful algorithm -+ // default browser on android 4.* -+ return arrayToStringHelper.stringifyByChar(array); -+} -+ -+exports.applyFromCharCode = arrayLikeToString; -+ -+ -+/** -+ * Copy the data from an array-like to an other array-like. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array. -+ * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated. -+ * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array. -+ */ -+function arrayLikeToArrayLike(arrayFrom, arrayTo) { -+ for (var i = 0; i < arrayFrom.length; i++) { -+ arrayTo[i] = arrayFrom[i]; -+ } -+ return arrayTo; -+} -+ -+// a matrix containing functions to transform everything into everything. -+var transform = {}; -+ -+// string to ? -+transform["string"] = { -+ "string": identity, -+ "array": function(input) { -+ return stringToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return transform["string"]["uint8array"](input).buffer; -+ }, -+ "uint8array": function(input) { -+ return stringToArrayLike(input, new Uint8Array(input.length)); -+ }, -+ "nodebuffer": function(input) { -+ return stringToArrayLike(input, nodejsUtils.allocBuffer(input.length)); -+ } -+}; -+ -+// array to ? -+transform["array"] = { -+ "string": arrayLikeToString, -+ "array": identity, -+ "arraybuffer": function(input) { -+ return (new Uint8Array(input)).buffer; -+ }, -+ "uint8array": function(input) { -+ return new Uint8Array(input); -+ }, -+ "nodebuffer": function(input) { -+ return nodejsUtils.newBufferFrom(input); -+ } -+}; -+ -+// arraybuffer to ? -+transform["arraybuffer"] = { -+ "string": function(input) { -+ return arrayLikeToString(new Uint8Array(input)); -+ }, -+ "array": function(input) { -+ return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength)); -+ }, -+ "arraybuffer": identity, -+ "uint8array": function(input) { -+ return new Uint8Array(input); -+ }, -+ "nodebuffer": function(input) { -+ return nodejsUtils.newBufferFrom(new Uint8Array(input)); -+ } -+}; -+ -+// uint8array to ? -+transform["uint8array"] = { -+ "string": arrayLikeToString, -+ "array": function(input) { -+ return arrayLikeToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return input.buffer; -+ }, -+ "uint8array": identity, -+ "nodebuffer": function(input) { -+ return nodejsUtils.newBufferFrom(input); -+ } -+}; -+ -+// nodebuffer to ? -+transform["nodebuffer"] = { -+ "string": arrayLikeToString, -+ "array": function(input) { -+ return arrayLikeToArrayLike(input, new Array(input.length)); -+ }, -+ "arraybuffer": function(input) { -+ return transform["nodebuffer"]["uint8array"](input).buffer; -+ }, -+ "uint8array": function(input) { -+ return arrayLikeToArrayLike(input, new Uint8Array(input.length)); -+ }, -+ "nodebuffer": identity -+}; -+ -+/** -+ * Transform an input into any type. -+ * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. -+ * If no output type is specified, the unmodified input will be returned. -+ * @param {String} outputType the output type. -+ * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. -+ * @throws {Error} an Error if the browser doesn't support the requested output type. -+ */ -+exports.transformTo = function(outputType, input) { -+ if (!input) { -+ // undefined, null, etc -+ // an empty string won't harm. -+ input = ""; -+ } -+ if (!outputType) { -+ return input; -+ } -+ exports.checkSupport(outputType); -+ var inputType = exports.getTypeOf(input); -+ var result = transform[inputType][outputType](input); -+ return result; -+}; -+ -+/** -+ * Return the type of the input. -+ * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. -+ * @param {Object} input the input to identify. -+ * @return {String} the (lowercase) type of the input. -+ */ -+exports.getTypeOf = function(input) { -+ if (typeof input === "string") { -+ return "string"; -+ } -+ if (Object.prototype.toString.call(input) === "[object Array]") { -+ return "array"; -+ } -+ if (support.nodebuffer && nodejsUtils.isBuffer(input)) { -+ return "nodebuffer"; -+ } -+ if (support.uint8array && input instanceof Uint8Array) { -+ return "uint8array"; -+ } -+ if (support.arraybuffer && input instanceof ArrayBuffer) { -+ return "arraybuffer"; -+ } -+}; -+ -+/** -+ * Throw an exception if the type is not supported. -+ * @param {String} type the type to check. -+ * @throws {Error} an Error if the browser doesn't support the requested type. -+ */ -+exports.checkSupport = function(type) { -+ var supported = support[type.toLowerCase()]; -+ if (!supported) { -+ throw new Error(type + " is not supported by this platform"); -+ } -+}; -+ -+exports.MAX_VALUE_16BITS = 65535; -+exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1 -+ -+/** -+ * Prettify a string read as binary. -+ * @param {string} str the string to prettify. -+ * @return {string} a pretty string. -+ */ -+exports.pretty = function(str) { -+ var res = '', -+ code, i; -+ for (i = 0; i < (str || "").length; i++) { -+ code = str.charCodeAt(i); -+ res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase(); -+ } -+ return res; -+}; -+ -+/** -+ * Defer the call of a function. -+ * @param {Function} callback the function to call asynchronously. -+ * @param {Array} args the arguments to give to the callback. -+ */ -+exports.delay = function(callback, args, self) { -+ setImmediate(function () { -+ callback.apply(self || null, args || []); -+ }); -+}; -+ -+/** -+ * Extends a prototype with an other, without calling a constructor with -+ * side effects. Inspired by nodejs' `utils.inherits` -+ * @param {Function} ctor the constructor to augment -+ * @param {Function} superCtor the parent constructor to use -+ */ -+exports.inherits = function (ctor, superCtor) { -+ var Obj = function() {}; -+ Obj.prototype = superCtor.prototype; -+ ctor.prototype = new Obj(); -+}; -+ -+/** -+ * Merge the objects passed as parameters into a new one. -+ * @private -+ * @param {...Object} var_args All objects to merge. -+ * @return {Object} a new object with the data of the others. -+ */ -+exports.extend = function() { -+ var result = {}, i, attr; -+ for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers -+ for (attr in arguments[i]) { -+ if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { -+ result[attr] = arguments[i][attr]; -+ } -+ } -+ } -+ return result; -+}; -+ -+/** -+ * Transform arbitrary content into a Promise. -+ * @param {String} name a name for the content being processed. -+ * @param {Object} inputData the content to process. -+ * @param {Boolean} isBinary true if the content is not an unicode string -+ * @param {Boolean} isOptimizedBinaryString true if the string content only has one byte per character. -+ * @param {Boolean} isBase64 true if the string content is encoded with base64. -+ * @return {Promise} a promise in a format usable by JSZip. -+ */ -+exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinaryString, isBase64) { -+ -+ // if inputData is already a promise, this flatten it. -+ var promise = external.Promise.resolve(inputData).then(function(data) { -+ -+ -+ var isBlob = support.blob && (data instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(data)) !== -1); -+ -+ if (isBlob && typeof FileReader !== "undefined") { -+ return new external.Promise(function (resolve, reject) { -+ var reader = new FileReader(); -+ -+ reader.onload = function(e) { -+ resolve(e.target.result); -+ }; -+ reader.onerror = function(e) { -+ reject(e.target.error); -+ }; -+ reader.readAsArrayBuffer(data); -+ }); -+ } else { -+ return data; -+ } -+ }); -+ -+ return promise.then(function(data) { -+ var dataType = exports.getTypeOf(data); -+ -+ if (!dataType) { -+ return external.Promise.reject( -+ new Error("Can't read the data of '" + name + "'. Is it " + -+ "in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?") -+ ); -+ } -+ // special case : it's way easier to work with Uint8Array than with ArrayBuffer -+ if (dataType === "arraybuffer") { -+ data = exports.transformTo("uint8array", data); -+ } else if (dataType === "string") { -+ if (isBase64) { -+ data = base64.decode(data); -+ } -+ else if (isBinary) { -+ // optimizedBinaryString === true means that the file has already been filtered with a 0xFF mask -+ if (isOptimizedBinaryString !== true) { -+ // this is a string, not in a base64 format. -+ // Be sure that this is a correct "binary string" -+ data = string2binary(data); -+ } -+ } -+ } -+ return data; -+ }); -+}; -+ -+}, -+"DoBz2lxzVwMiEx3jjP/YgY8ZlLeWjnUL5IC3U2yHj3I=": -+function (require, module, exports, __dirname, __filename) { -+// @ts-check -+ -+const got = require("got").default; -+const AsyncService = require("./async-service"); -+const createDiscovery = require("dns-discovery"); -+const secureJson = require("secure-json-parse"); -+const { isInstallerList } = require("./schema"); -+const throttle = require("lodash/throttle"); -+const network = require("network-address"); -+const stream = require("stream"); -+const { stringifyInstaller } = require("./utils"); -+const log = require("debug")("p2p-upgrades:discovery"); -+const Agent = require("agentkeepalive"); -+ -+// We poll other peers for available installers every `lookupInterval=2000ms`. -+// By using keep-alive we re-use the same connection, which uses fewer resources -+const keepaliveAgent = new Agent({ -+ // Keep sockets around in a pool to be used by other requests in the future. -+ keepAlive: true, -+ // The initial delay for TCP Keep-Alive packets. -+ keepAliveMsecs: 1000, -+ // Sets the free socket to timeout after freeSocketTimeout milliseconds of inactivity on the free socket. -+ freeSocketTimeout: 5000, -+ // Sets the working socket to timeout after timeout milliseconds of inactivity on the working socket. -+ timeout: 10000, -+}); -+ -+// TTL for discovered peers, if they are not seen for more than this period then -+// they are considered offline and forgotten -+const PEER_TTL_MS = 4000; -+ -+/** @typedef {import('fastify')} Fastify */ -+/** @typedef {import('./types').TransferProgress} Download */ -+/** @typedef {import('./types').InstallerExt} InstallerExt */ -+/** -+ * @typedef {Object} Events -+ * @property {(installers: InstallerExt[]) => void} installers -+ * @property {(error?: Error) => void} error -+ */ -+ -+/** -+ * Maintain a list of available installers from discovered peers. Will keep the -+ * list updated if peers become unavailable, or if a peer has deleted their -+ * installer. Also announces this device and listens for other peers on the -+ * local network -+ * -+ * @extends {AsyncService} -+ */ -+class UpgradeDiscovery extends AsyncService { -+ #port = 0; -+ #discoveryKey; -+ #lookupInterval; -+ /** @type {NodeJS.Timeout} */ -+ #discoveryInterval; -+ /** @type {import('lodash').DebouncedFunc} */ -+ #throttledEmitInstallers; -+ /** -+ * Store installers by hash, replacing any existing one with most recently -+ * seen. In the future maybe store references to copies on different peers? -+ * Could prefer the peer with best connection? -+ * -+ * @type {Map} -+ */ -+ #availableInstallers = new Map(); -+ /** -+ * Track in-progress requests to GET /installers to avoid calling multiple -+ * times when the first is in progress -+ * -+ * @type {Set} -+ */ -+ #inProgressRequests = new Set(); -+ /** @type {ReturnType} */ -+ #discovery; -+ -+ /** -+ *Creates an instance of UpgradeDiscovery. -+ * @param {object} options -+ * @param {string} options.discoveryKey discovery key for lookups -+ * @param {number} [options.installerEmitThrottle=5000] number of ms to wait between emitting a list of available installers - mainly used for testing, -+ * @param {number} [options.lookupInterval=2000] How frequently (in ms) to query other peers for available upgrades - mainly for testing -+ */ -+ constructor({ -+ discoveryKey, -+ installerEmitThrottle = 5000, -+ lookupInterval = 2000, -+ }) { -+ super(); -+ this.#discoveryKey = discoveryKey; -+ this.#lookupInterval = lookupInterval; -+ // Private instance methods (vs. fields) are not supported in Node v12 -+ /** @private */ -+ this._onPeer = this._onPeer.bind(this); -+ this.#throttledEmitInstallers = throttle( -+ () => { -+ // Flushed when the service stops (so will not emit after stop) -+ this.emit( -+ "installers", -+ Array.from(this.#availableInstallers.values()).map( -+ value => value.installer -+ ) -+ ); -+ }, -+ installerEmitThrottle, -+ { leading: false, trailing: true } -+ ); -+ } -+ -+ /** -+ * Create a readstream for an available installer from another peer -+ * -+ * @param {string} hash -+ * @returns {import('stream').Readable} -+ */ -+ createReadStream(hash) { -+ const installer = this.#availableInstallers.get(hash); -+ if (installer) { -+ log( -+ `${this.#port}: Starting download: ${stringifyInstaller( -+ installer.installer -+ )} from ${ -+ // @ts-ignore -+ new URL(installer.installer.url).host -+ }` -+ ); -+ const downloadStream = got.stream(installer.installer.url); -+ downloadStream.once("error", e => { -+ log(`${this.#port}: Download error for ${hash.slice(0, 7)}:`, e); -+ // Remove from available installers - probably errored because no longer -+ // available -+ clearTimeout(installer.timeoutId); -+ this.#availableInstallers.delete(hash); -+ this.#throttledEmitInstallers(); -+ }); -+ stream.finished(downloadStream, e => { -+ if (!e) log(`${this.#port}: Download complete: ${hash.slice(0, 7)}`); -+ }); -+ return downloadStream; -+ } -+ // If an installer matching this has is no longer tracked as "available", return a fake stream that instantly errors -+ log(`${this.#port}: Installer not available ${hash.slice(0, 7)}`); -+ const brokenStream = new stream.Readable({ read() {} }); -+ process.nextTick(() => brokenStream.emit("error", new Error("NotFound"))); -+ return brokenStream; -+ } -+ -+ /** -+ * Start downloader service -+ * -+ * @param {number} port -+ */ -+ async _start(port) { -+ this.#port = port; -+ log(`${this.#port}: starting`); -+ this.#discovery = createDiscovery({ -+ server: [], -+ loopback: false, -+ }); -+ this.#discovery.announce(this.#discoveryKey, port); -+ this.#discovery.on("peer", this._onPeer); -+ this.#discoveryInterval = setInterval(() => { -+ // Announce only needs to happen once, but lookup needs to happen on an -+ // interval so we can check whether peers are still available -+ this.#discovery.lookup(this.#discoveryKey); -+ }, this.#lookupInterval); -+ log(`${this.#port}: started`); -+ } -+ -+ /** -+ * Stop downloader service -+ * -+ * @returns {Promise} -+ */ -+ async _stop() { -+ log(`${this.#port}: stopping`); -+ return new Promise(resolve => { -+ this.#discoveryInterval && clearInterval(this.#discoveryInterval); -+ this.#discovery.off("peer", this._onPeer); -+ // Flush throttled installer emit -+ this.#throttledEmitInstallers.flush(); -+ // NB: Due to a bug in dns-discovery, the callback is always called with -+ // an error, but we can safely ignore it -+ this.#discovery.unannounce(this.#discoveryKey, this.#port, () => { -+ this.#discovery.destroy(() => { -+ log(`${this.#port}: stopped`); -+ resolve(); -+ }); -+ }); -+ }); -+ } -+ -+ /** -+ * @private -+ * @param {string} app The app name the peer was discovered for. -+ * @param {object} peer -+ * @param {string} peer.host The address of the peer -+ * @param {number} peer.port The port the peer is listening on -+ */ -+ async _onPeer(app, { host, port }) { -+ if (app !== this.#discoveryKey) return; -+ // There is a bug in dns-discovery where the query for known peers is -+ // responded to by the same peer that sends the query, which results in -+ // self-lookup. This should filter out itself from the peers. -+ if (host === network() && port === this.#port) return; -+ const listUrl = `http://${host}:${port}/installers`; -+ // If we are currently querying this peer, bail -+ if (this.#inProgressRequests.has(listUrl)) return; -+ this.#inProgressRequests.add(listUrl); -+ let installers; -+ try { -+ log(`${this.#port}: Querying peer ${host}:${port}`); -+ // Secure parse of JSON to avoid prototype pollution -+ installers = await got(listUrl, { -+ agent: { http: keepaliveAgent }, -+ parseJson: text => secureJson.parse(text), -+ }).json(); -+ // Validate response -+ if (!isInstallerList(installers)) throw isInstallerList.errors; -+ } catch (e) { -+ log(`${this.#port}: Error querying peer ${host}:${port}`, e); -+ // If we get an error trying to connect to a peer, then remove any -+ // installers from that host from our list of available installers -+ // TODO: Emit an error here, mainly for testing -+ for (const { installer } of this.#availableInstallers.values()) { -+ if (installer.url.startsWith(`http://${host}:${port}`)) { -+ log( -+ `${ -+ this.#port -+ }: removing from available from ${host}:${port}: ${stringifyInstaller( -+ installer -+ )}` -+ ); -+ this.#availableInstallers.delete(installer.hash); -+ } -+ } -+ this.#inProgressRequests.delete(listUrl); -+ return; -+ } -+ for (const installer of installers) { -+ const { hash } = installer; -+ const existing = this.#availableInstallers.get(hash); -+ if (existing) { -+ clearTimeout(existing.timeoutId); -+ this.#availableInstallers.delete(hash); -+ } -+ log( -+ `${this.#port}: ${host}:${port} available: ${stringifyInstaller( -+ installer -+ )}` -+ ); -+ this.#availableInstallers.set(hash, { -+ installer, -+ timeoutId: setTimeout(() => { -+ log( -+ `${this.#port}: TTL for ${stringifyInstaller( -+ installer -+ )} from ${host}:${port}` -+ ); -+ this.#availableInstallers.delete(hash); -+ this.#throttledEmitInstallers(); -+ }, PEER_TTL_MS), -+ }); -+ } -+ this.#inProgressRequests.delete(listUrl); -+ this.#throttledEmitInstallers(); -+ } -+} -+ -+module.exports = UpgradeDiscovery; -+ -+}, -+"E0WkkBYEIE6flSFFkUIE8xwXGblU4cZjCllfFALIfQE=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const is_1 = require("@sindresorhus/is"); -+const normalizeArguments = (options, defaults) => { -+ if (is_1.default.null_(options.encoding)) { -+ throw new TypeError('To get a Buffer, set `options.responseType` to `buffer` instead'); -+ } -+ is_1.assert.any([is_1.default.string, is_1.default.undefined], options.encoding); -+ is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.resolveBodyOnly); -+ is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.methodRewriting); -+ is_1.assert.any([is_1.default.boolean, is_1.default.undefined], options.isStream); -+ is_1.assert.any([is_1.default.string, is_1.default.undefined], options.responseType); -+ // `options.responseType` -+ if (options.responseType === undefined) { -+ options.responseType = 'text'; -+ } -+ // `options.retry` -+ const { retry } = options; -+ if (defaults) { -+ options.retry = { ...defaults.retry }; -+ } -+ else { -+ options.retry = { -+ calculateDelay: retryObject => retryObject.computedValue, -+ limit: 0, -+ methods: [], -+ statusCodes: [], -+ errorCodes: [], -+ maxRetryAfter: undefined -+ }; -+ } -+ if (is_1.default.object(retry)) { -+ options.retry = { -+ ...options.retry, -+ ...retry -+ }; -+ options.retry.methods = [...new Set(options.retry.methods.map(method => method.toUpperCase()))]; -+ options.retry.statusCodes = [...new Set(options.retry.statusCodes)]; -+ options.retry.errorCodes = [...new Set(options.retry.errorCodes)]; -+ } -+ else if (is_1.default.number(retry)) { -+ options.retry.limit = retry; -+ } -+ if (is_1.default.undefined(options.retry.maxRetryAfter)) { -+ options.retry.maxRetryAfter = Math.min( -+ // TypeScript is not smart enough to handle `.filter(x => is.number(x))`. -+ // eslint-disable-next-line unicorn/no-fn-reference-in-iterator -+ ...[options.timeout.request, options.timeout.connect].filter(is_1.default.number)); -+ } -+ // `options.pagination` -+ if (is_1.default.object(options.pagination)) { -+ if (defaults) { -+ options.pagination = { -+ ...defaults.pagination, -+ ...options.pagination -+ }; -+ } -+ const { pagination } = options; -+ if (!is_1.default.function_(pagination.transform)) { -+ throw new Error('`options.pagination.transform` must be implemented'); -+ } -+ if (!is_1.default.function_(pagination.shouldContinue)) { -+ throw new Error('`options.pagination.shouldContinue` must be implemented'); -+ } -+ if (!is_1.default.function_(pagination.filter)) { -+ throw new TypeError('`options.pagination.filter` must be implemented'); -+ } -+ if (!is_1.default.function_(pagination.paginate)) { -+ throw new Error('`options.pagination.paginate` must be implemented'); -+ } -+ } -+ // JSON mode -+ if (options.responseType === 'json' && options.headers.accept === undefined) { -+ options.headers.accept = 'application/json'; -+ } -+ return options; -+}; -+exports.default = normalizeArguments; -+ -+}, -+"E5VBs8KrRC33g46DA20UGA1Qmh1ABHYE2eG1aYph79A=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.regexpCode = exports.getProperty = exports.safeStringify = exports.stringify = exports.strConcat = exports.addCodeArg = exports.str = exports._ = exports.nil = exports._Code = exports.Name = exports.IDENTIFIER = exports._CodeOrName = void 0; -+class _CodeOrName { -+} -+exports._CodeOrName = _CodeOrName; -+exports.IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i; -+class Name extends _CodeOrName { -+ constructor(s) { -+ super(); -+ if (!exports.IDENTIFIER.test(s)) -+ throw new Error("CodeGen: name must be a valid identifier"); -+ this.str = s; -+ } -+ toString() { -+ return this.str; -+ } -+ emptyStr() { -+ return false; -+ } -+ get names() { -+ return { [this.str]: 1 }; -+ } -+} -+exports.Name = Name; -+class _Code extends _CodeOrName { -+ constructor(code) { -+ super(); -+ this._items = typeof code === "string" ? [code] : code; -+ } -+ toString() { -+ return this.str; -+ } -+ emptyStr() { -+ if (this._items.length > 1) -+ return false; -+ const item = this._items[0]; -+ return item === "" || item === '""'; -+ } -+ get str() { -+ var _a; -+ return ((_a = this._str) !== null && _a !== void 0 ? _a : (this._str = this._items.reduce((s, c) => `${s}${c}`, ""))); -+ } -+ get names() { -+ var _a; -+ return ((_a = this._names) !== null && _a !== void 0 ? _a : (this._names = this._items.reduce((names, c) => { -+ if (c instanceof Name) -+ names[c.str] = (names[c.str] || 0) + 1; -+ return names; -+ }, {}))); -+ } -+} -+exports._Code = _Code; -+exports.nil = new _Code(""); -+function _(strs, ...args) { -+ const code = [strs[0]]; -+ let i = 0; -+ while (i < args.length) { -+ addCodeArg(code, args[i]); -+ code.push(strs[++i]); -+ } -+ return new _Code(code); -+} -+exports._ = _; -+const plus = new _Code("+"); -+function str(strs, ...args) { -+ const expr = [safeStringify(strs[0])]; -+ let i = 0; -+ while (i < args.length) { -+ expr.push(plus); -+ addCodeArg(expr, args[i]); -+ expr.push(plus, safeStringify(strs[++i])); -+ } -+ optimize(expr); -+ return new _Code(expr); -+} -+exports.str = str; -+function addCodeArg(code, arg) { -+ if (arg instanceof _Code) -+ code.push(...arg._items); -+ else if (arg instanceof Name) -+ code.push(arg); -+ else -+ code.push(interpolate(arg)); -+} -+exports.addCodeArg = addCodeArg; -+function optimize(expr) { -+ let i = 1; -+ while (i < expr.length - 1) { -+ if (expr[i] === plus) { -+ const res = mergeExprItems(expr[i - 1], expr[i + 1]); -+ if (res !== undefined) { -+ expr.splice(i - 1, 3, res); -+ continue; -+ } -+ expr[i++] = "+"; -+ } -+ i++; -+ } -+} -+function mergeExprItems(a, b) { -+ if (b === '""') -+ return a; -+ if (a === '""') -+ return b; -+ if (typeof a == "string") { -+ if (b instanceof Name || a[a.length - 1] !== '"') -+ return; -+ if (typeof b != "string") -+ return `${a.slice(0, -1)}${b}"`; -+ if (b[0] === '"') -+ return a.slice(0, -1) + b.slice(1); -+ return; -+ } -+ if (typeof b == "string" && b[0] === '"' && !(a instanceof Name)) -+ return `"${a}${b.slice(1)}`; -+ return; -+} -+function strConcat(c1, c2) { -+ return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str `${c1}${c2}`; -+} -+exports.strConcat = strConcat; -+// TODO do not allow arrays here -+function interpolate(x) { -+ return typeof x == "number" || typeof x == "boolean" || x === null -+ ? x -+ : safeStringify(Array.isArray(x) ? x.join(",") : x); -+} -+function stringify(x) { -+ return new _Code(safeStringify(x)); -+} -+exports.stringify = stringify; -+function safeStringify(x) { -+ return JSON.stringify(x) -+ .replace(/\u2028/g, "\\u2028") -+ .replace(/\u2029/g, "\\u2029"); -+} -+exports.safeStringify = safeStringify; -+function getProperty(key) { -+ return typeof key == "string" && exports.IDENTIFIER.test(key) ? new _Code(`.${key}`) : _ `[${key}]`; -+} -+exports.getProperty = getProperty; -+function regexpCode(rx) { -+ return new _Code(rx.toString()); -+} -+exports.regexpCode = regexpCode; -+//# sourceMappingURL=code.js.map -+}, -+"E5oEmI/tJ4B9e5skV6bKancuRVGg0twNUW9ZKHBGZII=": -+function (require, module, exports, __dirname, __filename) { -+// fast apply, http://jsperf.lnkit.com/fast-apply/5 -+module.exports = function(fn, args, that){ -+ var un = that === undefined; -+ switch(args.length){ -+ case 0: return un ? fn() -+ : fn.call(that); -+ case 1: return un ? fn(args[0]) -+ : fn.call(that, args[0]); -+ case 2: return un ? fn(args[0], args[1]) -+ : fn.call(that, args[0], args[1]); -+ case 3: return un ? fn(args[0], args[1], args[2]) -+ : fn.call(that, args[0], args[1], args[2]); -+ case 4: return un ? fn(args[0], args[1], args[2], args[3]) -+ : fn.call(that, args[0], args[1], args[2], args[3]); -+ } return fn.apply(that, args); -+}; -+}, -+"E6vaSa8eQDzBUrBkaXkwjadtVN8ldAOD611FizMFh5g=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+module.exports = function permsToString(stat) { -+ if (!stat.isDirectory || !stat.mode) { -+ return '???!!!???'; -+ } -+ -+ const dir = stat.isDirectory() ? 'd' : '-'; -+ const mode = stat.mode.toString(8); -+ -+ return dir + mode.slice(-3).split('').map(n => [ -+ '---', -+ '--x', -+ '-w-', -+ '-wx', -+ 'r--', -+ 'r-x', -+ 'rw-', -+ 'rwx', -+ ][parseInt(n, 10)]).join(''); -+}; -+ -+ -+}, -+"E9b12NeEmrVSXHs978RmbR1TsqL7+Xd+tHA5lWzi0Mc=": -+function (require, module, exports, __dirname, __filename) { -+// This is free and unencumbered software released into the public domain. -+// See LICENSE.md for more information. -+ -+/** -+ * @fileoverview Global |this| required for resolving indexes in node. -+ * @suppress {globalThis} -+ */ -+(function(global) { -+ 'use strict'; -+ -+ // If we're in node require encoding-indexes and attach it to the global. -+ if (typeof module !== "undefined" && module.exports && -+ !global["encoding-indexes"]) { -+ global["encoding-indexes"] = -+ require("./encoding-indexes.js")["encoding-indexes"]; -+ } -+ -+ // -+ // Utilities -+ // -+ -+ /** -+ * @param {number} a The number to test. -+ * @param {number} min The minimum value in the range, inclusive. -+ * @param {number} max The maximum value in the range, inclusive. -+ * @return {boolean} True if a >= min and a <= max. -+ */ -+ function inRange(a, min, max) { -+ return min <= a && a <= max; -+ } -+ -+ /** -+ * @param {!Array.<*>} array The array to check. -+ * @param {*} item The item to look for in the array. -+ * @return {boolean} True if the item appears in the array. -+ */ -+ function includes(array, item) { -+ return array.indexOf(item) !== -1; -+ } -+ -+ var floor = Math.floor; -+ -+ /** -+ * @param {*} o -+ * @return {Object} -+ */ -+ function ToDictionary(o) { -+ if (o === undefined) return {}; -+ if (o === Object(o)) return o; -+ throw TypeError('Could not convert argument to dictionary'); -+ } -+ -+ /** -+ * @param {string} string Input string of UTF-16 code units. -+ * @return {!Array.} Code points. -+ */ -+ function stringToCodePoints(string) { -+ // https://heycam.github.io/webidl/#dfn-obtain-unicode -+ -+ // 1. Let S be the DOMString value. -+ var s = String(string); -+ -+ // 2. Let n be the length of S. -+ var n = s.length; -+ -+ // 3. Initialize i to 0. -+ var i = 0; -+ -+ // 4. Initialize U to be an empty sequence of Unicode characters. -+ var u = []; -+ -+ // 5. While i < n: -+ while (i < n) { -+ -+ // 1. Let c be the code unit in S at index i. -+ var c = s.charCodeAt(i); -+ -+ // 2. Depending on the value of c: -+ -+ // c < 0xD800 or c > 0xDFFF -+ if (c < 0xD800 || c > 0xDFFF) { -+ // Append to U the Unicode character with code point c. -+ u.push(c); -+ } -+ -+ // 0xDC00 ≤ c ≤ 0xDFFF -+ else if (0xDC00 <= c && c <= 0xDFFF) { -+ // Append to U a U+FFFD REPLACEMENT CHARACTER. -+ u.push(0xFFFD); -+ } -+ -+ // 0xD800 ≤ c ≤ 0xDBFF -+ else if (0xD800 <= c && c <= 0xDBFF) { -+ // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT -+ // CHARACTER. -+ if (i === n - 1) { -+ u.push(0xFFFD); -+ } -+ // 2. Otherwise, i < n−1: -+ else { -+ // 1. Let d be the code unit in S at index i+1. -+ var d = s.charCodeAt(i + 1); -+ -+ // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then: -+ if (0xDC00 <= d && d <= 0xDFFF) { -+ // 1. Let a be c & 0x3FF. -+ var a = c & 0x3FF; -+ -+ // 2. Let b be d & 0x3FF. -+ var b = d & 0x3FF; -+ -+ // 3. Append to U the Unicode character with code point -+ // 2^16+2^10*a+b. -+ u.push(0x10000 + (a << 10) + b); -+ -+ // 4. Set i to i+1. -+ i += 1; -+ } -+ -+ // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a -+ // U+FFFD REPLACEMENT CHARACTER. -+ else { -+ u.push(0xFFFD); -+ } -+ } -+ } -+ -+ // 3. Set i to i+1. -+ i += 1; -+ } -+ -+ // 6. Return U. -+ return u; -+ } -+ -+ /** -+ * @param {!Array.} code_points Array of code points. -+ * @return {string} string String of UTF-16 code units. -+ */ -+ function codePointsToString(code_points) { -+ var s = ''; -+ for (var i = 0; i < code_points.length; ++i) { -+ var cp = code_points[i]; -+ if (cp <= 0xFFFF) { -+ s += String.fromCharCode(cp); -+ } else { -+ cp -= 0x10000; -+ s += String.fromCharCode((cp >> 10) + 0xD800, -+ (cp & 0x3FF) + 0xDC00); -+ } -+ } -+ return s; -+ } -+ -+ -+ // -+ // Implementation of Encoding specification -+ // https://encoding.spec.whatwg.org/ -+ // -+ -+ // -+ // 4. Terminology -+ // -+ -+ /** -+ * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive. -+ * @param {number} a The number to test. -+ * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive. -+ */ -+ function isASCIIByte(a) { -+ return 0x00 <= a && a <= 0x7F; -+ } -+ -+ /** -+ * An ASCII code point is a code point in the range U+0000 to -+ * U+007F, inclusive. -+ */ -+ var isASCIICodePoint = isASCIIByte; -+ -+ -+ /** -+ * End-of-stream is a special token that signifies no more tokens -+ * are in the stream. -+ * @const -+ */ var end_of_stream = -1; -+ -+ /** -+ * A stream represents an ordered sequence of tokens. -+ * -+ * @constructor -+ * @param {!(Array.|Uint8Array)} tokens Array of tokens that provide -+ * the stream. -+ */ -+ function Stream(tokens) { -+ /** @type {!Array.} */ -+ this.tokens = [].slice.call(tokens); -+ // Reversed as push/pop is more efficient than shift/unshift. -+ this.tokens.reverse(); -+ } -+ -+ Stream.prototype = { -+ /** -+ * @return {boolean} True if end-of-stream has been hit. -+ */ -+ endOfStream: function() { -+ return !this.tokens.length; -+ }, -+ -+ /** -+ * When a token is read from a stream, the first token in the -+ * stream must be returned and subsequently removed, and -+ * end-of-stream must be returned otherwise. -+ * -+ * @return {number} Get the next token from the stream, or -+ * end_of_stream. -+ */ -+ read: function() { -+ if (!this.tokens.length) -+ return end_of_stream; -+ return this.tokens.pop(); -+ }, -+ -+ /** -+ * When one or more tokens are prepended to a stream, those tokens -+ * must be inserted, in given order, before the first token in the -+ * stream. -+ * -+ * @param {(number|!Array.)} token The token(s) to prepend to the -+ * stream. -+ */ -+ prepend: function(token) { -+ if (Array.isArray(token)) { -+ var tokens = /**@type {!Array.}*/(token); -+ while (tokens.length) -+ this.tokens.push(tokens.pop()); -+ } else { -+ this.tokens.push(token); -+ } -+ }, -+ -+ /** -+ * When one or more tokens are pushed to a stream, those tokens -+ * must be inserted, in given order, after the last token in the -+ * stream. -+ * -+ * @param {(number|!Array.)} token The tokens(s) to push to the -+ * stream. -+ */ -+ push: function(token) { -+ if (Array.isArray(token)) { -+ var tokens = /**@type {!Array.}*/(token); -+ while (tokens.length) -+ this.tokens.unshift(tokens.shift()); -+ } else { -+ this.tokens.unshift(token); -+ } -+ } -+ }; -+ -+ // -+ // 5. Encodings -+ // -+ -+ // 5.1 Encoders and decoders -+ -+ /** @const */ -+ var finished = -1; -+ -+ /** -+ * @param {boolean} fatal If true, decoding errors raise an exception. -+ * @param {number=} opt_code_point Override the standard fallback code point. -+ * @return {number} The code point to insert on a decoding error. -+ */ -+ function decoderError(fatal, opt_code_point) { -+ if (fatal) -+ throw TypeError('Decoder error'); -+ return opt_code_point || 0xFFFD; -+ } -+ -+ /** -+ * @param {number} code_point The code point that could not be encoded. -+ * @return {number} Always throws, no value is actually returned. -+ */ -+ function encoderError(code_point) { -+ throw TypeError('The code point ' + code_point + ' could not be encoded.'); -+ } -+ -+ /** @interface */ -+ function Decoder() {} -+ Decoder.prototype = { -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point, or |finished|. -+ */ -+ handler: function(stream, bite) {} -+ }; -+ -+ /** @interface */ -+ function Encoder() {} -+ Encoder.prototype = { -+ /** -+ * @param {Stream} stream The stream of code points being encoded. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit, or |finished|. -+ */ -+ handler: function(stream, code_point) {} -+ }; -+ -+ // 5.2 Names and labels -+ -+ // TODO: Define @typedef for Encoding: {name:string,labels:Array.} -+ // https://github.com/google/closure-compiler/issues/247 -+ -+ /** -+ * @param {string} label The encoding label. -+ * @return {?{name:string,labels:Array.}} -+ */ -+ function getEncoding(label) { -+ // 1. Remove any leading and trailing ASCII whitespace from label. -+ label = String(label).trim().toLowerCase(); -+ -+ // 2. If label is an ASCII case-insensitive match for any of the -+ // labels listed in the table below, return the corresponding -+ // encoding, and failure otherwise. -+ if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) { -+ return label_to_encoding[label]; -+ } -+ return null; -+ } -+ -+ /** -+ * Encodings table: https://encoding.spec.whatwg.org/encodings.json -+ * @const -+ * @type {!Array.<{ -+ * heading: string, -+ * encodings: Array.<{name:string,labels:Array.}> -+ * }>} -+ */ -+ var encodings = [ -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "unicode-1-1-utf-8", -+ "utf-8", -+ "utf8" -+ ], -+ "name": "UTF-8" -+ } -+ ], -+ "heading": "The Encoding" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "866", -+ "cp866", -+ "csibm866", -+ "ibm866" -+ ], -+ "name": "IBM866" -+ }, -+ { -+ "labels": [ -+ "csisolatin2", -+ "iso-8859-2", -+ "iso-ir-101", -+ "iso8859-2", -+ "iso88592", -+ "iso_8859-2", -+ "iso_8859-2:1987", -+ "l2", -+ "latin2" -+ ], -+ "name": "ISO-8859-2" -+ }, -+ { -+ "labels": [ -+ "csisolatin3", -+ "iso-8859-3", -+ "iso-ir-109", -+ "iso8859-3", -+ "iso88593", -+ "iso_8859-3", -+ "iso_8859-3:1988", -+ "l3", -+ "latin3" -+ ], -+ "name": "ISO-8859-3" -+ }, -+ { -+ "labels": [ -+ "csisolatin4", -+ "iso-8859-4", -+ "iso-ir-110", -+ "iso8859-4", -+ "iso88594", -+ "iso_8859-4", -+ "iso_8859-4:1988", -+ "l4", -+ "latin4" -+ ], -+ "name": "ISO-8859-4" -+ }, -+ { -+ "labels": [ -+ "csisolatincyrillic", -+ "cyrillic", -+ "iso-8859-5", -+ "iso-ir-144", -+ "iso8859-5", -+ "iso88595", -+ "iso_8859-5", -+ "iso_8859-5:1988" -+ ], -+ "name": "ISO-8859-5" -+ }, -+ { -+ "labels": [ -+ "arabic", -+ "asmo-708", -+ "csiso88596e", -+ "csiso88596i", -+ "csisolatinarabic", -+ "ecma-114", -+ "iso-8859-6", -+ "iso-8859-6-e", -+ "iso-8859-6-i", -+ "iso-ir-127", -+ "iso8859-6", -+ "iso88596", -+ "iso_8859-6", -+ "iso_8859-6:1987" -+ ], -+ "name": "ISO-8859-6" -+ }, -+ { -+ "labels": [ -+ "csisolatingreek", -+ "ecma-118", -+ "elot_928", -+ "greek", -+ "greek8", -+ "iso-8859-7", -+ "iso-ir-126", -+ "iso8859-7", -+ "iso88597", -+ "iso_8859-7", -+ "iso_8859-7:1987", -+ "sun_eu_greek" -+ ], -+ "name": "ISO-8859-7" -+ }, -+ { -+ "labels": [ -+ "csiso88598e", -+ "csisolatinhebrew", -+ "hebrew", -+ "iso-8859-8", -+ "iso-8859-8-e", -+ "iso-ir-138", -+ "iso8859-8", -+ "iso88598", -+ "iso_8859-8", -+ "iso_8859-8:1988", -+ "visual" -+ ], -+ "name": "ISO-8859-8" -+ }, -+ { -+ "labels": [ -+ "csiso88598i", -+ "iso-8859-8-i", -+ "logical" -+ ], -+ "name": "ISO-8859-8-I" -+ }, -+ { -+ "labels": [ -+ "csisolatin6", -+ "iso-8859-10", -+ "iso-ir-157", -+ "iso8859-10", -+ "iso885910", -+ "l6", -+ "latin6" -+ ], -+ "name": "ISO-8859-10" -+ }, -+ { -+ "labels": [ -+ "iso-8859-13", -+ "iso8859-13", -+ "iso885913" -+ ], -+ "name": "ISO-8859-13" -+ }, -+ { -+ "labels": [ -+ "iso-8859-14", -+ "iso8859-14", -+ "iso885914" -+ ], -+ "name": "ISO-8859-14" -+ }, -+ { -+ "labels": [ -+ "csisolatin9", -+ "iso-8859-15", -+ "iso8859-15", -+ "iso885915", -+ "iso_8859-15", -+ "l9" -+ ], -+ "name": "ISO-8859-15" -+ }, -+ { -+ "labels": [ -+ "iso-8859-16" -+ ], -+ "name": "ISO-8859-16" -+ }, -+ { -+ "labels": [ -+ "cskoi8r", -+ "koi", -+ "koi8", -+ "koi8-r", -+ "koi8_r" -+ ], -+ "name": "KOI8-R" -+ }, -+ { -+ "labels": [ -+ "koi8-ru", -+ "koi8-u" -+ ], -+ "name": "KOI8-U" -+ }, -+ { -+ "labels": [ -+ "csmacintosh", -+ "mac", -+ "macintosh", -+ "x-mac-roman" -+ ], -+ "name": "macintosh" -+ }, -+ { -+ "labels": [ -+ "dos-874", -+ "iso-8859-11", -+ "iso8859-11", -+ "iso885911", -+ "tis-620", -+ "windows-874" -+ ], -+ "name": "windows-874" -+ }, -+ { -+ "labels": [ -+ "cp1250", -+ "windows-1250", -+ "x-cp1250" -+ ], -+ "name": "windows-1250" -+ }, -+ { -+ "labels": [ -+ "cp1251", -+ "windows-1251", -+ "x-cp1251" -+ ], -+ "name": "windows-1251" -+ }, -+ { -+ "labels": [ -+ "ansi_x3.4-1968", -+ "ascii", -+ "cp1252", -+ "cp819", -+ "csisolatin1", -+ "ibm819", -+ "iso-8859-1", -+ "iso-ir-100", -+ "iso8859-1", -+ "iso88591", -+ "iso_8859-1", -+ "iso_8859-1:1987", -+ "l1", -+ "latin1", -+ "us-ascii", -+ "windows-1252", -+ "x-cp1252" -+ ], -+ "name": "windows-1252" -+ }, -+ { -+ "labels": [ -+ "cp1253", -+ "windows-1253", -+ "x-cp1253" -+ ], -+ "name": "windows-1253" -+ }, -+ { -+ "labels": [ -+ "cp1254", -+ "csisolatin5", -+ "iso-8859-9", -+ "iso-ir-148", -+ "iso8859-9", -+ "iso88599", -+ "iso_8859-9", -+ "iso_8859-9:1989", -+ "l5", -+ "latin5", -+ "windows-1254", -+ "x-cp1254" -+ ], -+ "name": "windows-1254" -+ }, -+ { -+ "labels": [ -+ "cp1255", -+ "windows-1255", -+ "x-cp1255" -+ ], -+ "name": "windows-1255" -+ }, -+ { -+ "labels": [ -+ "cp1256", -+ "windows-1256", -+ "x-cp1256" -+ ], -+ "name": "windows-1256" -+ }, -+ { -+ "labels": [ -+ "cp1257", -+ "windows-1257", -+ "x-cp1257" -+ ], -+ "name": "windows-1257" -+ }, -+ { -+ "labels": [ -+ "cp1258", -+ "windows-1258", -+ "x-cp1258" -+ ], -+ "name": "windows-1258" -+ }, -+ { -+ "labels": [ -+ "x-mac-cyrillic", -+ "x-mac-ukrainian" -+ ], -+ "name": "x-mac-cyrillic" -+ } -+ ], -+ "heading": "Legacy single-byte encodings" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "chinese", -+ "csgb2312", -+ "csiso58gb231280", -+ "gb2312", -+ "gb_2312", -+ "gb_2312-80", -+ "gbk", -+ "iso-ir-58", -+ "x-gbk" -+ ], -+ "name": "GBK" -+ }, -+ { -+ "labels": [ -+ "gb18030" -+ ], -+ "name": "gb18030" -+ } -+ ], -+ "heading": "Legacy multi-byte Chinese (simplified) encodings" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "big5", -+ "big5-hkscs", -+ "cn-big5", -+ "csbig5", -+ "x-x-big5" -+ ], -+ "name": "Big5" -+ } -+ ], -+ "heading": "Legacy multi-byte Chinese (traditional) encodings" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "cseucpkdfmtjapanese", -+ "euc-jp", -+ "x-euc-jp" -+ ], -+ "name": "EUC-JP" -+ }, -+ { -+ "labels": [ -+ "csiso2022jp", -+ "iso-2022-jp" -+ ], -+ "name": "ISO-2022-JP" -+ }, -+ { -+ "labels": [ -+ "csshiftjis", -+ "ms932", -+ "ms_kanji", -+ "shift-jis", -+ "shift_jis", -+ "sjis", -+ "windows-31j", -+ "x-sjis" -+ ], -+ "name": "Shift_JIS" -+ } -+ ], -+ "heading": "Legacy multi-byte Japanese encodings" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "cseuckr", -+ "csksc56011987", -+ "euc-kr", -+ "iso-ir-149", -+ "korean", -+ "ks_c_5601-1987", -+ "ks_c_5601-1989", -+ "ksc5601", -+ "ksc_5601", -+ "windows-949" -+ ], -+ "name": "EUC-KR" -+ } -+ ], -+ "heading": "Legacy multi-byte Korean encodings" -+ }, -+ { -+ "encodings": [ -+ { -+ "labels": [ -+ "csiso2022kr", -+ "hz-gb-2312", -+ "iso-2022-cn", -+ "iso-2022-cn-ext", -+ "iso-2022-kr" -+ ], -+ "name": "replacement" -+ }, -+ { -+ "labels": [ -+ "utf-16be" -+ ], -+ "name": "UTF-16BE" -+ }, -+ { -+ "labels": [ -+ "utf-16", -+ "utf-16le" -+ ], -+ "name": "UTF-16LE" -+ }, -+ { -+ "labels": [ -+ "x-user-defined" -+ ], -+ "name": "x-user-defined" -+ } -+ ], -+ "heading": "Legacy miscellaneous encodings" -+ } -+ ]; -+ -+ // Label to encoding registry. -+ /** @type {Object.}>} */ -+ var label_to_encoding = {}; -+ encodings.forEach(function(category) { -+ category.encodings.forEach(function(encoding) { -+ encoding.labels.forEach(function(label) { -+ label_to_encoding[label] = encoding; -+ }); -+ }); -+ }); -+ -+ // Registry of of encoder/decoder factories, by encoding name. -+ /** @type {Object.} */ -+ var encoders = {}; -+ /** @type {Object.} */ -+ var decoders = {}; -+ -+ // -+ // 6. Indexes -+ // -+ -+ /** -+ * @param {number} pointer The |pointer| to search for. -+ * @param {(!Array.|undefined)} index The |index| to search within. -+ * @return {?number} The code point corresponding to |pointer| in |index|, -+ * or null if |code point| is not in |index|. -+ */ -+ function indexCodePointFor(pointer, index) { -+ if (!index) return null; -+ return index[pointer] || null; -+ } -+ -+ /** -+ * @param {number} code_point The |code point| to search for. -+ * @param {!Array.} index The |index| to search within. -+ * @return {?number} The first pointer corresponding to |code point| in -+ * |index|, or null if |code point| is not in |index|. -+ */ -+ function indexPointerFor(code_point, index) { -+ var pointer = index.indexOf(code_point); -+ return pointer === -1 ? null : pointer; -+ } -+ -+ /** -+ * @param {string} name Name of the index. -+ * @return {(!Array.|!Array.>)} -+ * */ -+ function index(name) { -+ if (!('encoding-indexes' in global)) { -+ throw Error("Indexes missing." + -+ " Did you forget to include encoding-indexes.js first?"); -+ } -+ return global['encoding-indexes'][name]; -+ } -+ -+ /** -+ * @param {number} pointer The |pointer| to search for in the gb18030 index. -+ * @return {?number} The code point corresponding to |pointer| in |index|, -+ * or null if |code point| is not in the gb18030 index. -+ */ -+ function indexGB18030RangesCodePointFor(pointer) { -+ // 1. If pointer is greater than 39419 and less than 189000, or -+ // pointer is greater than 1237575, return null. -+ if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) -+ return null; -+ -+ // 2. If pointer is 7457, return code point U+E7C7. -+ if (pointer === 7457) return 0xE7C7; -+ -+ // 3. Let offset be the last pointer in index gb18030 ranges that -+ // is equal to or less than pointer and let code point offset be -+ // its corresponding code point. -+ var offset = 0; -+ var code_point_offset = 0; -+ var idx = index('gb18030-ranges'); -+ var i; -+ for (i = 0; i < idx.length; ++i) { -+ /** @type {!Array.} */ -+ var entry = idx[i]; -+ if (entry[0] <= pointer) { -+ offset = entry[0]; -+ code_point_offset = entry[1]; -+ } else { -+ break; -+ } -+ } -+ -+ // 4. Return a code point whose value is code point offset + -+ // pointer − offset. -+ return code_point_offset + pointer - offset; -+ } -+ -+ /** -+ * @param {number} code_point The |code point| to locate in the gb18030 index. -+ * @return {number} The first pointer corresponding to |code point| in the -+ * gb18030 index. -+ */ -+ function indexGB18030RangesPointerFor(code_point) { -+ // 1. If code point is U+E7C7, return pointer 7457. -+ if (code_point === 0xE7C7) return 7457; -+ -+ // 2. Let offset be the last code point in index gb18030 ranges -+ // that is equal to or less than code point and let pointer offset -+ // be its corresponding pointer. -+ var offset = 0; -+ var pointer_offset = 0; -+ var idx = index('gb18030-ranges'); -+ var i; -+ for (i = 0; i < idx.length; ++i) { -+ /** @type {!Array.} */ -+ var entry = idx[i]; -+ if (entry[1] <= code_point) { -+ offset = entry[1]; -+ pointer_offset = entry[0]; -+ } else { -+ break; -+ } -+ } -+ -+ // 3. Return a pointer whose value is pointer offset + code point -+ // − offset. -+ return pointer_offset + code_point - offset; -+ } -+ -+ /** -+ * @param {number} code_point The |code_point| to search for in the Shift_JIS -+ * index. -+ * @return {?number} The code point corresponding to |pointer| in |index|, -+ * or null if |code point| is not in the Shift_JIS index. -+ */ -+ function indexShiftJISPointerFor(code_point) { -+ // 1. Let index be index jis0208 excluding all entries whose -+ // pointer is in the range 8272 to 8835, inclusive. -+ shift_jis_index = shift_jis_index || -+ index('jis0208').map(function(code_point, pointer) { -+ return inRange(pointer, 8272, 8835) ? null : code_point; -+ }); -+ var index_ = shift_jis_index; -+ -+ // 2. Return the index pointer for code point in index. -+ return index_.indexOf(code_point); -+ } -+ var shift_jis_index; -+ -+ /** -+ * @param {number} code_point The |code_point| to search for in the big5 -+ * index. -+ * @return {?number} The code point corresponding to |pointer| in |index|, -+ * or null if |code point| is not in the big5 index. -+ */ -+ function indexBig5PointerFor(code_point) { -+ // 1. Let index be index Big5 excluding all entries whose pointer -+ big5_index_no_hkscs = big5_index_no_hkscs || -+ index('big5').map(function(code_point, pointer) { -+ return (pointer < (0xA1 - 0x81) * 157) ? null : code_point; -+ }); -+ var index_ = big5_index_no_hkscs; -+ -+ // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or -+ // U+5345, return the last pointer corresponding to code point in -+ // index. -+ if (code_point === 0x2550 || code_point === 0x255E || -+ code_point === 0x2561 || code_point === 0x256A || -+ code_point === 0x5341 || code_point === 0x5345) { -+ return index_.lastIndexOf(code_point); -+ } -+ -+ // 3. Return the index pointer for code point in index. -+ return indexPointerFor(code_point, index_); -+ } -+ var big5_index_no_hkscs; -+ -+ // -+ // 8. API -+ // -+ -+ /** @const */ var DEFAULT_ENCODING = 'utf-8'; -+ -+ // 8.1 Interface TextDecoder -+ -+ /** -+ * @constructor -+ * @param {string=} label The label of the encoding; -+ * defaults to 'utf-8'. -+ * @param {Object=} options -+ */ -+ function TextDecoder(label, options) { -+ // Web IDL conventions -+ if (!(this instanceof TextDecoder)) -+ throw TypeError('Called as a function. Did you forget \'new\'?'); -+ label = label !== undefined ? String(label) : DEFAULT_ENCODING; -+ options = ToDictionary(options); -+ -+ // A TextDecoder object has an associated encoding, decoder, -+ // stream, ignore BOM flag (initially unset), BOM seen flag -+ // (initially unset), error mode (initially replacement), and do -+ // not flush flag (initially unset). -+ -+ /** @private */ -+ this._encoding = null; -+ /** @private @type {?Decoder} */ -+ this._decoder = null; -+ /** @private @type {boolean} */ -+ this._ignoreBOM = false; -+ /** @private @type {boolean} */ -+ this._BOMseen = false; -+ /** @private @type {string} */ -+ this._error_mode = 'replacement'; -+ /** @private @type {boolean} */ -+ this._do_not_flush = false; -+ -+ -+ // 1. Let encoding be the result of getting an encoding from -+ // label. -+ var encoding = getEncoding(label); -+ -+ // 2. If encoding is failure or replacement, throw a RangeError. -+ if (encoding === null || encoding.name === 'replacement') -+ throw RangeError('Unknown encoding: ' + label); -+ if (!decoders[encoding.name]) { -+ throw Error('Decoder not present.' + -+ ' Did you forget to include encoding-indexes.js first?'); -+ } -+ -+ // 3. Let dec be a new TextDecoder object. -+ var dec = this; -+ -+ // 4. Set dec's encoding to encoding. -+ dec._encoding = encoding; -+ -+ // 5. If options's fatal member is true, set dec's error mode to -+ // fatal. -+ if (Boolean(options['fatal'])) -+ dec._error_mode = 'fatal'; -+ -+ // 6. If options's ignoreBOM member is true, set dec's ignore BOM -+ // flag. -+ if (Boolean(options['ignoreBOM'])) -+ dec._ignoreBOM = true; -+ -+ // For pre-ES5 runtimes: -+ if (!Object.defineProperty) { -+ this.encoding = dec._encoding.name.toLowerCase(); -+ this.fatal = dec._error_mode === 'fatal'; -+ this.ignoreBOM = dec._ignoreBOM; -+ } -+ -+ // 7. Return dec. -+ return dec; -+ } -+ -+ if (Object.defineProperty) { -+ // The encoding attribute's getter must return encoding's name. -+ Object.defineProperty(TextDecoder.prototype, 'encoding', { -+ /** @this {TextDecoder} */ -+ get: function() { return this._encoding.name.toLowerCase(); } -+ }); -+ -+ // The fatal attribute's getter must return true if error mode -+ // is fatal, and false otherwise. -+ Object.defineProperty(TextDecoder.prototype, 'fatal', { -+ /** @this {TextDecoder} */ -+ get: function() { return this._error_mode === 'fatal'; } -+ }); -+ -+ // The ignoreBOM attribute's getter must return true if ignore -+ // BOM flag is set, and false otherwise. -+ Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', { -+ /** @this {TextDecoder} */ -+ get: function() { return this._ignoreBOM; } -+ }); -+ } -+ -+ /** -+ * @param {BufferSource=} input The buffer of bytes to decode. -+ * @param {Object=} options -+ * @return {string} The decoded string. -+ */ -+ TextDecoder.prototype.decode = function decode(input, options) { -+ var bytes; -+ if (typeof input === 'object' && input instanceof ArrayBuffer) { -+ bytes = new Uint8Array(input); -+ } else if (typeof input === 'object' && 'buffer' in input && -+ input.buffer instanceof ArrayBuffer) { -+ bytes = new Uint8Array(input.buffer, -+ input.byteOffset, -+ input.byteLength); -+ } else { -+ bytes = new Uint8Array(0); -+ } -+ -+ options = ToDictionary(options); -+ -+ // 1. If the do not flush flag is unset, set decoder to a new -+ // encoding's decoder, set stream to a new stream, and unset the -+ // BOM seen flag. -+ if (!this._do_not_flush) { -+ this._decoder = decoders[this._encoding.name]({ -+ fatal: this._error_mode === 'fatal'}); -+ this._BOMseen = false; -+ } -+ -+ // 2. If options's stream is true, set the do not flush flag, and -+ // unset the do not flush flag otherwise. -+ this._do_not_flush = Boolean(options['stream']); -+ -+ // 3. If input is given, push a copy of input to stream. -+ // TODO: Align with spec algorithm - maintain stream on instance. -+ var input_stream = new Stream(bytes); -+ -+ // 4. Let output be a new stream. -+ var output = []; -+ -+ /** @type {?(number|!Array.)} */ -+ var result; -+ -+ // 5. While true: -+ while (true) { -+ // 1. Let token be the result of reading from stream. -+ var token = input_stream.read(); -+ -+ // 2. If token is end-of-stream and the do not flush flag is -+ // set, return output, serialized. -+ // TODO: Align with spec algorithm. -+ if (token === end_of_stream) -+ break; -+ -+ // 3. Otherwise, run these subsubsteps: -+ -+ // 1. Let result be the result of processing token for decoder, -+ // stream, output, and error mode. -+ result = this._decoder.handler(input_stream, token); -+ -+ // 2. If result is finished, return output, serialized. -+ if (result === finished) -+ break; -+ -+ if (result !== null) { -+ if (Array.isArray(result)) -+ output.push.apply(output, /**@type {!Array.}*/(result)); -+ else -+ output.push(result); -+ } -+ -+ // 3. Otherwise, if result is error, throw a TypeError. -+ // (Thrown in handler) -+ -+ // 4. Otherwise, do nothing. -+ } -+ // TODO: Align with spec algorithm. -+ if (!this._do_not_flush) { -+ do { -+ result = this._decoder.handler(input_stream, input_stream.read()); -+ if (result === finished) -+ break; -+ if (result === null) -+ continue; -+ if (Array.isArray(result)) -+ output.push.apply(output, /**@type {!Array.}*/(result)); -+ else -+ output.push(result); -+ } while (!input_stream.endOfStream()); -+ this._decoder = null; -+ } -+ -+ // A TextDecoder object also has an associated serialize stream -+ // algorithm... -+ /** -+ * @param {!Array.} stream -+ * @return {string} -+ * @this {TextDecoder} -+ */ -+ function serializeStream(stream) { -+ // 1. Let token be the result of reading from stream. -+ // (Done in-place on array, rather than as a stream) -+ -+ // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore -+ // BOM flag and BOM seen flag are unset, run these subsubsteps: -+ if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) && -+ !this._ignoreBOM && !this._BOMseen) { -+ if (stream.length > 0 && stream[0] === 0xFEFF) { -+ // 1. If token is U+FEFF, set BOM seen flag. -+ this._BOMseen = true; -+ stream.shift(); -+ } else if (stream.length > 0) { -+ // 2. Otherwise, if token is not end-of-stream, set BOM seen -+ // flag and append token to stream. -+ this._BOMseen = true; -+ } else { -+ // 3. Otherwise, if token is not end-of-stream, append token -+ // to output. -+ // (no-op) -+ } -+ } -+ // 4. Otherwise, return output. -+ return codePointsToString(stream); -+ } -+ -+ return serializeStream.call(this, output); -+ }; -+ -+ // 8.2 Interface TextEncoder -+ -+ /** -+ * @constructor -+ * @param {string=} label The label of the encoding. NONSTANDARD. -+ * @param {Object=} options NONSTANDARD. -+ */ -+ function TextEncoder(label, options) { -+ // Web IDL conventions -+ if (!(this instanceof TextEncoder)) -+ throw TypeError('Called as a function. Did you forget \'new\'?'); -+ options = ToDictionary(options); -+ -+ // A TextEncoder object has an associated encoding and encoder. -+ -+ /** @private */ -+ this._encoding = null; -+ /** @private @type {?Encoder} */ -+ this._encoder = null; -+ -+ // Non-standard -+ /** @private @type {boolean} */ -+ this._do_not_flush = false; -+ /** @private @type {string} */ -+ this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement'; -+ -+ // 1. Let enc be a new TextEncoder object. -+ var enc = this; -+ -+ // 2. Set enc's encoding to UTF-8's encoder. -+ if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) { -+ // NONSTANDARD behavior. -+ label = label !== undefined ? String(label) : DEFAULT_ENCODING; -+ var encoding = getEncoding(label); -+ if (encoding === null || encoding.name === 'replacement') -+ throw RangeError('Unknown encoding: ' + label); -+ if (!encoders[encoding.name]) { -+ throw Error('Encoder not present.' + -+ ' Did you forget to include encoding-indexes.js first?'); -+ } -+ enc._encoding = encoding; -+ } else { -+ // Standard behavior. -+ enc._encoding = getEncoding('utf-8'); -+ -+ if (label !== undefined && 'console' in global) { -+ console.warn('TextEncoder constructor called with encoding label, ' -+ + 'which is ignored.'); -+ } -+ } -+ -+ // For pre-ES5 runtimes: -+ if (!Object.defineProperty) -+ this.encoding = enc._encoding.name.toLowerCase(); -+ -+ // 3. Return enc. -+ return enc; -+ } -+ -+ if (Object.defineProperty) { -+ // The encoding attribute's getter must return encoding's name. -+ Object.defineProperty(TextEncoder.prototype, 'encoding', { -+ /** @this {TextEncoder} */ -+ get: function() { return this._encoding.name.toLowerCase(); } -+ }); -+ } -+ -+ /** -+ * @param {string=} opt_string The string to encode. -+ * @param {Object=} options -+ * @return {!Uint8Array} Encoded bytes, as a Uint8Array. -+ */ -+ TextEncoder.prototype.encode = function encode(opt_string, options) { -+ opt_string = opt_string === undefined ? '' : String(opt_string); -+ options = ToDictionary(options); -+ -+ // NOTE: This option is nonstandard. None of the encodings -+ // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when -+ // the input is a USVString so streaming is not necessary. -+ if (!this._do_not_flush) -+ this._encoder = encoders[this._encoding.name]({ -+ fatal: this._fatal === 'fatal'}); -+ this._do_not_flush = Boolean(options['stream']); -+ -+ // 1. Convert input to a stream. -+ var input = new Stream(stringToCodePoints(opt_string)); -+ -+ // 2. Let output be a new stream -+ var output = []; -+ -+ /** @type {?(number|!Array.)} */ -+ var result; -+ // 3. While true, run these substeps: -+ while (true) { -+ // 1. Let token be the result of reading from input. -+ var token = input.read(); -+ if (token === end_of_stream) -+ break; -+ // 2. Let result be the result of processing token for encoder, -+ // input, output. -+ result = this._encoder.handler(input, token); -+ if (result === finished) -+ break; -+ if (Array.isArray(result)) -+ output.push.apply(output, /**@type {!Array.}*/(result)); -+ else -+ output.push(result); -+ } -+ // TODO: Align with spec algorithm. -+ if (!this._do_not_flush) { -+ while (true) { -+ result = this._encoder.handler(input, input.read()); -+ if (result === finished) -+ break; -+ if (Array.isArray(result)) -+ output.push.apply(output, /**@type {!Array.}*/(result)); -+ else -+ output.push(result); -+ } -+ this._encoder = null; -+ } -+ // 3. If result is finished, convert output into a byte sequence, -+ // and then return a Uint8Array object wrapping an ArrayBuffer -+ // containing output. -+ return new Uint8Array(output); -+ }; -+ -+ -+ // -+ // 9. The encoding -+ // -+ -+ // 9.1 utf-8 -+ -+ // 9.1.1 utf-8 decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function UTF8Decoder(options) { -+ var fatal = options.fatal; -+ -+ // utf-8's decoder's has an associated utf-8 code point, utf-8 -+ // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8 -+ // lower boundary (initially 0x80), and a utf-8 upper boundary -+ // (initially 0xBF). -+ var /** @type {number} */ utf8_code_point = 0, -+ /** @type {number} */ utf8_bytes_seen = 0, -+ /** @type {number} */ utf8_bytes_needed = 0, -+ /** @type {number} */ utf8_lower_boundary = 0x80, -+ /** @type {number} */ utf8_upper_boundary = 0xBF; -+ -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and utf-8 bytes needed is not 0, -+ // set utf-8 bytes needed to 0 and return error. -+ if (bite === end_of_stream && utf8_bytes_needed !== 0) { -+ utf8_bytes_needed = 0; -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream, return finished. -+ if (bite === end_of_stream) -+ return finished; -+ -+ // 3. If utf-8 bytes needed is 0, based on byte: -+ if (utf8_bytes_needed === 0) { -+ -+ // 0x00 to 0x7F -+ if (inRange(bite, 0x00, 0x7F)) { -+ // Return a code point whose value is byte. -+ return bite; -+ } -+ -+ // 0xC2 to 0xDF -+ else if (inRange(bite, 0xC2, 0xDF)) { -+ // 1. Set utf-8 bytes needed to 1. -+ utf8_bytes_needed = 1; -+ -+ // 2. Set UTF-8 code point to byte & 0x1F. -+ utf8_code_point = bite & 0x1F; -+ } -+ -+ // 0xE0 to 0xEF -+ else if (inRange(bite, 0xE0, 0xEF)) { -+ // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0. -+ if (bite === 0xE0) -+ utf8_lower_boundary = 0xA0; -+ // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F. -+ if (bite === 0xED) -+ utf8_upper_boundary = 0x9F; -+ // 3. Set utf-8 bytes needed to 2. -+ utf8_bytes_needed = 2; -+ // 4. Set UTF-8 code point to byte & 0xF. -+ utf8_code_point = bite & 0xF; -+ } -+ -+ // 0xF0 to 0xF4 -+ else if (inRange(bite, 0xF0, 0xF4)) { -+ // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90. -+ if (bite === 0xF0) -+ utf8_lower_boundary = 0x90; -+ // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F. -+ if (bite === 0xF4) -+ utf8_upper_boundary = 0x8F; -+ // 3. Set utf-8 bytes needed to 3. -+ utf8_bytes_needed = 3; -+ // 4. Set UTF-8 code point to byte & 0x7. -+ utf8_code_point = bite & 0x7; -+ } -+ -+ // Otherwise -+ else { -+ // Return error. -+ return decoderError(fatal); -+ } -+ -+ // Return continue. -+ return null; -+ } -+ -+ // 4. If byte is not in the range utf-8 lower boundary to utf-8 -+ // upper boundary, inclusive, run these substeps: -+ if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) { -+ -+ // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8 -+ // bytes seen to 0, set utf-8 lower boundary to 0x80, and set -+ // utf-8 upper boundary to 0xBF. -+ utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; -+ utf8_lower_boundary = 0x80; -+ utf8_upper_boundary = 0xBF; -+ -+ // 2. Prepend byte to stream. -+ stream.prepend(bite); -+ -+ // 3. Return error. -+ return decoderError(fatal); -+ } -+ -+ // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary -+ // to 0xBF. -+ utf8_lower_boundary = 0x80; -+ utf8_upper_boundary = 0xBF; -+ -+ // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte & -+ // 0x3F) -+ utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F); -+ -+ // 7. Increase utf-8 bytes seen by one. -+ utf8_bytes_seen += 1; -+ -+ // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed, -+ // continue. -+ if (utf8_bytes_seen !== utf8_bytes_needed) -+ return null; -+ -+ // 9. Let code point be utf-8 code point. -+ var code_point = utf8_code_point; -+ -+ // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes -+ // seen to 0. -+ utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; -+ -+ // 11. Return a code point whose value is code point. -+ return code_point; -+ }; -+ } -+ -+ // 9.1.2 utf-8 encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function UTF8Encoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. Set count and offset based on the range code point is in: -+ var count, offset; -+ // U+0080 to U+07FF, inclusive: -+ if (inRange(code_point, 0x0080, 0x07FF)) { -+ // 1 and 0xC0 -+ count = 1; -+ offset = 0xC0; -+ } -+ // U+0800 to U+FFFF, inclusive: -+ else if (inRange(code_point, 0x0800, 0xFFFF)) { -+ // 2 and 0xE0 -+ count = 2; -+ offset = 0xE0; -+ } -+ // U+10000 to U+10FFFF, inclusive: -+ else if (inRange(code_point, 0x10000, 0x10FFFF)) { -+ // 3 and 0xF0 -+ count = 3; -+ offset = 0xF0; -+ } -+ -+ // 4. Let bytes be a byte sequence whose first byte is (code -+ // point >> (6 × count)) + offset. -+ var bytes = [(code_point >> (6 * count)) + offset]; -+ -+ // 5. Run these substeps while count is greater than 0: -+ while (count > 0) { -+ -+ // 1. Set temp to code point >> (6 × (count − 1)). -+ var temp = code_point >> (6 * (count - 1)); -+ -+ // 2. Append to bytes 0x80 | (temp & 0x3F). -+ bytes.push(0x80 | (temp & 0x3F)); -+ -+ // 3. Decrease count by one. -+ count -= 1; -+ } -+ -+ // 6. Return bytes bytes, in order. -+ return bytes; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['UTF-8'] = function(options) { -+ return new UTF8Encoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['UTF-8'] = function(options) { -+ return new UTF8Decoder(options); -+ }; -+ -+ // -+ // 10. Legacy single-byte encodings -+ // -+ -+ // 10.1 single-byte decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {!Array.} index The encoding index. -+ * @param {{fatal: boolean}} options -+ */ -+ function SingleByteDecoder(index, options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream, return finished. -+ if (bite === end_of_stream) -+ return finished; -+ -+ // 2. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 3. Let code point be the index code point for byte − 0x80 in -+ // index single-byte. -+ var code_point = index[bite - 0x80]; -+ -+ // 4. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 5. Return a code point whose value is code point. -+ return code_point; -+ }; -+ } -+ -+ // 10.2 single-byte encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {!Array.} index The encoding index. -+ * @param {{fatal: boolean}} options -+ */ -+ function SingleByteEncoder(index, options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. Let pointer be the index pointer for code point in index -+ // single-byte. -+ var pointer = indexPointerFor(code_point, index); -+ -+ // 4. If pointer is null, return error with code point. -+ if (pointer === null) -+ encoderError(code_point); -+ -+ // 5. Return a byte whose value is pointer + 0x80. -+ return pointer + 0x80; -+ }; -+ } -+ -+ (function() { -+ if (!('encoding-indexes' in global)) -+ return; -+ encodings.forEach(function(category) { -+ if (category.heading !== 'Legacy single-byte encodings') -+ return; -+ category.encodings.forEach(function(encoding) { -+ var name = encoding.name; -+ var idx = index(name.toLowerCase()); -+ /** @param {{fatal: boolean}} options */ -+ decoders[name] = function(options) { -+ return new SingleByteDecoder(idx, options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ encoders[name] = function(options) { -+ return new SingleByteEncoder(idx, options); -+ }; -+ }); -+ }); -+ }()); -+ -+ // -+ // 11. Legacy multi-byte Chinese (simplified) encodings -+ // -+ -+ // 11.1 gbk -+ -+ // 11.1.1 gbk decoder -+ // gbk's decoder is gb18030's decoder. -+ /** @param {{fatal: boolean}} options */ -+ decoders['GBK'] = function(options) { -+ return new GB18030Decoder(options); -+ }; -+ -+ // 11.1.2 gbk encoder -+ // gbk's encoder is gb18030's encoder with its gbk flag set. -+ /** @param {{fatal: boolean}} options */ -+ encoders['GBK'] = function(options) { -+ return new GB18030Encoder(options, true); -+ }; -+ -+ // 11.2 gb18030 -+ -+ // 11.2.1 gb18030 decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function GB18030Decoder(options) { -+ var fatal = options.fatal; -+ // gb18030's decoder has an associated gb18030 first, gb18030 -+ // second, and gb18030 third (all initially 0x00). -+ var /** @type {number} */ gb18030_first = 0x00, -+ /** @type {number} */ gb18030_second = 0x00, -+ /** @type {number} */ gb18030_third = 0x00; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and gb18030 first, gb18030 -+ // second, and gb18030 third are 0x00, return finished. -+ if (bite === end_of_stream && gb18030_first === 0x00 && -+ gb18030_second === 0x00 && gb18030_third === 0x00) { -+ return finished; -+ } -+ // 2. If byte is end-of-stream, and gb18030 first, gb18030 -+ // second, or gb18030 third is not 0x00, set gb18030 first, -+ // gb18030 second, and gb18030 third to 0x00, and return error. -+ if (bite === end_of_stream && -+ (gb18030_first !== 0x00 || gb18030_second !== 0x00 || -+ gb18030_third !== 0x00)) { -+ gb18030_first = 0x00; -+ gb18030_second = 0x00; -+ gb18030_third = 0x00; -+ decoderError(fatal); -+ } -+ var code_point; -+ // 3. If gb18030 third is not 0x00, run these substeps: -+ if (gb18030_third !== 0x00) { -+ // 1. Let code point be null. -+ code_point = null; -+ // 2. If byte is in the range 0x30 to 0x39, inclusive, set -+ // code point to the index gb18030 ranges code point for -+ // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) × -+ // 126 + gb18030 third − 0x81) × 10 + byte − 0x30. -+ if (inRange(bite, 0x30, 0x39)) { -+ code_point = indexGB18030RangesCodePointFor( -+ (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 + -+ gb18030_third - 0x81) * 10 + bite - 0x30); -+ } -+ -+ // 3. Let buffer be a byte sequence consisting of gb18030 -+ // second, gb18030 third, and byte, in order. -+ var buffer = [gb18030_second, gb18030_third, bite]; -+ -+ // 4. Set gb18030 first, gb18030 second, and gb18030 third to -+ // 0x00. -+ gb18030_first = 0x00; -+ gb18030_second = 0x00; -+ gb18030_third = 0x00; -+ -+ // 5. If code point is null, prepend buffer to stream and -+ // return error. -+ if (code_point === null) { -+ stream.prepend(buffer); -+ return decoderError(fatal); -+ } -+ -+ // 6. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 4. If gb18030 second is not 0x00, run these substeps: -+ if (gb18030_second !== 0x00) { -+ -+ // 1. If byte is in the range 0x81 to 0xFE, inclusive, set -+ // gb18030 third to byte and return continue. -+ if (inRange(bite, 0x81, 0xFE)) { -+ gb18030_third = bite; -+ return null; -+ } -+ -+ // 2. Prepend gb18030 second followed by byte to stream, set -+ // gb18030 first and gb18030 second to 0x00, and return error. -+ stream.prepend([gb18030_second, bite]); -+ gb18030_first = 0x00; -+ gb18030_second = 0x00; -+ return decoderError(fatal); -+ } -+ -+ // 5. If gb18030 first is not 0x00, run these substeps: -+ if (gb18030_first !== 0x00) { -+ -+ // 1. If byte is in the range 0x30 to 0x39, inclusive, set -+ // gb18030 second to byte and return continue. -+ if (inRange(bite, 0x30, 0x39)) { -+ gb18030_second = bite; -+ return null; -+ } -+ -+ // 2. Let lead be gb18030 first, let pointer be null, and set -+ // gb18030 first to 0x00. -+ var lead = gb18030_first; -+ var pointer = null; -+ gb18030_first = 0x00; -+ -+ // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41 -+ // otherwise. -+ var offset = bite < 0x7F ? 0x40 : 0x41; -+ -+ // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 -+ // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 + -+ // (byte − offset). -+ if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) -+ pointer = (lead - 0x81) * 190 + (bite - offset); -+ -+ // 5. Let code point be null if pointer is null and the index -+ // code point for pointer in index gb18030 otherwise. -+ code_point = pointer === null ? null : -+ indexCodePointFor(pointer, index('gb18030')); -+ -+ // 6. If code point is null and byte is an ASCII byte, prepend -+ // byte to stream. -+ if (code_point === null && isASCIIByte(bite)) -+ stream.prepend(bite); -+ -+ // 7. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 8. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 6. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 7. If byte is 0x80, return code point U+20AC. -+ if (bite === 0x80) -+ return 0x20AC; -+ -+ // 8. If byte is in the range 0x81 to 0xFE, inclusive, set -+ // gb18030 first to byte and return continue. -+ if (inRange(bite, 0x81, 0xFE)) { -+ gb18030_first = bite; -+ return null; -+ } -+ -+ // 9. Return error. -+ return decoderError(fatal); -+ }; -+ } -+ -+ // 11.2.2 gb18030 encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ * @param {boolean=} gbk_flag -+ */ -+ function GB18030Encoder(options, gbk_flag) { -+ var fatal = options.fatal; -+ // gb18030's decoder has an associated gbk flag (initially unset). -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. If code point is U+E5E5, return error with code point. -+ if (code_point === 0xE5E5) -+ return encoderError(code_point); -+ -+ // 4. If the gbk flag is set and code point is U+20AC, return -+ // byte 0x80. -+ if (gbk_flag && code_point === 0x20AC) -+ return 0x80; -+ -+ // 5. Let pointer be the index pointer for code point in index -+ // gb18030. -+ var pointer = indexPointerFor(code_point, index('gb18030')); -+ -+ // 6. If pointer is not null, run these substeps: -+ if (pointer !== null) { -+ -+ // 1. Let lead be floor(pointer / 190) + 0x81. -+ var lead = floor(pointer / 190) + 0x81; -+ -+ // 2. Let trail be pointer % 190. -+ var trail = pointer % 190; -+ -+ // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise. -+ var offset = trail < 0x3F ? 0x40 : 0x41; -+ -+ // 4. Return two bytes whose values are lead and trail + offset. -+ return [lead, trail + offset]; -+ } -+ -+ // 7. If gbk flag is set, return error with code point. -+ if (gbk_flag) -+ return encoderError(code_point); -+ -+ // 8. Set pointer to the index gb18030 ranges pointer for code -+ // point. -+ pointer = indexGB18030RangesPointerFor(code_point); -+ -+ // 9. Let byte1 be floor(pointer / 10 / 126 / 10). -+ var byte1 = floor(pointer / 10 / 126 / 10); -+ -+ // 10. Set pointer to pointer − byte1 × 10 × 126 × 10. -+ pointer = pointer - byte1 * 10 * 126 * 10; -+ -+ // 11. Let byte2 be floor(pointer / 10 / 126). -+ var byte2 = floor(pointer / 10 / 126); -+ -+ // 12. Set pointer to pointer − byte2 × 10 × 126. -+ pointer = pointer - byte2 * 10 * 126; -+ -+ // 13. Let byte3 be floor(pointer / 10). -+ var byte3 = floor(pointer / 10); -+ -+ // 14. Let byte4 be pointer − byte3 × 10. -+ var byte4 = pointer - byte3 * 10; -+ -+ // 15. Return four bytes whose values are byte1 + 0x81, byte2 + -+ // 0x30, byte3 + 0x81, byte4 + 0x30. -+ return [byte1 + 0x81, -+ byte2 + 0x30, -+ byte3 + 0x81, -+ byte4 + 0x30]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['gb18030'] = function(options) { -+ return new GB18030Encoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['gb18030'] = function(options) { -+ return new GB18030Decoder(options); -+ }; -+ -+ -+ // -+ // 12. Legacy multi-byte Chinese (traditional) encodings -+ // -+ -+ // 12.1 Big5 -+ -+ // 12.1.1 Big5 decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function Big5Decoder(options) { -+ var fatal = options.fatal; -+ // Big5's decoder has an associated Big5 lead (initially 0x00). -+ var /** @type {number} */ Big5_lead = 0x00; -+ -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and Big5 lead is not 0x00, set -+ // Big5 lead to 0x00 and return error. -+ if (bite === end_of_stream && Big5_lead !== 0x00) { -+ Big5_lead = 0x00; -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream and Big5 lead is 0x00, return -+ // finished. -+ if (bite === end_of_stream && Big5_lead === 0x00) -+ return finished; -+ -+ // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let -+ // pointer be null, set Big5 lead to 0x00, and then run these -+ // substeps: -+ if (Big5_lead !== 0x00) { -+ var lead = Big5_lead; -+ var pointer = null; -+ Big5_lead = 0x00; -+ -+ // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62 -+ // otherwise. -+ var offset = bite < 0x7F ? 0x40 : 0x62; -+ -+ // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1 -+ // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 + -+ // (byte − offset). -+ if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) -+ pointer = (lead - 0x81) * 157 + (bite - offset); -+ -+ // 3. If there is a row in the table below whose first column -+ // is pointer, return the two code points listed in its second -+ // column -+ // Pointer | Code points -+ // --------+-------------- -+ // 1133 | U+00CA U+0304 -+ // 1135 | U+00CA U+030C -+ // 1164 | U+00EA U+0304 -+ // 1166 | U+00EA U+030C -+ switch (pointer) { -+ case 1133: return [0x00CA, 0x0304]; -+ case 1135: return [0x00CA, 0x030C]; -+ case 1164: return [0x00EA, 0x0304]; -+ case 1166: return [0x00EA, 0x030C]; -+ } -+ -+ // 4. Let code point be null if pointer is null and the index -+ // code point for pointer in index Big5 otherwise. -+ var code_point = (pointer === null) ? null : -+ indexCodePointFor(pointer, index('big5')); -+ -+ // 5. If code point is null and byte is an ASCII byte, prepend -+ // byte to stream. -+ if (code_point === null && isASCIIByte(bite)) -+ stream.prepend(bite); -+ -+ // 6. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 7. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 4. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5 -+ // lead to byte and return continue. -+ if (inRange(bite, 0x81, 0xFE)) { -+ Big5_lead = bite; -+ return null; -+ } -+ -+ // 6. Return error. -+ return decoderError(fatal); -+ }; -+ } -+ -+ // 12.1.2 Big5 encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function Big5Encoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. Let pointer be the index Big5 pointer for code point. -+ var pointer = indexBig5PointerFor(code_point); -+ -+ // 4. If pointer is null, return error with code point. -+ if (pointer === null) -+ return encoderError(code_point); -+ -+ // 5. Let lead be floor(pointer / 157) + 0x81. -+ var lead = floor(pointer / 157) + 0x81; -+ -+ // 6. If lead is less than 0xA1, return error with code point. -+ if (lead < 0xA1) -+ return encoderError(code_point); -+ -+ // 7. Let trail be pointer % 157. -+ var trail = pointer % 157; -+ -+ // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62 -+ // otherwise. -+ var offset = trail < 0x3F ? 0x40 : 0x62; -+ -+ // Return two bytes whose values are lead and trail + offset. -+ return [lead, trail + offset]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['Big5'] = function(options) { -+ return new Big5Encoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['Big5'] = function(options) { -+ return new Big5Decoder(options); -+ }; -+ -+ -+ // -+ // 13. Legacy multi-byte Japanese encodings -+ // -+ -+ // 13.1 euc-jp -+ -+ // 13.1.1 euc-jp decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function EUCJPDecoder(options) { -+ var fatal = options.fatal; -+ -+ // euc-jp's decoder has an associated euc-jp jis0212 flag -+ // (initially unset) and euc-jp lead (initially 0x00). -+ var /** @type {boolean} */ eucjp_jis0212_flag = false, -+ /** @type {number} */ eucjp_lead = 0x00; -+ -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set -+ // euc-jp lead to 0x00, and return error. -+ if (bite === end_of_stream && eucjp_lead !== 0x00) { -+ eucjp_lead = 0x00; -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream and euc-jp lead is 0x00, return -+ // finished. -+ if (bite === end_of_stream && eucjp_lead === 0x00) -+ return finished; -+ -+ // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to -+ // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code -+ // point whose value is 0xFF61 − 0xA1 + byte. -+ if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) { -+ eucjp_lead = 0x00; -+ return 0xFF61 - 0xA1 + bite; -+ } -+ -+ // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to -+ // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead -+ // to byte, and return continue. -+ if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) { -+ eucjp_jis0212_flag = true; -+ eucjp_lead = bite; -+ return null; -+ } -+ -+ // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set -+ // euc-jp lead to 0x00, and run these substeps: -+ if (eucjp_lead !== 0x00) { -+ var lead = eucjp_lead; -+ eucjp_lead = 0x00; -+ -+ // 1. Let code point be null. -+ var code_point = null; -+ -+ // 2. If lead and byte are both in the range 0xA1 to 0xFE, -+ // inclusive, set code point to the index code point for (lead -+ // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp -+ // jis0212 flag is unset and in index jis0212 otherwise. -+ if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) { -+ code_point = indexCodePointFor( -+ (lead - 0xA1) * 94 + (bite - 0xA1), -+ index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212')); -+ } -+ -+ // 3. Unset the euc-jp jis0212 flag. -+ eucjp_jis0212_flag = false; -+ -+ // 4. If byte is not in the range 0xA1 to 0xFE, inclusive, -+ // prepend byte to stream. -+ if (!inRange(bite, 0xA1, 0xFE)) -+ stream.prepend(bite); -+ -+ // 5. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 6. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 6. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE, -+ // inclusive, set euc-jp lead to byte and return continue. -+ if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) { -+ eucjp_lead = bite; -+ return null; -+ } -+ -+ // 8. Return error. -+ return decoderError(fatal); -+ }; -+ } -+ -+ // 13.1.2 euc-jp encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function EUCJPEncoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. If code point is U+00A5, return byte 0x5C. -+ if (code_point === 0x00A5) -+ return 0x5C; -+ -+ // 4. If code point is U+203E, return byte 0x7E. -+ if (code_point === 0x203E) -+ return 0x7E; -+ -+ // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, -+ // return two bytes whose values are 0x8E and code point − -+ // 0xFF61 + 0xA1. -+ if (inRange(code_point, 0xFF61, 0xFF9F)) -+ return [0x8E, code_point - 0xFF61 + 0xA1]; -+ -+ // 6. If code point is U+2212, set it to U+FF0D. -+ if (code_point === 0x2212) -+ code_point = 0xFF0D; -+ -+ // 7. Let pointer be the index pointer for code point in index -+ // jis0208. -+ var pointer = indexPointerFor(code_point, index('jis0208')); -+ -+ // 8. If pointer is null, return error with code point. -+ if (pointer === null) -+ return encoderError(code_point); -+ -+ // 9. Let lead be floor(pointer / 94) + 0xA1. -+ var lead = floor(pointer / 94) + 0xA1; -+ -+ // 10. Let trail be pointer % 94 + 0xA1. -+ var trail = pointer % 94 + 0xA1; -+ -+ // 11. Return two bytes whose values are lead and trail. -+ return [lead, trail]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['EUC-JP'] = function(options) { -+ return new EUCJPEncoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['EUC-JP'] = function(options) { -+ return new EUCJPDecoder(options); -+ }; -+ -+ // 13.2 iso-2022-jp -+ -+ // 13.2.1 iso-2022-jp decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function ISO2022JPDecoder(options) { -+ var fatal = options.fatal; -+ /** @enum */ -+ var states = { -+ ASCII: 0, -+ Roman: 1, -+ Katakana: 2, -+ LeadByte: 3, -+ TrailByte: 4, -+ EscapeStart: 5, -+ Escape: 6 -+ }; -+ // iso-2022-jp's decoder has an associated iso-2022-jp decoder -+ // state (initially ASCII), iso-2022-jp decoder output state -+ // (initially ASCII), iso-2022-jp lead (initially 0x00), and -+ // iso-2022-jp output flag (initially unset). -+ var /** @type {number} */ iso2022jp_decoder_state = states.ASCII, -+ /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII, -+ /** @type {number} */ iso2022jp_lead = 0x00, -+ /** @type {boolean} */ iso2022jp_output_flag = false; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // switching on iso-2022-jp decoder state: -+ switch (iso2022jp_decoder_state) { -+ default: -+ case states.ASCII: -+ // ASCII -+ // Based on byte: -+ -+ // 0x1B -+ if (bite === 0x1B) { -+ // Set iso-2022-jp decoder state to escape start and return -+ // continue. -+ iso2022jp_decoder_state = states.EscapeStart; -+ return null; -+ } -+ -+ // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B -+ if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E -+ && bite !== 0x0F && bite !== 0x1B) { -+ // Unset the iso-2022-jp output flag and return a code point -+ // whose value is byte. -+ iso2022jp_output_flag = false; -+ return bite; -+ } -+ -+ // end-of-stream -+ if (bite === end_of_stream) { -+ // Return finished. -+ return finished; -+ } -+ -+ // Otherwise -+ // Unset the iso-2022-jp output flag and return error. -+ iso2022jp_output_flag = false; -+ return decoderError(fatal); -+ -+ case states.Roman: -+ // Roman -+ // Based on byte: -+ -+ // 0x1B -+ if (bite === 0x1B) { -+ // Set iso-2022-jp decoder state to escape start and return -+ // continue. -+ iso2022jp_decoder_state = states.EscapeStart; -+ return null; -+ } -+ -+ // 0x5C -+ if (bite === 0x5C) { -+ // Unset the iso-2022-jp output flag and return code point -+ // U+00A5. -+ iso2022jp_output_flag = false; -+ return 0x00A5; -+ } -+ -+ // 0x7E -+ if (bite === 0x7E) { -+ // Unset the iso-2022-jp output flag and return code point -+ // U+203E. -+ iso2022jp_output_flag = false; -+ return 0x203E; -+ } -+ -+ // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E -+ if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F -+ && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) { -+ // Unset the iso-2022-jp output flag and return a code point -+ // whose value is byte. -+ iso2022jp_output_flag = false; -+ return bite; -+ } -+ -+ // end-of-stream -+ if (bite === end_of_stream) { -+ // Return finished. -+ return finished; -+ } -+ -+ // Otherwise -+ // Unset the iso-2022-jp output flag and return error. -+ iso2022jp_output_flag = false; -+ return decoderError(fatal); -+ -+ case states.Katakana: -+ // Katakana -+ // Based on byte: -+ -+ // 0x1B -+ if (bite === 0x1B) { -+ // Set iso-2022-jp decoder state to escape start and return -+ // continue. -+ iso2022jp_decoder_state = states.EscapeStart; -+ return null; -+ } -+ -+ // 0x21 to 0x5F -+ if (inRange(bite, 0x21, 0x5F)) { -+ // Unset the iso-2022-jp output flag and return a code point -+ // whose value is 0xFF61 − 0x21 + byte. -+ iso2022jp_output_flag = false; -+ return 0xFF61 - 0x21 + bite; -+ } -+ -+ // end-of-stream -+ if (bite === end_of_stream) { -+ // Return finished. -+ return finished; -+ } -+ -+ // Otherwise -+ // Unset the iso-2022-jp output flag and return error. -+ iso2022jp_output_flag = false; -+ return decoderError(fatal); -+ -+ case states.LeadByte: -+ // Lead byte -+ // Based on byte: -+ -+ // 0x1B -+ if (bite === 0x1B) { -+ // Set iso-2022-jp decoder state to escape start and return -+ // continue. -+ iso2022jp_decoder_state = states.EscapeStart; -+ return null; -+ } -+ -+ // 0x21 to 0x7E -+ if (inRange(bite, 0x21, 0x7E)) { -+ // Unset the iso-2022-jp output flag, set iso-2022-jp lead -+ // to byte, iso-2022-jp decoder state to trail byte, and -+ // return continue. -+ iso2022jp_output_flag = false; -+ iso2022jp_lead = bite; -+ iso2022jp_decoder_state = states.TrailByte; -+ return null; -+ } -+ -+ // end-of-stream -+ if (bite === end_of_stream) { -+ // Return finished. -+ return finished; -+ } -+ -+ // Otherwise -+ // Unset the iso-2022-jp output flag and return error. -+ iso2022jp_output_flag = false; -+ return decoderError(fatal); -+ -+ case states.TrailByte: -+ // Trail byte -+ // Based on byte: -+ -+ // 0x1B -+ if (bite === 0x1B) { -+ // Set iso-2022-jp decoder state to escape start and return -+ // continue. -+ iso2022jp_decoder_state = states.EscapeStart; -+ return decoderError(fatal); -+ } -+ -+ // 0x21 to 0x7E -+ if (inRange(bite, 0x21, 0x7E)) { -+ // 1. Set the iso-2022-jp decoder state to lead byte. -+ iso2022jp_decoder_state = states.LeadByte; -+ -+ // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21. -+ var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21; -+ -+ // 3. Let code point be the index code point for pointer in -+ // index jis0208. -+ var code_point = indexCodePointFor(pointer, index('jis0208')); -+ -+ // 4. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 5. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // end-of-stream -+ if (bite === end_of_stream) { -+ // Set the iso-2022-jp decoder state to lead byte, prepend -+ // byte to stream, and return error. -+ iso2022jp_decoder_state = states.LeadByte; -+ stream.prepend(bite); -+ return decoderError(fatal); -+ } -+ -+ // Otherwise -+ // Set iso-2022-jp decoder state to lead byte and return -+ // error. -+ iso2022jp_decoder_state = states.LeadByte; -+ return decoderError(fatal); -+ -+ case states.EscapeStart: -+ // Escape start -+ -+ // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to -+ // byte, iso-2022-jp decoder state to escape, and return -+ // continue. -+ if (bite === 0x24 || bite === 0x28) { -+ iso2022jp_lead = bite; -+ iso2022jp_decoder_state = states.Escape; -+ return null; -+ } -+ -+ // 2. Prepend byte to stream. -+ stream.prepend(bite); -+ -+ // 3. Unset the iso-2022-jp output flag, set iso-2022-jp -+ // decoder state to iso-2022-jp decoder output state, and -+ // return error. -+ iso2022jp_output_flag = false; -+ iso2022jp_decoder_state = iso2022jp_decoder_output_state; -+ return decoderError(fatal); -+ -+ case states.Escape: -+ // Escape -+ -+ // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to -+ // 0x00. -+ var lead = iso2022jp_lead; -+ iso2022jp_lead = 0x00; -+ -+ // 2. Let state be null. -+ var state = null; -+ -+ // 3. If lead is 0x28 and byte is 0x42, set state to ASCII. -+ if (lead === 0x28 && bite === 0x42) -+ state = states.ASCII; -+ -+ // 4. If lead is 0x28 and byte is 0x4A, set state to Roman. -+ if (lead === 0x28 && bite === 0x4A) -+ state = states.Roman; -+ -+ // 5. If lead is 0x28 and byte is 0x49, set state to Katakana. -+ if (lead === 0x28 && bite === 0x49) -+ state = states.Katakana; -+ -+ // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set -+ // state to lead byte. -+ if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) -+ state = states.LeadByte; -+ -+ // 7. If state is non-null, run these substeps: -+ if (state !== null) { -+ // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder -+ // output state to states. -+ iso2022jp_decoder_state = iso2022jp_decoder_state = state; -+ -+ // 2. Let output flag be the iso-2022-jp output flag. -+ var output_flag = iso2022jp_output_flag; -+ -+ // 3. Set the iso-2022-jp output flag. -+ iso2022jp_output_flag = true; -+ -+ // 4. Return continue, if output flag is unset, and error -+ // otherwise. -+ return !output_flag ? null : decoderError(fatal); -+ } -+ -+ // 8. Prepend lead and byte to stream. -+ stream.prepend([lead, bite]); -+ -+ // 9. Unset the iso-2022-jp output flag, set iso-2022-jp -+ // decoder state to iso-2022-jp decoder output state and -+ // return error. -+ iso2022jp_output_flag = false; -+ iso2022jp_decoder_state = iso2022jp_decoder_output_state; -+ return decoderError(fatal); -+ } -+ }; -+ } -+ -+ // 13.2.2 iso-2022-jp encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function ISO2022JPEncoder(options) { -+ var fatal = options.fatal; -+ // iso-2022-jp's encoder has an associated iso-2022-jp encoder -+ // state which is one of ASCII, Roman, and jis0208 (initially -+ // ASCII). -+ /** @enum */ -+ var states = { -+ ASCII: 0, -+ Roman: 1, -+ jis0208: 2 -+ }; -+ var /** @type {number} */ iso2022jp_state = states.ASCII; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream and iso-2022-jp encoder -+ // state is not ASCII, prepend code point to stream, set -+ // iso-2022-jp encoder state to ASCII, and return three bytes -+ // 0x1B 0x28 0x42. -+ if (code_point === end_of_stream && -+ iso2022jp_state !== states.ASCII) { -+ stream.prepend(code_point); -+ iso2022jp_state = states.ASCII; -+ return [0x1B, 0x28, 0x42]; -+ } -+ -+ // 2. If code point is end-of-stream and iso-2022-jp encoder -+ // state is ASCII, return finished. -+ if (code_point === end_of_stream && iso2022jp_state === states.ASCII) -+ return finished; -+ -+ // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code -+ // point is U+000E, U+000F, or U+001B, return error with U+FFFD. -+ if ((iso2022jp_state === states.ASCII || -+ iso2022jp_state === states.Roman) && -+ (code_point === 0x000E || code_point === 0x000F || -+ code_point === 0x001B)) { -+ return encoderError(0xFFFD); -+ } -+ -+ // 4. If iso-2022-jp encoder state is ASCII and code point is an -+ // ASCII code point, return a byte whose value is code point. -+ if (iso2022jp_state === states.ASCII && -+ isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 5. If iso-2022-jp encoder state is Roman and code point is an -+ // ASCII code point, excluding U+005C and U+007E, or is U+00A5 -+ // or U+203E, run these substeps: -+ if (iso2022jp_state === states.Roman && -+ ((isASCIICodePoint(code_point) && -+ code_point !== 0x005C && code_point !== 0x007E) || -+ (code_point == 0x00A5 || code_point == 0x203E))) { -+ -+ // 1. If code point is an ASCII code point, return a byte -+ // whose value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 2. If code point is U+00A5, return byte 0x5C. -+ if (code_point === 0x00A5) -+ return 0x5C; -+ -+ // 3. If code point is U+203E, return byte 0x7E. -+ if (code_point === 0x203E) -+ return 0x7E; -+ } -+ -+ // 6. If code point is an ASCII code point, and iso-2022-jp -+ // encoder state is not ASCII, prepend code point to stream, set -+ // iso-2022-jp encoder state to ASCII, and return three bytes -+ // 0x1B 0x28 0x42. -+ if (isASCIICodePoint(code_point) && -+ iso2022jp_state !== states.ASCII) { -+ stream.prepend(code_point); -+ iso2022jp_state = states.ASCII; -+ return [0x1B, 0x28, 0x42]; -+ } -+ -+ // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp -+ // encoder state is not Roman, prepend code point to stream, set -+ // iso-2022-jp encoder state to Roman, and return three bytes -+ // 0x1B 0x28 0x4A. -+ if ((code_point === 0x00A5 || code_point === 0x203E) && -+ iso2022jp_state !== states.Roman) { -+ stream.prepend(code_point); -+ iso2022jp_state = states.Roman; -+ return [0x1B, 0x28, 0x4A]; -+ } -+ -+ // 8. If code point is U+2212, set it to U+FF0D. -+ if (code_point === 0x2212) -+ code_point = 0xFF0D; -+ -+ // 9. Let pointer be the index pointer for code point in index -+ // jis0208. -+ var pointer = indexPointerFor(code_point, index('jis0208')); -+ -+ // 10. If pointer is null, return error with code point. -+ if (pointer === null) -+ return encoderError(code_point); -+ -+ // 11. If iso-2022-jp encoder state is not jis0208, prepend code -+ // point to stream, set iso-2022-jp encoder state to jis0208, -+ // and return three bytes 0x1B 0x24 0x42. -+ if (iso2022jp_state !== states.jis0208) { -+ stream.prepend(code_point); -+ iso2022jp_state = states.jis0208; -+ return [0x1B, 0x24, 0x42]; -+ } -+ -+ // 12. Let lead be floor(pointer / 94) + 0x21. -+ var lead = floor(pointer / 94) + 0x21; -+ -+ // 13. Let trail be pointer % 94 + 0x21. -+ var trail = pointer % 94 + 0x21; -+ -+ // 14. Return two bytes whose values are lead and trail. -+ return [lead, trail]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['ISO-2022-JP'] = function(options) { -+ return new ISO2022JPEncoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['ISO-2022-JP'] = function(options) { -+ return new ISO2022JPDecoder(options); -+ }; -+ -+ // 13.3 Shift_JIS -+ -+ // 13.3.1 Shift_JIS decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function ShiftJISDecoder(options) { -+ var fatal = options.fatal; -+ // Shift_JIS's decoder has an associated Shift_JIS lead (initially -+ // 0x00). -+ var /** @type {number} */ Shift_JIS_lead = 0x00; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00, -+ // set Shift_JIS lead to 0x00 and return error. -+ if (bite === end_of_stream && Shift_JIS_lead !== 0x00) { -+ Shift_JIS_lead = 0x00; -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream and Shift_JIS lead is 0x00, -+ // return finished. -+ if (bite === end_of_stream && Shift_JIS_lead === 0x00) -+ return finished; -+ -+ // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead, -+ // let pointer be null, set Shift_JIS lead to 0x00, and then run -+ // these substeps: -+ if (Shift_JIS_lead !== 0x00) { -+ var lead = Shift_JIS_lead; -+ var pointer = null; -+ Shift_JIS_lead = 0x00; -+ -+ // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41 -+ // otherwise. -+ var offset = (bite < 0x7F) ? 0x40 : 0x41; -+ -+ // 2. Let lead offset be 0x81, if lead is less than 0xA0, and -+ // 0xC1 otherwise. -+ var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1; -+ -+ // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 -+ // to 0xFC, inclusive, set pointer to (lead − lead offset) × -+ // 188 + byte − offset. -+ if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) -+ pointer = (lead - lead_offset) * 188 + bite - offset; -+ -+ // 4. If pointer is in the range 8836 to 10715, inclusive, -+ // return a code point whose value is 0xE000 − 8836 + pointer. -+ if (inRange(pointer, 8836, 10715)) -+ return 0xE000 - 8836 + pointer; -+ -+ // 5. Let code point be null, if pointer is null, and the -+ // index code point for pointer in index jis0208 otherwise. -+ var code_point = (pointer === null) ? null : -+ indexCodePointFor(pointer, index('jis0208')); -+ -+ // 6. If code point is null and byte is an ASCII byte, prepend -+ // byte to stream. -+ if (code_point === null && isASCIIByte(bite)) -+ stream.prepend(bite); -+ -+ // 7. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 8. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 4. If byte is an ASCII byte or 0x80, return a code point -+ // whose value is byte. -+ if (isASCIIByte(bite) || bite === 0x80) -+ return bite; -+ -+ // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a -+ // code point whose value is 0xFF61 − 0xA1 + byte. -+ if (inRange(bite, 0xA1, 0xDF)) -+ return 0xFF61 - 0xA1 + bite; -+ -+ // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0 -+ // to 0xFC, inclusive, set Shift_JIS lead to byte and return -+ // continue. -+ if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) { -+ Shift_JIS_lead = bite; -+ return null; -+ } -+ -+ // 7. Return error. -+ return decoderError(fatal); -+ }; -+ } -+ -+ // 13.3.2 Shift_JIS encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function ShiftJISEncoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point or U+0080, return a -+ // byte whose value is code point. -+ if (isASCIICodePoint(code_point) || code_point === 0x0080) -+ return code_point; -+ -+ // 3. If code point is U+00A5, return byte 0x5C. -+ if (code_point === 0x00A5) -+ return 0x5C; -+ -+ // 4. If code point is U+203E, return byte 0x7E. -+ if (code_point === 0x203E) -+ return 0x7E; -+ -+ // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, -+ // return a byte whose value is code point − 0xFF61 + 0xA1. -+ if (inRange(code_point, 0xFF61, 0xFF9F)) -+ return code_point - 0xFF61 + 0xA1; -+ -+ // 6. If code point is U+2212, set it to U+FF0D. -+ if (code_point === 0x2212) -+ code_point = 0xFF0D; -+ -+ // 7. Let pointer be the index Shift_JIS pointer for code point. -+ var pointer = indexShiftJISPointerFor(code_point); -+ -+ // 8. If pointer is null, return error with code point. -+ if (pointer === null) -+ return encoderError(code_point); -+ -+ // 9. Let lead be floor(pointer / 188). -+ var lead = floor(pointer / 188); -+ -+ // 10. Let lead offset be 0x81, if lead is less than 0x1F, and -+ // 0xC1 otherwise. -+ var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1; -+ -+ // 11. Let trail be pointer % 188. -+ var trail = pointer % 188; -+ -+ // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41 -+ // otherwise. -+ var offset = (trail < 0x3F) ? 0x40 : 0x41; -+ -+ // 13. Return two bytes whose values are lead + lead offset and -+ // trail + offset. -+ return [lead + lead_offset, trail + offset]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['Shift_JIS'] = function(options) { -+ return new ShiftJISEncoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['Shift_JIS'] = function(options) { -+ return new ShiftJISDecoder(options); -+ }; -+ -+ // -+ // 14. Legacy multi-byte Korean encodings -+ // -+ -+ // 14.1 euc-kr -+ -+ // 14.1.1 euc-kr decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function EUCKRDecoder(options) { -+ var fatal = options.fatal; -+ -+ // euc-kr's decoder has an associated euc-kr lead (initially 0x00). -+ var /** @type {number} */ euckr_lead = 0x00; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set -+ // euc-kr lead to 0x00 and return error. -+ if (bite === end_of_stream && euckr_lead !== 0) { -+ euckr_lead = 0x00; -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream and euc-kr lead is 0x00, return -+ // finished. -+ if (bite === end_of_stream && euckr_lead === 0) -+ return finished; -+ -+ // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let -+ // pointer be null, set euc-kr lead to 0x00, and then run these -+ // substeps: -+ if (euckr_lead !== 0x00) { -+ var lead = euckr_lead; -+ var pointer = null; -+ euckr_lead = 0x00; -+ -+ // 1. If byte is in the range 0x41 to 0xFE, inclusive, set -+ // pointer to (lead − 0x81) × 190 + (byte − 0x41). -+ if (inRange(bite, 0x41, 0xFE)) -+ pointer = (lead - 0x81) * 190 + (bite - 0x41); -+ -+ // 2. Let code point be null, if pointer is null, and the -+ // index code point for pointer in index euc-kr otherwise. -+ var code_point = (pointer === null) -+ ? null : indexCodePointFor(pointer, index('euc-kr')); -+ -+ // 3. If code point is null and byte is an ASCII byte, prepend -+ // byte to stream. -+ if (pointer === null && isASCIIByte(bite)) -+ stream.prepend(bite); -+ -+ // 4. If code point is null, return error. -+ if (code_point === null) -+ return decoderError(fatal); -+ -+ // 5. Return a code point whose value is code point. -+ return code_point; -+ } -+ -+ // 4. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 5. If byte is in the range 0x81 to 0xFE, inclusive, set -+ // euc-kr lead to byte and return continue. -+ if (inRange(bite, 0x81, 0xFE)) { -+ euckr_lead = bite; -+ return null; -+ } -+ -+ // 6. Return error. -+ return decoderError(fatal); -+ }; -+ } -+ -+ // 14.1.2 euc-kr encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function EUCKREncoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. Let pointer be the index pointer for code point in index -+ // euc-kr. -+ var pointer = indexPointerFor(code_point, index('euc-kr')); -+ -+ // 4. If pointer is null, return error with code point. -+ if (pointer === null) -+ return encoderError(code_point); -+ -+ // 5. Let lead be floor(pointer / 190) + 0x81. -+ var lead = floor(pointer / 190) + 0x81; -+ -+ // 6. Let trail be pointer % 190 + 0x41. -+ var trail = (pointer % 190) + 0x41; -+ -+ // 7. Return two bytes whose values are lead and trail. -+ return [lead, trail]; -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['EUC-KR'] = function(options) { -+ return new EUCKREncoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['EUC-KR'] = function(options) { -+ return new EUCKRDecoder(options); -+ }; -+ -+ -+ // -+ // 15. Legacy miscellaneous encodings -+ // -+ -+ // 15.1 replacement -+ -+ // Not needed - API throws RangeError -+ -+ // 15.2 Common infrastructure for utf-16be and utf-16le -+ -+ /** -+ * @param {number} code_unit -+ * @param {boolean} utf16be -+ * @return {!Array.} bytes -+ */ -+ function convertCodeUnitToBytes(code_unit, utf16be) { -+ // 1. Let byte1 be code unit >> 8. -+ var byte1 = code_unit >> 8; -+ -+ // 2. Let byte2 be code unit & 0x00FF. -+ var byte2 = code_unit & 0x00FF; -+ -+ // 3. Then return the bytes in order: -+ // utf-16be flag is set: byte1, then byte2. -+ if (utf16be) -+ return [byte1, byte2]; -+ // utf-16be flag is unset: byte2, then byte1. -+ return [byte2, byte1]; -+ } -+ -+ // 15.2.1 shared utf-16 decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {boolean} utf16_be True if big-endian, false if little-endian. -+ * @param {{fatal: boolean}} options -+ */ -+ function UTF16Decoder(utf16_be, options) { -+ var fatal = options.fatal; -+ var /** @type {?number} */ utf16_lead_byte = null, -+ /** @type {?number} */ utf16_lead_surrogate = null; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream and either utf-16 lead byte or -+ // utf-16 lead surrogate is not null, set utf-16 lead byte and -+ // utf-16 lead surrogate to null, and return error. -+ if (bite === end_of_stream && (utf16_lead_byte !== null || -+ utf16_lead_surrogate !== null)) { -+ return decoderError(fatal); -+ } -+ -+ // 2. If byte is end-of-stream and utf-16 lead byte and utf-16 -+ // lead surrogate are null, return finished. -+ if (bite === end_of_stream && utf16_lead_byte === null && -+ utf16_lead_surrogate === null) { -+ return finished; -+ } -+ -+ // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte -+ // and return continue. -+ if (utf16_lead_byte === null) { -+ utf16_lead_byte = bite; -+ return null; -+ } -+ -+ // 4. Let code unit be the result of: -+ var code_unit; -+ if (utf16_be) { -+ // utf-16be decoder flag is set -+ // (utf-16 lead byte << 8) + byte. -+ code_unit = (utf16_lead_byte << 8) + bite; -+ } else { -+ // utf-16be decoder flag is unset -+ // (byte << 8) + utf-16 lead byte. -+ code_unit = (bite << 8) + utf16_lead_byte; -+ } -+ // Then set utf-16 lead byte to null. -+ utf16_lead_byte = null; -+ -+ // 5. If utf-16 lead surrogate is not null, let lead surrogate -+ // be utf-16 lead surrogate, set utf-16 lead surrogate to null, -+ // and then run these substeps: -+ if (utf16_lead_surrogate !== null) { -+ var lead_surrogate = utf16_lead_surrogate; -+ utf16_lead_surrogate = null; -+ -+ // 1. If code unit is in the range U+DC00 to U+DFFF, -+ // inclusive, return a code point whose value is 0x10000 + -+ // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00). -+ if (inRange(code_unit, 0xDC00, 0xDFFF)) { -+ return 0x10000 + (lead_surrogate - 0xD800) * 0x400 + -+ (code_unit - 0xDC00); -+ } -+ -+ // 2. Prepend the sequence resulting of converting code unit -+ // to bytes using utf-16be decoder flag to stream and return -+ // error. -+ stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be)); -+ return decoderError(fatal); -+ } -+ -+ // 6. If code unit is in the range U+D800 to U+DBFF, inclusive, -+ // set utf-16 lead surrogate to code unit and return continue. -+ if (inRange(code_unit, 0xD800, 0xDBFF)) { -+ utf16_lead_surrogate = code_unit; -+ return null; -+ } -+ -+ // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive, -+ // return error. -+ if (inRange(code_unit, 0xDC00, 0xDFFF)) -+ return decoderError(fatal); -+ -+ // 8. Return code point code unit. -+ return code_unit; -+ }; -+ } -+ -+ // 15.2.2 shared utf-16 encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {boolean} utf16_be True if big-endian, false if little-endian. -+ * @param {{fatal: boolean}} options -+ */ -+ function UTF16Encoder(utf16_be, options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1. If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is in the range U+0000 to U+FFFF, inclusive, -+ // return the sequence resulting of converting code point to -+ // bytes using utf-16be encoder flag. -+ if (inRange(code_point, 0x0000, 0xFFFF)) -+ return convertCodeUnitToBytes(code_point, utf16_be); -+ -+ // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800, -+ // converted to bytes using utf-16be encoder flag. -+ var lead = convertCodeUnitToBytes( -+ ((code_point - 0x10000) >> 10) + 0xD800, utf16_be); -+ -+ // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00, -+ // converted to bytes using utf-16be encoder flag. -+ var trail = convertCodeUnitToBytes( -+ ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be); -+ -+ // 5. Return a byte sequence of lead followed by trail. -+ return lead.concat(trail); -+ }; -+ } -+ -+ // 15.3 utf-16be -+ // 15.3.1 utf-16be decoder -+ /** @param {{fatal: boolean}} options */ -+ encoders['UTF-16BE'] = function(options) { -+ return new UTF16Encoder(true, options); -+ }; -+ // 15.3.2 utf-16be encoder -+ /** @param {{fatal: boolean}} options */ -+ decoders['UTF-16BE'] = function(options) { -+ return new UTF16Decoder(true, options); -+ }; -+ -+ // 15.4 utf-16le -+ // 15.4.1 utf-16le decoder -+ /** @param {{fatal: boolean}} options */ -+ encoders['UTF-16LE'] = function(options) { -+ return new UTF16Encoder(false, options); -+ }; -+ // 15.4.2 utf-16le encoder -+ /** @param {{fatal: boolean}} options */ -+ decoders['UTF-16LE'] = function(options) { -+ return new UTF16Decoder(false, options); -+ }; -+ -+ // 15.5 x-user-defined -+ -+ // 15.5.1 x-user-defined decoder -+ /** -+ * @constructor -+ * @implements {Decoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function XUserDefinedDecoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream The stream of bytes being decoded. -+ * @param {number} bite The next byte read from the stream. -+ * @return {?(number|!Array.)} The next code point(s) -+ * decoded, or null if not enough data exists in the input -+ * stream to decode a complete code point. -+ */ -+ this.handler = function(stream, bite) { -+ // 1. If byte is end-of-stream, return finished. -+ if (bite === end_of_stream) -+ return finished; -+ -+ // 2. If byte is an ASCII byte, return a code point whose value -+ // is byte. -+ if (isASCIIByte(bite)) -+ return bite; -+ -+ // 3. Return a code point whose value is 0xF780 + byte − 0x80. -+ return 0xF780 + bite - 0x80; -+ }; -+ } -+ -+ // 15.5.2 x-user-defined encoder -+ /** -+ * @constructor -+ * @implements {Encoder} -+ * @param {{fatal: boolean}} options -+ */ -+ function XUserDefinedEncoder(options) { -+ var fatal = options.fatal; -+ /** -+ * @param {Stream} stream Input stream. -+ * @param {number} code_point Next code point read from the stream. -+ * @return {(number|!Array.)} Byte(s) to emit. -+ */ -+ this.handler = function(stream, code_point) { -+ // 1.If code point is end-of-stream, return finished. -+ if (code_point === end_of_stream) -+ return finished; -+ -+ // 2. If code point is an ASCII code point, return a byte whose -+ // value is code point. -+ if (isASCIICodePoint(code_point)) -+ return code_point; -+ -+ // 3. If code point is in the range U+F780 to U+F7FF, inclusive, -+ // return a byte whose value is code point − 0xF780 + 0x80. -+ if (inRange(code_point, 0xF780, 0xF7FF)) -+ return code_point - 0xF780 + 0x80; -+ -+ // 4. Return error with code point. -+ return encoderError(code_point); -+ }; -+ } -+ -+ /** @param {{fatal: boolean}} options */ -+ encoders['x-user-defined'] = function(options) { -+ return new XUserDefinedEncoder(options); -+ }; -+ /** @param {{fatal: boolean}} options */ -+ decoders['x-user-defined'] = function(options) { -+ return new XUserDefinedDecoder(options); -+ }; -+ -+ if (!global['TextEncoder']) -+ global['TextEncoder'] = TextEncoder; -+ if (!global['TextDecoder']) -+ global['TextDecoder'] = TextDecoder; -+ -+ if (typeof module !== "undefined" && module.exports) { -+ module.exports = { -+ TextEncoder: global['TextEncoder'], -+ TextDecoder: global['TextDecoder'], -+ EncodingIndexes: global["encoding-indexes"] -+ }; -+ } -+ -+// For strict environments where `this` inside the global scope -+// is `undefined`, take a pure object instead -+}(this || {})); -+}, -+"ECQUXDQyTxgBRBn83Ak3ad/kNiRM9F6XXVOQB0f00pg=": -+function (require, module, exports, __dirname, __filename) { -+var DuplexStream = require('readable-stream/duplex') -+ , util = require('util') -+ , Buffer = require('safe-buffer').Buffer -+ -+ -+function BufferList (callback) { -+ if (!(this instanceof BufferList)) -+ return new BufferList(callback) -+ -+ this._bufs = [] -+ this.length = 0 -+ -+ if (typeof callback == 'function') { -+ this._callback = callback -+ -+ var piper = function piper (err) { -+ if (this._callback) { -+ this._callback(err) -+ this._callback = null -+ } -+ }.bind(this) -+ -+ this.on('pipe', function onPipe (src) { -+ src.on('error', piper) -+ }) -+ this.on('unpipe', function onUnpipe (src) { -+ src.removeListener('error', piper) -+ }) -+ } else { -+ this.append(callback) -+ } -+ -+ DuplexStream.call(this) -+} -+ -+ -+util.inherits(BufferList, DuplexStream) -+ -+ -+BufferList.prototype._offset = function _offset (offset) { -+ var tot = 0, i = 0, _t -+ if (offset === 0) return [ 0, 0 ] -+ for (; i < this._bufs.length; i++) { -+ _t = tot + this._bufs[i].length -+ if (offset < _t || i == this._bufs.length - 1) -+ return [ i, offset - tot ] -+ tot = _t -+ } -+} -+ -+ -+BufferList.prototype.append = function append (buf) { -+ var i = 0 -+ -+ if (Buffer.isBuffer(buf)) { -+ this._appendBuffer(buf); -+ } else if (Array.isArray(buf)) { -+ for (; i < buf.length; i++) -+ this.append(buf[i]) -+ } else if (buf instanceof BufferList) { -+ // unwrap argument into individual BufferLists -+ for (; i < buf._bufs.length; i++) -+ this.append(buf._bufs[i]) -+ } else if (buf != null) { -+ // coerce number arguments to strings, since Buffer(number) does -+ // uninitialized memory allocation -+ if (typeof buf == 'number') -+ buf = buf.toString() -+ -+ this._appendBuffer(Buffer.from(buf)); -+ } -+ -+ return this -+} -+ -+ -+BufferList.prototype._appendBuffer = function appendBuffer (buf) { -+ this._bufs.push(buf) -+ this.length += buf.length -+} -+ -+ -+BufferList.prototype._write = function _write (buf, encoding, callback) { -+ this._appendBuffer(buf) -+ -+ if (typeof callback == 'function') -+ callback() -+} -+ -+ -+BufferList.prototype._read = function _read (size) { -+ if (!this.length) -+ return this.push(null) -+ -+ size = Math.min(size, this.length) -+ this.push(this.slice(0, size)) -+ this.consume(size) -+} -+ -+ -+BufferList.prototype.end = function end (chunk) { -+ DuplexStream.prototype.end.call(this, chunk) -+ -+ if (this._callback) { -+ this._callback(null, this.slice()) -+ this._callback = null -+ } -+} -+ -+ -+BufferList.prototype.get = function get (index) { -+ return this.slice(index, index + 1)[0] -+} -+ -+ -+BufferList.prototype.slice = function slice (start, end) { -+ if (typeof start == 'number' && start < 0) -+ start += this.length -+ if (typeof end == 'number' && end < 0) -+ end += this.length -+ return this.copy(null, 0, start, end) -+} -+ -+ -+BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { -+ if (typeof srcStart != 'number' || srcStart < 0) -+ srcStart = 0 -+ if (typeof srcEnd != 'number' || srcEnd > this.length) -+ srcEnd = this.length -+ if (srcStart >= this.length) -+ return dst || Buffer.alloc(0) -+ if (srcEnd <= 0) -+ return dst || Buffer.alloc(0) -+ -+ var copy = !!dst -+ , off = this._offset(srcStart) -+ , len = srcEnd - srcStart -+ , bytes = len -+ , bufoff = (copy && dstStart) || 0 -+ , start = off[1] -+ , l -+ , i -+ -+ // copy/slice everything -+ if (srcStart === 0 && srcEnd == this.length) { -+ if (!copy) { // slice, but full concat if multiple buffers -+ return this._bufs.length === 1 -+ ? this._bufs[0] -+ : Buffer.concat(this._bufs, this.length) -+ } -+ -+ // copy, need to copy individual buffers -+ for (i = 0; i < this._bufs.length; i++) { -+ this._bufs[i].copy(dst, bufoff) -+ bufoff += this._bufs[i].length -+ } -+ -+ return dst -+ } -+ -+ // easy, cheap case where it's a subset of one of the buffers -+ if (bytes <= this._bufs[off[0]].length - start) { -+ return copy -+ ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) -+ : this._bufs[off[0]].slice(start, start + bytes) -+ } -+ -+ if (!copy) // a slice, we need something to copy in to -+ dst = Buffer.allocUnsafe(len) -+ -+ for (i = off[0]; i < this._bufs.length; i++) { -+ l = this._bufs[i].length - start -+ -+ if (bytes > l) { -+ this._bufs[i].copy(dst, bufoff, start) -+ bufoff += l -+ } else { -+ this._bufs[i].copy(dst, bufoff, start, start + bytes) -+ bufoff += l -+ break -+ } -+ -+ bytes -= l -+ -+ if (start) -+ start = 0 -+ } -+ -+ // safeguard so that we don't return uninitialized memory -+ if (dst.length > bufoff) return dst.slice(0, bufoff) -+ -+ return dst -+} -+ -+BufferList.prototype.shallowSlice = function shallowSlice (start, end) { -+ start = start || 0 -+ end = end || this.length -+ -+ if (start < 0) -+ start += this.length -+ if (end < 0) -+ end += this.length -+ -+ var startOffset = this._offset(start) -+ , endOffset = this._offset(end) -+ , buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1) -+ -+ if (endOffset[1] == 0) -+ buffers.pop() -+ else -+ buffers[buffers.length-1] = buffers[buffers.length-1].slice(0, endOffset[1]) -+ -+ if (startOffset[1] != 0) -+ buffers[0] = buffers[0].slice(startOffset[1]) -+ -+ return new BufferList(buffers) -+} -+ -+BufferList.prototype.toString = function toString (encoding, start, end) { -+ return this.slice(start, end).toString(encoding) -+} -+ -+BufferList.prototype.consume = function consume (bytes) { -+ // first, normalize the argument, in accordance with how Buffer does it -+ bytes = Math.trunc(bytes) -+ // do nothing if not a positive number -+ if (Number.isNaN(bytes) || bytes <= 0) return this -+ -+ while (this._bufs.length) { -+ if (bytes >= this._bufs[0].length) { -+ bytes -= this._bufs[0].length -+ this.length -= this._bufs[0].length -+ this._bufs.shift() -+ } else { -+ this._bufs[0] = this._bufs[0].slice(bytes) -+ this.length -= bytes -+ break -+ } -+ } -+ return this -+} -+ -+ -+BufferList.prototype.duplicate = function duplicate () { -+ var i = 0 -+ , copy = new BufferList() -+ -+ for (; i < this._bufs.length; i++) -+ copy.append(this._bufs[i]) -+ -+ return copy -+} -+ -+ -+BufferList.prototype.destroy = function destroy () { -+ this._bufs.length = 0 -+ this.length = 0 -+ this.push(null) -+} -+ -+ -+;(function () { -+ var methods = { -+ 'readDoubleBE' : 8 -+ , 'readDoubleLE' : 8 -+ , 'readFloatBE' : 4 -+ , 'readFloatLE' : 4 -+ , 'readInt32BE' : 4 -+ , 'readInt32LE' : 4 -+ , 'readUInt32BE' : 4 -+ , 'readUInt32LE' : 4 -+ , 'readInt16BE' : 2 -+ , 'readInt16LE' : 2 -+ , 'readUInt16BE' : 2 -+ , 'readUInt16LE' : 2 -+ , 'readInt8' : 1 -+ , 'readUInt8' : 1 -+ } -+ -+ for (var m in methods) { -+ (function (m) { -+ BufferList.prototype[m] = function (offset) { -+ return this.slice(offset, offset + methods[m])[m](0) -+ } -+ }(m)) -+ } -+}()) -+ -+ -+module.exports = BufferList -+ -+}, -+"EGnWC+KsgR1w7dZqahpsBCTqUDb6eYGVlf0k21aYCkk=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+Object.defineProperty(exports, '__esModule', { -+ value: true -+}); -+exports['default'] = collect; -+ -+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -+ -+var _concatStream = require('concat-stream'); -+ -+var _concatStream2 = _interopRequireDefault(_concatStream); -+ -+var _once = require('once'); -+ -+var _once2 = _interopRequireDefault(_once); -+ -+function collect(stream, opts, fn) { -+ if (typeof opts === 'function') { -+ fn = opts; -+ opts = {}; -+ } -+ fn = (0, _once2['default'])(fn); -+ stream.on('error', fn); -+ stream.pipe((0, _concatStream2['default'])(opts, function (data) { -+ fn(null, data); -+ })); -+} -+ -+; -+module.exports = exports['default']; -+ -+ -+}, -+"EHx7x7baWhz1MjyG4uQbRxUba1yNguN8IjkoYXWXG1w=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// MODULES // -+ -+var isNumber = require( 'validate.io-number-primitive' ); -+ -+ -+// IS INTEGER // -+ -+/** -+* FUNCTION: isInteger( value ) -+* Validates if a value is a number primitive, excluding `NaN`, and an integer. -+* -+* @param {*} value - value to be validated -+* @returns {Boolean} boolean indicating if a value is a integer primitive -+*/ -+function isInteger( value ) { -+ return isNumber( value ) && value%1 === 0; -+} // end FUNCTION isInteger() -+ -+ -+// EXPORTS // -+ -+module.exports = isInteger; -+ -+}, -+"EPBuAvALHkwor9Ac1LHs8oDHXFnpf7hhGsAUvdYU0q0=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } -+ -+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } -+ -+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -+ -+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -+ -+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } -+ -+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -+ -+var _require = require('buffer'), -+ Buffer = _require.Buffer; -+ -+var _require2 = require('util'), -+ inspect = _require2.inspect; -+ -+var custom = inspect && inspect.custom || 'inspect'; -+ -+function copyBuffer(src, target, offset) { -+ Buffer.prototype.copy.call(src, target, offset); -+} -+ -+module.exports = -+/*#__PURE__*/ -+function () { -+ function BufferList() { -+ _classCallCheck(this, BufferList); -+ -+ this.head = null; -+ this.tail = null; -+ this.length = 0; -+ } -+ -+ _createClass(BufferList, [{ -+ key: "push", -+ value: function push(v) { -+ var entry = { -+ data: v, -+ next: null -+ }; -+ if (this.length > 0) this.tail.next = entry;else this.head = entry; -+ this.tail = entry; -+ ++this.length; -+ } -+ }, { -+ key: "unshift", -+ value: function unshift(v) { -+ var entry = { -+ data: v, -+ next: this.head -+ }; -+ if (this.length === 0) this.tail = entry; -+ this.head = entry; -+ ++this.length; -+ } -+ }, { -+ key: "shift", -+ value: function shift() { -+ if (this.length === 0) return; -+ var ret = this.head.data; -+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; -+ --this.length; -+ return ret; -+ } -+ }, { -+ key: "clear", -+ value: function clear() { -+ this.head = this.tail = null; -+ this.length = 0; -+ } -+ }, { -+ key: "join", -+ value: function join(s) { -+ if (this.length === 0) return ''; -+ var p = this.head; -+ var ret = '' + p.data; -+ -+ while (p = p.next) { -+ ret += s + p.data; -+ } -+ -+ return ret; -+ } -+ }, { -+ key: "concat", -+ value: function concat(n) { -+ if (this.length === 0) return Buffer.alloc(0); -+ var ret = Buffer.allocUnsafe(n >>> 0); -+ var p = this.head; -+ var i = 0; -+ -+ while (p) { -+ copyBuffer(p.data, ret, i); -+ i += p.data.length; -+ p = p.next; -+ } -+ -+ return ret; -+ } // Consumes a specified amount of bytes or characters from the buffered data. -+ -+ }, { -+ key: "consume", -+ value: function consume(n, hasStrings) { -+ var ret; -+ -+ if (n < this.head.data.length) { -+ // `slice` is the same for buffers and strings. -+ ret = this.head.data.slice(0, n); -+ this.head.data = this.head.data.slice(n); -+ } else if (n === this.head.data.length) { -+ // First chunk is a perfect match. -+ ret = this.shift(); -+ } else { -+ // Result spans more than one buffer. -+ ret = hasStrings ? this._getString(n) : this._getBuffer(n); -+ } -+ -+ return ret; -+ } -+ }, { -+ key: "first", -+ value: function first() { -+ return this.head.data; -+ } // Consumes a specified amount of characters from the buffered data. -+ -+ }, { -+ key: "_getString", -+ value: function _getString(n) { -+ var p = this.head; -+ var c = 1; -+ var ret = p.data; -+ n -= ret.length; -+ -+ while (p = p.next) { -+ var str = p.data; -+ var nb = n > str.length ? str.length : n; -+ if (nb === str.length) ret += str;else ret += str.slice(0, n); -+ n -= nb; -+ -+ if (n === 0) { -+ if (nb === str.length) { -+ ++c; -+ if (p.next) this.head = p.next;else this.head = this.tail = null; -+ } else { -+ this.head = p; -+ p.data = str.slice(nb); -+ } -+ -+ break; -+ } -+ -+ ++c; -+ } -+ -+ this.length -= c; -+ return ret; -+ } // Consumes a specified amount of bytes from the buffered data. -+ -+ }, { -+ key: "_getBuffer", -+ value: function _getBuffer(n) { -+ var ret = Buffer.allocUnsafe(n); -+ var p = this.head; -+ var c = 1; -+ p.data.copy(ret); -+ n -= p.data.length; -+ -+ while (p = p.next) { -+ var buf = p.data; -+ var nb = n > buf.length ? buf.length : n; -+ buf.copy(ret, ret.length - n, 0, nb); -+ n -= nb; -+ -+ if (n === 0) { -+ if (nb === buf.length) { -+ ++c; -+ if (p.next) this.head = p.next;else this.head = this.tail = null; -+ } else { -+ this.head = p; -+ p.data = buf.slice(nb); -+ } -+ -+ break; -+ } -+ -+ ++c; -+ } -+ -+ this.length -= c; -+ return ret; -+ } // Make sure the linked list only shows the minimal necessary information. -+ -+ }, { -+ key: custom, -+ value: function value(_, options) { -+ return inspect(this, _objectSpread({}, options, { -+ // Only inspect one level. -+ depth: 0, -+ // It should not recurse. -+ customInspect: false -+ })); -+ } -+ }]); -+ -+ return BufferList; -+}(); -+}, -+"EQUOWX7Pu1S73njemTStK3KnASkdpJLaqk1t4SZNbwk=": -+function (require, module, exports, __dirname, __filename) { -+// a duplex stream is just a stream that is both readable and writable. -+// Since JS doesn't have multiple prototypal inheritance, this class -+// prototypally inherits from Readable, and then parasitically from -+// Writable. -+ -+'use strict'; -+ -+/**/ -+ -+var objectKeys = Object.keys || function (obj) { -+ var keys = []; -+ for (var key in obj) { -+ keys.push(key); -+ }return keys; -+}; -+/**/ -+ -+module.exports = Duplex; -+ -+/**/ -+var processNextTick = require('process-nextick-args'); -+/**/ -+ -+/**/ -+var util = require('core-util-is'); -+util.inherits = require('inherits'); -+/**/ -+ -+var Readable = require('./_stream_readable'); -+var Writable = require('./_stream_writable'); -+ -+util.inherits(Duplex, Readable); -+ -+var keys = objectKeys(Writable.prototype); -+for (var v = 0; v < keys.length; v++) { -+ var method = keys[v]; -+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -+} -+ -+function Duplex(options) { -+ if (!(this instanceof Duplex)) return new Duplex(options); -+ -+ Readable.call(this, options); -+ Writable.call(this, options); -+ -+ if (options && options.readable === false) this.readable = false; -+ -+ if (options && options.writable === false) this.writable = false; -+ -+ this.allowHalfOpen = true; -+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; -+ -+ this.once('end', onend); -+} -+ -+// the no-half-open enforcer -+function onend() { -+ // if we allow half-open state, or if the writable side ended, -+ // then we're ok. -+ if (this.allowHalfOpen || this._writableState.ended) return; -+ -+ // no more data can be written. -+ // But allow more writes to happen in this tick. -+ processNextTick(onEndNT, this); -+} -+ -+function onEndNT(self) { -+ self.end(); -+} -+ -+function forEach(xs, f) { -+ for (var i = 0, l = xs.length; i < l; i++) { -+ f(xs[i], i); -+ } -+} -+}, -+"ESNvNrdTGpqOoBzwLPu/elsO6uVhRhakJgegJMPy4L4=": -+function (require, module, exports, __dirname, __filename) { -+var ext = require('./extent'), -+ types = require('./types'); -+ -+module.exports.write = function writePoints(geometries, extent, shpView, shxView, TYPE) { -+ -+ var shpI = 0, -+ shxI = 0, -+ shxOffset = 100; -+ -+ geometries.forEach(writePolyLine); -+ -+ function writePolyLine(coordinates, i) { -+ -+ var flattened = justCoords(coordinates), -+ noParts = parts([coordinates], TYPE), -+ contentLength = (flattened.length * 16) + 48 + (noParts - 1) * 4; -+ -+ var featureExtent = flattened.reduce(function(extent, c) { -+ return ext.enlarge(extent, c); -+ }, ext.blank()); -+ -+ // INDEX -+ shxView.setInt32(shxI, shxOffset / 2); // offset -+ shxView.setInt32(shxI + 4, contentLength / 2); // offset length -+ -+ shxI += 8; -+ shxOffset += contentLength + 8; -+ -+ shpView.setInt32(shpI, i + 1); // record number -+ shpView.setInt32(shpI + 4, contentLength / 2); // length -+ shpView.setInt32(shpI + 8, TYPE, true); // POLYLINE=3 -+ shpView.setFloat64(shpI + 12, featureExtent.xmin, true); // EXTENT -+ shpView.setFloat64(shpI + 20, featureExtent.ymin, true); -+ shpView.setFloat64(shpI + 28, featureExtent.xmax, true); -+ shpView.setFloat64(shpI + 36, featureExtent.ymax, true); -+ shpView.setInt32(shpI + 44, noParts, true); -+ shpView.setInt32(shpI + 48, flattened.length, true); // POINTS -+ shpView.setInt32(shpI + 52, 0, true); // The first part - index zero -+ -+ var onlyParts = coordinates.reduce(function (arr, coords) { -+ if (Array.isArray(coords[0][0])) { -+ arr = arr.concat(coords); -+ } else { -+ arr.push(coords); -+ } -+ return arr; -+ }, []); -+ for (var p = 1; p < noParts; p++) { -+ shpView.setInt32( // set part index -+ shpI + 52 + (p * 4), -+ onlyParts.reduce(function (a, b, idx) { -+ return idx < p ? a + b.length : a; -+ }, 0), -+ true -+ ); -+ } -+ -+ flattened.forEach(function writeLine(coords, i) { -+ shpView.setFloat64(shpI + 56 + (i * 16) + (noParts - 1) * 4, coords[0], true); // X -+ shpView.setFloat64(shpI + 56 + (i * 16) + (noParts - 1) * 4 + 8, coords[1], true); // Y -+ }); -+ -+ shpI += contentLength + 8; -+ } -+}; -+ -+module.exports.shpLength = function(geometries) { -+ return (geometries.length * 56) + -+ // points -+ (justCoords(geometries).length * 16); -+}; -+ -+module.exports.shxLength = function(geometries) { -+ return geometries.length * 8; -+}; -+ -+module.exports.extent = function(coordinates) { -+ return justCoords(coordinates).reduce(function(extent, c) { -+ return ext.enlarge(extent, c); -+ }, ext.blank()); -+}; -+ -+function parts(geometries, TYPE) { -+ var no = 1; -+ if (TYPE === types.geometries.POLYGON || TYPE === types.geometries.POLYLINE) { -+ no = geometries.reduce(function (no, coords) { -+ no += coords.length; -+ if (Array.isArray(coords[0][0][0])) { // multi -+ no += coords.reduce(function (no, rings) { -+ return no + rings.length - 1; // minus outer -+ }, 0); -+ } -+ return no; -+ }, 0); -+ } -+ return no; -+} -+ -+module.exports.parts = parts; -+ -+function totalPoints(geometries) { -+ var sum = 0; -+ geometries.forEach(function(g) { sum += g.length; }); -+ return sum; -+} -+ -+function justCoords(coords, l) { -+ if (l === undefined) l = []; -+ if (typeof coords[0][0] == 'object') { -+ return coords.reduce(function(memo, c) { -+ return memo.concat(justCoords(c)); -+ }, l); -+ } else { -+ return coords; -+ } -+} -+ -+ -+}, -+"EU7/pseXD1RxsBcrhbk1pLQRO+h3uuPD82Y/0pj65a8=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs') -+var path = require('path') -+var os = require('os') -+ -+// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' -+var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line -+ -+var vars = (process.config && process.config.variables) || {} -+var prebuildsOnly = !!process.env.PREBUILDS_ONLY -+var abi = process.versions.modules // TODO: support old node where this is undef -+var runtime = isElectron() ? 'electron' : 'node' -+var arch = os.arch() -+var platform = os.platform() -+var libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc') -+var armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || '' -+var uv = (process.versions.uv || '').split('.')[0] -+ -+module.exports = load -+ -+function load (dir) { -+ return runtimeRequire(load.path(dir)) -+} -+ -+load.path = function (dir) { -+ dir = path.resolve(dir || '.') -+ -+ try { -+ var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_') -+ if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD'] -+ } catch (err) {} -+ -+ if (!prebuildsOnly) { -+ var release = getFirst(path.join(dir, 'build/Release'), matchBuild) -+ if (release) return release -+ -+ var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild) -+ if (debug) return debug -+ } -+ -+ var prebuild = resolve(dir) -+ if (prebuild) return prebuild -+ -+ var nearby = resolve(path.dirname(process.execPath)) -+ if (nearby) return nearby -+ -+ var target = [ -+ 'platform=' + platform, -+ 'arch=' + arch, -+ 'runtime=' + runtime, -+ 'abi=' + abi, -+ 'uv=' + uv, -+ armv ? 'armv=' + armv : '', -+ 'libc=' + libc, -+ 'node=' + process.versions.node, -+ (process.versions && process.versions.electron) ? 'electron=' + process.versions.electron : '', -+ typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line -+ ].filter(Boolean).join(' ') -+ -+ throw new Error('No native build was found for ' + target + '\n loaded from: ' + dir + '\n') -+ -+ function resolve (dir) { -+ // Find most specific flavor first -+ var prebuilds = path.join(dir, 'prebuilds', platform + '-' + arch) -+ var parsed = readdirSync(prebuilds).map(parseTags) -+ var candidates = parsed.filter(matchTags(runtime, abi)) -+ var winner = candidates.sort(compareTags(runtime))[0] -+ if (winner) return path.join(prebuilds, winner.file) -+ } -+} -+ -+function readdirSync (dir) { -+ try { -+ return fs.readdirSync(dir) -+ } catch (err) { -+ return [] -+ } -+} -+ -+function getFirst (dir, filter) { -+ var files = readdirSync(dir).filter(filter) -+ return files[0] && path.join(dir, files[0]) -+} -+ -+function matchBuild (name) { -+ return /\.node$/.test(name) -+} -+ -+function parseTags (file) { -+ var arr = file.split('.') -+ var extension = arr.pop() -+ var tags = { file: file, specificity: 0 } -+ -+ if (extension !== 'node') return -+ -+ for (var i = 0; i < arr.length; i++) { -+ var tag = arr[i] -+ -+ if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') { -+ tags.runtime = tag -+ } else if (tag === 'napi') { -+ tags.napi = true -+ } else if (tag.slice(0, 3) === 'abi') { -+ tags.abi = tag.slice(3) -+ } else if (tag.slice(0, 2) === 'uv') { -+ tags.uv = tag.slice(2) -+ } else if (tag.slice(0, 4) === 'armv') { -+ tags.armv = tag.slice(4) -+ } else if (tag === 'glibc' || tag === 'musl') { -+ tags.libc = tag -+ } else { -+ continue -+ } -+ -+ tags.specificity++ -+ } -+ -+ return tags -+} -+ -+function matchTags (runtime, abi) { -+ return function (tags) { -+ if (tags == null) return false -+ if (tags.runtime !== runtime && !runtimeAgnostic(tags)) return false -+ if (tags.abi !== abi && !tags.napi) return false -+ if (tags.uv && tags.uv !== uv) return false -+ if (tags.armv && tags.armv !== armv) return false -+ if (tags.libc && tags.libc !== libc) return false -+ -+ return true -+ } -+} -+ -+function runtimeAgnostic (tags) { -+ return tags.runtime === 'node' && tags.napi -+} -+ -+function compareTags (runtime) { -+ // Precedence: non-agnostic runtime, abi over napi, then by specificity. -+ return function (a, b) { -+ if (a.runtime !== b.runtime) { -+ return a.runtime === runtime ? -1 : 1 -+ } else if (a.abi !== b.abi) { -+ return a.abi ? -1 : 1 -+ } else if (a.specificity !== b.specificity) { -+ return a.specificity > b.specificity ? -1 : 1 -+ } else { -+ return 0 -+ } -+ } -+} -+ -+function isElectron () { -+ if (process.versions && process.versions.electron) return true -+ if (process.env.ELECTRON_RUN_AS_NODE) return true -+ return typeof window !== 'undefined' && window.process && window.process.type === 'renderer' -+} -+ -+function isAlpine (platform) { -+ return platform === 'linux' && fs.existsSync('/etc/alpine-release') -+} -+ -+// Exposed for unit tests -+// TODO: move to lib -+load.parseTags = parseTags -+load.matchTags = matchTags -+load.compareTags = compareTags -+ -+}, -+"EUH7zvLqGosHERWgLex5kpTbHk9kTkuhtXV2/XwWKuw=": -+function (require, module, exports, __dirname, __filename) { -+var inherits = require('util').inherits -+var RandomAccess = require('random-access-storage') -+var fs = require('fs') -+var mkdirp = require('mkdirp-classic') -+var path = require('path') -+var constants = fs.constants || require('constants') -+ -+var READONLY = constants.O_RDONLY -+var READWRITE = constants.O_RDWR | constants.O_CREAT -+ -+module.exports = RandomAccessFile -+ -+function RandomAccessFile (filename, opts) { -+ if (!(this instanceof RandomAccessFile)) return new RandomAccessFile(filename, opts) -+ RandomAccess.call(this) -+ -+ if (!opts) opts = {} -+ if (opts.directory) filename = path.join(opts.directory, path.resolve('/', filename).replace(/^\w+:\\/, '')) -+ -+ this.directory = opts.directory || null -+ this.filename = filename -+ this.fd = 0 -+ -+ // makes random-access-storage open in writable mode first -+ if (opts.writable || opts.truncate) this.preferReadonly = false -+ -+ this._size = opts.size || opts.length || 0 -+ this._truncate = !!opts.truncate || this._size > 0 -+ this._rmdir = !!opts.rmdir -+ this._lock = opts.lock || noLock -+ this._alloc = opts.alloc || Buffer.allocUnsafe -+} -+ -+inherits(RandomAccessFile, RandomAccess) -+ -+RandomAccessFile.prototype._open = function (req) { -+ var self = this -+ -+ mkdirp(path.dirname(this.filename), ondir) -+ -+ function ondir (err) { -+ if (err) return req.callback(err) -+ open(self, READWRITE, req) -+ } -+} -+ -+RandomAccessFile.prototype._openReadonly = function (req) { -+ open(this, READONLY, req) -+} -+ -+RandomAccessFile.prototype._write = function (req) { -+ var data = req.data -+ var fd = this.fd -+ -+ fs.write(fd, data, 0, req.size, req.offset, onwrite) -+ -+ function onwrite (err, wrote) { -+ if (err) return req.callback(err) -+ -+ req.size -= wrote -+ req.offset += wrote -+ -+ if (!req.size) return req.callback(null) -+ fs.write(fd, data, data.length - req.size, req.size, req.offset, onwrite) -+ } -+} -+ -+RandomAccessFile.prototype._read = function (req) { -+ var data = req.data || this._alloc(req.size) -+ var fd = this.fd -+ -+ if (!req.size) return process.nextTick(readEmpty, req) -+ fs.read(fd, data, 0, req.size, req.offset, onread) -+ -+ function onread (err, read) { -+ if (err) return req.callback(err) -+ if (!read) return req.callback(new Error('Could not satisfy length')) -+ -+ req.size -= read -+ req.offset += read -+ -+ if (!req.size) return req.callback(null, data) -+ fs.read(fd, data, data.length - req.size, req.size, req.offset, onread) -+ } -+} -+ -+RandomAccessFile.prototype._del = function (req) { -+ var fd = this.fd -+ -+ fs.fstat(fd, onstat) -+ -+ function onstat (err, st) { -+ if (err) return req.callback(err) -+ if (req.offset + req.size < st.size) return req.callback(null) -+ fs.ftruncate(fd, req.offset, ontruncate) -+ } -+ -+ function ontruncate (err) { -+ req.callback(err) -+ } -+} -+ -+RandomAccessFile.prototype._stat = function (req) { -+ fs.fstat(this.fd, onstat) -+ -+ function onstat (err, st) { -+ req.callback(err, st) -+ } -+} -+ -+RandomAccessFile.prototype._close = function (req) { -+ var self = this -+ -+ fs.close(this.fd, onclose) -+ -+ function onclose (err) { -+ if (err) return req.callback(err) -+ self.fd = 0 -+ req.callback(null) -+ } -+} -+ -+RandomAccessFile.prototype._destroy = function (req) { -+ var self = this -+ -+ var root = this.directory && path.resolve(path.join(this.directory, '.')) -+ var dir = path.resolve(path.dirname(this.filename)) -+ -+ fs.unlink(this.filename, onunlink) -+ -+ function onunlink (err) { -+ if (!self._rmdir || !root || dir === root) return req.callback(err) -+ fs.rmdir(dir, onrmdir) -+ } -+ -+ function onrmdir (err) { -+ dir = path.join(dir, '..') -+ if (err || dir === root) return req.callback(null) -+ fs.rmdir(dir, onrmdir) -+ } -+} -+ -+function open (self, mode, req) { -+ if (self.fd) fs.close(self.fd, oncloseold) -+ else fs.open(self.filename, mode, onopen) -+ -+ function onopen (err, fd) { -+ if (err) return req.callback(err) -+ self.fd = fd -+ if (!self._lock(self.fd)) return req.callback(createLockError(self.filename)) // TODO: fix fd leak here -+ if (!self._truncate || mode === READONLY) return req.callback(null) -+ fs.ftruncate(self.fd, self._size, ontruncate) -+ } -+ -+ function oncloseold (err) { -+ if (err) return onerrorafteropen(err) -+ self.fd = 0 -+ fs.open(self.filename, mode, onopen) -+ } -+ -+ function ontruncate (err) { -+ if (err) return onerrorafteropen(err) -+ req.callback(null) -+ } -+ -+ function onerrorafteropen (err) { -+ fs.close(self.fd, function () { -+ self.fd = 0 -+ req.callback(err) -+ }) -+ } -+} -+ -+function readEmpty (req) { -+ req.callback(null, Buffer.alloc(0)) -+} -+ -+function noLock (fd) { -+ return true -+} -+ -+function createLockError (path) { -+ var err = new Error('ELOCKED: File is locked') -+ err.code = 'ELOCKED' -+ err.path = path -+ return err -+} -+ -+}, -+"EUYJhlcre0axAN4gBRKHQImjK6UnCbnRJvNSKC7yHos=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * repeat-element -+ * -+ * Copyright (c) 2015-present, Jon Schlinkert. -+ * Licensed under the MIT license. -+ */ -+ -+'use strict'; -+ -+module.exports = function repeat(ele, num) { -+ var arr = new Array(num); -+ -+ for (var i = 0; i < num; i++) { -+ arr[i] = ele; -+ } -+ -+ return arr; -+}; -+ -+}, -+"Eb9bSv/IEU5efN9luTAGwtmXq2CtoRUsIuE2+bgouBU=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+class ValidationError extends Error { -+ constructor(errors) { -+ super("validation failed"); -+ this.errors = errors; -+ this.ajv = this.validation = true; -+ } -+} -+exports.default = ValidationError; -+//# sourceMappingURL=validation_error.js.map -+}, -+"EdphBXnCKJqgteWf13KsizDSTXSKAJKiB1PbbXA7ueA=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(NEXT_FILTER) { -+var util = require("./util"); -+var getKeys = require("./es5").keys; -+var tryCatch = util.tryCatch; -+var errorObj = util.errorObj; -+ -+function catchFilter(instances, cb, promise) { -+ return function(e) { -+ var boundTo = promise._boundValue(); -+ predicateLoop: for (var i = 0; i < instances.length; ++i) { -+ var item = instances[i]; -+ -+ if (item === Error || -+ (item != null && item.prototype instanceof Error)) { -+ if (e instanceof item) { -+ return tryCatch(cb).call(boundTo, e); -+ } -+ } else if (typeof item === "function") { -+ var matchesPredicate = tryCatch(item).call(boundTo, e); -+ if (matchesPredicate === errorObj) { -+ return matchesPredicate; -+ } else if (matchesPredicate) { -+ return tryCatch(cb).call(boundTo, e); -+ } -+ } else if (util.isObject(e)) { -+ var keys = getKeys(item); -+ for (var j = 0; j < keys.length; ++j) { -+ var key = keys[j]; -+ if (item[key] != e[key]) { -+ continue predicateLoop; -+ } -+ } -+ return tryCatch(cb).call(boundTo, e); -+ } -+ } -+ return NEXT_FILTER; -+ }; -+} -+ -+return catchFilter; -+}; -+ -+}, -+"EgXGufdeMZr4ZeIWQFt9k/8/COAIrh2Khp4pHtpeBPM=": -+function (require, module, exports, __dirname, __filename) { -+ -+module.exports = loadWebAssembly -+ -+loadWebAssembly.supported = typeof WebAssembly !== 'undefined' -+ -+function loadWebAssembly (opts) { -+ if (!loadWebAssembly.supported) return null -+ -+ var imp = opts && opts.imports -+ var wasm = toUint8Array('AGFzbQEAAAABGgNgBn9/f39/fwBgBn9/f39+fwF+YAN/f38AAwcGAAEBAgICBQUBAQroBwcoAwZtZW1vcnkCAAx4c2Fsc2EyMF94b3IAAAxjb3JlX3NhbHNhMjAABArqEQYYACAAIAEgAiADIAQgACkDACAFEAE3AwALPQBB8AAgAyAFEAMgACABIAIgA0EQaiAEQfAAEAJB8ABCADcDAEH4AEIANwMAQYABQgA3AwBBiAFCADcDAAuHBQEBfyACQQBGBEBCAA8LQdAAIAUpAwA3AwBB2AAgBUEIaikDADcDAEHgACAFQRBqKQMANwMAQegAIAVBGGopAwA3AwBBACADKQMANwMAQQggBDcDAAJAA0AgAkHAAEkNAUEQQQBB0AAQBSAAIAEpAwBBECkDAIU3AwAgAEEIaiABQQhqKQMAQRgpAwCFNwMAIABBEGogAUEQaikDAEEgKQMAhTcDACAAQRhqIAFBGGopAwBBKCkDAIU3AwAgAEEgaiABQSBqKQMAQTApAwCFNwMAIABBKGogAUEoaikDAEE4KQMAhTcDACAAQTBqIAFBMGopAwBBwAApAwCFNwMAIABBOGogAUE4aikDAEHIACkDAIU3AwBBCEEIKQMAQgF8NwMAIABBwABqIQAgAUHAAGohASACQcAAayECDAALC0EIKQMAIQQgAkEASwRAQRBBAEHQABAFAkACQAJAAkACQAJAAkACQCACQQhuDgcHBgUEAwIBAAsgAEE4aiABQThqKQMAQcgAKQMAhTcDAAsgAEEwaiABQTBqKQMAQcAAKQMAhTcDAAsgAEEoaiABQShqKQMAQTgpAwCFNwMACyAAQSBqIAFBIGopAwBBMCkDAIU3AwALIABBGGogAUEYaikDAEEoKQMAhTcDAAsgAEEQaiABQRBqKQMAQSApAwCFNwMACyAAQQhqIAFBCGopAwBBGCkDAIU3AwALIAAgASkDAEEQKQMAhTcDAAtBEEIANwMAQRhCADcDAEEgQgA3AwBBKEIANwMAQTBCADcDAEE4QgA3AwBBwABCADcDAEHIAEIANwMAQdAAQgA3AwBB2ABCADcDAEHgAEIANwMAQegAQgA3AwAgBA8LnQUBEX9B5fDBiwYhA0HuyIGZAyEIQbLaiMsHIQ1B9MqB2QYhEiACKAIAIQQgAkEEaigCACEFIAJBCGooAgAhBiACQQxqKAIAIQcgAkEQaigCACEOIAJBFGooAgAhDyACQRhqKAIAIRAgAkEcaigCACERIAEoAgAhCSABQQRqKAIAIQogAUEIaigCACELIAFBDGooAgAhDEEUIRMCQANAIBNBAEYNASAHIAMgD2pBB3dzIQcgCyAHIANqQQl3cyELIA8gCyAHakENd3MhDyADIA8gC2pBEndzIQMgDCAIIARqQQd3cyEMIBAgDCAIakEJd3MhECAEIBAgDGpBDXdzIQQgCCAEIBBqQRJ3cyEIIBEgDSAJakEHd3MhESAFIBEgDWpBCXdzIQUgCSAFIBFqQQ13cyEJIA0gCSAFakESd3MhDSAGIBIgDmpBB3dzIQYgCiAGIBJqQQl3cyEKIA4gCiAGakENd3MhDiASIA4gCmpBEndzIRIgBCADIAZqQQd3cyEEIAUgBCADakEJd3MhBSAGIAUgBGpBDXdzIQYgAyAGIAVqQRJ3cyEDIAkgCCAHakEHd3MhCSAKIAkgCGpBCXdzIQogByAKIAlqQQ13cyEHIAggByAKakESd3MhCCAOIA0gDGpBB3dzIQ4gCyAOIA1qQQl3cyELIAwgCyAOakENd3MhDCANIAwgC2pBEndzIQ0gDyASIBFqQQd3cyEPIBAgDyASakEJd3MhECARIBAgD2pBDXdzIREgEiARIBBqQRJ3cyESIBNBAmshEwwACwsgACADNgIAIABBBGogCDYCACAAQQhqIA02AgAgAEEMaiASNgIAIABBEGogCTYCACAAQRRqIAo2AgAgAEEYaiALNgIAIABBHGogDDYCAAsKACAAIAEgAhAFC90GASF/QeXwwYsGIQNB7siBmQMhCEGy2ojLByENQfTKgdkGIRIgAigCACEEIAJBBGooAgAhBSACQQhqKAIAIQYgAkEMaigCACEHIAJBEGooAgAhDiACQRRqKAIAIQ8gAkEYaigCACEQIAJBHGooAgAhESABKAIAIQkgAUEEaigCACEKIAFBCGooAgAhCyABQQxqKAIAIQwgAyETIAQhFCAFIRUgBiEWIAchFyAIIRggCSEZIAohGiALIRsgDCEcIA0hHSAOIR4gDyEfIBAhICARISEgEiEiQRQhIwJAA0AgI0EARg0BIAcgAyAPakEHd3MhByALIAcgA2pBCXdzIQsgDyALIAdqQQ13cyEPIAMgDyALakESd3MhAyAMIAggBGpBB3dzIQwgECAMIAhqQQl3cyEQIAQgECAMakENd3MhBCAIIAQgEGpBEndzIQggESANIAlqQQd3cyERIAUgESANakEJd3MhBSAJIAUgEWpBDXdzIQkgDSAJIAVqQRJ3cyENIAYgEiAOakEHd3MhBiAKIAYgEmpBCXdzIQogDiAKIAZqQQ13cyEOIBIgDiAKakESd3MhEiAEIAMgBmpBB3dzIQQgBSAEIANqQQl3cyEFIAYgBSAEakENd3MhBiADIAYgBWpBEndzIQMgCSAIIAdqQQd3cyEJIAogCSAIakEJd3MhCiAHIAogCWpBDXdzIQcgCCAHIApqQRJ3cyEIIA4gDSAMakEHd3MhDiALIA4gDWpBCXdzIQsgDCALIA5qQQ13cyEMIA0gDCALakESd3MhDSAPIBIgEWpBB3dzIQ8gECAPIBJqQQl3cyEQIBEgECAPakENd3MhESASIBEgEGpBEndzIRIgI0ECayEjDAALCyAAIAMgE2o2AgAgAEEEaiAEIBRqNgIAIABBCGogBSAVajYCACAAQQxqIAYgFmo2AgAgAEEQaiAHIBdqNgIAIABBFGogCCAYajYCACAAQRhqIAkgGWo2AgAgAEEcaiAKIBpqNgIAIABBIGogCyAbajYCACAAQSRqIAwgHGo2AgAgAEEoaiANIB1qNgIAIABBLGogDiAeajYCACAAQTBqIA8gH2o2AgAgAEE0aiAQICBqNgIAIABBOGogESAhajYCACAAQTxqIBIgImo2AgAL') -+ var ready = null -+ -+ var mod = { -+ buffer: wasm, -+ memory: null, -+ exports: null, -+ realloc: realloc, -+ onload: onload -+ } -+ -+ onload(function () {}) -+ -+ return mod -+ -+ function realloc (size) { -+ mod.exports.memory.grow(Math.ceil(Math.abs(size - mod.memory.length) / 65536)) -+ mod.memory = new Uint8Array(mod.exports.memory.buffer) -+ } -+ -+ function onload (cb) { -+ if (mod.exports) return cb() -+ -+ if (ready) { -+ ready.then(cb.bind(null, null)).catch(cb) -+ return -+ } -+ -+ try { -+ if (opts && opts.async) throw new Error('async') -+ setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) -+ } catch (err) { -+ ready = WebAssembly.instantiate(wasm, imp).then(setup) -+ } -+ -+ onload(cb) -+ } -+ -+ function setup (w) { -+ mod.exports = w.instance.exports -+ mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) -+ } -+} -+ -+function toUint8Array (s) { -+ if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) -+ return new (require('buf' + 'fer').Buffer)(s, 'base64') -+} -+ -+function charCodeAt (c) { -+ return c.charCodeAt(0) -+} -+ -+}, -+"EhhG8bQBo14QThW+vmpjL7jg/CcvfN2TP9H++XZSOOw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const net = require('net'); -+ -+class Locked extends Error { -+ constructor(port) { -+ super(`${port} is locked`); -+ } -+} -+ -+const lockedPorts = { -+ old: new Set(), -+ young: new Set() -+}; -+ -+// On this interval, the old locked ports are discarded, -+// the young locked ports are moved to old locked ports, -+// and a new young set for locked ports are created. -+const releaseOldLockedPortsIntervalMs = 1000 * 15; -+ -+// Lazily create interval on first use -+let interval; -+ -+const getAvailablePort = options => new Promise((resolve, reject) => { -+ const server = net.createServer(); -+ server.unref(); -+ server.on('error', reject); -+ server.listen(options, () => { -+ const {port} = server.address(); -+ server.close(() => { -+ resolve(port); -+ }); -+ }); -+}); -+ -+const portCheckSequence = function * (ports) { -+ if (ports) { -+ yield * ports; -+ } -+ -+ yield 0; // Fall back to 0 if anything else failed -+}; -+ -+module.exports = async options => { -+ let ports; -+ -+ if (options) { -+ ports = typeof options.port === 'number' ? [options.port] : options.port; -+ } -+ -+ if (interval === undefined) { -+ interval = setInterval(() => { -+ lockedPorts.old = lockedPorts.young; -+ lockedPorts.young = new Set(); -+ }, releaseOldLockedPortsIntervalMs); -+ -+ // Does not exist in some environments (Electron, Jest jsdom env, browser, etc). -+ if (interval.unref) { -+ interval.unref(); -+ } -+ } -+ -+ for (const port of portCheckSequence(ports)) { -+ try { -+ let availablePort = await getAvailablePort({...options, port}); // eslint-disable-line no-await-in-loop -+ while (lockedPorts.old.has(availablePort) || lockedPorts.young.has(availablePort)) { -+ if (port !== 0) { -+ throw new Locked(port); -+ } -+ -+ availablePort = await getAvailablePort({...options, port}); // eslint-disable-line no-await-in-loop -+ } -+ -+ lockedPorts.young.add(availablePort); -+ return availablePort; -+ } catch (error) { -+ if (!['EADDRINUSE', 'EACCES'].includes(error.code) && !(error instanceof Locked)) { -+ throw error; -+ } -+ } -+ } -+ -+ throw new Error('No available ports found'); -+}; -+ -+module.exports.makeRange = (from, to) => { -+ if (!Number.isInteger(from) || !Number.isInteger(to)) { -+ throw new TypeError('`from` and `to` must be integer numbers'); -+ } -+ -+ if (from < 1024 || from > 65535) { -+ throw new RangeError('`from` must be between 1024 and 65535'); -+ } -+ -+ if (to < 1024 || to > 65536) { -+ throw new RangeError('`to` must be between 1024 and 65536'); -+ } -+ -+ if (to < from) { -+ throw new RangeError('`to` must be greater than or equal to `from`'); -+ } -+ -+ const generator = function * (from, to) { -+ for (let port = from; port <= to; port++) { -+ yield port; -+ } -+ }; -+ -+ return generator(from, to); -+}; -+ -+}, -+"Ek8gOcVH0qT+g7mlbmw7kR04MonUcjj09VjqQGHENI4=": -+function (require, module, exports, __dirname, __filename) { -+const compare = require('./compare') -+const lt = (a, b, loose) => compare(a, b, loose) < 0 -+module.exports = lt -+ -+}, -+"El0Tch4+pRgaLntwb5sELyRISVRCMgP1AzlC2u0/3D4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+/** -+ * Representation a of zip file in js -+ * @constructor -+ */ -+function JSZip() { -+ // if this constructor is used without `new`, it adds `new` before itself: -+ if(!(this instanceof JSZip)) { -+ return new JSZip(); -+ } -+ -+ if(arguments.length) { -+ throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide."); -+ } -+ -+ // object containing the files : -+ // { -+ // "folder/" : {...}, -+ // "folder/data.txt" : {...} -+ // } -+ this.files = {}; -+ -+ this.comment = null; -+ -+ // Where we are in the hierarchy -+ this.root = ""; -+ this.clone = function() { -+ var newObj = new JSZip(); -+ for (var i in this) { -+ if (typeof this[i] !== "function") { -+ newObj[i] = this[i]; -+ } -+ } -+ return newObj; -+ }; -+} -+JSZip.prototype = require('./object'); -+JSZip.prototype.loadAsync = require('./load'); -+JSZip.support = require('./support'); -+JSZip.defaults = require('./defaults'); -+ -+// TODO find a better way to handle this version, -+// a require('package.json').version doesn't work with webpack, see #327 -+JSZip.version = "3.1.5"; -+ -+JSZip.loadAsync = function (content, options) { -+ return new JSZip().loadAsync(content, options); -+}; -+ -+JSZip.external = require("./external"); -+module.exports = JSZip; -+ -+}, -+"ElljIjoS0lc6Vz61FjPAe+Ems8fiUooA2Bywyh8PgQY=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * ws: a node.js websocket client -+ * Copyright(c) 2011 Einar Otto Stangvik -+ * MIT Licensed -+ */ -+ -+'use strict'; -+ -+module.exports = { -+ isValidErrorCode: function (code) { -+ return (code >= 1000 && code <= 1013 && code !== 1004 && code !== 1005 && code !== 1006) || -+ (code >= 3000 && code <= 4999); -+ }, -+ 1000: 'normal', -+ 1001: 'going away', -+ 1002: 'protocol error', -+ 1003: 'unsupported data', -+ 1004: 'reserved', -+ 1005: 'reserved for extensions', -+ 1006: 'reserved for extensions', -+ 1007: 'inconsistent or invalid data', -+ 1008: 'policy violation', -+ 1009: 'message too big', -+ 1010: 'extension handshake missing', -+ 1011: 'an unexpected condition prevented the request from being fulfilled', -+ 1012: 'service restart', -+ 1013: 'try again later' -+}; -+ -+}, -+"Ez65je5uhPDR0gaDDIqaj1J1BRPdOK26Jv9gBlcGehU=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const codegen_1 = require("../../compile/codegen"); -+const util_1 = require("../../compile/util"); -+const code_1 = require("../code"); -+const additionalItems_1 = require("./additionalItems"); -+const error = { -+ message: ({ params: { len } }) => codegen_1.str `must NOT have more than ${len} items`, -+ params: ({ params: { len } }) => codegen_1._ `{limit: ${len}}`, -+}; -+const def = { -+ keyword: "items", -+ type: "array", -+ schemaType: ["object", "boolean"], -+ before: "uniqueItems", -+ error, -+ code(cxt) { -+ const { schema, parentSchema, it } = cxt; -+ const { prefixItems } = parentSchema; -+ it.items = true; -+ if (util_1.alwaysValidSchema(it, schema)) -+ return; -+ if (prefixItems) -+ additionalItems_1.validateAdditionalItems(cxt, prefixItems); -+ else -+ cxt.ok(code_1.validateArray(cxt)); -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=items2020.js.map -+}, -+"EziLNZnC8j5Ez8S++aTjkLXpj+QCi8lIzPu95DLFSWA=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * geoJSON validation according to the GeoJSON spefication Version 1 -+ * @module geoJSONValidation -+ * @class Main -+ * @exports {GJV} -+ */ -+ -+const definitions = {} -+ -+/** -+ * Test an object to see if it is a function -+ * @method isFunction -+ * @param object {Object} -+ * @return {Boolean} -+ */ -+function isFunction (object) { -+ return typeof (object) === 'function' -+} -+ -+/** -+ * A truthy test for objects -+ * @method isObject -+ * @param {Object} -+ * @return {Boolean} -+ */ -+function isObject (object) { -+ return object === Object(object) -+} -+ -+/** -+ * Formats error messages, calls the callback -+ * @method done -+ * @private -+ * @param cb {Function} callback -+ * @param [message] {Function} callback -+ * @return {Boolean} is the object valid or not? -+ */ -+function _done (cb, message) { -+ var valid = false -+ -+ if (typeof message === 'string') { -+ message = [message] -+ } else if (Object.prototype.toString.call(message) === '[object Array]') { -+ if (message.length === 0) { -+ valid = true -+ } -+ } else { -+ valid = true -+ } -+ -+ if (isFunction(cb)) { -+ if (valid) { -+ cb(valid, []) -+ } else { -+ cb(valid, message) -+ } -+ } -+ -+ return valid -+} -+ -+/** -+ * calls a custom definition if one is avalible for the given type -+ * @method _customDefinitions -+ * @private -+ * @param type {'String'} a GeoJSON object type -+ * @param object {Object} the Object being tested -+ * @return {Array} an array of errors -+ */ -+function _customDefinitions (type, object) { -+ var errors -+ -+ if (isFunction(definitions[type])) { -+ try { -+ errors = definitions[type](object) -+ } catch (e) { -+ errors = ['Problem with custom definition for '+type+': '+e] -+ } -+ if (typeof result === 'string') { -+ errors = [errors] -+ } -+ if (Object.prototype.toString.call(errors) === '[object Array]') { -+ return errors -+ } -+ } -+ return [] -+} -+ -+/** -+ * Define a custom validation function for one of GeoJSON objects -+ * @method define -+ * @param type {GeoJSON Type} the type -+ * @param definition {Function} A validation function -+ * @return {Boolean} Return true if the function was loaded corectly else false -+ */ -+exports.define = function (type, definition) { -+ if ((type in allTypes) && isFunction(definition)) { -+ // TODO: check to see if the type is valid -+ definitions[type] = definition -+ return true -+ } else { -+ return false -+ } -+} -+ -+/** -+ * Determines if an object is a position or not -+ * @method isPosition -+ * @param position {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isPosition = function (position, cb) { -+ var errors = [] -+ -+ // It must be an array -+ if (Array.isArray(position)) { -+ // and the array must have more than one element -+ if (position.length <= 1) { -+ errors.push('Position must be at least two elements') -+ } -+ -+ position.forEach(function(pos, index) { -+ if (typeof pos !== 'number') { -+ errors.push('Position must only contain numbers. Item '+pos+' at index '+index+' is invalid.') -+ } -+ }) -+ } else { -+ errors.push('Position must be an array') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('Position', position)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a GeoJSON Object or not -+ * @method isGeoJSONObject|valid -+ * @param geoJSONObject {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isGeoJSONObject = exports.valid = function (geoJSONObject, cb) { -+ if (!isObject(geoJSONObject)) { -+ return _done(cb, ['must be a JSON Object']) -+ } else { -+ var errors = [] -+ if ('type' in geoJSONObject) { -+ if (nonGeoTypes[geoJSONObject.type]) { -+ return nonGeoTypes[geoJSONObject.type](geoJSONObject, cb) -+ } else if (geoTypes[geoJSONObject.type]) { -+ return geoTypes[geoJSONObject.type](geoJSONObject, cb) -+ } else { -+ errors.push('type must be one of: "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", or "FeatureCollection"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('GeoJSONObject', geoJSONObject)) -+ return _done(cb, errors) -+ } -+} -+ -+/** -+ * Determines if an object is a Geometry Object or not -+ * @method isGeometryObject -+ * @param geometryObject {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isGeometryObject = function (geometryObject, cb) { -+ if (!isObject(geometryObject)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('type' in geometryObject) { -+ if (geoTypes[geometryObject.type]) { -+ return geoTypes[geometryObject.type](geometryObject, cb) -+ } else { -+ errors.push('type must be one of: "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" or "GeometryCollection"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('GeometryObject', geometryObject)) -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a Point or not -+ * @method isPoint -+ * @param point {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isPoint = function (point, cb) { -+ if (!isObject(point)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in point) { -+ exports.isBbox(point.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in point) { -+ if (point.type !== 'Point') { -+ errors.push('type must be "Point"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in point) { -+ exports.isPosition(point.coordinates, function (valid, err) { -+ if (!valid) { -+ errors.push('Coordinates must be a single position') -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('Point', point)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array can be interperted as coordinates for a MultiPoint -+ * @method isMultiPointCoor -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiPointCoor = function (coordinates, cb) { -+ var errors = [] -+ -+ if (Array.isArray(coordinates)) { -+ coordinates.forEach(function (val, index) { -+ exports.isPosition(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from "isPosition" to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ -+ return _done(cb, errors) -+} -+/** -+ * Determines if an object is a MultiPoint or not -+ * @method isMultiPoint -+ * @param position {Object} -+ * @param cb {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiPoint = function (multiPoint, cb) { -+ if (!isObject(multiPoint)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in multiPoint) { -+ exports.isBbox(multiPoint.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in multiPoint) { -+ if (multiPoint.type !== 'MultiPoint') { -+ errors.push('type must be "MultiPoint"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in multiPoint) { -+ exports.isMultiPointCoor(multiPoint.coordinates, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('MultiPoint', multiPoint)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array can be interperted as coordinates for a lineString -+ * @method isLineStringCoor -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isLineStringCoor = function (coordinates, cb) { -+ var errors = [] -+ if (Array.isArray(coordinates)) { -+ if (coordinates.length > 1) { -+ coordinates.forEach(function (val, index) { -+ exports.isPosition(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('coordinates must have at least two elements') -+ } -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a lineString or not -+ * @method isLineString -+ * @param lineString {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isLineString = function (lineString, cb) { -+ if (!isObject(lineString)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in lineString) { -+ exports.isBbox(lineString.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in lineString) { -+ if (lineString.type !== 'LineString') { -+ errors.push('type must be "LineString"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in lineString) { -+ exports.isLineStringCoor(lineString.coordinates, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('LineString', lineString)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array can be interperted as coordinates for a MultiLineString -+ * @method isMultiLineStringCoor -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiLineStringCoor = function (coordinates, cb) { -+ var errors = [] -+ if (Array.isArray(coordinates)) { -+ coordinates.forEach(function (val, index) { -+ exports.isLineStringCoor(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a MultiLine String or not -+ * @method isMultiLineString -+ * @param multilineString {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiLineString = function (multilineString, cb) { -+ if (!isObject(multilineString)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in multilineString) { -+ exports.isBbox(multilineString.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in multilineString) { -+ if (multilineString.type !== 'MultiLineString') { -+ errors.push('type must be "MultiLineString"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in multilineString) { -+ exports.isMultiLineStringCoor(multilineString.coordinates, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('MultiPoint', multilineString)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array is a linear Ring String or not -+ * @method isMultiLineString -+ * @private -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+function _linearRingCoor (coordinates, cb) { -+ var errors = [] -+ if (Array.isArray(coordinates)) { -+ // 4 or more positions -+ -+ coordinates.forEach(function (val, index) { -+ exports.isPosition(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ -+ // check the first and last positions to see if they are equivalent -+ // TODO: maybe better checking? -+ if (coordinates[0].toString() !== coordinates[coordinates.length - 1].toString()) { -+ errors.push('The first and last positions must be equivalent') -+ } -+ -+ if (coordinates.length < 4) { -+ errors.push('coordinates must have at least four positions') -+ } -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array is valid Polygon Coordinates or not -+ * @method _polygonCoor -+ * @private -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isPolygonCoor = function (coordinates, cb) { -+ var errors = [] -+ if (Array.isArray(coordinates)) { -+ coordinates.forEach(function (val, index) { -+ _linearRingCoor(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalid positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid Polygon -+ * @method isPolygon -+ * @param polygon {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isPolygon = function (polygon, cb) { -+ if (!isObject(polygon)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in polygon) { -+ exports.isBbox(polygon.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in polygon) { -+ if (polygon.type !== 'Polygon') { -+ errors.push('type must be "Polygon"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in polygon) { -+ exports.isPolygonCoor(polygon.coordinates, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('Polygon', polygon)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an array can be interperted as coordinates for a MultiPolygon -+ * @method isMultiPolygonCoor -+ * @param coordinates {Array} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiPolygonCoor = function (coordinates, cb) { -+ var errors = [] -+ if (Array.isArray(coordinates)) { -+ coordinates.forEach(function (val, index) { -+ exports.isPolygonCoor(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('coordinates must be an array') -+ } -+ -+ _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid MultiPolygon -+ * @method isMultiPolygon -+ * @param multiPolygon {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isMultiPolygon = function (multiPolygon, cb) { -+ if (!isObject(multiPolygon)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in multiPolygon) { -+ exports.isBbox(multiPolygon.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in multiPolygon) { -+ if (multiPolygon.type !== 'MultiPolygon') { -+ errors.push('type must be "MultiPolygon"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('coordinates' in multiPolygon) { -+ exports.isMultiPolygonCoor(multiPolygon.coordinates, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } else { -+ errors.push('must have a member with the name "coordinates"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('MultiPolygon', multiPolygon)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid Geometry Collection -+ * @method isGeometryCollection -+ * @param geometryCollection {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isGeometryCollection = function (geometryCollection, cb) { -+ if (!isObject(geometryCollection)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in geometryCollection) { -+ exports.isBbox(geometryCollection.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in geometryCollection) { -+ if (geometryCollection.type !== 'GeometryCollection') { -+ errors.push('type must be "GeometryCollection"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('geometries' in geometryCollection) { -+ if (Array.isArray(geometryCollection.geometries)) { -+ geometryCollection.geometries.forEach(function (val, index) { -+ exports.isGeometryObject(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('"geometries" must be an array') -+ } -+ } else { -+ errors.push('must have a member with the name "geometries"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('GeometryCollection', geometryCollection)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid Feature -+ * @method isFeature -+ * @param feature {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isFeature = function (feature, cb) { -+ if (!isObject(feature)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in feature) { -+ exports.isBbox(feature.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in feature) { -+ if (feature.type !== 'Feature') { -+ errors.push('type must be "Feature"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if (!('properties' in feature)) { -+ errors.push('must have a member with the name "properties"') -+ } -+ -+ if ('geometry' in feature) { -+ if (feature.geometry !== null) { -+ exports.isGeometryObject(feature.geometry, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ } else { -+ errors.push('must have a member with the name "geometry"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('Feature', feature)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid Feature Collection -+ * @method isFeatureCollection -+ * @param featureCollection {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isFeatureCollection = function (featureCollection, cb) { -+ if (!isObject(featureCollection)) { -+ return _done(cb, ['must be a JSON Object']) -+ } -+ -+ var errors = [] -+ -+ if ('bbox' in featureCollection) { -+ exports.isBbox(featureCollection.bbox, function (valid, err) { -+ if (!valid) { -+ errors = errors.concat(err) -+ } -+ }) -+ } -+ -+ if ('type' in featureCollection) { -+ if (featureCollection.type !== 'FeatureCollection') { -+ errors.push('type must be "FeatureCollection"') -+ } -+ } else { -+ errors.push('must have a member with the name "type"') -+ } -+ -+ if ('features' in featureCollection) { -+ if (Array.isArray(featureCollection.features)) { -+ featureCollection.features.forEach(function (val, index) { -+ exports.isFeature(val, function (valid, err) { -+ if (!valid) { -+ // modify the err msg from 'isPosition' to note the element number -+ err[0] = 'at ' + index + ': '.concat(err[0]) -+ // build a list of invalide positions -+ errors = errors.concat(err) -+ } -+ }) -+ }) -+ } else { -+ errors.push('"Features" must be an array') -+ } -+ } else { -+ errors.push('must have a member with the name "Features"') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('FeatureCollection', featureCollection)) -+ -+ return _done(cb, errors) -+} -+ -+/** -+ * Determines if an object is a valid Bounding Box -+ * @method isBbox -+ * @param bbox {Object} -+ * @param [cb] {Function} the callback -+ * @return {Boolean} -+ */ -+exports.isBbox = function (bbox, cb) { -+ var errors = [] -+ if (Array.isArray(bbox)) { -+ if (bbox.length % 2 !== 0) { -+ errors.push('bbox, must be a 2*n array') -+ } -+ } else { -+ errors.push('bbox must be an array') -+ } -+ -+ // run custom checks -+ errors = errors.concat(_customDefinitions('Bbox', bbox)) -+ -+ _done(cb, errors) -+} -+ -+const nonGeoTypes = { -+ 'Feature': exports.isFeature, -+ 'FeatureCollection': exports.isFeatureCollection -+} -+ -+const geoTypes = { -+ 'Point': exports.isPoint, -+ 'MultiPoint': exports.isMultiPoint, -+ 'LineString': exports.isLineString, -+ 'MultiLineString': exports.isMultiLineString, -+ 'Polygon': exports.isPolygon, -+ 'MultiPolygon': exports.isMultiPolygon, -+ 'GeometryCollection': exports.isGeometryCollection -+} -+ -+const allTypes = { -+ 'Feature': exports.isFeature, -+ 'FeatureCollection': exports.isFeatureCollection, -+ 'Point': exports.isPoint, -+ 'MultiPoint': exports.isMultiPoint, -+ 'LineString': exports.isLineString, -+ 'MultiLineString': exports.isMultiLineString, -+ 'Polygon': exports.isPolygon, -+ 'MultiPolygon': exports.isMultiPolygon, -+ 'GeometryCollection': exports.isGeometryCollection, -+ 'Bbox': exports.isBox, -+ 'Position': exports.isPosition, -+ 'GeoJSON': exports.isGeoJSONObject, -+ 'GeometryObject': exports.isGeometryObject -+} -+ -+exports.allTypes = allTypes -+ -+}, -+"FAH92hBe1n82W9d1OXrtsvX55DrOAxKI8PaGj5qwQb4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.TypedEmitter = require("events").EventEmitter; -+ -+}, -+"FD1Pe34jvTZR5fMuRia3hM8zEUS9H3ODoGsrrLJuzro=": -+function (require, module, exports, __dirname, __filename) { -+var isObject = require('./_is-object'); -+module.exports = function(it){ -+ if(!isObject(it))throw TypeError(it + ' is not an object!'); -+ return it; -+}; -+}, -+"FDY3q3uZahKKAFdE4mMk+hcLsoaaPZZFe96GIgvjLnY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var external = require("./external"); -+var DataWorker = require('./stream/DataWorker'); -+var DataLengthProbe = require('./stream/DataLengthProbe'); -+var Crc32Probe = require('./stream/Crc32Probe'); -+var DataLengthProbe = require('./stream/DataLengthProbe'); -+ -+/** -+ * Represent a compressed object, with everything needed to decompress it. -+ * @constructor -+ * @param {number} compressedSize the size of the data compressed. -+ * @param {number} uncompressedSize the size of the data after decompression. -+ * @param {number} crc32 the crc32 of the decompressed file. -+ * @param {object} compression the type of compression, see lib/compressions.js. -+ * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data. -+ */ -+function CompressedObject(compressedSize, uncompressedSize, crc32, compression, data) { -+ this.compressedSize = compressedSize; -+ this.uncompressedSize = uncompressedSize; -+ this.crc32 = crc32; -+ this.compression = compression; -+ this.compressedContent = data; -+} -+ -+CompressedObject.prototype = { -+ /** -+ * Create a worker to get the uncompressed content. -+ * @return {GenericWorker} the worker. -+ */ -+ getContentWorker : function () { -+ var worker = new DataWorker(external.Promise.resolve(this.compressedContent)) -+ .pipe(this.compression.uncompressWorker()) -+ .pipe(new DataLengthProbe("data_length")); -+ -+ var that = this; -+ worker.on("end", function () { -+ if(this.streamInfo['data_length'] !== that.uncompressedSize) { -+ throw new Error("Bug : uncompressed data size mismatch"); -+ } -+ }); -+ return worker; -+ }, -+ /** -+ * Create a worker to get the compressed content. -+ * @return {GenericWorker} the worker. -+ */ -+ getCompressedWorker : function () { -+ return new DataWorker(external.Promise.resolve(this.compressedContent)) -+ .withStreamInfo("compressedSize", this.compressedSize) -+ .withStreamInfo("uncompressedSize", this.uncompressedSize) -+ .withStreamInfo("crc32", this.crc32) -+ .withStreamInfo("compression", this.compression) -+ ; -+ } -+}; -+ -+/** -+ * Chain the given worker with other workers to compress the content with the -+ * given compresion. -+ * @param {GenericWorker} uncompressedWorker the worker to pipe. -+ * @param {Object} compression the compression object. -+ * @param {Object} compressionOptions the options to use when compressing. -+ * @return {GenericWorker} the new worker compressing the content. -+ */ -+CompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) { -+ return uncompressedWorker -+ .pipe(new Crc32Probe()) -+ .pipe(new DataLengthProbe("uncompressedSize")) -+ .pipe(compression.compressWorker(compressionOptions)) -+ .pipe(new DataLengthProbe("compressedSize")) -+ .withStreamInfo("compression", compression); -+}; -+ -+module.exports = CompressedObject; -+ -+}, -+"FEdWQewdhdy/leJVX+2wS/AvhILgiCKloJsB3cY4n18=": -+function (require, module, exports, __dirname, __filename) { -+// Copyright Joyent, Inc. and other Node contributors. -+// -+// Permission is hereby granted, free of charge, to any person obtaining a -+// copy of this software and associated documentation files (the -+// "Software"), to deal in the Software without restriction, including -+// without limitation the rights to use, copy, modify, merge, publish, -+// distribute, sublicense, and/or sell copies of the Software, and to permit -+// persons to whom the Software is furnished to do so, subject to the -+// following conditions: -+// -+// The above copyright notice and this permission notice shall be included -+// in all copies or substantial portions of the Software. -+// -+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -+// USE OR OTHER DEALINGS IN THE SOFTWARE. -+// a passthrough stream. -+// basically just the most minimal sort of Transform stream. -+// Every written chunk gets output as-is. -+'use strict'; -+ -+module.exports = PassThrough; -+ -+var Transform = require('./_stream_transform'); -+ -+require('inherits')(PassThrough, Transform); -+ -+function PassThrough(options) { -+ if (!(this instanceof PassThrough)) return new PassThrough(options); -+ Transform.call(this, options); -+} -+ -+PassThrough.prototype._transform = function (chunk, encoding, cb) { -+ cb(null, chunk); -+}; -+}, -+"FMlwOoqx+XmdjosFl4UN9Ai3yFD3Acfc3iQ0If6Toi4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const net = require('net'); -+/* istanbul ignore file: https://github.com/nodejs/node/blob/v13.0.1/lib/_http_agent.js */ -+ -+module.exports = options => { -+ let servername = options.host; -+ const hostHeader = options.headers && options.headers.host; -+ -+ if (hostHeader) { -+ if (hostHeader.startsWith('[')) { -+ const index = hostHeader.indexOf(']'); -+ if (index === -1) { -+ servername = hostHeader; -+ } else { -+ servername = hostHeader.slice(1, -1); -+ } -+ } else { -+ servername = hostHeader.split(':', 1)[0]; -+ } -+ } -+ -+ if (net.isIP(servername)) { -+ return ''; -+ } -+ -+ return servername; -+}; -+ -+}, -+"FTRTxNhKPC8TWJw3BVp9r/YdSEddzOVU9+7a0V/Hs+U=": -+function (require, module, exports, __dirname, __filename) { -+// Returns a wrapper function that returns a wrapped callback -+// The wrapper function should do some stuff, and return a -+// presumably different callback function. -+// This makes sure that own properties are retained, so that -+// decorations and such are not lost along the way. -+module.exports = wrappy -+function wrappy (fn, cb) { -+ if (fn && cb) return wrappy(fn)(cb) -+ -+ if (typeof fn !== 'function') -+ throw new TypeError('need wrapper function') -+ -+ Object.keys(fn).forEach(function (k) { -+ wrapper[k] = fn[k] -+ }) -+ -+ return wrapper -+ -+ function wrapper() { -+ var args = new Array(arguments.length) -+ for (var i = 0; i < args.length; i++) { -+ args[i] = arguments[i] -+ } -+ var ret = fn.apply(this, args) -+ var cb = args[args.length-1] -+ if (typeof ret === 'function' && ret !== cb) { -+ Object.keys(cb).forEach(function (k) { -+ ret[k] = cb[k] -+ }) -+ } -+ return ret -+ } -+} -+ -+}, -+"FXXMBS3lStR3u7jHETcGSan6vXEBikSVhFrlbjnJhaI=": -+function (require, module, exports, __dirname, __filename) { -+var fs = require('fs') -+var eos = require('end-of-stream') -+var tar = require('tar-stream') -+var RWLock = require('rwlock') -+var through = require('through2') -+var readonly = require('read-only-stream') -+var pump = require('pump') -+var through = require('through2') -+var tarHeader = require('tar-stream/headers') -+var fromBuffer = require('./lib/util').fromBuffer -+var cached = require('./lib/cached-value') -+var tarUtil = require('./lib/tar') -+ -+module.exports = SingleTarball -+ -+function SingleTarball (filepath, opts) { -+ this.filepath = filepath -+ -+ this.lock = new RWLock() -+ -+ if (!fs.existsSync(filepath)) fs.writeFileSync(filepath, '', 'utf8') // touch new file -+ -+ this.archive = cached(SingleTarball.prototype._lookupIndex.bind(this)) -+ this.archive.refresh() -+} -+ -+// Append a file and update the index entry. -+SingleTarball.prototype.append = function (filepath, size, cb) { -+ if (!cb && typeof size === 'function') { -+ cb = size -+ size = null -+ } -+ size = 0 -+ -+ var self = this -+ cb = cb || noop -+ -+ var t = through(function (chunk, _, next) { -+ size += chunk.length -+ next(null, chunk) -+ }) -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ // 1. Refresh the index & its byte offset. -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ -+ if (typeof archive.indexOffset === 'number') { -+ // 2. Truncate the file to remove the old index. -+ fs.truncate(self.filepath, archive.indexOffset, function (err) { -+ if (err) return done(err) -+ write(archive, archive.indexOffset) -+ }) -+ } else { -+ write(archive, undefined) -+ } -+ }) -+ -+ function write (archive, start) { -+ // 3. Prepare the tar archive for appending. -+ var fsOpts = { -+ flags: 'r+', -+ start: start !== undefined ? start : 0 -+ } -+ if (fsOpts.start < 0) fsOpts.start = 0 -+ var appendStream = fs.createWriteStream(self.filepath, fsOpts) -+ -+ // 4. Write tar header, without size info (yet). -+ var header = tarHeader.encode({ -+ name: filepath, -+ type: 'file', -+ mode: parseInt('644', 8), -+ uid: 0, -+ gid: 0, -+ mtime: new Date(), -+ size: 0 -+ }) -+ appendStream.write(header) -+ -+ // byte offset of size field -+ var sizePos = (fsOpts.start || 0) + 124 -+ -+ // 5. Write data. -+ t.pipe(appendStream) -+ t.on('end', function () { -+ // 6. Pad the remaining bytes to fit a 512-byte block. -+ var leftover = 512 - (size % 512) -+ fs.appendFile(self.filepath, Buffer.alloc(leftover), function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 7. Open file so we can update the header. -+ withWritableFile(self.filepath, function (fd, done) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 8. Read header. -+ var header = Buffer.alloc(512) -+ var headerStart = fsOpts.start || 0 -+ fs.read(fd, header, 0, 512, headerStart, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ // 9. Update size field. -+ var sizeStr = toPaddedOctal(size, 12) -+ header.write(sizeStr, 124, 12, 'utf8') -+ -+ // 10. Update checksum field. -+ var sum = cksum(header) -+ var ck = toPaddedOctal(sum, 8) -+ header.write(ck, 148, 8, 'utf8') -+ -+ // 11. Write new header. -+ fs.write(fd, header, 0, 512, headerStart, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ archive.index[filepath] = { offset: start, size: size } -+ -+ // 12. Write the new index to the end of the archive. -+ appendIndex(fd, headerStart + 512 + size + leftover, archive.index, done) -+ }) -+ }) -+ }, function (err) { -+ // TODO: file left in a bad state! D: -+ if (err) return done(err) -+ -+ self.archive.refresh(done) -+ }) -+ }) -+ }) -+ } -+ }) -+ -+ return t -+} -+ -+SingleTarball.prototype.list = function (cb) { -+ var self = this -+ -+ this.lock.readLock(function (release) { -+ self.archive.value(function (err, archive) { -+ release() -+ cb(err, Object.keys(archive.index)) -+ }) -+ }) -+} -+ -+SingleTarball.prototype.read = function (filepath) { -+ var self = this -+ var t = through() -+ -+ this.lock.readLock(function (release) { -+ self.archive.value(function (err, archive) { -+ if (err) { -+ release() -+ t.emit('error', err) -+ return -+ } -+ -+ var entry = archive.index[filepath] -+ if (!entry) { -+ release() -+ process.nextTick(function () { -+ var err = new Error('that file does not exist in the archive') -+ err.notFound = true -+ t.emit('error', err) -+ }) -+ return -+ } -+ -+ pump( -+ fs.createReadStream(self.filepath, { start: entry.offset + 512, end: entry.offset + 512 + entry.size - 1 }), -+ t, -+ function (err) { -+ release() -+ }) -+ }) -+ }) -+ -+ return readonly(t) -+} -+ -+// TODO: might be nice if this also returned the final file, but we don't want -+// to buffer the entire contents, and can't really stream it if it's being -+// truncated from the archive file.. -+SingleTarball.prototype.pop = function (name, cb) { -+ if (typeof name === 'function' && !cb) { -+ cb = name -+ name = null -+ } -+ var self = this -+ -+ this.lock.writeLock(function (release) { -+ function done (err) { -+ release() -+ cb(err) -+ } -+ -+ self.archive.value(function (err, archive) { -+ if (err) return done(err) -+ -+ // Get the last file in the archive. -+ var fname = getFileLargestOffset(archive.index) -+ if (name && name !== fname) { -+ return cb(null, new Error('the last file doesnt match the filename given')) -+ } -+ var offset = archive.index[fname].offset -+ -+ fs.truncate(self.filepath, offset, function (err) { -+ if (err) return done(err) -+ delete archive.index[fname] -+ -+ withWritableFile(self.filepath, function (fd, done) { -+ appendIndex(fd, offset, archive.index, done) -+ }, function (err) { -+ if (err) return done(err) -+ self.archive.refresh(done) -+ }) -+ }) -+ }) -+ }) -+} -+ -+// Search the tar archive backwards for the index file. -+SingleTarball.prototype._lookupIndex = function (cb) { -+ var self = this -+ -+ fs.stat(this.filepath, function (err, stat) { -+ if (err) return cb(err) -+ var size = stat.size -+ -+ // Archive is fresh & empty -+ if (size < 1024) { -+ return cb(null, { index: {}, indexOffset: 0, fileSize: size }) -+ } -+ -+ fs.open(self.filepath, 'r', function (err, fd) { -+ if (err) return cb(err) -+ -+ tarUtil.readFinalFile(fd, size, function (err, buf, offset) { -+ if (err) return cb(err) -+ var index -+ try { -+ index = JSON.parse(buf.toString()) -+ } catch (e) { -+ return cb(e) -+ } -+ fs.close(fd, function (err) { -+ if (err) return cb(err) -+ cb(null, { index: index, indexOffset: offset, fileSize: size }) -+ }) -+ }) -+ }) -+ }) -+} -+ -+// Returns the entry nearest the end of the index. -+function getFileLargestOffset (index) { -+ var key -+ for (var name in index) { -+ var entry = index[name] -+ if (!key || entry.offset > index[key].offset) key = name -+ } -+ return key -+} -+ -+function noop () {} -+ -+// tar checksum algorithm (from mafintosh/tar-stream) -+var cksum = function (block) { -+ var sum = 8 * 32 -+ for (var i = 0; i < 148; i++) sum += block[i] -+ for (var j = 156; j < 512; j++) sum += block[j] -+ return sum -+} -+ -+function toPaddedOctal (number, length) { -+ var octal = number.toString(8) -+ var leftover = length - octal.length -+ var padding = new Array(leftover).fill('0').join('') -+ return padding + octal -+} -+ -+function appendIndex (fd, pos, index, cb) { -+ var data = Buffer.from(JSON.stringify(index), 'utf8') -+ -+ var header = tarHeader.encode({ -+ name: '___index.json', -+ type: 'file', -+ mode: parseInt('644', 8), -+ uid: 0, -+ gid: 0, -+ mtime: new Date(), -+ size: data.length -+ }) -+ -+ // leftover bytes to reach 512 block boundary, plus another 512 * 2 = 1024 to mark the end-of-file -+ var padding = Buffer.alloc(512 - (data.length % 512) + 512 + 512).fill(0) -+ -+ var buf = Buffer.concat([header, data, padding]) -+ -+ fs.write(fd, buf, 0, buf.length, pos, cb) -+} -+ -+function withWritableFile (filepath, cb, done) { -+ fs.open(filepath, 'r+', function (err, fd) { -+ if (err) return cb(err) -+ cb(fd, function () { -+ fs.close(fd, done) -+ }) -+ }) -+} -+ -+}, -+"FY6tg0ymdCS/rEwpAa7RJK6QAQTww3QA6evZ/5sQHZ0=": -+function (require, module, exports, __dirname, __filename) { -+var toString = {}.toString; -+ -+module.exports = function(it){ -+ return toString.call(it).slice(8, -1); -+}; -+}, -+"FYaz57hzoH2gJjC00XPRMcB5iZXYX8w3GZUHrT705gM=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * Determine if an object is a Buffer -+ * -+ * @author Feross Aboukhadijeh -+ * @license MIT -+ */ -+ -+// The _isBuffer check is for Safari 5-7 support, because it's missing -+// Object.prototype.constructor. Remove this eventually -+module.exports = function (obj) { -+ return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -+} -+ -+function isBuffer (obj) { -+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -+} -+ -+// For Node v0.10 support. Remove this eventually. -+function isSlowBuffer (obj) { -+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) -+} -+ -+}, -+"FZVsLhkJz+792aejmZJsi6OaEZmPy2U3/1+WuYoqdBY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+/* eslint no-prototype-builtins: 0 */ -+ -+const { EventEmitter } = require('events') -+const SonicBoom = require('sonic-boom') -+const flatstr = require('flatstr') -+const { -+ lsCacheSym, -+ levelValSym, -+ setLevelSym, -+ getLevelSym, -+ chindingsSym, -+ parsedChindingsSym, -+ mixinSym, -+ asJsonSym, -+ writeSym, -+ timeSym, -+ timeSliceIndexSym, -+ streamSym, -+ serializersSym, -+ formattersSym, -+ useOnlyCustomLevelsSym, -+ needsMetadataGsym -+} = require('./symbols') -+const { -+ getLevel, -+ setLevel, -+ isLevelEnabled, -+ mappings, -+ initialLsCache, -+ genLsCache, -+ assertNoLevelCollisions -+} = require('./levels') -+const { -+ asChindings, -+ asJson, -+ buildFormatters -+} = require('./tools') -+const { -+ version -+} = require('./meta') -+ -+// note: use of class is satirical -+// https://github.com/pinojs/pino/pull/433#pullrequestreview-127703127 -+const constructor = class Pino {} -+const prototype = { -+ constructor, -+ child, -+ bindings, -+ setBindings, -+ flush, -+ isLevelEnabled, -+ version, -+ get level () { return this[getLevelSym]() }, -+ set level (lvl) { this[setLevelSym](lvl) }, -+ get levelVal () { return this[levelValSym] }, -+ set levelVal (n) { throw Error('levelVal is read-only') }, -+ [lsCacheSym]: initialLsCache, -+ [writeSym]: write, -+ [asJsonSym]: asJson, -+ [getLevelSym]: getLevel, -+ [setLevelSym]: setLevel -+} -+ -+Object.setPrototypeOf(prototype, EventEmitter.prototype) -+ -+// exporting and consuming the prototype object using factory pattern fixes scoping issues with getters when serializing -+module.exports = function () { -+ return Object.create(prototype) -+} -+ -+const resetChildingsFormatter = bindings => bindings -+function child (bindings) { -+ if (!bindings) { -+ throw Error('missing bindings for child Pino') -+ } -+ const serializers = this[serializersSym] -+ const formatters = this[formattersSym] -+ const instance = Object.create(this) -+ if (bindings.hasOwnProperty('serializers') === true) { -+ instance[serializersSym] = Object.create(null) -+ -+ for (const k in serializers) { -+ instance[serializersSym][k] = serializers[k] -+ } -+ const parentSymbols = Object.getOwnPropertySymbols(serializers) -+ /* eslint no-var: off */ -+ for (var i = 0; i < parentSymbols.length; i++) { -+ const ks = parentSymbols[i] -+ instance[serializersSym][ks] = serializers[ks] -+ } -+ -+ for (const bk in bindings.serializers) { -+ instance[serializersSym][bk] = bindings.serializers[bk] -+ } -+ const bindingsSymbols = Object.getOwnPropertySymbols(bindings.serializers) -+ for (var bi = 0; bi < bindingsSymbols.length; bi++) { -+ const bks = bindingsSymbols[bi] -+ instance[serializersSym][bks] = bindings.serializers[bks] -+ } -+ } else instance[serializersSym] = serializers -+ if (bindings.hasOwnProperty('formatters')) { -+ const { level, bindings: chindings, log } = bindings.formatters -+ instance[formattersSym] = buildFormatters( -+ level || formatters.level, -+ chindings || resetChildingsFormatter, -+ log || formatters.log -+ ) -+ } else { -+ instance[formattersSym] = buildFormatters( -+ formatters.level, -+ resetChildingsFormatter, -+ formatters.log -+ ) -+ } -+ if (bindings.hasOwnProperty('customLevels') === true) { -+ assertNoLevelCollisions(this.levels, bindings.customLevels) -+ instance.levels = mappings(bindings.customLevels, instance[useOnlyCustomLevelsSym]) -+ genLsCache(instance) -+ } -+ instance[chindingsSym] = asChindings(instance, bindings) -+ const childLevel = bindings.level || this.level -+ instance[setLevelSym](childLevel) -+ -+ return instance -+} -+ -+function bindings () { -+ const chindings = this[chindingsSym] -+ const chindingsJson = `{${chindings.substr(1)}}` // at least contains ,"pid":7068,"hostname":"myMac" -+ const bindingsFromJson = JSON.parse(chindingsJson) -+ delete bindingsFromJson.pid -+ delete bindingsFromJson.hostname -+ return bindingsFromJson -+} -+ -+function setBindings (newBindings) { -+ const chindings = asChindings(this, newBindings) -+ this[chindingsSym] = chindings -+ delete this[parsedChindingsSym] -+} -+ -+function write (_obj, msg, num) { -+ const t = this[timeSym]() -+ const mixin = this[mixinSym] -+ const objError = _obj instanceof Error -+ let obj -+ -+ if (_obj === undefined || _obj === null) { -+ obj = mixin ? mixin({}) : {} -+ } else { -+ obj = Object.assign(mixin ? mixin(_obj) : {}, _obj) -+ if (!msg && objError) { -+ msg = _obj.message -+ } -+ -+ if (objError) { -+ obj.stack = _obj.stack -+ if (!obj.type) { -+ obj.type = 'Error' -+ } -+ } -+ } -+ -+ const s = this[asJsonSym](obj, msg, num, t) -+ -+ const stream = this[streamSym] -+ if (stream[needsMetadataGsym] === true) { -+ stream.lastLevel = num -+ stream.lastObj = obj -+ stream.lastMsg = msg -+ stream.lastTime = t.slice(this[timeSliceIndexSym]) -+ stream.lastLogger = this // for child loggers -+ } -+ if (stream instanceof SonicBoom) stream.write(s) -+ else stream.write(flatstr(s)) -+} -+ -+function flush () { -+ const stream = this[streamSym] -+ if ('flush' in stream) stream.flush() -+} -+ -+}, -+"Fe5eaqsPliwvw5LylrO8ogRT0TEdgDFRDRJiVmj/oxw=": -+function (require, module, exports, __dirname, __filename) { -+var defined = require('defined'); -+ -+module.exports = function (opts, prefix) { -+ if (!opts) opts = {}; -+ if (!prefix) prefix = {}; -+ var xopts = {}; -+ var gte = defined(prefix.gte, prefix.ge, prefix.start); -+ var lte = defined(prefix.lte, prefix.le, prefix.end); -+ var ogte = defined(opts.gte, opts.ge, opts.start); -+ var olte = defined(opts.lte, opts.le, opts.end); -+ -+ if (prefix.gt) { -+ if (ogte !== undefined) { -+ xopts.gte = prefix.gt(ogte); -+ } -+ else xopts.gt = prefix.gt(opts.gt); -+ } -+ else if (gte) { -+ if (ogte !== undefined) { -+ xopts.gte = gte(ogte); -+ } -+ else xopts.gt = gte(opts.gt); -+ } -+ -+ if (prefix.lt) { -+ if (olte !== undefined) { -+ xopts.lte = prefix.lt(olte); -+ } -+ else xopts.lt = prefix.lt(opts.lt); -+ } -+ else if (lte) { -+ if (olte !== undefined) { -+ xopts.lte = lte(olte); -+ } -+ else xopts.lt = lte(opts.lt); -+ } -+ -+ if (prefix.limit !== undefined) { -+ xopts.limit = prefix.limit(opts.limit); -+ } -+ else if (opts.limit !== undefined) { -+ xopts.limit = opts.limit; -+ } -+ return xopts; -+}; -+ -+}, -+"Ff3kT0iVd9qfdG47cLGjMbBe8T3O+qbGd7n++CpCUOI=": -+function (require, module, exports, __dirname, __filename) { -+var eos = require('end-of-stream') -+ -+module.exports = function (db, opts) { -+ var multifeed = db.osm.core._logs -+ -+ var stream = multifeed.replicate(opts) -+ -+ var feeds = new Map() -+ var listeners = [] -+ -+ multifeed.ready(function () { -+ multifeed.feeds().forEach(onFeed) -+ multifeed.on('feed', onFeed) -+ stream.on('remote-feeds', onRemoteFeeds) -+ -+ function onRemoteFeeds () { -+ multifeed.feeds().forEach(onFeed) -+ } -+ -+ eos(stream, function () { -+ multifeed.removeListener('feed', onFeed) -+ stream.removeListener('remote-feeds', onRemoteFeeds) -+ listeners.forEach(function (l) { -+ l.feed.removeListener('upload', l.listener) -+ l.feed.removeListener('download', l.listener) -+ }) -+ }) -+ }) -+ -+ return stream -+ -+ function onFeed (feed) { -+ if (!feed.writable && feeds.has(feed.key.toString('hex'))) return -+ feeds.set(feed.key.toString('hex'), feed) -+ feed.ready(updateFeed.bind(null, feed)) -+ feed.on('download', listener) -+ feed.on('upload', listener) -+ -+ function listener () { -+ updateFeed(feed) -+ } -+ listeners.push({ feed, listener }) -+ // XXX: This is important because at least one progress event should be -+ // emitted to ensure the state moves from 'started' to 'progress' -+ // indicating up the stack that progress tracking has begun -+ // for more accurate state -+ updateFeed() -+ } -+ -+ function updateFeed (feed) { -+ var all = Array.from(feeds.values()) -+ var total = all.reduce(function (acc, feed) { -+ return acc + feed.length -+ }, 0) -+ var sofar = all.reduce(function (acc, feed) { -+ return acc + feed.downloaded(0, feed.length) -+ }, 0) -+ stream.emit('progress', sofar, total) -+ } -+} -+ -+}, -+"FjuzBVqupxQBZ3QANqgxYf2RLDRLFPmSdUuA8hR311Q=": -+function (require, module, exports, __dirname, __filename) { -+/* -*- Mode: js; js-indent-level: 2; -*- */ -+/* -+ * Copyright 2011 Mozilla Foundation and contributors -+ * Licensed under the New BSD license. See LICENSE or: -+ * http://opensource.org/licenses/BSD-3-Clause -+ */ -+ -+var util = require('./util'); -+var has = Object.prototype.hasOwnProperty; -+var hasNativeMap = typeof Map !== "undefined"; -+ -+/** -+ * A data structure which is a combination of an array and a set. Adding a new -+ * member is O(1), testing for membership is O(1), and finding the index of an -+ * element is O(1). Removing elements from the set is not supported. Only -+ * strings are supported for membership. -+ */ -+function ArraySet() { -+ this._array = []; -+ this._set = hasNativeMap ? new Map() : Object.create(null); -+} -+ -+/** -+ * Static method for creating ArraySet instances from an existing array. -+ */ -+ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { -+ var set = new ArraySet(); -+ for (var i = 0, len = aArray.length; i < len; i++) { -+ set.add(aArray[i], aAllowDuplicates); -+ } -+ return set; -+}; -+ -+/** -+ * Return how many unique items are in this ArraySet. If duplicates have been -+ * added, than those do not count towards the size. -+ * -+ * @returns Number -+ */ -+ArraySet.prototype.size = function ArraySet_size() { -+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; -+}; -+ -+/** -+ * Add the given string to this set. -+ * -+ * @param String aStr -+ */ -+ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { -+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr); -+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); -+ var idx = this._array.length; -+ if (!isDuplicate || aAllowDuplicates) { -+ this._array.push(aStr); -+ } -+ if (!isDuplicate) { -+ if (hasNativeMap) { -+ this._set.set(aStr, idx); -+ } else { -+ this._set[sStr] = idx; -+ } -+ } -+}; -+ -+/** -+ * Is the given string a member of this set? -+ * -+ * @param String aStr -+ */ -+ArraySet.prototype.has = function ArraySet_has(aStr) { -+ if (hasNativeMap) { -+ return this._set.has(aStr); -+ } else { -+ var sStr = util.toSetString(aStr); -+ return has.call(this._set, sStr); -+ } -+}; -+ -+/** -+ * What is the index of the given string in the array? -+ * -+ * @param String aStr -+ */ -+ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { -+ if (hasNativeMap) { -+ var idx = this._set.get(aStr); -+ if (idx >= 0) { -+ return idx; -+ } -+ } else { -+ var sStr = util.toSetString(aStr); -+ if (has.call(this._set, sStr)) { -+ return this._set[sStr]; -+ } -+ } -+ -+ throw new Error('"' + aStr + '" is not in the set.'); -+}; -+ -+/** -+ * What is the element at the given index? -+ * -+ * @param Number aIdx -+ */ -+ArraySet.prototype.at = function ArraySet_at(aIdx) { -+ if (aIdx >= 0 && aIdx < this._array.length) { -+ return this._array[aIdx]; -+ } -+ throw new Error('No element indexed by ' + aIdx); -+}; -+ -+/** -+ * Returns the array representation of this set (which has the proper indices -+ * indicated by indexOf). Note that this is a copy of the internal array used -+ * for storing the members so that no one can mess with internal state. -+ */ -+ArraySet.prototype.toArray = function ArraySet_toArray() { -+ return this._array.slice(); -+}; -+ -+exports.ArraySet = ArraySet; -+ -+}, -+"FkaOOMIm0uw4T/qUEXedGAomXG5xzPsXM1T8CCkfyF4=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function(it){ -+ return typeof it === 'object' ? it !== null : typeof it === 'function'; -+}; -+}, -+"FkdQNRQ5l+kk3D9Br2/WV89VxYQ/QV8AsVXCCJHails=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('./readable').Duplex -+ -+}, -+"FldrIBHHjQxc7M3rp0Ueg+G9hvLD8xwF3n30zPsUnCo=": -+function (require, module, exports, __dirname, __filename) { -+// Ported from https://github.com/mafintosh/pump with -+// permission from the author, Mathias Buus (@mafintosh). -+'use strict'; -+ -+var eos; -+ -+function once(callback) { -+ var called = false; -+ return function () { -+ if (called) return; -+ called = true; -+ callback.apply(void 0, arguments); -+ }; -+} -+ -+var _require$codes = require('../../../errors').codes, -+ ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, -+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; -+ -+function noop(err) { -+ // Rethrow the error if it exists to avoid swallowing it -+ if (err) throw err; -+} -+ -+function isRequest(stream) { -+ return stream.setHeader && typeof stream.abort === 'function'; -+} -+ -+function destroyer(stream, reading, writing, callback) { -+ callback = once(callback); -+ var closed = false; -+ stream.on('close', function () { -+ closed = true; -+ }); -+ if (eos === undefined) eos = require('./end-of-stream'); -+ eos(stream, { -+ readable: reading, -+ writable: writing -+ }, function (err) { -+ if (err) return callback(err); -+ closed = true; -+ callback(); -+ }); -+ var destroyed = false; -+ return function (err) { -+ if (closed) return; -+ if (destroyed) return; -+ destroyed = true; // request.destroy just do .end - .abort is what we want -+ -+ if (isRequest(stream)) return stream.abort(); -+ if (typeof stream.destroy === 'function') return stream.destroy(); -+ callback(err || new ERR_STREAM_DESTROYED('pipe')); -+ }; -+} -+ -+function call(fn) { -+ fn(); -+} -+ -+function pipe(from, to) { -+ return from.pipe(to); -+} -+ -+function popCallback(streams) { -+ if (!streams.length) return noop; -+ if (typeof streams[streams.length - 1] !== 'function') return noop; -+ return streams.pop(); -+} -+ -+function pipeline() { -+ for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { -+ streams[_key] = arguments[_key]; -+ } -+ -+ var callback = popCallback(streams); -+ if (Array.isArray(streams[0])) streams = streams[0]; -+ -+ if (streams.length < 2) { -+ throw new ERR_MISSING_ARGS('streams'); -+ } -+ -+ var error; -+ var destroys = streams.map(function (stream, i) { -+ var reading = i < streams.length - 1; -+ var writing = i > 0; -+ return destroyer(stream, reading, writing, function (err) { -+ if (!error) error = err; -+ if (err) destroys.forEach(call); -+ if (reading) return; -+ destroys.forEach(call); -+ callback(error); -+ }); -+ }); -+ return streams.reduce(pipe); -+} -+ -+module.exports = pipeline; -+}, -+"Fn2K6drpeItuKLgFxIHK2rlZYOTj6cpyiu0S6m8UMG8=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * isobject -+ * -+ * Copyright (c) 2014-2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+var isArray = require('isarray'); -+ -+module.exports = function isObject(val) { -+ return val != null && typeof val === 'object' && isArray(val) === false; -+}; -+ -+}, -+"FuDM0eMKJidFeBZ8VjAGRjBPBV0c20bLmv5m7i8X37g=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * Adapted from http-errors -+ * https://github.com/jshttp/http-errors/blob/master/index.js -+ * Copyright(c) 2014 Jonathan Ong -+ * Copyright(c) 2016 Douglas Christopher Wilson -+ * MIT Licensed -+ */ -+ -+'use strict' -+ -+/** -+ * Module dependencies. -+ * @private -+ */ -+ -+var statuses = require('statuses') -+var inherits = require('inherits') -+var customErrors = require('./errors.json') -+ -+/** -+ * Module exports. -+ * @public -+ */ -+ -+module.exports = createError -+module.exports.format = format -+module.exports.send = send -+module.exports.HttpError = createHttpErrorConstructor() -+ -+function send (res, err) { -+ res.statusCode = err.status -+ res.setHeader('content-type', 'application/json') -+ res.end(format(err)) -+} -+ -+function format (err) { -+ return JSON.stringify({'error': err.message, 'status': err.status}) -+} -+ -+// Populate exports for all constructors -+populateConstructorExports(module.exports, customErrors, module.exports.HttpError) -+ -+/** -+ * Create a new HTTP Error. -+ * -+ * @returns {Error} -+ * @public -+ */ -+ -+function createError () { -+ // so much arity going on ~_~ -+ var err -+ var msg -+ var status = 500 -+ var props = {} -+ for (var i = 0; i < arguments.length; i++) { -+ var arg = arguments[i] -+ if (arg instanceof Error) { -+ err = arg -+ status = err.status || err.statusCode || status -+ continue -+ } -+ switch (typeof arg) { -+ case 'string': -+ msg = arg -+ break -+ case 'number': -+ status = arg -+ break -+ case 'object': -+ props = arg -+ break -+ } -+ } -+ -+ if (typeof status !== 'number' || !statuses[status]) { -+ status = 500 -+ } -+ -+ // constructor -+ var HttpError = createError[status] -+ -+ if (!err) { -+ // create error -+ err = HttpError -+ ? new HttpError(msg) -+ : new Error(msg || statuses[status]) -+ Error.captureStackTrace(err, createError) -+ } -+ -+ if (!HttpError || !(err instanceof HttpError)) { -+ // add properties to generic error -+ err.expose = status < 500 -+ err.status = err.statusCode = status -+ } -+ -+ for (var key in props) { -+ if (key !== 'status' && key !== 'statusCode') { -+ err[key] = props[key] -+ } -+ } -+ -+ return err -+} -+ -+/** -+ * Create HTTP error abstract base class. -+ * @private -+ */ -+ -+function createHttpErrorConstructor () { -+ function HttpError () { -+ throw new TypeError('cannot construct abstract class') -+ } -+ -+ inherits(HttpError, Error) -+ -+ return HttpError -+} -+ -+/** -+ * Create a constructor for a client error. -+ * @private -+ */ -+ -+function createClientErrorConstructor (HttpError, name, template, code) { -+ var className = name.match(/Error$/) ? name : name + 'Error' -+ -+ function ClientError () { -+ var args = Array.prototype.slice.call(arguments) -+ var err -+ if (args[0] instanceof Error) { -+ err = args[0] -+ } else { -+ err = new Error(sprintf(template, args)) -+ } -+ -+ // capture a stack trace to the construction point -+ Error.captureStackTrace(err, ClientError) -+ -+ // adjust the [[Prototype]] -+ Object.setPrototypeOf(err, ClientError.prototype) -+ -+ // redefine the error name -+ Object.defineProperty(err, 'name', { -+ enumerable: false, -+ configurable: true, -+ value: className, -+ writable: true -+ }) -+ -+ return err -+ } -+ -+ inherits(ClientError, HttpError) -+ -+ ClientError.prototype.status = code -+ ClientError.prototype.statusCode = code -+ ClientError.prototype.expose = true -+ -+ return ClientError -+} -+ -+/** -+ * Create a constructor for a server error. -+ * @private -+ */ -+ -+function createServerErrorConstructor (HttpError, name, template, code) { -+ var className = name.match(/Error$/) ? name : name + 'Error' -+ -+ function ServerError () { -+ var args = Array.prototype.slice.call(arguments) -+ var err -+ if (args[0] instanceof Error) { -+ err = args[0] -+ } else { -+ err = new Error(sprintf(template, args)) -+ } -+ -+ // capture a stack trace to the construction point -+ Error.captureStackTrace(err, ServerError) -+ -+ // adjust the [[Prototype]] -+ Object.setPrototypeOf(err, ServerError.prototype) -+ -+ // redefine the error name -+ Object.defineProperty(err, 'name', { -+ enumerable: false, -+ configurable: true, -+ value: className, -+ writable: true -+ }) -+ -+ return err -+ } -+ -+ inherits(ServerError, HttpError) -+ -+ ServerError.prototype.status = code -+ ServerError.prototype.statusCode = code -+ ServerError.prototype.expose = false -+ -+ return ServerError -+} -+ -+/** -+ * Populate the exports object with constructors for osm-p2p custom errors. -+ * @private -+ */ -+ -+function populateConstructorExports (exports, errors, HttpError) { -+ Object.keys(errors).forEach(function (name) { -+ var CodeError -+ var code = errors[name].code -+ var message = errors[name].message -+ -+ switch (String(code).charAt(0)) { -+ case '4': -+ CodeError = createClientErrorConstructor(HttpError, name, message, code) -+ break -+ case '5': -+ CodeError = createServerErrorConstructor(HttpError, name, message, code) -+ break -+ } -+ -+ if (CodeError) { -+ // export the constructor -+ exports[name] = CodeError -+ } -+ }) -+} -+ -+/** -+ * @param {String} template -+ * @param {String[]} values -+ * @return {String} -+ */ -+function sprintf (template, values) { -+ return template.replace(/%s/g, function () { -+ return values.shift() || '' -+ }).replace(/ {2}/g, ' ').trim() + (values.length ? '\n' + values.join('\n') : '') -+} -+ -+ -+}, -+"FuMchaeW5YTwO5CPJYLr5FRZlk3jRW83eR+gmHhniEo=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.callRef = exports.getValidate = void 0; -+const ref_error_1 = require("../../compile/ref_error"); -+const code_1 = require("../code"); -+const codegen_1 = require("../../compile/codegen"); -+const names_1 = require("../../compile/names"); -+const compile_1 = require("../../compile"); -+const util_1 = require("../../compile/util"); -+const def = { -+ keyword: "$ref", -+ schemaType: "string", -+ code(cxt) { -+ const { gen, schema: $ref, it } = cxt; -+ const { baseId, schemaEnv: env, validateName, opts, self } = it; -+ const { root } = env; -+ if (($ref === "#" || $ref === "#/") && baseId === root.baseId) -+ return callRootRef(); -+ const schOrEnv = compile_1.resolveRef.call(self, root, baseId, $ref); -+ if (schOrEnv === undefined) -+ throw new ref_error_1.default(baseId, $ref); -+ if (schOrEnv instanceof compile_1.SchemaEnv) -+ return callValidate(schOrEnv); -+ return inlineRefSchema(schOrEnv); -+ function callRootRef() { -+ if (env === root) -+ return callRef(cxt, validateName, env, env.$async); -+ const rootName = gen.scopeValue("root", { ref: root }); -+ return callRef(cxt, codegen_1._ `${rootName}.validate`, root, root.$async); -+ } -+ function callValidate(sch) { -+ const v = getValidate(cxt, sch); -+ callRef(cxt, v, sch, sch.$async); -+ } -+ function inlineRefSchema(sch) { -+ const schName = gen.scopeValue("schema", opts.code.source === true ? { ref: sch, code: codegen_1.stringify(sch) } : { ref: sch }); -+ const valid = gen.name("valid"); -+ const schCxt = cxt.subschema({ -+ schema: sch, -+ dataTypes: [], -+ schemaPath: codegen_1.nil, -+ topSchemaRef: schName, -+ errSchemaPath: $ref, -+ }, valid); -+ cxt.mergeEvaluated(schCxt); -+ cxt.ok(valid); -+ } -+ }, -+}; -+function getValidate(cxt, sch) { -+ const { gen } = cxt; -+ return sch.validate -+ ? gen.scopeValue("validate", { ref: sch.validate }) -+ : codegen_1._ `${gen.scopeValue("wrapper", { ref: sch })}.validate`; -+} -+exports.getValidate = getValidate; -+function callRef(cxt, v, sch, $async) { -+ const { gen, it } = cxt; -+ const { allErrors, schemaEnv: env, opts } = it; -+ const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil; -+ if ($async) -+ callAsyncRef(); -+ else -+ callSyncRef(); -+ function callAsyncRef() { -+ if (!env.$async) -+ throw new Error("async schema referenced by sync schema"); -+ const valid = gen.let("valid"); -+ gen.try(() => { -+ gen.code(codegen_1._ `await ${code_1.callValidateCode(cxt, v, passCxt)}`); -+ addEvaluatedFrom(v); // TODO will not work with async, it has to be returned with the result -+ if (!allErrors) -+ gen.assign(valid, true); -+ }, (e) => { -+ gen.if(codegen_1._ `!(${e} instanceof ${it.ValidationError})`, () => gen.throw(e)); -+ addErrorsFrom(e); -+ if (!allErrors) -+ gen.assign(valid, false); -+ }); -+ cxt.ok(valid); -+ } -+ function callSyncRef() { -+ cxt.result(code_1.callValidateCode(cxt, v, passCxt), () => addEvaluatedFrom(v), () => addErrorsFrom(v)); -+ } -+ function addErrorsFrom(source) { -+ const errs = codegen_1._ `${source}.errors`; -+ gen.assign(names_1.default.vErrors, codegen_1._ `${names_1.default.vErrors} === null ? ${errs} : ${names_1.default.vErrors}.concat(${errs})`); // TODO tagged -+ gen.assign(names_1.default.errors, codegen_1._ `${names_1.default.vErrors}.length`); -+ } -+ function addEvaluatedFrom(source) { -+ var _a; -+ if (!it.opts.unevaluated) -+ return; -+ const schEvaluated = (_a = sch === null || sch === void 0 ? void 0 : sch.validate) === null || _a === void 0 ? void 0 : _a.evaluated; -+ // TODO refactor -+ if (it.props !== true) { -+ if (schEvaluated && !schEvaluated.dynamicProps) { -+ if (schEvaluated.props !== undefined) { -+ it.props = util_1.mergeEvaluated.props(gen, schEvaluated.props, it.props); -+ } -+ } -+ else { -+ const props = gen.var("props", codegen_1._ `${source}.evaluated.props`); -+ it.props = util_1.mergeEvaluated.props(gen, props, it.props, codegen_1.Name); -+ } -+ } -+ if (it.items !== true) { -+ if (schEvaluated && !schEvaluated.dynamicItems) { -+ if (schEvaluated.items !== undefined) { -+ it.items = util_1.mergeEvaluated.items(gen, schEvaluated.items, it.items); -+ } -+ } -+ else { -+ const items = gen.var("items", codegen_1._ `${source}.evaluated.items`); -+ it.items = util_1.mergeEvaluated.items(gen, items, it.items, codegen_1.Name); -+ } -+ } -+ } -+} -+exports.callRef = callRef; -+exports.default = def; -+//# sourceMappingURL=ref.js.map -+}, -+"G3+SoQoynzxCkHob1xmttPpWu2Q7s/V/m8O+6H+J2jw=": -+function (require, module, exports, __dirname, __filename) { -+require('../modules/web.immediate'); -+module.exports = require('../modules/_core').setImmediate; -+}, -+"G8s3ZCRZXDsr5ocRi8eirOByzIfzE2OyiJLGsow7Fg4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_const(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $valid = 'valid' + $lvl; -+ var $isData = it.opts.$data && $schema && $schema.$data, -+ $schemaValue; -+ if ($isData) { -+ out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; -+ $schemaValue = 'schema' + $lvl; -+ } else { -+ $schemaValue = $schema; -+ } -+ if (!$isData) { -+ out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; -+ } -+ out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should be equal to constant\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += ' }'; -+ if ($breakOnError) { -+ out += ' else { '; -+ } -+ return out; -+} -+ -+}, -+"GAttlvdDMOJ97N6WGJ1Q43ZCBeWDFwY6myjvH8seBTw=": -+function (require, module, exports, __dirname, __filename) { -+/* -+index.js - Kademlia DHT K-bucket implementation as a binary tree. -+ -+The MIT License (MIT) -+ -+Copyright (c) 2013-2016 Tristan Slominski -+ -+Permission is hereby granted, free of charge, to any person -+obtaining a copy of this software and associated documentation -+files (the "Software"), to deal in the Software without -+restriction, including without limitation the rights to use, -+copy, modify, merge, publish, distribute, sublicense, and/or sell -+copies of the Software, and to permit persons to whom the -+Software is furnished to do so, subject to the following -+conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -+OTHER DEALINGS IN THE SOFTWARE. -+*/ -+'use strict' -+ -+var bufferEquals = require('buffer-equals') -+var randomBytes = require('randombytes') -+var EventEmitter = require('events').EventEmitter -+var inherits = require('inherits') -+ -+module.exports = KBucket -+ -+function createNode () { -+ return { contacts: [], dontSplit: false, left: null, right: null } -+} -+ -+/* -+ * `options`: -+ * `distance`: _Function_ -+ `function (firstId, secondId) { return distance }` An optional -+ `distance` function that gets two `id` Buffers -+ and return distance (as number) between them. -+ * `arbiter`: _Function_ _(Default: vectorClock arbiter)_ -+ `function (incumbent, candidate) { return contact; }` An optional -+ `arbiter` function that givent two `contact` objects with the same `id` -+ returns the desired object to be used for updating the k-bucket. For -+ more details, see [arbiter function](#arbiter-function). -+ * `localNodeId`: _Buffer_ An optional Buffer representing the local node id. -+ If not provided, a local node id will be created via -+ `crypto.randomBytes(20)`. -+ * `metadata`: _Object_ _(Default: {})_ Optional satellite data to include -+ with the k-bucket. `metadata` property is guaranteed not be altered by, -+ it is provided as an explicit container for users of k-bucket to store -+ implementation-specific data. -+ * `numberOfNodesPerKBucket`: _Integer_ _(Default: 20)_ The number of nodes -+ that a k-bucket can contain before being full or split. -+ * `numberOfNodesToPing`: _Integer_ _(Default: 3)_ The number of nodes to -+ ping when a bucket that should not be split becomes full. KBucket will -+ emit a `ping` event that contains `numberOfNodesToPing` nodes that have -+ not been contacted the longest. -+*/ -+function KBucket (options) { -+ EventEmitter.call(this) -+ options = options || {} -+ -+ this.localNodeId = options.localNodeId || randomBytes(20) -+ if (!Buffer.isBuffer(this.localNodeId)) throw new TypeError('localNodeId is not a Buffer') -+ this.numberOfNodesPerKBucket = options.numberOfNodesPerKBucket || 20 -+ this.numberOfNodesToPing = options.numberOfNodesToPing || 3 -+ this.distance = options.distance || KBucket.distance -+ // use an arbiter from options or vectorClock arbiter by default -+ this.arbiter = options.arbiter || KBucket.arbiter -+ -+ this.root = createNode() -+ -+ this.metadata = Object.assign({}, options.metadata) -+} -+ -+inherits(KBucket, EventEmitter) -+ -+KBucket.arbiter = function (incumbent, candidate) { -+ return incumbent.vectorClock > candidate.vectorClock ? incumbent : candidate -+} -+ -+KBucket.distance = function (firstId, secondId) { -+ var distance = 0 -+ var min = Math.min(firstId.length, secondId.length) -+ var max = Math.max(firstId.length, secondId.length) -+ for (var i = 0; i < min; ++i) distance = distance * 256 + (firstId[i] ^ secondId[i]) -+ for (; i < max; ++i) distance = distance * 256 + 255 -+ return distance -+} -+ -+// contact: *required* the contact object to add -+KBucket.prototype.add = function (contact) { -+ if (!contact || !Buffer.isBuffer(contact.id)) throw new TypeError('contact.id is not a Buffer') -+ var bitIndex = 0 -+ -+ var node = this.root -+ while (node.contacts === null) { -+ // this is not a leaf node but an inner node with 'low' and 'high' -+ // branches; we will check the appropriate bit of the identifier and -+ // delegate to the appropriate node for further processing -+ node = this._determineNode(node, contact.id, bitIndex++) -+ } -+ -+ // check if the contact already exists -+ var index = this._indexOf(node, contact.id) -+ if (index >= 0) { -+ this._update(node, index, contact) -+ return this -+ } -+ -+ if (node.contacts.length < this.numberOfNodesPerKBucket) { -+ node.contacts.push(contact) -+ this.emit('added', contact) -+ return this -+ } -+ -+ // the bucket is full -+ if (node.dontSplit) { -+ // we are not allowed to split the bucket -+ // we need to ping the first this.numberOfNodesToPing -+ // in order to determine if they are alive -+ // only if one of the pinged nodes does not respond, can the new contact -+ // be added (this prevents DoS flodding with new invalid contacts) -+ this.emit('ping', node.contacts.slice(0, this.numberOfNodesToPing), contact) -+ return this -+ } -+ -+ this._split(node, bitIndex) -+ return this.add(contact) -+} -+ -+// id: Buffer *required* node id -+// n: Integer (Default: Infinity) maximum number of closest contacts to return -+// Return: Array of maximum of `n` closest contacts to the node id -+KBucket.prototype.closest = function (id, n) { -+ if (!Buffer.isBuffer(id)) throw new TypeError('id is not a Buffer') -+ if (n === undefined) n = Infinity -+ if (typeof n !== 'number' || isNaN(n) || n <= 0) throw new TypeError('n is not positive number') -+ var contacts = [] -+ -+ for (var nodes = [ this.root ], bitIndex = 0; nodes.length > 0 && contacts.length < n;) { -+ var node = nodes.pop() -+ if (node.contacts === null) { -+ var detNode = this._determineNode(node, id, bitIndex++) -+ nodes.push(node.left === detNode ? node.right : node.left) -+ nodes.push(detNode) -+ } else { -+ contacts = contacts.concat(node.contacts) -+ } -+ } -+ -+ var self = this -+ function compare (a, b) { -+ return self.distance(a.id, id) - self.distance(b.id, id) -+ } -+ -+ return contacts.sort(compare).slice(0, n) -+} -+ -+// Counts the number of contacts recursively. -+// If this is a leaf, just return the number of contacts contained. Otherwise, -+// return the length of the high and low branches combined. -+KBucket.prototype.count = function () { -+ // return this.toArray().length -+ var count = 0 -+ for (var nodes = [ this.root ]; nodes.length > 0;) { -+ var node = nodes.pop() -+ if (node.contacts === null) nodes.push(node.right, node.left) -+ else count += node.contacts.length -+ } -+ return count -+} -+ -+// Determines whether the id at the bitIndex is 0 or 1. -+// Return left leaf if `id` at `bitIndex` is 0, right leaf otherwise -+// node: internal object that has 2 leafs: left and right -+// id: a Buffer to compare localNodeId with -+// bitIndex: the bitIndex to which bit to check in the id Buffer -+KBucket.prototype._determineNode = function (node, id, bitIndex) { -+ // **NOTE** remember that id is a Buffer and has granularity of -+ // bytes (8 bits), whereas the bitIndex is the _bit_ index (not byte) -+ -+ // id's that are too short are put in low bucket (1 byte = 8 bits) -+ // parseInt(bitIndex / 8) finds how many bytes the bitIndex describes -+ // bitIndex % 8 checks if we have extra bits beyond byte multiples -+ // if number of bytes is <= no. of bytes described by bitIndex and there -+ // are extra bits to consider, this means id has less bits than what -+ // bitIndex describes, id therefore is too short, and will be put in low -+ // bucket -+ var bytesDescribedByBitIndex = ~~(bitIndex / 8) -+ var bitIndexWithinByte = bitIndex % 8 -+ if ((id.length <= bytesDescribedByBitIndex) && (bitIndexWithinByte !== 0)) return node.left -+ -+ var byteUnderConsideration = id[bytesDescribedByBitIndex] -+ -+ // byteUnderConsideration is an integer from 0 to 255 represented by 8 bits -+ // where 255 is 11111111 and 0 is 00000000 -+ // in order to find out whether the bit at bitIndexWithinByte is set -+ // we construct Math.pow(2, (7 - bitIndexWithinByte)) which will consist -+ // of all bits being 0, with only one bit set to 1 -+ // for example, if bitIndexWithinByte is 3, we will construct 00010000 by -+ // Math.pow(2, (7 - 3)) -> Math.pow(2, 4) -> 16 -+ if (byteUnderConsideration & Math.pow(2, (7 - bitIndexWithinByte))) return node.right -+ -+ return node.left -+} -+ -+// Get a contact by its exact ID. -+// If this is a leaf, loop through the bucket contents and return the correct -+// contact if we have it or null if not. If this is an inner node, determine -+// which branch of the tree to traverse and repeat. -+// id: Buffer *required* The ID of the contact to fetch. -+KBucket.prototype.get = function (id) { -+ if (!Buffer.isBuffer(id)) throw new TypeError('id is not a Buffer') -+ var bitIndex = 0 -+ -+ var node = this.root -+ while (node.contacts === null) { -+ node = this._determineNode(node, id, bitIndex++) -+ } -+ -+ var index = this._indexOf(node, id) // index of uses contact id for matching -+ return index >= 0 ? node.contacts[index] : null -+} -+ -+// node: internal object that has 2 leafs: left and right -+// id: Buffer Contact node id. -+// Returns the index of the contact with the given id if it exists -+KBucket.prototype._indexOf = function (node, id) { -+ for (var i = 0; i < node.contacts.length; ++i) { -+ if (bufferEquals(node.contacts[i].id, id)) return i -+ } -+ -+ return -1 -+} -+ -+// id: Buffer *required* The ID of the contact to remove. -+KBucket.prototype.remove = function (id) { -+ if (!Buffer.isBuffer(id)) throw new TypeError('id is not a Buffer') -+ var bitIndex = 0 -+ -+ var node = this.root -+ while (node.contacts === null) { -+ node = this._determineNode(node, id, bitIndex++) -+ } -+ -+ var index = this._indexOf(node, id) -+ if (index >= 0) { -+ var contact = node.contacts.splice(index, 1)[0] -+ this.emit('removed', contact) -+ } -+ -+ return this -+} -+ -+// Splits the node, redistributes contacts to the new nodes, and marks the -+// node that was split as an inner node of the binary tree of nodes by -+// setting this.root.contacts = null -+// node: *required* node for splitting -+// bitIndex: *required* the bitIndex to which byte to check in the Buffer -+// for navigating the binary tree -+KBucket.prototype._split = function (node, bitIndex) { -+ node.left = createNode() -+ node.right = createNode() -+ -+ // redistribute existing contacts amongst the two newly created nodes -+ for (var i = 0; i < node.contacts.length; ++i) { -+ var contact = node.contacts[i] -+ this._determineNode(node, contact.id, bitIndex).contacts.push(contact) -+ } -+ node.contacts = null // mark as inner tree node -+ -+ // don't split the "far away" node -+ // we check where the local node would end up and mark the other one as -+ // "dontSplit" (i.e. "far away") -+ var detNode = this._determineNode(node, this.localNodeId, bitIndex) -+ var otherNode = node.left === detNode ? node.right : node.left -+ otherNode.dontSplit = true -+} -+ -+// Returns all the contacts contained in the tree as an array. -+// If this is a leaf, return a copy of the bucket. `slice` is used so that we -+// don't accidentally leak an internal reference out that might be accidentally -+// misused. If this is not a leaf, return the union of the low and high -+// branches (themselves also as arrays). -+KBucket.prototype.toArray = function () { -+ var result = [] -+ for (var nodes = [ this.root ]; nodes.length > 0;) { -+ var node = nodes.pop() -+ if (node.contacts === null) nodes.push(node.right, node.left) -+ else result = result.concat(node.contacts) -+ } -+ return result -+} -+ -+// Updates the contact selected by the arbiter. -+// If the selection is our old contact and the candidate is some new contact -+// then the new contact is abandoned (not added). -+// If the selection is our old contact and the candidate is our old contact -+// then we are refreshing the contact and it is marked as most recently -+// contacted (by being moved to the right/end of the bucket array). -+// If the selection is our new contact, the old contact is removed and the new -+// contact is marked as most recently contacted. -+// node: internal object that has 2 leafs: left and right -+// contact: *required* the contact to update -+// index: *required* the index in the bucket where contact exists -+// (index has already been computed in a previous calculation) -+KBucket.prototype._update = function (node, index, contact) { -+ // sanity check -+ if (!bufferEquals(node.contacts[index].id, contact.id)) throw new Error('wrong index for _update') -+ -+ var incumbent = node.contacts[index] -+ var selection = this.arbiter(incumbent, contact) -+ // if the selection is our old contact and the candidate is some new -+ // contact, then there is nothing to do -+ if (selection === incumbent && incumbent !== contact) return -+ -+ node.contacts.splice(index, 1) // remove old contact -+ node.contacts.push(selection) // add more recent contact version -+ this.emit('updated', incumbent, selection) -+} -+ -+}, -+"GLfdOwEqEQXzKAc3EHpabzKpfHA2hJ26e9Hx5Uzan1M=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var zlib_inflate = require('./zlib/inflate'); -+var utils = require('./utils/common'); -+var strings = require('./utils/strings'); -+var c = require('./zlib/constants'); -+var msg = require('./zlib/messages'); -+var ZStream = require('./zlib/zstream'); -+var GZheader = require('./zlib/gzheader'); -+ -+var toString = Object.prototype.toString; -+ -+/** -+ * class Inflate -+ * -+ * Generic JS-style wrapper for zlib calls. If you don't need -+ * streaming behaviour - use more simple functions: [[inflate]] -+ * and [[inflateRaw]]. -+ **/ -+ -+/* internal -+ * inflate.chunks -> Array -+ * -+ * Chunks of output data, if [[Inflate#onData]] not overridden. -+ **/ -+ -+/** -+ * Inflate.result -> Uint8Array|Array|String -+ * -+ * Uncompressed result, generated by default [[Inflate#onData]] -+ * and [[Inflate#onEnd]] handlers. Filled after you push last chunk -+ * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you -+ * push a chunk with explicit flush (call [[Inflate#push]] with -+ * `Z_SYNC_FLUSH` param). -+ **/ -+ -+/** -+ * Inflate.err -> Number -+ * -+ * Error code after inflate finished. 0 (Z_OK) on success. -+ * Should be checked if broken data possible. -+ **/ -+ -+/** -+ * Inflate.msg -> String -+ * -+ * Error message, if [[Inflate.err]] != 0 -+ **/ -+ -+ -+/** -+ * new Inflate(options) -+ * - options (Object): zlib inflate options. -+ * -+ * Creates new inflator instance with specified params. Throws exception -+ * on bad params. Supported options: -+ * -+ * - `windowBits` -+ * - `dictionary` -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information on these. -+ * -+ * Additional options, for internal needs: -+ * -+ * - `chunkSize` - size of generated data chunks (16K by default) -+ * - `raw` (Boolean) - do raw inflate -+ * - `to` (String) - if equal to 'string', then result will be converted -+ * from utf8 to utf16 (javascript) string. When string output requested, -+ * chunk length can differ from `chunkSize`, depending on content. -+ * -+ * By default, when no options set, autodetect deflate/gzip data format via -+ * wrapper header. -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9]) -+ * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]); -+ * -+ * var inflate = new pako.Inflate({ level: 3}); -+ * -+ * inflate.push(chunk1, false); -+ * inflate.push(chunk2, true); // true -> last chunk -+ * -+ * if (inflate.err) { throw new Error(inflate.err); } -+ * -+ * console.log(inflate.result); -+ * ``` -+ **/ -+function Inflate(options) { -+ if (!(this instanceof Inflate)) return new Inflate(options); -+ -+ this.options = utils.assign({ -+ chunkSize: 16384, -+ windowBits: 0, -+ to: '' -+ }, options || {}); -+ -+ var opt = this.options; -+ -+ // Force window size for `raw` data, if not set directly, -+ // because we have no header for autodetect. -+ if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { -+ opt.windowBits = -opt.windowBits; -+ if (opt.windowBits === 0) { opt.windowBits = -15; } -+ } -+ -+ // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate -+ if ((opt.windowBits >= 0) && (opt.windowBits < 16) && -+ !(options && options.windowBits)) { -+ opt.windowBits += 32; -+ } -+ -+ // Gzip header has no info about windows size, we can do autodetect only -+ // for deflate. So, if window size not set, force it to max when gzip possible -+ if ((opt.windowBits > 15) && (opt.windowBits < 48)) { -+ // bit 3 (16) -> gzipped data -+ // bit 4 (32) -> autodetect gzip/deflate -+ if ((opt.windowBits & 15) === 0) { -+ opt.windowBits |= 15; -+ } -+ } -+ -+ this.err = 0; // error code, if happens (0 = Z_OK) -+ this.msg = ''; // error message -+ this.ended = false; // used to avoid multiple onEnd() calls -+ this.chunks = []; // chunks of compressed data -+ -+ this.strm = new ZStream(); -+ this.strm.avail_out = 0; -+ -+ var status = zlib_inflate.inflateInit2( -+ this.strm, -+ opt.windowBits -+ ); -+ -+ if (status !== c.Z_OK) { -+ throw new Error(msg[status]); -+ } -+ -+ this.header = new GZheader(); -+ -+ zlib_inflate.inflateGetHeader(this.strm, this.header); -+ -+ // Setup dictionary -+ if (opt.dictionary) { -+ // Convert data if needed -+ if (typeof opt.dictionary === 'string') { -+ opt.dictionary = strings.string2buf(opt.dictionary); -+ } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { -+ opt.dictionary = new Uint8Array(opt.dictionary); -+ } -+ if (opt.raw) { //In raw mode we need to set the dictionary early -+ status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary); -+ if (status !== c.Z_OK) { -+ throw new Error(msg[status]); -+ } -+ } -+ } -+} -+ -+/** -+ * Inflate#push(data[, mode]) -> Boolean -+ * - data (Uint8Array|Array|ArrayBuffer|String): input data -+ * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. -+ * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. -+ * -+ * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with -+ * new output chunks. Returns `true` on success. The last data block must have -+ * mode Z_FINISH (or `true`). That will flush internal pending buffers and call -+ * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you -+ * can use mode Z_SYNC_FLUSH, keeping the decompression context. -+ * -+ * On fail call [[Inflate#onEnd]] with error code and return false. -+ * -+ * We strongly recommend to use `Uint8Array` on input for best speed (output -+ * format is detected automatically). Also, don't skip last param and always -+ * use the same type in your code (boolean or number). That will improve JS speed. -+ * -+ * For regular `Array`-s make sure all elements are [0..255]. -+ * -+ * ##### Example -+ * -+ * ```javascript -+ * push(chunk, false); // push one of data chunks -+ * ... -+ * push(chunk, true); // push last chunk -+ * ``` -+ **/ -+Inflate.prototype.push = function (data, mode) { -+ var strm = this.strm; -+ var chunkSize = this.options.chunkSize; -+ var dictionary = this.options.dictionary; -+ var status, _mode; -+ var next_out_utf8, tail, utf8str; -+ -+ // Flag to properly process Z_BUF_ERROR on testing inflate call -+ // when we check that all output data was flushed. -+ var allowBufError = false; -+ -+ if (this.ended) { return false; } -+ _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); -+ -+ // Convert data if needed -+ if (typeof data === 'string') { -+ // Only binary strings can be decompressed on practice -+ strm.input = strings.binstring2buf(data); -+ } else if (toString.call(data) === '[object ArrayBuffer]') { -+ strm.input = new Uint8Array(data); -+ } else { -+ strm.input = data; -+ } -+ -+ strm.next_in = 0; -+ strm.avail_in = strm.input.length; -+ -+ do { -+ if (strm.avail_out === 0) { -+ strm.output = new utils.Buf8(chunkSize); -+ strm.next_out = 0; -+ strm.avail_out = chunkSize; -+ } -+ -+ status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ -+ -+ if (status === c.Z_NEED_DICT && dictionary) { -+ status = zlib_inflate.inflateSetDictionary(this.strm, dictionary); -+ } -+ -+ if (status === c.Z_BUF_ERROR && allowBufError === true) { -+ status = c.Z_OK; -+ allowBufError = false; -+ } -+ -+ if (status !== c.Z_STREAM_END && status !== c.Z_OK) { -+ this.onEnd(status); -+ this.ended = true; -+ return false; -+ } -+ -+ if (strm.next_out) { -+ if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) { -+ -+ if (this.options.to === 'string') { -+ -+ next_out_utf8 = strings.utf8border(strm.output, strm.next_out); -+ -+ tail = strm.next_out - next_out_utf8; -+ utf8str = strings.buf2string(strm.output, next_out_utf8); -+ -+ // move tail -+ strm.next_out = tail; -+ strm.avail_out = chunkSize - tail; -+ if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); } -+ -+ this.onData(utf8str); -+ -+ } else { -+ this.onData(utils.shrinkBuf(strm.output, strm.next_out)); -+ } -+ } -+ } -+ -+ // When no more input data, we should check that internal inflate buffers -+ // are flushed. The only way to do it when avail_out = 0 - run one more -+ // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. -+ // Here we set flag to process this error properly. -+ // -+ // NOTE. Deflate does not return error in this case and does not needs such -+ // logic. -+ if (strm.avail_in === 0 && strm.avail_out === 0) { -+ allowBufError = true; -+ } -+ -+ } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END); -+ -+ if (status === c.Z_STREAM_END) { -+ _mode = c.Z_FINISH; -+ } -+ -+ // Finalize on the last chunk. -+ if (_mode === c.Z_FINISH) { -+ status = zlib_inflate.inflateEnd(this.strm); -+ this.onEnd(status); -+ this.ended = true; -+ return status === c.Z_OK; -+ } -+ -+ // callback interim results if Z_SYNC_FLUSH. -+ if (_mode === c.Z_SYNC_FLUSH) { -+ this.onEnd(c.Z_OK); -+ strm.avail_out = 0; -+ return true; -+ } -+ -+ return true; -+}; -+ -+ -+/** -+ * Inflate#onData(chunk) -> Void -+ * - chunk (Uint8Array|Array|String): output data. Type of array depends -+ * on js engine support. When string output requested, each chunk -+ * will be string. -+ * -+ * By default, stores data blocks in `chunks[]` property and glue -+ * those in `onEnd`. Override this handler, if you need another behaviour. -+ **/ -+Inflate.prototype.onData = function (chunk) { -+ this.chunks.push(chunk); -+}; -+ -+ -+/** -+ * Inflate#onEnd(status) -> Void -+ * - status (Number): inflate status. 0 (Z_OK) on success, -+ * other if not. -+ * -+ * Called either after you tell inflate that the input stream is -+ * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) -+ * or if an error happened. By default - join collected chunks, -+ * free memory and fill `results` / `err` properties. -+ **/ -+Inflate.prototype.onEnd = function (status) { -+ // On success - join -+ if (status === c.Z_OK) { -+ if (this.options.to === 'string') { -+ // Glue & convert here, until we teach pako to send -+ // utf8 aligned strings to onData -+ this.result = this.chunks.join(''); -+ } else { -+ this.result = utils.flattenChunks(this.chunks); -+ } -+ } -+ this.chunks = []; -+ this.err = status; -+ this.msg = this.strm.msg; -+}; -+ -+ -+/** -+ * inflate(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * Decompress `data` with inflate/ungzip and `options`. Autodetect -+ * format via wrapper header by default. That's why we don't provide -+ * separate `ungzip` method. -+ * -+ * Supported options are: -+ * -+ * - windowBits -+ * -+ * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) -+ * for more information. -+ * -+ * Sugar (options): -+ * -+ * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify -+ * negative windowBits implicitly. -+ * - `to` (String) - if equal to 'string', then result will be converted -+ * from utf8 to utf16 (javascript) string. When string output requested, -+ * chunk length can differ from `chunkSize`, depending on content. -+ * -+ * -+ * ##### Example: -+ * -+ * ```javascript -+ * var pako = require('pako') -+ * , input = pako.deflate([1,2,3,4,5,6,7,8,9]) -+ * , output; -+ * -+ * try { -+ * output = pako.inflate(input); -+ * } catch (err) -+ * console.log(err); -+ * } -+ * ``` -+ **/ -+function inflate(input, options) { -+ var inflator = new Inflate(options); -+ -+ inflator.push(input, true); -+ -+ // That will never happens, if you don't cheat with options :) -+ if (inflator.err) { throw inflator.msg || msg[inflator.err]; } -+ -+ return inflator.result; -+} -+ -+ -+/** -+ * inflateRaw(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * The same as [[inflate]], but creates raw data, without wrapper -+ * (header and adler32 crc). -+ **/ -+function inflateRaw(input, options) { -+ options = options || {}; -+ options.raw = true; -+ return inflate(input, options); -+} -+ -+ -+/** -+ * ungzip(data[, options]) -> Uint8Array|Array|String -+ * - data (Uint8Array|Array|String): input data to decompress. -+ * - options (Object): zlib inflate options. -+ * -+ * Just shortcut to [[inflate]], because it autodetects format -+ * by header.content. Done for convenience. -+ **/ -+ -+ -+exports.Inflate = Inflate; -+exports.inflate = inflate; -+exports.inflateRaw = inflateRaw; -+exports.ungzip = inflate; -+ -+}, -+"GPfIdzPbGKx8YYCTAWYB0GkbItuUcnJXoSLDtQh/PZk=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = { -+ "name": "pino", -+ "version": "6.11.3", -+ "description": "super fast, all natural json logger", -+ "main": "pino.js", -+ "browser": "./browser.js", -+ "files": [ -+ "pino.js", -+ "bin.js", -+ "browser.js", -+ "pretty.js", -+ "usage.txt", -+ "test", -+ "docs", -+ "example.js", -+ "lib" -+ ], -+ "scripts": { -+ "docs": "docsify serve", -+ "browser-test": "airtap --local 8080 test/browser*test.js", -+ "lint": "eslint .", -+ "test": "npm run lint && tap --100 test/*test.js test/*/*test.js", -+ "test-ci": "npm run lint && tap test/*test.js test/*/*test.js --coverage-report=lcovonly", -+ "cov-ui": "tap --coverage-report=html test/*test.js test/*/*test.js", -+ "bench": "node benchmarks/utils/runbench all", -+ "bench-basic": "node benchmarks/utils/runbench basic", -+ "bench-object": "node benchmarks/utils/runbench object", -+ "bench-deep-object": "node benchmarks/utils/runbench deep-object", -+ "bench-multi-arg": "node benchmarks/utils/runbench multi-arg", -+ "bench-longs-tring": "node benchmarks/utils/runbench long-string", -+ "bench-child": "node benchmarks/utils/runbench child", -+ "bench-child-child": "node benchmarks/utils/runbench child-child", -+ "bench-child-creation": "node benchmarks/utils/runbench child-creation", -+ "bench-formatters": "node benchmarks/utils/runbench formatters", -+ "update-bench-doc": "node benchmarks/utils/generate-benchmark-doc > docs/benchmarks.md" -+ }, -+ "bin": { -+ "pino": "./bin.js" -+ }, -+ "precommit": "test", -+ "repository": { -+ "type": "git", -+ "url": "git+https://github.com/pinojs/pino.git" -+ }, -+ "keywords": [ -+ "fast", -+ "logger", -+ "stream", -+ "json" -+ ], -+ "author": "Matteo Collina ", -+ "contributors": [ -+ "David Mark Clements ", -+ "James Sumners ", -+ "Thomas Watson Steen (https://twitter.com/wa7son)" -+ ], -+ "license": "MIT", -+ "bugs": { -+ "url": "https://github.com/pinojs/pino/issues" -+ }, -+ "homepage": "http://getpino.io", -+ "devDependencies": { -+ "airtap": "4.0.3", -+ "benchmark": "^2.1.4", -+ "bole": "^4.0.0", -+ "bunyan": "^1.8.14", -+ "docsify-cli": "^4.4.1", -+ "eslint": "^7.17.0", -+ "eslint-config-standard": "^16.0.2", -+ "eslint-plugin-import": "^2.22.1", -+ "eslint-plugin-node": "^11.1.0", -+ "eslint-plugin-promise": "^4.2.1", -+ "execa": "^5.0.0", -+ "fastbench": "^1.0.1", -+ "flush-write-stream": "^2.0.0", -+ "import-fresh": "^3.2.1", -+ "log": "^6.0.0", -+ "loglevel": "^1.6.7", -+ "pino-pretty": "^4.1.0", -+ "pre-commit": "^1.2.2", -+ "proxyquire": "^2.1.3", -+ "pump": "^3.0.0", -+ "semver": "^7.0.0", -+ "split2": "^3.1.1", -+ "steed": "^1.1.3", -+ "strip-ansi": "^6.0.0", -+ "tap": "^15.0.1", -+ "tape": "^5.0.0", -+ "through2": "^4.0.0", -+ "winston": "^3.3.3" -+ }, -+ "dependencies": { -+ "fast-redact": "^3.0.0", -+ "fast-safe-stringify": "^2.0.7", -+ "flatstr": "^1.0.12", -+ "pino-std-serializers": "^3.1.0", -+ "quick-format-unescaped": "^4.0.3", -+ "sonic-boom": "^1.0.2" -+ } -+ -+,"_resolved": "https://registry.npmjs.org/pino/-/pino-6.11.3.tgz" -+,"_integrity": "sha512-drPtqkkSf0ufx2gaea3TryFiBHdNIdXKf5LN0hTM82SXI4xVIve2wLwNg92e1MT6m3jASLu6VO7eGY6+mmGeyw==" -+,"_from": "pino@6.11.3" -+} -+}, -+"GcBIC04wuj/eoeu+b2uDD8l8f8WagY82fMvedHXeORU=": -+function (require, module, exports, __dirname, __filename) { -+exports.UINT32 = require('./lib/uint32') -+exports.UINT64 = require('./lib/uint64') -+}, -+"Gj/Aw3ZmLq/jxngFIuA1Kx6DQBpm1ddjGzvt9qmDaws=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = class Nanoguard { -+ constructor () { -+ this._tick = 0 -+ this._fns = [] -+ this._dep = null -+ } -+ -+ get waiting () { -+ return this._tick > 0 -+ } -+ -+ depend (dep) { -+ if (this._dep !== null) throw new Error('Can only depend on one other guard currently') -+ this._dep = dep -+ } -+ -+ wait () { -+ this._tick++ -+ } -+ -+ continue (cb, err, val) { -+ if (this._tick === 1) process.nextTick(continueNT, this) -+ else this._tick-- -+ if (cb) cb(err, val) -+ } -+ -+ waitAndContinue () { -+ let once = false -+ this.wait() -+ return () => { -+ if (once) return false -+ once = true -+ this.continue() -+ return true -+ } -+ } -+ -+ continueSync (cb, err, val) { -+ if (--this._tick) return -+ while (this._fns !== null && this._fns.length) this._ready(this._fns.pop()) -+ if (cb) cb(err, val) -+ } -+ -+ destroy () { -+ const fns = this._fns -+ if (fns) return -+ this._fns = null -+ while (fns.length) fns.pop()() -+ } -+ -+ ready (fn) { -+ if (this._fns === null || this._tick === 0) this._ready(fn) -+ else this._fns.push(fn) -+ } -+ -+ _ready (fn) { -+ if (this._dep === null) fn() -+ else this._dep.ready(fn) -+ } -+} -+ -+function continueNT (guard) { -+ guard.continueSync() -+} -+ -+}, -+"Gkkgd6s18fHFANTg7jEgWNiB/ymcq2jvIZcVgXSm3Ls=": -+function (require, module, exports, __dirname, __filename) { -+/** -+* -+* VALIDATE: nonnegative-integer -+* -+* -+* DESCRIPTION: -+* - Validates if a value is a nonnegative integer. -+* -+* -+* NOTES: -+* [1] -+* -+* -+* TODO: -+* [1] -+* -+* -+* LICENSE: -+* MIT -+* -+* Copyright (c) 2015. Athan Reines. -+* -+* -+* AUTHOR: -+* Athan Reines. kgryte@gmail.com. 2015. -+* -+*/ -+ -+'use strict'; -+ -+// MODULES // -+ -+var isInteger = require( 'validate.io-integer' ); -+ -+ -+// IS NONNEGATIVE INTEGER // -+ -+/** -+* FUNCTION: isNonNegativeInteger( value ) -+* Validates if a value is a nonnegative integer. -+* -+* @param {*} value - value to be validated -+* @returns {Boolean} boolean indicating if a value is a nonnegative integer -+*/ -+function isNonNegativeInteger( value ) { -+ return isInteger( value ) && value >= 0; -+} // end FUNCTION isNonNegativeInteger() -+ -+ -+// EXPORTS // -+ -+module.exports = isNonNegativeInteger; -+ -+}, -+"Gmtw1+DERyFlMXQBEBLsBq2YP2cCXR6YMqMCyQP1TO4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const http = require('http'); -+const https = require('https'); -+const resolveALPN = require('resolve-alpn'); -+const QuickLRU = require('quick-lru'); -+const Http2ClientRequest = require('./client-request'); -+const calculateServerName = require('./utils/calculate-server-name'); -+const urlToOptions = require('./utils/url-to-options'); -+ -+const cache = new QuickLRU({maxSize: 100}); -+const queue = new Map(); -+ -+const installSocket = (agent, socket, options) => { -+ socket._httpMessage = {shouldKeepAlive: true}; -+ -+ const onFree = () => { -+ agent.emit('free', socket, options); -+ }; -+ -+ socket.on('free', onFree); -+ -+ const onClose = () => { -+ agent.removeSocket(socket, options); -+ }; -+ -+ socket.on('close', onClose); -+ -+ const onRemove = () => { -+ agent.removeSocket(socket, options); -+ socket.off('close', onClose); -+ socket.off('free', onFree); -+ socket.off('agentRemove', onRemove); -+ }; -+ -+ socket.on('agentRemove', onRemove); -+ -+ agent.emit('free', socket, options); -+}; -+ -+const resolveProtocol = async options => { -+ const name = `${options.host}:${options.port}:${options.ALPNProtocols.sort()}`; -+ -+ if (!cache.has(name)) { -+ if (queue.has(name)) { -+ const result = await queue.get(name); -+ return result.alpnProtocol; -+ } -+ -+ const {path, agent} = options; -+ options.path = options.socketPath; -+ -+ const resultPromise = resolveALPN(options); -+ queue.set(name, resultPromise); -+ -+ try { -+ const {socket, alpnProtocol} = await resultPromise; -+ cache.set(name, alpnProtocol); -+ -+ options.path = path; -+ -+ if (alpnProtocol === 'h2') { -+ // https://github.com/nodejs/node/issues/33343 -+ socket.destroy(); -+ } else { -+ const {globalAgent} = https; -+ const defaultCreateConnection = https.Agent.prototype.createConnection; -+ -+ if (agent) { -+ if (agent.createConnection === defaultCreateConnection) { -+ installSocket(agent, socket, options); -+ } else { -+ socket.destroy(); -+ } -+ } else if (globalAgent.createConnection === defaultCreateConnection) { -+ installSocket(globalAgent, socket, options); -+ } else { -+ socket.destroy(); -+ } -+ } -+ -+ queue.delete(name); -+ -+ return alpnProtocol; -+ } catch (error) { -+ queue.delete(name); -+ -+ throw error; -+ } -+ } -+ -+ return cache.get(name); -+}; -+ -+module.exports = async (input, options, callback) => { -+ if (typeof input === 'string' || input instanceof URL) { -+ input = urlToOptions(new URL(input)); -+ } -+ -+ if (typeof options === 'function') { -+ callback = options; -+ options = undefined; -+ } -+ -+ options = { -+ ALPNProtocols: ['h2', 'http/1.1'], -+ ...input, -+ ...options, -+ resolveSocket: true -+ }; -+ -+ if (!Array.isArray(options.ALPNProtocols) || options.ALPNProtocols.length === 0) { -+ throw new Error('The `ALPNProtocols` option must be an Array with at least one entry'); -+ } -+ -+ options.protocol = options.protocol || 'https:'; -+ const isHttps = options.protocol === 'https:'; -+ -+ options.host = options.hostname || options.host || 'localhost'; -+ options.session = options.tlsSession; -+ options.servername = options.servername || calculateServerName(options); -+ options.port = options.port || (isHttps ? 443 : 80); -+ options._defaultAgent = isHttps ? https.globalAgent : http.globalAgent; -+ -+ const agents = options.agent; -+ -+ if (agents) { -+ if (agents.addRequest) { -+ throw new Error('The `options.agent` object can contain only `http`, `https` or `http2` properties'); -+ } -+ -+ options.agent = agents[isHttps ? 'https' : 'http']; -+ } -+ -+ if (isHttps) { -+ const protocol = await resolveProtocol(options); -+ -+ if (protocol === 'h2') { -+ if (agents) { -+ options.agent = agents.http2; -+ } -+ -+ return new Http2ClientRequest(options, callback); -+ } -+ } -+ -+ return http.request(options, callback); -+}; -+ -+module.exports.protocolCache = cache; -+ -+}, -+"Gskh3Vli1jBsZEmoztpW6ZBO26tTZK3JjV83Ji+K6F4=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const ctz = require('count-trailing-zeros') -+ -+module.exports = () => new Bitfield() -+ -+class Page { -+ constructor (level) { -+ const buf = new Uint8Array(level ? 8456 : 4360) -+ const b = buf.byteOffset -+ -+ this.buffer = buf -+ this.bits = level ? null : new Uint32Array(buf.buffer, b, 1024) -+ this.children = level ? new Array(32768) : null -+ this.level = level -+ -+ this.allOne = level -+ ? [ -+ new Uint32Array(buf.buffer, b, 1024), -+ new Uint32Array(buf.buffer, b + 4096, 32), -+ new Uint32Array(buf.buffer, b + 4224, 1) -+ ] -+ : [ -+ this.bits, -+ new Uint32Array(buf.buffer, b + 4096, 32), -+ new Uint32Array(buf.buffer, b + 4224, 1) -+ ] -+ -+ this.oneOne = level -+ ? [ -+ new Uint32Array(buf.buffer, b + 4228, 1024), -+ new Uint32Array(buf.buffer, b + 8324, 32), -+ new Uint32Array(buf.buffer, b + 8452, 1) -+ ] -+ : [ -+ this.bits, -+ new Uint32Array(buf.buffer, b + 4228, 32), -+ new Uint32Array(buf.buffer, b + 4356, 1) -+ ] -+ } -+} -+ -+const ZEROS = [new Page(0), new Page(1), new Page(2), new Page(3)] -+const MASK = new Uint32Array(32) -+const MASK_INCL = new Uint32Array(32) -+ -+for (var i = 0; i < 32; i++) { -+ MASK[i] = Math.pow(2, 31 - i) - 1 -+ MASK_INCL[i] = Math.pow(2, 32 - i) - 1 -+} -+ -+const LITTLE_ENDIAN = new Uint8Array(MASK.buffer, MASK.byteOffset, 1)[0] === 0xff -+ -+class Bitfield { -+ constructor () { -+ this.length = 32768 -+ this.littleEndian = LITTLE_ENDIAN -+ -+ this._path = new Uint16Array(5) -+ this._offsets = new Uint16Array(this._path.buffer, this._path.byteOffset + 2, 4) -+ this._parents = new Array(4).fill(null) -+ this._page = new Page(0) -+ this._allocs = 1 -+ } -+ -+ last () { -+ var page = this._page -+ var b = 0 -+ -+ while (true) { -+ for (var i = 2; i >= 0; i--) { -+ const c = ctz(page.oneOne[i][b]) -+ if (c === 32) return -1 -+ b = (b << 5) + (31 - c) -+ } -+ -+ this._path[page.level] = b -+ if (!page.level) return defactor(this._path) -+ page = page.children[b] -+ b = 0 -+ } -+ } -+ -+ set (index, bit) { -+ const page = this._getPage(index, bit) -+ if (!page) return false -+ -+ const i = this._path[0] -+ const r = i & 31 -+ const b = i >>> 5 -+ const prev = page.bits[b] -+ -+ page.bits[b] = bit -+ ? (prev | (0x80000000 >>> r)) -+ : (prev & ~(0x80000000 >>> r)) -+ -+ const upd = page.bits[b] -+ if (upd === prev) return false -+ -+ this._updateAllOne(page, b, upd) -+ this._updateOneOne(page, b, upd) -+ -+ return true -+ } -+ -+ get (index) { -+ const page = this._getPage(index, false) -+ if (!page) return false -+ -+ const i = this._path[0] -+ const r = i & 31 -+ -+ return (page.bits[i >>> 5] & (0x80000000 >>> r)) !== 0 -+ } -+ -+ iterator () { -+ return new Iterator(this) -+ } -+ -+ fill (val, start, end) { -+ if (!start) start = 0 -+ if (val === true) return this._fillBit(true, start, end === 0 ? end : (end || this.length)) -+ if (val === false) return this._fillBit(false, start, end === 0 ? end : (end || this.length)) -+ this._fillBuffer(val, start, end === 0 ? end : (end || (start + 8 * val.length))) -+ } -+ -+ grow () { -+ if (this._page.level === 3) throw new Error('Cannot grow beyond ' + this.length) -+ const page = this._page -+ this._page = new Page(page.level + 1) -+ this._page.children[0] = page -+ if (this._page.level === 3) this.length = Number.MAX_SAFE_INTEGER -+ else this.length *= 32768 -+ } -+ -+ _fillBuffer (buf, start, end) { -+ if ((start & 7) || (end & 7)) throw new Error('Offsets must be a multiple of 8') -+ -+ start /= 8 -+ while (end > this.length) this.grow() -+ end /= 8 -+ -+ const offset = start -+ var page = this._getPage(8 * start, true) -+ -+ while (start < end) { -+ const delta = end - start < 4096 ? end - start : 4096 -+ const s = start - offset -+ -+ start += this._setPageBuffer(page, buf.subarray(s, s + delta), start & 1023) -+ if (start !== end) page = this._nextPage(page, 8 * start) -+ } -+ } -+ -+ _fillBit (bit, start, end) { -+ var page = this._getPage(start, bit) -+ -+ // TODO: this can be optimised a lot in the case of end - start > 32768 -+ // in that case clear levels of 32768 ** 2 instead etc -+ -+ while (start < end) { -+ const delta = end - start < 32768 ? end - start : 32768 -+ start += this._setPageBits(page, bit, start & 32767, delta) -+ if (start !== end) page = this._nextPage(page, start) -+ } -+ } -+ -+ _nextPage (page, start) { -+ const i = ++this._offsets[page.level] -+ return i === 32768 -+ ? this._getPage(start, true) -+ : this._parents[page.level].children[i] || this._addPage(this._parents[page.level], i) -+ } -+ -+ _setPageBuffer (page, buf, start) { -+ new Uint8Array(page.bits.buffer, page.bits.byteOffset, page.bits.length * 4).set(buf, start) -+ start >>>= 2 -+ this._update(page, start, start + (buf.length >>> 2) + (buf.length & 3 ? 1 : 0)) -+ return buf.length -+ } -+ -+ _setPageBits (page, bit, start, end) { -+ const s = start >>> 5 -+ const e = end >>> 5 -+ const sm = 0xffffffff >>> (start & 31) -+ const em = ~(0xffffffff >>> (end & 31)) -+ -+ if (s === e) { -+ page.bits[s] = bit -+ ? page.bits[s] | (sm & em) -+ : page.bits[s] & ~(sm & em) -+ this._update(page, s, s + 1) -+ return end - start -+ } -+ -+ page.bits[s] = bit -+ ? page.bits[s] | sm -+ : page.bits[s] & (~sm) -+ -+ if (e - s > 2) page.bits.fill(bit ? 0xffffffff : 0, s + 1, e - 1) -+ -+ if (e === 1024) { -+ page.bits[e - 1] = bit ? 0xffffffff : 0 -+ this._update(page, s, e) -+ return end - start -+ } -+ -+ page.bits[e] = bit -+ ? page.bits[e] | em -+ : page.bits[e] & (~em) -+ -+ this._update(page, s, e + 1) -+ return end - start -+ } -+ -+ _update (page, start, end) { -+ for (; start < end; start++) { -+ const upd = page.bits[start] -+ this._updateAllOne(page, start, upd) -+ this._updateOneOne(page, start, upd) -+ } -+ } -+ -+ _updateAllOne (page, b, upd) { -+ var i = 1 -+ -+ do { -+ for (; i < 3; i++) { -+ const buf = page.allOne[i] -+ const r = b & 31 -+ const prev = buf[b >>>= 5] -+ buf[b] = upd === 0xffffffff -+ ? (prev | (0x80000000 >>> r)) -+ : (prev & ~(0x80000000 >>> r)) -+ upd = buf[b] -+ if (upd === prev) return -+ } -+ -+ b += this._offsets[page.level] -+ page = this._parents[page.level] -+ i = 0 -+ } while (page) -+ } -+ -+ _updateOneOne (page, b, upd) { -+ var i = 1 -+ -+ do { -+ for (; i < 3; i++) { -+ const buf = page.oneOne[i] -+ const r = b & 31 -+ const prev = buf[b >>>= 5] -+ buf[b] = upd !== 0 -+ ? (prev | (0x80000000 >>> r)) -+ : (prev & ~(0x80000000 >>> r)) -+ upd = buf[b] -+ if (upd === prev) return -+ } -+ -+ b += this._offsets[page.level] -+ page = this._parents[page.level] -+ i = 0 -+ -+ if (upd === 0 && page) { -+ // all zeros, non root -> free page -+ page.children[this._offsets[page.level - 1]] = undefined -+ } -+ } while (page) -+ } -+ -+ _getPage (index, createIfMissing) { -+ factor(index, this._path) -+ -+ while (index >= this.length) { -+ if (!createIfMissing) return null -+ this.grow() -+ } -+ -+ var page = this._page -+ -+ for (var i = page.level; i > 0 && page; i--) { -+ const p = this._path[i] -+ this._parents[i - 1] = page -+ page = page.children[p] || (createIfMissing ? this._addPage(page, p) : null) -+ } -+ -+ return page -+ } -+ -+ _addPage (page, i) { -+ this._allocs++ -+ page = page.children[i] = new Page(page.level - 1) -+ return page -+ } -+} -+ -+class Iterator { -+ constructor (bitfield) { -+ this._bitfield = bitfield -+ this._path = new Uint16Array(5) -+ this._offsets = new Uint16Array(this._path.buffer, this._path.byteOffset + 2, 4) -+ this._parents = new Array(4).fill(null) -+ this._page = null -+ this._allocs = bitfield._allocs -+ -+ this.seek(0) -+ } -+ -+ seek (index) { -+ this._allocs = this._bitfield._allocs -+ -+ if (index >= this._bitfield.length) { -+ this._page = null -+ return this -+ } -+ -+ factor(index, this._path) -+ -+ this._page = this._bitfield._page -+ for (var i = this._page.level; i > 0; i--) { -+ this._parents[i - 1] = this._page -+ this._page = this._page.children[this._path[i]] || ZEROS[i - 1] -+ } -+ -+ return this -+ } -+ -+ next (bit) { -+ return bit ? this.nextTrue() : this.nextFalse() -+ } -+ -+ nextFalse () { -+ if (this._allocs !== this._bitfield._allocs) { -+ // If a page has been alloced while we are iterating -+ // and we have a zero page in our path we need to reseek -+ // in case that page has been overwritten -+ this.seek(defactor(this._path)) -+ } -+ -+ var page = this._page -+ var b = this._path[0] -+ var mask = MASK_INCL -+ -+ while (page) { -+ for (var i = 0; i < 3; i++) { -+ const r = b & 31 -+ const clz = Math.clz32((~page.allOne[i][b >>>= 5]) & mask[r]) -+ if (clz !== 32) return this._downLeftFalse(page, i, b, clz) -+ mask = MASK -+ } -+ -+ b = this._offsets[page.level] -+ page = this._parents[page.level] -+ } -+ -+ return -1 -+ } -+ -+ _downLeftFalse (page, i, b, clz) { -+ while (true) { -+ while (i) { -+ b = (b << 5) + clz -+ clz = Math.clz32(~page.allOne[--i][b]) -+ } -+ -+ b = (b << 5) + clz -+ -+ if (!page.level) break -+ -+ this._parents[page.level - 1] = page -+ this._path[page.level] = b -+ -+ page = page.children[b] -+ i = 3 -+ clz = b = 0 -+ } -+ -+ this._page = page -+ this._path[0] = b -+ -+ return this._inc() -+ } -+ -+ nextTrue () { -+ var page = this._page -+ var b = this._path[0] -+ var mask = MASK_INCL -+ -+ while (page) { -+ for (var i = 0; i < 3; i++) { -+ const r = b & 31 -+ const clz = Math.clz32(page.oneOne[i][b >>>= 5] & mask[r]) -+ if (clz !== 32) return this._downLeftTrue(page, i, b, clz) -+ mask = MASK -+ } -+ -+ b = this._offsets[page.level] -+ page = this._parents[page.level] -+ } -+ -+ return -1 -+ } -+ -+ _downLeftTrue (page, i, b, clz) { -+ while (true) { -+ while (i) { -+ b = (b << 5) + clz -+ clz = Math.clz32(page.oneOne[--i][b]) -+ } -+ -+ b = (b << 5) + clz -+ -+ if (!page.level) break -+ -+ this._parents[page.level - 1] = page -+ this._path[page.level] = b -+ -+ page = page.children[b] -+ i = 3 -+ clz = b = 0 -+ } -+ -+ this._page = page -+ this._path[0] = b -+ -+ return this._inc() -+ } -+ -+ _inc () { -+ const n = defactor(this._path) -+ if (this._path[0] < 32767) this._path[0]++ -+ else this.seek(n + 1) -+ return n -+ } -+} -+ -+function defactor (out) { -+ return ((((out[3] * 32768 + out[2]) * 32768) + out[1]) * 32768) + out[0] -+} -+ -+function factor (n, out) { -+ n = (n - (out[0] = (n & 32767))) / 32768 -+ n = (n - (out[1] = (n & 32767))) / 32768 -+ out[3] = ((n - (out[2] = (n & 32767))) / 32768) & 32767 -+} -+ -+}, -+"H0M3JlacAn8wi5b/SH6JBgaO94uWtOVFiE5uNGitjYw=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ * Checks if `value` is the -+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) -+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) -+ * -+ * @static -+ * @memberOf _ -+ * @since 0.1.0 -+ * @category Lang -+ * @param {*} value The value to check. -+ * @returns {boolean} Returns `true` if `value` is an object, else `false`. -+ * @example -+ * -+ * _.isObject({}); -+ * // => true -+ * -+ * _.isObject([1, 2, 3]); -+ * // => true -+ * -+ * _.isObject(_.noop); -+ * // => true -+ * -+ * _.isObject(null); -+ * // => false -+ */ -+function isObject(value) { -+ var type = typeof value; -+ return value != null && (type == 'object' || type == 'function'); -+} -+ -+module.exports = isObject; -+ -+}, -+"H4Z5GsL83tC9KWiUGOU1lKqMb3qgNCW//XHE7sjqJKk=": -+function (require, module, exports, __dirname, __filename) { -+assert.notEqual = notEqual -+assert.notOk = notOk -+assert.equal = equal -+assert.ok = assert -+ -+module.exports = assert -+ -+function equal (a, b, m) { -+ assert(a == b, m) // eslint-disable-line eqeqeq -+} -+ -+function notEqual (a, b, m) { -+ assert(a != b, m) // eslint-disable-line eqeqeq -+} -+ -+function notOk (t, m) { -+ assert(!t, m) -+} -+ -+function assert (t, m) { -+ if (!t) throw new Error(m || 'AssertionError') -+} -+ -+}, -+"HF+TmggsQI2hgXx2VCYXh3nUO4YXRNavzBud1/Pz6W8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const setLevelSym = Symbol('pino.setLevel') -+const getLevelSym = Symbol('pino.getLevel') -+const levelValSym = Symbol('pino.levelVal') -+const useLevelLabelsSym = Symbol('pino.useLevelLabels') -+const useOnlyCustomLevelsSym = Symbol('pino.useOnlyCustomLevels') -+const mixinSym = Symbol('pino.mixin') -+ -+const lsCacheSym = Symbol('pino.lsCache') -+const chindingsSym = Symbol('pino.chindings') -+const parsedChindingsSym = Symbol('pino.parsedChindings') -+ -+const asJsonSym = Symbol('pino.asJson') -+const writeSym = Symbol('pino.write') -+const redactFmtSym = Symbol('pino.redactFmt') -+ -+const timeSym = Symbol('pino.time') -+const timeSliceIndexSym = Symbol('pino.timeSliceIndex') -+const streamSym = Symbol('pino.stream') -+const stringifySym = Symbol('pino.stringify') -+const stringifiersSym = Symbol('pino.stringifiers') -+const endSym = Symbol('pino.end') -+const formatOptsSym = Symbol('pino.formatOpts') -+const messageKeySym = Symbol('pino.messageKey') -+const nestedKeySym = Symbol('pino.nestedKey') -+ -+const wildcardFirstSym = Symbol('pino.wildcardFirst') -+ -+// public symbols, no need to use the same pino -+// version for these -+const serializersSym = Symbol.for('pino.serializers') -+const formattersSym = Symbol.for('pino.formatters') -+const hooksSym = Symbol.for('pino.hooks') -+const needsMetadataGsym = Symbol.for('pino.metadata') -+ -+module.exports = { -+ setLevelSym, -+ getLevelSym, -+ levelValSym, -+ useLevelLabelsSym, -+ mixinSym, -+ lsCacheSym, -+ chindingsSym, -+ parsedChindingsSym, -+ asJsonSym, -+ writeSym, -+ serializersSym, -+ redactFmtSym, -+ timeSym, -+ timeSliceIndexSym, -+ streamSym, -+ stringifySym, -+ stringifiersSym, -+ endSym, -+ formatOptsSym, -+ messageKeySym, -+ nestedKeySym, -+ wildcardFirstSym, -+ needsMetadataGsym, -+ useOnlyCustomLevelsSym, -+ formattersSym, -+ hooksSym -+} -+ -+}, -+"HIMsh51rj1fOamCjw2YcYtzbeyrWdUmDMh4zQvLlrw0=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * get-value -+ * -+ * Copyright (c) 2014-2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+module.exports = function(obj, prop, a, b, c) { -+ if (!isObject(obj) || !prop) { -+ return obj; -+ } -+ -+ prop = toString(prop); -+ -+ // allowing for multiple properties to be passed as -+ // a string or array, but much faster (3-4x) than doing -+ // `[].slice.call(arguments)` -+ if (a) prop += '.' + toString(a); -+ if (b) prop += '.' + toString(b); -+ if (c) prop += '.' + toString(c); -+ -+ if (prop in obj) { -+ return obj[prop]; -+ } -+ -+ var segs = prop.split('.'); -+ var len = segs.length; -+ var i = -1; -+ -+ while (obj && (++i < len)) { -+ var key = segs[i]; -+ while (key[key.length - 1] === '\\') { -+ key = key.slice(0, -1) + '.' + segs[++i]; -+ } -+ obj = obj[key]; -+ } -+ return obj; -+}; -+ -+function isObject(val) { -+ return val !== null && (typeof val === 'object' || typeof val === 'function'); -+} -+ -+function toString(val) { -+ if (!val) return ''; -+ if (Array.isArray(val)) { -+ return val.join('.'); -+ } -+ return val; -+} -+ -+}, -+"HIoybM+gwF11BoIlXCFu552jfD9L7XUtzXt9U6xbeq0=": -+function (require, module, exports, __dirname, __filename) { -+var geojsonArea = require('geojson-area'); -+ -+module.exports = rewind; -+ -+function rewind(gj, outer) { -+ switch ((gj && gj.type) || null) { -+ case 'FeatureCollection': -+ gj.features = gj.features.map(curryOuter(rewind, outer)); -+ return gj; -+ case 'Feature': -+ gj.geometry = rewind(gj.geometry, outer); -+ return gj; -+ case 'Polygon': -+ case 'MultiPolygon': -+ return correct(gj, outer); -+ default: -+ return gj; -+ } -+} -+ -+function curryOuter(a, b) { -+ return function(_) { return a(_, b); }; -+} -+ -+function correct(_, outer) { -+ if (_.type === 'Polygon') { -+ _.coordinates = correctRings(_.coordinates, outer); -+ } else if (_.type === 'MultiPolygon') { -+ _.coordinates = _.coordinates.map(curryOuter(correctRings, outer)); -+ } -+ return _; -+} -+ -+function correctRings(_, outer) { -+ outer = !!outer; -+ _[0] = wind(_[0], outer); -+ for (var i = 1; i < _.length; i++) { -+ _[i] = wind(_[i], !outer); -+ } -+ return _; -+} -+ -+function wind(_, dir) { -+ return cw(_) === dir ? _ : _.reverse(); -+} -+ -+function cw(_) { -+ return geojsonArea.ring(_) >= 0; -+} -+ -+}, -+"HMdRqqY4MwbmATKqh8MmRCObZmGBqmIx1QFEFQA90E4=": -+function (require, module, exports, __dirname, __filename) { -+var mkdirp = require('mkdirp') -+var LRU = require('lru-cache') -+var eos = require('end-of-stream') -+var duplexify = require('duplexify') -+var path = require('path') -+var fs = require('fs') -+var createAtomicWriteStream = require('@digidem/fs-write-stream-atomic') -+ -+var noop = function() {} -+ -+var join = function(root, dir) { -+ return path.join(root, path.resolve('/', dir).replace(/^[a-zA-Z]:/, '')) -+} -+ -+var listen = function(stream, opts, cb) { -+ if (!cb) return stream -+ eos(stream, function(err) { -+ if (err) return cb(err) -+ cb(null, opts) -+ }) -+ return stream -+} -+ -+var BlobStore = function(opts) { -+ if (!(this instanceof BlobStore)) return new BlobStore(opts) -+ if (typeof opts === 'string') opts = {path:opts} -+ -+ this.path = opts.path -+ this.cache = LRU(opts.cache || 100) -+ // this.fsCreateWriteStream = opts.atomic ? -+ // createAtomicWriteStream : fs.createWriteStream -+ this.fsCreateWriteStream = createAtomicWriteStream -+} -+ -+BlobStore.prototype.createWriteStream = function(opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ if (opts.name && !opts.key) opts.key = opts.name -+ cb = cb || function () {} -+ -+ var key = join(this.path, opts.key) -+ var dir = path.dirname(key) -+ var cache = this.cache -+ var createWriteStream = this.fsCreateWriteStream -+ -+ var proxy = duplexify() -+ proxy.setReadable(false) -+ -+ function setup () { -+ var w = createWriteStream(key, opts) -+ w.once('finish', function () { -+ cb(null, opts) -+ }) -+ w.once('error', cb) -+ proxy.setWritable(w) -+ } -+ -+ if (cache.get(dir)) { -+ setup() -+ } else { -+ mkdirp(dir, function(err) { -+ if (proxy.destroyed) return -+ if (err) return proxy.destroy(err) -+ cache.set(dir, true) -+ setup() -+ }) -+ } -+ -+ return proxy -+} -+ -+BlobStore.prototype.createReadStream = function(key, opts) { -+ if (key && typeof key === 'object') return this.createReadStream(key.key, key) -+ return fs.createReadStream(join(this.path, key), opts) -+} -+ -+BlobStore.prototype.exists = function(opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ var key = join(this.path, opts.key) -+ fs.stat(key, function(err, stat) { -+ if (err && err.code !== 'ENOENT') return cb(err) -+ cb(null, !!stat) -+ }) -+} -+ -+BlobStore.prototype.remove = function(opts, cb) { -+ if (typeof opts === 'string') opts = {key:opts} -+ if (!opts) opts = noop -+ var key = join(this.path, opts.key) -+ fs.unlink(key, function(err) { -+ if (err && err.code !== 'ENOENT') return cb(err) -+ cb() -+ }) -+} -+ -+module.exports = BlobStore -+ -+}, -+"HPYX8JB38VMWgTdlGlOrwgiNgFkdXVd+J20bcCNSO6E=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate__limit(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $errorKeyword; -+ var $data = 'data' + ($dataLvl || ''); -+ var $isData = it.opts.$data && $schema && $schema.$data, -+ $schemaValue; -+ if ($isData) { -+ out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; -+ $schemaValue = 'schema' + $lvl; -+ } else { -+ $schemaValue = $schema; -+ } -+ var $isMax = $keyword == 'maximum', -+ $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', -+ $schemaExcl = it.schema[$exclusiveKeyword], -+ $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, -+ $op = $isMax ? '<' : '>', -+ $notOp = $isMax ? '>' : '<', -+ $errorKeyword = undefined; -+ if (!($isData || typeof $schema == 'number' || $schema === undefined)) { -+ throw new Error($keyword + ' must be number'); -+ } -+ if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { -+ throw new Error($exclusiveKeyword + ' must be number or boolean'); -+ } -+ if ($isDataExcl) { -+ var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), -+ $exclusive = 'exclusive' + $lvl, -+ $exclType = 'exclType' + $lvl, -+ $exclIsNumber = 'exclIsNumber' + $lvl, -+ $opExpr = 'op' + $lvl, -+ $opStr = '\' + ' + $opExpr + ' + \''; -+ out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; -+ $schemaValueExcl = 'schemaExcl' + $lvl; -+ out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; -+ var $errorKeyword = $exclusiveKeyword; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += ' } else if ( '; -+ if ($isData) { -+ out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; -+ } -+ out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; -+ if ($schema === undefined) { -+ $errorKeyword = $exclusiveKeyword; -+ $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; -+ $schemaValue = $schemaValueExcl; -+ $isData = $isDataExcl; -+ } -+ } else { -+ var $exclIsNumber = typeof $schemaExcl == 'number', -+ $opStr = $op; -+ if ($exclIsNumber && $isData) { -+ var $opExpr = '\'' + $opStr + '\''; -+ out += ' if ( '; -+ if ($isData) { -+ out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; -+ } -+ out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; -+ } else { -+ if ($exclIsNumber && $schema === undefined) { -+ $exclusive = true; -+ $errorKeyword = $exclusiveKeyword; -+ $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; -+ $schemaValue = $schemaExcl; -+ $notOp += '='; -+ } else { -+ if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); -+ if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { -+ $exclusive = true; -+ $errorKeyword = $exclusiveKeyword; -+ $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; -+ $notOp += '='; -+ } else { -+ $exclusive = false; -+ $opStr += '='; -+ } -+ } -+ var $opExpr = '\'' + $opStr + '\''; -+ out += ' if ( '; -+ if ($isData) { -+ out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; -+ } -+ out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; -+ } -+ } -+ $errorKeyword = $errorKeyword || $keyword; -+ var $$outStack = $$outStack || []; -+ $$outStack.push(out); -+ out = ''; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should be ' + ($opStr) + ' '; -+ if ($isData) { -+ out += '\' + ' + ($schemaValue); -+ } else { -+ out += '' + ($schemaValue) + '\''; -+ } -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: '; -+ if ($isData) { -+ out += 'validate.schema' + ($schemaPath); -+ } else { -+ out += '' + ($schema); -+ } -+ out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ var __err = out; -+ out = $$outStack.pop(); -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError([' + (__err) + ']); '; -+ } else { -+ out += ' validate.errors = [' + (__err) + ']; return false; '; -+ } -+ } else { -+ out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' else { '; -+ } -+ return out; -+} -+ -+}, -+"HRkeYVMc1mKWfG98ms7TlcZ9/A/G7AwM/RPMr4bTQ3A=": -+function (require, module, exports, __dirname, __filename) { -+var Buffer = require('buffer').Buffer -+ -+var CHARS = '.PYFGCRLAOEUIDHTNSQJKXBMWVZ_pyfgcrlaoeuidhtnsqjkxbmwvz1234567890' -+ .split('').sort().join('') -+ -+module.exports = function (chars, exports) { -+ chars = chars || CHARS -+ exports = exports || {} -+ if(chars.length !== 64) throw new Error('a base 64 encoding requires 64 chars') -+ -+ var codeToIndex = new Buffer(128) -+ codeToIndex.fill() -+ -+ for(var i = 0; i < 64; i++) { -+ var code = chars.charCodeAt(i) -+ codeToIndex[code] = i -+ } -+ -+ exports.encode = function (data) { -+ var s = '', l = data.length, hang = 0 -+ for(var i = 0; i < l; i++) { -+ var v = data[i] -+ -+ switch (i % 3) { -+ case 0: -+ s += chars[v >> 2] -+ hang = (v & 3) << 4 -+ break; -+ case 1: -+ s += chars[hang | v >> 4] -+ hang = (v & 0xf) << 2 -+ break; -+ case 2: -+ s += chars[hang | v >> 6] -+ s += chars[v & 0x3f] -+ hang = 0 -+ break; -+ } -+ -+ } -+ if(l%3) s += chars[hang] -+ return s -+ } -+ exports.decode = function (str) { -+ var l = str.length, j = 0 -+ var b = new Buffer(~~((l/4)*3)), hang = 0 -+ -+ for(var i = 0; i < l; i++) { -+ var v = codeToIndex[str.charCodeAt(i)] -+ -+ switch (i % 4) { -+ case 0: -+ hang = v << 2; -+ break; -+ case 1: -+ b[j++] = hang | v >> 4 -+ hang = (v << 4) & 0xff -+ break; -+ case 2: -+ b[j++] = hang | v >> 2 -+ hang = (v << 6) & 0xff -+ break; -+ case 3: -+ b[j++] = hang | v -+ break; -+ } -+ -+ } -+ return b -+ } -+ return exports -+} -+ -+module.exports(CHARS, module.exports) -+ -+ -+}, -+"HT5cYhV7G78xYclHEIaaw1lVIfdHiEd4iRQdtsFDBqI=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+var TextDecoder = require("text-encoding").TextDecoder; -+ -+Object.defineProperty(exports, '__esModule', { value: true }); -+ -+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } -+ -+var path = _interopDefault(require('path-source')); -+var array = _interopDefault(require('array-source')); -+var stream = _interopDefault(require('stream-source')); -+var slice = _interopDefault(require('slice-source')); -+ -+var dbf_cancel = function() { -+ return this._source.cancel(); -+}; -+ -+var readBoolean = function(value) { -+ return /^[nf]$/i.test(value) ? false -+ : /^[yt]$/i.test(value) ? true -+ : null; -+}; -+ -+var readDate = function(value) { -+ return new Date(+value.substring(0, 4), value.substring(4, 6) - 1, +value.substring(6, 8)); -+}; -+ -+var readNumber = function(value) { -+ return !(value = value.trim()) || isNaN(value = +value) ? null : value; -+}; -+ -+var readString = function(value) { -+ return value.trim() || null; -+}; -+ -+var types = { -+ B: readNumber, -+ C: readString, -+ D: readDate, -+ F: readNumber, -+ L: readBoolean, -+ M: readNumber, -+ N: readNumber -+}; -+ -+var dbf_read = function() { -+ var that = this, i = 1; -+ return that._source.slice(that._recordLength).then(function(value) { -+ return value && (value[0] !== 0x1a) ? {done: false, value: that._fields.reduce(function(p, f) { -+ p[f.name] = types[f.type](that._decode(value.subarray(i, i += f.length))); -+ return p; -+ }, {})} : {done: true, value: undefined}; -+ }); -+}; -+ -+var view = function(array$$1) { -+ return new DataView(array$$1.buffer, array$$1.byteOffset, array$$1.byteLength); -+}; -+ -+var dbf = function(source, decoder) { -+ source = slice(source); -+ return source.slice(32).then(function(array$$1) { -+ var head = view(array$$1); -+ return source.slice(head.getUint16(8, true) - 32).then(function(array$$1) { -+ return new Dbf(source, decoder, head, view(array$$1)); -+ }); -+ }); -+}; -+ -+function Dbf(source, decoder, head, body) { -+ this._source = source; -+ this._decode = decoder.decode.bind(decoder); -+ this._recordLength = head.getUint16(10, true); -+ this._fields = []; -+ for (var n = 0; body.getUint8(n) !== 0x0d; n += 32) { -+ for (var j = 0; j < 11; ++j) if (body.getUint8(n + j) === 0) break; -+ this._fields.push({ -+ name: this._decode(new Uint8Array(body.buffer, body.byteOffset + n, j)), -+ type: String.fromCharCode(body.getUint8(n + 11)), -+ length: body.getUint8(n + 16) -+ }); -+ } -+} -+ -+var prototype = Dbf.prototype; -+prototype.read = dbf_read; -+prototype.cancel = dbf_cancel; -+ -+function cancel() { -+ return this._source.cancel(); -+} -+ -+var parseMultiPoint = function(record) { -+ var i = 40, j, n = record.getInt32(36, true), coordinates = new Array(n); -+ for (j = 0; j < n; ++j, i += 16) coordinates[j] = [record.getFloat64(i, true), record.getFloat64(i + 8, true)]; -+ return {type: "MultiPoint", coordinates: coordinates}; -+}; -+ -+var parseNull = function() { -+ return null; -+}; -+ -+var parsePoint = function(record) { -+ return {type: "Point", coordinates: [record.getFloat64(4, true), record.getFloat64(12, true)]}; -+}; -+ -+var parsePolygon = function(record) { -+ var i = 44, j, n = record.getInt32(36, true), m = record.getInt32(40, true), parts = new Array(n), points = new Array(m), polygons = [], holes = []; -+ for (j = 0; j < n; ++j, i += 4) parts[j] = record.getInt32(i, true); -+ for (j = 0; j < m; ++j, i += 16) points[j] = [record.getFloat64(i, true), record.getFloat64(i + 8, true)]; -+ -+ parts.forEach(function(i, j) { -+ var ring = points.slice(i, parts[j + 1]); -+ if (ringClockwise(ring)) polygons.push([ring]); -+ else holes.push(ring); -+ }); -+ -+ holes.forEach(function(hole) { -+ polygons.some(function(polygon) { -+ if (ringContainsSome(polygon[0], hole)) { -+ polygon.push(hole); -+ return true; -+ } -+ }) || polygons.push([hole]); -+ }); -+ -+ return polygons.length === 1 -+ ? {type: "Polygon", coordinates: polygons[0]} -+ : {type: "MultiPolygon", coordinates: polygons}; -+}; -+ -+function ringClockwise(ring) { -+ if ((n = ring.length) < 4) return false; -+ var i = 0, n, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; -+ while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; -+ return area >= 0; -+} -+ -+function ringContainsSome(ring, hole) { -+ var i = -1, n = hole.length, c; -+ while (++i < n) { -+ if (c = ringContains(ring, hole[i])) { -+ return c > 0; -+ } -+ } -+ return false; -+} -+ -+function ringContains(ring, point) { -+ var x = point[0], y = point[1], contains = -1; -+ for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { -+ var pi = ring[i], xi = pi[0], yi = pi[1], -+ pj = ring[j], xj = pj[0], yj = pj[1]; -+ if (segmentContains(pi, pj, point)) { -+ return 0; -+ } -+ if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) { -+ contains = -contains; -+ } -+ } -+ return contains; -+} -+ -+function segmentContains(p0, p1, p2) { -+ var x20 = p2[0] - p0[0], y20 = p2[1] - p0[1]; -+ if (x20 === 0 && y20 === 0) return true; -+ var x10 = p1[0] - p0[0], y10 = p1[1] - p0[1]; -+ if (x10 === 0 && y10 === 0) return false; -+ var t = (x20 * x10 + y20 * y10) / (x10 * x10 + y10 * y10); -+ return t < 0 || t > 1 ? false : t === 0 || t === 1 ? true : t * x10 === x20 && t * y10 === y20; -+} -+ -+var parsePolyLine = function(record) { -+ var i = 44, j, n = record.getInt32(36, true), m = record.getInt32(40, true), parts = new Array(n), points = new Array(m); -+ for (j = 0; j < n; ++j, i += 4) parts[j] = record.getInt32(i, true); -+ for (j = 0; j < m; ++j, i += 16) points[j] = [record.getFloat64(i, true), record.getFloat64(i + 8, true)]; -+ return n === 1 -+ ? {type: "LineString", coordinates: points} -+ : {type: "MultiLineString", coordinates: parts.map(function(i, j) { return points.slice(i, parts[j + 1]); })}; -+}; -+ -+var concat = function(a, b) { -+ var ab = new Uint8Array(a.length + b.length); -+ ab.set(a, 0); -+ ab.set(b, a.length); -+ return ab; -+}; -+ -+var shp_read = function() { -+ var that = this; -+ ++that._index; -+ return that._source.slice(12).then(function(array$$1) { -+ if (array$$1 == null) return {done: true, value: undefined}; -+ var header = view(array$$1); -+ -+ // If the record starts with an invalid shape type (see #36), scan ahead in -+ // four-byte increments to find the next valid record, identified by the -+ // expected index, a non-empty content length and a valid shape type. -+ function skip() { -+ return that._source.slice(4).then(function(chunk) { -+ if (chunk == null) return {done: true, value: undefined}; -+ header = view(array$$1 = concat(array$$1.slice(4), chunk)); -+ return header.getInt32(0, false) !== that._index ? skip() : read(); -+ }); -+ } -+ -+ // All records should have at least four bytes (for the record shape type), -+ // so an invalid content length indicates corruption. -+ function read() { -+ var length = header.getInt32(4, false) * 2 - 4, type = header.getInt32(8, true); -+ return length < 0 || (type && type !== that._type) ? skip() : that._source.slice(length).then(function(chunk) { -+ return {done: false, value: type ? that._parse(view(concat(array$$1.slice(8), chunk))) : null}; -+ }); -+ } -+ -+ return read(); -+ }); -+}; -+ -+var parsers = { -+ 0: parseNull, -+ 1: parsePoint, -+ 3: parsePolyLine, -+ 5: parsePolygon, -+ 8: parseMultiPoint, -+ 11: parsePoint, // PointZ -+ 13: parsePolyLine, // PolyLineZ -+ 15: parsePolygon, // PolygonZ -+ 18: parseMultiPoint, // MultiPointZ -+ 21: parsePoint, // PointM -+ 23: parsePolyLine, // PolyLineM -+ 25: parsePolygon, // PolygonM -+ 28: parseMultiPoint // MultiPointM -+}; -+ -+var shp = function(source) { -+ source = slice(source); -+ return source.slice(100).then(function(array$$1) { -+ return new Shp(source, view(array$$1)); -+ }); -+}; -+ -+function Shp(source, header) { -+ var type = header.getInt32(32, true); -+ if (!(type in parsers)) throw new Error("unsupported shape type: " + type); -+ this._source = source; -+ this._type = type; -+ this._index = 0; -+ this._parse = parsers[type]; -+ this.bbox = [header.getFloat64(36, true), header.getFloat64(44, true), header.getFloat64(52, true), header.getFloat64(60, true)]; -+} -+ -+var prototype$2 = Shp.prototype; -+prototype$2.read = shp_read; -+prototype$2.cancel = cancel; -+ -+function noop() {} -+ -+var shapefile_cancel = function() { -+ return Promise.all([ -+ this._dbf && this._dbf.cancel(), -+ this._shp.cancel() -+ ]).then(noop); -+}; -+ -+var shapefile_read = function() { -+ var that = this; -+ return Promise.all([ -+ that._dbf ? that._dbf.read() : {value: {}}, -+ that._shp.read() -+ ]).then(function(results) { -+ var dbf = results[0], shp = results[1]; -+ return shp.done ? shp : { -+ done: false, -+ value: { -+ type: "Feature", -+ properties: dbf.value, -+ geometry: shp.value -+ } -+ }; -+ }); -+}; -+ -+var shapefile = function(shpSource, dbfSource, decoder) { -+ return Promise.all([ -+ shp(shpSource), -+ dbfSource && dbf(dbfSource, decoder) -+ ]).then(function(sources) { -+ return new Shapefile(sources[0], sources[1]); -+ }); -+}; -+ -+function Shapefile(shp$$1, dbf$$1) { -+ this._shp = shp$$1; -+ this._dbf = dbf$$1; -+ this.bbox = shp$$1.bbox; -+} -+ -+var prototype$1 = Shapefile.prototype; -+prototype$1.read = shapefile_read; -+prototype$1.cancel = shapefile_cancel; -+ -+function open(shp$$1, dbf$$1, options) { -+ if (typeof dbf$$1 === "string") { -+ if (!/\.dbf$/.test(dbf$$1)) dbf$$1 += ".dbf"; -+ dbf$$1 = path(dbf$$1, options); -+ } else if (dbf$$1 instanceof ArrayBuffer || dbf$$1 instanceof Uint8Array) { -+ dbf$$1 = array(dbf$$1); -+ } else if (dbf$$1 != null) { -+ dbf$$1 = stream(dbf$$1); -+ } -+ if (typeof shp$$1 === "string") { -+ if (!/\.shp$/.test(shp$$1)) shp$$1 += ".shp"; -+ if (dbf$$1 === undefined) dbf$$1 = path(shp$$1.substring(0, shp$$1.length - 4) + ".dbf", options).catch(function() {}); -+ shp$$1 = path(shp$$1, options); -+ } else if (shp$$1 instanceof ArrayBuffer || shp$$1 instanceof Uint8Array) { -+ shp$$1 = array(shp$$1); -+ } else { -+ shp$$1 = stream(shp$$1); -+ } -+ return Promise.all([shp$$1, dbf$$1]).then(function(sources) { -+ var shp$$1 = sources[0], dbf$$1 = sources[1], encoding = "windows-1252"; -+ if (options && options.encoding != null) encoding = options.encoding; -+ return shapefile(shp$$1, dbf$$1, dbf$$1 && new TextDecoder(encoding)); -+ }); -+} -+ -+function openShp(source, options) { -+ if (typeof source === "string") { -+ if (!/\.shp$/.test(source)) source += ".shp"; -+ source = path(source, options); -+ } else if (source instanceof ArrayBuffer || source instanceof Uint8Array) { -+ source = array(source); -+ } else { -+ source = stream(source); -+ } -+ return Promise.resolve(source).then(shp); -+} -+ -+function openDbf(source, options) { -+ var encoding = "windows-1252"; -+ if (options && options.encoding != null) encoding = options.encoding; -+ encoding = new TextDecoder(encoding); -+ if (typeof source === "string") { -+ if (!/\.dbf$/.test(source)) source += ".dbf"; -+ source = path(source, options); -+ } else if (source instanceof ArrayBuffer || source instanceof Uint8Array) { -+ source = array(source); -+ } else { -+ source = stream(source); -+ } -+ return Promise.resolve(source).then(function(source) { -+ return dbf(source, encoding); -+ }); -+} -+ -+function read(shp$$1, dbf$$1, options) { -+ return open(shp$$1, dbf$$1, options).then(function(source) { -+ var features = [], collection = {type: "FeatureCollection", features: features, bbox: source.bbox}; -+ return source.read().then(function read(result) { -+ if (result.done) return collection; -+ features.push(result.value); -+ return source.read().then(read); -+ }); -+ }); -+} -+ -+exports.open = open; -+exports.openShp = openShp; -+exports.openDbf = openDbf; -+exports.read = read; -+ -+}, -+"HVnKb+KWE30tj/D3xqwlFsBi5qsM5FfmM7BPj3BBBYI=": -+function (require, module, exports, __dirname, __filename) { -+/*! ReadWriteLock - v5.0.0 - 2015-01-16 -+ * Author: Alberto La Rocca (https://github.com/71104) -+ * Released under the MIT license -+ * Copyright (c) 2015 Alberto La Rocca */ -+module.exports=function(){"use strict";function a(){this.readers=0,this.queue=[]}function b(b,c,f){var g;"function"!=typeof b?(e.hasOwnProperty(b)||(e[b]=new a),g=e[b]):(f=c,c=b,g=d),f||(f={});var h=null;f.hasOwnProperty("scope")&&(h=f.scope);var i=function(){var a=!1;return function(){a||(a=!0,g.readers--,g.queue.length&&g.queue[0]())}}();if(g.readers<0||g.queue.length){var j=!1;if(g.queue.push(function(){!j&&g.readers>=0&&(j=!0,g.queue.shift(),g.readers++,c.call(h,i),g.queue.length&&g.queue[0]())}),f.hasOwnProperty("timeout")){var k=null;f.hasOwnProperty("timeoutCallback")&&(k=f.timeoutCallback),setTimeout(function(){j||(j=!0,g.queue.shift(),k&&k.call(f.scope))},f.timeout)}}else g.readers++,c.call(f.scope,i)}function c(b,c,f){var g;"function"!=typeof b?(e.hasOwnProperty(b)||(e[b]=new a),g=e[b]):(f=c,c=b,g=d),f||(f={});var h=null;f.hasOwnProperty("scope")&&(h=f.scope);var i=function(){var a=!1;return function(){a||(a=!0,g.readers=0,g.queue.length&&g.queue[0]())}}();if(g.readers||g.queue.length){var j=!1;if(g.queue.push(function(){j||g.readers||(j=!0,g.queue.shift(),g.readers=-1,c.call(f.scope,i))}),f.hasOwnProperty("timeout")){var k=null;f.hasOwnProperty("timeoutCallback")&&(k=f.timeoutCallback),setTimeout(function(){j||(j=!0,g.queue.shift(),k&&k.call(h))},f.timeout)}}else g.readers=-1,c.call(f.scope,i)}var d=new a,e={};this.readLock=b,this.writeLock=c,this.async={readLock:function(a,c,d){"function"!=typeof a?b(a,function(a){c.call(this,null,a)},d):(c=a,d=c,b(function(a){c.call(this,null,a)},d))},writeLock:function(a,b,d){"function"!=typeof a?c(a,function(a){b.call(this,null,a)},d):(b=a,d=b,c(function(a){b.call(this,null,a)},d))}}}; -+}, -+"HbKuwy90hPGFiuZPELU2sFElqJwtweIj4hJtpiJYxlc=": -+function (require, module, exports, __dirname, __filename) { -+// buffer-equals, but handle 'null' buffer parameters. -+module.exports = function safeBufferEquals (a, b) { -+ if (!a) return !b -+ if (!b) return !a -+ return Buffer.compare(a, b) === 0 -+} -+ -+}, -+"Hc6x2k+HBmKZvlEIUqkQa3MkDfFCWDhbKuEyVdI8Zlo=": -+function (require, module, exports, __dirname, __filename) { -+var baseTrim = require('./_baseTrim'), -+ isObject = require('./isObject'), -+ isSymbol = require('./isSymbol'); -+ -+/** Used as references for various `Number` constants. */ -+var NAN = 0 / 0; -+ -+/** Used to detect bad signed hexadecimal string values. */ -+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; -+ -+/** Used to detect binary string values. */ -+var reIsBinary = /^0b[01]+$/i; -+ -+/** Used to detect octal string values. */ -+var reIsOctal = /^0o[0-7]+$/i; -+ -+/** Built-in method references without a dependency on `root`. */ -+var freeParseInt = parseInt; -+ -+/** -+ * Converts `value` to a number. -+ * -+ * @static -+ * @memberOf _ -+ * @since 4.0.0 -+ * @category Lang -+ * @param {*} value The value to process. -+ * @returns {number} Returns the number. -+ * @example -+ * -+ * _.toNumber(3.2); -+ * // => 3.2 -+ * -+ * _.toNumber(Number.MIN_VALUE); -+ * // => 5e-324 -+ * -+ * _.toNumber(Infinity); -+ * // => Infinity -+ * -+ * _.toNumber('3.2'); -+ * // => 3.2 -+ */ -+function toNumber(value) { -+ if (typeof value == 'number') { -+ return value; -+ } -+ if (isSymbol(value)) { -+ return NAN; -+ } -+ if (isObject(value)) { -+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value; -+ value = isObject(other) ? (other + '') : other; -+ } -+ if (typeof value != 'string') { -+ return value === 0 ? value : +value; -+ } -+ value = baseTrim(value); -+ var isBinary = reIsBinary.test(value); -+ return (isBinary || reIsOctal.test(value)) -+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8) -+ : (reIsBadHex.test(value) ? NAN : +value); -+} -+ -+module.exports = toNumber; -+ -+}, -+"HfAS3T0j/O0HJVpyBHmABFCWh8sfQxrgq5dttDa72JA=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+// https://mathiasbynens.be/notes/javascript-encoding -+// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode -+function ucs2length(str) { -+ const len = str.length; -+ let length = 0; -+ let pos = 0; -+ let value; -+ while (pos < len) { -+ length++; -+ value = str.charCodeAt(pos++); -+ if (value >= 0xd800 && value <= 0xdbff && pos < len) { -+ // high surrogate, and there is a next character -+ value = str.charCodeAt(pos); -+ if ((value & 0xfc00) === 0xdc00) -+ pos++; // low surrogate -+ } -+ } -+ return length; -+} -+exports.default = ucs2length; -+ucs2length.code = 'require("ajv/dist/runtime/ucs2length").default'; -+//# sourceMappingURL=ucs2length.js.map -+}, -+"Hk6T3FVpUObSr+tQzzuU3LOQ2HC4cqsuS+qI19rk5aI=": -+function (require, module, exports, __dirname, __filename) { -+var all = module.exports.all = [ -+ { -+ errno: -2, -+ code: 'ENOENT', -+ description: 'no such file or directory' -+ }, -+ { -+ errno: -1, -+ code: 'UNKNOWN', -+ description: 'unknown error' -+ }, -+ { -+ errno: 0, -+ code: 'OK', -+ description: 'success' -+ }, -+ { -+ errno: 1, -+ code: 'EOF', -+ description: 'end of file' -+ }, -+ { -+ errno: 2, -+ code: 'EADDRINFO', -+ description: 'getaddrinfo error' -+ }, -+ { -+ errno: 3, -+ code: 'EACCES', -+ description: 'permission denied' -+ }, -+ { -+ errno: 4, -+ code: 'EAGAIN', -+ description: 'resource temporarily unavailable' -+ }, -+ { -+ errno: 5, -+ code: 'EADDRINUSE', -+ description: 'address already in use' -+ }, -+ { -+ errno: 6, -+ code: 'EADDRNOTAVAIL', -+ description: 'address not available' -+ }, -+ { -+ errno: 7, -+ code: 'EAFNOSUPPORT', -+ description: 'address family not supported' -+ }, -+ { -+ errno: 8, -+ code: 'EALREADY', -+ description: 'connection already in progress' -+ }, -+ { -+ errno: 9, -+ code: 'EBADF', -+ description: 'bad file descriptor' -+ }, -+ { -+ errno: 10, -+ code: 'EBUSY', -+ description: 'resource busy or locked' -+ }, -+ { -+ errno: 11, -+ code: 'ECONNABORTED', -+ description: 'software caused connection abort' -+ }, -+ { -+ errno: 12, -+ code: 'ECONNREFUSED', -+ description: 'connection refused' -+ }, -+ { -+ errno: 13, -+ code: 'ECONNRESET', -+ description: 'connection reset by peer' -+ }, -+ { -+ errno: 14, -+ code: 'EDESTADDRREQ', -+ description: 'destination address required' -+ }, -+ { -+ errno: 15, -+ code: 'EFAULT', -+ description: 'bad address in system call argument' -+ }, -+ { -+ errno: 16, -+ code: 'EHOSTUNREACH', -+ description: 'host is unreachable' -+ }, -+ { -+ errno: 17, -+ code: 'EINTR', -+ description: 'interrupted system call' -+ }, -+ { -+ errno: 18, -+ code: 'EINVAL', -+ description: 'invalid argument' -+ }, -+ { -+ errno: 19, -+ code: 'EISCONN', -+ description: 'socket is already connected' -+ }, -+ { -+ errno: 20, -+ code: 'EMFILE', -+ description: 'too many open files' -+ }, -+ { -+ errno: 21, -+ code: 'EMSGSIZE', -+ description: 'message too long' -+ }, -+ { -+ errno: 22, -+ code: 'ENETDOWN', -+ description: 'network is down' -+ }, -+ { -+ errno: 23, -+ code: 'ENETUNREACH', -+ description: 'network is unreachable' -+ }, -+ { -+ errno: 24, -+ code: 'ENFILE', -+ description: 'file table overflow' -+ }, -+ { -+ errno: 25, -+ code: 'ENOBUFS', -+ description: 'no buffer space available' -+ }, -+ { -+ errno: 26, -+ code: 'ENOMEM', -+ description: 'not enough memory' -+ }, -+ { -+ errno: 27, -+ code: 'ENOTDIR', -+ description: 'not a directory' -+ }, -+ { -+ errno: 28, -+ code: 'EISDIR', -+ description: 'illegal operation on a directory' -+ }, -+ { -+ errno: 29, -+ code: 'ENONET', -+ description: 'machine is not on the network' -+ }, -+ { -+ errno: 31, -+ code: 'ENOTCONN', -+ description: 'socket is not connected' -+ }, -+ { -+ errno: 32, -+ code: 'ENOTSOCK', -+ description: 'socket operation on non-socket' -+ }, -+ { -+ errno: 33, -+ code: 'ENOTSUP', -+ description: 'operation not supported on socket' -+ }, -+ { -+ errno: 34, -+ code: 'ENOENT', -+ description: 'no such file or directory' -+ }, -+ { -+ errno: 35, -+ code: 'ENOSYS', -+ description: 'function not implemented' -+ }, -+ { -+ errno: 36, -+ code: 'EPIPE', -+ description: 'broken pipe' -+ }, -+ { -+ errno: 37, -+ code: 'EPROTO', -+ description: 'protocol error' -+ }, -+ { -+ errno: 38, -+ code: 'EPROTONOSUPPORT', -+ description: 'protocol not supported' -+ }, -+ { -+ errno: 39, -+ code: 'EPROTOTYPE', -+ description: 'protocol wrong type for socket' -+ }, -+ { -+ errno: 40, -+ code: 'ETIMEDOUT', -+ description: 'connection timed out' -+ }, -+ { -+ errno: 41, -+ code: 'ECHARSET', -+ description: 'invalid Unicode character' -+ }, -+ { -+ errno: 42, -+ code: 'EAIFAMNOSUPPORT', -+ description: 'address family for hostname not supported' -+ }, -+ { -+ errno: 44, -+ code: 'EAISERVICE', -+ description: 'servname not supported for ai_socktype' -+ }, -+ { -+ errno: 45, -+ code: 'EAISOCKTYPE', -+ description: 'ai_socktype not supported' -+ }, -+ { -+ errno: 46, -+ code: 'ESHUTDOWN', -+ description: 'cannot send after transport endpoint shutdown' -+ }, -+ { -+ errno: 47, -+ code: 'EEXIST', -+ description: 'file already exists' -+ }, -+ { -+ errno: 48, -+ code: 'ESRCH', -+ description: 'no such process' -+ }, -+ { -+ errno: 49, -+ code: 'ENAMETOOLONG', -+ description: 'name too long' -+ }, -+ { -+ errno: 50, -+ code: 'EPERM', -+ description: 'operation not permitted' -+ }, -+ { -+ errno: 51, -+ code: 'ELOOP', -+ description: 'too many symbolic links encountered' -+ }, -+ { -+ errno: 52, -+ code: 'EXDEV', -+ description: 'cross-device link not permitted' -+ }, -+ { -+ errno: 53, -+ code: 'ENOTEMPTY', -+ description: 'directory not empty' -+ }, -+ { -+ errno: 54, -+ code: 'ENOSPC', -+ description: 'no space left on device' -+ }, -+ { -+ errno: 55, -+ code: 'EIO', -+ description: 'i/o error' -+ }, -+ { -+ errno: 56, -+ code: 'EROFS', -+ description: 'read-only file system' -+ }, -+ { -+ errno: 57, -+ code: 'ENODEV', -+ description: 'no such device' -+ }, -+ { -+ errno: 58, -+ code: 'ESPIPE', -+ description: 'invalid seek' -+ }, -+ { -+ errno: 59, -+ code: 'ECANCELED', -+ description: 'operation canceled' -+ } -+] -+ -+module.exports.errno = {} -+module.exports.code = {} -+ -+all.forEach(function (error) { -+ module.exports.errno[error.errno] = error -+ module.exports.code[error.code] = error -+}) -+ -+module.exports.custom = require('./custom')(module.exports) -+module.exports.create = module.exports.custom.createError -+ -+}, -+"HlB7Z5AfDVxlAN5+CisP/UXlaWGbjTHUKLkAVf9+PSE=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+function isTLSSocket(socket) { -+ return socket.encrypted; -+} -+const deferToConnect = (socket, fn) => { -+ let listeners; -+ if (typeof fn === 'function') { -+ const connect = fn; -+ listeners = { connect }; -+ } -+ else { -+ listeners = fn; -+ } -+ const hasConnectListener = typeof listeners.connect === 'function'; -+ const hasSecureConnectListener = typeof listeners.secureConnect === 'function'; -+ const hasCloseListener = typeof listeners.close === 'function'; -+ const onConnect = () => { -+ if (hasConnectListener) { -+ listeners.connect(); -+ } -+ if (isTLSSocket(socket) && hasSecureConnectListener) { -+ if (socket.authorized) { -+ listeners.secureConnect(); -+ } -+ else if (!socket.authorizationError) { -+ socket.once('secureConnect', listeners.secureConnect); -+ } -+ } -+ if (hasCloseListener) { -+ socket.once('close', listeners.close); -+ } -+ }; -+ if (socket.writable && !socket.connecting) { -+ onConnect(); -+ } -+ else if (socket.connecting) { -+ socket.once('connect', onConnect); -+ } -+ else if (socket.destroyed && hasCloseListener) { -+ listeners.close(socket._hadError); -+ } -+}; -+exports.default = deferToConnect; -+// For CommonJS default export support -+module.exports = deferToConnect; -+module.exports.default = deferToConnect; -+ -+}, -+"HnkDkn3zOq2zZZ7M5VJmychR2mXObItyOmCjBcHFQiw=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('stream'); -+ -+}, -+"Hp3gLjMN5COt94Rc1C9YoYquTtxVDvshe6eZlOvCz74=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = Timeout -+ -+function Timeout (ms, fn, ctx) { -+ if (!(this instanceof Timeout)) return new Timeout(ms, fn, ctx) -+ this.ms = ms -+ this.ontimeout = fn -+ this.context = ctx || null -+ this.called = false -+ this._timeout = setTimeout(call, ms, this) -+} -+ -+Timeout.prototype.refresh = function () { -+ if (this.called || this.ontimeout === null) return -+ clearTimeout(this._timeout) -+ this._timeout = setTimeout(call, this.ms, this) -+} -+ -+Timeout.prototype.destroy = function () { -+ this.ontimeout = null -+ clearTimeout(this._timeout) -+} -+ -+function call (self) { -+ self.called = true -+ self.ontimeout.call(self.context) -+} -+ -+}, -+"HprxmUdYwEt0AvoClDkYkCiDB+HHudNcP/LvFbb5BdM=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('./polygon-features.json') -+ -+}, -+"HqJZ0IUTKDDo4pjM1fOX4Qd5nrqZANT3wQPfuGoYlYI=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const codegen_1 = require("../../compile/codegen"); -+const error = { -+ message({ keyword, schemaCode }) { -+ const comp = keyword === "maxProperties" ? "more" : "fewer"; -+ return codegen_1.str `must NOT have ${comp} than ${schemaCode} items`; -+ }, -+ params: ({ schemaCode }) => codegen_1._ `{limit: ${schemaCode}}`, -+}; -+const def = { -+ keyword: ["maxProperties", "minProperties"], -+ type: "object", -+ schemaType: "number", -+ $data: true, -+ error, -+ code(cxt) { -+ const { keyword, data, schemaCode } = cxt; -+ const op = keyword === "maxProperties" ? codegen_1.operators.GT : codegen_1.operators.LT; -+ cxt.fail$data(codegen_1._ `Object.keys(${data}).length ${op} ${schemaCode}`); -+ }, -+}; -+exports.default = def; -+//# sourceMappingURL=limitProperties.js.map -+}, -+"I1Bi4+TzdafYd76MMLzewEvICO5kdXjDnHP+bvx3sFU=": -+function (require, module, exports, __dirname, __filename) { -+const binding = require('./lib/binding') -+const Connection = require('./lib/connection') -+const util = require('util') -+const events = require('events') -+const dns = require('dns') -+const set = require('unordered-set') -+ -+const EMPTY = Buffer.alloc(0) -+ -+module.exports = UTP -+ -+function UTP (opts) { -+ if (!(this instanceof UTP)) return new UTP(opts) -+ events.EventEmitter.call(this) -+ -+ this.connections = [] -+ -+ this._sending = [] -+ this._sent = [] -+ this._offset = 0 -+ this._buffer = Buffer.allocUnsafe(2 * 65536) -+ this._handle = Buffer.alloc(binding.sizeof_utp_napi_t) -+ this._nextConnection = Buffer.alloc(binding.sizeof_utp_napi_connection_t) -+ this._address = null -+ this._inited = false -+ this._refed = true -+ this._closing = false -+ this._closed = false -+ this._allowHalfOpen = !opts || opts.allowHalfOpen !== false -+ this._acceptConnections = new Uint32Array(this._handle.buffer, this._handle.byteOffset + binding.offsetof_utp_napi_t_accept_connections, 1) -+ this.maxConnections = 0 -+} -+ -+util.inherits(UTP, events.EventEmitter) -+ -+UTP.createServer = function (opts, onconnection) { -+ if (typeof opts === 'function') return UTP.createServer(null, opts) -+ const server = new UTP(opts) -+ if (onconnection) server.on('connection', onconnection) -+ return server -+} -+ -+UTP.connect = function (port, host, opts) { -+ const udp = new UTP(opts) -+ return udp.connect(port, host).on('close', ononeoffclose) -+} -+ -+UTP.prototype._init = function () { -+ this._inited = true -+ -+ binding.utp_napi_init(this._handle, this, -+ this._nextConnection, -+ this._buffer, -+ this._onmessage, -+ this._onsend, -+ this._onconnection, -+ this._onclose, -+ this._realloc -+ ) -+ -+ if (!this._refed) this.unref() -+} -+ -+UTP.prototype.firewall = function (yes) { -+ this._acceptConnections[0] = yes ? 0 : 1 -+} -+ -+UTP.prototype.ref = function () { -+ if (this._inited) binding.utp_napi_ref(this._handle) -+ this._refed = true -+} -+ -+UTP.prototype.unref = function () { -+ if (this._inited) binding.utp_napi_unref(this._handle) -+ this._refed = false -+} -+ -+UTP.prototype.address = function () { -+ if (!this._address) throw new Error('Socket not bound') -+ return { -+ address: this._address, -+ family: 'IPv4', -+ port: binding.utp_napi_local_port(this._handle) -+ } -+} -+ -+UTP.prototype.send = function (buf, offset, len, port, host, cb) { -+ if (!cb) cb = noop -+ if (!isIP(host)) return this._resolveAndSend(buf, offset, len, port, host, cb) -+ if (this._closing) return process.nextTick(cb, new Error('Socket is closed')) -+ if (!this._address) this.bind(0) -+ -+ var send = this._sent.pop() -+ if (!send) { -+ send = new SendRequest() -+ binding.utp_napi_send_request_init(send._handle, send) -+ } -+ -+ send._index = this._sending.push(send) - 1 -+ send._buffer = buf -+ send._callback = cb -+ -+ binding.utp_napi_send(this._handle, send._handle, send._buffer, offset, len, port, host) -+} -+ -+UTP.prototype._resolveAndSend = function (buf, offset, len, port, host, cb) { -+ const self = this -+ -+ dns.lookup(host, onlookup) -+ -+ function onlookup (err, ip) { -+ if (err) return cb(err) -+ if (!ip) return cb(new Error('Could not resolve ' + host)) -+ self.send(buf, offset, len, port, ip, cb) -+ } -+} -+ -+UTP.prototype.close = function (onclose) { -+ if (this._closed) return process.nextTick(callOnClose, this, onclose) -+ if (onclose) this.once('close', onclose) -+ if (this._closing) return -+ this._closing = true -+ this._closeMaybe() -+} -+ -+UTP.prototype._closeMaybe = function () { -+ if (this._closing && !this.connections.length && !this._sending.length && this._inited && !this._closed) { -+ this._closed = true -+ binding.utp_napi_close(this._handle) -+ } -+} -+ -+UTP.prototype.connect = function (port, ip) { -+ if (!this._inited) this.bind() -+ if (!ip) ip = '127.0.0.1' -+ const conn = new Connection(this, port, ip, null, this._allowHalfOpen) -+ if (!isIP(ip)) conn._resolveAndConnect(port, ip) -+ else conn._connect(port, ip || '127.0.0.1') -+ return conn -+} -+ -+UTP.prototype.listen = function (port, ip, onlistening) { -+ if (!this._address) this.bind(port, ip, onlistening) -+ this.firewall(false) -+} -+ -+UTP.prototype.bind = function (port, ip, onlistening) { -+ if (typeof port === 'function') return this.bind(0, null, port) -+ if (typeof ip === 'function') return this.bind(port, null, ip) -+ if (!port) port = 0 -+ if (!ip) ip = '0.0.0.0' -+ -+ if (!this._inited) this._init() -+ if (this._closing) return -+ -+ if (this._address) { -+ this.emit('error', new Error('Socket already bound')) -+ return -+ } -+ -+ if (onlistening) this.once('listening', onlistening) -+ if (!isIP(ip)) return this._resolveAndBind(port, ip) -+ -+ this._address = ip -+ -+ try { -+ binding.utp_napi_bind(this._handle, port, ip) -+ } catch (err) { -+ this._address = null -+ process.nextTick(emitError, this, err) -+ return -+ } -+ -+ process.nextTick(emitListening, this) -+} -+ -+UTP.prototype._resolveAndBind = function (port, host) { -+ const self = this -+ -+ dns.lookup(host, function (err, ip) { -+ if (err) return self.emit('error', err) -+ self.bind(port, ip) -+ }) -+} -+ -+UTP.prototype._realloc = function () { -+ this._buffer = Buffer.allocUnsafe(this._buffer.length) -+ this._offset = 0 -+ return this._buffer -+} -+ -+UTP.prototype._onmessage = function (size, port, address) { -+ if (size < 0) { -+ this.emit('error', new Error('Read failed (status: ' + size + ')')) -+ return EMPTY -+ } -+ -+ const message = this._buffer.slice(this._offset, this._offset += size) -+ this.emit('message', message, { address, family: 'IPv4', port }) -+ -+ if (this._buffer.length - this._offset <= 65536) { -+ this._buffer = Buffer.allocUnsafe(this._buffer.length) -+ this._offset = 0 -+ return this._buffer -+ } -+ -+ return EMPTY -+} -+ -+UTP.prototype._onsend = function (send, status) { -+ const cb = send._callback -+ -+ send._callback = send._buffer = null -+ set.remove(this._sending, send) -+ this._sent.push(send) -+ if (this._closing) this._closeMaybe() -+ -+ cb(status < 0 ? new Error('Send failed (status: ' + status + ')') : null) -+} -+ -+UTP.prototype._onconnection = function (port, addr) { -+ const conn = new Connection(this, port, addr, this._nextConnection, this._allowHalfOpen) -+ process.nextTick(emitConnection, this, conn) -+ this._nextConnection = Buffer.alloc(binding.sizeof_utp_napi_connection_t) -+ return this._nextConnection -+} -+ -+UTP.prototype._onclose = function () { -+ binding.utp_napi_destroy(this._handle, this._sent.map(toHandle)) -+ this._handle = null -+ this.emit('close') -+} -+ -+function SendRequest () { -+ this._handle = Buffer.alloc(binding.sizeof_utp_napi_send_request_t) -+ this._buffer = null -+ this._callback = null -+ this._index = null -+} -+ -+function noop () {} -+ -+function isIP (ip) { -+ return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(ip) -+} -+ -+function toHandle (obj) { -+ return obj._handle -+} -+ -+function callOnClose (self, onclose) { -+ if (onclose) onclose.call(self) -+} -+ -+function emitListening (self) { -+ self.emit('listening') -+} -+ -+function emitConnection (self, connection) { -+ self.emit('connection', connection) -+} -+ -+function emitError (self, err) { -+ self.emit('error', err) -+} -+ -+function ononeoffclose () { -+ this._utp.close() -+} -+ -+}, -+"I5mpIaPzbahgy7vfBsTxX3ov1BEfBO50vjcRhRo+bcs=": -+function (require, module, exports, __dirname, __filename) { -+var discovery = require('discovery-channel') -+var pump = require('pump') -+var events = require('events') -+var util = require('util') -+var net = require('net') -+var toBuffer = require('to-buffer') -+var crypto = require('crypto') -+var lpmessage = require('length-prefixed-message') -+var connections = require('connections') -+var debug = require('debug')('discovery-swarm') -+ -+try { -+ var utp = require('utp-native') -+} catch (err) { -+ // do nothing -+} -+ -+var PEER_SEEN = 1 -+var PEER_BANNED = 2 -+ -+var HANDSHAKE_TIMEOUT = 5000 -+var CONNECTION_TIMEOUT = 3000 -+var RECONNECT_WAIT = [1000, 1000, 5000, 15000] -+// var DEFAULT_SIZE = 100 // TODO enable max connections -+ -+module.exports = Swarm -+ -+function Swarm (opts) { -+ if (!(this instanceof Swarm)) return new Swarm(opts) -+ if (!opts) opts = {} -+ events.EventEmitter.call(this) -+ -+ var self = this -+ -+ this.maxConnections = opts.maxConnections || 0 -+ this.totalConnections = 0 -+ -+ this.connections = [] -+ this.id = opts.id || crypto.randomBytes(32) -+ this.destroyed = false -+ -+ this._stream = opts.stream -+ this._options = opts || {} -+ this._whitelist = opts.whitelist || [] -+ this._discovery = null -+ this._tcp = opts.tcp === false ? null : net.createServer().on('connection', onconnection) -+ this._utp = opts.utp === false || !utp ? null : utp().on('connection', onconnection) -+ this._tcpConnections = this._tcp && connections(this._tcp) -+ this._adding = null -+ this._listening = false -+ -+ this._peersIds = {} -+ this._peersSeen = {} -+ this._peersQueued = [] -+ -+ if (this._options.discovery !== false) { -+ this.on('listening', this._ondiscover) -+ } -+ -+ function onconnection (connection) { -+ var type = this === self._tcp ? 'tcp' : 'utp' -+ debug('inbound connection type=%s ip=%s:%d', type, connection.remoteAddress, connection.remotePort) -+ connection.on('error', onerror) -+ self.totalConnections++ -+ self._onconnection(connection, type, null) -+ } -+} -+ -+util.inherits(Swarm, events.EventEmitter) -+ -+Swarm.prototype.close = -+Swarm.prototype.destroy = function (onclose) { -+ if (this.destroyed) return process.nextTick(onclose || noop) -+ if (onclose) this.once('close', onclose) -+ if (this._listening && this._adding) return this.once('listening', this.destroy) -+ -+ this.destroyed = true -+ if (this._discovery) this._discovery.destroy() -+ -+ var self = this -+ var missing = 0 -+ -+ if (this._utp) { -+ missing++ -+ for (var i = 0; i < this._utp.connections.length; i++) { -+ this._utp.connections[i].destroy() -+ } -+ } -+ -+ if (this._tcp) { -+ missing++ -+ this._tcpConnections.destroy() -+ } -+ -+ if (this._listening) { -+ if (this._tcp) this._tcp.close(onserverclose) -+ if (this._utp) this._utp.close(onserverclose) -+ } else { -+ this.emit('close') -+ } -+ -+ function onserverclose () { -+ if (!--missing) self.emit('close') -+ } -+} -+ -+Swarm.prototype.__defineGetter__('queued', function () { -+ return this._peersQueued.length -+}) -+ -+Swarm.prototype.__defineGetter__('connecting', function () { -+ return this.totalConnections - this.connections.length -+}) -+ -+Swarm.prototype.__defineGetter__('connected', function () { -+ return this.connections.length -+}) -+ -+Swarm.prototype.join = function (name, opts, cb) { -+ if (typeof opts === 'function') return this.join(name, {}, opts) -+ name = toBuffer(name) -+ if (!opts) opts = {} -+ if (typeof opts.announce === 'undefined') opts.announce = true -+ -+ if (!this._listening && !this._adding) this._listenNext() -+ -+ if (this._adding) { -+ this._adding.push({ name: name, opts: opts, cb: cb }) -+ } else { -+ var port -+ if (opts.announce) port = this.address().port -+ this._discovery.join(name, port, { impliedPort: opts.announce && !!this._utp }, cb) -+ } -+} -+ -+Swarm.prototype.leave = function (name) { -+ name = toBuffer(name) -+ -+ if (this._adding) { -+ for (var i = 0; i < this._adding.length; i++) { -+ if (name.equals(this._adding[i].name)) { -+ this._adding.splice(i, 1) -+ return -+ } -+ } -+ } else { -+ this._discovery.leave(name, this.address() ? this.address().port : 0) -+ } -+} -+ -+Swarm.prototype.addPeer = function (name, peer) { -+ peer = peerify(peer, toBuffer(name)) -+ if (this._peersSeen[peer.id]) return -+ if (this._whitelist.length && this._whitelist.indexOf(peer.host) === -1) return -+ this._peersSeen[peer.id] = PEER_SEEN -+ this._peersQueued.push(peer) -+ this.emit('peer', peer) -+ this._kick() -+} -+ -+Swarm.prototype.removePeer = function (name, peer) { -+ peer = peerify(peer, toBuffer(name)) -+ this._peersSeen[peer.id] = PEER_BANNED -+ this.emit('peer-banned', peer, { reason: 'application' }) -+} -+ -+Swarm.prototype._dropPeer = function (peer) { -+ delete this._peersSeen[peer.id] -+ this.emit('drop', peer) -+} -+ -+Swarm.prototype.address = function () { -+ return this._tcp ? this._tcp.address() : this._utp.address() -+} -+ -+Swarm.prototype._ondiscover = function () { -+ var self = this -+ var joins = this._adding -+ -+ if (this._options.dns !== false) { -+ if (!this._options.dns || this._options.dns === true) this._options.dns = {} -+ this._options.dns.socket = this._utp -+ } -+ -+ if (this._options.dht !== false) { -+ if (!this._options.dht || this._options.dht === true) this._options.dht = {} -+ this._options.dht.socket = this._utp -+ } -+ this._discovery = discovery(this._options) -+ this._discovery.on('peer', onpeer) -+ this._discovery.on('whoami', onwhoami) -+ this._adding = null -+ -+ if (!joins) return -+ for (var i = 0; i < joins.length; i++) this.join(joins[i].name, joins[i].opts, joins[i].cb) -+ -+ function onwhoami (me) { -+ self._peersSeen[me.host + ':' + me.port] = PEER_BANNED -+ } -+ -+ function onpeer (channel, peer) { -+ var id = peer.host + ':' + peer.port -+ var longId = id + '@' + (channel ? channel.toString('hex') : '') -+ if (self._whitelist.length && self._whitelist.indexOf(peer.host) === -1) { -+ self.emit('peer-rejected', peer, { reason: 'whitelist' }) -+ return -+ } -+ var peerSeen = self._peersSeen[id] || self._peersSeen[longId] -+ if (peerSeen) { -+ self.emit('peer-rejected', peer, { reason: (peerSeen === PEER_BANNED) ? 'banned' : 'duplicate' }) -+ return -+ } -+ self._peersSeen[longId] = PEER_SEEN -+ self._peersQueued.push(peerify(peer, channel)) -+ self.emit('peer', peer) -+ self._kick() -+ } -+} -+ -+Swarm.prototype._kick = function () { -+ if (this.maxConnections && this.totalConnections >= this.maxConnections) return -+ if (this.destroyed) return -+ -+ var self = this -+ var connected = false -+ var didTimeOut = false -+ var next = this._peersQueued.shift() -+ while (next && this._peersSeen[next.id] === PEER_BANNED) { -+ next = this._peersQueued.shift() -+ } -+ -+ if (!next) return -+ -+ this.totalConnections++ -+ this.emit('connecting', next) -+ debug('connecting %s retries=%d', next.id, next.retries) -+ -+ var tcpSocket = null -+ var utpSocket = null -+ var tcpClosed = true -+ var utpClosed = true -+ -+ if (this._tcp) { -+ tcpClosed = false -+ tcpSocket = net.connect(next.port, next.host) -+ tcpSocket.on('connect', onconnect) -+ tcpSocket.on('error', onerror) -+ tcpSocket.on('close', onclose) -+ this._tcpConnections.add(tcpSocket) -+ } -+ -+ if (this._utp) { -+ utpClosed = false -+ utpSocket = this._utp.connect(next.port, next.host) -+ utpSocket.on('connect', ondeferredconnect) -+ utpSocket.on('error', onerror) -+ utpSocket.on('close', onclose) -+ } -+ -+ var timeout = setTimeoutUnref(ontimeout, CONNECTION_TIMEOUT) -+ -+ function ondeferredconnect () { -+ if (!self._tcp || tcpClosed) return onconnect.call(utpSocket) -+ setTimeout(function () { -+ if (!utpClosed && !connected) onconnect.call(utpSocket) -+ }, 500) -+ } -+ -+ function ontimeout () { -+ debug('timeout %s', next.id) -+ didTimeOut = true -+ if (utpSocket) utpSocket.destroy() -+ if (tcpSocket) tcpSocket.destroy() -+ } -+ -+ function cleanup () { -+ clearTimeout(timeout) -+ if (utpSocket) utpSocket.removeListener('close', onclose) -+ if (tcpSocket) tcpSocket.removeListener('close', onclose) -+ } -+ -+ function onclose () { -+ if (this === utpSocket) utpClosed = true -+ if (this === tcpSocket) tcpClosed = true -+ if (tcpClosed && utpClosed) { -+ debug('onclose utp+tcp %s will-requeue=%d', next.id, !connected) -+ cleanup() -+ if (!connected) { -+ self.totalConnections-- -+ self.emit('connect-failed', next, { timedout: didTimeOut }) -+ self._requeue(next) -+ } -+ } -+ } -+ -+ function onconnect () { -+ connected = true -+ cleanup() -+ -+ var type = this === utpSocket ? 'utp' : 'tcp' -+ debug('onconnect %s type=%s', next.id, type) -+ if (type === 'utp' && tcpSocket) tcpSocket.destroy() -+ if (type === 'tcp' && utpSocket) utpSocket.destroy() -+ -+ self._onconnection(this, type, next) -+ } -+} -+ -+Swarm.prototype._requeue = function (peer) { -+ if (this.destroyed) return -+ -+ var self = this -+ var wait = peer.retries >= RECONNECT_WAIT.length ? 0 : RECONNECT_WAIT[peer.retries++] -+ if (wait) setTimeoutUnref(requeue, wait) -+ else this._dropPeer(peer) -+ -+ function requeue () { -+ self._peersQueued.push(peer) -+ self._kick() -+ } -+} -+ -+var connectionDebugIdCounter = 0 -+Swarm.prototype._onconnection = function (connection, type, peer) { -+ var self = this -+ var idHex = this.id.toString('hex') -+ var remoteIdHex -+ -+ // internal variables used for debugging -+ connection._debugId = ++connectionDebugIdCounter -+ connection._debugStartTime = Date.now() -+ -+ var info = { -+ type: type, -+ initiator: !!peer, -+ id: null, -+ host: peer ? peer.host : connection.remoteAddress, -+ port: peer ? peer.port : connection.remotePort, -+ channel: peer ? peer.channel : null -+ } -+ this.emit('handshaking', connection, info) -+ -+ connection.on('close', onclose) -+ -+ if (this._stream) { -+ var wire = connection -+ connection = this._stream(info) -+ connection._debugId = wire._debugId -+ connection._debugStartTime = wire._debugStartTime -+ if (connection.id) idHex = connection.id.toString('hex') -+ connection.on('handshake', onhandshake) -+ if (this._options.connect) this._options.connect(connection, wire) -+ else pump(wire, connection, wire) -+ } else { -+ handshake(connection, this.id, onhandshake) -+ } -+ -+ var wrap = { -+ info: info, -+ connection: connection -+ } -+ -+ var timeout = setTimeoutUnref(ontimeout, HANDSHAKE_TIMEOUT) -+ if (this.destroyed) connection.destroy() -+ -+ function ontimeout () { -+ self.emit('handshake-timeout', connection, info) -+ connection.destroy() -+ } -+ -+ function onclose () { -+ clearTimeout(timeout) -+ self.totalConnections-- -+ self.emit('connection-closed', connection, info) -+ -+ var i = self.connections.indexOf(connection) -+ if (i > -1) { -+ var last = self.connections.pop() -+ if (last !== connection) self.connections[i] = last -+ } -+ -+ if (remoteIdHex && self._peersIds[remoteIdHex] && self._peersIds[remoteIdHex].connection === connection) { -+ delete self._peersIds[remoteIdHex] -+ if (peer) self._requeue(peer) -+ } -+ } -+ -+ function onhandshake (remoteId) { -+ if (!remoteId) remoteId = connection.remoteId -+ clearTimeout(timeout) -+ remoteIdHex = remoteId.toString('hex') -+ -+ if (Buffer.isBuffer(connection.discoveryKey) || Buffer.isBuffer(connection.channel)) { -+ var suffix = '@' + (connection.discoveryKey || connection.channel).toString('hex') -+ remoteIdHex += suffix -+ idHex += suffix -+ } -+ -+ if (peer) peer.retries = 0 -+ -+ if (idHex === remoteIdHex) { -+ if (peer) { -+ self._peersSeen[peer.id] = PEER_BANNED -+ self.emit('peer-banned', { peer: peer, reason: 'detected-self' }) -+ } -+ connection.destroy() -+ return -+ } -+ -+ var oldWrap = self._peersIds[remoteIdHex] -+ var old = oldWrap && oldWrap.connection -+ var oldType = oldWrap && oldWrap.info.type -+ -+ if (old) { -+ debug('duplicate connections detected in handshake, dropping one') -+ if (!(oldType === 'utp' && type === 'tcp')) { -+ if ((peer && remoteIdHex < idHex) || (!peer && remoteIdHex > idHex) || (type === 'utp' && oldType === 'tcp')) { -+ self.emit('redundant-connection', connection, info) -+ connection.destroy() -+ return -+ } -+ } -+ self.emit('redundant-connection', old, info) -+ delete self._peersIds[remoteIdHex] // delete to not trigger re-queue -+ old.destroy() -+ old = null // help gc -+ } -+ -+ self._peersIds[remoteIdHex] = wrap -+ self.connections.push(connection) -+ info.id = remoteId -+ self.emit('connection', connection, info) -+ } -+} -+ -+Swarm.prototype._listenNext = function () { -+ var self = this -+ if (!this._adding) this._adding = [] -+ process.nextTick(function () { -+ if (!self._listening) self.listen() -+ }) -+} -+ -+Swarm.prototype.listen = function (port, onlistening) { -+ if (this.destroyed) return -+ if (this._tcp && this._utp) return this._listenBoth(port, onlistening) -+ if (!port) port = 0 -+ if (onlistening) this.once('listening', onlistening) -+ -+ var self = this -+ var server = this._tcp || this._utp -+ -+ if (!this._listening) { -+ this._listening = true -+ server.on('error', onerror) -+ server.on('listening', onlisten) -+ } -+ -+ if (!this._adding) this._adding = [] -+ server.listen(port) -+ -+ function onerror (err) { -+ self.emit('error', err) -+ } -+ -+ function onlisten () { -+ self.emit('listening') -+ } -+} -+ -+Swarm.prototype._listenBoth = function (port, onlistening) { -+ if (typeof port === 'function') return this.listen(0, port) -+ if (!port) port = 0 -+ if (onlistening) this.once('listening', onlistening) -+ -+ var self = this -+ -+ if (!this._adding) this._adding = [] -+ this._listening = true -+ -+ this._utp.on('error', onerror) -+ this._utp.on('listening', onutplisten) -+ this._tcp.on('listening', ontcplisten) -+ this._tcp.on('error', onerror) -+ this._tcp.listen(port) -+ -+ function cleanup () { -+ self._utp.removeListener('error', onerror) -+ self._tcp.removeListener('error', onerror) -+ self._utp.removeListener('listening', onutplisten) -+ self._tcp.removeListener('listening', ontcplisten) -+ } -+ -+ function onerror (err) { -+ cleanup() -+ self._tcp.close(function () { -+ if (!port) return self.listen() // retry -+ self.emit('error', err) -+ }) -+ } -+ -+ function onutplisten () { -+ cleanup() -+ self._utp.on('error', forward) -+ self._tcp.on('error', forward) -+ self.emit('listening') -+ } -+ -+ function ontcplisten () { -+ self._utp.listen(this.address().port) -+ } -+ -+ function forward (err) { -+ self.emit('error', err) -+ } -+} -+ -+function handshake (socket, id, cb) { -+ lpmessage.write(socket, id) -+ lpmessage.read(socket, cb) -+} -+ -+function onerror () { -+ this.destroy() -+} -+ -+function peerify (peer, channel) { -+ if (typeof peer === 'number') peer = { port: peer } -+ if (!peer.host) peer.host = '127.0.0.1' -+ peer.id = peer.host + ':' + peer.port + '@' + (channel ? channel.toString('hex') : '') -+ peer.retries = 0 -+ peer.channel = channel -+ return peer -+} -+ -+function setTimeoutUnref (fn, time) { -+ var timeout = setTimeout(fn, time) -+ if (timeout.unref) timeout.unref() -+ return timeout -+} -+ -+function noop () {} -+ -+}, -+"I6w2AXpa7m8QinJ3xYjuiJjjx028HfI5jKpI5Dj3a3c=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = codecs -+ -+var fromBuffer = (Buffer.from && Buffer.from !== Uint8Array.from) -+ ? Buffer.from -+ : Buffer -+ -+codecs.ascii = createString('ascii') -+codecs.utf8 = createString('utf-8') -+codecs.hex = createString('hex') -+codecs.base64 = createString('base64') -+codecs.ucs2 = createString('ucs2') -+codecs.utf16le = createString('utf16le') -+codecs.ndjson = createJSON(true) -+codecs.json = createJSON(false) -+codecs.binary = { -+ encode: function encodeBinary (obj) { -+ return typeof obj === 'string' ? fromBuffer(obj, 'utf-8') : obj -+ }, -+ decode: function decodeBinary (buf) { -+ return buf -+ } -+} -+ -+function codecs (fmt) { -+ if (typeof fmt === 'object' && fmt && fmt.encode && fmt.decode) return fmt -+ -+ switch (fmt) { -+ case 'ndjson': return codecs.ndjson -+ case 'json': return codecs.json -+ case 'ascii': return codecs.ascii -+ case 'utf-8': -+ case 'utf8': return codecs.utf8 -+ case 'hex': return codecs.hex -+ case 'base64': return codecs.base64 -+ case 'ucs-2': -+ case 'ucs2': return codecs.ucs2 -+ case 'utf16-le': -+ case 'utf16le': return codecs.utf16le -+ } -+ -+ return codecs.binary -+} -+ -+function createJSON (newline) { -+ return { -+ encode: newline ? encodeNDJSON : encodeJSON, -+ decode: function decodeJSON (buf) { -+ return JSON.parse(buf.toString()) -+ } -+ } -+ -+ function encodeJSON (val) { -+ return new Buffer(JSON.stringify(val)) -+ } -+ -+ function encodeNDJSON (val) { -+ return new Buffer(JSON.stringify(val) + '\n') -+ } -+} -+ -+function createString (type) { -+ return { -+ encode: function encodeString (val) { -+ if (typeof val !== 'string') val = val.toString() -+ return fromBuffer(val, type) -+ }, -+ decode: function decodeString (buf) { -+ return buf.toString(type) -+ } -+ } -+} -+ -+}, -+"I77NsH5p3PRVWpJOtN3+4c58ZO02l4T9vgHMid57VH4=": -+function (require, module, exports, __dirname, __filename) { -+var root = require('./_root'); -+ -+/** Built-in value references. */ -+var Symbol = root.Symbol; -+ -+module.exports = Symbol; -+ -+}, -+"ICRnAF5SKzXOhVqUjmFcVak0Xb5ihCQOiWHO0A7XBgQ=": -+function (require, module, exports, __dirname, __filename) { -+// Note: this is the semver.org version of the spec that it implements -+// Not necessarily the package version of this code. -+const SEMVER_SPEC_VERSION = '2.0.0' -+ -+const MAX_LENGTH = 256 -+const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || -+ /* istanbul ignore next */ 9007199254740991 -+ -+// Max safe segment length for coercion. -+const MAX_SAFE_COMPONENT_LENGTH = 16 -+ -+module.exports = { -+ SEMVER_SPEC_VERSION, -+ MAX_LENGTH, -+ MAX_SAFE_INTEGER, -+ MAX_SAFE_COMPONENT_LENGTH -+} -+ -+}, -+"IT+F6LLlLiz292NIlxl0APfdrtWHJ08WAEXwtUjsIdo=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// Note: we can't get significant speed boost here. -+// So write code to minimize size - no pregenerated tables -+// and array tools dependencies. -+ -+// (C) 1995-2013 Jean-loup Gailly and Mark Adler -+// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin -+// -+// This software is provided 'as-is', without any express or implied -+// warranty. In no event will the authors be held liable for any damages -+// arising from the use of this software. -+// -+// Permission is granted to anyone to use this software for any purpose, -+// including commercial applications, and to alter it and redistribute it -+// freely, subject to the following restrictions: -+// -+// 1. The origin of this software must not be misrepresented; you must not -+// claim that you wrote the original software. If you use this software -+// in a product, an acknowledgment in the product documentation would be -+// appreciated but is not required. -+// 2. Altered source versions must be plainly marked as such, and must not be -+// misrepresented as being the original software. -+// 3. This notice may not be removed or altered from any source distribution. -+ -+// Use ordinary array, since untyped makes no boost here -+function makeTable() { -+ var c, table = []; -+ -+ for (var n = 0; n < 256; n++) { -+ c = n; -+ for (var k = 0; k < 8; k++) { -+ c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); -+ } -+ table[n] = c; -+ } -+ -+ return table; -+} -+ -+// Create table on load. Just 255 signed longs. Not a problem. -+var crcTable = makeTable(); -+ -+ -+function crc32(crc, buf, len, pos) { -+ var t = crcTable, -+ end = pos + len; -+ -+ crc ^= -1; -+ -+ for (var i = pos; i < end; i++) { -+ crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; -+ } -+ -+ return (crc ^ (-1)); // >>> 0; -+} -+ -+ -+module.exports = crc32; -+ -+}, -+"IZG9fn1Cajf63xqO7bQGvcgiQoiRCqZSuRZrJevUfCE=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function (work) { -+ var fns = [] -+ -+ var res = function (fn) { -+ if (!res.ready) fns.push(fn) -+ else process.nextTick(fn, res.error) -+ } -+ res.error = undefined -+ res.ready = false -+ -+ process.nextTick(function () { -+ work(function (err) { -+ res.ready = true -+ res.error = err -+ fns.forEach(function (fn) { -+ process.nextTick(fn, err) -+ }) -+ }) -+ }) -+ return res -+} -+ -+}, -+"IZuq0cAyUe3PB3D/nmFS4m2xj4grfXmt5tNY/LZkLCw=": -+function (require, module, exports, __dirname, __filename) { -+// @ts-check -+const semver = require("semver"); -+const hasha = require("hasha"); -+const path = require("path"); -+const fs = require("fs"); -+const stream = require("stream"); -+const { promisify } = require("util"); -+const { once } = require("events"); -+const pDefer = require("p-defer"); -+const copyError = require("utils-copy-error"); -+const ApkParser = require("app-info-parser/src/apk"); -+const ZipFs = require("@gmaclennan/zip-fs"); -+const log = require("debug")("p2p-upgrades:utils"); -+ -+/** @typedef {import('./types').InstallerInt} InstallerInt */ -+/** @typedef {import('./types').InstallerExt} InstallerExt */ -+ -+module.exports = { -+ installerCompare: { -+ compare: installerCompare, -+ rCompare: installerRCompare, -+ gt: installerGt, -+ lt: installerLt, -+ gte: installerGte, -+ lte: installerLte, -+ }, -+ isUpgradeCandidate, -+ getBestUpgradeCandidate, -+ getInstallerInfo, -+ beforeAfterStream, -+ stringifyInstaller, -+}; -+ -+// TODO: Implement installerCompare.lt .gt etc. functions for clearer code -+ -+/** -+ * Compare two installer options, returns -1 if a is less than b, 0 if same, 1 -+ * if a is greater than b. Will array.sort() in ascending order -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {-1 | 0 | 1} -+ */ -+function installerCompare(a, b) { -+ const aIsValidSemver = semver.valid(a.versionName); -+ const bIsValidSemver = semver.valid(b.versionName); -+ if (!aIsValidSemver && !bIsValidSemver) return 0; -+ if (!aIsValidSemver) return -1; -+ if (!bIsValidSemver) return 1; -+ // Important to validate semver before here, otherwise this will throw -+ const semverCompare = semver.compare(a.versionName, b.versionName); -+ if (semverCompare !== 0) return semverCompare; -+ if (a.versionCode < b.versionCode) return -1; -+ if (a.versionCode > b.versionCode) return 1; -+ return 0; -+} -+ -+/** -+ * Reverse compare two installer options, returns 1 if a is less than b, 0 if -+ * same, -1 if a is greater than b. Will array.sort() in descending order -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {-1 | 0 | 1} -+ */ -+function installerRCompare(a, b) { -+ const cmp = installerCompare(a, b); -+ return cmp === 1 ? -1 : cmp === -1 ? 1 : 0; -+} -+ -+/** -+ * Returns true if a > b -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {boolean} -+ */ -+function installerGt(a, b) { -+ const cmp = installerCompare(a, b); -+ return cmp === 1; -+} -+ -+/** -+ * Returns true if a >= b -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {boolean} -+ */ -+function installerGte(a, b) { -+ const cmp = installerCompare(a, b); -+ return cmp > -1; -+} -+ -+/** -+ * Returns true if a < b -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {boolean} -+ */ -+function installerLt(a, b) { -+ const cmp = installerCompare(a, b); -+ return cmp === -1; -+} -+ -+/** -+ * Returns true if a <= b -+ * -+ * @param {InstallerInt | InstallerExt} a -+ * @param {InstallerInt | InstallerExt} b -+ * @returns {boolean} -+ */ -+function installerLte(a, b) { -+ const cmp = installerCompare(a, b); -+ return cmp < 1; -+} -+ -+/** -+ * Check if an installer is compatible with the given device. Requirements: -+ * -+ * 1. Must support arch of device -+ * 2. Must support SDK of device -+ * 3. Version code must be greater or equal to currently installed app -+ * 4. Installer must be for platform 'android' -+ * 5. applicationId must match applicationId of currently installed app -+ * 6. versionName must be valid semver -+ * -+ * @param {object} options -+ * @param {import('./types').DeviceInfo} options.deviceInfo -+ * @param {InstallerInt | InstallerExt} options.installer -+ * @param {InstallerInt | InstallerExt} options.currentApkInfo -+ * @returns {boolean} -+ */ -+function isUpgradeCandidate({ deviceInfo, installer, currentApkInfo }) { -+ // Filter out the current APK -+ if (installer.hash === currentApkInfo.hash) return false; -+ // Check for 0 or less APK size -+ if (installer.size <= 0) return false; -+ // TODO: 64 bit devices can run 32 bit APKs -+ const isSupportedAbi = installer.arch.some(arch => -+ deviceInfo.supportedAbis.includes(arch) -+ ); -+ if (!isSupportedAbi) return false; -+ if (installer.minSdkVersion > deviceInfo.sdkVersion) { -+ log( -+ `installer rejected: minSdkVersion ${installer.minSdkVersion} is not supported by this device` -+ ); -+ return false; -+ } -+ if (installer.applicationId !== currentApkInfo.applicationId) { -+ log( -+ `installer rejected: application id ${installer.applicationId} doesn't match ${currentApkInfo.applicationId}` -+ ); -+ return false; -+ } -+ if (installer.platform !== "android") { -+ log(`installer rejected: platform isn't Android`); -+ return false; -+ } -+ if (installer.versionCode <= currentApkInfo.versionCode) { -+ log( -+ `installer rejected: installer version code ${installer.versionCode} is lower then current: ${currentApkInfo.versionCode} ` -+ ); -+ return false; -+ } -+ -+ const installerSemver = semver.parse(installer.versionName); -+ const apkSemver = semver.parse(currentApkInfo.versionName); -+ -+ if (!installerSemver) { -+ log( -+ "installer rejected: installer version code %s is invalid semver", -+ installer.versionName -+ ); -+ return false; -+ } -+ if (!apkSemver) { -+ log( -+ "Cannot upgrade due to non-semver current APK version %s", -+ currentApkInfo.versionName -+ ); -+ return false; -+ } -+ -+ // Don't upgrade prerelease versions -+ if (installerSemver.prerelease.length) { -+ log("installer rejected: is a prerelease %s", installer.versionName); -+ return false; -+ } -+ if (apkSemver.prerelease.length) { -+ log( -+ "Current APK is a pre-release %s, ignoring update", -+ currentApkInfo.versionName -+ ); -+ return false; -+ } -+ -+ if (semver.lt(installer.versionName, currentApkInfo.versionName)) { -+ log( -+ "installer rejected: version %s is less-than current version %s", -+ installer.versionName, -+ currentApkInfo.versionName -+ ); -+ return false; -+ } -+ // The version name can be the same, but versionCode (build number) must be -+ // greater -+ return true; -+} -+ -+/** -+ * From a list of installers, return the most recent compatible upgrade (if -+ * there is one) -+ * -+ * @template {InstallerInt | InstallerExt} T -+ * @param {object} options -+ * @param {import('./types').DeviceInfo} options.deviceInfo -+ * @param {Array} options.installers -+ * @param {InstallerInt} options.currentApkInfo -+ * @returns {T} -+ */ -+function getBestUpgradeCandidate({ deviceInfo, installers, currentApkInfo }) { -+ const upgradeCandidates = installers.filter(installer => -+ isUpgradeCandidate({ -+ installer, -+ currentApkInfo, -+ deviceInfo, -+ }) -+ ); -+ return upgradeCandidates.sort(installerRCompare)[0]; -+} -+ -+/** -+ * For a given filepath to an APK, get the UpgradeOption details -+ * -+ * @param {string} filepath -+ * @returns {Promise} -+ */ -+async function getInstallerInfo(filepath) { -+ if (path.extname(filepath) !== ".apk") -+ throw new Error(`${filepath} is not an .apk file`); -+ const [ -+ hash, -+ stat, -+ { versionName, versionCode, applicationId, arch, minSdkVersion }, -+ ] = await Promise.all([ -+ hasha.fromFile(filepath, { algorithm: "sha256" }), -+ fs.promises.stat(filepath), -+ getApkMetadata(filepath), -+ ]); -+ return { -+ hash, -+ hashType: "sha256", -+ versionName, -+ versionCode, -+ applicationId, -+ platform: "android", -+ arch, -+ size: stat.size, -+ minSdkVersion, -+ filepath, -+ }; -+} -+ -+/** -+ * Get version name, version code & applicationId from an apk file -+ * -+ * @param {string} filepath path to apk -+ * @returns {Promise>} -+ */ -+async function getApkMetadata(filepath) { -+ const parser = new ApkParser(filepath); -+ const [result, arch] = await Promise.all([ -+ parser.parse(), -+ getApkAbis(filepath), -+ ]); -+ return { -+ versionName: result.versionName, -+ versionCode: result.versionCode, -+ applicationId: result.package, -+ arch, -+ minSdkVersion: (result.usesSdk || {}).minSdkVersion || 1, -+ }; -+} -+ -+// If an APK does not have native code (e.g. no `lib` folder) then we assume it runs on these ABIs -+/** @type {InstallerInt['arch']} */ -+const DEFAULT_ABIS = ["armeabi-v7a", "arm64-v8a", "x86", "x86_64"]; -+ -+/** -+ * Get the ABIs supported by an APK -+ * -+ * @param {string} filepath -+ * @returns {Promise} -+ */ -+async function getApkAbis(filepath) { -+ const zip = new ZipFs(filepath); -+ /** @type {InstallerInt['arch']} */ -+ const libDirs = (await promisify(zip.readdir.bind(zip))("lib")).filter(( -+ /** @type {string} */ name -+ ) => -+ DEFAULT_ABIS.includes( -+ // @ts-ignore - this one is a pain to type correctly! -+ name -+ ) -+ ); -+ await promisify(zip.close.bind(zip))(); -+ return libDirs.length ? libDirs : DEFAULT_ABIS.slice(0); -+} -+ -+/** -+ * Wrap an asynchronously created writable stream with another writable stream, -+ * which will run a flush function _after_ the wrapped stream has already -+ * finished, but before the returned stream will finish. -+ * -+ * Useful if you want to synchronously return a stream, then asynchronously -+ * create a write stream, then do some work after the internal stream has -+ * finished writing (e.g. move a file) before the returned stream finishes. -+ * -+ * @param {object} options -+ * @param {() => Promise} options.createStream -+ * @param {(wrappedStream: stream.Writable) => Promise} options.finalize -+ * @returns {stream.Writable} -+ */ -+function beforeAfterStream({ createStream, finalize }) { -+ /** @type {stream.Writable | void} */ -+ let wrappedStream; -+ /** @type {import('p-defer').DeferredPromise} */ -+ const deferred = pDefer(); -+ -+ // Avoid unhandled error if deferred is rejected before writev() is called -+ deferred.promise.catch(() => {}); -+ -+ // Need to use a deferred promise to work around error handling for race -+ // conditions if createStream throws before the first _writev() call, or if it -+ // throws within the writev call -+ createStream() -+ .then(str => { -+ wrappedStream = str; -+ wrappedStream.once("error", e => { -+ // If this error comes from ws.destroy(), don't re-emit it, because ws -+ // will already have emitted an error event for destroy -+ // @ts-ignore -+ if (e.__fromDestroy) return; -+ ws.emit("error", e); -+ }); -+ deferred.resolve(str); -+ }) -+ .catch(e => { -+ deferred.reject(e); -+ }); -+ -+ const ws = new stream.Writable({ -+ // Use writev vs write to support backpressure between streams -+ async writev(chunks, cb) { -+ try { -+ // Avoid an extra tick for each write by only awaiting once -+ if (!wrappedStream) wrappedStream = await deferred.promise; -+ for (const { chunk } of chunks) { -+ const ok = wrappedStream.write(chunk); -+ if (!ok) await once(wrappedStream, "drain"); -+ } -+ cb(); -+ } catch (e) { -+ // Don't bubble up destroy errors a second time -+ cb(e.__fromDestroy ? null : e); -+ } -+ }, -+ async final(cb) { -+ try { -+ if (!wrappedStream) wrappedStream = await deferred.promise; -+ await promisify(wrappedStream.end.bind(wrappedStream))(); -+ await finalize(wrappedStream); -+ cb(); -+ } catch (e) { -+ // Don't bubble up destroy errors a second time -+ cb(e.__fromDestroy ? null : e); -+ } -+ }, -+ async destroy(e, cb) { -+ // If destroy() happens before wrapped stream is created, we still expect -+ // the wrapped stream to be destroyed, so we wait for it -+ if (!wrappedStream) wrappedStream = await deferred.promise; -+ let wrappedError; -+ // This error from destroy() must not be re-emitted on the outer stream -+ // (because destroy will automatically emit an error), so we add a -+ // hidden property so we can catch it -+ if (e) { -+ wrappedError = copyError(e); -+ // @ts-ignore -+ wrappedError.__fromDestroy = true; -+ } -+ wrappedStream.destroy(wrappedError); -+ cb(e); -+ }, -+ }); -+ -+ return ws; -+} -+ -+const shortAbiNames = { -+ "armeabi-v7a": "arm7", -+ "arm64-v8a": "arm64", -+ x86: "x86", -+ x86_64: "x64", -+}; -+ -+/** -+ * Stringify relevant data about an installer for logging, to make logs easier -+ * to read (avoiding large objects) -+ * -+ * @param {InstallerExt | InstallerInt} installer -+ * @returns {string} -+ */ -+function stringifyInstaller({ -+ applicationId, -+ minSdkVersion, -+ versionName, -+ versionCode, -+ arch, -+ hash, -+}) { -+ return `${applicationId}_SDK${minSdkVersion}_VN${versionName}_VC${versionCode}_${arch -+ .map(a => shortAbiNames[a]) -+ .join(",")}_${hash.slice(0, 7)}`; -+} -+ -+}, -+"IcQfpQxyzQfjpUrE5UZsOmUXrjCPM4b2yiXwbu5wUOI=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+module.exports = function pull (a) { -+ var length = arguments.length -+ if (typeof a === 'function' && a.length === 1) { -+ var args = new Array(length) -+ for(var i = 0; i < length; i++) -+ args[i] = arguments[i] -+ return function (read) { -+ if (args == null) { -+ throw new TypeError("partial sink should only be called once!") -+ } -+ -+ // Grab the reference after the check, because it's always an array now -+ // (engines like that kind of consistency). -+ var ref = args -+ args = null -+ -+ // Prioritize common case of small number of pulls. -+ switch (length) { -+ case 1: return pull(read, ref[0]) -+ case 2: return pull(read, ref[0], ref[1]) -+ case 3: return pull(read, ref[0], ref[1], ref[2]) -+ case 4: return pull(read, ref[0], ref[1], ref[2], ref[3]) -+ default: -+ ref.unshift(read) -+ return pull.apply(null, ref) -+ } -+ } -+ } -+ -+ var read = a -+ -+ if (read && typeof read.source === 'function') { -+ read = read.source -+ } -+ -+ for (var i = 1; i < length; i++) { -+ var s = arguments[i] -+ if (typeof s === 'function') { -+ read = s(read) -+ } else if (s && typeof s === 'object') { -+ s.sink(read) -+ read = s.source -+ } -+ } -+ -+ return read -+} -+ -+}, -+"Id9eKK8us8sDs2xqEBARJRrAggMhocKQXFDRvs7Yfuo=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = [ -+ { -+ "key": "building", -+ "polygon": "all" -+ }, -+ { -+ "key": "highway", -+ "polygon": "whitelist", -+ "values": [ -+ "services", -+ "rest_area", -+ "escape", -+ "elevator" -+ ] -+ }, -+ { -+ "key": "natural", -+ "polygon": "blacklist", -+ "values": [ -+ "coastline", -+ "cliff", -+ "ridge", -+ "arete", -+ "tree_row" -+ ] -+ }, -+ { -+ "key": "landuse", -+ "polygon": "all" -+ }, -+ { -+ "key": "waterway", -+ "polygon": "whitelist", -+ "values": [ -+ "riverbank", -+ "dock", -+ "boatyard", -+ "dam" -+ ] -+ }, -+ { -+ "key": "amenity", -+ "polygon": "all" -+ }, -+ { -+ "key": "leisure", -+ "polygon": "all" -+ }, -+ { -+ "key": "barrier", -+ "polygon": "whitelist", -+ "values": [ -+ "city_wall", -+ "ditch", -+ "hedge", -+ "retaining_wall", -+ "wall", -+ "spikes" -+ ] -+ }, -+ { -+ "key": "railway", -+ "polygon": "whitelist", -+ "values": [ -+ "station", -+ "turntable", -+ "roundhouse", -+ "platform" -+ ] -+ }, -+ { -+ "key": "area", -+ "polygon": "all" -+ }, -+ { -+ "key": "boundary", -+ "polygon": "all" -+ }, -+ { -+ "key": "man_made", -+ "polygon": "blacklist", -+ "values": [ -+ "cutline", -+ "embankment", -+ "pipeline" -+ ] -+ }, -+ { -+ "key": "power", -+ "polygon": "whitelist", -+ "values": [ -+ "plant", -+ "substation", -+ "generator", -+ "transformer" -+ ] -+ }, -+ { -+ "key": "place", -+ "polygon": "all" -+ }, -+ { -+ "key": "shop", -+ "polygon": "all" -+ }, -+ { -+ "key": "aeroway", -+ "polygon": "blacklist", -+ "values": [ -+ "taxiway" -+ ] -+ }, -+ { -+ "key": "tourism", -+ "polygon": "all" -+ }, -+ { -+ "key": "historic", -+ "polygon": "all" -+ }, -+ { -+ "key": "public_transport", -+ "polygon": "all" -+ }, -+ { -+ "key": "office", -+ "polygon": "all" -+ }, -+ { -+ "key": "building:part", -+ "polygon": "all" -+ }, -+ { -+ "key": "military", -+ "polygon": "all" -+ }, -+ { -+ "key": "ruins", -+ "polygon": "all" -+ }, -+ { -+ "key": "area:highway", -+ "polygon": "all" -+ }, -+ { -+ "key": "craft", -+ "polygon": "all" -+ }, -+ { -+ "key": "golf", -+ "polygon": "all" -+ }, -+ { -+ "key": "indoor", -+ "polygon": "all" -+ } -+] -+ -+}, -+"IiWBl/sgwZ1S20iO5dQgffnpMBKvZPMdzbcdVBvE0xM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+// When attaching listeners, it's very easy to forget about them. -+// Especially if you do error handling and set timeouts. -+// So instead of checking if it's proper to throw an error on every timeout ever, -+// use this simple tool which will remove all listeners you have attached. -+exports.default = () => { -+ const handlers = []; -+ return { -+ once(origin, event, fn) { -+ origin.once(event, fn); -+ handlers.push({ origin, event, fn }); -+ }, -+ unhandleAll() { -+ for (const handler of handlers) { -+ const { origin, event, fn } = handler; -+ origin.removeListener(event, fn); -+ } -+ handlers.length = 0; -+ } -+ }; -+}; -+ -+}, -+"ImQfq5qkx/KWLyGqZStoXe2KnsiLDwkVtSSUi/pkRBU=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function() { -+var makeSelfResolutionError = function () { -+ return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+}; -+var reflectHandler = function() { -+ return new Promise.PromiseInspection(this._target()); -+}; -+var apiRejection = function(msg) { -+ return Promise.reject(new TypeError(msg)); -+}; -+function Proxyable() {} -+var UNDEFINED_BINDING = {}; -+var util = require("./util"); -+util.setReflectHandler(reflectHandler); -+ -+var getDomain = function() { -+ var domain = process.domain; -+ if (domain === undefined) { -+ return null; -+ } -+ return domain; -+}; -+var getContextDefault = function() { -+ return null; -+}; -+var getContextDomain = function() { -+ return { -+ domain: getDomain(), -+ async: null -+ }; -+}; -+var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? -+ require("async_hooks").AsyncResource : null; -+var getContextAsyncHooks = function() { -+ return { -+ domain: getDomain(), -+ async: new AsyncResource("Bluebird::Promise") -+ }; -+}; -+var getContext = util.isNode ? getContextDomain : getContextDefault; -+util.notEnumerableProp(Promise, "_getContext", getContext); -+var enableAsyncHooks = function() { -+ getContext = getContextAsyncHooks; -+ util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); -+}; -+var disableAsyncHooks = function() { -+ getContext = getContextDomain; -+ util.notEnumerableProp(Promise, "_getContext", getContextDomain); -+}; -+ -+var es5 = require("./es5"); -+var Async = require("./async"); -+var async = new Async(); -+es5.defineProperty(Promise, "_async", {value: async}); -+var errors = require("./errors"); -+var TypeError = Promise.TypeError = errors.TypeError; -+Promise.RangeError = errors.RangeError; -+var CancellationError = Promise.CancellationError = errors.CancellationError; -+Promise.TimeoutError = errors.TimeoutError; -+Promise.OperationalError = errors.OperationalError; -+Promise.RejectionError = errors.OperationalError; -+Promise.AggregateError = errors.AggregateError; -+var INTERNAL = function(){}; -+var APPLY = {}; -+var NEXT_FILTER = {}; -+var tryConvertToPromise = require("./thenables")(Promise, INTERNAL); -+var PromiseArray = -+ require("./promise_array")(Promise, INTERNAL, -+ tryConvertToPromise, apiRejection, Proxyable); -+var Context = require("./context")(Promise); -+ /*jshint unused:false*/ -+var createContext = Context.create; -+ -+var debug = require("./debuggability")(Promise, Context, -+ enableAsyncHooks, disableAsyncHooks); -+var CapturedTrace = debug.CapturedTrace; -+var PassThroughHandlerContext = -+ require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); -+var catchFilter = require("./catch_filter")(NEXT_FILTER); -+var nodebackForPromise = require("./nodeback"); -+var errorObj = util.errorObj; -+var tryCatch = util.tryCatch; -+function check(self, executor) { -+ if (self == null || self.constructor !== Promise) { -+ throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+ if (typeof executor !== "function") { -+ throw new TypeError("expecting a function but got " + util.classString(executor)); -+ } -+ -+} -+ -+function Promise(executor) { -+ if (executor !== INTERNAL) { -+ check(this, executor); -+ } -+ this._bitField = 0; -+ this._fulfillmentHandler0 = undefined; -+ this._rejectionHandler0 = undefined; -+ this._promise0 = undefined; -+ this._receiver0 = undefined; -+ this._resolveFromExecutor(executor); -+ this._promiseCreated(); -+ this._fireEvent("promiseCreated", this); -+} -+ -+Promise.prototype.toString = function () { -+ return "[object Promise]"; -+}; -+ -+Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { -+ var len = arguments.length; -+ if (len > 1) { -+ var catchInstances = new Array(len - 1), -+ j = 0, i; -+ for (i = 0; i < len - 1; ++i) { -+ var item = arguments[i]; -+ if (util.isObject(item)) { -+ catchInstances[j++] = item; -+ } else { -+ return apiRejection("Catch statement predicate: " + -+ "expecting an object but got " + util.classString(item)); -+ } -+ } -+ catchInstances.length = j; -+ fn = arguments[i]; -+ -+ if (typeof fn !== "function") { -+ throw new TypeError("The last argument to .catch() " + -+ "must be a function, got " + util.toString(fn)); -+ } -+ return this.then(undefined, catchFilter(catchInstances, fn, this)); -+ } -+ return this.then(undefined, fn); -+}; -+ -+Promise.prototype.reflect = function () { -+ return this._then(reflectHandler, -+ reflectHandler, undefined, this, undefined); -+}; -+ -+Promise.prototype.then = function (didFulfill, didReject) { -+ if (debug.warnings() && arguments.length > 0 && -+ typeof didFulfill !== "function" && -+ typeof didReject !== "function") { -+ var msg = ".then() only accepts functions but was passed: " + -+ util.classString(didFulfill); -+ if (arguments.length > 1) { -+ msg += ", " + util.classString(didReject); -+ } -+ this._warn(msg); -+ } -+ return this._then(didFulfill, didReject, undefined, undefined, undefined); -+}; -+ -+Promise.prototype.done = function (didFulfill, didReject) { -+ var promise = -+ this._then(didFulfill, didReject, undefined, undefined, undefined); -+ promise._setIsFinal(); -+}; -+ -+Promise.prototype.spread = function (fn) { -+ if (typeof fn !== "function") { -+ return apiRejection("expecting a function but got " + util.classString(fn)); -+ } -+ return this.all()._then(fn, undefined, undefined, APPLY, undefined); -+}; -+ -+Promise.prototype.toJSON = function () { -+ var ret = { -+ isFulfilled: false, -+ isRejected: false, -+ fulfillmentValue: undefined, -+ rejectionReason: undefined -+ }; -+ if (this.isFulfilled()) { -+ ret.fulfillmentValue = this.value(); -+ ret.isFulfilled = true; -+ } else if (this.isRejected()) { -+ ret.rejectionReason = this.reason(); -+ ret.isRejected = true; -+ } -+ return ret; -+}; -+ -+Promise.prototype.all = function () { -+ if (arguments.length > 0) { -+ this._warn(".all() was passed arguments but it does not take any"); -+ } -+ return new PromiseArray(this).promise(); -+}; -+ -+Promise.prototype.error = function (fn) { -+ return this.caught(util.originatesFromRejection, fn); -+}; -+ -+Promise.getNewLibraryCopy = module.exports; -+ -+Promise.is = function (val) { -+ return val instanceof Promise; -+}; -+ -+Promise.fromNode = Promise.fromCallback = function(fn) { -+ var ret = new Promise(INTERNAL); -+ ret._captureStackTrace(); -+ var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs -+ : false; -+ var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); -+ if (result === errorObj) { -+ ret._rejectCallback(result.e, true); -+ } -+ if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); -+ return ret; -+}; -+ -+Promise.all = function (promises) { -+ return new PromiseArray(promises).promise(); -+}; -+ -+Promise.cast = function (obj) { -+ var ret = tryConvertToPromise(obj); -+ if (!(ret instanceof Promise)) { -+ ret = new Promise(INTERNAL); -+ ret._captureStackTrace(); -+ ret._setFulfilled(); -+ ret._rejectionHandler0 = obj; -+ } -+ return ret; -+}; -+ -+Promise.resolve = Promise.fulfilled = Promise.cast; -+ -+Promise.reject = Promise.rejected = function (reason) { -+ var ret = new Promise(INTERNAL); -+ ret._captureStackTrace(); -+ ret._rejectCallback(reason, true); -+ return ret; -+}; -+ -+Promise.setScheduler = function(fn) { -+ if (typeof fn !== "function") { -+ throw new TypeError("expecting a function but got " + util.classString(fn)); -+ } -+ return async.setScheduler(fn); -+}; -+ -+Promise.prototype._then = function ( -+ didFulfill, -+ didReject, -+ _, receiver, -+ internalData -+) { -+ var haveInternalData = internalData !== undefined; -+ var promise = haveInternalData ? internalData : new Promise(INTERNAL); -+ var target = this._target(); -+ var bitField = target._bitField; -+ -+ if (!haveInternalData) { -+ promise._propagateFrom(this, 3); -+ promise._captureStackTrace(); -+ if (receiver === undefined && -+ ((this._bitField & 2097152) !== 0)) { -+ if (!((bitField & 50397184) === 0)) { -+ receiver = this._boundValue(); -+ } else { -+ receiver = target === this ? undefined : this._boundTo; -+ } -+ } -+ this._fireEvent("promiseChained", this, promise); -+ } -+ -+ var context = getContext(); -+ if (!((bitField & 50397184) === 0)) { -+ var handler, value, settler = target._settlePromiseCtx; -+ if (((bitField & 33554432) !== 0)) { -+ value = target._rejectionHandler0; -+ handler = didFulfill; -+ } else if (((bitField & 16777216) !== 0)) { -+ value = target._fulfillmentHandler0; -+ handler = didReject; -+ target._unsetRejectionIsUnhandled(); -+ } else { -+ settler = target._settlePromiseLateCancellationObserver; -+ value = new CancellationError("late cancellation observer"); -+ target._attachExtraTrace(value); -+ handler = didReject; -+ } -+ -+ async.invoke(settler, target, { -+ handler: util.contextBind(context, handler), -+ promise: promise, -+ receiver: receiver, -+ value: value -+ }); -+ } else { -+ target._addCallbacks(didFulfill, didReject, promise, -+ receiver, context); -+ } -+ -+ return promise; -+}; -+ -+Promise.prototype._length = function () { -+ return this._bitField & 65535; -+}; -+ -+Promise.prototype._isFateSealed = function () { -+ return (this._bitField & 117506048) !== 0; -+}; -+ -+Promise.prototype._isFollowing = function () { -+ return (this._bitField & 67108864) === 67108864; -+}; -+ -+Promise.prototype._setLength = function (len) { -+ this._bitField = (this._bitField & -65536) | -+ (len & 65535); -+}; -+ -+Promise.prototype._setFulfilled = function () { -+ this._bitField = this._bitField | 33554432; -+ this._fireEvent("promiseFulfilled", this); -+}; -+ -+Promise.prototype._setRejected = function () { -+ this._bitField = this._bitField | 16777216; -+ this._fireEvent("promiseRejected", this); -+}; -+ -+Promise.prototype._setFollowing = function () { -+ this._bitField = this._bitField | 67108864; -+ this._fireEvent("promiseResolved", this); -+}; -+ -+Promise.prototype._setIsFinal = function () { -+ this._bitField = this._bitField | 4194304; -+}; -+ -+Promise.prototype._isFinal = function () { -+ return (this._bitField & 4194304) > 0; -+}; -+ -+Promise.prototype._unsetCancelled = function() { -+ this._bitField = this._bitField & (~65536); -+}; -+ -+Promise.prototype._setCancelled = function() { -+ this._bitField = this._bitField | 65536; -+ this._fireEvent("promiseCancelled", this); -+}; -+ -+Promise.prototype._setWillBeCancelled = function() { -+ this._bitField = this._bitField | 8388608; -+}; -+ -+Promise.prototype._setAsyncGuaranteed = function() { -+ if (async.hasCustomScheduler()) return; -+ var bitField = this._bitField; -+ this._bitField = bitField | -+ (((bitField & 536870912) >> 2) ^ -+ 134217728); -+}; -+ -+Promise.prototype._setNoAsyncGuarantee = function() { -+ this._bitField = (this._bitField | 536870912) & -+ (~134217728); -+}; -+ -+Promise.prototype._receiverAt = function (index) { -+ var ret = index === 0 ? this._receiver0 : this[ -+ index * 4 - 4 + 3]; -+ if (ret === UNDEFINED_BINDING) { -+ return undefined; -+ } else if (ret === undefined && this._isBound()) { -+ return this._boundValue(); -+ } -+ return ret; -+}; -+ -+Promise.prototype._promiseAt = function (index) { -+ return this[ -+ index * 4 - 4 + 2]; -+}; -+ -+Promise.prototype._fulfillmentHandlerAt = function (index) { -+ return this[ -+ index * 4 - 4 + 0]; -+}; -+ -+Promise.prototype._rejectionHandlerAt = function (index) { -+ return this[ -+ index * 4 - 4 + 1]; -+}; -+ -+Promise.prototype._boundValue = function() {}; -+ -+Promise.prototype._migrateCallback0 = function (follower) { -+ var bitField = follower._bitField; -+ var fulfill = follower._fulfillmentHandler0; -+ var reject = follower._rejectionHandler0; -+ var promise = follower._promise0; -+ var receiver = follower._receiverAt(0); -+ if (receiver === undefined) receiver = UNDEFINED_BINDING; -+ this._addCallbacks(fulfill, reject, promise, receiver, null); -+}; -+ -+Promise.prototype._migrateCallbackAt = function (follower, index) { -+ var fulfill = follower._fulfillmentHandlerAt(index); -+ var reject = follower._rejectionHandlerAt(index); -+ var promise = follower._promiseAt(index); -+ var receiver = follower._receiverAt(index); -+ if (receiver === undefined) receiver = UNDEFINED_BINDING; -+ this._addCallbacks(fulfill, reject, promise, receiver, null); -+}; -+ -+Promise.prototype._addCallbacks = function ( -+ fulfill, -+ reject, -+ promise, -+ receiver, -+ context -+) { -+ var index = this._length(); -+ -+ if (index >= 65535 - 4) { -+ index = 0; -+ this._setLength(0); -+ } -+ -+ if (index === 0) { -+ this._promise0 = promise; -+ this._receiver0 = receiver; -+ if (typeof fulfill === "function") { -+ this._fulfillmentHandler0 = util.contextBind(context, fulfill); -+ } -+ if (typeof reject === "function") { -+ this._rejectionHandler0 = util.contextBind(context, reject); -+ } -+ } else { -+ var base = index * 4 - 4; -+ this[base + 2] = promise; -+ this[base + 3] = receiver; -+ if (typeof fulfill === "function") { -+ this[base + 0] = -+ util.contextBind(context, fulfill); -+ } -+ if (typeof reject === "function") { -+ this[base + 1] = -+ util.contextBind(context, reject); -+ } -+ } -+ this._setLength(index + 1); -+ return index; -+}; -+ -+Promise.prototype._proxy = function (proxyable, arg) { -+ this._addCallbacks(undefined, undefined, arg, proxyable, null); -+}; -+ -+Promise.prototype._resolveCallback = function(value, shouldBind) { -+ if (((this._bitField & 117506048) !== 0)) return; -+ if (value === this) -+ return this._rejectCallback(makeSelfResolutionError(), false); -+ var maybePromise = tryConvertToPromise(value, this); -+ if (!(maybePromise instanceof Promise)) return this._fulfill(value); -+ -+ if (shouldBind) this._propagateFrom(maybePromise, 2); -+ -+ -+ var promise = maybePromise._target(); -+ -+ if (promise === this) { -+ this._reject(makeSelfResolutionError()); -+ return; -+ } -+ -+ var bitField = promise._bitField; -+ if (((bitField & 50397184) === 0)) { -+ var len = this._length(); -+ if (len > 0) promise._migrateCallback0(this); -+ for (var i = 1; i < len; ++i) { -+ promise._migrateCallbackAt(this, i); -+ } -+ this._setFollowing(); -+ this._setLength(0); -+ this._setFollowee(maybePromise); -+ } else if (((bitField & 33554432) !== 0)) { -+ this._fulfill(promise._value()); -+ } else if (((bitField & 16777216) !== 0)) { -+ this._reject(promise._reason()); -+ } else { -+ var reason = new CancellationError("late cancellation observer"); -+ promise._attachExtraTrace(reason); -+ this._reject(reason); -+ } -+}; -+ -+Promise.prototype._rejectCallback = -+function(reason, synchronous, ignoreNonErrorWarnings) { -+ var trace = util.ensureErrorObject(reason); -+ var hasStack = trace === reason; -+ if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { -+ var message = "a promise was rejected with a non-error: " + -+ util.classString(reason); -+ this._warn(message, true); -+ } -+ this._attachExtraTrace(trace, synchronous ? hasStack : false); -+ this._reject(reason); -+}; -+ -+Promise.prototype._resolveFromExecutor = function (executor) { -+ if (executor === INTERNAL) return; -+ var promise = this; -+ this._captureStackTrace(); -+ this._pushContext(); -+ var synchronous = true; -+ var r = this._execute(executor, function(value) { -+ promise._resolveCallback(value); -+ }, function (reason) { -+ promise._rejectCallback(reason, synchronous); -+ }); -+ synchronous = false; -+ this._popContext(); -+ -+ if (r !== undefined) { -+ promise._rejectCallback(r, true); -+ } -+}; -+ -+Promise.prototype._settlePromiseFromHandler = function ( -+ handler, receiver, value, promise -+) { -+ var bitField = promise._bitField; -+ if (((bitField & 65536) !== 0)) return; -+ promise._pushContext(); -+ var x; -+ if (receiver === APPLY) { -+ if (!value || typeof value.length !== "number") { -+ x = errorObj; -+ x.e = new TypeError("cannot .spread() a non-array: " + -+ util.classString(value)); -+ } else { -+ x = tryCatch(handler).apply(this._boundValue(), value); -+ } -+ } else { -+ x = tryCatch(handler).call(receiver, value); -+ } -+ var promiseCreated = promise._popContext(); -+ bitField = promise._bitField; -+ if (((bitField & 65536) !== 0)) return; -+ -+ if (x === NEXT_FILTER) { -+ promise._reject(value); -+ } else if (x === errorObj) { -+ promise._rejectCallback(x.e, false); -+ } else { -+ debug.checkForgottenReturns(x, promiseCreated, "", promise, this); -+ promise._resolveCallback(x); -+ } -+}; -+ -+Promise.prototype._target = function() { -+ var ret = this; -+ while (ret._isFollowing()) ret = ret._followee(); -+ return ret; -+}; -+ -+Promise.prototype._followee = function() { -+ return this._rejectionHandler0; -+}; -+ -+Promise.prototype._setFollowee = function(promise) { -+ this._rejectionHandler0 = promise; -+}; -+ -+Promise.prototype._settlePromise = function(promise, handler, receiver, value) { -+ var isPromise = promise instanceof Promise; -+ var bitField = this._bitField; -+ var asyncGuaranteed = ((bitField & 134217728) !== 0); -+ if (((bitField & 65536) !== 0)) { -+ if (isPromise) promise._invokeInternalOnCancel(); -+ -+ if (receiver instanceof PassThroughHandlerContext && -+ receiver.isFinallyHandler()) { -+ receiver.cancelPromise = promise; -+ if (tryCatch(handler).call(receiver, value) === errorObj) { -+ promise._reject(errorObj.e); -+ } -+ } else if (handler === reflectHandler) { -+ promise._fulfill(reflectHandler.call(receiver)); -+ } else if (receiver instanceof Proxyable) { -+ receiver._promiseCancelled(promise); -+ } else if (isPromise || promise instanceof PromiseArray) { -+ promise._cancel(); -+ } else { -+ receiver.cancel(); -+ } -+ } else if (typeof handler === "function") { -+ if (!isPromise) { -+ handler.call(receiver, value, promise); -+ } else { -+ if (asyncGuaranteed) promise._setAsyncGuaranteed(); -+ this._settlePromiseFromHandler(handler, receiver, value, promise); -+ } -+ } else if (receiver instanceof Proxyable) { -+ if (!receiver._isResolved()) { -+ if (((bitField & 33554432) !== 0)) { -+ receiver._promiseFulfilled(value, promise); -+ } else { -+ receiver._promiseRejected(value, promise); -+ } -+ } -+ } else if (isPromise) { -+ if (asyncGuaranteed) promise._setAsyncGuaranteed(); -+ if (((bitField & 33554432) !== 0)) { -+ promise._fulfill(value); -+ } else { -+ promise._reject(value); -+ } -+ } -+}; -+ -+Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { -+ var handler = ctx.handler; -+ var promise = ctx.promise; -+ var receiver = ctx.receiver; -+ var value = ctx.value; -+ if (typeof handler === "function") { -+ if (!(promise instanceof Promise)) { -+ handler.call(receiver, value, promise); -+ } else { -+ this._settlePromiseFromHandler(handler, receiver, value, promise); -+ } -+ } else if (promise instanceof Promise) { -+ promise._reject(value); -+ } -+}; -+ -+Promise.prototype._settlePromiseCtx = function(ctx) { -+ this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); -+}; -+ -+Promise.prototype._settlePromise0 = function(handler, value, bitField) { -+ var promise = this._promise0; -+ var receiver = this._receiverAt(0); -+ this._promise0 = undefined; -+ this._receiver0 = undefined; -+ this._settlePromise(promise, handler, receiver, value); -+}; -+ -+Promise.prototype._clearCallbackDataAtIndex = function(index) { -+ var base = index * 4 - 4; -+ this[base + 2] = -+ this[base + 3] = -+ this[base + 0] = -+ this[base + 1] = undefined; -+}; -+ -+Promise.prototype._fulfill = function (value) { -+ var bitField = this._bitField; -+ if (((bitField & 117506048) >>> 16)) return; -+ if (value === this) { -+ var err = makeSelfResolutionError(); -+ this._attachExtraTrace(err); -+ return this._reject(err); -+ } -+ this._setFulfilled(); -+ this._rejectionHandler0 = value; -+ -+ if ((bitField & 65535) > 0) { -+ if (((bitField & 134217728) !== 0)) { -+ this._settlePromises(); -+ } else { -+ async.settlePromises(this); -+ } -+ this._dereferenceTrace(); -+ } -+}; -+ -+Promise.prototype._reject = function (reason) { -+ var bitField = this._bitField; -+ if (((bitField & 117506048) >>> 16)) return; -+ this._setRejected(); -+ this._fulfillmentHandler0 = reason; -+ -+ if (this._isFinal()) { -+ return async.fatalError(reason, util.isNode); -+ } -+ -+ if ((bitField & 65535) > 0) { -+ async.settlePromises(this); -+ } else { -+ this._ensurePossibleRejectionHandled(); -+ } -+}; -+ -+Promise.prototype._fulfillPromises = function (len, value) { -+ for (var i = 1; i < len; i++) { -+ var handler = this._fulfillmentHandlerAt(i); -+ var promise = this._promiseAt(i); -+ var receiver = this._receiverAt(i); -+ this._clearCallbackDataAtIndex(i); -+ this._settlePromise(promise, handler, receiver, value); -+ } -+}; -+ -+Promise.prototype._rejectPromises = function (len, reason) { -+ for (var i = 1; i < len; i++) { -+ var handler = this._rejectionHandlerAt(i); -+ var promise = this._promiseAt(i); -+ var receiver = this._receiverAt(i); -+ this._clearCallbackDataAtIndex(i); -+ this._settlePromise(promise, handler, receiver, reason); -+ } -+}; -+ -+Promise.prototype._settlePromises = function () { -+ var bitField = this._bitField; -+ var len = (bitField & 65535); -+ -+ if (len > 0) { -+ if (((bitField & 16842752) !== 0)) { -+ var reason = this._fulfillmentHandler0; -+ this._settlePromise0(this._rejectionHandler0, reason, bitField); -+ this._rejectPromises(len, reason); -+ } else { -+ var value = this._rejectionHandler0; -+ this._settlePromise0(this._fulfillmentHandler0, value, bitField); -+ this._fulfillPromises(len, value); -+ } -+ this._setLength(0); -+ } -+ this._clearCancellationData(); -+}; -+ -+Promise.prototype._settledValue = function() { -+ var bitField = this._bitField; -+ if (((bitField & 33554432) !== 0)) { -+ return this._rejectionHandler0; -+ } else if (((bitField & 16777216) !== 0)) { -+ return this._fulfillmentHandler0; -+ } -+}; -+ -+if (typeof Symbol !== "undefined" && Symbol.toStringTag) { -+ es5.defineProperty(Promise.prototype, Symbol.toStringTag, { -+ get: function () { -+ return "Object"; -+ } -+ }); -+} -+ -+function deferResolve(v) {this.promise._resolveCallback(v);} -+function deferReject(v) {this.promise._rejectCallback(v, false);} -+ -+Promise.defer = Promise.pending = function() { -+ debug.deprecated("Promise.defer", "new Promise"); -+ var promise = new Promise(INTERNAL); -+ return { -+ promise: promise, -+ resolve: deferResolve, -+ reject: deferReject -+ }; -+}; -+ -+util.notEnumerableProp(Promise, -+ "_makeSelfResolutionError", -+ makeSelfResolutionError); -+ -+require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, -+ debug); -+require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); -+require("./cancel")(Promise, PromiseArray, apiRejection, debug); -+require("./direct_resolve")(Promise); -+require("./synchronous_inspection")(Promise); -+require("./join")( -+ Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); -+Promise.Promise = Promise; -+Promise.version = "3.7.2"; -+require('./call_get.js')(Promise); -+require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); -+require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); -+require('./nodeify.js')(Promise); -+require('./promisify.js')(Promise, INTERNAL); -+require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); -+require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); -+require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); -+require('./settle.js')(Promise, PromiseArray, debug); -+require('./some.js')(Promise, PromiseArray, apiRejection); -+require('./timers.js')(Promise, INTERNAL, debug); -+require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); -+require('./any.js')(Promise); -+require('./each.js')(Promise, INTERNAL); -+require('./filter.js')(Promise, INTERNAL); -+ -+ util.toFastProperties(Promise); -+ util.toFastProperties(Promise.prototype); -+ function fillTypes(value) { -+ var p = new Promise(INTERNAL); -+ p._fulfillmentHandler0 = value; -+ p._rejectionHandler0 = value; -+ p._promise0 = value; -+ p._receiver0 = value; -+ } -+ // Complete slack tracking, opt out of field-type tracking and -+ // stabilize map -+ fillTypes({a: 1}); -+ fillTypes({b: 2}); -+ fillTypes({c: 3}); -+ fillTypes(1); -+ fillTypes(function(){}); -+ fillTypes(undefined); -+ fillTypes(false); -+ fillTypes(new Promise(INTERNAL)); -+ debug.setBounds(Async.firstLineError, util.lastLineError); -+ return Promise; -+ -+}; -+ -+}, -+"IsSNRoccvgmY0uGM4CV8480M5egmOIdH9LZysDarHPM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const alreadyWarned = new Set(); -+exports.default = (message) => { -+ if (alreadyWarned.has(message)) { -+ return; -+ } -+ alreadyWarned.add(message); -+ // @ts-expect-error Missing types. -+ process.emitWarning(`Got: ${message}`, { -+ type: 'DeprecationWarning' -+ }); -+}; -+ -+}, -+"Iw8W/NTOcztUUWA+PTwKY8BDYt6FgLlxC+5YD6s1VwY=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * has-values -+ * -+ * Copyright (c) 2014-2015, Jon Schlinkert. -+ * Licensed under the MIT License. -+ */ -+ -+'use strict'; -+ -+module.exports = function hasValue(o, noZero) { -+ if (o === null || o === undefined) { -+ return false; -+ } -+ -+ if (typeof o === 'boolean') { -+ return true; -+ } -+ -+ if (typeof o === 'number') { -+ if (o === 0 && noZero === true) { -+ return false; -+ } -+ return true; -+ } -+ -+ if (o.length !== undefined) { -+ return o.length !== 0; -+ } -+ -+ for (var key in o) { -+ if (o.hasOwnProperty(key)) { -+ return true; -+ } -+ } -+ return false; -+}; -+ -+}, -+"IywZ7iKrcbJIdFePXDP6KbXVsJelEfgyaovzTKBKKpw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+/* eslint no-prototype-builtins: 0 */ -+const flatstr = require('flatstr') -+const { -+ lsCacheSym, -+ levelValSym, -+ useOnlyCustomLevelsSym, -+ streamSym, -+ formattersSym, -+ hooksSym -+} = require('./symbols') -+const { noop, genLog } = require('./tools') -+ -+const levels = { -+ trace: 10, -+ debug: 20, -+ info: 30, -+ warn: 40, -+ error: 50, -+ fatal: 60 -+} -+const levelMethods = { -+ fatal: (hook) => { -+ const logFatal = genLog(levels.fatal, hook) -+ return function (...args) { -+ const stream = this[streamSym] -+ logFatal.call(this, ...args) -+ if (typeof stream.flushSync === 'function') { -+ try { -+ stream.flushSync() -+ } catch (e) { -+ // https://github.com/pinojs/pino/pull/740#discussion_r346788313 -+ } -+ } -+ } -+ }, -+ error: (hook) => genLog(levels.error, hook), -+ warn: (hook) => genLog(levels.warn, hook), -+ info: (hook) => genLog(levels.info, hook), -+ debug: (hook) => genLog(levels.debug, hook), -+ trace: (hook) => genLog(levels.trace, hook) -+} -+ -+const nums = Object.keys(levels).reduce((o, k) => { -+ o[levels[k]] = k -+ return o -+}, {}) -+ -+const initialLsCache = Object.keys(nums).reduce((o, k) => { -+ o[k] = flatstr('{"level":' + Number(k)) -+ return o -+}, {}) -+ -+function genLsCache (instance) { -+ const formatter = instance[formattersSym].level -+ const { labels } = instance.levels -+ const cache = {} -+ for (const label in labels) { -+ const level = formatter(labels[label], Number(label)) -+ cache[label] = JSON.stringify(level).slice(0, -1) -+ } -+ instance[lsCacheSym] = cache -+ return instance -+} -+ -+function isStandardLevel (level, useOnlyCustomLevels) { -+ if (useOnlyCustomLevels) { -+ return false -+ } -+ -+ switch (level) { -+ case 'fatal': -+ case 'error': -+ case 'warn': -+ case 'info': -+ case 'debug': -+ case 'trace': -+ return true -+ default: -+ return false -+ } -+} -+ -+function setLevel (level) { -+ const { labels, values } = this.levels -+ if (typeof level === 'number') { -+ if (labels[level] === undefined) throw Error('unknown level value' + level) -+ level = labels[level] -+ } -+ if (values[level] === undefined) throw Error('unknown level ' + level) -+ const preLevelVal = this[levelValSym] -+ const levelVal = this[levelValSym] = values[level] -+ const useOnlyCustomLevelsVal = this[useOnlyCustomLevelsSym] -+ const hook = this[hooksSym].logMethod -+ -+ for (const key in values) { -+ if (levelVal > values[key]) { -+ this[key] = noop -+ continue -+ } -+ this[key] = isStandardLevel(key, useOnlyCustomLevelsVal) ? levelMethods[key](hook) : genLog(values[key], hook) -+ } -+ -+ this.emit( -+ 'level-change', -+ level, -+ levelVal, -+ labels[preLevelVal], -+ preLevelVal -+ ) -+} -+ -+function getLevel (level) { -+ const { levels, levelVal } = this -+ // protection against potential loss of Pino scope from serializers (edge case with circular refs - https://github.com/pinojs/pino/issues/833) -+ return (levels && levels.labels) ? levels.labels[levelVal] : '' -+} -+ -+function isLevelEnabled (logLevel) { -+ const { values } = this.levels -+ const logLevelVal = values[logLevel] -+ return logLevelVal !== undefined && (logLevelVal >= this[levelValSym]) -+} -+ -+function mappings (customLevels = null, useOnlyCustomLevels = false) { -+ const customNums = customLevels -+ /* eslint-disable */ -+ ? Object.keys(customLevels).reduce((o, k) => { -+ o[customLevels[k]] = k -+ return o -+ }, {}) -+ : null -+ /* eslint-enable */ -+ -+ const labels = Object.assign( -+ Object.create(Object.prototype, { Infinity: { value: 'silent' } }), -+ useOnlyCustomLevels ? null : nums, -+ customNums -+ ) -+ const values = Object.assign( -+ Object.create(Object.prototype, { silent: { value: Infinity } }), -+ useOnlyCustomLevels ? null : levels, -+ customLevels -+ ) -+ return { labels, values } -+} -+ -+function assertDefaultLevelFound (defaultLevel, customLevels, useOnlyCustomLevels) { -+ if (typeof defaultLevel === 'number') { -+ const values = [].concat( -+ Object.keys(customLevels || {}).map(key => customLevels[key]), -+ useOnlyCustomLevels ? [] : Object.keys(nums).map(level => +level), -+ Infinity -+ ) -+ if (!values.includes(defaultLevel)) { -+ throw Error(`default level:${defaultLevel} must be included in custom levels`) -+ } -+ return -+ } -+ -+ const labels = Object.assign( -+ Object.create(Object.prototype, { silent: { value: Infinity } }), -+ useOnlyCustomLevels ? null : levels, -+ customLevels -+ ) -+ if (!(defaultLevel in labels)) { -+ throw Error(`default level:${defaultLevel} must be included in custom levels`) -+ } -+} -+ -+function assertNoLevelCollisions (levels, customLevels) { -+ const { labels, values } = levels -+ for (const k in customLevels) { -+ if (k in values) { -+ throw Error('levels cannot be overridden') -+ } -+ if (customLevels[k] in labels) { -+ throw Error('pre-existing level values cannot be used for new levels') -+ } -+ } -+} -+ -+module.exports = { -+ initialLsCache, -+ genLsCache, -+ levelMethods, -+ getLevel, -+ setLevel, -+ isLevelEnabled, -+ mappings, -+ assertNoLevelCollisions, -+ assertDefaultLevelFound -+} -+ -+}, -+"IzQ67YWyJi6B1fpujTJvtwMkjmU09vd0Ztk5vj2l8x0=": -+function (require, module, exports, __dirname, __filename) { -+var OsmPolygonFeatures = require('osm-polygon-features') -+ -+OsmPolygonFeatures = OsmPolygonFeatures.reduce(function (p, v) { -+ if (v.polygon === 'all') { -+ p[v.key] = true -+ } else { -+ var tagValues = {} -+ v.values.forEach(function (value) { tagValues[value] = true }) -+ p[v.key] = {} -+ // v.polygon is 'whitelist' || 'blacklist' -+ p[v.key][v.polygon] = tagValues -+ } -+ return p -+}, {}) -+ -+/** -+ * Check whether a given geojson feature is a polygon -+ * @param {object} feature GeoJSON Feature -+ * @param {array|function} polygonFeatures a list of tag keys and values that are polygons, -+ * for schema see https://github.com/tyrasd/osm-polygon-features/blob/master/schema.json -+ * @return {boolean} -+ */ -+module.exports = function isPolygonFeature (coords, tags, polygonFeatures) { -+ if (typeof polygonFeatures === 'function') return polygonFeatures(coords, tags) -+ polygonFeatures = polygonFeatures || OsmPolygonFeatures -+ if (!Array.isArray(coords)) return false -+ if (!coordsEqual(coords[0], coords[coords.length - 1])) return false -+ if (!tags || tags.area === 'no') return false -+ -+ var val -+ var pfk -+ for (var key in tags) { -+ val = tags[key] -+ pfk = polygonFeatures[key] -+ // continue with next if tag is unknown or not "categorizing" -+ if (typeof pfk === 'undefined') continue -+ // continue with next if tag is explicitely un-set ("building=no") -+ if (val === 'no') continue -+ // check polygon features for: general acceptance, included or excluded values -+ if (pfk === true) return true -+ if (pfk.whitelist && pfk.whitelist[val] === true) return true -+ if (pfk.blacklist && pfk.blacklist[val] !== true) return true -+ } -+ // if no tags matched, this ain't no area. -+ return false -+} -+ -+function coordsEqual (coords1, coords2) { -+ if (!coords1 || !coords2) return false -+ return coords1[0] === coords2[0] && coords1[1] === coords2[1] -+} -+ -+}, -+"J5YJ2iM2hDG8yPvNuD5NSwktQ1quiYIXLL9PqToAEqQ=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = require('./_global').document && document.documentElement; -+}, -+"JAV3eoDjvKXTlFPb8ig3dkrUvAHNtR6/AvakT9OvAMo=": -+function (require, module, exports, __dirname, __filename) { -+var dns = require('dns-discovery') -+var dht = require('bittorrent-dht') -+var thunky = require('thunky') -+var crypto = require('crypto') -+var events = require('events') -+var util = require('util') -+var debug = require('debug')('discovery-channel') -+var prettyHash = require('pretty-hash') -+var bufferFrom = require('buffer-from') -+ -+module.exports = Discovery -+ -+function Discovery (opts) { -+ if (!(this instanceof Discovery)) return new Discovery(opts) -+ if (!opts) opts = {} -+ -+ var self = this -+ -+ this.dht = opts.dht === false ? null : dht(opts.dht) -+ this.dns = opts.dns === false ? null : dns(opts.dns) -+ if (this.dns) { -+ this.dns.on('peer', ondnspeer) -+ this.dns.on('error', onwarn) // warn for dns errors as they are non critical -+ this.dns.on('warn', onwarn) -+ } -+ if (this.dht) { -+ this.dht.on('peer', ondhtpeer) -+ this.dht.on('error', onerror) -+ this.dht.on('warn', onwarn) -+ } -+ this.destroyed = false -+ this.me = {host: null, port: 0} -+ -+ this._hash = opts.hash || (opts.hash === false ? noHash : sha1) // bt dht uses sha1 so we'll default to that -+ this._dhtInterval = opts.dht && opts.dht.interval -+ this._dnsInterval = opts.dns && opts.dns.interval -+ this._announcing = {} -+ this._unhash = {} -+ this._whoami = this.dns && this.dns.whoami && thunky(whoami) -+ if (this._whoami) { -+ this._whoami() -+ } else { -+ debug('not running a whoami() - dns discovery was not enabled') -+ } -+ -+ events.EventEmitter.call(this) -+ -+ function whoami (cb) { -+ debug('whoami() started') -+ self.dns.whoami(function (_, me) { -+ if (me) { -+ debug('whoami() succeeded, I am:', me) -+ self.me = me -+ self.emit('whoami', me) -+ } else { -+ debug('whoami() failed') -+ } -+ cb() -+ }) -+ } -+ -+ function ondhtpeer (peer, infoHash, via) { -+ if (self.destroyed) return -+ var id = self._unhash[infoHash.toString('hex')] -+ if (via) debug('chan=%s dht discovery peer=%s:%s via=%s:%s', prettyHash(id), peer.host, peer.port, via.host || via.address, via.port) -+ else debug('chan=%s dht discovery peer=%s:%s', prettyHash(id), peer.host, peer.port) -+ if (id) self.emit('peer', id, peer, 'dht') -+ } -+ -+ function ondnspeer (name, peer) { -+ if (self.destroyed) return -+ var id = self._unhash[name] -+ debug('chan=%s dns discovery peer=%s:%s', prettyHash(id), peer.host, peer.port) -+ if (id) self.emit('peer', id, peer, 'dns') -+ } -+ -+ function onwarn (err) { -+ self.emit('warn', err) -+ } -+ -+ function onerror (err) { -+ self.emit('error', err) -+ } -+} -+ -+util.inherits(Discovery, events.EventEmitter) -+ -+Discovery.prototype.join = function (id, port, opts, cb) { -+ if (this.destroyed) return -+ if (typeof id === 'string') id = bufferFrom(id) -+ if (typeof opts === 'function') { -+ cb = opts -+ opts = {} -+ } -+ if (!opts) opts = {} -+ if (!cb) cb = function () {} -+ -+ var announcing = typeof port === 'number' -+ if (!port) port = 0 -+ -+ var self = this -+ var name = id.toString('hex') -+ var key = name + ':' + port -+ var hash = this._hash(id) -+ if (hash.length > 20) hash = hash.slice(0, 20) // truncate hash so it fits in the dht -+ var hashHex = hash.toString('hex') -+ var dnsTimeout = null -+ var dhtTimeout = null -+ var destroyed = false -+ var publicPort = 0 -+ var skipMulticast = false -+ -+ if (this._announcing[key]) return -+ -+ debug('chan=%s join()', prettyHash(id)) -+ -+ this._unhash[hashHex] = id -+ this._announcing[key] = { -+ id: id, -+ port: port, -+ destroy: destroy -+ } -+ -+ var pending = 0 -+ var firstQueryDone = false -+ var error = null -+ var succeded = false -+ -+ if (!opts.impliedPort || !this._whoami) return ready() -+ -+ // do a multicast only query immediately. -+ // multicast has no way to know if there will definitively be no replies -+ // so you can assume if you get no mdns responses by the time the first -+ // dns/dht responses come back then there are probably no mdns peers online -+ if (this.dns) { -+ if (announcing) this.dns.announce(hashHex, port, {server: false}) -+ else this.dns.lookup(hashHex, {server: false}) -+ } -+ -+ this._whoami(function () { -+ if (destroyed) return -+ if (self.me && self.me.port) publicPort = self.me.port -+ // since we already did it, skip multicast on the first call -+ skipMulticast = true -+ ready() -+ }) -+ -+ function queryDone (err) { -+ if (firstQueryDone) return -+ if (err) error = err -+ else succeded = true -+ if (--pending > 0) return -+ firstQueryDone = true -+ self.emit('query-done', true) -+ cb(succeded ? null : error) -+ } -+ -+ function ready () { -+ if (self.dns) { -+ pending++ -+ dns() -+ } -+ if (self.dht) { -+ pending++ -+ dht() -+ } -+ } -+ -+ function destroy () { -+ destroyed = true -+ clearTimeout(dnsTimeout) -+ clearTimeout(dhtTimeout) -+ delete self._unhash[hashHex] -+ if (self.dns) self.dns.unannounce(hashHex, port) -+ } -+ -+ function dns () { -+ if (announcing) { -+ debug('chan=%s dns %s', prettyHash(id), 'announce', {port: port, publicPort: publicPort, multicast: !skipMulticast}) -+ self.dns.announce(hashHex, port, {publicPort: publicPort, multicast: !skipMulticast}, queryDone) -+ } else { -+ debug('chan=%s dns %s', prettyHash(id), 'lookup') -+ self.dns.lookup(hashHex, {multicast: !skipMulticast}, queryDone) -+ } -+ skipMulticast = false -+ dnsTimeout = setTimeout(dns, self._dnsInterval || (60 * 1000 + (Math.random() * 10 * 1000) | 0)) -+ } -+ -+ function dht () { -+ debug('chan=%s dht %s', prettyHash(id), announcing ? 'announce' : 'lookup') -+ if (announcing) self.dht.announce(hash, publicPort || port, queryDone) -+ else self.dht.lookup(hash, queryDone) -+ dhtTimeout = setTimeout(dht, self._dhtInterval || (10 * 60 * 1000 + (Math.random() * 5 * 60 * 1000) | 0)) -+ } -+} -+ -+Discovery.prototype.leave = function (id, port) { -+ if (this.destroyed) return -+ if (!port) port = 0 -+ if (typeof id === 'string') id = bufferFrom(id) -+ var key = id.toString('hex') + ':' + port -+ if (!this._announcing[key]) return -+ debug('chan=%s leave()', prettyHash(id)) -+ this._announcing[key].destroy() -+ delete this._announcing[key] -+} -+ -+Discovery.prototype.update = function () { -+ var all = this.list() -+ for (var i = 0; i < all.length; i++) { -+ all[i].destroy() -+ this.leave(all[i].id, all[i].port) -+ this.join(all[i].id, all[i].port) -+ } -+} -+ -+Discovery.prototype.list = function () { -+ var keys = Object.keys(this._announcing) -+ var all = new Array(keys.length) -+ for (var i = 0; i < keys.length; i++) { -+ var ann = this._announcing[keys[i]] -+ all[i] = {id: ann.id, port: ann.port} -+ } -+ return all -+} -+ -+Discovery.prototype.destroy = function (cb) { -+ if (this.destroyed) { -+ if (cb) process.nextTick(cb) -+ return -+ } -+ this.destroyed = true -+ var keys = Object.keys(this._announcing) -+ for (var i = 0; i < keys.length; i++) this._announcing[keys[i]].destroy() -+ this._announcing = {} -+ if (cb) this.once('close', cb) -+ var self = this -+ -+ if (!this.dht) ondhtdestroy() -+ else this.dht.destroy(ondhtdestroy) -+ -+ function ondhtdestroy () { -+ if (!self.dns) ondnsdestroy() -+ else self.dns.destroy(ondnsdestroy) -+ } -+ -+ function ondnsdestroy () { -+ self.emit('close') -+ } -+} -+ -+function sha1 (id) { -+ return crypto.createHash('sha1').update(id).digest() -+} -+ -+function noHash (id) { -+ if (typeof id === 'string') return bufferFrom(id) -+ return id -+} -+ -+}, -+"JE27yhS4qpyba+BJEig6twS5LxHcubI76yuoFAL+zJk=": -+function (require, module, exports, __dirname, __filename) { -+/*! -+ * depd -+ * Copyright(c) 2014-2017 Douglas Christopher Wilson -+ * MIT Licensed -+ */ -+ -+/** -+ * Module dependencies. -+ */ -+ -+var callSiteToString = require('./lib/compat').callSiteToString -+var eventListenerCount = require('./lib/compat').eventListenerCount -+var relative = require('path').relative -+ -+/** -+ * Module exports. -+ */ -+ -+module.exports = depd -+ -+/** -+ * Get the path to base files on. -+ */ -+ -+var basePath = process.cwd() -+ -+/** -+ * Determine if namespace is contained in the string. -+ */ -+ -+function containsNamespace (str, namespace) { -+ var vals = str.split(/[ ,]+/) -+ var ns = String(namespace).toLowerCase() -+ -+ for (var i = 0; i < vals.length; i++) { -+ var val = vals[i] -+ -+ // namespace contained -+ if (val && (val === '*' || val.toLowerCase() === ns)) { -+ return true -+ } -+ } -+ -+ return false -+} -+ -+/** -+ * Convert a data descriptor to accessor descriptor. -+ */ -+ -+function convertDataDescriptorToAccessor (obj, prop, message) { -+ var descriptor = Object.getOwnPropertyDescriptor(obj, prop) -+ var value = descriptor.value -+ -+ descriptor.get = function getter () { return value } -+ -+ if (descriptor.writable) { -+ descriptor.set = function setter (val) { return (value = val) } -+ } -+ -+ delete descriptor.value -+ delete descriptor.writable -+ -+ Object.defineProperty(obj, prop, descriptor) -+ -+ return descriptor -+} -+ -+/** -+ * Create arguments string to keep arity. -+ */ -+ -+function createArgumentsString (arity) { -+ var str = '' -+ -+ for (var i = 0; i < arity; i++) { -+ str += ', arg' + i -+ } -+ -+ return str.substr(2) -+} -+ -+/** -+ * Create stack string from stack. -+ */ -+ -+function createStackString (stack) { -+ var str = this.name + ': ' + this.namespace -+ -+ if (this.message) { -+ str += ' deprecated ' + this.message -+ } -+ -+ for (var i = 0; i < stack.length; i++) { -+ str += '\n at ' + callSiteToString(stack[i]) -+ } -+ -+ return str -+} -+ -+/** -+ * Create deprecate for namespace in caller. -+ */ -+ -+function depd (namespace) { -+ if (!namespace) { -+ throw new TypeError('argument namespace is required') -+ } -+ -+ var stack = getStack() -+ var site = callSiteLocation(stack[1]) -+ var file = site[0] -+ -+ function deprecate (message) { -+ // call to self as log -+ log.call(deprecate, message) -+ } -+ -+ deprecate._file = file -+ deprecate._ignored = isignored(namespace) -+ deprecate._namespace = namespace -+ deprecate._traced = istraced(namespace) -+ deprecate._warned = Object.create(null) -+ -+ deprecate.function = wrapfunction -+ deprecate.property = wrapproperty -+ -+ return deprecate -+} -+ -+/** -+ * Determine if namespace is ignored. -+ */ -+ -+function isignored (namespace) { -+ /* istanbul ignore next: tested in a child processs */ -+ if (process.noDeprecation) { -+ // --no-deprecation support -+ return true -+ } -+ -+ var str = process.env.NO_DEPRECATION || '' -+ -+ // namespace ignored -+ return containsNamespace(str, namespace) -+} -+ -+/** -+ * Determine if namespace is traced. -+ */ -+ -+function istraced (namespace) { -+ /* istanbul ignore next: tested in a child processs */ -+ if (process.traceDeprecation) { -+ // --trace-deprecation support -+ return true -+ } -+ -+ var str = process.env.TRACE_DEPRECATION || '' -+ -+ // namespace traced -+ return containsNamespace(str, namespace) -+} -+ -+/** -+ * Display deprecation message. -+ */ -+ -+function log (message, site) { -+ var haslisteners = eventListenerCount(process, 'deprecation') !== 0 -+ -+ // abort early if no destination -+ if (!haslisteners && this._ignored) { -+ return -+ } -+ -+ var caller -+ var callFile -+ var callSite -+ var depSite -+ var i = 0 -+ var seen = false -+ var stack = getStack() -+ var file = this._file -+ -+ if (site) { -+ // provided site -+ depSite = site -+ callSite = callSiteLocation(stack[1]) -+ callSite.name = depSite.name -+ file = callSite[0] -+ } else { -+ // get call site -+ i = 2 -+ depSite = callSiteLocation(stack[i]) -+ callSite = depSite -+ } -+ -+ // get caller of deprecated thing in relation to file -+ for (; i < stack.length; i++) { -+ caller = callSiteLocation(stack[i]) -+ callFile = caller[0] -+ -+ if (callFile === file) { -+ seen = true -+ } else if (callFile === this._file) { -+ file = this._file -+ } else if (seen) { -+ break -+ } -+ } -+ -+ var key = caller -+ ? depSite.join(':') + '__' + caller.join(':') -+ : undefined -+ -+ if (key !== undefined && key in this._warned) { -+ // already warned -+ return -+ } -+ -+ this._warned[key] = true -+ -+ // generate automatic message from call site -+ var msg = message -+ if (!msg) { -+ msg = callSite === depSite || !callSite.name -+ ? defaultMessage(depSite) -+ : defaultMessage(callSite) -+ } -+ -+ // emit deprecation if listeners exist -+ if (haslisteners) { -+ var err = DeprecationError(this._namespace, msg, stack.slice(i)) -+ process.emit('deprecation', err) -+ return -+ } -+ -+ // format and write message -+ var format = process.stderr.isTTY -+ ? formatColor -+ : formatPlain -+ var output = format.call(this, msg, caller, stack.slice(i)) -+ process.stderr.write(output + '\n', 'utf8') -+} -+ -+/** -+ * Get call site location as array. -+ */ -+ -+function callSiteLocation (callSite) { -+ var file = callSite.getFileName() || '' -+ var line = callSite.getLineNumber() -+ var colm = callSite.getColumnNumber() -+ -+ if (callSite.isEval()) { -+ file = callSite.getEvalOrigin() + ', ' + file -+ } -+ -+ var site = [file, line, colm] -+ -+ site.callSite = callSite -+ site.name = callSite.getFunctionName() -+ -+ return site -+} -+ -+/** -+ * Generate a default message from the site. -+ */ -+ -+function defaultMessage (site) { -+ var callSite = site.callSite -+ var funcName = site.name -+ -+ // make useful anonymous name -+ if (!funcName) { -+ funcName = '' -+ } -+ -+ var context = callSite.getThis() -+ var typeName = context && callSite.getTypeName() -+ -+ // ignore useless type name -+ if (typeName === 'Object') { -+ typeName = undefined -+ } -+ -+ // make useful type name -+ if (typeName === 'Function') { -+ typeName = context.name || typeName -+ } -+ -+ return typeName && callSite.getMethodName() -+ ? typeName + '.' + funcName -+ : funcName -+} -+ -+/** -+ * Format deprecation message without color. -+ */ -+ -+function formatPlain (msg, caller, stack) { -+ var timestamp = new Date().toUTCString() -+ -+ var formatted = timestamp + -+ ' ' + this._namespace + -+ ' deprecated ' + msg -+ -+ // add stack trace -+ if (this._traced) { -+ for (var i = 0; i < stack.length; i++) { -+ formatted += '\n at ' + callSiteToString(stack[i]) -+ } -+ -+ return formatted -+ } -+ -+ if (caller) { -+ formatted += ' at ' + formatLocation(caller) -+ } -+ -+ return formatted -+} -+ -+/** -+ * Format deprecation message with color. -+ */ -+ -+function formatColor (msg, caller, stack) { -+ var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan -+ ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow -+ ' \x1b[0m' + msg + '\x1b[39m' // reset -+ -+ // add stack trace -+ if (this._traced) { -+ for (var i = 0; i < stack.length; i++) { -+ formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan -+ } -+ -+ return formatted -+ } -+ -+ if (caller) { -+ formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan -+ } -+ -+ return formatted -+} -+ -+/** -+ * Format call site location. -+ */ -+ -+function formatLocation (callSite) { -+ return relative(basePath, callSite[0]) + -+ ':' + callSite[1] + -+ ':' + callSite[2] -+} -+ -+/** -+ * Get the stack as array of call sites. -+ */ -+ -+function getStack () { -+ var limit = Error.stackTraceLimit -+ var obj = {} -+ var prep = Error.prepareStackTrace -+ -+ Error.prepareStackTrace = prepareObjectStackTrace -+ Error.stackTraceLimit = Math.max(10, limit) -+ -+ // capture the stack -+ Error.captureStackTrace(obj) -+ -+ // slice this function off the top -+ var stack = obj.stack.slice(1) -+ -+ Error.prepareStackTrace = prep -+ Error.stackTraceLimit = limit -+ -+ return stack -+} -+ -+/** -+ * Capture call site stack from v8. -+ */ -+ -+function prepareObjectStackTrace (obj, stack) { -+ return stack -+} -+ -+/** -+ * Return a wrapped function in a deprecation message. -+ */ -+ -+function wrapfunction (fn, message) { -+ if (typeof fn !== 'function') { -+ throw new TypeError('argument fn must be a function') -+ } -+ -+ var args = createArgumentsString(fn.length) -+ var deprecate = this // eslint-disable-line no-unused-vars -+ var stack = getStack() -+ var site = callSiteLocation(stack[1]) -+ -+ site.name = fn.name -+ -+ // eslint-disable-next-line no-eval -+ var deprecatedfn = eval('(function (' + args + ') {\n' + -+ '"use strict"\n' + -+ 'log.call(deprecate, message, site)\n' + -+ 'return fn.apply(this, arguments)\n' + -+ '})') -+ -+ return deprecatedfn -+} -+ -+/** -+ * Wrap property in a deprecation message. -+ */ -+ -+function wrapproperty (obj, prop, message) { -+ if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { -+ throw new TypeError('argument obj must be object') -+ } -+ -+ var descriptor = Object.getOwnPropertyDescriptor(obj, prop) -+ -+ if (!descriptor) { -+ throw new TypeError('must call property on owner object') -+ } -+ -+ if (!descriptor.configurable) { -+ throw new TypeError('property must be configurable') -+ } -+ -+ var deprecate = this -+ var stack = getStack() -+ var site = callSiteLocation(stack[1]) -+ -+ // set site name -+ site.name = prop -+ -+ // convert data descriptor -+ if ('value' in descriptor) { -+ descriptor = convertDataDescriptorToAccessor(obj, prop, message) -+ } -+ -+ var get = descriptor.get -+ var set = descriptor.set -+ -+ // wrap getter -+ if (typeof get === 'function') { -+ descriptor.get = function getter () { -+ log.call(deprecate, message, site) -+ return get.apply(this, arguments) -+ } -+ } -+ -+ // wrap setter -+ if (typeof set === 'function') { -+ descriptor.set = function setter () { -+ log.call(deprecate, message, site) -+ return set.apply(this, arguments) -+ } -+ } -+ -+ Object.defineProperty(obj, prop, descriptor) -+} -+ -+/** -+ * Create DeprecationError for deprecation -+ */ -+ -+function DeprecationError (namespace, message, stack) { -+ var error = new Error() -+ var stackString -+ -+ Object.defineProperty(error, 'constructor', { -+ value: DeprecationError -+ }) -+ -+ Object.defineProperty(error, 'message', { -+ configurable: true, -+ enumerable: false, -+ value: message, -+ writable: true -+ }) -+ -+ Object.defineProperty(error, 'name', { -+ enumerable: false, -+ configurable: true, -+ value: 'DeprecationError', -+ writable: true -+ }) -+ -+ Object.defineProperty(error, 'namespace', { -+ configurable: true, -+ enumerable: false, -+ value: namespace, -+ writable: true -+ }) -+ -+ Object.defineProperty(error, 'stack', { -+ configurable: true, -+ enumerable: false, -+ get: function () { -+ if (stackString !== undefined) { -+ return stackString -+ } -+ -+ // prepare stack trace -+ return (stackString = createStackString.call(this, stack)) -+ }, -+ set: function setter (val) { -+ stackString = val -+ } -+ }) -+ -+ return error -+} -+ -+}, -+"JEcJDDMCvGmN8JDLt0/dMktUko26YKIqTUWK+HkvYsY=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+// given a file's stat, return the size of it in string -+// humanReadable: (boolean) whether to result is human readable -+// si: (boolean) whether to use si (1k = 1000), otherwise 1k = 1024 -+// adopted from http://stackoverflow.com/a/14919494/665507 -+module.exports = function sizeToString(stat, humanReadable, si) { -+ if (stat.isDirectory && stat.isDirectory()) { -+ return ''; -+ } -+ -+ let bytes = stat.size; -+ const threshold = si ? 1000 : 1024; -+ -+ if (!humanReadable || bytes < threshold) { -+ return `${bytes}B`; -+ } -+ -+ const units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; -+ let u = -1; -+ do { -+ bytes /= threshold; -+ u += 1; -+ } while (bytes >= threshold); -+ -+ let b = bytes.toFixed(1); -+ if (isNaN(b)) b = '??'; -+ -+ return b + units[u]; -+}; -+ -+}, -+"JFrNiZOECot8qP65ahzAEZT8j8qjtJ4+qEjWTzFBY2s=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const fs = require('fs'); -+const path = require('path'); -+const crypto = require('crypto'); -+const isStream = require('is-stream'); -+ -+const {Worker} = (() => { -+ try { -+ return require('worker_threads'); -+ } catch (_) { -+ return {}; -+ } -+})(); -+ -+let worker; // Lazy -+let taskIdCounter = 0; -+const tasks = new Map(); -+ -+const recreateWorkerError = sourceError => { -+ const error = new Error(sourceError.message); -+ -+ for (const [key, value] of Object.entries(sourceError)) { -+ if (key !== 'message') { -+ error[key] = value; -+ } -+ } -+ -+ return error; -+}; -+ -+const createWorker = () => { -+ worker = new Worker(path.join(__dirname, 'thread.js')); -+ -+ worker.on('message', message => { -+ const task = tasks.get(message.id); -+ tasks.delete(message.id); -+ -+ if (tasks.size === 0) { -+ worker.unref(); -+ } -+ -+ if (message.error === undefined) { -+ task.resolve(message.value); -+ } else { -+ task.reject(recreateWorkerError(message.error)); -+ } -+ }); -+ -+ worker.on('error', error => { -+ // Any error here is effectively an equivalent of segfault, and have no scope, so we just throw it on callback level -+ throw error; -+ }); -+}; -+ -+const taskWorker = (method, args, transferList) => new Promise((resolve, reject) => { -+ const id = taskIdCounter++; -+ tasks.set(id, {resolve, reject}); -+ -+ if (worker === undefined) { -+ createWorker(); -+ } -+ -+ worker.ref(); -+ worker.postMessage({id, method, args}, transferList); -+}); -+ -+const hasha = (input, options = {}) => { -+ let outputEncoding = options.encoding || 'hex'; -+ -+ if (outputEncoding === 'buffer') { -+ outputEncoding = undefined; -+ } -+ -+ const hash = crypto.createHash(options.algorithm || 'sha512'); -+ -+ const update = buffer => { -+ const inputEncoding = typeof buffer === 'string' ? 'utf8' : undefined; -+ hash.update(buffer, inputEncoding); -+ }; -+ -+ if (Array.isArray(input)) { -+ input.forEach(update); -+ } else { -+ update(input); -+ } -+ -+ return hash.digest(outputEncoding); -+}; -+ -+hasha.stream = (options = {}) => { -+ let outputEncoding = options.encoding || 'hex'; -+ -+ if (outputEncoding === 'buffer') { -+ outputEncoding = undefined; -+ } -+ -+ const stream = crypto.createHash(options.algorithm || 'sha512'); -+ stream.setEncoding(outputEncoding); -+ return stream; -+}; -+ -+hasha.fromStream = async (stream, options = {}) => { -+ if (!isStream(stream)) { -+ throw new TypeError('Expected a stream'); -+ } -+ -+ return new Promise((resolve, reject) => { -+ // TODO: Use `stream.pipeline` and `stream.finished` when targeting Node.js 10 -+ stream -+ .on('error', reject) -+ .pipe(hasha.stream(options)) -+ .on('error', reject) -+ .on('finish', function () { -+ resolve(this.read()); -+ }); -+ }); -+}; -+ -+if (Worker === undefined) { -+ hasha.fromFile = async (filePath, options) => hasha.fromStream(fs.createReadStream(filePath), options); -+ hasha.async = async (input, options) => hasha(input, options); -+} else { -+ hasha.fromFile = async (filePath, {algorithm = 'sha512', encoding = 'hex'} = {}) => { -+ const hash = await taskWorker('hashFile', [algorithm, filePath]); -+ -+ if (encoding === 'buffer') { -+ return Buffer.from(hash); -+ } -+ -+ return Buffer.from(hash).toString(encoding); -+ }; -+ -+ hasha.async = async (input, {algorithm = 'sha512', encoding = 'hex'} = {}) => { -+ if (encoding === 'buffer') { -+ encoding = undefined; -+ } -+ -+ const hash = await taskWorker('hash', [algorithm, input]); -+ -+ if (encoding === undefined) { -+ return Buffer.from(hash); -+ } -+ -+ return Buffer.from(hash).toString(encoding); -+ }; -+} -+ -+hasha.fromFileSync = (filePath, options) => hasha(fs.readFileSync(filePath), options); -+ -+module.exports = hasha; -+ -+}, -+"JHnYdIYK5YV5dNIMDVkIUyxDUyenC92YLyp0esEp7sw=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+module.exports = function generate_if(it, $keyword, $ruleType) { -+ var out = ' '; -+ var $lvl = it.level; -+ var $dataLvl = it.dataLevel; -+ var $schema = it.schema[$keyword]; -+ var $schemaPath = it.schemaPath + it.util.getProperty($keyword); -+ var $errSchemaPath = it.errSchemaPath + '/' + $keyword; -+ var $breakOnError = !it.opts.allErrors; -+ var $data = 'data' + ($dataLvl || ''); -+ var $valid = 'valid' + $lvl; -+ var $errs = 'errs__' + $lvl; -+ var $it = it.util.copy(it); -+ $it.level++; -+ var $nextValid = 'valid' + $it.level; -+ var $thenSch = it.schema['then'], -+ $elseSch = it.schema['else'], -+ $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), -+ $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), -+ $currentBaseId = $it.baseId; -+ if ($thenPresent || $elsePresent) { -+ var $ifClause; -+ $it.createErrors = false; -+ $it.schema = $schema; -+ $it.schemaPath = $schemaPath; -+ $it.errSchemaPath = $errSchemaPath; -+ out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; -+ var $wasComposite = it.compositeRule; -+ it.compositeRule = $it.compositeRule = true; -+ out += ' ' + (it.validate($it)) + ' '; -+ $it.baseId = $currentBaseId; -+ $it.createErrors = true; -+ out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; -+ it.compositeRule = $it.compositeRule = $wasComposite; -+ if ($thenPresent) { -+ out += ' if (' + ($nextValid) + ') { '; -+ $it.schema = it.schema['then']; -+ $it.schemaPath = it.schemaPath + '.then'; -+ $it.errSchemaPath = it.errSchemaPath + '/then'; -+ out += ' ' + (it.validate($it)) + ' '; -+ $it.baseId = $currentBaseId; -+ out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; -+ if ($thenPresent && $elsePresent) { -+ $ifClause = 'ifClause' + $lvl; -+ out += ' var ' + ($ifClause) + ' = \'then\'; '; -+ } else { -+ $ifClause = '\'then\''; -+ } -+ out += ' } '; -+ if ($elsePresent) { -+ out += ' else { '; -+ } -+ } else { -+ out += ' if (!' + ($nextValid) + ') { '; -+ } -+ if ($elsePresent) { -+ $it.schema = it.schema['else']; -+ $it.schemaPath = it.schemaPath + '.else'; -+ $it.errSchemaPath = it.errSchemaPath + '/else'; -+ out += ' ' + (it.validate($it)) + ' '; -+ $it.baseId = $currentBaseId; -+ out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; -+ if ($thenPresent && $elsePresent) { -+ $ifClause = 'ifClause' + $lvl; -+ out += ' var ' + ($ifClause) + ' = \'else\'; '; -+ } else { -+ $ifClause = '\'else\''; -+ } -+ out += ' } '; -+ } -+ out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ -+ if (it.createErrors !== false) { -+ out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; -+ if (it.opts.messages !== false) { -+ out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; -+ } -+ if (it.opts.verbose) { -+ out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; -+ } -+ out += ' } '; -+ } else { -+ out += ' {} '; -+ } -+ out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; -+ if (!it.compositeRule && $breakOnError) { -+ /* istanbul ignore if */ -+ if (it.async) { -+ out += ' throw new ValidationError(vErrors); '; -+ } else { -+ out += ' validate.errors = vErrors; return false; '; -+ } -+ } -+ out += ' } '; -+ if ($breakOnError) { -+ out += ' else { '; -+ } -+ } else { -+ if ($breakOnError) { -+ out += ' if (true) { '; -+ } -+ } -+ return out; -+} -+ -+}, -+"JJX/Rco5w2nJbfJel2qBEbTYJ6mNtiHz2Al8Ab6ZQXM=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const is_1 = require("@sindresorhus/is"); -+exports.default = (url) => { -+ // Cast to URL -+ url = url; -+ const options = { -+ protocol: url.protocol, -+ hostname: is_1.default.string(url.hostname) && url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname, -+ host: url.host, -+ hash: url.hash, -+ search: url.search, -+ pathname: url.pathname, -+ href: url.href, -+ path: `${url.pathname || ''}${url.search || ''}` -+ }; -+ if (is_1.default.string(url.port) && url.port.length > 0) { -+ options.port = Number(url.port); -+ } -+ if (url.username || url.password) { -+ options.auth = `${url.username || ''}:${url.password || ''}`; -+ } -+ return options; -+}; -+ -+}, -+"JJZmUmZ4SZuz+vg605u1mV1bwsU5Xur64EScGrI8YE8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+const fs = require('./wrapped-fs') -+const path = require('path') -+const pickle = require('chromium-pickle-js') -+ -+const Filesystem = require('./filesystem') -+let filesystemCache = {} -+ -+async function copyFile (dest, src, filename) { -+ const srcFile = path.join(src, filename) -+ const targetFile = path.join(dest, filename) -+ -+ const [content, stats] = await Promise.all([fs.readFile(srcFile), fs.stat(srcFile), fs.mkdirp(path.dirname(targetFile))]) -+ return fs.writeFile(targetFile, content, { mode: stats.mode }) -+} -+ -+async function streamTransformedFile (originalFilename, outStream, transformed) { -+ return new Promise((resolve, reject) => { -+ const stream = fs.createReadStream(transformed ? transformed.path : originalFilename) -+ stream.pipe(outStream, { end: false }) -+ stream.on('error', reject) -+ stream.on('end', () => resolve()) -+ }) -+} -+ -+const writeFileListToStream = async function (dest, filesystem, out, list, metadata) { -+ for (const file of list) { -+ if (file.unpack) { // the file should not be packed into archive -+ const filename = path.relative(filesystem.src, file.filename) -+ await copyFile(`${dest}.unpacked`, filesystem.src, filename) -+ } else { -+ await streamTransformedFile(file.filename, out, metadata[file.filename].transformed) -+ } -+ } -+ return out.end() -+} -+ -+module.exports.writeFilesystem = async function (dest, filesystem, files, metadata) { -+ const headerPickle = pickle.createEmpty() -+ headerPickle.writeString(JSON.stringify(filesystem.header)) -+ const headerBuf = headerPickle.toBuffer() -+ -+ const sizePickle = pickle.createEmpty() -+ sizePickle.writeUInt32(headerBuf.length) -+ const sizeBuf = sizePickle.toBuffer() -+ -+ const out = fs.createWriteStream(dest) -+ await new Promise((resolve, reject) => { -+ out.on('error', reject) -+ out.write(sizeBuf) -+ return out.write(headerBuf, () => resolve()) -+ }) -+ return writeFileListToStream(dest, filesystem, out, files, metadata) -+} -+ -+module.exports.readArchiveHeaderSync = function (archive) { -+ const fd = fs.openSync(archive, 'r') -+ let size -+ let headerBuf -+ try { -+ const sizeBuf = Buffer.alloc(8) -+ if (fs.readSync(fd, sizeBuf, 0, 8, null) !== 8) { -+ throw new Error('Unable to read header size') -+ } -+ -+ const sizePickle = pickle.createFromBuffer(sizeBuf) -+ size = sizePickle.createIterator().readUInt32() -+ headerBuf = Buffer.alloc(size) -+ if (fs.readSync(fd, headerBuf, 0, size, null) !== size) { -+ throw new Error('Unable to read header') -+ } -+ } finally { -+ fs.closeSync(fd) -+ } -+ -+ const headerPickle = pickle.createFromBuffer(headerBuf) -+ const header = headerPickle.createIterator().readString() -+ return { header: JSON.parse(header), headerSize: size } -+} -+ -+module.exports.readFilesystemSync = function (archive) { -+ if (!filesystemCache[archive]) { -+ const header = this.readArchiveHeaderSync(archive) -+ const filesystem = new Filesystem(archive) -+ filesystem.header = header.header -+ filesystem.headerSize = header.headerSize -+ filesystemCache[archive] = filesystem -+ } -+ return filesystemCache[archive] -+} -+ -+module.exports.uncacheFilesystem = function (archive) { -+ if (filesystemCache[archive]) { -+ filesystemCache[archive] = undefined -+ return true -+ } -+ return false -+} -+ -+module.exports.uncacheAll = function () { -+ filesystemCache = {} -+} -+ -+module.exports.readFileSync = function (filesystem, filename, info) { -+ let buffer = Buffer.alloc(info.size) -+ if (info.size <= 0) { return buffer } -+ if (info.unpacked) { -+ // it's an unpacked file, copy it. -+ buffer = fs.readFileSync(path.join(`${filesystem.src}.unpacked`, filename)) -+ } else { -+ // Node throws an exception when reading 0 bytes into a 0-size buffer, -+ // so we short-circuit the read in this case. -+ const fd = fs.openSync(filesystem.src, 'r') -+ try { -+ const offset = 8 + filesystem.headerSize + parseInt(info.offset) -+ fs.readSync(fd, buffer, 0, info.size, offset) -+ } finally { -+ fs.closeSync(fd) -+ } -+ } -+ return buffer -+} -+ -+}, -+"JObyxJOqKu4sZjUhRI4fFx/e20whAia7ckTgOMhrzQ8=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+ -+var utils = require('../utils/common'); -+var adler32 = require('./adler32'); -+var crc32 = require('./crc32'); -+var inflate_fast = require('./inffast'); -+var inflate_table = require('./inftrees'); -+ -+var CODES = 0; -+var LENS = 1; -+var DISTS = 2; -+ -+/* Public constants ==========================================================*/ -+/* ===========================================================================*/ -+ -+ -+/* Allowed flush values; see deflate() and inflate() below for details */ -+//var Z_NO_FLUSH = 0; -+//var Z_PARTIAL_FLUSH = 1; -+//var Z_SYNC_FLUSH = 2; -+//var Z_FULL_FLUSH = 3; -+var Z_FINISH = 4; -+var Z_BLOCK = 5; -+var Z_TREES = 6; -+ -+ -+/* Return codes for the compression/decompression functions. Negative values -+ * are errors, positive values are used for special but normal events. -+ */ -+var Z_OK = 0; -+var Z_STREAM_END = 1; -+var Z_NEED_DICT = 2; -+//var Z_ERRNO = -1; -+var Z_STREAM_ERROR = -2; -+var Z_DATA_ERROR = -3; -+var Z_MEM_ERROR = -4; -+var Z_BUF_ERROR = -5; -+//var Z_VERSION_ERROR = -6; -+ -+/* The deflate compression method */ -+var Z_DEFLATED = 8; -+ -+ -+/* STATES ====================================================================*/ -+/* ===========================================================================*/ -+ -+ -+var HEAD = 1; /* i: waiting for magic header */ -+var FLAGS = 2; /* i: waiting for method and flags (gzip) */ -+var TIME = 3; /* i: waiting for modification time (gzip) */ -+var OS = 4; /* i: waiting for extra flags and operating system (gzip) */ -+var EXLEN = 5; /* i: waiting for extra length (gzip) */ -+var EXTRA = 6; /* i: waiting for extra bytes (gzip) */ -+var NAME = 7; /* i: waiting for end of file name (gzip) */ -+var COMMENT = 8; /* i: waiting for end of comment (gzip) */ -+var HCRC = 9; /* i: waiting for header crc (gzip) */ -+var DICTID = 10; /* i: waiting for dictionary check value */ -+var DICT = 11; /* waiting for inflateSetDictionary() call */ -+var TYPE = 12; /* i: waiting for type bits, including last-flag bit */ -+var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */ -+var STORED = 14; /* i: waiting for stored size (length and complement) */ -+var COPY_ = 15; /* i/o: same as COPY below, but only first time in */ -+var COPY = 16; /* i/o: waiting for input or output to copy stored block */ -+var TABLE = 17; /* i: waiting for dynamic block table lengths */ -+var LENLENS = 18; /* i: waiting for code length code lengths */ -+var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */ -+var LEN_ = 20; /* i: same as LEN below, but only first time in */ -+var LEN = 21; /* i: waiting for length/lit/eob code */ -+var LENEXT = 22; /* i: waiting for length extra bits */ -+var DIST = 23; /* i: waiting for distance code */ -+var DISTEXT = 24; /* i: waiting for distance extra bits */ -+var MATCH = 25; /* o: waiting for output space to copy string */ -+var LIT = 26; /* o: waiting for output space to write literal */ -+var CHECK = 27; /* i: waiting for 32-bit check value */ -+var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */ -+var DONE = 29; /* finished check, done -- remain here until reset */ -+var BAD = 30; /* got a data error -- remain here until reset */ -+var MEM = 31; /* got an inflate() memory error -- remain here until reset */ -+var SYNC = 32; /* looking for synchronization bytes to restart inflate() */ -+ -+/* ===========================================================================*/ -+ -+ -+ -+var ENOUGH_LENS = 852; -+var ENOUGH_DISTS = 592; -+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); -+ -+var MAX_WBITS = 15; -+/* 32K LZ77 window */ -+var DEF_WBITS = MAX_WBITS; -+ -+ -+function zswap32(q) { -+ return (((q >>> 24) & 0xff) + -+ ((q >>> 8) & 0xff00) + -+ ((q & 0xff00) << 8) + -+ ((q & 0xff) << 24)); -+} -+ -+ -+function InflateState() { -+ this.mode = 0; /* current inflate mode */ -+ this.last = false; /* true if processing last block */ -+ this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ -+ this.havedict = false; /* true if dictionary provided */ -+ this.flags = 0; /* gzip header method and flags (0 if zlib) */ -+ this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ -+ this.check = 0; /* protected copy of check value */ -+ this.total = 0; /* protected copy of output count */ -+ // TODO: may be {} -+ this.head = null; /* where to save gzip header information */ -+ -+ /* sliding window */ -+ this.wbits = 0; /* log base 2 of requested window size */ -+ this.wsize = 0; /* window size or zero if not using window */ -+ this.whave = 0; /* valid bytes in the window */ -+ this.wnext = 0; /* window write index */ -+ this.window = null; /* allocated sliding window, if needed */ -+ -+ /* bit accumulator */ -+ this.hold = 0; /* input bit accumulator */ -+ this.bits = 0; /* number of bits in "in" */ -+ -+ /* for string and stored block copying */ -+ this.length = 0; /* literal or length of data to copy */ -+ this.offset = 0; /* distance back to copy string from */ -+ -+ /* for table and code decoding */ -+ this.extra = 0; /* extra bits needed */ -+ -+ /* fixed and dynamic code tables */ -+ this.lencode = null; /* starting table for length/literal codes */ -+ this.distcode = null; /* starting table for distance codes */ -+ this.lenbits = 0; /* index bits for lencode */ -+ this.distbits = 0; /* index bits for distcode */ -+ -+ /* dynamic table building */ -+ this.ncode = 0; /* number of code length code lengths */ -+ this.nlen = 0; /* number of length code lengths */ -+ this.ndist = 0; /* number of distance code lengths */ -+ this.have = 0; /* number of code lengths in lens[] */ -+ this.next = null; /* next available space in codes[] */ -+ -+ this.lens = new utils.Buf16(320); /* temporary storage for code lengths */ -+ this.work = new utils.Buf16(288); /* work area for code table building */ -+ -+ /* -+ because we don't have pointers in js, we use lencode and distcode directly -+ as buffers so we don't need codes -+ */ -+ //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */ -+ this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ -+ this.distdyn = null; /* dynamic table for distance codes (JS specific) */ -+ this.sane = 0; /* if false, allow invalid distance too far */ -+ this.back = 0; /* bits back of last unprocessed length/lit */ -+ this.was = 0; /* initial length of match */ -+} -+ -+function inflateResetKeep(strm) { -+ var state; -+ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ strm.total_in = strm.total_out = state.total = 0; -+ strm.msg = ''; /*Z_NULL*/ -+ if (state.wrap) { /* to support ill-conceived Java test suite */ -+ strm.adler = state.wrap & 1; -+ } -+ state.mode = HEAD; -+ state.last = 0; -+ state.havedict = 0; -+ state.dmax = 32768; -+ state.head = null/*Z_NULL*/; -+ state.hold = 0; -+ state.bits = 0; -+ //state.lencode = state.distcode = state.next = state.codes; -+ state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS); -+ state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS); -+ -+ state.sane = 1; -+ state.back = -1; -+ //Tracev((stderr, "inflate: reset\n")); -+ return Z_OK; -+} -+ -+function inflateReset(strm) { -+ var state; -+ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ state.wsize = 0; -+ state.whave = 0; -+ state.wnext = 0; -+ return inflateResetKeep(strm); -+ -+} -+ -+function inflateReset2(strm, windowBits) { -+ var wrap; -+ var state; -+ -+ /* get the state */ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ -+ /* extract wrap request from windowBits parameter */ -+ if (windowBits < 0) { -+ wrap = 0; -+ windowBits = -windowBits; -+ } -+ else { -+ wrap = (windowBits >> 4) + 1; -+ if (windowBits < 48) { -+ windowBits &= 15; -+ } -+ } -+ -+ /* set number of window bits, free window if different */ -+ if (windowBits && (windowBits < 8 || windowBits > 15)) { -+ return Z_STREAM_ERROR; -+ } -+ if (state.window !== null && state.wbits !== windowBits) { -+ state.window = null; -+ } -+ -+ /* update state and reset the rest of it */ -+ state.wrap = wrap; -+ state.wbits = windowBits; -+ return inflateReset(strm); -+} -+ -+function inflateInit2(strm, windowBits) { -+ var ret; -+ var state; -+ -+ if (!strm) { return Z_STREAM_ERROR; } -+ //strm.msg = Z_NULL; /* in case we return an error */ -+ -+ state = new InflateState(); -+ -+ //if (state === Z_NULL) return Z_MEM_ERROR; -+ //Tracev((stderr, "inflate: allocated\n")); -+ strm.state = state; -+ state.window = null/*Z_NULL*/; -+ ret = inflateReset2(strm, windowBits); -+ if (ret !== Z_OK) { -+ strm.state = null/*Z_NULL*/; -+ } -+ return ret; -+} -+ -+function inflateInit(strm) { -+ return inflateInit2(strm, DEF_WBITS); -+} -+ -+ -+/* -+ Return state with length and distance decoding tables and index sizes set to -+ fixed code decoding. Normally this returns fixed tables from inffixed.h. -+ If BUILDFIXED is defined, then instead this routine builds the tables the -+ first time it's called, and returns those tables the first time and -+ thereafter. This reduces the size of the code by about 2K bytes, in -+ exchange for a little execution time. However, BUILDFIXED should not be -+ used for threaded applications, since the rewriting of the tables and virgin -+ may not be thread-safe. -+ */ -+var virgin = true; -+ -+var lenfix, distfix; // We have no pointers in JS, so keep tables separate -+ -+function fixedtables(state) { -+ /* build fixed huffman tables if first call (may not be thread safe) */ -+ if (virgin) { -+ var sym; -+ -+ lenfix = new utils.Buf32(512); -+ distfix = new utils.Buf32(32); -+ -+ /* literal/length table */ -+ sym = 0; -+ while (sym < 144) { state.lens[sym++] = 8; } -+ while (sym < 256) { state.lens[sym++] = 9; } -+ while (sym < 280) { state.lens[sym++] = 7; } -+ while (sym < 288) { state.lens[sym++] = 8; } -+ -+ inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); -+ -+ /* distance table */ -+ sym = 0; -+ while (sym < 32) { state.lens[sym++] = 5; } -+ -+ inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); -+ -+ /* do this just once */ -+ virgin = false; -+ } -+ -+ state.lencode = lenfix; -+ state.lenbits = 9; -+ state.distcode = distfix; -+ state.distbits = 5; -+} -+ -+ -+/* -+ Update the window with the last wsize (normally 32K) bytes written before -+ returning. If window does not exist yet, create it. This is only called -+ when a window is already in use, or when output has been written during this -+ inflate call, but the end of the deflate stream has not been reached yet. -+ It is also called to create a window for dictionary data when a dictionary -+ is loaded. -+ -+ Providing output buffers larger than 32K to inflate() should provide a speed -+ advantage, since only the last 32K of output is copied to the sliding window -+ upon return from inflate(), and since all distances after the first 32K of -+ output will fall in the output data, making match copies simpler and faster. -+ The advantage may be dependent on the size of the processor's data caches. -+ */ -+function updatewindow(strm, src, end, copy) { -+ var dist; -+ var state = strm.state; -+ -+ /* if it hasn't been done already, allocate space for the window */ -+ if (state.window === null) { -+ state.wsize = 1 << state.wbits; -+ state.wnext = 0; -+ state.whave = 0; -+ -+ state.window = new utils.Buf8(state.wsize); -+ } -+ -+ /* copy state->wsize or less output bytes into the circular window */ -+ if (copy >= state.wsize) { -+ utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); -+ state.wnext = 0; -+ state.whave = state.wsize; -+ } -+ else { -+ dist = state.wsize - state.wnext; -+ if (dist > copy) { -+ dist = copy; -+ } -+ //zmemcpy(state->window + state->wnext, end - copy, dist); -+ utils.arraySet(state.window, src, end - copy, dist, state.wnext); -+ copy -= dist; -+ if (copy) { -+ //zmemcpy(state->window, end - copy, copy); -+ utils.arraySet(state.window, src, end - copy, copy, 0); -+ state.wnext = copy; -+ state.whave = state.wsize; -+ } -+ else { -+ state.wnext += dist; -+ if (state.wnext === state.wsize) { state.wnext = 0; } -+ if (state.whave < state.wsize) { state.whave += dist; } -+ } -+ } -+ return 0; -+} -+ -+function inflate(strm, flush) { -+ var state; -+ var input, output; // input/output buffers -+ var next; /* next input INDEX */ -+ var put; /* next output INDEX */ -+ var have, left; /* available input and output */ -+ var hold; /* bit buffer */ -+ var bits; /* bits in bit buffer */ -+ var _in, _out; /* save starting available input and output */ -+ var copy; /* number of stored or match bytes to copy */ -+ var from; /* where to copy match bytes from */ -+ var from_source; -+ var here = 0; /* current decoding table entry */ -+ var here_bits, here_op, here_val; // paked "here" denormalized (JS specific) -+ //var last; /* parent table entry */ -+ var last_bits, last_op, last_val; // paked "last" denormalized (JS specific) -+ var len; /* length to copy for repeats, bits to drop */ -+ var ret; /* return code */ -+ var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */ -+ var opts; -+ -+ var n; // temporary var for NEED_BITS -+ -+ var order = /* permutation of code lengths */ -+ [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; -+ -+ -+ if (!strm || !strm.state || !strm.output || -+ (!strm.input && strm.avail_in !== 0)) { -+ return Z_STREAM_ERROR; -+ } -+ -+ state = strm.state; -+ if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ -+ -+ -+ //--- LOAD() --- -+ put = strm.next_out; -+ output = strm.output; -+ left = strm.avail_out; -+ next = strm.next_in; -+ input = strm.input; -+ have = strm.avail_in; -+ hold = state.hold; -+ bits = state.bits; -+ //--- -+ -+ _in = have; -+ _out = left; -+ ret = Z_OK; -+ -+ inf_leave: // goto emulation -+ for (;;) { -+ switch (state.mode) { -+ case HEAD: -+ if (state.wrap === 0) { -+ state.mode = TYPEDO; -+ break; -+ } -+ //=== NEEDBITS(16); -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ -+ state.check = 0/*crc32(0L, Z_NULL, 0)*/; -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = FLAGS; -+ break; -+ } -+ state.flags = 0; /* expect zlib header */ -+ if (state.head) { -+ state.head.done = false; -+ } -+ if (!(state.wrap & 1) || /* check if zlib header allowed */ -+ (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { -+ strm.msg = 'incorrect header check'; -+ state.mode = BAD; -+ break; -+ } -+ if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { -+ strm.msg = 'unknown compression method'; -+ state.mode = BAD; -+ break; -+ } -+ //--- DROPBITS(4) ---// -+ hold >>>= 4; -+ bits -= 4; -+ //---// -+ len = (hold & 0x0f)/*BITS(4)*/ + 8; -+ if (state.wbits === 0) { -+ state.wbits = len; -+ } -+ else if (len > state.wbits) { -+ strm.msg = 'invalid window size'; -+ state.mode = BAD; -+ break; -+ } -+ state.dmax = 1 << len; -+ //Tracev((stderr, "inflate: zlib header ok\n")); -+ strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; -+ state.mode = hold & 0x200 ? DICTID : TYPE; -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ break; -+ case FLAGS: -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.flags = hold; -+ if ((state.flags & 0xff) !== Z_DEFLATED) { -+ strm.msg = 'unknown compression method'; -+ state.mode = BAD; -+ break; -+ } -+ if (state.flags & 0xe000) { -+ strm.msg = 'unknown header flags set'; -+ state.mode = BAD; -+ break; -+ } -+ if (state.head) { -+ state.head.text = ((hold >> 8) & 1); -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = TIME; -+ /* falls through */ -+ case TIME: -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (state.head) { -+ state.head.time = hold; -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC4(state.check, hold) -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ hbuf[2] = (hold >>> 16) & 0xff; -+ hbuf[3] = (hold >>> 24) & 0xff; -+ state.check = crc32(state.check, hbuf, 4, 0); -+ //=== -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = OS; -+ /* falls through */ -+ case OS: -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (state.head) { -+ state.head.xflags = (hold & 0xff); -+ state.head.os = (hold >> 8); -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = EXLEN; -+ /* falls through */ -+ case EXLEN: -+ if (state.flags & 0x0400) { -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.length = hold; -+ if (state.head) { -+ state.head.extra_len = hold; -+ } -+ if (state.flags & 0x0200) { -+ //=== CRC2(state.check, hold); -+ hbuf[0] = hold & 0xff; -+ hbuf[1] = (hold >>> 8) & 0xff; -+ state.check = crc32(state.check, hbuf, 2, 0); -+ //===// -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ } -+ else if (state.head) { -+ state.head.extra = null/*Z_NULL*/; -+ } -+ state.mode = EXTRA; -+ /* falls through */ -+ case EXTRA: -+ if (state.flags & 0x0400) { -+ copy = state.length; -+ if (copy > have) { copy = have; } -+ if (copy) { -+ if (state.head) { -+ len = state.head.extra_len - state.length; -+ if (!state.head.extra) { -+ // Use untyped array for more conveniend processing later -+ state.head.extra = new Array(state.head.extra_len); -+ } -+ utils.arraySet( -+ state.head.extra, -+ input, -+ next, -+ // extra field is limited to 65536 bytes -+ // - no need for additional size check -+ copy, -+ /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ -+ len -+ ); -+ //zmemcpy(state.head.extra + len, next, -+ // len + copy > state.head.extra_max ? -+ // state.head.extra_max - len : copy); -+ } -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ state.length -= copy; -+ } -+ if (state.length) { break inf_leave; } -+ } -+ state.length = 0; -+ state.mode = NAME; -+ /* falls through */ -+ case NAME: -+ if (state.flags & 0x0800) { -+ if (have === 0) { break inf_leave; } -+ copy = 0; -+ do { -+ // TODO: 2 or 1 bytes? -+ len = input[next + copy++]; -+ /* use constant limit because in js we should not preallocate memory */ -+ if (state.head && len && -+ (state.length < 65536 /*state.head.name_max*/)) { -+ state.head.name += String.fromCharCode(len); -+ } -+ } while (len && copy < have); -+ -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ if (len) { break inf_leave; } -+ } -+ else if (state.head) { -+ state.head.name = null; -+ } -+ state.length = 0; -+ state.mode = COMMENT; -+ /* falls through */ -+ case COMMENT: -+ if (state.flags & 0x1000) { -+ if (have === 0) { break inf_leave; } -+ copy = 0; -+ do { -+ len = input[next + copy++]; -+ /* use constant limit because in js we should not preallocate memory */ -+ if (state.head && len && -+ (state.length < 65536 /*state.head.comm_max*/)) { -+ state.head.comment += String.fromCharCode(len); -+ } -+ } while (len && copy < have); -+ if (state.flags & 0x0200) { -+ state.check = crc32(state.check, input, copy, next); -+ } -+ have -= copy; -+ next += copy; -+ if (len) { break inf_leave; } -+ } -+ else if (state.head) { -+ state.head.comment = null; -+ } -+ state.mode = HCRC; -+ /* falls through */ -+ case HCRC: -+ if (state.flags & 0x0200) { -+ //=== NEEDBITS(16); */ -+ while (bits < 16) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (hold !== (state.check & 0xffff)) { -+ strm.msg = 'header crc mismatch'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ } -+ if (state.head) { -+ state.head.hcrc = ((state.flags >> 9) & 1); -+ state.head.done = true; -+ } -+ strm.adler = state.check = 0; -+ state.mode = TYPE; -+ break; -+ case DICTID: -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ strm.adler = state.check = zswap32(hold); -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = DICT; -+ /* falls through */ -+ case DICT: -+ if (state.havedict === 0) { -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ return Z_NEED_DICT; -+ } -+ strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; -+ state.mode = TYPE; -+ /* falls through */ -+ case TYPE: -+ if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case TYPEDO: -+ if (state.last) { -+ //--- BYTEBITS() ---// -+ hold >>>= bits & 7; -+ bits -= bits & 7; -+ //---// -+ state.mode = CHECK; -+ break; -+ } -+ //=== NEEDBITS(3); */ -+ while (bits < 3) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.last = (hold & 0x01)/*BITS(1)*/; -+ //--- DROPBITS(1) ---// -+ hold >>>= 1; -+ bits -= 1; -+ //---// -+ -+ switch ((hold & 0x03)/*BITS(2)*/) { -+ case 0: /* stored block */ -+ //Tracev((stderr, "inflate: stored block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = STORED; -+ break; -+ case 1: /* fixed block */ -+ fixedtables(state); -+ //Tracev((stderr, "inflate: fixed codes block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = LEN_; /* decode codes */ -+ if (flush === Z_TREES) { -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ break inf_leave; -+ } -+ break; -+ case 2: /* dynamic block */ -+ //Tracev((stderr, "inflate: dynamic codes block%s\n", -+ // state.last ? " (last)" : "")); -+ state.mode = TABLE; -+ break; -+ case 3: -+ strm.msg = 'invalid block type'; -+ state.mode = BAD; -+ } -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ break; -+ case STORED: -+ //--- BYTEBITS() ---// /* go to byte boundary */ -+ hold >>>= bits & 7; -+ bits -= bits & 7; -+ //---// -+ //=== NEEDBITS(32); */ -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { -+ strm.msg = 'invalid stored block lengths'; -+ state.mode = BAD; -+ break; -+ } -+ state.length = hold & 0xffff; -+ //Tracev((stderr, "inflate: stored length %u\n", -+ // state.length)); -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ state.mode = COPY_; -+ if (flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case COPY_: -+ state.mode = COPY; -+ /* falls through */ -+ case COPY: -+ copy = state.length; -+ if (copy) { -+ if (copy > have) { copy = have; } -+ if (copy > left) { copy = left; } -+ if (copy === 0) { break inf_leave; } -+ //--- zmemcpy(put, next, copy); --- -+ utils.arraySet(output, input, next, copy, put); -+ //---// -+ have -= copy; -+ next += copy; -+ left -= copy; -+ put += copy; -+ state.length -= copy; -+ break; -+ } -+ //Tracev((stderr, "inflate: stored end\n")); -+ state.mode = TYPE; -+ break; -+ case TABLE: -+ //=== NEEDBITS(14); */ -+ while (bits < 14) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; -+ //--- DROPBITS(5) ---// -+ hold >>>= 5; -+ bits -= 5; -+ //---// -+ state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; -+ //--- DROPBITS(5) ---// -+ hold >>>= 5; -+ bits -= 5; -+ //---// -+ state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; -+ //--- DROPBITS(4) ---// -+ hold >>>= 4; -+ bits -= 4; -+ //---// -+//#ifndef PKZIP_BUG_WORKAROUND -+ if (state.nlen > 286 || state.ndist > 30) { -+ strm.msg = 'too many length or distance symbols'; -+ state.mode = BAD; -+ break; -+ } -+//#endif -+ //Tracev((stderr, "inflate: table sizes ok\n")); -+ state.have = 0; -+ state.mode = LENLENS; -+ /* falls through */ -+ case LENLENS: -+ while (state.have < state.ncode) { -+ //=== NEEDBITS(3); -+ while (bits < 3) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); -+ //--- DROPBITS(3) ---// -+ hold >>>= 3; -+ bits -= 3; -+ //---// -+ } -+ while (state.have < 19) { -+ state.lens[order[state.have++]] = 0; -+ } -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ //state.next = state.codes; -+ //state.lencode = state.next; -+ // Switch to use dynamic table -+ state.lencode = state.lendyn; -+ state.lenbits = 7; -+ -+ opts = { bits: state.lenbits }; -+ ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); -+ state.lenbits = opts.bits; -+ -+ if (ret) { -+ strm.msg = 'invalid code lengths set'; -+ state.mode = BAD; -+ break; -+ } -+ //Tracev((stderr, "inflate: code lengths ok\n")); -+ state.have = 0; -+ state.mode = CODELENS; -+ /* falls through */ -+ case CODELENS: -+ while (state.have < state.nlen + state.ndist) { -+ for (;;) { -+ here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if (here_val < 16) { -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.lens[state.have++] = here_val; -+ } -+ else { -+ if (here_val === 16) { -+ //=== NEEDBITS(here.bits + 2); -+ n = here_bits + 2; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ if (state.have === 0) { -+ strm.msg = 'invalid bit length repeat'; -+ state.mode = BAD; -+ break; -+ } -+ len = state.lens[state.have - 1]; -+ copy = 3 + (hold & 0x03);//BITS(2); -+ //--- DROPBITS(2) ---// -+ hold >>>= 2; -+ bits -= 2; -+ //---// -+ } -+ else if (here_val === 17) { -+ //=== NEEDBITS(here.bits + 3); -+ n = here_bits + 3; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ len = 0; -+ copy = 3 + (hold & 0x07);//BITS(3); -+ //--- DROPBITS(3) ---// -+ hold >>>= 3; -+ bits -= 3; -+ //---// -+ } -+ else { -+ //=== NEEDBITS(here.bits + 7); -+ n = here_bits + 7; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ len = 0; -+ copy = 11 + (hold & 0x7f);//BITS(7); -+ //--- DROPBITS(7) ---// -+ hold >>>= 7; -+ bits -= 7; -+ //---// -+ } -+ if (state.have + copy > state.nlen + state.ndist) { -+ strm.msg = 'invalid bit length repeat'; -+ state.mode = BAD; -+ break; -+ } -+ while (copy--) { -+ state.lens[state.have++] = len; -+ } -+ } -+ } -+ -+ /* handle error breaks in while */ -+ if (state.mode === BAD) { break; } -+ -+ /* check for end-of-block code (better have one) */ -+ if (state.lens[256] === 0) { -+ strm.msg = 'invalid code -- missing end-of-block'; -+ state.mode = BAD; -+ break; -+ } -+ -+ /* build code tables -- note: do not change the lenbits or distbits -+ values here (9 and 6) without reading the comments in inftrees.h -+ concerning the ENOUGH constants, which depend on those values */ -+ state.lenbits = 9; -+ -+ opts = { bits: state.lenbits }; -+ ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ // state.next_index = opts.table_index; -+ state.lenbits = opts.bits; -+ // state.lencode = state.next; -+ -+ if (ret) { -+ strm.msg = 'invalid literal/lengths set'; -+ state.mode = BAD; -+ break; -+ } -+ -+ state.distbits = 6; -+ //state.distcode.copy(state.codes); -+ // Switch to use dynamic table -+ state.distcode = state.distdyn; -+ opts = { bits: state.distbits }; -+ ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); -+ // We have separate tables & no pointers. 2 commented lines below not needed. -+ // state.next_index = opts.table_index; -+ state.distbits = opts.bits; -+ // state.distcode = state.next; -+ -+ if (ret) { -+ strm.msg = 'invalid distances set'; -+ state.mode = BAD; -+ break; -+ } -+ //Tracev((stderr, 'inflate: codes ok\n')); -+ state.mode = LEN_; -+ if (flush === Z_TREES) { break inf_leave; } -+ /* falls through */ -+ case LEN_: -+ state.mode = LEN; -+ /* falls through */ -+ case LEN: -+ if (have >= 6 && left >= 258) { -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ inflate_fast(strm, _out); -+ //--- LOAD() --- -+ put = strm.next_out; -+ output = strm.output; -+ left = strm.avail_out; -+ next = strm.next_in; -+ input = strm.input; -+ have = strm.avail_in; -+ hold = state.hold; -+ bits = state.bits; -+ //--- -+ -+ if (state.mode === TYPE) { -+ state.back = -1; -+ } -+ break; -+ } -+ state.back = 0; -+ for (;;) { -+ here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if (here_bits <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if (here_op && (here_op & 0xf0) === 0) { -+ last_bits = here_bits; -+ last_op = here_op; -+ last_val = here_val; -+ for (;;) { -+ here = state.lencode[last_val + -+ ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((last_bits + here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ //--- DROPBITS(last.bits) ---// -+ hold >>>= last_bits; -+ bits -= last_bits; -+ //---// -+ state.back += last_bits; -+ } -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.back += here_bits; -+ state.length = here_val; -+ if (here_op === 0) { -+ //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? -+ // "inflate: literal '%c'\n" : -+ // "inflate: literal 0x%02x\n", here.val)); -+ state.mode = LIT; -+ break; -+ } -+ if (here_op & 32) { -+ //Tracevv((stderr, "inflate: end of block\n")); -+ state.back = -1; -+ state.mode = TYPE; -+ break; -+ } -+ if (here_op & 64) { -+ strm.msg = 'invalid literal/length code'; -+ state.mode = BAD; -+ break; -+ } -+ state.extra = here_op & 15; -+ state.mode = LENEXT; -+ /* falls through */ -+ case LENEXT: -+ if (state.extra) { -+ //=== NEEDBITS(state.extra); -+ n = state.extra; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; -+ //--- DROPBITS(state.extra) ---// -+ hold >>>= state.extra; -+ bits -= state.extra; -+ //---// -+ state.back += state.extra; -+ } -+ //Tracevv((stderr, "inflate: length %u\n", state.length)); -+ state.was = state.length; -+ state.mode = DIST; -+ /* falls through */ -+ case DIST: -+ for (;;) { -+ here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ if ((here_op & 0xf0) === 0) { -+ last_bits = here_bits; -+ last_op = here_op; -+ last_val = here_val; -+ for (;;) { -+ here = state.distcode[last_val + -+ ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; -+ here_bits = here >>> 24; -+ here_op = (here >>> 16) & 0xff; -+ here_val = here & 0xffff; -+ -+ if ((last_bits + here_bits) <= bits) { break; } -+ //--- PULLBYTE() ---// -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ //---// -+ } -+ //--- DROPBITS(last.bits) ---// -+ hold >>>= last_bits; -+ bits -= last_bits; -+ //---// -+ state.back += last_bits; -+ } -+ //--- DROPBITS(here.bits) ---// -+ hold >>>= here_bits; -+ bits -= here_bits; -+ //---// -+ state.back += here_bits; -+ if (here_op & 64) { -+ strm.msg = 'invalid distance code'; -+ state.mode = BAD; -+ break; -+ } -+ state.offset = here_val; -+ state.extra = (here_op) & 15; -+ state.mode = DISTEXT; -+ /* falls through */ -+ case DISTEXT: -+ if (state.extra) { -+ //=== NEEDBITS(state.extra); -+ n = state.extra; -+ while (bits < n) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; -+ //--- DROPBITS(state.extra) ---// -+ hold >>>= state.extra; -+ bits -= state.extra; -+ //---// -+ state.back += state.extra; -+ } -+//#ifdef INFLATE_STRICT -+ if (state.offset > state.dmax) { -+ strm.msg = 'invalid distance too far back'; -+ state.mode = BAD; -+ break; -+ } -+//#endif -+ //Tracevv((stderr, "inflate: distance %u\n", state.offset)); -+ state.mode = MATCH; -+ /* falls through */ -+ case MATCH: -+ if (left === 0) { break inf_leave; } -+ copy = _out - left; -+ if (state.offset > copy) { /* copy from window */ -+ copy = state.offset - copy; -+ if (copy > state.whave) { -+ if (state.sane) { -+ strm.msg = 'invalid distance too far back'; -+ state.mode = BAD; -+ break; -+ } -+// (!) This block is disabled in zlib defailts, -+// don't enable it for binary compatibility -+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR -+// Trace((stderr, "inflate.c too far\n")); -+// copy -= state.whave; -+// if (copy > state.length) { copy = state.length; } -+// if (copy > left) { copy = left; } -+// left -= copy; -+// state.length -= copy; -+// do { -+// output[put++] = 0; -+// } while (--copy); -+// if (state.length === 0) { state.mode = LEN; } -+// break; -+//#endif -+ } -+ if (copy > state.wnext) { -+ copy -= state.wnext; -+ from = state.wsize - copy; -+ } -+ else { -+ from = state.wnext - copy; -+ } -+ if (copy > state.length) { copy = state.length; } -+ from_source = state.window; -+ } -+ else { /* copy from output */ -+ from_source = output; -+ from = put - state.offset; -+ copy = state.length; -+ } -+ if (copy > left) { copy = left; } -+ left -= copy; -+ state.length -= copy; -+ do { -+ output[put++] = from_source[from++]; -+ } while (--copy); -+ if (state.length === 0) { state.mode = LEN; } -+ break; -+ case LIT: -+ if (left === 0) { break inf_leave; } -+ output[put++] = state.length; -+ left--; -+ state.mode = LEN; -+ break; -+ case CHECK: -+ if (state.wrap) { -+ //=== NEEDBITS(32); -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ // Use '|' insdead of '+' to make sure that result is signed -+ hold |= input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ _out -= left; -+ strm.total_out += _out; -+ state.total += _out; -+ if (_out) { -+ strm.adler = state.check = -+ /*UPDATE(state.check, put - _out, _out);*/ -+ (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out)); -+ -+ } -+ _out = left; -+ // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too -+ if ((state.flags ? hold : zswap32(hold)) !== state.check) { -+ strm.msg = 'incorrect data check'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ //Tracev((stderr, "inflate: check matches trailer\n")); -+ } -+ state.mode = LENGTH; -+ /* falls through */ -+ case LENGTH: -+ if (state.wrap && state.flags) { -+ //=== NEEDBITS(32); -+ while (bits < 32) { -+ if (have === 0) { break inf_leave; } -+ have--; -+ hold += input[next++] << bits; -+ bits += 8; -+ } -+ //===// -+ if (hold !== (state.total & 0xffffffff)) { -+ strm.msg = 'incorrect length check'; -+ state.mode = BAD; -+ break; -+ } -+ //=== INITBITS(); -+ hold = 0; -+ bits = 0; -+ //===// -+ //Tracev((stderr, "inflate: length matches trailer\n")); -+ } -+ state.mode = DONE; -+ /* falls through */ -+ case DONE: -+ ret = Z_STREAM_END; -+ break inf_leave; -+ case BAD: -+ ret = Z_DATA_ERROR; -+ break inf_leave; -+ case MEM: -+ return Z_MEM_ERROR; -+ case SYNC: -+ /* falls through */ -+ default: -+ return Z_STREAM_ERROR; -+ } -+ } -+ -+ // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" -+ -+ /* -+ Return from inflate(), updating the total counts and the check value. -+ If there was no progress during the inflate() call, return a buffer -+ error. Call updatewindow() to create and/or update the window state. -+ Note: a memory error from inflate() is non-recoverable. -+ */ -+ -+ //--- RESTORE() --- -+ strm.next_out = put; -+ strm.avail_out = left; -+ strm.next_in = next; -+ strm.avail_in = have; -+ state.hold = hold; -+ state.bits = bits; -+ //--- -+ -+ if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && -+ (state.mode < CHECK || flush !== Z_FINISH))) { -+ if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { -+ state.mode = MEM; -+ return Z_MEM_ERROR; -+ } -+ } -+ _in -= strm.avail_in; -+ _out -= strm.avail_out; -+ strm.total_in += _in; -+ strm.total_out += _out; -+ state.total += _out; -+ if (state.wrap && _out) { -+ strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ -+ (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); -+ } -+ strm.data_type = state.bits + (state.last ? 64 : 0) + -+ (state.mode === TYPE ? 128 : 0) + -+ (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); -+ if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { -+ ret = Z_BUF_ERROR; -+ } -+ return ret; -+} -+ -+function inflateEnd(strm) { -+ -+ if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { -+ return Z_STREAM_ERROR; -+ } -+ -+ var state = strm.state; -+ if (state.window) { -+ state.window = null; -+ } -+ strm.state = null; -+ return Z_OK; -+} -+ -+function inflateGetHeader(strm, head) { -+ var state; -+ -+ /* check state */ -+ if (!strm || !strm.state) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } -+ -+ /* save header structure */ -+ state.head = head; -+ head.done = false; -+ return Z_OK; -+} -+ -+function inflateSetDictionary(strm, dictionary) { -+ var dictLength = dictionary.length; -+ -+ var state; -+ var dictid; -+ var ret; -+ -+ /* check state */ -+ if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } -+ state = strm.state; -+ -+ if (state.wrap !== 0 && state.mode !== DICT) { -+ return Z_STREAM_ERROR; -+ } -+ -+ /* check for correct dictionary identifier */ -+ if (state.mode === DICT) { -+ dictid = 1; /* adler32(0, null, 0)*/ -+ /* dictid = adler32(dictid, dictionary, dictLength); */ -+ dictid = adler32(dictid, dictionary, dictLength, 0); -+ if (dictid !== state.check) { -+ return Z_DATA_ERROR; -+ } -+ } -+ /* copy dictionary to window using updatewindow(), which will amend the -+ existing dictionary if appropriate */ -+ ret = updatewindow(strm, dictionary, dictLength, dictLength); -+ if (ret) { -+ state.mode = MEM; -+ return Z_MEM_ERROR; -+ } -+ state.havedict = 1; -+ // Tracev((stderr, "inflate: dictionary set\n")); -+ return Z_OK; -+} -+ -+exports.inflateReset = inflateReset; -+exports.inflateReset2 = inflateReset2; -+exports.inflateResetKeep = inflateResetKeep; -+exports.inflateInit = inflateInit; -+exports.inflateInit2 = inflateInit2; -+exports.inflate = inflate; -+exports.inflateEnd = inflateEnd; -+exports.inflateGetHeader = inflateGetHeader; -+exports.inflateSetDictionary = inflateSetDictionary; -+exports.inflateInfo = 'pako inflate (from Nodeca project)'; -+ -+/* Not implemented -+exports.inflateCopy = inflateCopy; -+exports.inflateGetDictionary = inflateGetDictionary; -+exports.inflateMark = inflateMark; -+exports.inflatePrime = inflatePrime; -+exports.inflateSync = inflateSync; -+exports.inflateSyncPoint = inflateSyncPoint; -+exports.inflateUndermine = inflateUndermine; -+*/ -+ -+}, -+"JQUWqPrxzybLootNzf7fwZU1DfeC7elK7n/pnBLUmRo=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = function (B, index, n) { -+ return index*(B) + (B-1)*(n+1) -+} -+ -+}, -+"JXw1D7La1gdPEJXH8inkV/9Ekvf3JPYiuxoCiiVbpYE=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+ -+const safeBuffer = require('safe-buffer'); -+const Limiter = require('async-limiter'); -+const zlib = require('zlib'); -+ -+const bufferUtil = require('./BufferUtil'); -+ -+const Buffer = safeBuffer.Buffer; -+ -+const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); -+const EMPTY_BLOCK = Buffer.from([0x00]); -+ -+const kWriteInProgress = Symbol('write-in-progress'); -+const kPendingClose = Symbol('pending-close'); -+const kTotalLength = Symbol('total-length'); -+const kCallback = Symbol('callback'); -+const kBuffers = Symbol('buffers'); -+const kError = Symbol('error'); -+const kOwner = Symbol('owner'); -+ -+// -+// We limit zlib concurrency, which prevents severe memory fragmentation -+// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913 -+// and https://github.com/websockets/ws/issues/1202 -+// -+// Intentionally global; it's the global thread pool that's an issue. -+// -+let zlibLimiter; -+ -+/** -+ * permessage-deflate implementation. -+ */ -+class PerMessageDeflate { -+ /** -+ * Creates a PerMessageDeflate instance. -+ * -+ * @param {Object} options Configuration options -+ * @param {Boolean} options.serverNoContextTakeover Request/accept disabling -+ * of server context takeover -+ * @param {Boolean} options.clientNoContextTakeover Advertise/acknowledge -+ * disabling of client context takeover -+ * @param {(Boolean|Number)} options.serverMaxWindowBits Request/confirm the -+ * use of a custom server window size -+ * @param {(Boolean|Number)} options.clientMaxWindowBits Advertise support -+ * for, or request, a custom client window size -+ * @param {Number} options.level The value of zlib's `level` param -+ * @param {Number} options.memLevel The value of zlib's `memLevel` param -+ * @param {Number} options.threshold Size (in bytes) below which messages -+ * should not be compressed -+ * @param {Number} options.concurrencyLimit The number of concurrent calls to -+ * zlib -+ * @param {Boolean} isServer Create the instance in either server or client -+ * mode -+ * @param {Number} maxPayload The maximum allowed message length -+ */ -+ constructor (options, isServer, maxPayload) { -+ this._maxPayload = maxPayload | 0; -+ this._options = options || {}; -+ this._threshold = this._options.threshold !== undefined -+ ? this._options.threshold -+ : 1024; -+ this._isServer = !!isServer; -+ this._deflate = null; -+ this._inflate = null; -+ -+ this.params = null; -+ -+ if (!zlibLimiter) { -+ const concurrency = this._options.concurrencyLimit !== undefined -+ ? this._options.concurrencyLimit -+ : 10; -+ zlibLimiter = new Limiter({ concurrency }); -+ } -+ } -+ -+ /** -+ * @type {String} -+ */ -+ static get extensionName () { -+ return 'permessage-deflate'; -+ } -+ -+ /** -+ * Create extension parameters offer. -+ * -+ * @return {Object} Extension parameters -+ * @public -+ */ -+ offer () { -+ const params = {}; -+ -+ if (this._options.serverNoContextTakeover) { -+ params.server_no_context_takeover = true; -+ } -+ if (this._options.clientNoContextTakeover) { -+ params.client_no_context_takeover = true; -+ } -+ if (this._options.serverMaxWindowBits) { -+ params.server_max_window_bits = this._options.serverMaxWindowBits; -+ } -+ if (this._options.clientMaxWindowBits) { -+ params.client_max_window_bits = this._options.clientMaxWindowBits; -+ } else if (this._options.clientMaxWindowBits == null) { -+ params.client_max_window_bits = true; -+ } -+ -+ return params; -+ } -+ -+ /** -+ * Accept extension offer. -+ * -+ * @param {Array} paramsList Extension parameters -+ * @return {Object} Accepted configuration -+ * @public -+ */ -+ accept (paramsList) { -+ paramsList = this.normalizeParams(paramsList); -+ -+ var params; -+ if (this._isServer) { -+ params = this.acceptAsServer(paramsList); -+ } else { -+ params = this.acceptAsClient(paramsList); -+ } -+ -+ this.params = params; -+ return params; -+ } -+ -+ /** -+ * Releases all resources used by the extension. -+ * -+ * @public -+ */ -+ cleanup () { -+ if (this._inflate) { -+ if (this._inflate[kWriteInProgress]) { -+ this._inflate[kPendingClose] = true; -+ } else { -+ this._inflate.close(); -+ this._inflate = null; -+ } -+ } -+ if (this._deflate) { -+ if (this._deflate[kWriteInProgress]) { -+ this._deflate[kPendingClose] = true; -+ } else { -+ this._deflate.close(); -+ this._deflate = null; -+ } -+ } -+ } -+ -+ /** -+ * Accept extension offer from client. -+ * -+ * @param {Array} paramsList Extension parameters -+ * @return {Object} Accepted configuration -+ * @private -+ */ -+ acceptAsServer (paramsList) { -+ const accepted = {}; -+ const result = paramsList.some((params) => { -+ if ( -+ (this._options.serverNoContextTakeover === false && -+ params.server_no_context_takeover) || -+ (this._options.serverMaxWindowBits === false && -+ params.server_max_window_bits) || -+ (typeof this._options.serverMaxWindowBits === 'number' && -+ typeof params.server_max_window_bits === 'number' && -+ this._options.serverMaxWindowBits > params.server_max_window_bits) || -+ (typeof this._options.clientMaxWindowBits === 'number' && -+ !params.client_max_window_bits) -+ ) { -+ return; -+ } -+ -+ if ( -+ this._options.serverNoContextTakeover || -+ params.server_no_context_takeover -+ ) { -+ accepted.server_no_context_takeover = true; -+ } -+ if ( -+ this._options.clientNoContextTakeover || -+ (this._options.clientNoContextTakeover !== false && -+ params.client_no_context_takeover) -+ ) { -+ accepted.client_no_context_takeover = true; -+ } -+ if (typeof this._options.serverMaxWindowBits === 'number') { -+ accepted.server_max_window_bits = this._options.serverMaxWindowBits; -+ } else if (typeof params.server_max_window_bits === 'number') { -+ accepted.server_max_window_bits = params.server_max_window_bits; -+ } -+ if (typeof this._options.clientMaxWindowBits === 'number') { -+ accepted.client_max_window_bits = this._options.clientMaxWindowBits; -+ } else if ( -+ this._options.clientMaxWindowBits !== false && -+ typeof params.client_max_window_bits === 'number' -+ ) { -+ accepted.client_max_window_bits = params.client_max_window_bits; -+ } -+ return true; -+ }); -+ -+ if (!result) throw new Error("Doesn't support the offered configuration"); -+ -+ return accepted; -+ } -+ -+ /** -+ * Accept extension response from server. -+ * -+ * @param {Array} paramsList Extension parameters -+ * @return {Object} Accepted configuration -+ * @private -+ */ -+ acceptAsClient (paramsList) { -+ const params = paramsList[0]; -+ -+ if ( -+ this._options.clientNoContextTakeover === false && -+ params.client_no_context_takeover -+ ) { -+ throw new Error('Invalid value for "client_no_context_takeover"'); -+ } -+ -+ if ( -+ (typeof this._options.clientMaxWindowBits === 'number' && -+ (!params.client_max_window_bits || -+ params.client_max_window_bits > this._options.clientMaxWindowBits)) || -+ (this._options.clientMaxWindowBits === false && -+ params.client_max_window_bits) -+ ) { -+ throw new Error('Invalid value for "client_max_window_bits"'); -+ } -+ -+ return params; -+ } -+ -+ /** -+ * Normalize extensions parameters. -+ * -+ * @param {Array} paramsList Extension parameters -+ * @return {Array} Normalized extensions parameters -+ * @private -+ */ -+ normalizeParams (paramsList) { -+ return paramsList.map((params) => { -+ Object.keys(params).forEach((key) => { -+ var value = params[key]; -+ if (value.length > 1) { -+ throw new Error(`Multiple extension parameters for ${key}`); -+ } -+ -+ value = value[0]; -+ -+ switch (key) { -+ case 'server_no_context_takeover': -+ case 'client_no_context_takeover': -+ if (value !== true) { -+ throw new Error(`invalid extension parameter value for ${key} (${value})`); -+ } -+ params[key] = true; -+ break; -+ case 'server_max_window_bits': -+ case 'client_max_window_bits': -+ if (typeof value === 'string') { -+ value = parseInt(value, 10); -+ if ( -+ Number.isNaN(value) || -+ value < zlib.Z_MIN_WINDOWBITS || -+ value > zlib.Z_MAX_WINDOWBITS -+ ) { -+ throw new Error(`invalid extension parameter value for ${key} (${value})`); -+ } -+ } -+ if (!this._isServer && value === true) { -+ throw new Error(`Missing extension parameter value for ${key}`); -+ } -+ params[key] = value; -+ break; -+ default: -+ throw new Error(`Not defined extension parameter (${key})`); -+ } -+ }); -+ return params; -+ }); -+ } -+ -+ /** -+ * Decompress data. Concurrency limited by async-limiter. -+ * -+ * @param {Buffer} data Compressed data -+ * @param {Boolean} fin Specifies whether or not this is the last fragment -+ * @param {Function} callback Callback -+ * @public -+ */ -+ decompress (data, fin, callback) { -+ zlibLimiter.push((done) => { -+ this._decompress(data, fin, (err, result) => { -+ done(); -+ callback(err, result); -+ }); -+ }); -+ } -+ -+ /** -+ * Compress data. Concurrency limited by async-limiter. -+ * -+ * @param {Buffer} data Data to compress -+ * @param {Boolean} fin Specifies whether or not this is the last fragment -+ * @param {Function} callback Callback -+ * @public -+ */ -+ compress (data, fin, callback) { -+ zlibLimiter.push((done) => { -+ this._compress(data, fin, (err, result) => { -+ done(); -+ callback(err, result); -+ }); -+ }); -+ } -+ -+ /** -+ * Decompress data. -+ * -+ * @param {Buffer} data Compressed data -+ * @param {Boolean} fin Specifies whether or not this is the last fragment -+ * @param {Function} callback Callback -+ * @private -+ */ -+ _decompress (data, fin, callback) { -+ const endpoint = this._isServer ? 'client' : 'server'; -+ -+ if (!this._inflate) { -+ const key = `${endpoint}_max_window_bits`; -+ const windowBits = typeof this.params[key] !== 'number' -+ ? zlib.Z_DEFAULT_WINDOWBITS -+ : this.params[key]; -+ -+ this._inflate = zlib.createInflateRaw({ windowBits }); -+ this._inflate[kTotalLength] = 0; -+ this._inflate[kBuffers] = []; -+ this._inflate[kOwner] = this; -+ this._inflate.on('error', inflateOnError); -+ this._inflate.on('data', inflateOnData); -+ } -+ -+ this._inflate[kCallback] = callback; -+ this._inflate[kWriteInProgress] = true; -+ -+ this._inflate.write(data); -+ if (fin) this._inflate.write(TRAILER); -+ -+ this._inflate.flush(() => { -+ const err = this._inflate[kError]; -+ -+ if (err) { -+ this._inflate.close(); -+ this._inflate = null; -+ callback(err); -+ return; -+ } -+ -+ const data = bufferUtil.concat( -+ this._inflate[kBuffers], -+ this._inflate[kTotalLength] -+ ); -+ -+ if ( -+ (fin && this.params[`${endpoint}_no_context_takeover`]) || -+ this._inflate[kPendingClose] -+ ) { -+ this._inflate.close(); -+ this._inflate = null; -+ } else { -+ this._inflate[kWriteInProgress] = false; -+ this._inflate[kTotalLength] = 0; -+ this._inflate[kBuffers] = []; -+ } -+ -+ callback(null, data); -+ }); -+ } -+ -+ /** -+ * Compress data. -+ * -+ * @param {Buffer} data Data to compress -+ * @param {Boolean} fin Specifies whether or not this is the last fragment -+ * @param {Function} callback Callback -+ * @private -+ */ -+ _compress (data, fin, callback) { -+ if (!data || data.length === 0) { -+ process.nextTick(callback, null, EMPTY_BLOCK); -+ return; -+ } -+ -+ const endpoint = this._isServer ? 'server' : 'client'; -+ -+ if (!this._deflate) { -+ const key = `${endpoint}_max_window_bits`; -+ const windowBits = typeof this.params[key] !== 'number' -+ ? zlib.Z_DEFAULT_WINDOWBITS -+ : this.params[key]; -+ -+ this._deflate = zlib.createDeflateRaw({ -+ memLevel: this._options.memLevel, -+ level: this._options.level, -+ flush: zlib.Z_SYNC_FLUSH, -+ windowBits -+ }); -+ -+ this._deflate[kTotalLength] = 0; -+ this._deflate[kBuffers] = []; -+ -+ // -+ // `zlib.DeflateRaw` emits an `'error'` event only when an attempt to use -+ // it is made after it has already been closed. This cannot happen here, -+ // so we only add a listener for the `'data'` event. -+ // -+ this._deflate.on('data', deflateOnData); -+ } -+ -+ this._deflate[kWriteInProgress] = true; -+ -+ this._deflate.write(data); -+ this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { -+ var data = bufferUtil.concat( -+ this._deflate[kBuffers], -+ this._deflate[kTotalLength] -+ ); -+ -+ if (fin) data = data.slice(0, data.length - 4); -+ -+ if ( -+ (fin && this.params[`${endpoint}_no_context_takeover`]) || -+ this._deflate[kPendingClose] -+ ) { -+ this._deflate.close(); -+ this._deflate = null; -+ } else { -+ this._deflate[kWriteInProgress] = false; -+ this._deflate[kTotalLength] = 0; -+ this._deflate[kBuffers] = []; -+ } -+ -+ callback(null, data); -+ }); -+ } -+} -+ -+module.exports = PerMessageDeflate; -+ -+/** -+ * The listener of the `zlib.DeflateRaw` stream `'data'` event. -+ * -+ * @param {Buffer} chunk A chunk of data -+ * @private -+ */ -+function deflateOnData (chunk) { -+ this[kBuffers].push(chunk); -+ this[kTotalLength] += chunk.length; -+} -+ -+/** -+ * The listener of the `zlib.InflateRaw` stream `'data'` event. -+ * -+ * @param {Buffer} chunk A chunk of data -+ * @private -+ */ -+function inflateOnData (chunk) { -+ this[kTotalLength] += chunk.length; -+ -+ if ( -+ this[kOwner]._maxPayload < 1 || -+ this[kTotalLength] <= this[kOwner]._maxPayload -+ ) { -+ this[kBuffers].push(chunk); -+ return; -+ } -+ -+ this[kError] = new Error('max payload size exceeded'); -+ this[kError].closeCode = 1009; -+ this.removeListener('data', inflateOnData); -+ this.reset(); -+} -+ -+/** -+ * The listener of the `zlib.InflateRaw` stream `'error'` event. -+ * -+ * @param {Error} err The emitted error -+ * @private -+ */ -+function inflateOnError (err) { -+ // -+ // There is no need to call `Zlib#close()` as the handle is automatically -+ // closed when an error is emitted. -+ // -+ this[kOwner]._inflate = null; -+ this[kCallback](err); -+} -+ -+}, -+"Ja4pA42g/RAhpiPeDbUE8u/y0uH+2DLzpBt5WDMYLd4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+Object.defineProperty(exports, "__esModule", { value: true }); -+const formats_1 = require("./formats"); -+const limit_1 = require("./limit"); -+const codegen_1 = require("ajv/dist/compile/codegen"); -+const fullName = new codegen_1.Name("fullFormats"); -+const fastName = new codegen_1.Name("fastFormats"); -+const formatsPlugin = (ajv, opts = { keywords: true }) => { -+ if (Array.isArray(opts)) { -+ addFormats(ajv, opts, formats_1.fullFormats, fullName); -+ return ajv; -+ } -+ const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName]; -+ const list = opts.formats || formats_1.formatNames; -+ addFormats(ajv, list, formats, exportName); -+ if (opts.keywords) -+ limit_1.default(ajv); -+ return ajv; -+}; -+formatsPlugin.get = (name, mode = "full") => { -+ const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats; -+ const f = formats[name]; -+ if (!f) -+ throw new Error(`Unknown format "${name}"`); -+ return f; -+}; -+function addFormats(ajv, list, fs, exportName) { -+ var _a; -+ var _b; -+ (_a = (_b = ajv.opts.code).formats) !== null && _a !== void 0 ? _a : (_b.formats = codegen_1._ `require("ajv-formats/dist/formats").${exportName}`); -+ for (const f of list) -+ ajv.addFormat(f, fs[f]); -+} -+module.exports = exports = formatsPlugin; -+Object.defineProperty(exports, "__esModule", { value: true }); -+exports.default = formatsPlugin; -+//# sourceMappingURL=index.js.map -+}, -+"JczFU1xaSOlfDIj/bfki3cAkCh3PBIunWfLagGh0jBk=": -+function (require, module, exports, __dirname, __filename) { -+module.exports = process.nextTick -+ -+}, -+"JiaquaE9xkWxdG1v8ckZt9J63uYHKYJUBPJOcNmCrLM=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+const os = require('os'); -+const hasFlag = require('has-flag'); -+ -+const env = process.env; -+ -+let forceColor; -+if (hasFlag('no-color') || -+ hasFlag('no-colors') || -+ hasFlag('color=false')) { -+ forceColor = false; -+} else if (hasFlag('color') || -+ hasFlag('colors') || -+ hasFlag('color=true') || -+ hasFlag('color=always')) { -+ forceColor = true; -+} -+if ('FORCE_COLOR' in env) { -+ forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -+} -+ -+function translateLevel(level) { -+ if (level === 0) { -+ return false; -+ } -+ -+ return { -+ level, -+ hasBasic: true, -+ has256: level >= 2, -+ has16m: level >= 3 -+ }; -+} -+ -+function supportsColor(stream) { -+ if (forceColor === false) { -+ return 0; -+ } -+ -+ if (hasFlag('color=16m') || -+ hasFlag('color=full') || -+ hasFlag('color=truecolor')) { -+ return 3; -+ } -+ -+ if (hasFlag('color=256')) { -+ return 2; -+ } -+ -+ if (stream && !stream.isTTY && forceColor !== true) { -+ return 0; -+ } -+ -+ const min = forceColor ? 1 : 0; -+ -+ if (process.platform === 'win32') { -+ // Node.js 7.5.0 is the first version of Node.js to include a patch to -+ // libuv that enables 256 color output on Windows. Anything earlier and it -+ // won't work. However, here we target Node.js 8 at minimum as it is an LTS -+ // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows -+ // release that supports 256 colors. Windows 10 build 14931 is the first release -+ // that supports 16m/TrueColor. -+ const osRelease = os.release().split('.'); -+ if ( -+ Number(process.versions.node.split('.')[0]) >= 8 && -+ Number(osRelease[0]) >= 10 && -+ Number(osRelease[2]) >= 10586 -+ ) { -+ return Number(osRelease[2]) >= 14931 ? 3 : 2; -+ } -+ -+ return 1; -+ } -+ -+ if ('CI' in env) { -+ if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { -+ return 1; -+ } -+ -+ return min; -+ } -+ -+ if ('TEAMCITY_VERSION' in env) { -+ return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; -+ } -+ -+ if (env.COLORTERM === 'truecolor') { -+ return 3; -+ } -+ -+ if ('TERM_PROGRAM' in env) { -+ const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); -+ -+ switch (env.TERM_PROGRAM) { -+ case 'iTerm.app': -+ return version >= 3 ? 3 : 2; -+ case 'Apple_Terminal': -+ return 2; -+ // No default -+ } -+ } -+ -+ if (/-256(color)?$/i.test(env.TERM)) { -+ return 2; -+ } -+ -+ if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { -+ return 1; -+ } -+ -+ if ('COLORTERM' in env) { -+ return 1; -+ } -+ -+ if (env.TERM === 'dumb') { -+ return min; -+ } -+ -+ return min; -+} -+ -+function getSupportLevel(stream) { -+ const level = supportsColor(stream); -+ return translateLevel(level); -+} -+ -+module.exports = { -+ supportsColor: getSupportLevel, -+ stdout: getSupportLevel(process.stdout), -+ stderr: getSupportLevel(process.stderr) -+}; -+ -+}, -+"JsgUSsnrUZTs7OHJIqeo08hj/vZIumrPaXex+tY/WtI=": -+function (require, module, exports, __dirname, __filename) { -+var low = require('last-one-wins') -+var remove = require('unordered-array-remove') -+var set = require('unordered-set') -+var merkle = require('merkle-tree-stream/generator') -+var flat = require('flat-tree') -+var bulk = require('bulk-write-stream') -+var from = require('from2') -+var codecs = require('codecs') -+var thunky = require('thunky') -+var batcher = require('atomic-batcher') -+var inherits = require('inherits') -+var events = require('events') -+var raf = require('random-access-file') -+var bitfield = require('./lib/bitfield') -+var sparseBitfield = require('sparse-bitfield') -+var treeIndex = require('./lib/tree-index') -+var storage = require('./lib/storage') -+var crypto = require('hypercore-crypto') -+var nextTick = require('process-nextick-args') -+var bufferFrom = require('buffer-from') -+var bufferAlloc = require('buffer-alloc-unsafe') -+var inspect = require('inspect-custom-symbol') -+var pretty = require('pretty-hash') -+var safeBufferEquals = require('./lib/safe-buffer-equals') -+var replicate = null -+ -+module.exports = Feed -+ -+function Feed (createStorage, key, opts) { -+ if (!(this instanceof Feed)) return new Feed(createStorage, key, opts) -+ events.EventEmitter.call(this) -+ -+ if (typeof createStorage === 'string') createStorage = defaultStorage(createStorage) -+ if (typeof createStorage !== 'function') throw new Error('Storage should be a function or string') -+ -+ if (typeof key === 'string') key = bufferFrom(key, 'hex') -+ -+ if (!Buffer.isBuffer(key) && !opts) { -+ opts = key -+ key = null -+ } -+ -+ if (!opts) opts = {} -+ -+ var self = this -+ -+ var secretKey = opts.secretKey || null -+ if (typeof secretKey === 'string') secretKey = bufferFrom(secretKey, 'hex') -+ -+ this.id = opts.id || crypto.randomBytes(32) -+ this.live = opts.live !== false -+ this.sparse = !!opts.sparse -+ this.length = 0 -+ this.byteLength = 0 -+ this.maxRequests = opts.maxRequests || 16 -+ this.key = key || opts.key || null -+ this.discoveryKey = this.key && crypto.discoveryKey(this.key) -+ this.secretKey = secretKey -+ this.bitfield = null -+ this.tree = null -+ this.writable = !!opts.writable -+ this.readable = true -+ this.opened = false -+ this.closed = false -+ this.allowPush = !!opts.allowPush -+ this.peers = [] -+ -+ // hooks -+ this._onwrite = opts.onwrite || null -+ -+ this._ready = thunky(open) // TODO: if open fails, do not reopen next time -+ this._indexing = !!opts.indexing -+ this._createIfMissing = opts.createIfMissing !== false -+ this._overwrite = !!opts.overwrite -+ this._storeSecretKey = opts.storeSecretKey !== false -+ this._merkle = null -+ this._storage = storage(createStorage, opts.storageCacheSize) -+ this._batch = batcher(this._onwrite ? workHook : work) -+ -+ this._seq = 0 -+ this._waiting = [] -+ this._selections = [] -+ this._reserved = sparseBitfield() -+ this._synced = null -+ -+ this._stats = (typeof opts.stats !== 'undefined' && !opts.stats) ? null : { -+ downloadedBlocks: 0, -+ downloadedBytes: 0, -+ uploadedBlocks: 0, -+ uploadedBytes: 0 -+ } -+ -+ this._codec = toCodec(opts.valueEncoding) -+ this._sync = low(sync) -+ if (!this.sparse) this.download({start: 0, end: -1}) -+ -+ // open it right away. TODO: do not reopen (i.e, set a flag not to retry) -+ this._ready(onerror) -+ -+ function onerror (err) { -+ if (err) self.emit('error', err) -+ } -+ -+ function workHook (values, cb) { -+ if (!self._merkle) return self._reloadMerkleStateBeforeAppend(workHook, values, cb) -+ self._appendHook(values, cb) -+ } -+ -+ function work (values, cb) { -+ if (!self._merkle) return self._reloadMerkleStateBeforeAppend(work, values, cb) -+ self._append(values, cb) -+ } -+ -+ function sync (_, cb) { -+ self._syncBitfield(cb) -+ } -+ -+ function open (cb) { -+ self._open(cb) -+ } -+} -+ -+inherits(Feed, events.EventEmitter) -+ -+Feed.discoveryKey = crypto.discoveryKey -+ -+Feed.prototype[inspect] = function (depth, opts) { -+ var indent = '' -+ if (typeof opts.indentationLvl === 'number') { -+ while (indent.length < opts.indentationLvl) indent += ' ' -+ } -+ return 'Hypercore(\n' + -+ indent + ' key: ' + opts.stylize((this.key && pretty(this.key)), 'string') + '\n' + -+ indent + ' discoveryKey: ' + opts.stylize((this.discoveryKey && pretty(this.discoveryKey)), 'string') + '\n' + -+ indent + ' opened: ' + opts.stylize(this.opened, 'boolean') + '\n' + -+ indent + ' writable: ' + opts.stylize(this.writable, 'boolean') + '\n' + -+ indent + ' length: ' + opts.stylize(this.length, 'number') + '\n' + -+ indent + ' byteLength: ' + opts.stylize(this.byteLength, 'number') + '\n' + -+ indent + ' peers: ' + opts.stylize(this.peers.length, 'number') + '\n' + -+ indent + ')' -+} -+ -+// TODO: instead of using a getter, update on remote-update/add/remove -+Object.defineProperty(Feed.prototype, 'remoteLength', { -+ enumerable: true, -+ get: function () { -+ var len = 0 -+ for (var i = 0; i < this.peers.length; i++) { -+ var remoteLength = this.peers[i].remoteLength -+ if (remoteLength > len) len = remoteLength -+ } -+ return len -+ } -+}) -+ -+Object.defineProperty(Feed.prototype, 'stats', { -+ enumerable: true, -+ get: function () { -+ if (!this._stats) return null -+ var peerStats = [] -+ for (var i = 0; i < this.peers.length; i++) { -+ var peer = this.peers[i] -+ peerStats[i] = peer._stats -+ } -+ return { -+ peers: peerStats, -+ totals: this._stats -+ } -+ } -+}) -+ -+Feed.prototype.replicate = function (opts) { -+ // Lazy load replication deps -+ if (!replicate) replicate = require('./lib/replicate') -+ -+ if ((!this._selections.length || this._selections[0].end !== -1) && !this.sparse && !(opts && opts.live)) { -+ // hack!! proper fix is to refactor ./replicate to *not* clear our non-sparse selection -+ this.download({start: 0, end: -1}) -+ } -+ -+ opts = opts || {} -+ opts.stats = !!this._stats -+ -+ return replicate(this, opts) -+} -+ -+Feed.prototype.ready = function (onready) { -+ this._ready(function (err) { -+ if (!err) onready() -+ }) -+} -+ -+Feed.prototype.update = function (len, cb) { -+ if (typeof len === 'function') return this.update(-1, len) -+ if (typeof len !== 'number') len = -1 -+ if (!cb) cb = noop -+ -+ var self = this -+ -+ this.ready(function (err) { -+ if (err) return cb(err) -+ if (len === -1) len = self.length + 1 -+ if (self.length >= len) return cb(null) -+ -+ if (self.writable) cb = self._writeStateReloader(cb) -+ -+ self._waiting.push({ -+ hash: true, -+ bytes: 0, -+ index: len - 1, -+ update: true, -+ callback: cb -+ }) -+ -+ self._updatePeers() -+ }) -+} -+ -+// will reload the writable state. used by .update on a writable peer -+Feed.prototype._writeStateReloader = function (cb) { -+ var self = this -+ return function (err) { -+ if (err) return cb(err) -+ self._reloadMerkleState(cb) -+ } -+} -+ -+Feed.prototype._reloadMerkleState = function (cb) { -+ var self = this -+ -+ this._roots(self.length, function (err, roots) { -+ if (err) return cb(err) -+ self._merkle = merkle(crypto, roots) -+ cb(null) -+ }) -+} -+ -+Feed.prototype._reloadMerkleStateBeforeAppend = function (work, values, cb) { -+ this._reloadMerkleState(function (err) { -+ if (err) return cb(err) -+ work(values, cb) -+ }) -+} -+ -+Feed.prototype._open = function (cb) { -+ var self = this -+ var generatedKey = false -+ -+ // TODO: clean up the duplicate code below ... -+ -+ this._storage.openKey(function (_, key) { -+ if (key && !self._overwrite && !self.key) self.key = key -+ -+ if (!self.key && self.live) { -+ var keyPair = crypto.keyPair() -+ self.secretKey = keyPair.secretKey -+ self.key = keyPair.publicKey -+ generatedKey = true -+ } -+ -+ self.discoveryKey = self.key && crypto.discoveryKey(self.key) -+ self._storage.open({key: self.key, discoveryKey: self.discoveryKey}, onopen) -+ }) -+ -+ function onopen (err, state) { -+ if (err) return cb(err) -+ -+ // if no key but we have data do a bitfield reset since we cannot verify the data. -+ if (!state.key && state.bitfield.length) { -+ self._overwrite = true -+ } -+ -+ if (self._overwrite) { -+ state.bitfield = [] -+ state.key = state.secretKey = null -+ } -+ -+ self.bitfield = bitfield(state.bitfieldPageSize, state.bitfield) -+ self.tree = treeIndex(self.bitfield.tree) -+ self.length = self.tree.blocks() -+ self._seq = self.length -+ -+ if (state.key && self.key && Buffer.compare(state.key, self.key) !== 0) { -+ return cb(new Error('Another hypercore is stored here')) -+ } -+ -+ if (state.key) self.key = state.key -+ if (state.secretKey) self.secretKey = state.secretKey -+ -+ // verify key and secretKey go together -+ if (self.key && self.secretKey) { -+ var challenge = bufferAlloc(0) -+ if (!crypto.verify(challenge, crypto.sign(challenge, self.secretKey), self.key)) { -+ return cb(new Error('Key and secret do not match')) -+ } -+ } -+ -+ if (!self.length) return onsignature(null, null) -+ self._storage.getSignature(self.length - 1, onsignature) -+ -+ function onsignature (_, sig) { -+ if (self.length) self.live = !!sig -+ -+ if ((generatedKey || !self.key) && !self._createIfMissing) { -+ return cb(new Error('No hypercore is stored here')) -+ } -+ -+ if (!self.key && self.live) { -+ var keyPair = crypto.keyPair() -+ self.secretKey = keyPair.secretKey -+ self.key = keyPair.publicKey -+ } -+ -+ var writable = !!self.secretKey || self.key === null -+ -+ if (!writable && self.writable) return cb(new Error('Feed is not writable')) -+ self.writable = writable -+ self.discoveryKey = self.key && crypto.discoveryKey(self.key) -+ -+ if (self._storeSecretKey && !self.secretKey) { -+ self._storeSecretKey = false -+ } -+ -+ var shouldWriteKey = generatedKey || !safeBufferEquals(self.key, state.key) -+ var shouldWriteSecretKey = self._storeSecretKey && (generatedKey || !safeBufferEquals(self.secretKey, state.secretKey)) -+ -+ var missing = 1 + -+ (shouldWriteKey ? 1 : 0) + -+ (shouldWriteSecretKey ? 1 : 0) + -+ (self._overwrite ? 1 : 0) -+ var error = null -+ -+ if (shouldWriteKey) self._storage.key.write(0, self.key, done) -+ if (shouldWriteSecretKey) self._storage.secretKey.write(0, self.secretKey, done) -+ -+ if (self._overwrite) { -+ self._storage.bitfield.del(0, Infinity, done) -+ } -+ -+ done(null) -+ -+ function done (err) { -+ if (err) error = err -+ if (--missing) return -+ if (error) return cb(error) -+ self._roots(self.length, onroots) -+ } -+ -+ function onroots (err, roots) { -+ if (err) return cb(err) -+ -+ self._merkle = merkle(crypto, roots) -+ self.byteLength = roots.reduce(addSize, 0) -+ self.opened = true -+ self.emit('ready') -+ -+ cb(null) -+ } -+ } -+ } -+} -+ -+Feed.prototype.download = function (range, cb) { -+ if (typeof range === 'function') return this.download(null, range) -+ if (typeof range === 'number') range = {start: range, end: range + 1} -+ if (!range) range = {} -+ if (!cb) cb = noop -+ if (!this.readable) return cb(new Error('Feed is closed')) -+ -+ // TODO: if no peers, check if range is already satisfied and nextTick(cb) if so -+ // this._updatePeers does this for us when there is a peer though, so not critical -+ -+ var sel = { -+ _index: this._selections.length, -+ hash: !!range.hash, -+ iterator: null, -+ start: range.start || 0, -+ end: range.end || -1, -+ want: 0, -+ linear: !!range.linear, -+ callback: cb -+ } -+ -+ sel.want = toWantRange(sel.start) -+ -+ this._selections.push(sel) -+ this._updatePeers() -+ -+ return sel -+} -+ -+Feed.prototype.undownload = function (range) { -+ if (typeof range === 'number') range = {start: range, end: range + 1} -+ if (!range) range = {} -+ -+ if (range.callback && range._index > -1) { -+ set.remove(this._selections, range) -+ nextTick(range.callback, createError('ECANCELED', -11, 'Download was cancelled')) -+ return -+ } -+ -+ var start = range.start || 0 -+ var end = range.end || -1 -+ var hash = !!range.hash -+ var linear = !!range.linear -+ -+ for (var i = 0; i < this._selections.length; i++) { -+ var s = this._selections[i] -+ -+ if (s.start === start && s.end === end && s.hash === hash && s.linear === linear) { -+ set.remove(this._selections, s) -+ nextTick(range.callback, createError('ECANCELED', -11, 'Download was cancelled')) -+ return -+ } -+ } -+} -+ -+Feed.prototype.digest = function (index) { -+ return this.tree.digest(2 * index) -+} -+ -+Feed.prototype.proof = function (index, opts, cb) { -+ if (typeof opts === 'function') return this.proof(index, null, opts) -+ if (!this.opened) return this._readyAndProof(index, opts, cb) -+ if (!opts) opts = {} -+ -+ var proof = this.tree.proof(2 * index, opts) -+ if (!proof) return cb(new Error('No proof available for this index')) -+ -+ var needsSig = this.live && !!proof.verifiedBy -+ var pending = proof.nodes.length + (needsSig ? 1 : 0) -+ var error = null -+ var signature = null -+ var nodes = new Array(proof.nodes.length) -+ -+ if (!pending) return cb(null, {nodes: nodes, signature: null}) -+ -+ for (var i = 0; i < proof.nodes.length; i++) { -+ this._storage.getNode(proof.nodes[i], onnode) -+ } -+ if (needsSig) { -+ this._storage.getSignature(proof.verifiedBy / 2 - 1, onsignature) -+ } -+ -+ function onsignature (err, sig) { -+ if (sig) signature = sig -+ onnode(err, null) -+ } -+ -+ function onnode (err, node) { -+ if (err) error = err -+ -+ if (node) { -+ nodes[proof.nodes.indexOf(node.index)] = node -+ } -+ -+ if (--pending) return -+ if (error) return cb(error) -+ cb(null, {nodes: nodes, signature: signature}) -+ } -+} -+ -+Feed.prototype._readyAndProof = function (index, opts, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self.proof(index, opts, cb) -+ }) -+} -+ -+Feed.prototype.put = function (index, data, proof, cb) { -+ if (!this.opened) return this._readyAndPut(index, data, proof, cb) -+ this._putBuffer(index, this._codec.encode(data), proof, null, cb) -+} -+ -+Feed.prototype.cancel = function (start, end) { // TODO: use same argument scheme as download -+ if (!end) end = start + 1 -+ -+ // cancel these right away as .download does not wait for ready -+ for (var i = this._selections.length - 1; i >= 0; i--) { -+ var sel = this._selections[i] -+ if (start <= sel.start && sel.end <= end) { -+ this.undownload(sel) -+ } -+ } -+ -+ // defer the last part until after ready as .get does that as well -+ if (this.opened) this._cancel(start, end) -+ else this._readyAndCancel(start, end) -+} -+ -+Feed.prototype._cancel = function (start, end) { -+ var i = 0 -+ -+ for (i = start; i < end; i++) { -+ this._reserved.set(i, false) // TODO: send cancel message if set returns true -+ } -+ -+ for (i = this._waiting.length - 1; i >= 0; i--) { -+ var w = this._waiting[i] -+ if ((start <= w.start && w.end <= end) || (start <= w.index && w.index < end)) { -+ remove(this._waiting, i) -+ if (w.callback) nextTick(w.callback, new Error('Request cancelled')) -+ } -+ } -+} -+ -+Feed.prototype.clear = function (start, end, opts, cb) { // TODO: use same argument scheme as download -+ if (typeof end === 'function') return this.clear(start, start + 1, null, end) -+ if (typeof opts === 'function') return this.clear(start, end, null, opts) -+ if (!opts) opts = {} -+ if (!end) end = start + 1 -+ if (!cb) cb = noop -+ -+ // TODO: this needs some work. fx we can only calc byte offset for blocks we know about -+ // so internally we should make sure to only do that. We should use the merkle tree for this -+ -+ var self = this -+ var byteOffset = start === 0 ? 0 : (typeof opts.byteOffset === 'number' ? opts.byteOffset : -1) -+ var byteLength = typeof opts.byteLength === 'number' ? opts.byteLength : -1 -+ -+ this._ready(function (err) { -+ if (err) return cb(err) -+ -+ var modified = false -+ -+ // TODO: use a buffer.fill thing here to speed this up! -+ -+ for (var i = start; i < end; i++) { -+ if (self.bitfield.set(i, false)) modified = true -+ } -+ -+ if (!modified) return nextTick(cb) -+ -+ // TODO: write to a tmp/update file that we want to del this incase it crashes will del'ing -+ -+ self._unannounce({start: start, length: end - start}) -+ if (opts.delete === false || self._indexing) return sync() -+ if (byteOffset > -1) return onstartbytes(null, byteOffset) -+ self._storage.dataOffset(start, [], onstartbytes) -+ -+ function sync () { -+ self.emit('clear', start, end) -+ self._sync(null, cb) -+ } -+ -+ function onstartbytes (err, offset) { -+ if (err) return cb(err) -+ byteOffset = offset -+ if (byteLength > -1) return onendbytes(null, byteLength + byteOffset) -+ if (end === self.length) return onendbytes(null, self.byteLength) -+ self._storage.dataOffset(end, [], onendbytes) -+ } -+ -+ function onendbytes (err, end) { -+ if (err) return cb(err) -+ if (!self._storage.data.del) return sync() // Not all data storage impls del -+ self._storage.data.del(byteOffset, end - byteOffset, sync) -+ } -+ }) -+} -+ -+Feed.prototype.signature = function (index, cb) { -+ if (typeof index === 'function') return this.signature(this.length - 1, index) -+ -+ if (index < 0 || index >= this.length) return cb(new Error('No signature available for this index')) -+ -+ this._storage.nextSignature(index, cb) -+} -+ -+Feed.prototype.verify = function (index, signature, cb) { -+ var self = this -+ -+ this.rootHashes(index, function (err, roots) { -+ if (err) return cb(err) -+ -+ var checksum = crypto.tree(roots) -+ -+ if (!crypto.verify(checksum, signature, self.key)) { -+ cb(new Error('Signature verification failed')) -+ } else { -+ cb(null, true) -+ } -+ }) -+} -+ -+Feed.prototype.rootHashes = function (index, cb) { -+ this._getRootsToVerify(index * 2 + 2, {}, [], cb) -+} -+ -+Feed.prototype.seek = function (bytes, opts, cb) { -+ if (typeof opts === 'function') return this.seek(bytes, null, opts) -+ if (!opts) opts = {} -+ if (!this.opened) return this._readyAndSeek(bytes, opts, cb) -+ -+ var self = this -+ -+ this._seek(bytes, function (err, index, offset) { -+ if (!err && isBlock(index)) return done(index / 2, offset) -+ if (opts.wait === false) return cb(err || new Error('Unable to seek to this offset')) -+ -+ var start = opts.start || 0 -+ var end = opts.end || -1 -+ -+ if (!err) { -+ var left = flat.leftSpan(index) / 2 -+ var right = flat.rightSpan(index) / 2 + 1 -+ -+ if (left > start) start = left -+ if (right < end || end === -1) end = right -+ } -+ -+ if (end > -1 && end <= start) return cb(new Error('Unable to seek to this offset')) -+ -+ self._waiting.push({ -+ hash: opts.hash !== false, -+ bytes: bytes, -+ index: -1, -+ start: start, -+ end: end, -+ want: toWantRange(start), -+ callback: cb || noop -+ }) -+ -+ self._updatePeers() -+ }) -+ -+ function done (index, offset) { -+ for (var i = 0; i < self.peers.length; i++) { -+ self.peers[i].haveBytes(bytes) -+ } -+ cb(null, index, offset) -+ } -+} -+ -+Feed.prototype._seek = function (offset, cb) { -+ if (offset === 0) return cb(null, 0, 0) -+ -+ var self = this -+ var roots = flat.fullRoots(this.length * 2) -+ var nearestRoot = 0 -+ -+ loop(null, null) -+ -+ function onroot (top) { -+ if (isBlock(top)) return cb(null, top, offset) -+ -+ var left = flat.leftChild(top) -+ while (!self.tree.get(left)) { -+ if (isBlock(left)) return cb(null, nearestRoot, offset) -+ left = flat.leftChild(left) -+ } -+ -+ self._storage.getNode(left, onleftchild) -+ } -+ -+ function onleftchild (err, node) { -+ if (err) return cb(err) -+ -+ if (node.size > offset) { -+ nearestRoot = node.index -+ onroot(node.index) -+ } else { -+ offset -= node.size -+ onroot(flat.sibling(node.index)) -+ } -+ } -+ -+ function loop (err, node) { -+ if (err) return cb(err) -+ -+ if (node) { -+ if (node.size > offset) { -+ nearestRoot = node.index -+ return onroot(node.index) -+ } -+ offset -= node.size -+ } -+ -+ if (!roots.length) return cb(new Error('Out of bounds')) -+ self._storage.getNode(roots.shift(), loop) -+ } -+} -+ -+Feed.prototype._readyAndSeek = function (bytes, opts, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self.seek(bytes, opts, cb) -+ }) -+} -+ -+Feed.prototype._getBuffer = function (index, cb) { -+ this._storage.getData(index, cb) -+} -+ -+Feed.prototype._putBuffer = function (index, data, proof, from, cb) { -+ // TODO: this nodes in proof are not instances of our Node prototype -+ // but just similar. Check if this has any v8 perf implications. -+ -+ // TODO: if the proof contains a valid signature BUT fails, emit a critical error -+ // --> feed should be considered dead -+ -+ var self = this -+ var trusted = -1 -+ var missing = [] -+ var next = 2 * index -+ var i = data ? 0 : 1 -+ -+ while (true) { -+ if (this.tree.get(next)) { -+ trusted = next -+ break -+ } -+ -+ var sib = flat.sibling(next) -+ next = flat.parent(next) -+ -+ if (i < proof.nodes.length && proof.nodes[i].index === sib) { -+ i++ -+ continue -+ } -+ -+ if (!this.tree.get(sib)) break -+ missing.push(sib) -+ } -+ -+ if (trusted === -1 && this.tree.get(next)) trusted = next -+ -+ var error = null -+ var trustedNode = null -+ var missingNodes = new Array(missing.length) -+ var pending = missing.length + (trusted > -1 ? 1 : 0) -+ -+ for (i = 0; i < missing.length; i++) this._storage.getNode(missing[i], onmissing) -+ if (trusted > -1) this._storage.getNode(trusted, ontrusted) -+ if (!missing.length && trusted === -1) onmissingloaded(null) -+ -+ function ontrusted (err, node) { -+ if (err) error = err -+ if (node) trustedNode = node -+ if (!--pending) onmissingloaded(error) -+ } -+ -+ function onmissing (err, node) { -+ if (err) error = err -+ if (node) missingNodes[missing.indexOf(node.index)] = node -+ if (!--pending) onmissingloaded(error) -+ } -+ -+ function onmissingloaded (err) { -+ if (err) return cb(err) -+ self._verifyAndWrite(index, data, proof, missingNodes, trustedNode, from, cb) -+ } -+} -+ -+Feed.prototype._readyAndPut = function (index, data, proof, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self.put(index, data, proof, cb) -+ }) -+} -+ -+Feed.prototype._write = function (index, data, nodes, sig, from, cb) { -+ if (!this._onwrite) return this._writeAfterHook(index, data, nodes, sig, from, cb) -+ this._onwrite(index, data, from, writeHookDone(this, index, data, nodes, sig, from, cb)) -+} -+ -+function writeHookDone (self, index, data, nodes, sig, from, cb) { -+ return function (err) { -+ if (err) return cb(err) -+ self._writeAfterHook(index, data, nodes, sig, from, cb) -+ } -+} -+ -+Feed.prototype._writeAfterHook = function (index, data, nodes, sig, from, cb) { -+ var self = this -+ var pending = nodes.length + 1 + (sig ? 1 : 0) -+ var error = null -+ -+ for (var i = 0; i < nodes.length; i++) this._storage.putNode(nodes[i].index, nodes[i], ondone) -+ if (data) this._storage.putData(index, data, nodes, ondone) -+ else ondone() -+ if (sig) this._storage.putSignature(sig.index, sig.signature, ondone) -+ -+ function ondone (err) { -+ if (err) error = err -+ if (--pending) return -+ if (error) return cb(error) -+ self._writeDone(index, data, nodes, from, cb) -+ } -+} -+ -+Feed.prototype._writeDone = function (index, data, nodes, from, cb) { -+ for (var i = 0; i < nodes.length; i++) this.tree.set(nodes[i].index) -+ this.tree.set(2 * index) -+ -+ if (data) { -+ if (this.bitfield.set(index, true)) { -+ if (this._stats) { -+ this._stats.downloadedBlocks += 1 -+ this._stats.downloadedBytes += data.length -+ } -+ this.emit('download', index, data, from) -+ } -+ if (this.peers.length) this._announce({start: index}, from) -+ -+ if (!this.writable) { -+ if (!this._synced) this._synced = this.bitfield.iterator(0, this.length) -+ if (this._synced.next() === -1) { -+ this._synced.range(0, this.length) -+ this._synced.seek(0) -+ if (this._synced.next() === -1) { -+ this.emit('sync') -+ } -+ } -+ } -+ } -+ -+ this._sync(null, cb) -+} -+ -+Feed.prototype._verifyAndWrite = function (index, data, proof, localNodes, trustedNode, from, cb) { -+ var visited = [] -+ var remoteNodes = proof.nodes -+ var top = data ? new storage.Node(2 * index, crypto.data(data), data.length) : remoteNodes.shift() -+ -+ // check if we already have the hash for this node -+ if (verifyNode(trustedNode, top)) { -+ this._write(index, data, visited, null, from, cb) -+ return -+ } -+ -+ // keep hashing with siblings until we reach or trusted node -+ while (true) { -+ var node = null -+ var next = flat.sibling(top.index) -+ -+ if (remoteNodes.length && remoteNodes[0].index === next) { -+ node = remoteNodes.shift() -+ visited.push(node) -+ } else if (localNodes.length && localNodes[0].index === next) { -+ node = localNodes.shift() -+ } else { -+ // we cannot create another parent, i.e. these nodes must be roots in the tree -+ this._verifyRootsAndWrite(index, data, top, proof, visited, from, cb) -+ return -+ } -+ -+ visited.push(top) -+ top = new storage.Node(flat.parent(top.index), crypto.parent(top, node), top.size + node.size) -+ -+ // the tree checks out, write the data and the visited nodes -+ if (verifyNode(trustedNode, top)) { -+ this._write(index, data, visited, null, from, cb) -+ return -+ } -+ } -+} -+ -+Feed.prototype._verifyRootsAndWrite = function (index, data, top, proof, nodes, from, cb) { -+ var remoteNodes = proof.nodes -+ var lastNode = remoteNodes.length ? remoteNodes[remoteNodes.length - 1].index : top.index -+ var verifiedBy = Math.max(flat.rightSpan(top.index), flat.rightSpan(lastNode)) + 2 -+ var self = this -+ -+ this._getRootsToVerify(verifiedBy, top, remoteNodes, function (err, roots, extraNodes) { -+ if (err) return cb(err) -+ -+ var checksum = crypto.tree(roots) -+ var signature = null -+ -+ if (self.length && self.live && !proof.signature) { -+ return cb(new Error('Remote did not include a signature')) -+ } -+ -+ if (proof.signature) { // check signaturex -+ if (!crypto.verify(checksum, proof.signature, self.key)) { -+ return cb(new Error('Remote signature could not be verified')) -+ } -+ -+ signature = {index: verifiedBy / 2 - 1, signature: proof.signature} -+ } else { // check tree root -+ if (Buffer.compare(checksum, self.key) !== 0) { -+ return cb(new Error('Remote checksum failed')) -+ } -+ } -+ -+ self.live = !!signature -+ -+ var length = verifiedBy / 2 -+ if (length > self.length) { -+ // TODO: only emit this after the info has been flushed to storage -+ if (self.writable) self._merkle = null // We need to reload merkle state now -+ self.length = length -+ self._seq = length -+ self.byteLength = roots.reduce(addSize, 0) -+ if (self._synced) self._synced.seek(0, self.length) -+ self.emit('append') -+ } -+ -+ self._write(index, data, nodes.concat(extraNodes), signature, from, cb) -+ }) -+} -+ -+Feed.prototype._getRootsToVerify = function (verifiedBy, top, remoteNodes, cb) { -+ var indexes = flat.fullRoots(verifiedBy) -+ var roots = new Array(indexes.length) -+ var nodes = [] -+ var error = null -+ var pending = roots.length -+ -+ for (var i = 0; i < indexes.length; i++) { -+ if (indexes[i] === top.index) { -+ nodes.push(top) -+ onnode(null, top) -+ } else if (remoteNodes.length && indexes[i] === remoteNodes[0].index) { -+ nodes.push(remoteNodes[0]) -+ onnode(null, remoteNodes.shift()) -+ } else if (this.tree.get(indexes[i])) { -+ this._storage.getNode(indexes[i], onnode) -+ } else { -+ onnode(new Error('Missing tree roots needed for verify')) -+ } -+ } -+ -+ function onnode (err, node) { -+ if (err) error = err -+ if (node) roots[indexes.indexOf(node.index)] = node -+ if (!--pending) done(error) -+ } -+ -+ function done (err) { -+ if (err) return cb(err) -+ -+ cb(null, roots, nodes) -+ } -+} -+ -+Feed.prototype._announce = function (message, from) { -+ for (var i = 0; i < this.peers.length; i++) { -+ var peer = this.peers[i] -+ if (peer !== from) peer.have(message) -+ } -+} -+ -+Feed.prototype._unannounce = function (message) { -+ for (var i = 0; i < this.peers.length; i++) this.peers[i].unhave(message) -+} -+ -+Feed.prototype.downloaded = function (start, end) { -+ return this.bitfield.total(start, end) -+} -+ -+Feed.prototype.has = function (start, end) { -+ if (end === undefined) return this.bitfield.get(start) -+ var total = end - start -+ return total === this.bitfield.total(start, end) -+} -+ -+Feed.prototype.head = function (opts, cb) { -+ if (typeof opts === 'function') return this.head({}, opts) -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ if (self.length === 0) cb(new Error('feed is empty')) -+ else self.get(self.length - 1, cb) -+ }) -+} -+ -+Feed.prototype.get = function (index, opts, cb) { -+ if (typeof opts === 'function') return this.get(index, null, opts) -+ if (!this.opened) return this._readyAndGet(index, opts, cb) -+ if (!this.readable) return cb(new Error('Feed is closed')) -+ -+ if (opts && opts.timeout) cb = timeoutCallback(cb, opts.timeout) -+ -+ if (!this.bitfield.get(index)) { -+ if (opts && opts.wait === false) return cb(new Error('Block not downloaded')) -+ -+ this._waiting.push({bytes: 0, hash: false, index: index, options: opts, callback: cb}) -+ this._updatePeers() -+ return -+ } -+ -+ if (opts && opts.valueEncoding) cb = wrapCodec(toCodec(opts.valueEncoding), cb) -+ else if (this._codec !== codecs.binary) cb = wrapCodec(this._codec, cb) -+ -+ this._getBuffer(index, cb) -+} -+ -+Feed.prototype._readyAndGet = function (index, opts, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self.get(index, opts, cb) -+ }) -+} -+ -+Feed.prototype.getBatch = function (start, end, opts, cb) { -+ if (typeof opts === 'function') return this.getBatch(start, end, null, opts) -+ if (!this.opened) return this._readyAndGetBatch(start, end, opts, cb) -+ -+ var self = this -+ var wait = !opts || opts.wait !== false -+ -+ if (this.has(start, end)) return this._getBatch(start, end, opts, cb) -+ if (!wait) return cb(new Error('Block not downloaded')) -+ -+ if (opts && opts.timeout) cb = timeoutCallback(cb, opts.timeout) -+ -+ this.download({start: start, end: end}, function (err) { -+ if (err) return cb(err) -+ self._getBatch(start, end, opts, cb) -+ }) -+} -+ -+Feed.prototype._getBatch = function (start, end, opts, cb) { -+ var enc = opts && opts.valueEncoding -+ var codec = enc ? toCodec(enc) : this._codec -+ -+ this._storage.getDataBatch(start, end - start, onbatch) -+ -+ function onbatch (err, buffers) { -+ if (err) return cb(err) -+ -+ var batch = new Array(buffers.length) -+ -+ for (var i = 0; i < buffers.length; i++) { -+ try { -+ batch[i] = codec ? codec.decode(buffers[i]) : buffers[i] -+ } catch (err) { -+ return cb(err) -+ } -+ } -+ -+ cb(null, batch) -+ } -+} -+ -+Feed.prototype._readyAndGetBatch = function (start, end, opts, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self.getBatch(start, end, opts, cb) -+ }) -+} -+ -+Feed.prototype._updatePeers = function () { -+ for (var i = 0; i < this.peers.length; i++) this.peers[i].update() -+} -+ -+Feed.prototype.createWriteStream = function () { -+ var self = this -+ return bulk.obj(write) -+ -+ function write (batch, cb) { -+ self.append(batch, cb) -+ } -+} -+ -+Feed.prototype.createReadStream = function (opts) { -+ if (!opts) opts = {} -+ -+ var self = this -+ var start = opts.start || 0 -+ var end = typeof opts.end === 'number' ? opts.end : -1 -+ var live = !!opts.live -+ var snapshot = opts.snapshot !== false -+ var first = true -+ var range = this.download({start: start, end: end, linear: true}) -+ -+ return from.obj(read).on('end', cleanup).on('close', cleanup) -+ -+ function read (size, cb) { -+ if (!self.opened) return open(size, cb) -+ if (!self.readable) return cb(new Error('Feed is closed')) -+ -+ if (first) { -+ if (end === -1) { -+ if (live) end = Infinity -+ else if (snapshot) end = self.length -+ if (start > end) return cb(null, null) -+ } -+ if (opts.tail) start = self.length -+ first = false -+ } -+ -+ if (start === end || (end === -1 && start === self.length)) return cb(null, null) -+ -+ range.start++ -+ if (range.iterator) range.iterator.start++ -+ -+ self.get(start++, opts, cb) -+ } -+ -+ function cleanup () { -+ if (!range) return -+ self.undownload(range) -+ range = null -+ } -+ -+ function open (size, cb) { -+ self._ready(function (err) { -+ if (err) return cb(err) -+ read(size, cb) -+ }) -+ } -+} -+ -+// TODO: when calling finalize on a live feed write an END_OF_FEED block (length === 0?) -+Feed.prototype.finalize = function (cb) { -+ if (!this.key) { -+ this.key = crypto.tree(this._merkle.roots) -+ this.discoveryKey = crypto.discoveryKey(this.key) -+ } -+ this._storage.key.write(0, this.key, cb) -+} -+ -+Feed.prototype.append = function (batch, cb) { -+ if (!cb) cb = noop -+ -+ var self = this -+ var list = Array.isArray(batch) ? batch : [batch] -+ this._batch(list, onappend) -+ -+ function onappend (err) { -+ if (err) return cb(err) -+ var seq = self._seq -+ self._seq += list.length -+ cb(null, seq) -+ } -+} -+ -+Feed.prototype.flush = function (cb) { -+ this.append([], cb) -+} -+ -+Feed.prototype.close = function (cb) { -+ var self = this -+ -+ this._ready(function () { -+ self.writable = false -+ self.readable = false -+ self._storage.close(function (err) { -+ if (!self.closed && !err) self._onclose() -+ if (cb) cb(err) -+ }) -+ }) -+} -+ -+Feed.prototype._onclose = function () { -+ this.closed = true -+ -+ while (this._waiting.length) { -+ this._waiting.pop().callback(new Error('Feed is closed')) -+ } -+ while (this._selections.length) { -+ this._selections.pop().callback(new Error('Feed is closed')) -+ } -+ -+ this.emit('close') -+} -+ -+Feed.prototype._appendHook = function (batch, cb) { -+ var self = this -+ var missing = batch.length -+ var error = null -+ -+ if (!missing) return this._append(batch, cb) -+ for (var i = 0; i < batch.length; i++) { -+ this._onwrite(i + this.length, batch[i], null, done) -+ } -+ -+ function done (err) { -+ if (err) error = err -+ if (--missing) return -+ if (error) return cb(error) -+ self._append(batch, cb) -+ } -+} -+ -+Feed.prototype._append = function (batch, cb) { -+ if (!this.opened) return this._readyAndAppend(batch, cb) -+ if (!this.writable) return cb(new Error('This feed is not writable. Did you create it?')) -+ -+ var self = this -+ var pending = 1 -+ var offset = 0 -+ var error = null -+ var nodeBatch = new Array(batch.length ? batch.length * 2 - 1 : 0) -+ var nodeOffset = this.length * 2 -+ var dataBatch = new Array(batch.length) -+ -+ if (!pending) return cb() -+ -+ for (var i = 0; i < batch.length; i++) { -+ var data = this._codec.encode(batch[i]) -+ var nodes = this._merkle.next(data) -+ -+ if (this.live && i === batch.length - 1) { -+ pending++ -+ var sig = crypto.sign(crypto.tree(this._merkle.roots), this.secretKey) -+ this._storage.putSignature(this.length + i, sig, done) -+ } -+ -+ offset += data.length -+ dataBatch[i] = data -+ -+ for (var j = 0; j < nodes.length; j++) { -+ var node = nodes[j] -+ if (node.index >= nodeOffset && node.index - nodeOffset < nodeBatch.length) { -+ nodeBatch[node.index - nodeOffset] = node -+ } else { -+ pending++ -+ this._storage.putNode(node.index, node, done) -+ } -+ } -+ } -+ -+ if (!this._indexing) { -+ pending++ -+ if (dataBatch.length === 1) this._storage.data.write(this.byteLength, dataBatch[0], done) -+ else this._storage.data.write(this.byteLength, Buffer.concat(dataBatch), done) -+ } -+ -+ this._storage.putNodeBatch(nodeOffset, nodeBatch, done) -+ -+ function done (err) { -+ if (err) error = err -+ if (--pending) return -+ if (error) return cb(error) -+ -+ var start = self.length -+ -+ // TODO: only emit append and update length / byteLength after the info has been flushed to storage -+ self.byteLength += offset -+ for (var i = 0; i < batch.length; i++) { -+ self.bitfield.set(self.length, true) -+ self.tree.set(2 * self.length++) -+ } -+ self.emit('append') -+ -+ var message = self.length - start > 1 ? {start: start, length: self.length - start} : {start: start} -+ if (self.peers.length) self._announce(message) -+ -+ self._sync(null, cb) -+ } -+} -+ -+Feed.prototype._readyAndAppend = function (batch, cb) { -+ var self = this -+ this._ready(function (err) { -+ if (err) return cb(err) -+ self._append(batch, cb) -+ }) -+} -+ -+Feed.prototype._readyAndCancel = function (start, end) { -+ var self = this -+ this.ready(function () { -+ self._cancel(start, end) -+ }) -+} -+ -+Feed.prototype._pollWaiting = function () { -+ var len = this._waiting.length -+ for (var i = 0; i < len; i++) { -+ var next = this._waiting[i] -+ if (!next.bytes && !this.bitfield.get(next.index)) continue -+ -+ remove(this._waiting, i--) -+ len-- -+ -+ if (next.bytes) this.seek(next.bytes, next, next.callback) -+ else if (next.update) this.update(next.index + 1, next.callback) -+ else this.get(next.index, next.options, next.callback) -+ } -+} -+ -+Feed.prototype._syncBitfield = function (cb) { -+ var missing = this.bitfield.pages.updates.length -+ var next = null -+ var error = null -+ -+ // All data / nodes have been written now. We still need to update the bitfields though -+ -+ // TODO 1: if the program fails during this write the bitfield might not have been fully written -+ // HOWEVER, we can easily recover from this by traversing the tree and checking if the nodes exists -+ // on disk. So if a get fails, it should try and recover once. -+ -+ // TODO 2: if .writable append bitfield updates into a single buffer for extra perf -+ // Added benefit is that if the program exits while flushing the bitfield the feed will only get -+ // truncated and not have missing chunks which is what you expect. -+ -+ if (!missing) { -+ this._pollWaiting() -+ return cb(null) -+ } -+ -+ while ((next = this.bitfield.pages.lastUpdate()) !== null) { -+ this._storage.putBitfield(next.offset, next.buffer, ondone) -+ } -+ -+ this._pollWaiting() -+ -+ function ondone (err) { -+ if (err) error = err -+ if (--missing) return -+ cb(error) -+ } -+} -+ -+Feed.prototype._roots = function (index, cb) { -+ var roots = flat.fullRoots(2 * index) -+ var result = new Array(roots.length) -+ var pending = roots.length -+ var error = null -+ -+ if (!pending) return cb(null, result) -+ -+ for (var i = 0; i < roots.length; i++) { -+ this._storage.getNode(roots[i], onnode) -+ } -+ -+ function onnode (err, node) { -+ if (err) error = err -+ if (node) result[roots.indexOf(node.index)] = node -+ if (--pending) return -+ if (error) return cb(error) -+ cb(null, result) -+ } -+} -+ -+Feed.prototype.audit = function (cb) { -+ if (!cb) cb = noop -+ -+ var self = this -+ var report = { -+ valid: 0, -+ invalid: 0 -+ } -+ -+ this.ready(function (err) { -+ if (err) return cb(err) -+ -+ var block = 0 -+ var max = self.length -+ -+ next() -+ -+ function onnode (err, node) { -+ if (err) return ondata(null, null) -+ self._storage.getData(block, ondata) -+ -+ function ondata (_, data) { -+ var verified = data && crypto.data(data).equals(node.hash) -+ if (verified) report.valid++ -+ else report.invalid++ -+ self.bitfield.set(block, verified) -+ block++ -+ next() -+ } -+ } -+ -+ function next () { -+ while (block < max && !self.bitfield.get(block)) block++ -+ if (block >= max) return done() -+ self._storage.getNode(2 * block, onnode) -+ } -+ -+ function done () { -+ self._sync(null, function (err) { -+ if (err) return cb(err) -+ cb(null, report) -+ }) -+ } -+ }) -+} -+ -+function noop () {} -+ -+function verifyNode (trusted, node) { -+ return trusted && trusted.index === node.index && Buffer.compare(trusted.hash, node.hash) === 0 -+} -+ -+function addSize (size, node) { -+ return size + node.size -+} -+ -+function isBlock (index) { -+ return (index & 1) === 0 -+} -+ -+function defaultStorage (dir) { -+ return function (name) { -+ try { -+ var lock = name === 'bitfield' ? require('fd-lock') : null -+ } catch (err) {} -+ return raf(name, {directory: dir, lock: lock}) -+ } -+} -+ -+function toCodec (enc) { -+ // Switch to ndjson encoding if JSON is used. That way data files parse like ndjson \o/ -+ return codecs(enc === 'json' ? 'ndjson' : enc) -+} -+ -+function wrapCodec (enc, cb) { -+ return function (err, buf) { -+ if (err) return cb(err) -+ try { -+ buf = enc.decode(buf) -+ } catch (err) { -+ return cb(err) -+ } -+ cb(null, buf) -+ } -+} -+ -+function timeoutCallback (cb, timeout) { -+ var failed = false -+ var id = setTimeout(ontimeout, timeout) -+ return done -+ -+ function ontimeout () { -+ failed = true -+ // TODO: make libs/errors for all this stuff -+ var err = new Error('ETIMEDOUT') -+ err.code = 'ETIMEDOUT' -+ cb(err) -+ } -+ -+ function done (err, val) { -+ if (failed) return -+ clearTimeout(id) -+ cb(err, val) -+ } -+} -+ -+function toWantRange (i) { -+ return Math.floor(i / 1024 / 1024) * 1024 * 1024 -+} -+ -+function createError (code, errno, msg) { -+ var err = new Error(msg) -+ err.code = code -+ err.errno = errno -+ return err -+} -+ -+}, -+"JuUdgutBqqr+9UyjSzUL0ApOK9ZkhBc3E4bnvAYUiV4=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+module.exports = function(Promise, INTERNAL) { -+var THIS = {}; -+var util = require("./util"); -+var nodebackForPromise = require("./nodeback"); -+var withAppended = util.withAppended; -+var maybeWrapAsError = util.maybeWrapAsError; -+var canEvaluate = util.canEvaluate; -+var TypeError = require("./errors").TypeError; -+var defaultSuffix = "Async"; -+var defaultPromisified = {__isPromisified__: true}; -+var noCopyProps = [ -+ "arity", "length", -+ "name", -+ "arguments", -+ "caller", -+ "callee", -+ "prototype", -+ "__isPromisified__" -+]; -+var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); -+ -+var defaultFilter = function(name) { -+ return util.isIdentifier(name) && -+ name.charAt(0) !== "_" && -+ name !== "constructor"; -+}; -+ -+function propsFilter(key) { -+ return !noCopyPropsPattern.test(key); -+} -+ -+function isPromisified(fn) { -+ try { -+ return fn.__isPromisified__ === true; -+ } -+ catch (e) { -+ return false; -+ } -+} -+ -+function hasPromisified(obj, key, suffix) { -+ var val = util.getDataPropertyOrDefault(obj, key + suffix, -+ defaultPromisified); -+ return val ? isPromisified(val) : false; -+} -+function checkValid(ret, suffix, suffixRegexp) { -+ for (var i = 0; i < ret.length; i += 2) { -+ var key = ret[i]; -+ if (suffixRegexp.test(key)) { -+ var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); -+ for (var j = 0; j < ret.length; j += 2) { -+ if (ret[j] === keyWithoutAsyncSuffix) { -+ throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" -+ .replace("%s", suffix)); -+ } -+ } -+ } -+ } -+} -+ -+function promisifiableMethods(obj, suffix, suffixRegexp, filter) { -+ var keys = util.inheritedDataKeys(obj); -+ var ret = []; -+ for (var i = 0; i < keys.length; ++i) { -+ var key = keys[i]; -+ var value = obj[key]; -+ var passesDefaultFilter = filter === defaultFilter -+ ? true : defaultFilter(key, value, obj); -+ if (typeof value === "function" && -+ !isPromisified(value) && -+ !hasPromisified(obj, key, suffix) && -+ filter(key, value, obj, passesDefaultFilter)) { -+ ret.push(key, value); -+ } -+ } -+ checkValid(ret, suffix, suffixRegexp); -+ return ret; -+} -+ -+var escapeIdentRegex = function(str) { -+ return str.replace(/([$])/, "\\$"); -+}; -+ -+var makeNodePromisifiedEval; -+if (!false) { -+var switchCaseArgumentOrder = function(likelyArgumentCount) { -+ var ret = [likelyArgumentCount]; -+ var min = Math.max(0, likelyArgumentCount - 1 - 3); -+ for(var i = likelyArgumentCount - 1; i >= min; --i) { -+ ret.push(i); -+ } -+ for(var i = likelyArgumentCount + 1; i <= 3; ++i) { -+ ret.push(i); -+ } -+ return ret; -+}; -+ -+var argumentSequence = function(argumentCount) { -+ return util.filledRange(argumentCount, "_arg", ""); -+}; -+ -+var parameterDeclaration = function(parameterCount) { -+ return util.filledRange( -+ Math.max(parameterCount, 3), "_arg", ""); -+}; -+ -+var parameterCount = function(fn) { -+ if (typeof fn.length === "number") { -+ return Math.max(Math.min(fn.length, 1023 + 1), 0); -+ } -+ return 0; -+}; -+ -+makeNodePromisifiedEval = -+function(callback, receiver, originalName, fn, _, multiArgs) { -+ var newParameterCount = Math.max(0, parameterCount(fn) - 1); -+ var argumentOrder = switchCaseArgumentOrder(newParameterCount); -+ var shouldProxyThis = typeof callback === "string" || receiver === THIS; -+ -+ function generateCallForArgumentCount(count) { -+ var args = argumentSequence(count).join(", "); -+ var comma = count > 0 ? ", " : ""; -+ var ret; -+ if (shouldProxyThis) { -+ ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; -+ } else { -+ ret = receiver === undefined -+ ? "ret = callback({{args}}, nodeback); break;\n" -+ : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; -+ } -+ return ret.replace("{{args}}", args).replace(", ", comma); -+ } -+ -+ function generateArgumentSwitchCase() { -+ var ret = ""; -+ for (var i = 0; i < argumentOrder.length; ++i) { -+ ret += "case " + argumentOrder[i] +":" + -+ generateCallForArgumentCount(argumentOrder[i]); -+ } -+ -+ ret += " \n\ -+ default: \n\ -+ var args = new Array(len + 1); \n\ -+ var i = 0; \n\ -+ for (var i = 0; i < len; ++i) { \n\ -+ args[i] = arguments[i]; \n\ -+ } \n\ -+ args[i] = nodeback; \n\ -+ [CodeForCall] \n\ -+ break; \n\ -+ ".replace("[CodeForCall]", (shouldProxyThis -+ ? "ret = callback.apply(this, args);\n" -+ : "ret = callback.apply(receiver, args);\n")); -+ return ret; -+ } -+ -+ var getFunctionCode = typeof callback === "string" -+ ? ("this != null ? this['"+callback+"'] : fn") -+ : "fn"; -+ var body = "'use strict'; \n\ -+ var ret = function (Parameters) { \n\ -+ 'use strict'; \n\ -+ var len = arguments.length; \n\ -+ var promise = new Promise(INTERNAL); \n\ -+ promise._captureStackTrace(); \n\ -+ var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ -+ var ret; \n\ -+ var callback = tryCatch([GetFunctionCode]); \n\ -+ switch(len) { \n\ -+ [CodeForSwitchCase] \n\ -+ } \n\ -+ if (ret === errorObj) { \n\ -+ promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ -+ } \n\ -+ if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ -+ return promise; \n\ -+ }; \n\ -+ notEnumerableProp(ret, '__isPromisified__', true); \n\ -+ return ret; \n\ -+ ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) -+ .replace("[GetFunctionCode]", getFunctionCode); -+ body = body.replace("Parameters", parameterDeclaration(newParameterCount)); -+ return new Function("Promise", -+ "fn", -+ "receiver", -+ "withAppended", -+ "maybeWrapAsError", -+ "nodebackForPromise", -+ "tryCatch", -+ "errorObj", -+ "notEnumerableProp", -+ "INTERNAL", -+ body)( -+ Promise, -+ fn, -+ receiver, -+ withAppended, -+ maybeWrapAsError, -+ nodebackForPromise, -+ util.tryCatch, -+ util.errorObj, -+ util.notEnumerableProp, -+ INTERNAL); -+}; -+} -+ -+function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { -+ var defaultThis = (function() {return this;})(); -+ var method = callback; -+ if (typeof method === "string") { -+ callback = fn; -+ } -+ function promisified() { -+ var _receiver = receiver; -+ if (receiver === THIS) _receiver = this; -+ var promise = new Promise(INTERNAL); -+ promise._captureStackTrace(); -+ var cb = typeof method === "string" && this !== defaultThis -+ ? this[method] : callback; -+ var fn = nodebackForPromise(promise, multiArgs); -+ try { -+ cb.apply(_receiver, withAppended(arguments, fn)); -+ } catch(e) { -+ promise._rejectCallback(maybeWrapAsError(e), true, true); -+ } -+ if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); -+ return promise; -+ } -+ util.notEnumerableProp(promisified, "__isPromisified__", true); -+ return promisified; -+} -+ -+var makeNodePromisified = canEvaluate -+ ? makeNodePromisifiedEval -+ : makeNodePromisifiedClosure; -+ -+function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { -+ var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); -+ var methods = -+ promisifiableMethods(obj, suffix, suffixRegexp, filter); -+ -+ for (var i = 0, len = methods.length; i < len; i+= 2) { -+ var key = methods[i]; -+ var fn = methods[i+1]; -+ var promisifiedKey = key + suffix; -+ if (promisifier === makeNodePromisified) { -+ obj[promisifiedKey] = -+ makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); -+ } else { -+ var promisified = promisifier(fn, function() { -+ return makeNodePromisified(key, THIS, key, -+ fn, suffix, multiArgs); -+ }); -+ util.notEnumerableProp(promisified, "__isPromisified__", true); -+ obj[promisifiedKey] = promisified; -+ } -+ } -+ util.toFastProperties(obj); -+ return obj; -+} -+ -+function promisify(callback, receiver, multiArgs) { -+ return makeNodePromisified(callback, receiver, undefined, -+ callback, null, multiArgs); -+} -+ -+Promise.promisify = function (fn, options) { -+ if (typeof fn !== "function") { -+ throw new TypeError("expecting a function but got " + util.classString(fn)); -+ } -+ if (isPromisified(fn)) { -+ return fn; -+ } -+ options = Object(options); -+ var receiver = options.context === undefined ? THIS : options.context; -+ var multiArgs = !!options.multiArgs; -+ var ret = promisify(fn, receiver, multiArgs); -+ util.copyDescriptors(fn, ret, propsFilter); -+ return ret; -+}; -+ -+Promise.promisifyAll = function (target, options) { -+ if (typeof target !== "function" && typeof target !== "object") { -+ throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+ options = Object(options); -+ var multiArgs = !!options.multiArgs; -+ var suffix = options.suffix; -+ if (typeof suffix !== "string") suffix = defaultSuffix; -+ var filter = options.filter; -+ if (typeof filter !== "function") filter = defaultFilter; -+ var promisifier = options.promisifier; -+ if (typeof promisifier !== "function") promisifier = makeNodePromisified; -+ -+ if (!util.isIdentifier(suffix)) { -+ throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+ -+ var keys = util.inheritedDataKeys(target); -+ for (var i = 0; i < keys.length; ++i) { -+ var value = target[keys[i]]; -+ if (keys[i] !== "constructor" && -+ util.isClass(value)) { -+ promisifyAll(value.prototype, suffix, filter, promisifier, -+ multiArgs); -+ promisifyAll(value, suffix, filter, promisifier, multiArgs); -+ } -+ } -+ -+ return promisifyAll(target, suffix, filter, promisifier, multiArgs); -+}; -+}; -+ -+ -+}, -+"JvCBFxJrWkfOj+TRNuGmYzKdV4sCdpVSxE0yeUDpFeo=": -+function (require, module, exports, __dirname, __filename) { -+/** -+ C-like unsigned 64 bits integers in Javascript -+ Copyright (C) 2013, Pierre Curto -+ MIT license -+ */ -+;(function (root) { -+ -+ // Local cache for typical radices -+ var radixPowerCache = { -+ 16: UINT64( Math.pow(16, 5) ) -+ , 10: UINT64( Math.pow(10, 5) ) -+ , 2: UINT64( Math.pow(2, 5) ) -+ } -+ var radixCache = { -+ 16: UINT64(16) -+ , 10: UINT64(10) -+ , 2: UINT64(2) -+ } -+ -+ /** -+ * Represents an unsigned 64 bits integer -+ * @constructor -+ * @param {Number} first low bits (8) -+ * @param {Number} second low bits (8) -+ * @param {Number} first high bits (8) -+ * @param {Number} second high bits (8) -+ * or -+ * @param {Number} low bits (32) -+ * @param {Number} high bits (32) -+ * or -+ * @param {String|Number} integer as a string | integer as a number -+ * @param {Number|Undefined} radix (optional, default=10) -+ * @return -+ */ -+ function UINT64 (a00, a16, a32, a48) { -+ if ( !(this instanceof UINT64) ) -+ return new UINT64(a00, a16, a32, a48) -+ -+ this.remainder = null -+ if (typeof a00 == 'string') -+ return fromString.call(this, a00, a16) -+ -+ if (typeof a16 == 'undefined') -+ return fromNumber.call(this, a00) -+ -+ fromBits.apply(this, arguments) -+ } -+ -+ /** -+ * Set the current _UINT64_ object with its low and high bits -+ * @method fromBits -+ * @param {Number} first low bits (8) -+ * @param {Number} second low bits (8) -+ * @param {Number} first high bits (8) -+ * @param {Number} second high bits (8) -+ * or -+ * @param {Number} low bits (32) -+ * @param {Number} high bits (32) -+ * @return ThisExpression -+ */ -+ function fromBits (a00, a16, a32, a48) { -+ if (typeof a32 == 'undefined') { -+ this._a00 = a00 & 0xFFFF -+ this._a16 = a00 >>> 16 -+ this._a32 = a16 & 0xFFFF -+ this._a48 = a16 >>> 16 -+ return this -+ } -+ -+ this._a00 = a00 | 0 -+ this._a16 = a16 | 0 -+ this._a32 = a32 | 0 -+ this._a48 = a48 | 0 -+ -+ return this -+ } -+ UINT64.prototype.fromBits = fromBits -+ -+ /** -+ * Set the current _UINT64_ object from a number -+ * @method fromNumber -+ * @param {Number} number -+ * @return ThisExpression -+ */ -+ function fromNumber (value) { -+ this._a00 = value & 0xFFFF -+ this._a16 = value >>> 16 -+ this._a32 = 0 -+ this._a48 = 0 -+ -+ return this -+ } -+ UINT64.prototype.fromNumber = fromNumber -+ -+ /** -+ * Set the current _UINT64_ object from a string -+ * @method fromString -+ * @param {String} integer as a string -+ * @param {Number} radix (optional, default=10) -+ * @return ThisExpression -+ */ -+ function fromString (s, radix) { -+ radix = radix || 10 -+ -+ this._a00 = 0 -+ this._a16 = 0 -+ this._a32 = 0 -+ this._a48 = 0 -+ -+ /* -+ In Javascript, bitwise operators only operate on the first 32 bits -+ of a number, even though parseInt() encodes numbers with a 53 bits -+ mantissa. -+ Therefore UINT64() can only work on 32 bits. -+ The radix maximum value is 36 (as per ECMA specs) (26 letters + 10 digits) -+ maximum input value is m = 32bits as 1 = 2^32 - 1 -+ So the maximum substring length n is: -+ 36^(n+1) - 1 = 2^32 - 1 -+ 36^(n+1) = 2^32 -+ (n+1)ln(36) = 32ln(2) -+ n = 32ln(2)/ln(36) - 1 -+ n = 5.189644915687692 -+ n = 5 -+ */ -+ var radixUint = radixPowerCache[radix] || new UINT64( Math.pow(radix, 5) ) -+ -+ for (var i = 0, len = s.length; i < len; i += 5) { -+ var size = Math.min(5, len - i) -+ var value = parseInt( s.slice(i, i + size), radix ) -+ this.multiply( -+ size < 5 -+ ? new UINT64( Math.pow(radix, size) ) -+ : radixUint -+ ) -+ .add( new UINT64(value) ) -+ } -+ -+ return this -+ } -+ UINT64.prototype.fromString = fromString -+ -+ /** -+ * Convert this _UINT64_ to a number (last 32 bits are dropped) -+ * @method toNumber -+ * @return {Number} the converted UINT64 -+ */ -+ UINT64.prototype.toNumber = function () { -+ return (this._a16 * 65536) + this._a00 -+ } -+ -+ /** -+ * Convert this _UINT64_ to a string -+ * @method toString -+ * @param {Number} radix (optional, default=10) -+ * @return {String} the converted UINT64 -+ */ -+ UINT64.prototype.toString = function (radix) { -+ radix = radix || 10 -+ var radixUint = radixCache[radix] || new UINT64(radix) -+ -+ if ( !this.gt(radixUint) ) return this.toNumber().toString(radix) -+ -+ var self = this.clone() -+ var res = new Array(64) -+ for (var i = 63; i >= 0; i--) { -+ self.div(radixUint) -+ res[i] = self.remainder.toNumber().toString(radix) -+ if ( !self.gt(radixUint) ) break -+ } -+ res[i-1] = self.toNumber().toString(radix) -+ -+ return res.join('') -+ } -+ -+ /** -+ * Add two _UINT64_. The current _UINT64_ stores the result -+ * @method add -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.add = function (other) { -+ var a00 = this._a00 + other._a00 -+ -+ var a16 = a00 >>> 16 -+ a16 += this._a16 + other._a16 -+ -+ var a32 = a16 >>> 16 -+ a32 += this._a32 + other._a32 -+ -+ var a48 = a32 >>> 16 -+ a48 += this._a48 + other._a48 -+ -+ this._a00 = a00 & 0xFFFF -+ this._a16 = a16 & 0xFFFF -+ this._a32 = a32 & 0xFFFF -+ this._a48 = a48 & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Subtract two _UINT64_. The current _UINT64_ stores the result -+ * @method subtract -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.subtract = function (other) { -+ return this.add( other.clone().negate() ) -+ } -+ -+ /** -+ * Multiply two _UINT64_. The current _UINT64_ stores the result -+ * @method multiply -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.multiply = function (other) { -+ /* -+ a = a00 + a16 + a32 + a48 -+ b = b00 + b16 + b32 + b48 -+ a*b = (a00 + a16 + a32 + a48)(b00 + b16 + b32 + b48) -+ = a00b00 + a00b16 + a00b32 + a00b48 -+ + a16b00 + a16b16 + a16b32 + a16b48 -+ + a32b00 + a32b16 + a32b32 + a32b48 -+ + a48b00 + a48b16 + a48b32 + a48b48 -+ -+ a16b48, a32b32, a48b16, a48b32 and a48b48 overflow the 64 bits -+ so it comes down to: -+ a*b = a00b00 + a00b16 + a00b32 + a00b48 -+ + a16b00 + a16b16 + a16b32 -+ + a32b00 + a32b16 -+ + a48b00 -+ = a00b00 -+ + a00b16 + a16b00 -+ + a00b32 + a16b16 + a32b00 -+ + a00b48 + a16b32 + a32b16 + a48b00 -+ */ -+ var a00 = this._a00 -+ var a16 = this._a16 -+ var a32 = this._a32 -+ var a48 = this._a48 -+ var b00 = other._a00 -+ var b16 = other._a16 -+ var b32 = other._a32 -+ var b48 = other._a48 -+ -+ var c00 = a00 * b00 -+ -+ var c16 = c00 >>> 16 -+ c16 += a00 * b16 -+ var c32 = c16 >>> 16 -+ c16 &= 0xFFFF -+ c16 += a16 * b00 -+ -+ c32 += c16 >>> 16 -+ c32 += a00 * b32 -+ var c48 = c32 >>> 16 -+ c32 &= 0xFFFF -+ c32 += a16 * b16 -+ c48 += c32 >>> 16 -+ c32 &= 0xFFFF -+ c32 += a32 * b00 -+ -+ c48 += c32 >>> 16 -+ c48 += a00 * b48 -+ c48 &= 0xFFFF -+ c48 += a16 * b32 -+ c48 &= 0xFFFF -+ c48 += a32 * b16 -+ c48 &= 0xFFFF -+ c48 += a48 * b00 -+ -+ this._a00 = c00 & 0xFFFF -+ this._a16 = c16 & 0xFFFF -+ this._a32 = c32 & 0xFFFF -+ this._a48 = c48 & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Divide two _UINT64_. The current _UINT64_ stores the result. -+ * The remainder is made available as the _remainder_ property on -+ * the _UINT64_ object. It can be null, meaning there are no remainder. -+ * @method div -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.div = function (other) { -+ if ( (other._a16 == 0) && (other._a32 == 0) && (other._a48 == 0) ) { -+ if (other._a00 == 0) throw Error('division by zero') -+ -+ // other == 1: this -+ if (other._a00 == 1) { -+ this.remainder = new UINT64(0) -+ return this -+ } -+ } -+ -+ // other > this: 0 -+ if ( other.gt(this) ) { -+ this.remainder = this.clone() -+ this._a00 = 0 -+ this._a16 = 0 -+ this._a32 = 0 -+ this._a48 = 0 -+ return this -+ } -+ // other == this: 1 -+ if ( this.eq(other) ) { -+ this.remainder = new UINT64(0) -+ this._a00 = 1 -+ this._a16 = 0 -+ this._a32 = 0 -+ this._a48 = 0 -+ return this -+ } -+ -+ // Shift the divisor left until it is higher than the dividend -+ var _other = other.clone() -+ var i = -1 -+ while ( !this.lt(_other) ) { -+ // High bit can overflow the default 16bits -+ // Its ok since we right shift after this loop -+ // The overflown bit must be kept though -+ _other.shiftLeft(1, true) -+ i++ -+ } -+ -+ // Set the remainder -+ this.remainder = this.clone() -+ // Initialize the current result to 0 -+ this._a00 = 0 -+ this._a16 = 0 -+ this._a32 = 0 -+ this._a48 = 0 -+ for (; i >= 0; i--) { -+ _other.shiftRight(1) -+ // If shifted divisor is smaller than the dividend -+ // then subtract it from the dividend -+ if ( !this.remainder.lt(_other) ) { -+ this.remainder.subtract(_other) -+ // Update the current result -+ if (i >= 48) { -+ this._a48 |= 1 << (i - 48) -+ } else if (i >= 32) { -+ this._a32 |= 1 << (i - 32) -+ } else if (i >= 16) { -+ this._a16 |= 1 << (i - 16) -+ } else { -+ this._a00 |= 1 << i -+ } -+ } -+ } -+ -+ return this -+ } -+ -+ /** -+ * Negate the current _UINT64_ -+ * @method negate -+ * @return ThisExpression -+ */ -+ UINT64.prototype.negate = function () { -+ var v = ( ~this._a00 & 0xFFFF ) + 1 -+ this._a00 = v & 0xFFFF -+ v = (~this._a16 & 0xFFFF) + (v >>> 16) -+ this._a16 = v & 0xFFFF -+ v = (~this._a32 & 0xFFFF) + (v >>> 16) -+ this._a32 = v & 0xFFFF -+ this._a48 = (~this._a48 + (v >>> 16)) & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ -+ * @method eq -+ * @param {Object} other UINT64 -+ * @return {Boolean} -+ */ -+ UINT64.prototype.equals = UINT64.prototype.eq = function (other) { -+ return (this._a48 == other._a48) && (this._a00 == other._a00) -+ && (this._a32 == other._a32) && (this._a16 == other._a16) -+ } -+ -+ /** -+ * Greater than (strict) -+ * @method gt -+ * @param {Object} other UINT64 -+ * @return {Boolean} -+ */ -+ UINT64.prototype.greaterThan = UINT64.prototype.gt = function (other) { -+ if (this._a48 > other._a48) return true -+ if (this._a48 < other._a48) return false -+ if (this._a32 > other._a32) return true -+ if (this._a32 < other._a32) return false -+ if (this._a16 > other._a16) return true -+ if (this._a16 < other._a16) return false -+ return this._a00 > other._a00 -+ } -+ -+ /** -+ * Less than (strict) -+ * @method lt -+ * @param {Object} other UINT64 -+ * @return {Boolean} -+ */ -+ UINT64.prototype.lessThan = UINT64.prototype.lt = function (other) { -+ if (this._a48 < other._a48) return true -+ if (this._a48 > other._a48) return false -+ if (this._a32 < other._a32) return true -+ if (this._a32 > other._a32) return false -+ if (this._a16 < other._a16) return true -+ if (this._a16 > other._a16) return false -+ return this._a00 < other._a00 -+ } -+ -+ /** -+ * Bitwise OR -+ * @method or -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.or = function (other) { -+ this._a00 |= other._a00 -+ this._a16 |= other._a16 -+ this._a32 |= other._a32 -+ this._a48 |= other._a48 -+ -+ return this -+ } -+ -+ /** -+ * Bitwise AND -+ * @method and -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.and = function (other) { -+ this._a00 &= other._a00 -+ this._a16 &= other._a16 -+ this._a32 &= other._a32 -+ this._a48 &= other._a48 -+ -+ return this -+ } -+ -+ /** -+ * Bitwise XOR -+ * @method xor -+ * @param {Object} other UINT64 -+ * @return ThisExpression -+ */ -+ UINT64.prototype.xor = function (other) { -+ this._a00 ^= other._a00 -+ this._a16 ^= other._a16 -+ this._a32 ^= other._a32 -+ this._a48 ^= other._a48 -+ -+ return this -+ } -+ -+ /** -+ * Bitwise NOT -+ * @method not -+ * @return ThisExpression -+ */ -+ UINT64.prototype.not = function() { -+ this._a00 = ~this._a00 & 0xFFFF -+ this._a16 = ~this._a16 & 0xFFFF -+ this._a32 = ~this._a32 & 0xFFFF -+ this._a48 = ~this._a48 & 0xFFFF -+ -+ return this -+ } -+ -+ /** -+ * Bitwise shift right -+ * @method shiftRight -+ * @param {Number} number of bits to shift -+ * @return ThisExpression -+ */ -+ UINT64.prototype.shiftRight = UINT64.prototype.shiftr = function (n) { -+ n %= 64 -+ if (n >= 48) { -+ this._a00 = this._a48 >> (n - 48) -+ this._a16 = 0 -+ this._a32 = 0 -+ this._a48 = 0 -+ } else if (n >= 32) { -+ n -= 32 -+ this._a00 = ( (this._a32 >> n) | (this._a48 << (16-n)) ) & 0xFFFF -+ this._a16 = (this._a48 >> n) & 0xFFFF -+ this._a32 = 0 -+ this._a48 = 0 -+ } else if (n >= 16) { -+ n -= 16 -+ this._a00 = ( (this._a16 >> n) | (this._a32 << (16-n)) ) & 0xFFFF -+ this._a16 = ( (this._a32 >> n) | (this._a48 << (16-n)) ) & 0xFFFF -+ this._a32 = (this._a48 >> n) & 0xFFFF -+ this._a48 = 0 -+ } else { -+ this._a00 = ( (this._a00 >> n) | (this._a16 << (16-n)) ) & 0xFFFF -+ this._a16 = ( (this._a16 >> n) | (this._a32 << (16-n)) ) & 0xFFFF -+ this._a32 = ( (this._a32 >> n) | (this._a48 << (16-n)) ) & 0xFFFF -+ this._a48 = (this._a48 >> n) & 0xFFFF -+ } -+ -+ return this -+ } -+ -+ /** -+ * Bitwise shift left -+ * @method shiftLeft -+ * @param {Number} number of bits to shift -+ * @param {Boolean} allow overflow -+ * @return ThisExpression -+ */ -+ UINT64.prototype.shiftLeft = UINT64.prototype.shiftl = function (n, allowOverflow) { -+ n %= 64 -+ if (n >= 48) { -+ this._a48 = this._a00 << (n - 48) -+ this._a32 = 0 -+ this._a16 = 0 -+ this._a00 = 0 -+ } else if (n >= 32) { -+ n -= 32 -+ this._a48 = (this._a16 << n) | (this._a00 >> (16-n)) -+ this._a32 = (this._a00 << n) & 0xFFFF -+ this._a16 = 0 -+ this._a00 = 0 -+ } else if (n >= 16) { -+ n -= 16 -+ this._a48 = (this._a32 << n) | (this._a16 >> (16-n)) -+ this._a32 = ( (this._a16 << n) | (this._a00 >> (16-n)) ) & 0xFFFF -+ this._a16 = (this._a00 << n) & 0xFFFF -+ this._a00 = 0 -+ } else { -+ this._a48 = (this._a48 << n) | (this._a32 >> (16-n)) -+ this._a32 = ( (this._a32 << n) | (this._a16 >> (16-n)) ) & 0xFFFF -+ this._a16 = ( (this._a16 << n) | (this._a00 >> (16-n)) ) & 0xFFFF -+ this._a00 = (this._a00 << n) & 0xFFFF -+ } -+ if (!allowOverflow) { -+ this._a48 &= 0xFFFF -+ } -+ -+ return this -+ } -+ -+ /** -+ * Bitwise rotate left -+ * @method rotl -+ * @param {Number} number of bits to rotate -+ * @return ThisExpression -+ */ -+ UINT64.prototype.rotateLeft = UINT64.prototype.rotl = function (n) { -+ n %= 64 -+ if (n == 0) return this -+ if (n >= 32) { -+ // A.B.C.D -+ // B.C.D.A rotl(16) -+ // C.D.A.B rotl(32) -+ var v = this._a00 -+ this._a00 = this._a32 -+ this._a32 = v -+ v = this._a48 -+ this._a48 = this._a16 -+ this._a16 = v -+ if (n == 32) return this -+ n -= 32 -+ } -+ -+ var high = (this._a48 << 16) | this._a32 -+ var low = (this._a16 << 16) | this._a00 -+ -+ var _high = (high << n) | (low >>> (32 - n)) -+ var _low = (low << n) | (high >>> (32 - n)) -+ -+ this._a00 = _low & 0xFFFF -+ this._a16 = _low >>> 16 -+ this._a32 = _high & 0xFFFF -+ this._a48 = _high >>> 16 -+ -+ return this -+ } -+ -+ /** -+ * Bitwise rotate right -+ * @method rotr -+ * @param {Number} number of bits to rotate -+ * @return ThisExpression -+ */ -+ UINT64.prototype.rotateRight = UINT64.prototype.rotr = function (n) { -+ n %= 64 -+ if (n == 0) return this -+ if (n >= 32) { -+ // A.B.C.D -+ // D.A.B.C rotr(16) -+ // C.D.A.B rotr(32) -+ var v = this._a00 -+ this._a00 = this._a32 -+ this._a32 = v -+ v = this._a48 -+ this._a48 = this._a16 -+ this._a16 = v -+ if (n == 32) return this -+ n -= 32 -+ } -+ -+ var high = (this._a48 << 16) | this._a32 -+ var low = (this._a16 << 16) | this._a00 -+ -+ var _high = (high >>> n) | (low << (32 - n)) -+ var _low = (low >>> n) | (high << (32 - n)) -+ -+ this._a00 = _low & 0xFFFF -+ this._a16 = _low >>> 16 -+ this._a32 = _high & 0xFFFF -+ this._a48 = _high >>> 16 -+ -+ return this -+ } -+ -+ /** -+ * Clone the current _UINT64_ -+ * @method clone -+ * @return {Object} cloned UINT64 -+ */ -+ UINT64.prototype.clone = function () { -+ return new UINT64(this._a00, this._a16, this._a32, this._a48) -+ } -+ -+ if (typeof define != 'undefined' && define.amd) { -+ // AMD / RequireJS -+ define([], function () { -+ return UINT64 -+ }) -+ } else if (typeof module != 'undefined' && module.exports) { -+ // Node.js -+ module.exports = UINT64 -+ } else { -+ // Browser -+ root['UINT64'] = UINT64 -+ } -+ -+})(this) -+ -+}, -+"K1cNFqtlGOBiwNIxcnqMaT1oKNvJUTxlHDxw61tnn6I=": -+function (require, module, exports, __dirname, __filename) { -+'use strict' -+ -+var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN -+var AbstractChainedBatch = require('abstract-leveldown').AbstractChainedBatch -+var AbstractIterator = require('abstract-leveldown').AbstractIterator -+var inherits = require('inherits') -+var Codec = require('level-codec') -+var EncodingError = require('level-errors').EncodingError -+var rangeMethods = ['approximateSize', 'compactRange'] -+ -+module.exports = DB.default = DB -+ -+function DB (db, opts) { -+ if (!(this instanceof DB)) return new DB(db, opts) -+ -+ var manifest = db.supports || {} -+ var additionalMethods = manifest.additionalMethods || {} -+ -+ AbstractLevelDOWN.call(this, manifest) -+ -+ this.supports.encodings = true -+ this.supports.additionalMethods = {} -+ -+ rangeMethods.forEach(function (m) { -+ // TODO (future major): remove this fallback -+ var fallback = typeof db[m] === 'function' -+ -+ if (additionalMethods[m] || fallback) { -+ this.supports.additionalMethods[m] = true -+ -+ this[m] = function (start, end, opts, cb) { -+ start = this.codec.encodeKey(start, opts) -+ end = this.codec.encodeKey(end, opts) -+ return this.db[m](start, end, opts, cb) -+ } -+ } -+ }, this) -+ -+ opts = opts || {} -+ if (typeof opts.keyEncoding === 'undefined') opts.keyEncoding = 'utf8' -+ if (typeof opts.valueEncoding === 'undefined') opts.valueEncoding = 'utf8' -+ -+ this.db = db -+ this.codec = new Codec(opts) -+} -+ -+inherits(DB, AbstractLevelDOWN) -+ -+DB.prototype.type = 'encoding-down' -+ -+DB.prototype._serializeKey = -+DB.prototype._serializeValue = function (datum) { -+ return datum -+} -+ -+DB.prototype._open = function (opts, cb) { -+ this.db.open(opts, cb) -+} -+ -+DB.prototype._close = function (cb) { -+ this.db.close(cb) -+} -+ -+DB.prototype._put = function (key, value, opts, cb) { -+ key = this.codec.encodeKey(key, opts) -+ value = this.codec.encodeValue(value, opts) -+ this.db.put(key, value, opts, cb) -+} -+ -+DB.prototype._get = function (key, opts, cb) { -+ var self = this -+ key = this.codec.encodeKey(key, opts) -+ opts.asBuffer = this.codec.valueAsBuffer(opts) -+ this.db.get(key, opts, function (err, value) { -+ if (err) return cb(err) -+ try { -+ value = self.codec.decodeValue(value, opts) -+ } catch (err) { -+ return cb(new EncodingError(err)) -+ } -+ cb(null, value) -+ }) -+} -+ -+DB.prototype._del = function (key, opts, cb) { -+ key = this.codec.encodeKey(key, opts) -+ this.db.del(key, opts, cb) -+} -+ -+DB.prototype._chainedBatch = function () { -+ return new Batch(this) -+} -+ -+DB.prototype._batch = function (ops, opts, cb) { -+ ops = this.codec.encodeBatch(ops, opts) -+ this.db.batch(ops, opts, cb) -+} -+ -+DB.prototype._iterator = function (opts) { -+ opts.keyAsBuffer = this.codec.keyAsBuffer(opts) -+ opts.valueAsBuffer = this.codec.valueAsBuffer(opts) -+ return new Iterator(this, opts) -+} -+ -+DB.prototype._clear = function (opts, callback) { -+ opts = this.codec.encodeLtgt(opts) -+ this.db.clear(opts, callback) -+} -+ -+function Iterator (db, opts) { -+ AbstractIterator.call(this, db) -+ this.codec = db.codec -+ this.keys = opts.keys -+ this.values = opts.values -+ this.opts = this.codec.encodeLtgt(opts) -+ this.it = db.db.iterator(this.opts) -+} -+ -+inherits(Iterator, AbstractIterator) -+ -+Iterator.prototype._next = function (cb) { -+ var self = this -+ this.it.next(function (err, key, value) { -+ if (err) return cb(err) -+ try { -+ if (self.keys && typeof key !== 'undefined') { -+ key = self.codec.decodeKey(key, self.opts) -+ } else { -+ key = undefined -+ } -+ -+ if (self.values && typeof value !== 'undefined') { -+ value = self.codec.decodeValue(value, self.opts) -+ } else { -+ value = undefined -+ } -+ } catch (err) { -+ return cb(new EncodingError(err)) -+ } -+ cb(null, key, value) -+ }) -+} -+ -+Iterator.prototype._seek = function (key) { -+ key = this.codec.encodeKey(key, this.opts) -+ this.it.seek(key) -+} -+ -+Iterator.prototype._end = function (cb) { -+ this.it.end(cb) -+} -+ -+function Batch (db, codec) { -+ AbstractChainedBatch.call(this, db) -+ this.codec = db.codec -+ this.batch = db.db.batch() -+} -+ -+inherits(Batch, AbstractChainedBatch) -+ -+Batch.prototype._put = function (key, value) { -+ key = this.codec.encodeKey(key) -+ value = this.codec.encodeValue(value) -+ this.batch.put(key, value) -+} -+ -+Batch.prototype._del = function (key) { -+ key = this.codec.encodeKey(key) -+ this.batch.del(key) -+} -+ -+Batch.prototype._clear = function () { -+ this.batch.clear() -+} -+ -+Batch.prototype._write = function (opts, cb) { -+ this.batch.write(opts, cb) -+} -+ -+}, -+"K9bIiuwxGNGAPoXS35neWnIYqWoB8JTVLJiCZUIvz08=": -+function (require, module, exports, __dirname, __filename) { -+"use strict"; -+var firstLineError; -+try {throw new Error(); } catch (e) {firstLineError = e;} -+var schedule = require("./schedule"); -+var Queue = require("./queue"); -+ -+function Async() { -+ this._customScheduler = false; -+ this._isTickUsed = false; -+ this._lateQueue = new Queue(16); -+ this._normalQueue = new Queue(16); -+ this._haveDrainedQueues = false; -+ var self = this; -+ this.drainQueues = function () { -+ self._drainQueues(); -+ }; -+ this._schedule = schedule; -+} -+ -+Async.prototype.setScheduler = function(fn) { -+ var prev = this._schedule; -+ this._schedule = fn; -+ this._customScheduler = true; -+ return prev; -+}; -+ -+Async.prototype.hasCustomScheduler = function() { -+ return this._customScheduler; -+}; -+ -+Async.prototype.haveItemsQueued = function () { -+ return this._isTickUsed || this._haveDrainedQueues; -+}; -+ -+ -+Async.prototype.fatalError = function(e, isNode) { -+ if (isNode) { -+ process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) + -+ "\n"); -+ process.exit(2); -+ } else { -+ this.throwLater(e); -+ } -+}; -+ -+Async.prototype.throwLater = function(fn, arg) { -+ if (arguments.length === 1) { -+ arg = fn; -+ fn = function () { throw arg; }; -+ } -+ if (typeof setTimeout !== "undefined") { -+ setTimeout(function() { -+ fn(arg); -+ }, 0); -+ } else try { -+ this._schedule(function() { -+ fn(arg); -+ }); -+ } catch (e) { -+ throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); -+ } -+}; -+ -+function AsyncInvokeLater(fn, receiver, arg) { -+ this._lateQueue.push(fn, receiver, arg); -+ this._queueTick(); -+} -+ -+function AsyncInvoke(fn, receiver, arg) { -+ this._normalQueue.push(fn, receiver, arg); -+ this._queueTick(); -+} -+ -+function AsyncSettlePromises(promise) { -+ this._normalQueue._pushOne(promise); -+ this._queueTick(); -+} -+ -+Async.prototype.invokeLater = AsyncInvokeLater; -+Async.prototype.invoke = AsyncInvoke; -+Async.prototype.settlePromises = AsyncSettlePromises; -+ -+ -+function _drainQueue(queue) { -+ while (queue.length() > 0) { -+ _drainQueueStep(queue); -+ } -+} -+ -+function _drainQueueStep(queue) { -+ var fn = queue.shift(); -+ if (typeof fn !== "function") { -+ fn._settlePromises(); -+ } else { -+ var receiver = queue.shift(); -+ var arg = queue.shift(); -+ fn.call(receiver, arg); -+ } -+} -+ -+Async.prototype._drainQueues = function () { -+ _drainQueue(this._normalQueue); -+ this._reset(); -+ this._haveDrainedQueues = true; -+ _drainQueue(this._lateQueue); -+}; -+ -+Async.prototype._queueTick = function () { -+ if (!this._isTickUsed) { -+ this._isTickUsed = true; -+ this._schedule(this.drainQueues); -+ } -+}; -+ -+Async.prototype._reset = function () { -+ this._isTickUsed = false; -+}; -+ -+module.exports = Async; -+module.exports.firstLineError = firstLineError; -+ -+}, -+"KFyeLKIy9dKYgWaA2fWinEVdqlY1buNWa1VuXa/rlCc=": -+function (require, module, exports, __dirname, __filename) { -+'use strict'; -+var Mutation = global.MutationObserver || global.WebKitMutationObserver; -+ -+var scheduleDrain; -+ -+if (process.browser) { -+ if (Mutation) { -+ var called = 0; -+ var observer = new Mutation(nextTick); -+ var element = global.document.createTextNode(''); -+ observer.observe(element, { -+ characterData: true -+ }); -+ scheduleDrain = function () { -+ element.data = (called = ++called % 2); -+ }; -+ } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') { -+ var channel = new global.MessageChannel(); -+ channel.port1.onmessage = nextTick; -+ scheduleDrain = function () { -+ channel.port2.postMessage(0); -+ }; -+ } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) { -+ scheduleDrain = function () { -+ -+ // Create a