├── .gitignore ├── LICENCE ├── README.md ├── app ├── app.js ├── index.html └── style.css ├── index.js ├── lib ├── btws-adapter-phoenix.js ├── btws-adapter.js └── btws-core.js ├── package-lock.json ├── package.json ├── server.js └── socket_messages.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | /.idea 4 | /dist 5 | /keys 6 | /node_modules 7 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 High-Mobility GmbH 3 | 4 | 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: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bluetooth Websocket API 2 | 3 | The Bluetooth WebSocket API is an abstraction layer on top of the [Web Bluetooth](https://webbluetoothcg.github.io/web-bluetooth) JavaScript API. The Web Bluetooth API allows websites to connect and interact with Bluetooth Low Energy devices. The library does not introduces a new API but extends the JavaScript functions as WebSocket messages. This can be handy when you want to write Bluetooth enabled webapps and already have an implementation on the server. 4 | 5 | As the Bluetooth operations are dictated by the server, the front-end setup is straight forward. The Bluetooth search command, connect and communication are all initiated by the server side. 6 | 7 | There are many different protocols on top of the WebSocket standard. The library has been designed while having this in mind, hence there is a separation between the library core and WebSocket adapter. Today [Phoenix framework](http://phoenixframework.org) WebSocket channels are supported. 8 | 9 | ## Requirements 10 | 11 | - Android6.0+, Chrome OS or OS X. The full list of supported hardware is all the time updated by the Web Bluetooth workgroup 12 | - Chrome v50+ 13 | - HTTPS due to WebBluetooth security requirements 14 | 15 | ## Features/Usage 16 | This library consists of three parts: 17 | 18 | - Core 19 | 20 | Handles the Web Bluetooth API and maps functions to the WebSocket adapter. 21 | 22 | - Adapter 23 | 24 | WebSocket specific implementation, formats and sends the messages back/forth between Core and the server. 25 | 26 | - App 27 | 28 | An example app of usage is included in the repo, this can be used together with the Phoenix server reference app [Bluetooth WebSocket Server](https://github.com/highmobility/bluetooth-websocket-server). 29 | 30 | Below is a simplified chart showing the different Bluetooth messages passed through the library. 31 | ![socket_message](socket_messages.png) 32 | 33 | For more detail of each socket event please see the Wiki page [Wiki - Socket messages specification](https://github.com/highmobility/bluetooth-websocket-api/wiki/Socket-messages-specification). 34 | 35 | ## Installation of reference app 36 | 37 | ### To start your app 38 | Install node_module with `npm install` 39 | 40 | ### To use SSL on localhost with WebBluetoothAPI 41 | 1. Generate key with `openssl genrsa -out localhost.key 2048` 42 | 2. Generate cert with `openssl req -new -x509 -key localhost.key -out localhost.cert -days 3650 -subj /CN=localhost` 43 | 3. Put them in a directory `/keys/` 44 | 4. Start server with `node server.js` 45 | 46 | Now you can visit [`localhost:3000`](https://localhost:3000/app/) with SSL from your browser. 47 | 48 | ### To build js file when you update 49 | 1. Update source file of `app/app/js` 50 | 2. Run build with `npm run build` 51 | 3. The file will be created to `dist/app.js` 52 | 53 | ### To start your HTTPS server on local: 54 | `node server.js` 55 | 56 | Now you can visit [`localhost:3000/app`](https://localhost:3000/app) from your browser. 57 | 58 | Of course you can use your apache server. 59 | 60 | ## Caution 61 | - The value should be encoded with `base64` when you read/write value. 62 | - `Adapter#requestDevice()` method should be fired by click event (due to WebBluetoothAPI specification). 63 | - `characteristicvaluechanged` event is fired by after not only its value changes but also a value change notification/indication (due to WebBluetoothAPI specification). 64 | 65 | ## Licence 66 | 67 | [MIT](LICENCE) 68 | 69 | ## Author 70 | 71 | [HIGH MOBILITY](http://www.high-mobility.com/) 72 | 73 | [Recruit Technologies](http://atl.recruit-tech.co.jp/en/) ([@tkybpp](https://github.com/tkybpp)) 74 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import BTWSPhoenixAdapter from '../lib/btws-adapter-phoenix'; 4 | import * as phoenix from 'phoenix-js'; 5 | 6 | export default class App { 7 | constructor(){ 8 | 9 | // Create socket sample 10 | this.sampleSocket = new phoenix.Socket('wss://localhost:4000/socket'); 11 | this.sampleSocket.connect(); 12 | 13 | // You can also join any other channels: 14 | // this.sampleSocket.chan = this.sampleSocket.channel('hm:api', {}); 15 | // this.sampleSocket.chan.join() 16 | // .receive('ok', resp => { console.log('Joined successfully to hm:api', resp)}) 17 | // .receive('error', resp => { console.log('Unable to join hm:api', resp) }) 18 | // 19 | // this.sampleSocket.chan.on('receive_event_sample', msg => { console.log(msg);}); 20 | // this.sampleSocket.chan.push('send_event_sample', {}); 21 | 22 | // Pass endPoint or Socket Object to Adapter 23 | // You can also use like this 24 | // this.adapter = new BTWSPhoenixAdapter('wss://192.168.233.157:4443/socket'); 25 | this.adapter = new BTWSPhoenixAdapter(this.sampleSocket, 'bws:battery'); 26 | 27 | this.adapter.on('connected', _ => document.querySelector('#state').classList.add('connected')); 28 | this.adapter.on('disconnected', _ => document.querySelector('#state').classList.remove('connected')); 29 | this.adapter.on('user_approval', data => this.showApproval(data)); 30 | this.adapter.on('error', error => alert(error)); 31 | } 32 | 33 | showApproval(data){ 34 | document.querySelector('#approval').innerHTML = `
${data.services}(${data.name})
`; 35 | document.querySelector('#connect').addEventListener('click', _ => this.adapter.requestDevice(data)); 36 | } 37 | 38 | } 39 | 40 | window.app = new App(); 41 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Bluetooth Websocket API 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
Bluetooth Websocket API
15 |
16 |
17 |

You just received request, please confirm. Dou you approval this request?

18 |
19 | 20 |
21 |
22 |
23 |
24 |
25 |

No Web Bluetooth

26 |
27 |
28 | Web Bluetooth isn't currently enabled. Please check that your browser and 29 | device support it and have any necessary development flags set. 30 |
31 |
32 | 33 | 34 | 35 |
36 |

Connected!

37 |
38 |
39 |
40 |
41 | 42 | 43 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /app/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0 auto; 3 | background-color: #333; 4 | max-width: 60%; 5 | font-family: Roboto; 6 | color: white; 7 | } 8 | body.connected #step1 { 9 | display: none; 10 | } 11 | #step1 { 12 | display: inherit; 13 | } 14 | body #step2 { 15 | display: none; 16 | } 17 | body.connected #step2 { 18 | display: inherit; 19 | } 20 | body.connecting #loading { 21 | display: block; 22 | text-align: center; 23 | padding-top: 24px; 24 | } 25 | #title { 26 | font-family: Roboto; 27 | color: rgb(255, 255, 255); 28 | font-size: 24px; 29 | letter-spacing: -.02em; 30 | text-align: center; 31 | width: 100%; 32 | padding: 12px 0; 33 | padding-top: 340px; 34 | } 35 | #loading { 36 | display: none; 37 | } 38 | #batteryLevel { 39 | background-color: #222222; 40 | margin: 12px 0; 41 | padding: 12px; 42 | color: rgb(169, 169, 169); 43 | border-radius: 4px; 44 | } 45 | #batteryLevel::before { 46 | content: 'Battery: '; 47 | } 48 | #connect { 49 | color: white; 50 | background-color: #4CAF50; 51 | width: 100%; 52 | font-weight: bold; 53 | } 54 | 55 | .mdl-card { 56 | width: 300px; 57 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var BTWSAdapter = require('./lib/btws-adapter-phoenix'); 2 | module.exports = BTWSAdapter; -------------------------------------------------------------------------------- /lib/btws-adapter-phoenix.js: -------------------------------------------------------------------------------- 1 | import * as phoenix from 'phoenix-js'; 2 | import BTWSBaseAdapter from '../lib/btws-adapter'; 3 | 4 | export default class BTWSPhoenixAdapter extends BTWSBaseAdapter { 5 | constructor(param, channelName){ 6 | super(); 7 | 8 | if (this.isPhoenixSocket(param)) { 9 | this.socket = param; 10 | } else if (this.isValidEndPoint(param)) { 11 | this.socket = new phoenix.Socket(param); 12 | } else { 13 | throw new Error('Invalid argument for PhoenixAdapter, please pass in an URL or a Phoenix socket instance.'); 14 | } 15 | 16 | this.channel = this.connect(channelName); 17 | this.initSocketEvent(); 18 | } 19 | 20 | connect(channelName){ 21 | this.socket.connect(); 22 | let channel = this.socket.channel(channelName, {}); 23 | 24 | channel.join() 25 | .receive('ok', resp => { this.core.log('Joined ', channelName, resp) } ) 26 | .receive('error', resp => { this.core.logError('Unable to join ', channelName, resp) }) 27 | return channel; 28 | } 29 | 30 | initSocketEvent() { 31 | const event = this.RECEIVE_EVENT; 32 | let channel = this.channel; 33 | 34 | channel.on(event.REQUEST_DEVICE, msg => { 35 | this.core.log(event.REQUEST_DEVICE, msg); 36 | this.core.receiveRequest(msg); 37 | }); 38 | 39 | channel.on(event.CONNECT_DEVICE, msg => { 40 | this.core.log(event.CONNECT_DEVICE, msg); 41 | this.core.connect(msg.device_id); 42 | }); 43 | 44 | channel.on(event.DISCONNECT_DEVICE, msg => { 45 | this.core.log(event.DISCONNECT_DEVICE, msg); 46 | this.core.disconnect(msg.device_id); 47 | }); 48 | 49 | channel.on(event.DISCOVER_SERVICE, msg => { 50 | this.core.log(event.DISCOVER_SERVICE, msg); 51 | this.core.getService(msg.device_id, msg.service_uuid.toLowerCase()); 52 | }); 53 | 54 | channel.on(event.DISCOVER_CHARACTERISTIC, msg => { 55 | this.core.log(event.DISCOVER_CHARACTERISTIC, msg); 56 | this.core.getCharacteristic(msg.device_id, msg.service_uuid.toLowerCase(), msg.characteristic_uuid.toLowerCase()); 57 | }); 58 | 59 | channel.on(event.READ_CHARACTERISTIC_VALUE, msg => { 60 | this.core.log(event.READ_CHARACTERISTIC_VALUE, msg); 61 | this.core.readValue(msg.device_id, msg.service_uuid.toLowerCase(), msg.characteristic_uuid.toLowerCase()); 62 | }); 63 | 64 | channel.on(event.WRITE_CHARACTERISTIC_VALUE, msg => { 65 | this.core.log(event.WRITE_CHARACTERISTIC_VALUE, msg); 66 | this.core.writeValue(msg.device_id, msg.service_uuid.toLowerCase(), msg.characteristic_uuid.toLowerCase(), msg.characteristic_value); 67 | }); 68 | 69 | channel.on(event.START_NOTIFICATIONS, msg => { 70 | this.core.log(event.START_NOTIFICATIONS, msg); 71 | this.core.startNotification(msg.device_id, msg.service_uuid.toLowerCase(), msg.characteristic_uuid.toLowerCase()); 72 | }); 73 | 74 | channel.on(event.STOP_NOTIFICATIONS, msg => { 75 | this.core.log(event.STOP_NOTIFICATIONS, msg); 76 | this.core.stopNotification(msg.device_id, msg.service_uuid.toLowerCase(), msg.characteristic_uuid.toLowerCase()); 77 | }); 78 | 79 | } 80 | 81 | sendDeviceFound(device) { 82 | const adData = this.setAdData(device); 83 | 84 | this.channel.push(this.SEND_EVENT.DEVICE_FOUND, { 85 | name: device.name, 86 | device_id: device.id, 87 | advertised_services: adData.advertised_services, 88 | manufacture_data: adData.manufacture_data, 89 | tx_power: adData.tx_power, 90 | rssi: adData.rssi 91 | }); 92 | } 93 | 94 | sendDeviceConnected(deviceId) { 95 | this.channel.push(this.SEND_EVENT.DEVICE_CONNECTED, { 96 | device_id: deviceId 97 | }); 98 | } 99 | 100 | sendDeviceDisconnected(deviceId) { 101 | this.channel.push(this.SEND_EVENT.DEVICE_DISCONNECTED, { 102 | device_id: deviceId 103 | }); 104 | } 105 | 106 | sendServiceFound(deviceId, serviceUuid) { 107 | this.channel.push(this.SEND_EVENT.SERVICE_FOUND, { 108 | device_id: deviceId, 109 | service_uuid: serviceUuid 110 | }); 111 | } 112 | 113 | sendCharacteristicFound(deviceId, serviceUuid, characteristicUuid) { 114 | this.channel.push(this.SEND_EVENT.CHARACTERISTIC_FOUND, { 115 | device_id: deviceId, 116 | service_uuid: serviceUuid, 117 | characteristic_uuid: characteristicUuid 118 | }); 119 | } 120 | 121 | sendCharacteristicValueRead(deviceId, serviceUuid, characteristicUuid, value) { 122 | this.channel.push(this.SEND_EVENT.CHARACTERISTIC_VALUE_READ, { 123 | device_id: deviceId, 124 | service_uuid: serviceUuid, 125 | characteristic_uuid: characteristicUuid, 126 | characteristic_value: value 127 | }); 128 | } 129 | 130 | sendCharacteristicValueWritten(deviceId, serviceUuid, characteristicUuid, value) { 131 | this.channel.push(this.SEND_EVENT.CHARACTERISTIC_VALUE_WRITTEN, { 132 | device_id: deviceId, 133 | service_uuid: serviceUuid, 134 | characteristic_uuid: characteristicUuid, 135 | characteristic_value: value 136 | }); 137 | } 138 | 139 | sendNotificationsStarted(deviceId, serviceUuid, characteristicUuid) { 140 | this.channel.push(this.SEND_EVENT.NOTIFICATIONS_STARTED, { 141 | device_id: deviceId, 142 | service_uuid: serviceUuid, 143 | characteristic_uuid: characteristicUuid 144 | }); 145 | } 146 | 147 | sendNotificationsStopped(deviceId, serviceUuid, characteristicUuid) { 148 | this.channel.push(this.SEND_EVENT.NOTIFICATIONS_STOPPED, { 149 | device_id: deviceId, 150 | service_uuid: serviceUuid, 151 | characteristic_uuid: characteristicUuid 152 | }); 153 | } 154 | 155 | sendNotificationsReceived(deviceId, serviceUuid, characteristicUuid, value) { 156 | this.channel.push(this.SEND_EVENT.NOTIFICATION_RECEIVED, { 157 | device_id: deviceId, 158 | service_uuid: serviceUuid, 159 | characteristic_uuid: characteristicUuid, 160 | characteristic_value: value 161 | }); 162 | } 163 | 164 | sendError(reason, code, event, payload) { 165 | this.channel.push(this.SEND_EVENT.error, { 166 | error_reason: reason, 167 | error_code: code, 168 | failed_event: event, 169 | event_payload: payload 170 | }); 171 | } 172 | 173 | isPhoenixSocket(obj) { 174 | return obj.constructor.name === 'Socket' && obj.conn !== undefined 175 | } 176 | 177 | } 178 | -------------------------------------------------------------------------------- /lib/btws-adapter.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import BTWSCore from '../lib/btws-core'; 4 | 5 | const RECEIVE_EVENT = { 6 | REQUEST_DEVICE : 'request_device', 7 | CONNECT_DEVICE : 'connect_device', 8 | DISCONNECT_DEVICE : 'disconnect_device', 9 | DISCOVER_SERVICE : 'discover_service', 10 | DISCOVER_CHARACTERISTIC : 'discover_characteristic', 11 | READ_CHARACTERISTIC_VALUE : 'read_characteristic_value', 12 | WRITE_CHARACTERISTIC_VALUE : 'write_characteristic_value', 13 | START_NOTIFICATIONS : 'start_notifications', 14 | STOP_NOTIFICATIONS : 'stop_notifications' 15 | }; 16 | const SEND_EVENT = { 17 | DEVICE_FOUND : 'device_found', 18 | DEVICE_CONNECTED : 'device_connected', 19 | DEVICE_DISCONNECTED : 'device_disconnected', 20 | SERVICE_FOUND : 'service_found', 21 | CHARACTERISTIC_FOUND : 'characteristic_found', 22 | CHARACTERISTIC_VALUE_READ : 'characteristic_value_read', 23 | CHARACTERISTIC_VALUE_WRITTEN : 'characteristic_value_written', 24 | NOTIFICATIONS_STARTED : 'notifications_started', 25 | NOTIFICATIONS_STOPPED : 'notifications_stopped', 26 | NOTIFICATION_RECEIVED : 'notification_received', 27 | ERROR : 'error' 28 | }; 29 | 30 | export default class BTWSBaseAdapter { 31 | 32 | get RECEIVE_EVENT() { 33 | return RECEIVE_EVENT; 34 | } 35 | get SEND_EVENT() { 36 | return SEND_EVENT; 37 | } 38 | 39 | constructor() { 40 | this.core = new BTWSCore(this); 41 | if (this === BTWSBaseAdapter) { 42 | throw new TypeError('Cannot create an instance of the BTWSBaseAdapter, please use any of the drivers implementing this class.'); 43 | } 44 | } 45 | 46 | connect() {} 47 | 48 | initSocketEvent() {} 49 | 50 | sendDeviceFound() {} 51 | 52 | sendDeviceConnected() {} 53 | 54 | sendDeviceDisconnected() {} 55 | 56 | sendServiceFound() {} 57 | 58 | sendCharacteristicFound() {} 59 | 60 | sendCharacteristicValueRead() {} 61 | 62 | sendCharacteristicValueWritten() {} 63 | 64 | sendNotificationsStarted() {} 65 | 66 | sendNotificationsStopped() {} 67 | 68 | sendNotificationsReceived() {} 69 | 70 | requestDevice(options) { 71 | this.core.requestDevice(options); 72 | } 73 | 74 | on(eventName, callback) { 75 | this.core.on(eventName, callback); 76 | } 77 | 78 | isValidEndPoint(str) { 79 | return (typeof(str) == 'string' || str instanceof String ) && str.startsWith('wss://'); 80 | } 81 | 82 | setAdData(device) { 83 | const obj = {}; 84 | obj.advertised_services = (device.adData !== undefined && device.adData.serviceData !== undefined) ? device.adData.serviceData : null; 85 | obj.manufacture_data = (device.adData !== undefined && device.adData.manufactureData !== undefined) ? device.adData.manufactureData : null; 86 | obj.tx_power = (device.adData !== undefined && device.adData.txPower !== undefined) ? device.adData.txPower : null; 87 | obj.rssi = (device.adData !== undefined && device.adData.rssi !== undefined) ? device.adData.rssi : null; 88 | return obj; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /lib/btws-core.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const EventEmitter = require('events').EventEmitter; 4 | const debug = true; 5 | 6 | export default class BTWSCore extends EventEmitter { 7 | constructor(adapter) { 8 | super(); 9 | this.adapter = adapter; 10 | this.devices = {}; 11 | } 12 | 13 | receiveRequest(receiveData) { 14 | this.emit('user_approval', receiveData); 15 | } 16 | 17 | requestDevice(options) { 18 | return navigator.bluetooth.requestDevice(options) 19 | .then(device => { 20 | this.devices[device.id] = device; 21 | this.devices[device.id].addEventListener('gattserverdisconnected', this.onDisconnected.bind(this)); 22 | this.adapter.sendDeviceFound(this.devices[device.id]); 23 | 24 | this.log('Device requested:', this.devices[device.id]); 25 | return this.devices[device.id]; 26 | }) 27 | .catch(error => { 28 | this.handleError(error, '01', 'scan', ''); 29 | }); 30 | } 31 | 32 | connect(deviceId) { 33 | if (!this.devices[deviceId]) { return Promise.reject('[BTWS] Device is not connected.'); } 34 | let device = this.devices[deviceId]; 35 | return device.gatt.connect() 36 | .then(server => { 37 | device.server = server; 38 | device.services = {}; 39 | this.adapter.sendDeviceConnected(deviceId); 40 | 41 | this.emit('connected'); 42 | this.log('Device Server:', device.server); 43 | }) 44 | .catch(error => { 45 | this.handleError(error, '02', 'connect', {device_id: deviceId}); 46 | }); 47 | } 48 | 49 | disconnect(deviceId) { 50 | if (!this.devices[deviceId]) { return Promise.reject('[BTWS] Device is not connected.'); } 51 | if (!this.devices[deviceId].gatt.connected) { return Promise.reject('[BTWS] Device is already disconnected.'); } 52 | let device = this.devices[deviceId]; 53 | 54 | this.removeAllActiveNotifications(deviceId); 55 | device.gatt.disconnect(); 56 | this.adapter.sendDeviceDisconnected(deviceId); 57 | 58 | this.emit('disconnected'); 59 | this.log('Device Connected:', device.gatt.connected); 60 | } 61 | 62 | onDisconnected(event) { 63 | this.removeAllActiveNotifications(event.target.id); 64 | this.adapter.sendDeviceDisconnected(event.target.id); 65 | this.devices[event.target.id].gatt.disconnect(); 66 | 67 | this.emit('disconnected'); 68 | this.log('Device Disconnected:', this.devices[event.target.id]); 69 | } 70 | 71 | getService(deviceId, serviceUuid) { 72 | let device = this.devices[deviceId]; 73 | if (device.services[serviceUuid] !== undefined) { return device.services[serviceUuid]; } 74 | 75 | return device.server.getPrimaryService(serviceUuid) 76 | .then(service => { 77 | device.services[serviceUuid] = service; 78 | device.services[serviceUuid].characteristics = {}; 79 | this.adapter.sendServiceFound(deviceId, serviceUuid); 80 | 81 | this.log('Device Service:', device.services[serviceUuid]); 82 | }) 83 | .catch(error => { 84 | this.handleError(error, '04', 'discover_service', {device_id: deviceId, service_uuid: serviceUuid}); 85 | }) 86 | } 87 | 88 | getServices() { 89 | // TODO 90 | } 91 | 92 | getCharacteristic(deviceId, serviceUuid, characteristicUuid) { 93 | let service = this.devices[deviceId].services[serviceUuid]; 94 | 95 | if (service.characteristics[characteristicUuid] !== undefined) { return service.characteristics[characteristicUuid]; } 96 | return service.getCharacteristic(characteristicUuid) 97 | .then(characteristic => { 98 | service.characteristics[characteristicUuid] = characteristic; 99 | this.adapter.sendCharacteristicFound(deviceId, serviceUuid, characteristicUuid); 100 | this.log('Devuce Characteristic:', service.characteristics[characteristicUuid]); 101 | }) 102 | .catch(error => { 103 | this.handleError(error, '05', 'discover_characteristic', {device_id: deviceId, service_uuid: serviceUuid, characteristics_uuid: characteristicUuid}); 104 | }) 105 | } 106 | 107 | getCharacteristics(){ 108 | //TODO 109 | } 110 | 111 | readValue(deviceId, serviceUuid, characteristicUuid) { 112 | let characteristic = this.devices[deviceId].services[serviceUuid].characteristics[characteristicUuid]; 113 | 114 | return characteristic.readValue() 115 | .then(value => { 116 | value = value.buffer ? value : new DataView(value); 117 | if (debug) { 118 | console.log('[BTWS] Read value (TypedArray):', (this.binaryToTypedArray(value))); 119 | console.log('[BTWS] Read value (base64):', (this.bufferToBase64(this.binaryToTypedArray(value)))); 120 | } 121 | 122 | this.adapter.sendCharacteristicValueRead(deviceId, serviceUuid, characteristicUuid, this.bufferToBase64(this.binaryToTypedArray(value))); 123 | }) 124 | .catch(error => { 125 | this.handleError(error, '10', 'read_characteristic', {device_id: deviceId, service_uuid: serviceUuid, characteristics_uuid: characteristicUuid}); 126 | }) 127 | } 128 | 129 | writeValue(deviceId, serviceUuid, characteristicUuid, value) { 130 | let data = this.base64ToTypedArray(value); 131 | let characteristic = this.devices[deviceId].services[serviceUuid].characteristics[characteristicUuid]; 132 | 133 | return characteristic.writeValue(data) 134 | .then(_ => { 135 | this.adapter.sendCharacteristicValueWritten(deviceId, serviceUuid, characteristicUuid, value); 136 | }) 137 | .catch(error => { 138 | this.handleError(error, '11', 'write_characteristic', {device_id: deviceId, service_uuid: serviceUuid, characteristics_uuid: characteristicUuid, characteristic_value: value}); 139 | }); 140 | } 141 | 142 | startNotification(deviceId, serviceUuid, characteristicUuid) { 143 | let characteristic = this.devices[deviceId].services[serviceUuid].characteristics[characteristicUuid]; 144 | 145 | return characteristic.startNotifications() 146 | .then(_ => { 147 | characteristic.addEventListener('characteristicvaluechanged', this.handleNotifications.bind(this)); 148 | characteristic.notification = true; 149 | this.adapter.sendNotificationsStarted(deviceId, serviceUuid, characteristicUuid); 150 | }) 151 | .catch(error => { 152 | this.handleError(error, '08', 'start_notification', {device_id: deviceId, service_uuid: serviceUuid, characteristics_uuid: characteristicUuid}); 153 | }); 154 | } 155 | 156 | stopNotification(deviceId, serviceUuid, characteristicUuid) { 157 | let characteristic = this.devices[deviceId].services[serviceUuid].characteristics[characteristicUuid]; 158 | 159 | return characteristic.stopNotifications() 160 | .then(_ => { 161 | characteristic.removeEventListener('characteristicvaluechanged', this.handleNotifications.bind(this)); 162 | characteristic.notification = false; 163 | 164 | this.adapter.sendNotificationsStopped(deviceId, serviceUuid, characteristicUuid); 165 | }) 166 | .catch(error => { 167 | this.handleError(error, '09', 'stop_notification', {device_id: deviceId, service_uuid: serviceUuid, characteristics_uuid: characteristicUuid}); 168 | }); 169 | } 170 | 171 | handleNotifications(event) { 172 | let characteristic = event.target; 173 | const characteristicUuid = characteristic.uuid; 174 | const result = this.getDeviceAndServiceUuidFromCharacteristicUuid(characteristicUuid); 175 | 176 | let value = characteristic.value; 177 | value = value.buffer ? value : new DataView(value); 178 | 179 | this.adapter.sendNotificationsReceived(result.device_id, result.service_uuid, characteristicUuid, (this.bufferToBase64(this.binaryToTypedArray(value)))); 180 | if (debug) console.log('[BTWS] Notification, value changed:', (this.bufferToBase64(this.binaryToTypedArray(value)))); 181 | } 182 | 183 | // 184 | // BLE Utils 185 | // 186 | 187 | handleError(error, errorCode, event, payload) { 188 | this.adapter.sendError(error.toString(), errorCode, event, payload); 189 | this.emit('error', error); 190 | this.logError(error); 191 | } 192 | 193 | getCharacteristicNotificationsIsActive(deviceId) { 194 | let device = this.devices[deviceId]; 195 | let characteristics = []; 196 | Object.keys(device.services).forEach(serviceUuid => { 197 | let service = device.services[serviceUuid]; 198 | Object.keys(service.characteristics).forEach(characteristicUuid => { 199 | if (service.characteristics[characteristicUuid].notification) { 200 | characteristics.push({ 201 | service_uuid: serviceUuid, 202 | characteristic_uuid: characteristicUuid 203 | }); 204 | } 205 | }); 206 | }); 207 | return characteristics; 208 | } 209 | 210 | getDeviceAndServiceUuidFromCharacteristicUuid(characteristicUuid) { 211 | let result = {}; 212 | const serviceUuid = this.getServiceUuidFromCharacteristicUuid(characteristicUuid); 213 | Object.keys(this.devices).forEach(deviceId => { 214 | if (serviceUuid in this.devices[deviceId].services) result = { 215 | 'device_id': deviceId, 216 | 'service_uuid': serviceUuid 217 | }; 218 | }); 219 | return result; 220 | } 221 | 222 | getServiceUuidFromCharacteristicUuid(characteristicUuid) { 223 | let result = null; 224 | Object.keys(this.devices).forEach(deviceId => { 225 | let services = this.devices[deviceId].services; 226 | Object.keys(services).forEach(serviceId => { 227 | if (characteristicUuid in services[serviceId].characteristics) result = serviceId; 228 | }); 229 | }); 230 | return result; 231 | } 232 | 233 | removeAllActiveNotifications(deviceId){ 234 | let device = this.devices[deviceId]; 235 | let notificationStartedCharacteristics = this.getCharacteristicNotificationsIsActive(deviceId); 236 | if (notificationStartedCharacteristics.length > 0) { 237 | notificationStartedCharacteristics.map(target => { 238 | let characteristic = device.services[target.service_uuid].characteristics[target.characteristic_uuid]; 239 | characteristic.stopNotifications() 240 | .then(_ => { 241 | characteristic.removeEventListener('characteristicvaluechanged', this.handleNotifications); 242 | }) 243 | .catch(error => { 244 | this.handleError(error, '09', 'stop_notification', {device_id: deviceId, service_uuid: target.service_uuid, characteristics_uuid: target.characteristic_uuid}); 245 | }); 246 | }) 247 | } 248 | } 249 | 250 | // 251 | // Log Utils 252 | // 253 | 254 | log(args) { 255 | if (debug) { 256 | console.log('[BTWS]', args); 257 | } 258 | } 259 | 260 | logError(error, args) { 261 | if (debug) { 262 | console.log('[BTWS][ERROR]', error, args); 263 | } 264 | } 265 | 266 | // 267 | // Data Conversion Utils 268 | // 269 | 270 | binaryToTypedArray(value){ 271 | let array = []; 272 | for (let i = 0; i < value.byteLength; i++) { 273 | array.push('0x' + ('00' + value.getUint8(i).toString(16)).slice(-2)); 274 | } 275 | 276 | return new Uint8Array(array); 277 | } 278 | 279 | bufferToBase64(buf) { 280 | let binstr = Array.prototype.map.call(buf, ch => { 281 | return String.fromCharCode(ch); 282 | }).join(''); 283 | 284 | return btoa(binstr); 285 | } 286 | 287 | unicodeStringToTypedArray(s) { 288 | const escstr = encodeURIComponent(s); 289 | 290 | const binstr = escstr.replace(/%([0-9A-F]{2})/g, (match, p1) => { 291 | return String.fromCharCode('0x' + p1); 292 | }); 293 | 294 | const ua = new Uint8Array(binstr.length); 295 | Array.prototype.forEach.call(binstr, (ch, i) => { 296 | ua[i] = ch.charCodeAt(0); 297 | }); 298 | 299 | return ua; 300 | } 301 | 302 | base64ToTypedArray(b64encoded) { 303 | return new Uint8Array(atob(b64encoded).split('').map(c => c.charCodeAt(0))); 304 | } 305 | 306 | } 307 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bluetooth-websocket-api", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "Base64": { 8 | "version": "0.2.1", 9 | "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", 10 | "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", 11 | "dev": true 12 | }, 13 | "JSONStream": { 14 | "version": "1.3.1", 15 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", 16 | "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", 17 | "dev": true, 18 | "requires": { 19 | "jsonparse": "1.3.1", 20 | "through": "2.3.8" 21 | } 22 | }, 23 | "acorn": { 24 | "version": "4.0.13", 25 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 26 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 27 | "dev": true 28 | }, 29 | "align-text": { 30 | "version": "0.1.4", 31 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 32 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 33 | "dev": true, 34 | "requires": { 35 | "kind-of": "3.2.2", 36 | "longest": "1.0.1", 37 | "repeat-string": "1.6.1" 38 | } 39 | }, 40 | "alter": { 41 | "version": "0.2.0", 42 | "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", 43 | "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", 44 | "dev": true, 45 | "requires": { 46 | "stable": "0.1.6" 47 | } 48 | }, 49 | "amdefine": { 50 | "version": "1.0.1", 51 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 52 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 53 | "dev": true 54 | }, 55 | "ansi-regex": { 56 | "version": "2.1.1", 57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 58 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 59 | "dev": true 60 | }, 61 | "ansi-styles": { 62 | "version": "2.2.1", 63 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 64 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 65 | "dev": true 66 | }, 67 | "anymatch": { 68 | "version": "1.3.2", 69 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", 70 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", 71 | "dev": true, 72 | "requires": { 73 | "micromatch": "2.3.11", 74 | "normalize-path": "2.1.1" 75 | } 76 | }, 77 | "arr-diff": { 78 | "version": "2.0.0", 79 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 80 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 81 | "dev": true, 82 | "requires": { 83 | "arr-flatten": "1.1.0" 84 | } 85 | }, 86 | "arr-flatten": { 87 | "version": "1.1.0", 88 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 89 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 90 | "dev": true 91 | }, 92 | "array-filter": { 93 | "version": "0.0.1", 94 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 95 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 96 | "dev": true 97 | }, 98 | "array-map": { 99 | "version": "0.0.0", 100 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 101 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 102 | "dev": true 103 | }, 104 | "array-reduce": { 105 | "version": "0.0.0", 106 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 107 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 108 | "dev": true 109 | }, 110 | "array-unique": { 111 | "version": "0.2.1", 112 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 113 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 114 | "dev": true 115 | }, 116 | "asn1.js": { 117 | "version": "4.9.2", 118 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", 119 | "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", 120 | "dev": true, 121 | "requires": { 122 | "bn.js": "4.11.8", 123 | "inherits": "2.0.3", 124 | "minimalistic-assert": "1.0.0" 125 | } 126 | }, 127 | "assert": { 128 | "version": "1.3.0", 129 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", 130 | "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", 131 | "dev": true, 132 | "requires": { 133 | "util": "0.10.3" 134 | } 135 | }, 136 | "ast-traverse": { 137 | "version": "0.1.1", 138 | "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", 139 | "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", 140 | "dev": true 141 | }, 142 | "ast-types": { 143 | "version": "0.9.6", 144 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", 145 | "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", 146 | "dev": true 147 | }, 148 | "astw": { 149 | "version": "2.2.0", 150 | "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", 151 | "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", 152 | "dev": true, 153 | "requires": { 154 | "acorn": "4.0.13" 155 | } 156 | }, 157 | "async-each": { 158 | "version": "1.0.1", 159 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 160 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", 161 | "dev": true 162 | }, 163 | "babel-core": { 164 | "version": "5.8.38", 165 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", 166 | "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", 167 | "dev": true, 168 | "requires": { 169 | "babel-plugin-constant-folding": "1.0.1", 170 | "babel-plugin-dead-code-elimination": "1.0.2", 171 | "babel-plugin-eval": "1.0.1", 172 | "babel-plugin-inline-environment-variables": "1.0.1", 173 | "babel-plugin-jscript": "1.0.4", 174 | "babel-plugin-member-expression-literals": "1.0.1", 175 | "babel-plugin-property-literals": "1.0.1", 176 | "babel-plugin-proto-to-assign": "1.0.4", 177 | "babel-plugin-react-constant-elements": "1.0.3", 178 | "babel-plugin-react-display-name": "1.0.3", 179 | "babel-plugin-remove-console": "1.0.1", 180 | "babel-plugin-remove-debugger": "1.0.1", 181 | "babel-plugin-runtime": "1.0.7", 182 | "babel-plugin-undeclared-variables-check": "1.0.2", 183 | "babel-plugin-undefined-to-void": "1.1.6", 184 | "babylon": "5.8.38", 185 | "bluebird": "2.11.0", 186 | "chalk": "1.1.3", 187 | "convert-source-map": "1.5.0", 188 | "core-js": "1.2.7", 189 | "debug": "2.6.9", 190 | "detect-indent": "3.0.1", 191 | "esutils": "2.0.2", 192 | "fs-readdir-recursive": "0.1.2", 193 | "globals": "6.4.1", 194 | "home-or-tmp": "1.0.0", 195 | "is-integer": "1.0.7", 196 | "js-tokens": "1.0.1", 197 | "json5": "0.4.0", 198 | "lodash": "3.10.1", 199 | "minimatch": "2.0.10", 200 | "output-file-sync": "1.1.2", 201 | "path-exists": "1.0.0", 202 | "path-is-absolute": "1.0.1", 203 | "private": "0.1.8", 204 | "regenerator": "0.8.40", 205 | "regexpu": "1.3.0", 206 | "repeating": "1.1.3", 207 | "resolve": "1.5.0", 208 | "shebang-regex": "1.0.0", 209 | "slash": "1.0.0", 210 | "source-map": "0.5.7", 211 | "source-map-support": "0.2.10", 212 | "to-fast-properties": "1.0.3", 213 | "trim-right": "1.0.1", 214 | "try-resolve": "1.0.1" 215 | } 216 | }, 217 | "babel-plugin-constant-folding": { 218 | "version": "1.0.1", 219 | "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", 220 | "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", 221 | "dev": true 222 | }, 223 | "babel-plugin-dead-code-elimination": { 224 | "version": "1.0.2", 225 | "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", 226 | "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", 227 | "dev": true 228 | }, 229 | "babel-plugin-eval": { 230 | "version": "1.0.1", 231 | "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", 232 | "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", 233 | "dev": true 234 | }, 235 | "babel-plugin-inline-environment-variables": { 236 | "version": "1.0.1", 237 | "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", 238 | "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", 239 | "dev": true 240 | }, 241 | "babel-plugin-jscript": { 242 | "version": "1.0.4", 243 | "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", 244 | "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", 245 | "dev": true 246 | }, 247 | "babel-plugin-member-expression-literals": { 248 | "version": "1.0.1", 249 | "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", 250 | "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", 251 | "dev": true 252 | }, 253 | "babel-plugin-property-literals": { 254 | "version": "1.0.1", 255 | "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", 256 | "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", 257 | "dev": true 258 | }, 259 | "babel-plugin-proto-to-assign": { 260 | "version": "1.0.4", 261 | "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", 262 | "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", 263 | "dev": true, 264 | "requires": { 265 | "lodash": "3.10.1" 266 | } 267 | }, 268 | "babel-plugin-react-constant-elements": { 269 | "version": "1.0.3", 270 | "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", 271 | "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", 272 | "dev": true 273 | }, 274 | "babel-plugin-react-display-name": { 275 | "version": "1.0.3", 276 | "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", 277 | "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", 278 | "dev": true 279 | }, 280 | "babel-plugin-remove-console": { 281 | "version": "1.0.1", 282 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", 283 | "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", 284 | "dev": true 285 | }, 286 | "babel-plugin-remove-debugger": { 287 | "version": "1.0.1", 288 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", 289 | "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", 290 | "dev": true 291 | }, 292 | "babel-plugin-runtime": { 293 | "version": "1.0.7", 294 | "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", 295 | "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", 296 | "dev": true 297 | }, 298 | "babel-plugin-undeclared-variables-check": { 299 | "version": "1.0.2", 300 | "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", 301 | "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", 302 | "dev": true, 303 | "requires": { 304 | "leven": "1.0.2" 305 | } 306 | }, 307 | "babel-plugin-undefined-to-void": { 308 | "version": "1.1.6", 309 | "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", 310 | "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", 311 | "dev": true 312 | }, 313 | "babelify": { 314 | "version": "6.4.0", 315 | "resolved": "https://registry.npmjs.org/babelify/-/babelify-6.4.0.tgz", 316 | "integrity": "sha1-yvQ4iLpzG4drVWe2Q+7MZhR2k6U=", 317 | "dev": true, 318 | "requires": { 319 | "babel-core": "5.8.38", 320 | "object-assign": "4.1.1" 321 | } 322 | }, 323 | "babylon": { 324 | "version": "5.8.38", 325 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", 326 | "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", 327 | "dev": true 328 | }, 329 | "balanced-match": { 330 | "version": "1.0.0", 331 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 332 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 333 | "dev": true 334 | }, 335 | "base64-js": { 336 | "version": "0.0.8", 337 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", 338 | "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", 339 | "dev": true 340 | }, 341 | "basic-auth": { 342 | "version": "2.0.0", 343 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", 344 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", 345 | "dev": true, 346 | "requires": { 347 | "safe-buffer": "5.1.1" 348 | } 349 | }, 350 | "binary-extensions": { 351 | "version": "1.10.0", 352 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", 353 | "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", 354 | "dev": true 355 | }, 356 | "bluebird": { 357 | "version": "2.11.0", 358 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", 359 | "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", 360 | "dev": true 361 | }, 362 | "bn.js": { 363 | "version": "4.11.8", 364 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 365 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 366 | "dev": true 367 | }, 368 | "brace-expansion": { 369 | "version": "1.1.8", 370 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 371 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 372 | "dev": true, 373 | "requires": { 374 | "balanced-match": "1.0.0", 375 | "concat-map": "0.0.1" 376 | } 377 | }, 378 | "braces": { 379 | "version": "1.8.5", 380 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 381 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 382 | "dev": true, 383 | "requires": { 384 | "expand-range": "1.8.2", 385 | "preserve": "0.2.0", 386 | "repeat-element": "1.1.2" 387 | } 388 | }, 389 | "breakable": { 390 | "version": "1.0.0", 391 | "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", 392 | "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", 393 | "dev": true 394 | }, 395 | "brorand": { 396 | "version": "1.1.0", 397 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 398 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 399 | "dev": true 400 | }, 401 | "browser-pack": { 402 | "version": "5.0.1", 403 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", 404 | "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", 405 | "dev": true, 406 | "requires": { 407 | "JSONStream": "1.3.1", 408 | "combine-source-map": "0.6.1", 409 | "defined": "1.0.0", 410 | "through2": "1.1.1", 411 | "umd": "3.0.1" 412 | } 413 | }, 414 | "browser-resolve": { 415 | "version": "1.11.2", 416 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 417 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 418 | "dev": true, 419 | "requires": { 420 | "resolve": "1.1.7" 421 | }, 422 | "dependencies": { 423 | "resolve": { 424 | "version": "1.1.7", 425 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 426 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 427 | "dev": true 428 | } 429 | } 430 | }, 431 | "browserify": { 432 | "version": "10.2.6", 433 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-10.2.6.tgz", 434 | "integrity": "sha1-3L/veU9Uj1+EmCFIFPaXpcUMCJY=", 435 | "dev": true, 436 | "requires": { 437 | "JSONStream": "1.3.1", 438 | "assert": "1.3.0", 439 | "browser-pack": "5.0.1", 440 | "browser-resolve": "1.11.2", 441 | "browserify-zlib": "0.1.4", 442 | "buffer": "3.6.0", 443 | "builtins": "0.0.7", 444 | "commondir": "0.0.1", 445 | "concat-stream": "1.4.10", 446 | "console-browserify": "1.1.0", 447 | "constants-browserify": "0.0.1", 448 | "crypto-browserify": "3.12.0", 449 | "defined": "1.0.0", 450 | "deps-sort": "1.3.9", 451 | "domain-browser": "1.1.7", 452 | "duplexer2": "0.0.2", 453 | "events": "1.0.2", 454 | "glob": "4.5.3", 455 | "has": "1.0.1", 456 | "htmlescape": "1.1.1", 457 | "http-browserify": "1.7.0", 458 | "https-browserify": "0.0.1", 459 | "inherits": "2.0.3", 460 | "insert-module-globals": "6.6.3", 461 | "isarray": "0.0.1", 462 | "labeled-stream-splicer": "1.0.2", 463 | "module-deps": "3.9.1", 464 | "os-browserify": "0.1.2", 465 | "parents": "1.0.1", 466 | "path-browserify": "0.0.0", 467 | "process": "0.11.10", 468 | "punycode": "1.4.1", 469 | "querystring-es3": "0.2.1", 470 | "read-only-stream": "1.1.1", 471 | "readable-stream": "1.1.14", 472 | "resolve": "1.5.0", 473 | "shasum": "1.0.2", 474 | "shell-quote": "0.0.1", 475 | "stream-browserify": "1.0.0", 476 | "string_decoder": "0.10.31", 477 | "subarg": "1.0.0", 478 | "syntax-error": "1.3.0", 479 | "through2": "1.1.1", 480 | "timers-browserify": "1.4.2", 481 | "tty-browserify": "0.0.0", 482 | "url": "0.10.3", 483 | "util": "0.10.3", 484 | "vm-browserify": "0.0.4", 485 | "xtend": "4.0.1" 486 | }, 487 | "dependencies": { 488 | "glob": { 489 | "version": "4.5.3", 490 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", 491 | "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", 492 | "dev": true, 493 | "requires": { 494 | "inflight": "1.0.6", 495 | "inherits": "2.0.3", 496 | "minimatch": "2.0.10", 497 | "once": "1.4.0" 498 | } 499 | } 500 | } 501 | }, 502 | "browserify-aes": { 503 | "version": "1.1.1", 504 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", 505 | "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", 506 | "dev": true, 507 | "requires": { 508 | "buffer-xor": "1.0.3", 509 | "cipher-base": "1.0.4", 510 | "create-hash": "1.1.3", 511 | "evp_bytestokey": "1.0.3", 512 | "inherits": "2.0.3", 513 | "safe-buffer": "5.1.1" 514 | } 515 | }, 516 | "browserify-cipher": { 517 | "version": "1.0.0", 518 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", 519 | "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", 520 | "dev": true, 521 | "requires": { 522 | "browserify-aes": "1.1.1", 523 | "browserify-des": "1.0.0", 524 | "evp_bytestokey": "1.0.3" 525 | } 526 | }, 527 | "browserify-des": { 528 | "version": "1.0.0", 529 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", 530 | "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", 531 | "dev": true, 532 | "requires": { 533 | "cipher-base": "1.0.4", 534 | "des.js": "1.0.0", 535 | "inherits": "2.0.3" 536 | } 537 | }, 538 | "browserify-rsa": { 539 | "version": "4.0.1", 540 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 541 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 542 | "dev": true, 543 | "requires": { 544 | "bn.js": "4.11.8", 545 | "randombytes": "2.0.5" 546 | } 547 | }, 548 | "browserify-sign": { 549 | "version": "4.0.4", 550 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 551 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 552 | "dev": true, 553 | "requires": { 554 | "bn.js": "4.11.8", 555 | "browserify-rsa": "4.0.1", 556 | "create-hash": "1.1.3", 557 | "create-hmac": "1.1.6", 558 | "elliptic": "6.4.0", 559 | "inherits": "2.0.3", 560 | "parse-asn1": "5.1.0" 561 | } 562 | }, 563 | "browserify-zlib": { 564 | "version": "0.1.4", 565 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 566 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 567 | "dev": true, 568 | "requires": { 569 | "pako": "0.2.9" 570 | } 571 | }, 572 | "buffer": { 573 | "version": "3.6.0", 574 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", 575 | "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", 576 | "dev": true, 577 | "requires": { 578 | "base64-js": "0.0.8", 579 | "ieee754": "1.1.8", 580 | "isarray": "1.0.0" 581 | }, 582 | "dependencies": { 583 | "isarray": { 584 | "version": "1.0.0", 585 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 586 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 587 | "dev": true 588 | } 589 | } 590 | }, 591 | "buffer-xor": { 592 | "version": "1.0.3", 593 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 594 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 595 | "dev": true 596 | }, 597 | "builtin-status-codes": { 598 | "version": "3.0.0", 599 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 600 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 601 | "dev": true 602 | }, 603 | "builtins": { 604 | "version": "0.0.7", 605 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", 606 | "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=", 607 | "dev": true 608 | }, 609 | "cached-path-relative": { 610 | "version": "1.0.1", 611 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", 612 | "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", 613 | "dev": true 614 | }, 615 | "camelcase": { 616 | "version": "1.2.1", 617 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 618 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 619 | "dev": true 620 | }, 621 | "center-align": { 622 | "version": "0.1.3", 623 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 624 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 625 | "dev": true, 626 | "requires": { 627 | "align-text": "0.1.4", 628 | "lazy-cache": "1.0.4" 629 | } 630 | }, 631 | "chalk": { 632 | "version": "1.1.3", 633 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 634 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 635 | "dev": true, 636 | "requires": { 637 | "ansi-styles": "2.2.1", 638 | "escape-string-regexp": "1.0.5", 639 | "has-ansi": "2.0.0", 640 | "strip-ansi": "3.0.1", 641 | "supports-color": "2.0.0" 642 | } 643 | }, 644 | "chokidar": { 645 | "version": "1.7.0", 646 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", 647 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", 648 | "dev": true, 649 | "requires": { 650 | "anymatch": "1.3.2", 651 | "async-each": "1.0.1", 652 | "fsevents": "1.1.2", 653 | "glob-parent": "2.0.0", 654 | "inherits": "2.0.3", 655 | "is-binary-path": "1.0.1", 656 | "is-glob": "2.0.1", 657 | "path-is-absolute": "1.0.1", 658 | "readdirp": "2.1.0" 659 | } 660 | }, 661 | "cipher-base": { 662 | "version": "1.0.4", 663 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 664 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 665 | "dev": true, 666 | "requires": { 667 | "inherits": "2.0.3", 668 | "safe-buffer": "5.1.1" 669 | } 670 | }, 671 | "cliui": { 672 | "version": "2.1.0", 673 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 674 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 675 | "dev": true, 676 | "requires": { 677 | "center-align": "0.1.3", 678 | "right-align": "0.1.3", 679 | "wordwrap": "0.0.2" 680 | } 681 | }, 682 | "combine-source-map": { 683 | "version": "0.6.1", 684 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", 685 | "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", 686 | "dev": true, 687 | "requires": { 688 | "convert-source-map": "1.1.3", 689 | "inline-source-map": "0.5.0", 690 | "lodash.memoize": "3.0.4", 691 | "source-map": "0.4.4" 692 | }, 693 | "dependencies": { 694 | "convert-source-map": { 695 | "version": "1.1.3", 696 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 697 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 698 | "dev": true 699 | }, 700 | "source-map": { 701 | "version": "0.4.4", 702 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 703 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 704 | "dev": true, 705 | "requires": { 706 | "amdefine": "1.0.1" 707 | } 708 | } 709 | } 710 | }, 711 | "commander": { 712 | "version": "2.11.0", 713 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 714 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 715 | "dev": true 716 | }, 717 | "commondir": { 718 | "version": "0.0.1", 719 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", 720 | "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=", 721 | "dev": true 722 | }, 723 | "commoner": { 724 | "version": "0.10.8", 725 | "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", 726 | "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", 727 | "dev": true, 728 | "requires": { 729 | "commander": "2.11.0", 730 | "detective": "4.5.0", 731 | "glob": "5.0.15", 732 | "graceful-fs": "4.1.11", 733 | "iconv-lite": "0.4.19", 734 | "mkdirp": "0.5.1", 735 | "private": "0.1.8", 736 | "q": "1.5.1", 737 | "recast": "0.11.23" 738 | }, 739 | "dependencies": { 740 | "esprima": { 741 | "version": "3.1.3", 742 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 743 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 744 | "dev": true 745 | }, 746 | "recast": { 747 | "version": "0.11.23", 748 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", 749 | "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", 750 | "dev": true, 751 | "requires": { 752 | "ast-types": "0.9.6", 753 | "esprima": "3.1.3", 754 | "private": "0.1.8", 755 | "source-map": "0.5.7" 756 | } 757 | } 758 | } 759 | }, 760 | "concat-map": { 761 | "version": "0.0.1", 762 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 763 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 764 | "dev": true 765 | }, 766 | "concat-stream": { 767 | "version": "1.4.10", 768 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", 769 | "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", 770 | "dev": true, 771 | "requires": { 772 | "inherits": "2.0.3", 773 | "readable-stream": "1.1.14", 774 | "typedarray": "0.0.6" 775 | } 776 | }, 777 | "connect": { 778 | "version": "3.6.5", 779 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", 780 | "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", 781 | "dev": true, 782 | "requires": { 783 | "debug": "2.6.9", 784 | "finalhandler": "1.0.6", 785 | "parseurl": "1.3.2", 786 | "utils-merge": "1.0.1" 787 | } 788 | }, 789 | "console-browserify": { 790 | "version": "1.1.0", 791 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 792 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 793 | "dev": true, 794 | "requires": { 795 | "date-now": "0.1.4" 796 | } 797 | }, 798 | "constants-browserify": { 799 | "version": "0.0.1", 800 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", 801 | "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", 802 | "dev": true 803 | }, 804 | "convert-source-map": { 805 | "version": "1.5.0", 806 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 807 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", 808 | "dev": true 809 | }, 810 | "core-js": { 811 | "version": "1.2.7", 812 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 813 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 814 | "dev": true 815 | }, 816 | "core-util-is": { 817 | "version": "1.0.2", 818 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 819 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 820 | "dev": true 821 | }, 822 | "create-ecdh": { 823 | "version": "4.0.0", 824 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", 825 | "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", 826 | "dev": true, 827 | "requires": { 828 | "bn.js": "4.11.8", 829 | "elliptic": "6.4.0" 830 | } 831 | }, 832 | "create-hash": { 833 | "version": "1.1.3", 834 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", 835 | "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", 836 | "dev": true, 837 | "requires": { 838 | "cipher-base": "1.0.4", 839 | "inherits": "2.0.3", 840 | "ripemd160": "2.0.1", 841 | "sha.js": "2.4.9" 842 | } 843 | }, 844 | "create-hmac": { 845 | "version": "1.1.6", 846 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", 847 | "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", 848 | "dev": true, 849 | "requires": { 850 | "cipher-base": "1.0.4", 851 | "create-hash": "1.1.3", 852 | "inherits": "2.0.3", 853 | "ripemd160": "2.0.1", 854 | "safe-buffer": "5.1.1", 855 | "sha.js": "2.4.9" 856 | } 857 | }, 858 | "crypto-browserify": { 859 | "version": "3.12.0", 860 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 861 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 862 | "dev": true, 863 | "requires": { 864 | "browserify-cipher": "1.0.0", 865 | "browserify-sign": "4.0.4", 866 | "create-ecdh": "4.0.0", 867 | "create-hash": "1.1.3", 868 | "create-hmac": "1.1.6", 869 | "diffie-hellman": "5.0.2", 870 | "inherits": "2.0.3", 871 | "pbkdf2": "3.0.14", 872 | "public-encrypt": "4.0.0", 873 | "randombytes": "2.0.5", 874 | "randomfill": "1.0.3" 875 | } 876 | }, 877 | "date-now": { 878 | "version": "0.1.4", 879 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 880 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 881 | "dev": true 882 | }, 883 | "debug": { 884 | "version": "2.6.9", 885 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 886 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 887 | "dev": true, 888 | "requires": { 889 | "ms": "2.0.0" 890 | } 891 | }, 892 | "decamelize": { 893 | "version": "1.2.0", 894 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 895 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 896 | "dev": true 897 | }, 898 | "defined": { 899 | "version": "1.0.0", 900 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 901 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 902 | "dev": true 903 | }, 904 | "defs": { 905 | "version": "1.1.1", 906 | "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", 907 | "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", 908 | "dev": true, 909 | "requires": { 910 | "alter": "0.2.0", 911 | "ast-traverse": "0.1.1", 912 | "breakable": "1.0.0", 913 | "esprima-fb": "15001.1001.0-dev-harmony-fb", 914 | "simple-fmt": "0.1.0", 915 | "simple-is": "0.2.0", 916 | "stringmap": "0.2.2", 917 | "stringset": "0.2.1", 918 | "tryor": "0.1.2", 919 | "yargs": "3.27.0" 920 | } 921 | }, 922 | "depd": { 923 | "version": "1.1.1", 924 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 925 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", 926 | "dev": true 927 | }, 928 | "deps-sort": { 929 | "version": "1.3.9", 930 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", 931 | "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", 932 | "dev": true, 933 | "requires": { 934 | "JSONStream": "1.3.1", 935 | "shasum": "1.0.2", 936 | "subarg": "1.0.0", 937 | "through2": "1.1.1" 938 | } 939 | }, 940 | "des.js": { 941 | "version": "1.0.0", 942 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 943 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 944 | "dev": true, 945 | "requires": { 946 | "inherits": "2.0.3", 947 | "minimalistic-assert": "1.0.0" 948 | } 949 | }, 950 | "destroy": { 951 | "version": "1.0.4", 952 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 953 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 954 | "dev": true 955 | }, 956 | "detect-indent": { 957 | "version": "3.0.1", 958 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", 959 | "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", 960 | "dev": true, 961 | "requires": { 962 | "get-stdin": "4.0.1", 963 | "minimist": "1.2.0", 964 | "repeating": "1.1.3" 965 | } 966 | }, 967 | "detective": { 968 | "version": "4.5.0", 969 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", 970 | "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", 971 | "dev": true, 972 | "requires": { 973 | "acorn": "4.0.13", 974 | "defined": "1.0.0" 975 | } 976 | }, 977 | "diffie-hellman": { 978 | "version": "5.0.2", 979 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", 980 | "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", 981 | "dev": true, 982 | "requires": { 983 | "bn.js": "4.11.8", 984 | "miller-rabin": "4.0.1", 985 | "randombytes": "2.0.5" 986 | } 987 | }, 988 | "domain-browser": { 989 | "version": "1.1.7", 990 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 991 | "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", 992 | "dev": true 993 | }, 994 | "duplexer2": { 995 | "version": "0.0.2", 996 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", 997 | "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", 998 | "dev": true, 999 | "requires": { 1000 | "readable-stream": "1.1.14" 1001 | } 1002 | }, 1003 | "ee-first": { 1004 | "version": "1.1.1", 1005 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1006 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 1007 | "dev": true 1008 | }, 1009 | "elliptic": { 1010 | "version": "6.4.0", 1011 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", 1012 | "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", 1013 | "dev": true, 1014 | "requires": { 1015 | "bn.js": "4.11.8", 1016 | "brorand": "1.1.0", 1017 | "hash.js": "1.1.3", 1018 | "hmac-drbg": "1.0.1", 1019 | "inherits": "2.0.3", 1020 | "minimalistic-assert": "1.0.0", 1021 | "minimalistic-crypto-utils": "1.0.1" 1022 | } 1023 | }, 1024 | "encodeurl": { 1025 | "version": "1.0.1", 1026 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 1027 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", 1028 | "dev": true 1029 | }, 1030 | "escape-html": { 1031 | "version": "1.0.3", 1032 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1033 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 1034 | "dev": true 1035 | }, 1036 | "escape-string-regexp": { 1037 | "version": "1.0.5", 1038 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1039 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1040 | "dev": true 1041 | }, 1042 | "esprima-fb": { 1043 | "version": "15001.1001.0-dev-harmony-fb", 1044 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", 1045 | "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", 1046 | "dev": true 1047 | }, 1048 | "esutils": { 1049 | "version": "2.0.2", 1050 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1051 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1052 | "dev": true 1053 | }, 1054 | "etag": { 1055 | "version": "1.8.1", 1056 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1057 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 1058 | "dev": true 1059 | }, 1060 | "events": { 1061 | "version": "1.0.2", 1062 | "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", 1063 | "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=", 1064 | "dev": true 1065 | }, 1066 | "evp_bytestokey": { 1067 | "version": "1.0.3", 1068 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 1069 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 1070 | "dev": true, 1071 | "requires": { 1072 | "md5.js": "1.3.4", 1073 | "safe-buffer": "5.1.1" 1074 | } 1075 | }, 1076 | "expand-brackets": { 1077 | "version": "0.1.5", 1078 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 1079 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 1080 | "dev": true, 1081 | "requires": { 1082 | "is-posix-bracket": "0.1.1" 1083 | } 1084 | }, 1085 | "expand-range": { 1086 | "version": "1.8.2", 1087 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 1088 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 1089 | "dev": true, 1090 | "requires": { 1091 | "fill-range": "2.2.3" 1092 | } 1093 | }, 1094 | "extglob": { 1095 | "version": "0.3.2", 1096 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 1097 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 1098 | "dev": true, 1099 | "requires": { 1100 | "is-extglob": "1.0.0" 1101 | } 1102 | }, 1103 | "filename-regex": { 1104 | "version": "2.0.1", 1105 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 1106 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 1107 | "dev": true 1108 | }, 1109 | "fill-range": { 1110 | "version": "2.2.3", 1111 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 1112 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 1113 | "dev": true, 1114 | "requires": { 1115 | "is-number": "2.1.0", 1116 | "isobject": "2.1.0", 1117 | "randomatic": "1.1.7", 1118 | "repeat-element": "1.1.2", 1119 | "repeat-string": "1.6.1" 1120 | } 1121 | }, 1122 | "finalhandler": { 1123 | "version": "1.0.6", 1124 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", 1125 | "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", 1126 | "dev": true, 1127 | "requires": { 1128 | "debug": "2.6.9", 1129 | "encodeurl": "1.0.1", 1130 | "escape-html": "1.0.3", 1131 | "on-finished": "2.3.0", 1132 | "parseurl": "1.3.2", 1133 | "statuses": "1.3.1", 1134 | "unpipe": "1.0.0" 1135 | } 1136 | }, 1137 | "for-in": { 1138 | "version": "1.0.2", 1139 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1140 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1141 | "dev": true 1142 | }, 1143 | "for-own": { 1144 | "version": "0.1.5", 1145 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 1146 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 1147 | "dev": true, 1148 | "requires": { 1149 | "for-in": "1.0.2" 1150 | } 1151 | }, 1152 | "fresh": { 1153 | "version": "0.5.2", 1154 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1155 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 1156 | "dev": true 1157 | }, 1158 | "fs-readdir-recursive": { 1159 | "version": "0.1.2", 1160 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", 1161 | "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", 1162 | "dev": true 1163 | }, 1164 | "fs.realpath": { 1165 | "version": "1.0.0", 1166 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1167 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1168 | "dev": true 1169 | }, 1170 | "fsevents": { 1171 | "version": "1.1.2", 1172 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", 1173 | "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", 1174 | "dev": true, 1175 | "optional": true, 1176 | "requires": { 1177 | "nan": "2.7.0", 1178 | "node-pre-gyp": "0.6.36" 1179 | }, 1180 | "dependencies": { 1181 | "abbrev": { 1182 | "version": "1.1.0", 1183 | "bundled": true, 1184 | "dev": true, 1185 | "optional": true 1186 | }, 1187 | "ajv": { 1188 | "version": "4.11.8", 1189 | "bundled": true, 1190 | "dev": true, 1191 | "optional": true, 1192 | "requires": { 1193 | "co": "4.6.0", 1194 | "json-stable-stringify": "1.0.1" 1195 | } 1196 | }, 1197 | "ansi-regex": { 1198 | "version": "2.1.1", 1199 | "bundled": true, 1200 | "dev": true 1201 | }, 1202 | "aproba": { 1203 | "version": "1.1.1", 1204 | "bundled": true, 1205 | "dev": true, 1206 | "optional": true 1207 | }, 1208 | "are-we-there-yet": { 1209 | "version": "1.1.4", 1210 | "bundled": true, 1211 | "dev": true, 1212 | "optional": true, 1213 | "requires": { 1214 | "delegates": "1.0.0", 1215 | "readable-stream": "2.2.9" 1216 | } 1217 | }, 1218 | "asn1": { 1219 | "version": "0.2.3", 1220 | "bundled": true, 1221 | "dev": true, 1222 | "optional": true 1223 | }, 1224 | "assert-plus": { 1225 | "version": "0.2.0", 1226 | "bundled": true, 1227 | "dev": true, 1228 | "optional": true 1229 | }, 1230 | "asynckit": { 1231 | "version": "0.4.0", 1232 | "bundled": true, 1233 | "dev": true, 1234 | "optional": true 1235 | }, 1236 | "aws-sign2": { 1237 | "version": "0.6.0", 1238 | "bundled": true, 1239 | "dev": true, 1240 | "optional": true 1241 | }, 1242 | "aws4": { 1243 | "version": "1.6.0", 1244 | "bundled": true, 1245 | "dev": true, 1246 | "optional": true 1247 | }, 1248 | "balanced-match": { 1249 | "version": "0.4.2", 1250 | "bundled": true, 1251 | "dev": true 1252 | }, 1253 | "bcrypt-pbkdf": { 1254 | "version": "1.0.1", 1255 | "bundled": true, 1256 | "dev": true, 1257 | "optional": true, 1258 | "requires": { 1259 | "tweetnacl": "0.14.5" 1260 | } 1261 | }, 1262 | "block-stream": { 1263 | "version": "0.0.9", 1264 | "bundled": true, 1265 | "dev": true, 1266 | "requires": { 1267 | "inherits": "2.0.3" 1268 | } 1269 | }, 1270 | "boom": { 1271 | "version": "2.10.1", 1272 | "bundled": true, 1273 | "dev": true, 1274 | "requires": { 1275 | "hoek": "2.16.3" 1276 | } 1277 | }, 1278 | "brace-expansion": { 1279 | "version": "1.1.7", 1280 | "bundled": true, 1281 | "dev": true, 1282 | "requires": { 1283 | "balanced-match": "0.4.2", 1284 | "concat-map": "0.0.1" 1285 | } 1286 | }, 1287 | "buffer-shims": { 1288 | "version": "1.0.0", 1289 | "bundled": true, 1290 | "dev": true 1291 | }, 1292 | "caseless": { 1293 | "version": "0.12.0", 1294 | "bundled": true, 1295 | "dev": true, 1296 | "optional": true 1297 | }, 1298 | "co": { 1299 | "version": "4.6.0", 1300 | "bundled": true, 1301 | "dev": true, 1302 | "optional": true 1303 | }, 1304 | "code-point-at": { 1305 | "version": "1.1.0", 1306 | "bundled": true, 1307 | "dev": true 1308 | }, 1309 | "combined-stream": { 1310 | "version": "1.0.5", 1311 | "bundled": true, 1312 | "dev": true, 1313 | "requires": { 1314 | "delayed-stream": "1.0.0" 1315 | } 1316 | }, 1317 | "concat-map": { 1318 | "version": "0.0.1", 1319 | "bundled": true, 1320 | "dev": true 1321 | }, 1322 | "console-control-strings": { 1323 | "version": "1.1.0", 1324 | "bundled": true, 1325 | "dev": true 1326 | }, 1327 | "core-util-is": { 1328 | "version": "1.0.2", 1329 | "bundled": true, 1330 | "dev": true 1331 | }, 1332 | "cryptiles": { 1333 | "version": "2.0.5", 1334 | "bundled": true, 1335 | "dev": true, 1336 | "optional": true, 1337 | "requires": { 1338 | "boom": "2.10.1" 1339 | } 1340 | }, 1341 | "dashdash": { 1342 | "version": "1.14.1", 1343 | "bundled": true, 1344 | "dev": true, 1345 | "optional": true, 1346 | "requires": { 1347 | "assert-plus": "1.0.0" 1348 | }, 1349 | "dependencies": { 1350 | "assert-plus": { 1351 | "version": "1.0.0", 1352 | "bundled": true, 1353 | "dev": true, 1354 | "optional": true 1355 | } 1356 | } 1357 | }, 1358 | "debug": { 1359 | "version": "2.6.8", 1360 | "bundled": true, 1361 | "dev": true, 1362 | "optional": true, 1363 | "requires": { 1364 | "ms": "2.0.0" 1365 | } 1366 | }, 1367 | "deep-extend": { 1368 | "version": "0.4.2", 1369 | "bundled": true, 1370 | "dev": true, 1371 | "optional": true 1372 | }, 1373 | "delayed-stream": { 1374 | "version": "1.0.0", 1375 | "bundled": true, 1376 | "dev": true 1377 | }, 1378 | "delegates": { 1379 | "version": "1.0.0", 1380 | "bundled": true, 1381 | "dev": true, 1382 | "optional": true 1383 | }, 1384 | "ecc-jsbn": { 1385 | "version": "0.1.1", 1386 | "bundled": true, 1387 | "dev": true, 1388 | "optional": true, 1389 | "requires": { 1390 | "jsbn": "0.1.1" 1391 | } 1392 | }, 1393 | "extend": { 1394 | "version": "3.0.1", 1395 | "bundled": true, 1396 | "dev": true, 1397 | "optional": true 1398 | }, 1399 | "extsprintf": { 1400 | "version": "1.0.2", 1401 | "bundled": true, 1402 | "dev": true 1403 | }, 1404 | "forever-agent": { 1405 | "version": "0.6.1", 1406 | "bundled": true, 1407 | "dev": true, 1408 | "optional": true 1409 | }, 1410 | "form-data": { 1411 | "version": "2.1.4", 1412 | "bundled": true, 1413 | "dev": true, 1414 | "optional": true, 1415 | "requires": { 1416 | "asynckit": "0.4.0", 1417 | "combined-stream": "1.0.5", 1418 | "mime-types": "2.1.15" 1419 | } 1420 | }, 1421 | "fs.realpath": { 1422 | "version": "1.0.0", 1423 | "bundled": true, 1424 | "dev": true 1425 | }, 1426 | "fstream": { 1427 | "version": "1.0.11", 1428 | "bundled": true, 1429 | "dev": true, 1430 | "requires": { 1431 | "graceful-fs": "4.1.11", 1432 | "inherits": "2.0.3", 1433 | "mkdirp": "0.5.1", 1434 | "rimraf": "2.6.1" 1435 | } 1436 | }, 1437 | "fstream-ignore": { 1438 | "version": "1.0.5", 1439 | "bundled": true, 1440 | "dev": true, 1441 | "optional": true, 1442 | "requires": { 1443 | "fstream": "1.0.11", 1444 | "inherits": "2.0.3", 1445 | "minimatch": "3.0.4" 1446 | } 1447 | }, 1448 | "gauge": { 1449 | "version": "2.7.4", 1450 | "bundled": true, 1451 | "dev": true, 1452 | "optional": true, 1453 | "requires": { 1454 | "aproba": "1.1.1", 1455 | "console-control-strings": "1.1.0", 1456 | "has-unicode": "2.0.1", 1457 | "object-assign": "4.1.1", 1458 | "signal-exit": "3.0.2", 1459 | "string-width": "1.0.2", 1460 | "strip-ansi": "3.0.1", 1461 | "wide-align": "1.1.2" 1462 | } 1463 | }, 1464 | "getpass": { 1465 | "version": "0.1.7", 1466 | "bundled": true, 1467 | "dev": true, 1468 | "optional": true, 1469 | "requires": { 1470 | "assert-plus": "1.0.0" 1471 | }, 1472 | "dependencies": { 1473 | "assert-plus": { 1474 | "version": "1.0.0", 1475 | "bundled": true, 1476 | "dev": true, 1477 | "optional": true 1478 | } 1479 | } 1480 | }, 1481 | "glob": { 1482 | "version": "7.1.2", 1483 | "bundled": true, 1484 | "dev": true, 1485 | "requires": { 1486 | "fs.realpath": "1.0.0", 1487 | "inflight": "1.0.6", 1488 | "inherits": "2.0.3", 1489 | "minimatch": "3.0.4", 1490 | "once": "1.4.0", 1491 | "path-is-absolute": "1.0.1" 1492 | } 1493 | }, 1494 | "graceful-fs": { 1495 | "version": "4.1.11", 1496 | "bundled": true, 1497 | "dev": true 1498 | }, 1499 | "har-schema": { 1500 | "version": "1.0.5", 1501 | "bundled": true, 1502 | "dev": true, 1503 | "optional": true 1504 | }, 1505 | "har-validator": { 1506 | "version": "4.2.1", 1507 | "bundled": true, 1508 | "dev": true, 1509 | "optional": true, 1510 | "requires": { 1511 | "ajv": "4.11.8", 1512 | "har-schema": "1.0.5" 1513 | } 1514 | }, 1515 | "has-unicode": { 1516 | "version": "2.0.1", 1517 | "bundled": true, 1518 | "dev": true, 1519 | "optional": true 1520 | }, 1521 | "hawk": { 1522 | "version": "3.1.3", 1523 | "bundled": true, 1524 | "dev": true, 1525 | "optional": true, 1526 | "requires": { 1527 | "boom": "2.10.1", 1528 | "cryptiles": "2.0.5", 1529 | "hoek": "2.16.3", 1530 | "sntp": "1.0.9" 1531 | } 1532 | }, 1533 | "hoek": { 1534 | "version": "2.16.3", 1535 | "bundled": true, 1536 | "dev": true 1537 | }, 1538 | "http-signature": { 1539 | "version": "1.1.1", 1540 | "bundled": true, 1541 | "dev": true, 1542 | "optional": true, 1543 | "requires": { 1544 | "assert-plus": "0.2.0", 1545 | "jsprim": "1.4.0", 1546 | "sshpk": "1.13.0" 1547 | } 1548 | }, 1549 | "inflight": { 1550 | "version": "1.0.6", 1551 | "bundled": true, 1552 | "dev": true, 1553 | "requires": { 1554 | "once": "1.4.0", 1555 | "wrappy": "1.0.2" 1556 | } 1557 | }, 1558 | "inherits": { 1559 | "version": "2.0.3", 1560 | "bundled": true, 1561 | "dev": true 1562 | }, 1563 | "ini": { 1564 | "version": "1.3.4", 1565 | "bundled": true, 1566 | "dev": true, 1567 | "optional": true 1568 | }, 1569 | "is-fullwidth-code-point": { 1570 | "version": "1.0.0", 1571 | "bundled": true, 1572 | "dev": true, 1573 | "requires": { 1574 | "number-is-nan": "1.0.1" 1575 | } 1576 | }, 1577 | "is-typedarray": { 1578 | "version": "1.0.0", 1579 | "bundled": true, 1580 | "dev": true, 1581 | "optional": true 1582 | }, 1583 | "isarray": { 1584 | "version": "1.0.0", 1585 | "bundled": true, 1586 | "dev": true 1587 | }, 1588 | "isstream": { 1589 | "version": "0.1.2", 1590 | "bundled": true, 1591 | "dev": true, 1592 | "optional": true 1593 | }, 1594 | "jodid25519": { 1595 | "version": "1.0.2", 1596 | "bundled": true, 1597 | "dev": true, 1598 | "optional": true, 1599 | "requires": { 1600 | "jsbn": "0.1.1" 1601 | } 1602 | }, 1603 | "jsbn": { 1604 | "version": "0.1.1", 1605 | "bundled": true, 1606 | "dev": true, 1607 | "optional": true 1608 | }, 1609 | "json-schema": { 1610 | "version": "0.2.3", 1611 | "bundled": true, 1612 | "dev": true, 1613 | "optional": true 1614 | }, 1615 | "json-stable-stringify": { 1616 | "version": "1.0.1", 1617 | "bundled": true, 1618 | "dev": true, 1619 | "optional": true, 1620 | "requires": { 1621 | "jsonify": "0.0.0" 1622 | } 1623 | }, 1624 | "json-stringify-safe": { 1625 | "version": "5.0.1", 1626 | "bundled": true, 1627 | "dev": true, 1628 | "optional": true 1629 | }, 1630 | "jsonify": { 1631 | "version": "0.0.0", 1632 | "bundled": true, 1633 | "dev": true, 1634 | "optional": true 1635 | }, 1636 | "jsprim": { 1637 | "version": "1.4.0", 1638 | "bundled": true, 1639 | "dev": true, 1640 | "optional": true, 1641 | "requires": { 1642 | "assert-plus": "1.0.0", 1643 | "extsprintf": "1.0.2", 1644 | "json-schema": "0.2.3", 1645 | "verror": "1.3.6" 1646 | }, 1647 | "dependencies": { 1648 | "assert-plus": { 1649 | "version": "1.0.0", 1650 | "bundled": true, 1651 | "dev": true, 1652 | "optional": true 1653 | } 1654 | } 1655 | }, 1656 | "mime-db": { 1657 | "version": "1.27.0", 1658 | "bundled": true, 1659 | "dev": true 1660 | }, 1661 | "mime-types": { 1662 | "version": "2.1.15", 1663 | "bundled": true, 1664 | "dev": true, 1665 | "requires": { 1666 | "mime-db": "1.27.0" 1667 | } 1668 | }, 1669 | "minimatch": { 1670 | "version": "3.0.4", 1671 | "bundled": true, 1672 | "dev": true, 1673 | "requires": { 1674 | "brace-expansion": "1.1.7" 1675 | } 1676 | }, 1677 | "minimist": { 1678 | "version": "0.0.8", 1679 | "bundled": true, 1680 | "dev": true 1681 | }, 1682 | "mkdirp": { 1683 | "version": "0.5.1", 1684 | "bundled": true, 1685 | "dev": true, 1686 | "requires": { 1687 | "minimist": "0.0.8" 1688 | } 1689 | }, 1690 | "ms": { 1691 | "version": "2.0.0", 1692 | "bundled": true, 1693 | "dev": true, 1694 | "optional": true 1695 | }, 1696 | "node-pre-gyp": { 1697 | "version": "0.6.36", 1698 | "bundled": true, 1699 | "dev": true, 1700 | "optional": true, 1701 | "requires": { 1702 | "mkdirp": "0.5.1", 1703 | "nopt": "4.0.1", 1704 | "npmlog": "4.1.0", 1705 | "rc": "1.2.1", 1706 | "request": "2.81.0", 1707 | "rimraf": "2.6.1", 1708 | "semver": "5.3.0", 1709 | "tar": "2.2.1", 1710 | "tar-pack": "3.4.0" 1711 | } 1712 | }, 1713 | "nopt": { 1714 | "version": "4.0.1", 1715 | "bundled": true, 1716 | "dev": true, 1717 | "optional": true, 1718 | "requires": { 1719 | "abbrev": "1.1.0", 1720 | "osenv": "0.1.4" 1721 | } 1722 | }, 1723 | "npmlog": { 1724 | "version": "4.1.0", 1725 | "bundled": true, 1726 | "dev": true, 1727 | "optional": true, 1728 | "requires": { 1729 | "are-we-there-yet": "1.1.4", 1730 | "console-control-strings": "1.1.0", 1731 | "gauge": "2.7.4", 1732 | "set-blocking": "2.0.0" 1733 | } 1734 | }, 1735 | "number-is-nan": { 1736 | "version": "1.0.1", 1737 | "bundled": true, 1738 | "dev": true 1739 | }, 1740 | "oauth-sign": { 1741 | "version": "0.8.2", 1742 | "bundled": true, 1743 | "dev": true, 1744 | "optional": true 1745 | }, 1746 | "object-assign": { 1747 | "version": "4.1.1", 1748 | "bundled": true, 1749 | "dev": true, 1750 | "optional": true 1751 | }, 1752 | "once": { 1753 | "version": "1.4.0", 1754 | "bundled": true, 1755 | "dev": true, 1756 | "requires": { 1757 | "wrappy": "1.0.2" 1758 | } 1759 | }, 1760 | "os-homedir": { 1761 | "version": "1.0.2", 1762 | "bundled": true, 1763 | "dev": true, 1764 | "optional": true 1765 | }, 1766 | "os-tmpdir": { 1767 | "version": "1.0.2", 1768 | "bundled": true, 1769 | "dev": true, 1770 | "optional": true 1771 | }, 1772 | "osenv": { 1773 | "version": "0.1.4", 1774 | "bundled": true, 1775 | "dev": true, 1776 | "optional": true, 1777 | "requires": { 1778 | "os-homedir": "1.0.2", 1779 | "os-tmpdir": "1.0.2" 1780 | } 1781 | }, 1782 | "path-is-absolute": { 1783 | "version": "1.0.1", 1784 | "bundled": true, 1785 | "dev": true 1786 | }, 1787 | "performance-now": { 1788 | "version": "0.2.0", 1789 | "bundled": true, 1790 | "dev": true, 1791 | "optional": true 1792 | }, 1793 | "process-nextick-args": { 1794 | "version": "1.0.7", 1795 | "bundled": true, 1796 | "dev": true 1797 | }, 1798 | "punycode": { 1799 | "version": "1.4.1", 1800 | "bundled": true, 1801 | "dev": true, 1802 | "optional": true 1803 | }, 1804 | "qs": { 1805 | "version": "6.4.0", 1806 | "bundled": true, 1807 | "dev": true, 1808 | "optional": true 1809 | }, 1810 | "rc": { 1811 | "version": "1.2.1", 1812 | "bundled": true, 1813 | "dev": true, 1814 | "optional": true, 1815 | "requires": { 1816 | "deep-extend": "0.4.2", 1817 | "ini": "1.3.4", 1818 | "minimist": "1.2.0", 1819 | "strip-json-comments": "2.0.1" 1820 | }, 1821 | "dependencies": { 1822 | "minimist": { 1823 | "version": "1.2.0", 1824 | "bundled": true, 1825 | "dev": true, 1826 | "optional": true 1827 | } 1828 | } 1829 | }, 1830 | "readable-stream": { 1831 | "version": "2.2.9", 1832 | "bundled": true, 1833 | "dev": true, 1834 | "requires": { 1835 | "buffer-shims": "1.0.0", 1836 | "core-util-is": "1.0.2", 1837 | "inherits": "2.0.3", 1838 | "isarray": "1.0.0", 1839 | "process-nextick-args": "1.0.7", 1840 | "string_decoder": "1.0.1", 1841 | "util-deprecate": "1.0.2" 1842 | } 1843 | }, 1844 | "request": { 1845 | "version": "2.81.0", 1846 | "bundled": true, 1847 | "dev": true, 1848 | "optional": true, 1849 | "requires": { 1850 | "aws-sign2": "0.6.0", 1851 | "aws4": "1.6.0", 1852 | "caseless": "0.12.0", 1853 | "combined-stream": "1.0.5", 1854 | "extend": "3.0.1", 1855 | "forever-agent": "0.6.1", 1856 | "form-data": "2.1.4", 1857 | "har-validator": "4.2.1", 1858 | "hawk": "3.1.3", 1859 | "http-signature": "1.1.1", 1860 | "is-typedarray": "1.0.0", 1861 | "isstream": "0.1.2", 1862 | "json-stringify-safe": "5.0.1", 1863 | "mime-types": "2.1.15", 1864 | "oauth-sign": "0.8.2", 1865 | "performance-now": "0.2.0", 1866 | "qs": "6.4.0", 1867 | "safe-buffer": "5.0.1", 1868 | "stringstream": "0.0.5", 1869 | "tough-cookie": "2.3.2", 1870 | "tunnel-agent": "0.6.0", 1871 | "uuid": "3.0.1" 1872 | } 1873 | }, 1874 | "rimraf": { 1875 | "version": "2.6.1", 1876 | "bundled": true, 1877 | "dev": true, 1878 | "requires": { 1879 | "glob": "7.1.2" 1880 | } 1881 | }, 1882 | "safe-buffer": { 1883 | "version": "5.0.1", 1884 | "bundled": true, 1885 | "dev": true 1886 | }, 1887 | "semver": { 1888 | "version": "5.3.0", 1889 | "bundled": true, 1890 | "dev": true, 1891 | "optional": true 1892 | }, 1893 | "set-blocking": { 1894 | "version": "2.0.0", 1895 | "bundled": true, 1896 | "dev": true, 1897 | "optional": true 1898 | }, 1899 | "signal-exit": { 1900 | "version": "3.0.2", 1901 | "bundled": true, 1902 | "dev": true, 1903 | "optional": true 1904 | }, 1905 | "sntp": { 1906 | "version": "1.0.9", 1907 | "bundled": true, 1908 | "dev": true, 1909 | "optional": true, 1910 | "requires": { 1911 | "hoek": "2.16.3" 1912 | } 1913 | }, 1914 | "sshpk": { 1915 | "version": "1.13.0", 1916 | "bundled": true, 1917 | "dev": true, 1918 | "optional": true, 1919 | "requires": { 1920 | "asn1": "0.2.3", 1921 | "assert-plus": "1.0.0", 1922 | "bcrypt-pbkdf": "1.0.1", 1923 | "dashdash": "1.14.1", 1924 | "ecc-jsbn": "0.1.1", 1925 | "getpass": "0.1.7", 1926 | "jodid25519": "1.0.2", 1927 | "jsbn": "0.1.1", 1928 | "tweetnacl": "0.14.5" 1929 | }, 1930 | "dependencies": { 1931 | "assert-plus": { 1932 | "version": "1.0.0", 1933 | "bundled": true, 1934 | "dev": true, 1935 | "optional": true 1936 | } 1937 | } 1938 | }, 1939 | "string-width": { 1940 | "version": "1.0.2", 1941 | "bundled": true, 1942 | "dev": true, 1943 | "requires": { 1944 | "code-point-at": "1.1.0", 1945 | "is-fullwidth-code-point": "1.0.0", 1946 | "strip-ansi": "3.0.1" 1947 | } 1948 | }, 1949 | "string_decoder": { 1950 | "version": "1.0.1", 1951 | "bundled": true, 1952 | "dev": true, 1953 | "requires": { 1954 | "safe-buffer": "5.0.1" 1955 | } 1956 | }, 1957 | "stringstream": { 1958 | "version": "0.0.5", 1959 | "bundled": true, 1960 | "dev": true, 1961 | "optional": true 1962 | }, 1963 | "strip-ansi": { 1964 | "version": "3.0.1", 1965 | "bundled": true, 1966 | "dev": true, 1967 | "requires": { 1968 | "ansi-regex": "2.1.1" 1969 | } 1970 | }, 1971 | "strip-json-comments": { 1972 | "version": "2.0.1", 1973 | "bundled": true, 1974 | "dev": true, 1975 | "optional": true 1976 | }, 1977 | "tar": { 1978 | "version": "2.2.1", 1979 | "bundled": true, 1980 | "dev": true, 1981 | "requires": { 1982 | "block-stream": "0.0.9", 1983 | "fstream": "1.0.11", 1984 | "inherits": "2.0.3" 1985 | } 1986 | }, 1987 | "tar-pack": { 1988 | "version": "3.4.0", 1989 | "bundled": true, 1990 | "dev": true, 1991 | "optional": true, 1992 | "requires": { 1993 | "debug": "2.6.8", 1994 | "fstream": "1.0.11", 1995 | "fstream-ignore": "1.0.5", 1996 | "once": "1.4.0", 1997 | "readable-stream": "2.2.9", 1998 | "rimraf": "2.6.1", 1999 | "tar": "2.2.1", 2000 | "uid-number": "0.0.6" 2001 | } 2002 | }, 2003 | "tough-cookie": { 2004 | "version": "2.3.2", 2005 | "bundled": true, 2006 | "dev": true, 2007 | "optional": true, 2008 | "requires": { 2009 | "punycode": "1.4.1" 2010 | } 2011 | }, 2012 | "tunnel-agent": { 2013 | "version": "0.6.0", 2014 | "bundled": true, 2015 | "dev": true, 2016 | "optional": true, 2017 | "requires": { 2018 | "safe-buffer": "5.0.1" 2019 | } 2020 | }, 2021 | "tweetnacl": { 2022 | "version": "0.14.5", 2023 | "bundled": true, 2024 | "dev": true, 2025 | "optional": true 2026 | }, 2027 | "uid-number": { 2028 | "version": "0.0.6", 2029 | "bundled": true, 2030 | "dev": true, 2031 | "optional": true 2032 | }, 2033 | "util-deprecate": { 2034 | "version": "1.0.2", 2035 | "bundled": true, 2036 | "dev": true 2037 | }, 2038 | "uuid": { 2039 | "version": "3.0.1", 2040 | "bundled": true, 2041 | "dev": true, 2042 | "optional": true 2043 | }, 2044 | "verror": { 2045 | "version": "1.3.6", 2046 | "bundled": true, 2047 | "dev": true, 2048 | "optional": true, 2049 | "requires": { 2050 | "extsprintf": "1.0.2" 2051 | } 2052 | }, 2053 | "wide-align": { 2054 | "version": "1.1.2", 2055 | "bundled": true, 2056 | "dev": true, 2057 | "optional": true, 2058 | "requires": { 2059 | "string-width": "1.0.2" 2060 | } 2061 | }, 2062 | "wrappy": { 2063 | "version": "1.0.2", 2064 | "bundled": true, 2065 | "dev": true 2066 | } 2067 | } 2068 | }, 2069 | "function-bind": { 2070 | "version": "1.1.1", 2071 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2072 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2073 | "dev": true 2074 | }, 2075 | "get-stdin": { 2076 | "version": "4.0.1", 2077 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 2078 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 2079 | "dev": true 2080 | }, 2081 | "glob": { 2082 | "version": "5.0.15", 2083 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 2084 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 2085 | "dev": true, 2086 | "requires": { 2087 | "inflight": "1.0.6", 2088 | "inherits": "2.0.3", 2089 | "minimatch": "2.0.10", 2090 | "once": "1.4.0", 2091 | "path-is-absolute": "1.0.1" 2092 | } 2093 | }, 2094 | "glob-base": { 2095 | "version": "0.3.0", 2096 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 2097 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 2098 | "dev": true, 2099 | "requires": { 2100 | "glob-parent": "2.0.0", 2101 | "is-glob": "2.0.1" 2102 | } 2103 | }, 2104 | "glob-parent": { 2105 | "version": "2.0.0", 2106 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 2107 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 2108 | "dev": true, 2109 | "requires": { 2110 | "is-glob": "2.0.1" 2111 | } 2112 | }, 2113 | "globals": { 2114 | "version": "6.4.1", 2115 | "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", 2116 | "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", 2117 | "dev": true 2118 | }, 2119 | "graceful-fs": { 2120 | "version": "4.1.11", 2121 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 2122 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 2123 | "dev": true 2124 | }, 2125 | "has": { 2126 | "version": "1.0.1", 2127 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 2128 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 2129 | "dev": true, 2130 | "requires": { 2131 | "function-bind": "1.1.1" 2132 | } 2133 | }, 2134 | "has-ansi": { 2135 | "version": "2.0.0", 2136 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 2137 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 2138 | "dev": true, 2139 | "requires": { 2140 | "ansi-regex": "2.1.1" 2141 | } 2142 | }, 2143 | "hash-base": { 2144 | "version": "2.0.2", 2145 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", 2146 | "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", 2147 | "dev": true, 2148 | "requires": { 2149 | "inherits": "2.0.3" 2150 | } 2151 | }, 2152 | "hash.js": { 2153 | "version": "1.1.3", 2154 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", 2155 | "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", 2156 | "dev": true, 2157 | "requires": { 2158 | "inherits": "2.0.3", 2159 | "minimalistic-assert": "1.0.0" 2160 | } 2161 | }, 2162 | "hmac-drbg": { 2163 | "version": "1.0.1", 2164 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 2165 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 2166 | "dev": true, 2167 | "requires": { 2168 | "hash.js": "1.1.3", 2169 | "minimalistic-assert": "1.0.0", 2170 | "minimalistic-crypto-utils": "1.0.1" 2171 | } 2172 | }, 2173 | "home-or-tmp": { 2174 | "version": "1.0.0", 2175 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", 2176 | "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", 2177 | "dev": true, 2178 | "requires": { 2179 | "os-tmpdir": "1.0.2", 2180 | "user-home": "1.1.1" 2181 | } 2182 | }, 2183 | "htmlescape": { 2184 | "version": "1.1.1", 2185 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 2186 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", 2187 | "dev": true 2188 | }, 2189 | "http-browserify": { 2190 | "version": "1.7.0", 2191 | "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", 2192 | "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", 2193 | "dev": true, 2194 | "requires": { 2195 | "Base64": "0.2.1", 2196 | "inherits": "2.0.3" 2197 | } 2198 | }, 2199 | "http-errors": { 2200 | "version": "1.6.2", 2201 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 2202 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 2203 | "dev": true, 2204 | "requires": { 2205 | "depd": "1.1.1", 2206 | "inherits": "2.0.3", 2207 | "setprototypeof": "1.0.3", 2208 | "statuses": "1.3.1" 2209 | } 2210 | }, 2211 | "https-browserify": { 2212 | "version": "0.0.1", 2213 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", 2214 | "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", 2215 | "dev": true 2216 | }, 2217 | "iconv-lite": { 2218 | "version": "0.4.19", 2219 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 2220 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 2221 | "dev": true 2222 | }, 2223 | "ieee754": { 2224 | "version": "1.1.8", 2225 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 2226 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", 2227 | "dev": true 2228 | }, 2229 | "indexof": { 2230 | "version": "0.0.1", 2231 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 2232 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 2233 | "dev": true 2234 | }, 2235 | "inflight": { 2236 | "version": "1.0.6", 2237 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2238 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2239 | "dev": true, 2240 | "requires": { 2241 | "once": "1.4.0", 2242 | "wrappy": "1.0.2" 2243 | } 2244 | }, 2245 | "inherits": { 2246 | "version": "2.0.3", 2247 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2248 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 2249 | "dev": true 2250 | }, 2251 | "inline-source-map": { 2252 | "version": "0.5.0", 2253 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", 2254 | "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", 2255 | "dev": true, 2256 | "requires": { 2257 | "source-map": "0.4.4" 2258 | }, 2259 | "dependencies": { 2260 | "source-map": { 2261 | "version": "0.4.4", 2262 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 2263 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 2264 | "dev": true, 2265 | "requires": { 2266 | "amdefine": "1.0.1" 2267 | } 2268 | } 2269 | } 2270 | }, 2271 | "insert-module-globals": { 2272 | "version": "6.6.3", 2273 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", 2274 | "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", 2275 | "dev": true, 2276 | "requires": { 2277 | "JSONStream": "1.3.1", 2278 | "combine-source-map": "0.6.1", 2279 | "concat-stream": "1.4.10", 2280 | "is-buffer": "1.1.6", 2281 | "lexical-scope": "1.2.0", 2282 | "process": "0.11.10", 2283 | "through2": "1.1.1", 2284 | "xtend": "4.0.1" 2285 | } 2286 | }, 2287 | "invert-kv": { 2288 | "version": "1.0.0", 2289 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 2290 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 2291 | "dev": true 2292 | }, 2293 | "is-binary-path": { 2294 | "version": "1.0.1", 2295 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 2296 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 2297 | "dev": true, 2298 | "requires": { 2299 | "binary-extensions": "1.10.0" 2300 | } 2301 | }, 2302 | "is-buffer": { 2303 | "version": "1.1.6", 2304 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 2305 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 2306 | "dev": true 2307 | }, 2308 | "is-dotfile": { 2309 | "version": "1.0.3", 2310 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 2311 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 2312 | "dev": true 2313 | }, 2314 | "is-equal-shallow": { 2315 | "version": "0.1.3", 2316 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 2317 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 2318 | "dev": true, 2319 | "requires": { 2320 | "is-primitive": "2.0.0" 2321 | } 2322 | }, 2323 | "is-extendable": { 2324 | "version": "0.1.1", 2325 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 2326 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 2327 | "dev": true 2328 | }, 2329 | "is-extglob": { 2330 | "version": "1.0.0", 2331 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 2332 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 2333 | "dev": true 2334 | }, 2335 | "is-finite": { 2336 | "version": "1.0.2", 2337 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 2338 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 2339 | "dev": true, 2340 | "requires": { 2341 | "number-is-nan": "1.0.1" 2342 | } 2343 | }, 2344 | "is-glob": { 2345 | "version": "2.0.1", 2346 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 2347 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 2348 | "dev": true, 2349 | "requires": { 2350 | "is-extglob": "1.0.0" 2351 | } 2352 | }, 2353 | "is-integer": { 2354 | "version": "1.0.7", 2355 | "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", 2356 | "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", 2357 | "dev": true, 2358 | "requires": { 2359 | "is-finite": "1.0.2" 2360 | } 2361 | }, 2362 | "is-number": { 2363 | "version": "2.1.0", 2364 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 2365 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 2366 | "dev": true, 2367 | "requires": { 2368 | "kind-of": "3.2.2" 2369 | } 2370 | }, 2371 | "is-posix-bracket": { 2372 | "version": "0.1.1", 2373 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 2374 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 2375 | "dev": true 2376 | }, 2377 | "is-primitive": { 2378 | "version": "2.0.0", 2379 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 2380 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 2381 | "dev": true 2382 | }, 2383 | "isarray": { 2384 | "version": "0.0.1", 2385 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2386 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2387 | "dev": true 2388 | }, 2389 | "isobject": { 2390 | "version": "2.1.0", 2391 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2392 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2393 | "dev": true, 2394 | "requires": { 2395 | "isarray": "1.0.0" 2396 | }, 2397 | "dependencies": { 2398 | "isarray": { 2399 | "version": "1.0.0", 2400 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2401 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2402 | "dev": true 2403 | } 2404 | } 2405 | }, 2406 | "js-tokens": { 2407 | "version": "1.0.1", 2408 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", 2409 | "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", 2410 | "dev": true 2411 | }, 2412 | "jsesc": { 2413 | "version": "0.5.0", 2414 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 2415 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 2416 | "dev": true 2417 | }, 2418 | "json-stable-stringify": { 2419 | "version": "0.0.1", 2420 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 2421 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 2422 | "dev": true, 2423 | "requires": { 2424 | "jsonify": "0.0.0" 2425 | } 2426 | }, 2427 | "json5": { 2428 | "version": "0.4.0", 2429 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", 2430 | "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", 2431 | "dev": true 2432 | }, 2433 | "jsonify": { 2434 | "version": "0.0.0", 2435 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 2436 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 2437 | "dev": true 2438 | }, 2439 | "jsonparse": { 2440 | "version": "1.3.1", 2441 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 2442 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 2443 | "dev": true 2444 | }, 2445 | "kind-of": { 2446 | "version": "3.2.2", 2447 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2448 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2449 | "dev": true, 2450 | "requires": { 2451 | "is-buffer": "1.1.6" 2452 | } 2453 | }, 2454 | "labeled-stream-splicer": { 2455 | "version": "1.0.2", 2456 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", 2457 | "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", 2458 | "dev": true, 2459 | "requires": { 2460 | "inherits": "2.0.3", 2461 | "isarray": "0.0.1", 2462 | "stream-splicer": "1.3.2" 2463 | } 2464 | }, 2465 | "lazy-cache": { 2466 | "version": "1.0.4", 2467 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 2468 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 2469 | "dev": true 2470 | }, 2471 | "lcid": { 2472 | "version": "1.0.0", 2473 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2474 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2475 | "dev": true, 2476 | "requires": { 2477 | "invert-kv": "1.0.0" 2478 | } 2479 | }, 2480 | "leven": { 2481 | "version": "1.0.2", 2482 | "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", 2483 | "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", 2484 | "dev": true 2485 | }, 2486 | "lexical-scope": { 2487 | "version": "1.2.0", 2488 | "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", 2489 | "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", 2490 | "dev": true, 2491 | "requires": { 2492 | "astw": "2.2.0" 2493 | } 2494 | }, 2495 | "lodash": { 2496 | "version": "3.10.1", 2497 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 2498 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 2499 | "dev": true 2500 | }, 2501 | "lodash.memoize": { 2502 | "version": "3.0.4", 2503 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 2504 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", 2505 | "dev": true 2506 | }, 2507 | "longest": { 2508 | "version": "1.0.1", 2509 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 2510 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 2511 | "dev": true 2512 | }, 2513 | "md5.js": { 2514 | "version": "1.3.4", 2515 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", 2516 | "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", 2517 | "dev": true, 2518 | "requires": { 2519 | "hash-base": "3.0.4", 2520 | "inherits": "2.0.3" 2521 | }, 2522 | "dependencies": { 2523 | "hash-base": { 2524 | "version": "3.0.4", 2525 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 2526 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 2527 | "dev": true, 2528 | "requires": { 2529 | "inherits": "2.0.3", 2530 | "safe-buffer": "5.1.1" 2531 | } 2532 | } 2533 | } 2534 | }, 2535 | "micromatch": { 2536 | "version": "2.3.11", 2537 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 2538 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 2539 | "dev": true, 2540 | "requires": { 2541 | "arr-diff": "2.0.0", 2542 | "array-unique": "0.2.1", 2543 | "braces": "1.8.5", 2544 | "expand-brackets": "0.1.5", 2545 | "extglob": "0.3.2", 2546 | "filename-regex": "2.0.1", 2547 | "is-extglob": "1.0.0", 2548 | "is-glob": "2.0.1", 2549 | "kind-of": "3.2.2", 2550 | "normalize-path": "2.1.1", 2551 | "object.omit": "2.0.1", 2552 | "parse-glob": "3.0.4", 2553 | "regex-cache": "0.4.4" 2554 | } 2555 | }, 2556 | "miller-rabin": { 2557 | "version": "4.0.1", 2558 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 2559 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 2560 | "dev": true, 2561 | "requires": { 2562 | "bn.js": "4.11.8", 2563 | "brorand": "1.1.0" 2564 | } 2565 | }, 2566 | "mime": { 2567 | "version": "1.4.1", 2568 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2569 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 2570 | "dev": true 2571 | }, 2572 | "minimalistic-assert": { 2573 | "version": "1.0.0", 2574 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", 2575 | "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", 2576 | "dev": true 2577 | }, 2578 | "minimalistic-crypto-utils": { 2579 | "version": "1.0.1", 2580 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 2581 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 2582 | "dev": true 2583 | }, 2584 | "minimatch": { 2585 | "version": "2.0.10", 2586 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 2587 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 2588 | "dev": true, 2589 | "requires": { 2590 | "brace-expansion": "1.1.8" 2591 | } 2592 | }, 2593 | "minimist": { 2594 | "version": "1.2.0", 2595 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2596 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 2597 | "dev": true 2598 | }, 2599 | "mkdirp": { 2600 | "version": "0.5.1", 2601 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2602 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2603 | "dev": true, 2604 | "requires": { 2605 | "minimist": "0.0.8" 2606 | }, 2607 | "dependencies": { 2608 | "minimist": { 2609 | "version": "0.0.8", 2610 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2611 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2612 | "dev": true 2613 | } 2614 | } 2615 | }, 2616 | "module-deps": { 2617 | "version": "3.9.1", 2618 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", 2619 | "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", 2620 | "dev": true, 2621 | "requires": { 2622 | "JSONStream": "1.3.1", 2623 | "browser-resolve": "1.11.2", 2624 | "concat-stream": "1.4.10", 2625 | "defined": "1.0.0", 2626 | "detective": "4.5.0", 2627 | "duplexer2": "0.0.2", 2628 | "inherits": "2.0.3", 2629 | "parents": "1.0.1", 2630 | "readable-stream": "1.1.14", 2631 | "resolve": "1.5.0", 2632 | "stream-combiner2": "1.0.2", 2633 | "subarg": "1.0.0", 2634 | "through2": "1.1.1", 2635 | "xtend": "4.0.1" 2636 | } 2637 | }, 2638 | "morgan": { 2639 | "version": "1.9.0", 2640 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", 2641 | "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", 2642 | "dev": true, 2643 | "requires": { 2644 | "basic-auth": "2.0.0", 2645 | "debug": "2.6.9", 2646 | "depd": "1.1.1", 2647 | "on-finished": "2.3.0", 2648 | "on-headers": "1.0.1" 2649 | } 2650 | }, 2651 | "ms": { 2652 | "version": "2.0.0", 2653 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2654 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 2655 | "dev": true 2656 | }, 2657 | "nan": { 2658 | "version": "2.7.0", 2659 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", 2660 | "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", 2661 | "dev": true, 2662 | "optional": true 2663 | }, 2664 | "normalize-path": { 2665 | "version": "2.1.1", 2666 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 2667 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 2668 | "dev": true, 2669 | "requires": { 2670 | "remove-trailing-separator": "1.1.0" 2671 | } 2672 | }, 2673 | "number-is-nan": { 2674 | "version": "1.0.1", 2675 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2676 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 2677 | "dev": true 2678 | }, 2679 | "object-assign": { 2680 | "version": "4.1.1", 2681 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2682 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2683 | "dev": true 2684 | }, 2685 | "object.omit": { 2686 | "version": "2.0.1", 2687 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 2688 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 2689 | "dev": true, 2690 | "requires": { 2691 | "for-own": "0.1.5", 2692 | "is-extendable": "0.1.1" 2693 | } 2694 | }, 2695 | "on-finished": { 2696 | "version": "2.3.0", 2697 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2698 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2699 | "dev": true, 2700 | "requires": { 2701 | "ee-first": "1.1.1" 2702 | } 2703 | }, 2704 | "on-headers": { 2705 | "version": "1.0.1", 2706 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 2707 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", 2708 | "dev": true 2709 | }, 2710 | "once": { 2711 | "version": "1.4.0", 2712 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2713 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2714 | "dev": true, 2715 | "requires": { 2716 | "wrappy": "1.0.2" 2717 | } 2718 | }, 2719 | "os-browserify": { 2720 | "version": "0.1.2", 2721 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", 2722 | "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", 2723 | "dev": true 2724 | }, 2725 | "os-locale": { 2726 | "version": "1.4.0", 2727 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2728 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2729 | "dev": true, 2730 | "requires": { 2731 | "lcid": "1.0.0" 2732 | } 2733 | }, 2734 | "os-tmpdir": { 2735 | "version": "1.0.2", 2736 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 2737 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 2738 | "dev": true 2739 | }, 2740 | "outpipe": { 2741 | "version": "1.1.1", 2742 | "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", 2743 | "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", 2744 | "dev": true, 2745 | "requires": { 2746 | "shell-quote": "1.6.1" 2747 | }, 2748 | "dependencies": { 2749 | "shell-quote": { 2750 | "version": "1.6.1", 2751 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 2752 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 2753 | "dev": true, 2754 | "requires": { 2755 | "array-filter": "0.0.1", 2756 | "array-map": "0.0.0", 2757 | "array-reduce": "0.0.0", 2758 | "jsonify": "0.0.0" 2759 | } 2760 | } 2761 | } 2762 | }, 2763 | "output-file-sync": { 2764 | "version": "1.1.2", 2765 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", 2766 | "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", 2767 | "dev": true, 2768 | "requires": { 2769 | "graceful-fs": "4.1.11", 2770 | "mkdirp": "0.5.1", 2771 | "object-assign": "4.1.1" 2772 | } 2773 | }, 2774 | "pako": { 2775 | "version": "0.2.9", 2776 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 2777 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 2778 | "dev": true 2779 | }, 2780 | "parents": { 2781 | "version": "1.0.1", 2782 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 2783 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 2784 | "dev": true, 2785 | "requires": { 2786 | "path-platform": "0.11.15" 2787 | } 2788 | }, 2789 | "parse-asn1": { 2790 | "version": "5.1.0", 2791 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", 2792 | "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", 2793 | "dev": true, 2794 | "requires": { 2795 | "asn1.js": "4.9.2", 2796 | "browserify-aes": "1.1.1", 2797 | "create-hash": "1.1.3", 2798 | "evp_bytestokey": "1.0.3", 2799 | "pbkdf2": "3.0.14" 2800 | } 2801 | }, 2802 | "parse-glob": { 2803 | "version": "3.0.4", 2804 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 2805 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 2806 | "dev": true, 2807 | "requires": { 2808 | "glob-base": "0.3.0", 2809 | "is-dotfile": "1.0.3", 2810 | "is-extglob": "1.0.0", 2811 | "is-glob": "2.0.1" 2812 | } 2813 | }, 2814 | "parseurl": { 2815 | "version": "1.3.2", 2816 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2817 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 2818 | "dev": true 2819 | }, 2820 | "path-browserify": { 2821 | "version": "0.0.0", 2822 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", 2823 | "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", 2824 | "dev": true 2825 | }, 2826 | "path-exists": { 2827 | "version": "1.0.0", 2828 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", 2829 | "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", 2830 | "dev": true 2831 | }, 2832 | "path-is-absolute": { 2833 | "version": "1.0.1", 2834 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2835 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2836 | "dev": true 2837 | }, 2838 | "path-parse": { 2839 | "version": "1.0.5", 2840 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 2841 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 2842 | "dev": true 2843 | }, 2844 | "path-platform": { 2845 | "version": "0.11.15", 2846 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 2847 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", 2848 | "dev": true 2849 | }, 2850 | "pbkdf2": { 2851 | "version": "3.0.14", 2852 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", 2853 | "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", 2854 | "dev": true, 2855 | "requires": { 2856 | "create-hash": "1.1.3", 2857 | "create-hmac": "1.1.6", 2858 | "ripemd160": "2.0.1", 2859 | "safe-buffer": "5.1.1", 2860 | "sha.js": "2.4.9" 2861 | } 2862 | }, 2863 | "phoenix-js": { 2864 | "version": "1.0.3", 2865 | "resolved": "https://registry.npmjs.org/phoenix-js/-/phoenix-js-1.0.3.tgz", 2866 | "integrity": "sha1-NCsWmggTGbm4VBt9+MMjdxnthHQ=", 2867 | "dev": true 2868 | }, 2869 | "preserve": { 2870 | "version": "0.2.0", 2871 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 2872 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 2873 | "dev": true 2874 | }, 2875 | "private": { 2876 | "version": "0.1.8", 2877 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 2878 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 2879 | "dev": true 2880 | }, 2881 | "process": { 2882 | "version": "0.11.10", 2883 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2884 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 2885 | "dev": true 2886 | }, 2887 | "process-nextick-args": { 2888 | "version": "1.0.7", 2889 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 2890 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 2891 | "dev": true 2892 | }, 2893 | "public-encrypt": { 2894 | "version": "4.0.0", 2895 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", 2896 | "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", 2897 | "dev": true, 2898 | "requires": { 2899 | "bn.js": "4.11.8", 2900 | "browserify-rsa": "4.0.1", 2901 | "create-hash": "1.1.3", 2902 | "parse-asn1": "5.1.0", 2903 | "randombytes": "2.0.5" 2904 | } 2905 | }, 2906 | "punycode": { 2907 | "version": "1.4.1", 2908 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2909 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2910 | "dev": true 2911 | }, 2912 | "q": { 2913 | "version": "1.5.1", 2914 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 2915 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 2916 | "dev": true 2917 | }, 2918 | "querystring": { 2919 | "version": "0.2.0", 2920 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2921 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 2922 | "dev": true 2923 | }, 2924 | "querystring-es3": { 2925 | "version": "0.2.1", 2926 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 2927 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 2928 | "dev": true 2929 | }, 2930 | "randomatic": { 2931 | "version": "1.1.7", 2932 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 2933 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 2934 | "dev": true, 2935 | "requires": { 2936 | "is-number": "3.0.0", 2937 | "kind-of": "4.0.0" 2938 | }, 2939 | "dependencies": { 2940 | "is-number": { 2941 | "version": "3.0.0", 2942 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 2943 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2944 | "dev": true, 2945 | "requires": { 2946 | "kind-of": "3.2.2" 2947 | }, 2948 | "dependencies": { 2949 | "kind-of": { 2950 | "version": "3.2.2", 2951 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2952 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2953 | "dev": true, 2954 | "requires": { 2955 | "is-buffer": "1.1.6" 2956 | } 2957 | } 2958 | } 2959 | }, 2960 | "kind-of": { 2961 | "version": "4.0.0", 2962 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 2963 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 2964 | "dev": true, 2965 | "requires": { 2966 | "is-buffer": "1.1.6" 2967 | } 2968 | } 2969 | } 2970 | }, 2971 | "randombytes": { 2972 | "version": "2.0.5", 2973 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", 2974 | "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", 2975 | "dev": true, 2976 | "requires": { 2977 | "safe-buffer": "5.1.1" 2978 | } 2979 | }, 2980 | "randomfill": { 2981 | "version": "1.0.3", 2982 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", 2983 | "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", 2984 | "dev": true, 2985 | "requires": { 2986 | "randombytes": "2.0.5", 2987 | "safe-buffer": "5.1.1" 2988 | } 2989 | }, 2990 | "range-parser": { 2991 | "version": "1.2.0", 2992 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2993 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 2994 | "dev": true 2995 | }, 2996 | "read-only-stream": { 2997 | "version": "1.1.1", 2998 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-1.1.1.tgz", 2999 | "integrity": "sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E=", 3000 | "dev": true, 3001 | "requires": { 3002 | "readable-stream": "1.1.14", 3003 | "readable-wrap": "1.0.0" 3004 | } 3005 | }, 3006 | "readable-stream": { 3007 | "version": "1.1.14", 3008 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 3009 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 3010 | "dev": true, 3011 | "requires": { 3012 | "core-util-is": "1.0.2", 3013 | "inherits": "2.0.3", 3014 | "isarray": "0.0.1", 3015 | "string_decoder": "0.10.31" 3016 | } 3017 | }, 3018 | "readable-wrap": { 3019 | "version": "1.0.0", 3020 | "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", 3021 | "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", 3022 | "dev": true, 3023 | "requires": { 3024 | "readable-stream": "1.1.14" 3025 | } 3026 | }, 3027 | "readdirp": { 3028 | "version": "2.1.0", 3029 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 3030 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 3031 | "dev": true, 3032 | "requires": { 3033 | "graceful-fs": "4.1.11", 3034 | "minimatch": "3.0.4", 3035 | "readable-stream": "2.3.3", 3036 | "set-immediate-shim": "1.0.1" 3037 | }, 3038 | "dependencies": { 3039 | "isarray": { 3040 | "version": "1.0.0", 3041 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3042 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3043 | "dev": true 3044 | }, 3045 | "minimatch": { 3046 | "version": "3.0.4", 3047 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 3048 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 3049 | "dev": true, 3050 | "requires": { 3051 | "brace-expansion": "1.1.8" 3052 | } 3053 | }, 3054 | "readable-stream": { 3055 | "version": "2.3.3", 3056 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 3057 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 3058 | "dev": true, 3059 | "requires": { 3060 | "core-util-is": "1.0.2", 3061 | "inherits": "2.0.3", 3062 | "isarray": "1.0.0", 3063 | "process-nextick-args": "1.0.7", 3064 | "safe-buffer": "5.1.1", 3065 | "string_decoder": "1.0.3", 3066 | "util-deprecate": "1.0.2" 3067 | } 3068 | }, 3069 | "string_decoder": { 3070 | "version": "1.0.3", 3071 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 3072 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 3073 | "dev": true, 3074 | "requires": { 3075 | "safe-buffer": "5.1.1" 3076 | } 3077 | } 3078 | } 3079 | }, 3080 | "recast": { 3081 | "version": "0.10.33", 3082 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", 3083 | "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", 3084 | "dev": true, 3085 | "requires": { 3086 | "ast-types": "0.8.12", 3087 | "esprima-fb": "15001.1001.0-dev-harmony-fb", 3088 | "private": "0.1.8", 3089 | "source-map": "0.5.7" 3090 | }, 3091 | "dependencies": { 3092 | "ast-types": { 3093 | "version": "0.8.12", 3094 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", 3095 | "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", 3096 | "dev": true 3097 | } 3098 | } 3099 | }, 3100 | "regenerate": { 3101 | "version": "1.3.3", 3102 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", 3103 | "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", 3104 | "dev": true 3105 | }, 3106 | "regenerator": { 3107 | "version": "0.8.40", 3108 | "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", 3109 | "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", 3110 | "dev": true, 3111 | "requires": { 3112 | "commoner": "0.10.8", 3113 | "defs": "1.1.1", 3114 | "esprima-fb": "15001.1001.0-dev-harmony-fb", 3115 | "private": "0.1.8", 3116 | "recast": "0.10.33", 3117 | "through": "2.3.8" 3118 | } 3119 | }, 3120 | "regex-cache": { 3121 | "version": "0.4.4", 3122 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 3123 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 3124 | "dev": true, 3125 | "requires": { 3126 | "is-equal-shallow": "0.1.3" 3127 | } 3128 | }, 3129 | "regexpu": { 3130 | "version": "1.3.0", 3131 | "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", 3132 | "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", 3133 | "dev": true, 3134 | "requires": { 3135 | "esprima": "2.7.3", 3136 | "recast": "0.10.33", 3137 | "regenerate": "1.3.3", 3138 | "regjsgen": "0.2.0", 3139 | "regjsparser": "0.1.5" 3140 | }, 3141 | "dependencies": { 3142 | "esprima": { 3143 | "version": "2.7.3", 3144 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 3145 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 3146 | "dev": true 3147 | } 3148 | } 3149 | }, 3150 | "regjsgen": { 3151 | "version": "0.2.0", 3152 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 3153 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 3154 | "dev": true 3155 | }, 3156 | "regjsparser": { 3157 | "version": "0.1.5", 3158 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 3159 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 3160 | "dev": true, 3161 | "requires": { 3162 | "jsesc": "0.5.0" 3163 | } 3164 | }, 3165 | "remove-trailing-separator": { 3166 | "version": "1.1.0", 3167 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 3168 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 3169 | "dev": true 3170 | }, 3171 | "repeat-element": { 3172 | "version": "1.1.2", 3173 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 3174 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 3175 | "dev": true 3176 | }, 3177 | "repeat-string": { 3178 | "version": "1.6.1", 3179 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 3180 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 3181 | "dev": true 3182 | }, 3183 | "repeating": { 3184 | "version": "1.1.3", 3185 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", 3186 | "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", 3187 | "dev": true, 3188 | "requires": { 3189 | "is-finite": "1.0.2" 3190 | } 3191 | }, 3192 | "resolve": { 3193 | "version": "1.5.0", 3194 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 3195 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 3196 | "dev": true, 3197 | "requires": { 3198 | "path-parse": "1.0.5" 3199 | } 3200 | }, 3201 | "right-align": { 3202 | "version": "0.1.3", 3203 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 3204 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 3205 | "dev": true, 3206 | "requires": { 3207 | "align-text": "0.1.4" 3208 | } 3209 | }, 3210 | "ripemd160": { 3211 | "version": "2.0.1", 3212 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", 3213 | "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", 3214 | "dev": true, 3215 | "requires": { 3216 | "hash-base": "2.0.2", 3217 | "inherits": "2.0.3" 3218 | } 3219 | }, 3220 | "safe-buffer": { 3221 | "version": "5.1.1", 3222 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 3223 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 3224 | "dev": true 3225 | }, 3226 | "send": { 3227 | "version": "0.16.1", 3228 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", 3229 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", 3230 | "dev": true, 3231 | "requires": { 3232 | "debug": "2.6.9", 3233 | "depd": "1.1.1", 3234 | "destroy": "1.0.4", 3235 | "encodeurl": "1.0.1", 3236 | "escape-html": "1.0.3", 3237 | "etag": "1.8.1", 3238 | "fresh": "0.5.2", 3239 | "http-errors": "1.6.2", 3240 | "mime": "1.4.1", 3241 | "ms": "2.0.0", 3242 | "on-finished": "2.3.0", 3243 | "range-parser": "1.2.0", 3244 | "statuses": "1.3.1" 3245 | } 3246 | }, 3247 | "serve-static": { 3248 | "version": "1.13.1", 3249 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", 3250 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", 3251 | "dev": true, 3252 | "requires": { 3253 | "encodeurl": "1.0.1", 3254 | "escape-html": "1.0.3", 3255 | "parseurl": "1.3.2", 3256 | "send": "0.16.1" 3257 | } 3258 | }, 3259 | "set-immediate-shim": { 3260 | "version": "1.0.1", 3261 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 3262 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 3263 | "dev": true 3264 | }, 3265 | "setprototypeof": { 3266 | "version": "1.0.3", 3267 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 3268 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", 3269 | "dev": true 3270 | }, 3271 | "sha.js": { 3272 | "version": "2.4.9", 3273 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", 3274 | "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", 3275 | "dev": true, 3276 | "requires": { 3277 | "inherits": "2.0.3", 3278 | "safe-buffer": "5.1.1" 3279 | } 3280 | }, 3281 | "shasum": { 3282 | "version": "1.0.2", 3283 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 3284 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 3285 | "dev": true, 3286 | "requires": { 3287 | "json-stable-stringify": "0.0.1", 3288 | "sha.js": "2.4.9" 3289 | } 3290 | }, 3291 | "shebang-regex": { 3292 | "version": "1.0.0", 3293 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 3294 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3295 | "dev": true 3296 | }, 3297 | "shell-quote": { 3298 | "version": "0.0.1", 3299 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", 3300 | "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=", 3301 | "dev": true 3302 | }, 3303 | "simple-fmt": { 3304 | "version": "0.1.0", 3305 | "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", 3306 | "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", 3307 | "dev": true 3308 | }, 3309 | "simple-is": { 3310 | "version": "0.2.0", 3311 | "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", 3312 | "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", 3313 | "dev": true 3314 | }, 3315 | "slash": { 3316 | "version": "1.0.0", 3317 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 3318 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", 3319 | "dev": true 3320 | }, 3321 | "source-map": { 3322 | "version": "0.5.7", 3323 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 3324 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 3325 | "dev": true 3326 | }, 3327 | "source-map-support": { 3328 | "version": "0.2.10", 3329 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", 3330 | "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", 3331 | "dev": true, 3332 | "requires": { 3333 | "source-map": "0.1.32" 3334 | }, 3335 | "dependencies": { 3336 | "source-map": { 3337 | "version": "0.1.32", 3338 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", 3339 | "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", 3340 | "dev": true, 3341 | "requires": { 3342 | "amdefine": "1.0.1" 3343 | } 3344 | } 3345 | } 3346 | }, 3347 | "stable": { 3348 | "version": "0.1.6", 3349 | "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", 3350 | "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", 3351 | "dev": true 3352 | }, 3353 | "statuses": { 3354 | "version": "1.3.1", 3355 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 3356 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", 3357 | "dev": true 3358 | }, 3359 | "stream-browserify": { 3360 | "version": "1.0.0", 3361 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", 3362 | "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", 3363 | "dev": true, 3364 | "requires": { 3365 | "inherits": "2.0.3", 3366 | "readable-stream": "1.1.14" 3367 | } 3368 | }, 3369 | "stream-combiner2": { 3370 | "version": "1.0.2", 3371 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", 3372 | "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", 3373 | "dev": true, 3374 | "requires": { 3375 | "duplexer2": "0.0.2", 3376 | "through2": "0.5.1" 3377 | }, 3378 | "dependencies": { 3379 | "readable-stream": { 3380 | "version": "1.0.34", 3381 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 3382 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 3383 | "dev": true, 3384 | "requires": { 3385 | "core-util-is": "1.0.2", 3386 | "inherits": "2.0.3", 3387 | "isarray": "0.0.1", 3388 | "string_decoder": "0.10.31" 3389 | } 3390 | }, 3391 | "through2": { 3392 | "version": "0.5.1", 3393 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", 3394 | "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", 3395 | "dev": true, 3396 | "requires": { 3397 | "readable-stream": "1.0.34", 3398 | "xtend": "3.0.0" 3399 | } 3400 | }, 3401 | "xtend": { 3402 | "version": "3.0.0", 3403 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", 3404 | "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", 3405 | "dev": true 3406 | } 3407 | } 3408 | }, 3409 | "stream-http": { 3410 | "version": "2.7.2", 3411 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", 3412 | "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", 3413 | "dev": true, 3414 | "requires": { 3415 | "builtin-status-codes": "3.0.0", 3416 | "inherits": "2.0.3", 3417 | "readable-stream": "2.3.3", 3418 | "to-arraybuffer": "1.0.1", 3419 | "xtend": "4.0.1" 3420 | }, 3421 | "dependencies": { 3422 | "isarray": { 3423 | "version": "1.0.0", 3424 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3425 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3426 | "dev": true 3427 | }, 3428 | "readable-stream": { 3429 | "version": "2.3.3", 3430 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 3431 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 3432 | "dev": true, 3433 | "requires": { 3434 | "core-util-is": "1.0.2", 3435 | "inherits": "2.0.3", 3436 | "isarray": "1.0.0", 3437 | "process-nextick-args": "1.0.7", 3438 | "safe-buffer": "5.1.1", 3439 | "string_decoder": "1.0.3", 3440 | "util-deprecate": "1.0.2" 3441 | } 3442 | }, 3443 | "string_decoder": { 3444 | "version": "1.0.3", 3445 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 3446 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 3447 | "dev": true, 3448 | "requires": { 3449 | "safe-buffer": "5.1.1" 3450 | } 3451 | } 3452 | } 3453 | }, 3454 | "stream-splicer": { 3455 | "version": "1.3.2", 3456 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", 3457 | "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", 3458 | "dev": true, 3459 | "requires": { 3460 | "indexof": "0.0.1", 3461 | "inherits": "2.0.3", 3462 | "isarray": "0.0.1", 3463 | "readable-stream": "1.1.14", 3464 | "readable-wrap": "1.0.0", 3465 | "through2": "1.1.1" 3466 | } 3467 | }, 3468 | "string_decoder": { 3469 | "version": "0.10.31", 3470 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 3471 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 3472 | "dev": true 3473 | }, 3474 | "stringmap": { 3475 | "version": "0.2.2", 3476 | "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", 3477 | "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", 3478 | "dev": true 3479 | }, 3480 | "stringset": { 3481 | "version": "0.2.1", 3482 | "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", 3483 | "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", 3484 | "dev": true 3485 | }, 3486 | "strip-ansi": { 3487 | "version": "3.0.1", 3488 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3489 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3490 | "dev": true, 3491 | "requires": { 3492 | "ansi-regex": "2.1.1" 3493 | } 3494 | }, 3495 | "subarg": { 3496 | "version": "1.0.0", 3497 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 3498 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 3499 | "dev": true, 3500 | "requires": { 3501 | "minimist": "1.2.0" 3502 | } 3503 | }, 3504 | "supports-color": { 3505 | "version": "2.0.0", 3506 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 3507 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 3508 | "dev": true 3509 | }, 3510 | "syntax-error": { 3511 | "version": "1.3.0", 3512 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", 3513 | "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", 3514 | "dev": true, 3515 | "requires": { 3516 | "acorn": "4.0.13" 3517 | } 3518 | }, 3519 | "through": { 3520 | "version": "2.3.8", 3521 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3522 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3523 | "dev": true 3524 | }, 3525 | "through2": { 3526 | "version": "1.1.1", 3527 | "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", 3528 | "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", 3529 | "dev": true, 3530 | "requires": { 3531 | "readable-stream": "1.1.14", 3532 | "xtend": "4.0.1" 3533 | } 3534 | }, 3535 | "timers-browserify": { 3536 | "version": "1.4.2", 3537 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 3538 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 3539 | "dev": true, 3540 | "requires": { 3541 | "process": "0.11.10" 3542 | } 3543 | }, 3544 | "to-arraybuffer": { 3545 | "version": "1.0.1", 3546 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 3547 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 3548 | "dev": true 3549 | }, 3550 | "to-fast-properties": { 3551 | "version": "1.0.3", 3552 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 3553 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 3554 | "dev": true 3555 | }, 3556 | "trim-right": { 3557 | "version": "1.0.1", 3558 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 3559 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 3560 | "dev": true 3561 | }, 3562 | "try-resolve": { 3563 | "version": "1.0.1", 3564 | "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", 3565 | "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", 3566 | "dev": true 3567 | }, 3568 | "tryor": { 3569 | "version": "0.1.2", 3570 | "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", 3571 | "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", 3572 | "dev": true 3573 | }, 3574 | "tty-browserify": { 3575 | "version": "0.0.0", 3576 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 3577 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 3578 | "dev": true 3579 | }, 3580 | "typedarray": { 3581 | "version": "0.0.6", 3582 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3583 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 3584 | "dev": true 3585 | }, 3586 | "umd": { 3587 | "version": "3.0.1", 3588 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", 3589 | "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", 3590 | "dev": true 3591 | }, 3592 | "unpipe": { 3593 | "version": "1.0.0", 3594 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3595 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 3596 | "dev": true 3597 | }, 3598 | "url": { 3599 | "version": "0.10.3", 3600 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 3601 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 3602 | "dev": true, 3603 | "requires": { 3604 | "punycode": "1.3.2", 3605 | "querystring": "0.2.0" 3606 | }, 3607 | "dependencies": { 3608 | "punycode": { 3609 | "version": "1.3.2", 3610 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 3611 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 3612 | "dev": true 3613 | } 3614 | } 3615 | }, 3616 | "user-home": { 3617 | "version": "1.1.1", 3618 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 3619 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 3620 | "dev": true 3621 | }, 3622 | "util": { 3623 | "version": "0.10.3", 3624 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 3625 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 3626 | "dev": true, 3627 | "requires": { 3628 | "inherits": "2.0.1" 3629 | }, 3630 | "dependencies": { 3631 | "inherits": { 3632 | "version": "2.0.1", 3633 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 3634 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 3635 | "dev": true 3636 | } 3637 | } 3638 | }, 3639 | "util-deprecate": { 3640 | "version": "1.0.2", 3641 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3642 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3643 | "dev": true 3644 | }, 3645 | "utils-merge": { 3646 | "version": "1.0.1", 3647 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3648 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 3649 | "dev": true 3650 | }, 3651 | "vm-browserify": { 3652 | "version": "0.0.4", 3653 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 3654 | "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", 3655 | "dev": true, 3656 | "requires": { 3657 | "indexof": "0.0.1" 3658 | } 3659 | }, 3660 | "watchify": { 3661 | "version": "3.9.0", 3662 | "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", 3663 | "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", 3664 | "dev": true, 3665 | "requires": { 3666 | "anymatch": "1.3.2", 3667 | "browserify": "14.5.0", 3668 | "chokidar": "1.7.0", 3669 | "defined": "1.0.0", 3670 | "outpipe": "1.1.1", 3671 | "through2": "2.0.3", 3672 | "xtend": "4.0.1" 3673 | }, 3674 | "dependencies": { 3675 | "assert": { 3676 | "version": "1.4.1", 3677 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", 3678 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", 3679 | "dev": true, 3680 | "requires": { 3681 | "util": "0.10.3" 3682 | } 3683 | }, 3684 | "base64-js": { 3685 | "version": "1.2.1", 3686 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", 3687 | "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", 3688 | "dev": true 3689 | }, 3690 | "browser-pack": { 3691 | "version": "6.0.2", 3692 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", 3693 | "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", 3694 | "dev": true, 3695 | "requires": { 3696 | "JSONStream": "1.3.1", 3697 | "combine-source-map": "0.7.2", 3698 | "defined": "1.0.0", 3699 | "through2": "2.0.3", 3700 | "umd": "3.0.1" 3701 | } 3702 | }, 3703 | "browserify": { 3704 | "version": "14.5.0", 3705 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", 3706 | "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", 3707 | "dev": true, 3708 | "requires": { 3709 | "JSONStream": "1.3.1", 3710 | "assert": "1.4.1", 3711 | "browser-pack": "6.0.2", 3712 | "browser-resolve": "1.11.2", 3713 | "browserify-zlib": "0.2.0", 3714 | "buffer": "5.0.8", 3715 | "cached-path-relative": "1.0.1", 3716 | "concat-stream": "1.5.2", 3717 | "console-browserify": "1.1.0", 3718 | "constants-browserify": "1.0.0", 3719 | "crypto-browserify": "3.12.0", 3720 | "defined": "1.0.0", 3721 | "deps-sort": "2.0.0", 3722 | "domain-browser": "1.1.7", 3723 | "duplexer2": "0.1.4", 3724 | "events": "1.1.1", 3725 | "glob": "7.1.2", 3726 | "has": "1.0.1", 3727 | "htmlescape": "1.1.1", 3728 | "https-browserify": "1.0.0", 3729 | "inherits": "2.0.3", 3730 | "insert-module-globals": "7.0.1", 3731 | "labeled-stream-splicer": "2.0.0", 3732 | "module-deps": "4.1.1", 3733 | "os-browserify": "0.3.0", 3734 | "parents": "1.0.1", 3735 | "path-browserify": "0.0.0", 3736 | "process": "0.11.10", 3737 | "punycode": "1.4.1", 3738 | "querystring-es3": "0.2.1", 3739 | "read-only-stream": "2.0.0", 3740 | "readable-stream": "2.3.3", 3741 | "resolve": "1.5.0", 3742 | "shasum": "1.0.2", 3743 | "shell-quote": "1.6.1", 3744 | "stream-browserify": "2.0.1", 3745 | "stream-http": "2.7.2", 3746 | "string_decoder": "1.0.3", 3747 | "subarg": "1.0.0", 3748 | "syntax-error": "1.3.0", 3749 | "through2": "2.0.3", 3750 | "timers-browserify": "1.4.2", 3751 | "tty-browserify": "0.0.0", 3752 | "url": "0.11.0", 3753 | "util": "0.10.3", 3754 | "vm-browserify": "0.0.4", 3755 | "xtend": "4.0.1" 3756 | } 3757 | }, 3758 | "browserify-zlib": { 3759 | "version": "0.2.0", 3760 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 3761 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 3762 | "dev": true, 3763 | "requires": { 3764 | "pako": "1.0.6" 3765 | } 3766 | }, 3767 | "buffer": { 3768 | "version": "5.0.8", 3769 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", 3770 | "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", 3771 | "dev": true, 3772 | "requires": { 3773 | "base64-js": "1.2.1", 3774 | "ieee754": "1.1.8" 3775 | } 3776 | }, 3777 | "combine-source-map": { 3778 | "version": "0.7.2", 3779 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", 3780 | "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", 3781 | "dev": true, 3782 | "requires": { 3783 | "convert-source-map": "1.1.3", 3784 | "inline-source-map": "0.6.2", 3785 | "lodash.memoize": "3.0.4", 3786 | "source-map": "0.5.7" 3787 | } 3788 | }, 3789 | "concat-stream": { 3790 | "version": "1.5.2", 3791 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", 3792 | "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", 3793 | "dev": true, 3794 | "requires": { 3795 | "inherits": "2.0.3", 3796 | "readable-stream": "2.0.6", 3797 | "typedarray": "0.0.6" 3798 | }, 3799 | "dependencies": { 3800 | "readable-stream": { 3801 | "version": "2.0.6", 3802 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 3803 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 3804 | "dev": true, 3805 | "requires": { 3806 | "core-util-is": "1.0.2", 3807 | "inherits": "2.0.3", 3808 | "isarray": "1.0.0", 3809 | "process-nextick-args": "1.0.7", 3810 | "string_decoder": "0.10.31", 3811 | "util-deprecate": "1.0.2" 3812 | } 3813 | }, 3814 | "string_decoder": { 3815 | "version": "0.10.31", 3816 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 3817 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 3818 | "dev": true 3819 | } 3820 | } 3821 | }, 3822 | "constants-browserify": { 3823 | "version": "1.0.0", 3824 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 3825 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 3826 | "dev": true 3827 | }, 3828 | "convert-source-map": { 3829 | "version": "1.1.3", 3830 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 3831 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 3832 | "dev": true 3833 | }, 3834 | "deps-sort": { 3835 | "version": "2.0.0", 3836 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 3837 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 3838 | "dev": true, 3839 | "requires": { 3840 | "JSONStream": "1.3.1", 3841 | "shasum": "1.0.2", 3842 | "subarg": "1.0.0", 3843 | "through2": "2.0.3" 3844 | } 3845 | }, 3846 | "duplexer2": { 3847 | "version": "0.1.4", 3848 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 3849 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 3850 | "dev": true, 3851 | "requires": { 3852 | "readable-stream": "2.3.3" 3853 | } 3854 | }, 3855 | "events": { 3856 | "version": "1.1.1", 3857 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 3858 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 3859 | "dev": true 3860 | }, 3861 | "glob": { 3862 | "version": "7.1.2", 3863 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 3864 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 3865 | "dev": true, 3866 | "requires": { 3867 | "fs.realpath": "1.0.0", 3868 | "inflight": "1.0.6", 3869 | "inherits": "2.0.3", 3870 | "minimatch": "3.0.4", 3871 | "once": "1.4.0", 3872 | "path-is-absolute": "1.0.1" 3873 | } 3874 | }, 3875 | "https-browserify": { 3876 | "version": "1.0.0", 3877 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 3878 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 3879 | "dev": true 3880 | }, 3881 | "inline-source-map": { 3882 | "version": "0.6.2", 3883 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 3884 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 3885 | "dev": true, 3886 | "requires": { 3887 | "source-map": "0.5.7" 3888 | } 3889 | }, 3890 | "insert-module-globals": { 3891 | "version": "7.0.1", 3892 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", 3893 | "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", 3894 | "dev": true, 3895 | "requires": { 3896 | "JSONStream": "1.3.1", 3897 | "combine-source-map": "0.7.2", 3898 | "concat-stream": "1.5.2", 3899 | "is-buffer": "1.1.6", 3900 | "lexical-scope": "1.2.0", 3901 | "process": "0.11.10", 3902 | "through2": "2.0.3", 3903 | "xtend": "4.0.1" 3904 | } 3905 | }, 3906 | "isarray": { 3907 | "version": "1.0.0", 3908 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3909 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 3910 | "dev": true 3911 | }, 3912 | "labeled-stream-splicer": { 3913 | "version": "2.0.0", 3914 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", 3915 | "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", 3916 | "dev": true, 3917 | "requires": { 3918 | "inherits": "2.0.3", 3919 | "isarray": "0.0.1", 3920 | "stream-splicer": "2.0.0" 3921 | }, 3922 | "dependencies": { 3923 | "isarray": { 3924 | "version": "0.0.1", 3925 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 3926 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 3927 | "dev": true 3928 | } 3929 | } 3930 | }, 3931 | "minimatch": { 3932 | "version": "3.0.4", 3933 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 3934 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 3935 | "dev": true, 3936 | "requires": { 3937 | "brace-expansion": "1.1.8" 3938 | } 3939 | }, 3940 | "module-deps": { 3941 | "version": "4.1.1", 3942 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", 3943 | "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", 3944 | "dev": true, 3945 | "requires": { 3946 | "JSONStream": "1.3.1", 3947 | "browser-resolve": "1.11.2", 3948 | "cached-path-relative": "1.0.1", 3949 | "concat-stream": "1.5.2", 3950 | "defined": "1.0.0", 3951 | "detective": "4.5.0", 3952 | "duplexer2": "0.1.4", 3953 | "inherits": "2.0.3", 3954 | "parents": "1.0.1", 3955 | "readable-stream": "2.3.3", 3956 | "resolve": "1.5.0", 3957 | "stream-combiner2": "1.1.1", 3958 | "subarg": "1.0.0", 3959 | "through2": "2.0.3", 3960 | "xtend": "4.0.1" 3961 | } 3962 | }, 3963 | "os-browserify": { 3964 | "version": "0.3.0", 3965 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 3966 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 3967 | "dev": true 3968 | }, 3969 | "pako": { 3970 | "version": "1.0.6", 3971 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", 3972 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", 3973 | "dev": true 3974 | }, 3975 | "read-only-stream": { 3976 | "version": "2.0.0", 3977 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 3978 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 3979 | "dev": true, 3980 | "requires": { 3981 | "readable-stream": "2.3.3" 3982 | } 3983 | }, 3984 | "readable-stream": { 3985 | "version": "2.3.3", 3986 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 3987 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 3988 | "dev": true, 3989 | "requires": { 3990 | "core-util-is": "1.0.2", 3991 | "inherits": "2.0.3", 3992 | "isarray": "1.0.0", 3993 | "process-nextick-args": "1.0.7", 3994 | "safe-buffer": "5.1.1", 3995 | "string_decoder": "1.0.3", 3996 | "util-deprecate": "1.0.2" 3997 | } 3998 | }, 3999 | "shell-quote": { 4000 | "version": "1.6.1", 4001 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 4002 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 4003 | "dev": true, 4004 | "requires": { 4005 | "array-filter": "0.0.1", 4006 | "array-map": "0.0.0", 4007 | "array-reduce": "0.0.0", 4008 | "jsonify": "0.0.0" 4009 | } 4010 | }, 4011 | "stream-browserify": { 4012 | "version": "2.0.1", 4013 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 4014 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 4015 | "dev": true, 4016 | "requires": { 4017 | "inherits": "2.0.3", 4018 | "readable-stream": "2.3.3" 4019 | } 4020 | }, 4021 | "stream-combiner2": { 4022 | "version": "1.1.1", 4023 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 4024 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 4025 | "dev": true, 4026 | "requires": { 4027 | "duplexer2": "0.1.4", 4028 | "readable-stream": "2.3.3" 4029 | } 4030 | }, 4031 | "stream-splicer": { 4032 | "version": "2.0.0", 4033 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", 4034 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", 4035 | "dev": true, 4036 | "requires": { 4037 | "inherits": "2.0.3", 4038 | "readable-stream": "2.3.3" 4039 | } 4040 | }, 4041 | "string_decoder": { 4042 | "version": "1.0.3", 4043 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 4044 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 4045 | "dev": true, 4046 | "requires": { 4047 | "safe-buffer": "5.1.1" 4048 | } 4049 | }, 4050 | "through2": { 4051 | "version": "2.0.3", 4052 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 4053 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 4054 | "dev": true, 4055 | "requires": { 4056 | "readable-stream": "2.3.3", 4057 | "xtend": "4.0.1" 4058 | } 4059 | }, 4060 | "url": { 4061 | "version": "0.11.0", 4062 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 4063 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 4064 | "dev": true, 4065 | "requires": { 4066 | "punycode": "1.3.2", 4067 | "querystring": "0.2.0" 4068 | }, 4069 | "dependencies": { 4070 | "punycode": { 4071 | "version": "1.3.2", 4072 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 4073 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 4074 | "dev": true 4075 | } 4076 | } 4077 | } 4078 | } 4079 | }, 4080 | "window-size": { 4081 | "version": "0.1.4", 4082 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 4083 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", 4084 | "dev": true 4085 | }, 4086 | "wordwrap": { 4087 | "version": "0.0.2", 4088 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 4089 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 4090 | "dev": true 4091 | }, 4092 | "wrappy": { 4093 | "version": "1.0.2", 4094 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4095 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 4096 | "dev": true 4097 | }, 4098 | "xtend": { 4099 | "version": "4.0.1", 4100 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 4101 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 4102 | "dev": true 4103 | }, 4104 | "y18n": { 4105 | "version": "3.2.1", 4106 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 4107 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 4108 | "dev": true 4109 | }, 4110 | "yargs": { 4111 | "version": "3.27.0", 4112 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", 4113 | "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", 4114 | "dev": true, 4115 | "requires": { 4116 | "camelcase": "1.2.1", 4117 | "cliui": "2.1.0", 4118 | "decamelize": "1.2.0", 4119 | "os-locale": "1.4.0", 4120 | "window-size": "0.1.4", 4121 | "y18n": "3.2.1" 4122 | } 4123 | } 4124 | } 4125 | } 4126 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bluetooth-websocket-api", 3 | "description": "Bluetooth Websocket API - a JavaScript library that provides a simple WebSocket API to find, connect and interact with Bluetooth devices.", 4 | "homepage": "https://www.high-mobility.com/", 5 | "version": "0.0.1", 6 | "author": { 7 | "name": "High-Mobility GmbH.", 8 | "email": "code@high-mobility.com" 9 | }, 10 | "keywords": [ 11 | "Bluetooth", 12 | "WebBluetooth", 13 | "web-bluetooth", 14 | "WebSocket", 15 | "ble", 16 | "IoT" 17 | ], 18 | "repository": { 19 | "type": "git", 20 | "url": "git://github.com/highmobility/bluetooth-websocket-api.git" 21 | }, 22 | "bugs": { 23 | "url": "https://github.com/highmobility/bluetooth-websocket-api/issues" 24 | }, 25 | "licenses": [ 26 | { 27 | "type": "MIT", 28 | "url": "https://github.com/highmobility/bluetooth-websocket-api/blob/master/LICENCE" 29 | } 30 | ], 31 | "main": "index.js", 32 | "engines": { 33 | "node": ">= 5.4.0" 34 | }, 35 | "scripts": { 36 | "build": "browserify --entry app/app.js -t babelify --outfile dist/app.js -d --s app", 37 | "watch:js": "watchify --entry app/app.js -t babelify --outfile dist/app.js -d --s app -v" 38 | }, 39 | "devDependencies": { 40 | "babelify": "^6.1.2", 41 | "browserify": "^10.2.4", 42 | "connect": "^3.4.1", 43 | "morgan": "^1.7.0", 44 | "phoenix-js": "^1.0.3", 45 | "serve-static": "^1.10.2", 46 | "watchify": "^3.7.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const https = require('https'); 2 | const fs = require('fs'); 3 | const connect = require('connect'); 4 | const logger = require('morgan'); 5 | const serveStatic = require('serve-static'); 6 | 7 | const options = { 8 | cert: fs.readFileSync('./keys/localhost.cert'), 9 | key: fs.readFileSync('./keys/localhost.key') 10 | }; 11 | 12 | const app = connect() 13 | .use(logger('dev')) 14 | .use(serveStatic(process.cwd())) 15 | 16 | https.createServer(options, app).listen(3000); 17 | -------------------------------------------------------------------------------- /socket_messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/highmobility/bluetooth-websocket-api/8b5d03ea6d42a9aa408a47bba0c85579214d9055/socket_messages.png --------------------------------------------------------------------------------