{"_id":"reflecta","_rev":"28-e5189b5cfaffd5c58c49c901ef82240b","name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","dist-tags":{"latest":"0.3.7"},"versions":{"0.2.0":{"name":"reflecta","version":"0.2.0","dependencies":{"serialport":"*"},"devDependencies":{"mocha":"*","chai":"*"},"description":"Node.js client for the Reflecta communications protocol for Arduino","main":"reflecta","engine":"node >= 0.8.1","scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/JayBeavers/Reflecta.git"},"author":{"name":"jay.beavers@microsoft.com"},"license":"BSD","_id":"reflecta@0.2.0","dist":{"shasum":"dc1b0e63443e48018882a5c4e7bc4baad93c94a5","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.2.0.tgz","integrity":"sha512-knBZjKmJ8dBBAPHnzjaaJ9U/1m/NO+TLb+BQmPzCJSOqFODAM3SQyzjgZYow4POLrxwDOfX7FLTOg0j4jjfqag==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGVk4wvsuSiP8QaM/mqkBEN5sWlU1Mh+kdEOMMyQ8b4BAiEAtTxBKWfl7bjfqDOLSShWiITndaXJdBGCCPFJCxu4fbQ="}]},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"directories":{}},"0.3.0":{"name":"reflecta","version":"0.3.0","dependencies":{"serialport":"*"},"devDependencies":{"mocha":"*","chai":"*"},"description":"Node.js client for the Reflecta communications protocol for Arduino","main":"reflecta","engine":"node >= 0.8.1","scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/JayBeavers/Reflecta.git"},"author":{"name":"jay.beavers@microsoft.com"},"license":"BSD","_id":"reflecta@0.3.0","dist":{"shasum":"d49a6402e747cca7e315203b0798b6c663d9a173","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.0.tgz","integrity":"sha512-mrQR6EpHDGZbWFhH0TItLyTybSVGJbPsN+46b3lV7SRWiUP6ZB3a0stroamD6Jj8zvdKm1TEFsm4ba4w39w0Xw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDW/A9wB18TpkBN8bSizplVa4JgKh2L6OAiU0gvlDvEcgIhAOzZZTlcv9Uv5lgbLK+o/3V3cUdJmoioz0JbIp9aBmUt"}]},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"directories":{}},"0.3.1":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.1","homepage":"https://github.com/JayBeavers/Reflecta","author":{"name":"Jay Beavers","email":"jay.beavers@microsoft.com","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/JayBeavers/Reflecta.git"},"bugs":{"url":"https://github.com/JayBeavers/Reflecta/issues"},"licenses":[{"type":"BSD","url":"https://github.com/JayBeavers/Reflecta/blob/master/LICENSE"}],"dependencies":{"serialport":"*"},"devDependencies":{"mocha":"*","chai":"*"},"main":"reflecta","engines":{"node":">= 0.8.1"},"scripts":{"test":"mocha"},"_id":"reflecta@0.3.1","dist":{"shasum":"5ec7b67b4e603169455cd6a2b92e79211e50c703","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.1.tgz","integrity":"sha512-8gpAQ3tPludqVtp+l1FgdA/03SP/IZLlj74yE1V6StLONw08AemZX8PsuDUnVXlYLgQsq4BXMGpTeRtInR7aXQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkQOg263IeSs7dl/hml7qgPKs7yBEgpmf0H2dFGqXzQgIgBIW2fAkJ6TAVfbgpkfrtx73/lScoDlekVZ+iG9ByQvc="}]},"_npmVersion":"1.1.59","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"directories":{}},"0.3.2":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.2","homepage":"https://github.com/JayBeavers/Reflecta","author":{"name":"Jay Beavers","email":"jay.beavers@microsoft.com","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/JayBeavers/Reflecta.git"},"bugs":{"url":"https://github.com/JayBeavers/Reflecta/issues"},"licenses":[{"type":"BSD","url":"https://github.com/JayBeavers/Reflecta/blob/master/LICENSE"}],"dependencies":{"serialport":"*"},"devDependencies":{"mocha":"*","chai":"*"},"main":"reflecta","engines":{"node":">= 0.8.1"},"scripts":{"test":"mocha"},"_id":"reflecta@0.3.2","dist":{"shasum":"492b0cff65ce5ed97c5676290bea74061f880127","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.2.tgz","integrity":"sha512-1lTDOSTd00cAdyyf7ih0GEyVKhoQdBjaOO0Ep2FpRM0JAWVGYmFl/v9Pp2EJQr+mKlOjU/vSRF0qzaJnF2AP8g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8IrYisMLsv4rGOF2aR/HeqAsMNzb1BqlfTMYrNg26VQIhAMr/Aj+oebyjW43RtQ9P8st2Dx2jdjmXkXF8bBZb9b45"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"directories":{}},"0.3.3":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.3","homepage":"https://github.com/JayBeavers/Reflecta","author":{"name":"Jay Beavers","email":"jay.beavers@microsoft.com","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/JayBeavers/Reflecta.git"},"bugs":{"url":"https://github.com/JayBeavers/Reflecta/issues"},"licenses":[{"type":"BSD","url":"https://github.com/JayBeavers/Reflecta/blob/master/LICENSE"}],"dependencies":{"serialport":"*"},"devDependencies":{"mocha":"*","chai":"*"},"main":"reflecta","engines":{"node":">= 0.8.1"},"scripts":{"test":"mocha"},"_id":"reflecta@0.3.3","dist":{"shasum":"55d23059bb633b4e268987b4aeb693fda494ec8d","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.3.tgz","integrity":"sha512-8G8ejsXVMmCPeEk7f5fpM+94gIN0U5DGk9SUTVOiDy+4hV9e6pSZ6OJreuw8SpSa5JIg+uPlnpV0HSbSYux1TA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCr/xdpKW1W9j7foKRzrVeoV/UIUOjTrkHpFZgSxbxwTwIgGsd6K1w4mtjuuCjF0pp3dWJjcyroyLnblNBBPKWTtJU="}]},"_npmVersion":"1.1.59","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"directories":{}},"0.3.4":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.4","homepage":"https://github.com/jaybeavers/node-reflecta","author":{"name":"Jay Beavers","email":"jay@hikinghomeschoolers.org","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/jaybeavers/node-reflecta"},"bugs":{"url":"https://github.com/jaybeavers/node-reflecta/issues"},"licenses":[{"type":"BSD","url":"https://github.com/JayBeavers/jaybeavers/node-reflecta/blob/master/LICENSE"}],"dependencies":{"serialport":">= 1.0.7","npm":"*"},"devDependencies":{"mocha":"*","chai":"*","socket.io":"*"},"main":"reflecta","engines":{"node":">= 0.8.1"},"scripts":{"test":"mocha"},"_id":"reflecta@0.3.4","dist":{"shasum":"c2d7b62ef618a16cff2470ad9bb64b9b87c4b1b8","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.4.tgz","integrity":"sha512-jmh7YE1C6mYwQjE0RToqw79KL6JFbP+WdQNtfNPl616hLCIu/HV70kAdVZfhecWqqP9H9c+YwFFXvuJekzNzuQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXrJsrqjHBccLOvmHA8dr99/xJbOvOMhkqwn1tT6cg0wIhAMYwK440j13h9JQ59dMmkEeathAAg+X9cLCN+pGhqT8l"}]},"_npmVersion":"1.1.59","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}]},"0.3.5":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.5","homepage":"https://github.com/jaybeavers/node-reflecta","author":{"name":"Jay Beavers","email":"jay@hikinghomeschoolers.org","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/jaybeavers/node-reflecta"},"bugs":{"url":"https://github.com/jaybeavers/node-reflecta/issues"},"licenses":[{"type":"BSD","url":"https://github.com/JayBeavers/jaybeavers/node-reflecta/blob/master/LICENSE"}],"dependencies":{"serialport":">= 1.0.7","npm":"*"},"devDependencies":{"mocha":"~1.9.0","chai":"*","socket.io":"*","grunt":"~0.4.1","grunt-contrib-jshint":"~0.4.3","grunt-typescript":"*","jshint":"*","grunt-simple-mocha":"~0.4.0"},"main":"reflecta","engines":{"node":">= 0.8.1"},"_id":"reflecta@0.3.5","dist":{"shasum":"1c047f58fda222942c50834b12f6b3ea3c3cd788","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.5.tgz","integrity":"sha512-KaJNu9pgg2N0uutBCEicANJ3mGEsazvQMhZMeLn0FaW6vmL6Hu1BUalcBWnC4LOfCJCOAfzsQxafVYneCJ/Bug==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC60bJ/0Jm54HHDAw2sQZYqTIP3elgv+qRU1ojCqbi3qwIgB6BjfeAMEbQqftpvNUJhzrM4D1ZK7MOef49xe8p1/XQ="}]},"_from":".","_npmVersion":"1.2.17","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}]},"0.3.6":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.6","homepage":"https://github.com/jaybeavers/node-reflecta","author":{"name":"Jay Beavers","email":"jay@hikinghomeschoolers.org","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/jaybeavers/node-reflecta.git"},"bugs":{"url":"https://github.com/jaybeavers/node-reflecta/issues"},"license":"BSD-2-Clause","dependencies":{"serialport":"~1.7.1","npm":"^2.11.0"},"devDependencies":{"mocha":"~2.2.5","chai":"~2.3.0","socket.io":"~1.3.5","grunt":"~0.4.5","grunt-contrib-jshint":"~0.11.2","jshint":"*","grunt-simple-mocha":"~0.4.0"},"main":"reflecta","engines":{"node":">= 0.12.3"},"scripts":{"test":"grunt light"},"gitHead":"1998b61f54480d7a2757879ba7dd9cf8637d0f6c","_id":"reflecta@0.3.6","_shasum":"63a9ff9842d438f859ceef5c45c7f24859defc53","_from":".","_npmVersion":"2.9.1","_nodeVersion":"0.12.3","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"dist":{"shasum":"63a9ff9842d438f859ceef5c45c7f24859defc53","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.6.tgz","integrity":"sha512-EtSu/3Sj0jRVQPNFYG742Sntoenjlr7cKp7fikZYXjwHcVUXYdU1N9XN3N70caUIgY+8BzmsvljTXI8G6hIfDw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcUGg9CycF2G7iYJ8FtnueICb+k/GvvXa3NHYCmV9HzwIgLMuuPuM6kzjbn4xzUQaOfJKKXwB+a0eUhVSRRNT/SKM="}]},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}]},"0.3.7":{"name":"reflecta","description":"Node.js client for the Reflecta communications protocol for Arduino","version":"0.3.7","homepage":"https://github.com/jaybeavers/node-reflecta","author":{"name":"Jay Beavers","email":"jay@hikinghomeschoolers.org","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/jaybeavers/node-reflecta.git"},"bugs":{"url":"https://github.com/jaybeavers/node-reflecta/issues"},"license":"BSD-2-Clause","dependencies":{"serialport":"2.0.5","npm":"^3.5.2"},"devDependencies":{"mocha":"~2.3.4","chai":"~3.4.1","socket.io":"~1.3.5","grunt":"~0.4.5","grunt-contrib-jshint":"~0.11.2","jshint":"*","grunt-simple-mocha":"~0.4.0"},"main":"reflecta","engines":{"node":">= 0.12.3"},"scripts":{"test":"grunt light"},"gitHead":"9157863aef4afcca9b32c13ada65e044b3757b40","_id":"reflecta@0.3.7","_shasum":"de0b9b42ebb4e5d06b65e08a0de4c8f027788e86","_from":".","_npmVersion":"2.14.2","_nodeVersion":"4.0.0","_npmUser":{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"},"dist":{"shasum":"de0b9b42ebb4e5d06b65e08a0de4c8f027788e86","tarball":"https://registry.npmjs.org/reflecta/-/reflecta-0.3.7.tgz","integrity":"sha512-7pXbn1ufxPR7TxGyXPlT8AhiOwUFJ0PZifd0Gu1eMjBMln6AvV/TrYcw15M+u2izSQ9l9GbCqeiCl8zrARkyMQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEHmI06VN7x9Tz2VJtcg3Gv5VfpUSL7MQLU0tVYnhUcWAiA1mKToagnZXdXKfozdGSgF6fJWUbgT9krvh/KuUapfRA=="}]},"maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}]}},"readme":"<img src=\"https://travis-ci.org/JayBeavers/node-reflecta.svg?branch=master\">\n\nnode-reflecta is a node.js client for communicating with an Arduino via the [Reflecta](https://github.com/JayBeavers/Reflecta) protocol.\n\n> _Stability: Low_\n\n### Getting Started\nInstall the module with: `npm install reflecta`\n\n```javascript\nvar reflecta = require('reflecta');\n\n// Connect to a board on serial port ttyACM0 which corresponds to 'first USB serial device attached' in Linux, e.g. first Arduino\nvar board = new reflecta.Board(\"/dev/ttyACM0\");\n\nboard.on('ready', function() {\n\n  // Wait for a response from the Arduino to the frame of data I'm going to send\n  board.once('response', function(response) {\n    console.log(response);\n  });\n\n  // Send a frame of data containing '1'.  '1' happens to map to 'QueryInterface' in ReflectaFunctions\n  board.sendFrame([1]);\n});\n```\n\n### Detecting Arduino Boards\n\n```javascript\nvar reflecta = require('reflecta');\nreflecta.detect(function(error, boards, ports) {\n\n  // Choose the first board found\n  var board = boards[0];\n\n  // board is not returned until 'ready' has already fired, no need to wait for board.on('ready')\n  board.once('response', function(response) {\n    console.log(response);\n  });\n\n  board.sendFrame([1]);\n\n});\n```\n\n### Board Interfaces\n\nOn startup Reflecta probes the Arduino to see what libraries are installed using QueryInterface.  If it finds interfaces, it will automatically load a matching set of functions onto the Reflecta object using node's require or an npm install.  A few well known interfaces that are supported are:\n\n__[ardu1](https://github.com/JayBeavers/reflecta_ardu1)__\n\nThe ardu1 interface exposes the Arduino Digital & Analog I/O Functions and Wire and Servo libraries.\n\n__[moto1](https://github.com/JayBeavers/reflecta_moto1)__\n\nThe moto1 interface exposes the SparkFun Monster Moto shield with functions like Drive, Brake, and ReadCurrent.\n\n__[hart1](https://github.com/JayBeavers/reflecta_hart1)__\n\nThe hart1 interface exposes the settings functions for the Reflecta Heartbeat library such as setFrameRate.\n\n__[rbot1](https://github.com/JayBeavers/RocketBot/tree/master/RocketBaseArduino)__\n\nThe rbot1 interface exposes the commands for [RocketBot](https://github.com/JayBeavers/RocketBot) to launch pneumatic straw rockets and control blinky lights such as Animation, Compressor, Valve, and Fire.\n\nAn example of how to use interfaces:\n```javascript\nvar reflecta = require('reflecta');\nreflecta.detect(function(error, boards, ports) {\n\n  // Choose the first board found\n  var board = boards[0];\n\n  board.ardu1.digitalWrite(7, 1); // Set digital pin 7 to on\n  board.moto1.drive(50, 50); // Set left and right wheel powers to 50 out of 255\n  board.rbot1.Fire(); // Fire a straw rocket\n\n});\n```\n\n### Board Methods\n\n```javascript\nboard.sendFrame(buffer0, ..., bufferN);\n```\nSends a frame of data to the Arduino comprised by concatenating the buffers.  Parameters will be auto-converted to a [NodeJS buffer](http://nodejs.org/api/buffer.html) so an array of octets (bytes) or a string is reasonable input.\n\nAuto-generates a sequence number to help in detecting lost packets.\nAuto-calculates a simple 8 bit CRC to help detect data corruption.  Auto-escapes data using SLIP escaping to\nturn a stream of data into deliniated frames.\n\nNote:  Be sure that ready event has fired before calling sendFrame.\n\n### Board Events\n\n```javascript\nboard.on('ready', function() ... );\n```\n\nThe connection has been opened and reflecta is ready to be used to communicate with the Arduino.\n\n```javascript\nboard.on('error', function(error) ... );\n```\n\nAn fatal error was detected in the protocol, such as a buffer overflow or underflow, function id conflict, or error with the communications port.\n\n```javascript\nboard.on('warning', function(warning) ... );\n```\n\nA non-fatal warning was detected in the protocol, anything from out of sequence (dropped frame) to bad CRC or\nunexpected SLIP Escape (corrupted data)..\n\n```javascript\nboard.on('message', function(message) ... );\n```\n\nA string message was received.  Generally used for 'println debugging' from the Arduino.  'message' is a UTF8 string.\n\n```javascript\nboard.on('response', function(response) ... );\n```\n\nA response was received to a function executed on the Arduino by a frame sent from this client.\n\n`response` contains properties\n\n- `sequence` contains the sequence number of the frame this is a response to so you can correlate request/response pairs.\n- `data` contains the byte[] data for the response.\n\n```javascript\nboard.on('frame', function(frame) ... );\n```\n\nA frame of data was received from the Arduino.  This event is only fired for frames that are not recognized as a known FrameType (e.g. Error, Warning, Message, Response, Heartbeat) by the buffer[0] value.\n\n`frame` contains properties\n\n- `sequence` contains the sequence number of this frame.\n- `data` contains the byte[] data for the response.\n\n```javascript\nboard.on('heartbeat', function() ... );\n```\n\nA frame of heartbeat data was received from the Arduino.  Heartbeat is a scheduled delivery of data retrieved from the Arduino, such as the current reading of the digital io or analog io ports.\n\n`heartbeat` contains properties\n\n- `collectingLoops`: number of iterations through loop() while collecting heartbeat data\n- `idleLoops`: number of iterations through loop() while waiting for heartbeat timer to expire\n- `data`: heartbeat byte[]'s\n\n```javascript\nboard.on('close', function() ... );\n```\n\nThe communications port was closed.  A light wrapper over node-serialport's close event.\n\n```javascript\nboard.on('end', function() ... );\n```\n\nThe communications port was ended.  A light wrapper over node-serialport's end event.\n\n```javascript\nboard.on('open', function() ... );\n```\n\nThe communications port is open.  A light wrapper over node-serialport's open event.\n\n\n## Release History\n\n- 0.3.x: Still in early state.  Subject to frequent breaking API changes at this time.\n- 0.3.3: Added reflecta.detect(...), renamed ctor from Reflecta to Board to match firmata/johnny-five\n- 0.3.4: Moved nodejs client to separate repository (node-reflecta) from Arduino source (Reflecta)\n- 0.3.5: Fix breaking change in Arduino Windows drivers that prevented detection of board, Typescript conversion\n- 0.3.6: Remove Typescript, freshen code for new version dependencies\n- 0.3.7: Update dependencies\n\n## Futures\n\nSee [this Trello Board](https://trello.com/b/5ZyBFhPb) for planned work.\n\n## License\nCopyright (c) 2015 Jay Beavers  \nLicensed under the BSD license.\n","maintainers":[{"name":"jaybeavers","email":"jay@hikinghomeschoolers.org"}],"time":{"modified":"2022-06-26T10:38:07.517Z","created":"2012-08-11T01:01:09.487Z","0.2.0":"2012-08-11T01:01:12.374Z","0.3.0":"2012-08-22T00:23:41.137Z","0.3.1":"2012-08-23T03:04:23.213Z","0.3.2":"2012-08-24T17:01:08.279Z","0.3.3":"2012-09-06T04:37:09.179Z","0.3.4":"2012-09-21T23:51:41.669Z","0.3.5":"2013-04-12T00:10:23.230Z","0.3.6":"2015-05-27T21:03:55.149Z","0.3.7":"2015-12-29T18:05:10.384Z"},"author":{"name":"Jay Beavers","email":"jay@hikinghomeschoolers.org","url":"http://jaybeavers.org"},"repository":{"type":"git","url":"git://github.com/jaybeavers/node-reflecta.git"},"homepage":"https://github.com/jaybeavers/node-reflecta","bugs":{"url":"https://github.com/jaybeavers/node-reflecta/issues"},"license":"BSD-2-Clause","readmeFilename":"README.md","users":{"noopkat":true}}