From 2e57558ef4063b94dcdcc23ab8969379a1692afc Mon Sep 17 00:00:00 2001 From: Wynne Crisman Date: Mon, 7 Oct 2019 15:51:50 -0700 Subject: [PATCH] Prototyped the barcode idea; Added a basic production system. --- .meteor/packages | 7 +- .meteor/versions | 35 +- README.md | 62 +- client/client.js | 1 + client/head.html | 1 + client/main.css | 4195 +++++++++++++++++++++++ client/main.styl | 4 +- imports/api/Barcode.js | 81 + imports/api/Batch.js | 265 ++ imports/api/Label.js | 130 + imports/api/Measure.js | 7 + imports/api/Product.js | 8 +- imports/api/ProductTag.js | 7 + imports/api/SalesSheet.js | 7 + imports/api/Venue.js | 7 + imports/api/Worker.js | 11 +- imports/api/index.js | 18 +- imports/startup/client/routes.js | 7 + imports/ui/Label.html | 51 +- imports/ui/Label.import.styl | 236 +- imports/ui/Label.js | 439 ++- imports/ui/PrintLabel.html | 19 + imports/ui/PrintLabel.import.css | 85 + imports/ui/PrintLabel.import.styl | 92 + imports/ui/PrintLabel.js | 32 + imports/ui/Production.html | 133 +- imports/ui/Production.import.styl | 192 +- imports/ui/Production.js | 444 +++ imports/ui/Products.html | 12 +- imports/ui/Products.import.styl | 8 +- imports/ui/Products.js | 62 +- imports/ui/layouts/Body.html | 43 +- imports/ui/layouts/Body.import.styl | 387 ++- imports/ui/layouts/Empty.html | 3 + imports/ui/layouts/Empty.js | 2 + imports/util/qrcode/README.md | 46 + imports/util/qrcode/qrcode.js | 616 ++++ imports/util/qrcode/qrcode.min.js | 1 + package-lock.json | 1619 +++++++-- package.json | 16 +- public/JsBarcode.all.min.js | 3 + public/LabelPrint.css | 106 + public/StaticTest.html | 1 + public/images/3x2 Label Logo BW.svg | 64 + public/images/3x2 Label Logo2 BW.svg | 90 + public/images/3x2 Label Logo3 BW.svg | 66 + public/images/Logo_0.8x0.73_300ppi.png | Bin 0 -> 39040 bytes public/images/Petit Teton Logo Only.png | Bin 0 -> 132482 bytes public/jquery-3.4.1.min.js | 2 + server/server.js | 8 + 50 files changed, 8949 insertions(+), 782 deletions(-) create mode 100644 client/main.css create mode 100644 imports/api/Barcode.js create mode 100644 imports/api/Batch.js create mode 100644 imports/api/Label.js create mode 100644 imports/ui/PrintLabel.html create mode 100644 imports/ui/PrintLabel.import.css create mode 100644 imports/ui/PrintLabel.import.styl create mode 100644 imports/ui/PrintLabel.js create mode 100644 imports/ui/layouts/Empty.html create mode 100644 imports/ui/layouts/Empty.js create mode 100644 imports/util/qrcode/README.md create mode 100644 imports/util/qrcode/qrcode.js create mode 100644 imports/util/qrcode/qrcode.min.js create mode 100644 public/JsBarcode.all.min.js create mode 100644 public/LabelPrint.css create mode 100644 public/StaticTest.html create mode 100644 public/images/3x2 Label Logo BW.svg create mode 100644 public/images/3x2 Label Logo2 BW.svg create mode 100644 public/images/3x2 Label Logo3 BW.svg create mode 100644 public/images/Logo_0.8x0.73_300ppi.png create mode 100644 public/images/Petit Teton Logo Only.png create mode 100644 public/jquery-3.4.1.min.js diff --git a/.meteor/packages b/.meteor/packages index da820fd..a7c0206 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -33,8 +33,8 @@ arillo:flow-router-helpers # Provides various template helpers such as {{pathFo #tomwasd:flow-router-seo kadira:blaze-layout -shell-server@0.4.0 # ??? -meteortoys:allthings +#shell-server@0.4.0 # ??? +#meteortoys:allthings stylus@2.513.13 session@1.2.0 ##browser-policy # Adds support for specifying browser level security rules related to content and what's allowed to laod on the page. @@ -55,7 +55,7 @@ aldeed:collection2 #twbs:bootstrap # Requires jquery 1.9-2.x, not 3+ fortawesome:fontawesome momentjs:moment -mizzao:bootboxjs # ??? +#mizzao:bootboxjs # ??? aldeed:template-extension juliancwirko:s-alert # Client error/alert handling jcbernack:reactive-aggregate # Allows us to create a new client collection (from the server) with the contents being an aggregate of server data. Note that aggregation can only be done on the server currently as mini-mongo does not support it. @@ -66,3 +66,4 @@ markdown@1.0.12 wcrisman:jquery-custom-scrollbar underscore@1.0.10 meteorhacks:aggregate # Allows databaseName.aggragate(pipeline) calls the exact same way you would on the command line in the mongo tool. +babrahams:constellation diff --git a/.meteor/versions b/.meteor/versions index 424b559..ccce0d4 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -12,6 +12,9 @@ arillo:flow-router-helpers@0.5.2 autoupdate@1.6.0 babel-compiler@7.3.4 babel-runtime@1.3.0 +babrahams:constellation@0.4.10 +babrahams:editable-json@0.6.5 +babrahams:temple@0.4.7 base64@1.0.12 binary-heap@1.0.11 blaze@2.3.3 @@ -23,6 +26,14 @@ caching-html-compiler@1.1.3 callback-hook@1.1.0 check@1.3.1 coffeescript@1.0.17 +constellation:autopublish@0.4.7 +constellation:console@1.4.7 +constellation:plugins@0.4.9 +constellation:position@0.4.7 +constellation:session@0.4.7 +constellation:subscriptions@0.4.7 +constellation:tiny@0.4.7 +dburles:mongo-collection-instances@0.3.5 ddp@1.4.0 ddp-client@2.3.3 ddp-common@1.4.0 @@ -41,6 +52,8 @@ es5-shim@4.8.0 fetch@0.1.1 fortawesome:fontawesome@4.7.0 geojson-utils@1.0.10 +gwendall:body-events@0.1.6 +gwendall:session-json@0.1.7 hot-code-push@1.0.4 html-tools@1.0.11 htmljs@1.0.11 @@ -52,6 +65,7 @@ jquery@1.11.11 juliancwirko:s-alert@3.2.0 kadira:blaze-layout@2.3.0 kadira:flow-router@2.12.1 +lai:collection-extensions@0.2.1_1 launch-screen@1.1.1 livedata@1.0.18 localstorage@1.2.0 @@ -62,27 +76,9 @@ meteor@1.9.3 meteor-base@1.4.0 meteorhacks:aggregate@1.3.0 meteorhacks:collection-utils@1.2.0 -meteortoys:allthings@4.0.0 -meteortoys:authenticate@4.0.0 -meteortoys:autopub@4.0.0 -meteortoys:blueprint@4.0.0 -meteortoys:email@4.0.0 -meteortoys:hotreload@4.0.0 -meteortoys:listen@4.0.0 -meteortoys:method@4.0.0 -meteortoys:mobile@4.0.0 -meteortoys:pub@4.0.0 -meteortoys:result@4.0.0 -meteortoys:shell@4.0.0 -meteortoys:status@4.0.0 -meteortoys:sub@4.0.0 -meteortoys:throttle@4.0.0 -meteortoys:toggle@4.0.0 -meteortoys:toykit@4.0.2 minifier-css@1.4.2 minifier-js@2.4.1 minimongo@1.4.5 -mizzao:bootboxjs@4.4.0 mobile-experience@1.0.5 mobile-status-bar@1.0.14 modern-browsers@0.1.4 @@ -94,8 +90,6 @@ mongo-decimal@0.1.1 mongo-dev-server@1.1.0 mongo-id@1.0.7 mongo-livedata@1.0.12 -msavin:jetsetter@4.0.0 -msavin:mongol@4.0.1 npm-bcrypt@0.9.3 npm-mongo@3.1.2 observe-sequence@1.0.16 @@ -115,7 +109,6 @@ routepolicy@1.1.0 service-configuration@1.0.11 session@1.2.0 sha@1.0.9 -shell-server@0.4.0 socket-stream-client@0.2.2 softwarerero:accounts-t9n@1.3.11 spacebars@1.0.15 diff --git a/README.md b/README.md index 6d2f85f..525d0f5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,22 @@ -# Petit Teton Data Management Application (PTApp) +# Current Configuration + +See below for initial setup and updating instructions. + +Currently we have three servers in two locations. Media and FS2 are computers residing on the 18501 property (big barn back top room, and Wynne/Sarah house), and FS1 is a computer residing in SF. All three are accessible via Putty (a windows SSH client - any SSH client will work) via the IP's 192.168.3.101 (Media), 192.168.2.239 (FS1), and 192.168.3.164 (FS2). Note that FS1 is in SF, but is accessible via the LAN because we have a VPN setup between our routers (192.168.3.1, and 192.168.2.1). The VPN makes them look like they are on the same network. + +If you SSH (Putty) into each server you can update the server using APT (`sudo apt update`, followed by `update apt upgrade`), reboot `sudo shutdown -r now`, and perform other maintenance routines. + +**Currently** Media is the primary server for the PTApp (the Meteor Petit Teton Webapp - versus the Petit Teton web site which is a customer focused informational web site). FS2 is the primary server for all other web sites and web apps and it clones its SSL certifications and www folders to the other two machines. Ultimately the PTApp will need to also be on FS2 primarily along with SSL certificates and an Nginx configuration that only allows certain access outside our LAN (for sales interaction at markets and Cam's home access). The database (MongoDB) is installed on all three machines, forming a cluster such that data written to any of the three is propagated to the other two automatically. + +Database backups are not trivial due to the cluster system. Essentially we are doing a simple backup/restore and ignoring the possibility that the database we take from might not have all the latest updates. Doing this on our primary server (FS2) helps ensure that we don't have any problems. MongoDB being a very flexible database and our app not caring too much about data integrity helps as well. + +TODO: Linux update procedure. + +TODO: Backup procedure. + +TODO: Mongo update procedure. + +# Setup Petit Teton Data Management Application (PTApp) This application is designed to track sales and production data. @@ -27,21 +45,22 @@ Package this application by running 'npm run build' from the command line in the 4. Modify the system to always start Mongod: `sudo systemctl enable mongod` 10. Run tools: (see [descriptions](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#packages)) - mongod (the mongo database server) - - mongo (command line shell for interacting with a running db) - - mongoimport (imports data from: Extended JSON, CSV, or TSV formats created by mongoexport or 3rd party tools) - - bsondump (converts bson file formats [binary] into human readable formats [JSON] - use with mongodump files) - - mongodump (produces binary output for backups - not for use with shared clusters and replica sets) - - mongoexport (produces JSON or CSV data) - - mongofiles (command line gridfs integration - for manipulating files) - - mongooplog (replication & polling - ?) - - mongoperf - - mongorestore - - mongostat - - mongotop (stats) + - mongo (command line shell for interacting with a running db) + - mongoimport (imports data from: Extended JSON, CSV, or TSV formats created by mongoexport or 3rd party tools) + - bsondump (converts bson file formats [binary] into human readable formats [JSON] - use with mongodump files) + - mongodump (produces binary output for backups - not for use with shared clusters and replica sets) + - mongoexport (produces JSON or CSV data) + - mongofiles (command line gridfs integration - for manipulating files) + - mongooplog (replication & polling - ?) + - mongoperf + - mongorestore + - mongostat + - mongotop (stats) 11. Install nodejs & npm 1. `sudo apt-get install nodejs` 2. `sudo apt-get install npm` 12. Install n + 1. `sudo npm install -g n` 13. Update nodejs to 4.7.0 (for use with meteor 1.4 - may be another nodejs version for newer meteor versions): `n bin 4.7.0` (may need to first download 4.7.0 - see other docs on linux & nodejs) 1. `sudo n 4.7.0` @@ -93,11 +112,12 @@ Package this application by running 'npm run build' from the command line in the NOTE: Use MongoBooster on a windows development machine to connect to the dev database (localhost:3001) and to export. -#Updating a Meteor Deployment +# Updating a Meteor Deployment (OLD) + 1. Run the NPM script for building the app. This can be done either from Webstorm by viewing the NPM display (shows a list of scripts in the package.json file), or typing `npm run build` from the command line. Alternatively you can simply type the build command in the command line: `meteor build --server-only ../` to build it. The command should exit with code zero for success. 2. Find the archive file: it should be in the parent directory if you ran the above script exactly, otherwise it is where ever you specified (path at the end of the command). It should be called "PetitTetonMeteor.tar.gz" as of the writing of this documentation. -3. Copy the archive to the server. Use what ever tools you want for this, samba and drag and drop works great. Otherwise sftp, or other method also works. -4. Navigate to /var/www/PTApp (or what ever the folder is). +3. Copy the archive to the server (**currently** Media/www/PTApp). Use what ever tools you want for this, samba and drag and drop works great. Otherwise sftp, or other method also works. +4. Navigate to /var/www/PTApp (or what ever the folder is). `cd /var/www/PTApp` 5. Use `sudo tar -xvzf PetitTetonMeteor.tar.gz` to unpack it. 6. Delete the archive (optional): `sudo rm PetitTetonMeteor.tar.gz` 7. Modify the owner of the app: `sudo chown -R www-data bundle` Run this from inside the project directory /var/www/PTApp. @@ -105,23 +125,27 @@ NOTE: Use MongoBooster on a windows development machine to connect to the dev da 9. Optional: Run NPM's install to update the dependancies (if they changed): `cd /var/www/PTApp/bundle/programs/server && npm install && cd /var/www/PTApp` 10. Restart the meteor app: `sudo passenger-config restart-app /var/www/PTApp` -# Updating a Meteor Deployment #2 +# Updating a Meteor Deployment (NEW) 1. Run the NPM script for building the app `npm run build` which will package the app for the selected platform (in the package.json definition for the build script). Can double click the build script in WebStorm's UI for NPM alternatively. Can also manually run the script: `npm install --product && meteor build --architecture os.linux.x86_64 --server-only ../`. This will generate an archive file for the project that is production ready. -2. Copy the archive to the deployment server. Can use Samba for this. I place it in the web folder for the app. +2. Copy the archive to the deployment server (**currently** Media/www/PTApp). Can use Samba for this. I place it in the web folder for the app. 3. Run the deploy.sh script `sudo ./deploy.sh` which exists in the web directory for the app: `/var/www/PTApp`. This will unpack the archive, remove the archive, change file permissions, run NPM's install on the app, and restart the app in Phusion Passenger. 4. Look at the debug output by viewing the html files stored in `/tmp`. Use Samba to view them remotely. 5. Look at the Nginx logs (should be the same as the stuff in /tmp). # Updating a Meteor Deployment *with* a NodeJS and Meteor version change. +Check which version of meteor you have on the development machine (meteor is not installed ever on the production machine). If the version has changed, it may require a newer version of NodeJS. You have to read the Meteor notes for your version (or older versions) to figure out which NodeJS is required. + 1. Update the meteor app as normal (copy it to the /var/www/xxx directory as a build bundle, then run the script to unpack it). 2. Run `sudo n` to get the current version of NodeJS being used. Use `sudo n x.x.x` to download and change to the new version of NodeJS. 3. Edit the app's nginx file in /etc/nginx/sites-available/ to reference the new NodeJS install location. For example my current install location is specified as `server {... passenger_nodejs /usr/local/n/versions/node/8.9.3/bin/node ...}`} +## Running Server Side Code -#Running Server Side Code This is useful for importing data or running scripts that might perform some one time task. + 1. Open a console and enter the server shell for meteor. -#Server Error Handling +## Server Error Handling + Errors are generated in meteor, but handled by passenger. Passenger will log the error on the client screen with a code, and will log the same message in the nginx error logs. The error will be findable in the tmp folder as an html file starting with passenger and ending with the code. This is the place to look for the real error output. \ No newline at end of file diff --git a/client/client.js b/client/client.js index b6c437b..5f413b9 100644 --- a/client/client.js +++ b/client/client.js @@ -14,6 +14,7 @@ import '/imports/util/resize/ResizeSensor.js'; import '/imports/util/resize/ElementQueries.js'; import '/imports/ui/layouts/Body.js'; import '/imports/ui/layouts/Login.js'; +import '/imports/ui/layouts/Empty.js'; import '/imports/ui/accounts/accounts.js'; import '/imports/util/select2/select2.css'; import '/imports/util/select2/select2.full.js'; diff --git a/client/head.html b/client/head.html index cc91107..18e3b3f 100644 --- a/client/head.html +++ b/client/head.html @@ -1,5 +1,6 @@ PT App + diff --git a/client/main.css b/client/main.css new file mode 100644 index 0000000..0931f75 --- /dev/null +++ b/client/main.css @@ -0,0 +1,4195 @@ +* { + -webkit-tap-highlight-color: transparent; + -webkit-font-smoothing: antialiased; +} +*, +*:after, +*:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + margin: 0; +} +html { + scrollbar-face-color: #808080; + scrollbar-highlight-color: #808080; + scrollbar-3dlight-color: #707070; + scrollbar-darkshadow-color: #808080; + scrollbar-shadow-color: #7e7e7e; + scrollbar-arrow-color: #fff; + scrollbar-track-color: #505050; + height: 100%; + min-height: 100%; +} +body { + font-family: verdana, arial, helvetica, sans-serif; + font-size: 12px; + height: 100%; + min-height: 100%; +} +#__blaze-root { + height: 100%; +} +.noselect { + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently not supported by any browser */ +} +.clickable { + cursor: pointer; +} +.nonclickable { + cursor: default; +} +.left { + text-align: left; +} +.right { + text-align: right; +} +.center { + text-align: center; +} +.floatLeft { + float: left; +} +.floatRight { + float: right; +} +.table { + padding: 0; + margin: 0; + border-collapse: collapse; + border: 1px solid #ddddf9; +} +.table > thead > tr > th { + border: 0; + padding: 4px 4px 8px 4px; + vertical-align: top; + color: #fff; + background: #6f6fec; +} +.table > thead > tr > th input { + padding: 2px; + border-radius: 3px; +} +.table > tbody > tr { + border-bottom: 1px solid #aaa; +} +.table > tbody > tr > td { + padding: 4px 4px; +} +.table > tbody > tr.selected { + background-attachment: fixed; + background-repeat: no-repeat; + background-position: 0 0; + background-image: linear-gradient(to left, #e0dcba 70%, #f1da36 100%); +} +.table > tbody > tr:nth-child(odd).selected { + background-attachment: fixed; + background-repeat: no-repeat; + background-position: 0 0; + background-image: linear-gradient(to left, #fcf8d1 70%, #f1da36 100%); +} +.table-striped > tbody > tr:nth-child(even) { + background-color: #f4f4f4; +} +.table-striped > tbody > tr:nth-child(odd) { + background-color: #fff; +} +.table-hover > tbody > tr:hover { + background-color: #ded; +} +.pagination { + text-align: right; + font-size: 15px; + line-height: 34px; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + margin: 0 0 10px 0; + overflow: visible; + white-space: nowrap; + display: inline-block; +} +.pagination span { + padding: 2px 8px 3px 8px; + margin: 0 8px; + border: 2px solid #7b9961; + border-radius: 5px; + background-color: #90b272; + cursor: pointer; + overflow: visible; + whitespace: nowrap; +} +.pagination span:hover { + background-color: #4ca84c; +} +.pagination span:active { + background-color: #3c983c; +} +.pagination span.disabled { + background-color: #ccc; + border-color: #c5c5c5; + color: #fff; + cursor: default; +} +.pagination span.disabled:hover { + background-color: #ccc; +} +.pagination span.disabled:active { + background-color: #ccc; +} +.grid { + overflow: visible !important; + max-width: none !important; +} +.mCSB_1_scrollbar { + z-index: 999; +} +@-webkit-keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-moz-keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-webkit-keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-moz-keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-moz-keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-webkit-keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-o-keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@keyframes neon6 { + from { + text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 30px #fff, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 15px #fff, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-moz-keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-webkit-keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-o-keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@keyframes neon7 { + from { + text-shadow: 0 0 10px #bbb, 0 0 20px #bbb, 0 0 30px #bbb, 0 0 40px #ff00de, 0 0 70px #ff00de, 0 0 80px #ff00de, 0 0 100px #ff00de, 0 0 150px #ff00de; + } + to { + text-shadow: 0 0 5px #bbb, 0 0 10px #bbb, 0 0 15px #bbb, 0 0 20px #ff00de, 0 0 35px #ff00de, 0 0 40px #ff00de, 0 0 50px #ff00de, 0 0 75px #ff00de; + } +} +@-moz-keyframes neon6_drop { + from { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(120%); + } + 50% { + filter: drop-shadow(0px 0px 20px #f00) brightness(80%); + } + to { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(100%); + } +} +@-webkit-keyframes neon6_drop { + from { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(120%); + } + 50% { + filter: drop-shadow(0px 0px 20px #f00) brightness(80%); + } + to { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(100%); + } +} +@-o-keyframes neon6_drop { + from { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(120%); + } + 50% { + filter: drop-shadow(0px 0px 20px #f00) brightness(80%); + } + to { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(100%); + } +} +@keyframes neon6_drop { + from { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(120%); + } + 50% { + filter: drop-shadow(0px 0px 20px #f00) brightness(80%); + } + to { + filter: drop-shadow(0px 0px 20px rgba(194,0,0,0.7)) brightness(100%); + } +} +span.button { + margin: 0 0 0 1px; + padding: 0.5em 1em; + border: 1px solid #d4d4d4; + border-radius: 50em; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer; + outline: none; + background-color: #ececec; + color: #333; + font: 11px/normal sans-serif; + text-shadow: 1px 1px 0 #fff; + text-align: center; + text-decoration: none; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Chrome/Safari/Opera */ + -khtml-user-select: none; /* Konqueror */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently not supported by any browser */ +} +span.button:hover { + color: #00f; +} +span.button:active { + color: #fff; + background-color: #141414; + text-shadow: 1px 1px 0 #000; + border: 1px solid #292929; +} +span.button.primary { + font-weight: 800; +} +span.button.selected { + color: #fff; + background-color: #141414; + text-shadow: 1px 1px 0 #000; + cursor: default; +} +span.buttonGroup :not(:first-child):not(:last-child) { + border-radius: 0; +} +span.buttonGroup :first-child { + border-top-left-radius: 50em; + border-bottom-left-radius: 50em; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-left: 0; +} +span.buttonGroup :last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-top-right-radius: 50em; + border-bottom-right-radius: 50em; +} +section.maxHeightContainer, +div.maxHeightContainer { + display: table; + height: 100%; + width: 100%; +} +section.maxHeightContainer section.maxHeightRow, +div.maxHeightContainer section.maxHeightRow, +section.maxHeightContainer div.maxHeightRow, +div.maxHeightContainer div.maxHeightRow { + display: table-row; +} +section.maxHeightContainer section.maxHeightRow section.maxHeightContent, +div.maxHeightContainer section.maxHeightRow section.maxHeightContent, +section.maxHeightContainer div.maxHeightRow section.maxHeightContent, +div.maxHeightContainer div.maxHeightRow section.maxHeightContent, +section.maxHeightContainer section.maxHeightRow div.maxHeightContent, +div.maxHeightContainer section.maxHeightRow div.maxHeightContent, +section.maxHeightContainer div.maxHeightRow div.maxHeightContent, +div.maxHeightContainer div.maxHeightRow div.maxHeightContent { + display: table-cell; + height: 1px; +} +section.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll, +div.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll, +section.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll, +div.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll, +section.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll, +div.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll, +section.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll, +div.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll { + display: table-cell; + height: 100%; + position: relative; +} +section.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +div.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +section.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +div.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +section.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +div.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +section.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +div.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll section.maxHeightContentScrolled, +section.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +div.maxHeightContainer section.maxHeightRow section.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +section.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +div.maxHeightContainer div.maxHeightRow section.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +section.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +div.maxHeightContainer section.maxHeightRow div.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +section.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll div.maxHeightContentScrolled, +div.maxHeightContainer div.maxHeightRow div.maxHeightContentExpandAndScroll div.maxHeightContentScrolled { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + overflow-y: auto; +} +.vscFixed { + flex: 0 0 auto; + width: 100%; +} +.vscExpand { + flex: 1 1 1px; + width: 100%; +} +.verticalStack { + width: 100%; + height: 100%; + display: flex; + flex-flow: column; + justify-content: flex-start; + align-items: flex-start; + align-content: stretch; +} +.columnContainer { + display: flex; + flex-direction: column; + flex-wrap: wrap; + justify-content: flex-start; + align-items: stretch; + align-content: flex-start; + overflow-x: auto; +} +.columnContent { + flex: none; +} +ul.tabRow { + position: relative; + text-align: left; + list-style: none; + margin: 0; + padding: 0 0 0 10px; + line-height: 24px; + height: 26px; + font-size: 12px; + overflow: hidden; +} +ul.tabRow li { + position: relative; + z-index: 0; + border: 1px solid #aaa; + background: #d1d1d1; + display: inline-block; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + background: -o-linear-gradient(top, #ececec 50%, #d1d1d1 100%); + background: -ms-linear-gradient(top, #ececec 50%, #d1d1d1 100%); + background: -moz-linear-gradient(top, #ececec 50%, #d1d1d1 100%); + background: -webkit-linear-gradient(top, #ececec 50%, #d1d1d1 100%); + background: linear-gradient(top, #ececec 50%, #d1d1d1 100%); + box-shadow: 0 3px 3px rgba(0,0,0,0.4), inset 0 1px 0 #fff; + text-shadow: 0 1px #fff; + margin: 0 -5px; + padding: 0 20px; +} +ul.tabRow li:before, +ul.tabRow li:after { + position: absolute; + bottom: -1px; + width: 5px; + height: 5px; + content: " "; + border: 1px solid #aaa; +} +ul.tabRow li:before { + left: -6px; + border-bottom-right-radius: 6px; + border-width: 0 1px 1px 0; + box-shadow: 2px 2px 0 #d1d1d1; +} +ul.tabRow li:after { + right: -6px; + border-bottom-left-radius: 6px; + border-width: 0 0 1px 1px; + box-shadow: -2px 2px 0 #d1d1d1; +} +ul.tabRow li.selected { + z-index: 2; + background: #fff; + color: #333; + border-bottom-color: #fff; +} +ul.tabRow li.selected:before { + box-shadow: 2px 2px 0 #fff; +} +ul.tabRow li.selected:after { + box-shadow: -2px 2px 0 #fff; +} +ul.tabRow:before { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + border-bottom: 1px solid #aaa; + z-index: 1; + content: " "; +} +.select2-container { + font-size: 10px; +} +.select2-selection { + font-size: 13px; + margin-bottom: 0px; + min-height: 10px !important; + padding-bottom: 2px; +} +input { + padding: 6px; + border-radius: 4px; + border-width: 1px; + border-style: solid; + border-color: #ccc; +} +.form-control, +.select2-selection { + font-size: 14px; + margin-bottom: 0px; +} +.form-group { + margin: 4px 0; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +input[type="date"], +input[type="datetime-local"], +input[type="month"], +input[type="time"], +input[type="week"] { + align-items: center; + -webkit-padding-start: 1px; + overflow: hidden; + padding-left: 10px; +} +input { + -webkit-appearance: textfield; + background-color: #fff; + -webkit-rtl-ordering: logical; + user-select: text; + cursor: auto; + padding: 1px; + border-width: 2px; + border-style: inset; + border-color: initial; + border-image: initial; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +input, +textarea, +keygen, +select, +button { + text-rendering: auto; + color: initial; + letter-spacing: normal; + word-spacing: normal; + text-transform: none; + text-indent: 0px; + text-shadow: none; + display: inline-block; + text-align: start; + margin: 0em 0em 0em 0em; + font: 13.3333px Arial; +} +input, +textarea, +keygen, +select, +button, +meter, +progress { + -webkit-writing-mode: horizontal-tb; +} +.comboList { + z-index: 1000; + max-height: 160px; + overflow-y: auto; + -moz-box-shadow: 0 2px 3px #ccc; + -webkit-box-shadow: 0 2px 3px #ccc; + box-shadow: 0 2px 3px #ccc; + border: 1px solid #d1d1d1; + list-style-type: none; + padding: 0; + margin: 0; + display: none; + background: #fff; +} +.comboList li { + display: block; + padding: 5px 10px; + margin: 0; + text-indent: 0; + background: #fff; +} +.comboList li.selected { + background-color: #ffe184 !important; +} +.comboList li[role='node'] { + font-weight: 800; +} +.comboList li[role='leaf'] { + padding-left: 2em; +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); + box-shadow: inset 0 3px 5px rgba(0,0,0,0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: 0.65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +#mainBody { + margin: 0; + padding: 0; + border: 0; + height: 100%; + width: 100%; +} +@media not print { + #mainBody nav.leftSidebarContainer { + z-index: 999; + position: fixed; + top: 0; + width: 220px; + padding: 0; + height: 100%; + border: 0; + vertical-align: top; + text-align: left; + background-color: #90b272; + background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%); + background: -webkit-linear-gradient(-180deg, #90b272 0%, #4d7727 100%); + background: linear-gradient(180deg, #90b272 0%, #4d7727 100%); + font-size: 14px; + font-weight: 700; + overflow: visible; + margin: 0 0 0 -220px; + -webkit-transition: 0.5s ease-in; + -moz-transition: 0.5s ease-in; + -o-transition: 0.5s ease-in; + -ms-transition: 0.5s ease-in; + transition: 0.5s ease-in; + } + #mainBody nav.leftSidebarContainer .leftSidebarMenuButton { + position: absolute; + right: -30px; + -webkit-transition: 0.5s ease-in; + -moz-transition: 0.5s ease-in; + -o-transition: 0.5s ease-in; + -ms-transition: 0.5s ease-in; + transition: 0.5s ease-in; + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-topright: 5px; + -moz-border-radius-bottomright: 5px; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + color: #000; + font-size: 20px; + line-height: 20px; + font-weight: 900; + text-align: center; + text-decoration: none; + width: 30px; + height: 30px; + padding: 5px 0; + background-color: #90b272; + display: block; + border-top: 1px solid #494; + border-right: 1px solid #494; + border-bottom: 1px solid #494; + } + #mainBody nav.leftSidebarContainer .leftSidebarMenuButton:hover { + color: rgba(150,0,0,0.5); + } + #mainBody nav.generalSidebar .leftSidebarMenuButton { + top: 10px; + } + #mainBody nav.graphsSidebar .leftSidebarMenuButton { + top: 50px; + } + #mainBody nav.settingsSidebar .leftSidebarMenuButton { + top: 90px; + } + #mainBody nav.menuHide .leftSidebarMenuButton { + right: 60px; + } + #mainBody nav.menuShow { + margin: 0; + } + #mainBody nav.menuShow .leftSidebarMenuButton { + right: -15px; + -webkit-transform: rotate(45deg) !important; + -moz-transform: rotate(45deg) !important; + -o-transform: rotate(45deg) !important; + -ms-transform: rotate(45deg) !important; + transform: rotate(45deg) !important; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + border-bottom: 0; + } + #mainBody .leftSidebar { + flex: 0 0 auto; + display: flex; + flex-flow: column; + justify-content: flex-start; + align-items: flex-start; + align-content: stretch; + height: 100%; + border: 0; + vertical-align: top; + padding: 0; + text-align: left; + width: 220px; + background-color: #90b272; + background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%); + background: -webkit-linear-gradient(-180deg, #90b272 0%, #4d7727 100%); + background: linear-gradient(180deg, #90b272 0%, #4d7727 100%); + font-size: 14px; + font-weight: 700; + overflow: hidden; + } + #mainBody .leftSidebar .logoArea { + flex: 0 0 auto; + width: 100%; + } + #mainBody .leftSidebar .logoArea .signOut { + position: absolute; + left: 10px; + top: 10px; + color: #fff; + cursor: pointer; + } + #mainBody .leftSidebar .logoArea .signOut:hover { + color: #bbb; + } + #mainBody .leftSidebar .logoArea .signOut:active { + color: #000; + } + #mainBody .leftSidebar .logoArea .logo { + text-align: center; + margin-top: 20px; + } + #mainBody .leftSidebar .logoArea .logo img:hover { + animation: neon6_drop 1.5s ease-in-out infinite alternate; + } + #mainBody .leftSidebar .menuArea { + flex: 1 1 auto; + width: 100%; + } + #mainBody .leftSidebar .menuArea ul { + padding: 20px 0 0 0; + margin: 0; + list-style: none; + } + #mainBody .leftSidebar .menuArea ul li:first-child { + border-top: 1px solid #e4e5e7; + } + #mainBody .leftSidebar .menuArea ul li { + border-bottom: 1px solid #e4e5e7; + color: #96a2ae; + text-transform: uppercase; + display: block; + } + #mainBody .leftSidebar .menuArea ul li a { + color: #000; + padding: 10px 20px; + cursor: pointer; + text-decoration: none; + display: block; + } + #mainBody .leftSidebar .menuArea ul li a .tag { + padding: 0.3em 0.6em; + margin-top: -0.2em; + font-size: 0.8em; + color: #ddd; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.5em; + border: 1px solid #000; + float: right; + } + #mainBody .leftSidebar .menuArea ul li a .subMenu { + background-color: #999; + padding: 0.3em 0.6em; + margin-top: -0.2em; + font-size: 0.8em; + color: #fff; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.5em; + border: 1px solid #000; + float: right; + } + #mainBody .leftSidebar .menuArea ul li a .subMenu.active { + background-color: #333; + } + #mainBody .leftSidebar .menuArea ul li:hover { + background-color: #666; + -webkit-animation: neon6 1.5s ease-in-out infinite alternate; + -moz-animation: neon6 1.5s ease-in-out infinite alternate; + animation: neon6 1.5s ease-in-out infinite alternate; + } + #mainBody .leftSidebar .menuArea ul li:hover .subMenu { + background-color: #999; + -webkit-animation: neon7 1.5s ease-in-out infinite alternate; + -moz-animation: neon7 1.5s ease-in-out infinite alternate; + animation: neon7 1.5s ease-in-out infinite alternate; + } + #mainBody .leftSidebar .menuArea ul li.active { + background-color: #333; + } + #mainBody .leftSidebar .menuArea ul li.active > a { + color: #96a2ae; + } + #mainBody .leftSidebar .menuArea ul li.active:hover { + background-color: #333; + } + #mainBody .leftSidebar .menuArea ul li.active:hover > a { + color: #fff; + } + #mainBody .leftSidebar .footer { + flex: 0 0 auto; + width: 100%; + font-size: 9px; + text-align: center; + } + #mainBody .contentBody { + flex: 1 1 1px; + padding: 10px 20px; + -webkit-box-shadow: inset 4px 2px 10px -3px #a8a5a8; + -moz-box-shadow: inset 4px 2px 10px -3px #a8a5a8; + box-shadow: inset 8px 0 10px -3px #a8a5a8; + overflow: hidden; + } +} +@media print { + #mainBody nav.leftSidebarContainer { + display: none; + } + #mainBody .contentBody { + flex: 1 1 1px; + padding: 0; + margin: 0; + overflow: hidden; + } +} +#login.content { + background: #fff; +} +#login.content .contentBox { + margin: 0 auto; + max-width: 600px; + background-color: #88d15a; + -webkit-box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.5); + -moz-box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.5); + box-shadow: 10px 10px 5px 0px rgba(0,0,0,0.5); + margin-top: 5%; + padding: 40px 10px; + text-align: center; +} +#login.content .contentBox img { + height: 120px; + vertical-align: top; +} +#login.content .contentBox .form { + display: inline-block; + margin-left: 20px; +} +#login.content .contentBox .form input { + padding: 8px; + width: 300px; + margin-bottom: 10px; +} +#login.content .contentBox .form label { + display: none; +} +#login.content .contentBox .form fieldset { + border: none; +} +#login.content .contentBox .form .at-btn { + margin-bottom: 6px; + text-align: center; + width: 300px; + background: #34d955; + background-image: -webkit-linear-gradient(top, #5d942b, #4b7d26); + background-image: -moz-linear-gradient(top, #5d942b, #4b7d26); + background-image: -ms-linear-gradient(top, #5d942b, #4b7d26); + background-image: -o-linear-gradient(top, #5d942b, #4b7d26); + background-image: linear-gradient(to bottom, #5d942b, #4b7d26); + font-family: "Arial Black", Arial; + color: #fff; + font-size: 14px; + line-height: 16px; + padding: 10px 20px 10px 20px; + text-decoration: none; + text-transform: uppercase; + border: none; +} +#login.content .contentBox .form .at-btn:hover { + background: #29b54f; + background-image: -webkit-linear-gradient(top, #29b54f, #186b31); + background-image: -moz-linear-gradient(top, #29b54f, #186b31); + background-image: -ms-linear-gradient(top, #29b54f, #186b31); + background-image: -o-linear-gradient(top, #29b54f, #186b31); + background-image: linear-gradient(to bottom, #29b54f, #186b31); + text-decoration: none; + cursor: pointer; +} +#login.content .contentBox .form .at-link { + color: #1555b4; + font: Arial; + font-size: 12px; + font-weight: 800; + text-decoration: none; +} +#login.content .contentBox .form .at-link:hover { + text-decoration: underline; +} +#userManagement { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#userManagement .tableControls { + display: table; + width: 100%; + text-align: right; + margin-right: 20px; +} +#userManagement .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#userManagement .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#userManagement .tableControls .contentControls a:hover { + text-decoration: underline; +} +#userManagement .tableControls .contentControls a.disabled { + visibility: hidden; +} +#userManagement .editor { + height: 100%; + overflow-y: auto; +} +#userManagement .insert { + flex: none; + width: 100%; +} +#userManagement .insert .col-md-6 { + padding: 10px 30px 0 30px; + background: #efefef; + border-radius: 1em; +} +#userManagement .insert .formGroupHeading { + font-size: 1.6em; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-style: normal; + font-variant: normal; + font-weight: 500; +} +#userManagement .table { + table-layout: fixed; + min-width: 100%; +} +#userManagement .table thead > tr > .username, +#userManagement .table tbody > tr > .username { + width: 50%; + min-width: 100px; +} +#userManagement .table thead > tr > .email, +#userManagement .table tbody > tr > .email { + width: 50%; + min-width: 100px; +} +#userManagement .table thead > tr > .roles, +#userManagement .table tbody > tr > .roles { + width: 260px; + min-width: 260px; +} +#userManagement .table thead > tr > .actions, +#userManagement .table tbody > tr > .actions { + width: 80px; + min-width: 80px; +} +#userManagement .separatedTableHeader .actions { + text-align: center; +} +#userManagement .separatedTableHeader .actions .newUserButton { + margin-top: 4px; + padding: 0 12px; +} +#userManagement .separatedTableHeader .actions .newUserButton .fa-plus-circle { + display: inline-block; +} +#userManagement .separatedTableHeader .actions .newUserButton .fa-times-circle { + display: none; +} +#userManagement .separatedTableHeader .actions .newUserButton.active { + background-color: #fb557b; + color: #000; +} +#userManagement .separatedTableHeader .actions .newUserButton.active .fa-times-circle { + display: inline-block; +} +#userManagement .separatedTableHeader .actions .newUserButton.active .fa-plus-circle { + display: none; +} +#userManagement .listRow { + display: table-row; +} +#userManagement .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#userManagement .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#userManagement .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#userManagement .listRow .listCell .tableContainer table thead { + display: none; + visibility: hidden; +} +#userManagement .listRow .listCell .tableContainer table .userRemove { + color: #f00; +} +#userManagement .listRow .listCell .tableContainer table .userEdit { + color: #00008b; +} +#userManagement .listRow .listCell .tableContainer table .editorApply { + color: #008000; +} +#userManagement .listRow .listCell .tableContainer table .editorCancel { + color: #f00; +} +#userManagement .listRow .listCell .tableContainer table .userEditor > div { + display: table; +} +#userManagement .listRow .listCell .tableContainer table .userEditor > div > div { + display: table-cell; + padding: 10px; +} +#userManagement .listRow .listCell .tableContainer table .userEditor > div .roles .role { + vertical-align: middle; +} +#userManagement td.roles .role { + padding: 4px 4px; + border: 1px solid #555; + border-radius: 0.25em; + background: #fff; + color: #999; + cursor: pointer; +} +#userManagement td.roles .selected { + color: #000; +} +#userManagement div.roles { + padding: 4px 0; +} +#userManagement div.roles .role { + padding: 4px 4px; + border: 1px solid #555; + border-radius: 0.25em; + background: #fff; + color: #999; + cursor: pointer; +} +#userManagement div.roles .selected { + color: #000; +} +#userManagement .center { + vertical-align: middle !important; +} +#miscManagement { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#miscManagement .controls { + text-align: right; + margin-right: 20px; +} +#miscManagement .pageContentRow { + display: table-row; +} +#miscManagement .pageContentRow .pageContentCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#miscManagement .pageContentRow .pageContentCell .pageContentContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#miscManagement .pageContentRow .pageContentCell .pageContentContainer .logs { + list-style-type: none; + height: 100%; +} +#miscManagement .pageContentRow .pageContentCell .pageContentContainer .logs :hover { + background: #ccc; +} +#measures { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#measures .tableControls { + display: table; + width: 100%; + text-align: right; + margin-right: 20px; +} +#measures .tableControls .showHidden { + display: table-cell; + width: 100%; +} +#measures .tableControls .showHidden .controlLabel { + font-size: 9px; + font-weight: 700; + color: #5a5a5a; + position: relative; + top: -2px; +} +#measures .tableControls .showHidden .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#measures .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#measures .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#measures .tableControls .contentControls a:hover { + text-decoration: underline; +} +#measures .tableControls .contentControls a.disabled { + visibility: hidden; +} +#measures .table { + table-layout: fixed; + min-width: 100%; +} +#measures .table thead > tr > .name, +#measures .table tbody > tr > .name { + width: 50%; + min-width: 100px; +} +#measures .table thead > tr > .postfix, +#measures .table tbody > tr > .postfix { + width: 50%; + min-width: 100px; +} +#measures .table thead > tr > .actions, +#measures .table tbody > tr > .actions { + width: 90px; + min-width: 90px; +} +#measures .separatedTableHeader table thead > tr .actions { + text-align: center; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton { + margin-top: 4px; + padding: 0 12px; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton .fa-plus-circle { + display: inline-block; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton .fa-times-circle { + display: none; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton.active { + background-color: #fb557b; + color: #000; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton.active .fa-times-circle { + display: inline-block; +} +#measures .separatedTableHeader table thead > tr .actions .newMeasureButton.active .fa-plus-circle { + display: none; +} +#measures .listRow { + display: table-row; +} +#measures .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#measures .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#measures .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#measures .listRow .listCell .tableContainer table .measureSearch { + margin: 3px 0 2px 1px; +} +#measures .listRow .listCell .tableContainer table .measureEditorTd { + background: #deeac0; +} +#measures .listRow .listCell .tableContainer table input[name="name"], +#measures .listRow .listCell .tableContainer table input[name="postfix"] { + width: 100%; +} +#measures .listRow .listCell .tableContainer table .editorDiv { + margin: 4px 0; +} +#measures .listRow .listCell .tableContainer table .editorDiv label { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 0.9em; + padding-bottom: 4px; +} +#measures .listRow .listCell .tableContainer table .editorDiv select2 { + font-size: 0.4em; +} +#measures .listRow .listCell .tableContainer table > thead { + display: none; + visibility: hidden; +} +#measures .listRow .listCell .tableContainer table > tbody > tr .actionRemove { + color: #f77; +} +#measures .listRow .listCell .tableContainer table > tbody > tr .actionEdit { + color: #44f; +} +#measures .listRow .listCell .tableContainer table > tbody > tr .editorApply { + color: #008000; +} +#measures .listRow .listCell .tableContainer table > tbody > tr .editorCancel { + color: #f00; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionActivate { + color: #158b18; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionHide { + color: #6a0707; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionEdit { + color: #0101e4; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.hidden { + background-color: #e995ff; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.hidden .actionEdit { + color: #0101e4; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.hidden .actionShow { + color: #027905; +} +#measures .listRow .listCell .tableContainer table > tbody > tr.hidden:hover { + background-color: #ffb5ff; +} +#venues { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#venues .tableControls { + display: table; + width: 100%; + text-align: right; + margin-right: 20px; +} +#venues .tableControls .showHidden { + display: table-cell; + width: 100%; +} +#venues .tableControls .showHidden .controlLabel { + font-size: 9px; + font-weight: 700; + color: #5a5a5a; + position: relative; + top: -2px; +} +#venues .tableControls .showHidden .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#venues .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#venues .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#venues .tableControls .contentControls a:hover { + text-decoration: underline; +} +#venues .tableControls .contentControls a.disabled { + visibility: hidden; +} +#venues .table { + table-layout: fixed; + min-width: 100%; +} +#venues .table thead > tr > .name, +#venues .table tbody > tr > .name { + width: 33%; + min-width: 100px; +} +#venues .table thead > tr > .type, +#venues .table tbody > tr > .type { + width: 33%; + min-width: 100px; +} +#venues .table thead > tr > .frequency, +#venues .table tbody > tr > .frequency { + width: 33%; + min-width: 100px; +} +#venues .table thead > tr > .actions, +#venues .table tbody > tr > .actions { + width: 90px; + min-width: 90px; +} +#venues .separatedTableHeader table thead > tr .actions { + text-align: center; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton { + margin-top: 4px; + padding: 0px 12px; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton .fa-plus-circle { + display: inline-block; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton .fa-times-circle { + display: none; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton.active { + background-color: #fb557b; + color: #000; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton.active .fa-times-circle { + display: inline-block; +} +#venues .separatedTableHeader table thead > tr .actions .newVenueButton.active .fa-plus-circle { + display: none; +} +#venues .listRow { + display: table-row; +} +#venues .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#venues .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#venues .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#venues .listRow .listCell .tableContainer table .venueSearch { + margin: 3px 0 2px 1px; +} +#venues .listRow .listCell .tableContainer table .venueEditorTd { + background: #deeac0; +} +#venues .listRow .listCell .tableContainer table input[name="name"], +#venues .listRow .listCell .tableContainer table input[name="type"] { + width: 100%; +} +#venues .listRow .listCell .tableContainer table .editorDiv { + margin: 4px 0; +} +#venues .listRow .listCell .tableContainer table .editorDiv label { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 0.9em; + padding-bottom: 4px; +} +#venues .listRow .listCell .tableContainer table .editorDiv select2 { + font-size: 0.4em; +} +#venues .listRow .listCell .tableContainer table > thead { + display: none; + visibility: hidden; +} +#venues .listRow .listCell .tableContainer table > tbody > tr .actionRemove { + color: #f77; +} +#venues .listRow .listCell .tableContainer table > tbody > tr .actionEdit { + color: #44f; +} +#venues .listRow .listCell .tableContainer table > tbody > tr .editorApply { + color: #008000; +} +#venues .listRow .listCell .tableContainer table > tbody > tr .editorCancel { + color: #f00; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionActivate { + color: #158b18; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionHide { + color: #6a0707; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionEdit { + color: #0101e4; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.hidden { + background-color: #e995ff; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.hidden .actionEdit { + color: #0101e4; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.hidden .actionShow { + color: #027905; +} +#venues .listRow .listCell .tableContainer table > tbody > tr.hidden:hover { + background-color: #ffb5ff; +} +#products { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#products .tableControls { + text-align: right; + margin-right: 20px; + margin-bottom: 4px; + display: table; + width: 100%; +} +#products .tableControls .showHidden { + display: table-cell; + text-align: right; + width: 100%; +} +#products .tableControls .showHidden .controlLabel { + font-size: 9px; + font-weight: 700; + color: #5a5a5a; + position: relative; + top: -2px; +} +#products .tableControls .showHidden .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#products .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#products .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#products .tableControls .contentControls a:hover { + text-decoration: underline; +} +#products .tableControls .contentControls a.disabled { + visibility: hidden; +} +#products .table { + table-layout: fixed; + min-width: 100%; +} +#products .table thead > tr > .name, +#products .table tbody > tr > .name { + width: 100%; +} +#products .table thead > tr > .tags, +#products .table tbody > tr > .tags { + width: 220px; + min-width: 220px; +} +#products .table thead > tr > .aliases, +#products .table tbody > tr > .aliases { + width: 220px; + min-width: 220px; +} +#products .table thead > tr > .measures, +#products .table tbody > tr > .measures { + width: 220px; + min-width: 220px; +} +#products .table thead > tr > .actions, +#products .table tbody > tr > .actions { + width: 90px; + min-width: 90px; +} +#products .separatedTableHeader table thead > tr > th.actions { + text-align: center; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton { + margin-top: 4px; + padding: 0 12px; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton .fa-plus-circle { + display: inline-block; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton .fa-times-circle { + display: none; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton:active { + background-color: #fb557b; + color: #000; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton:active .fa-times-circle { + display: inline-block; +} +#products .separatedTableHeader table thead > tr > th.actions .newButton:active .fa-plus-circle { + display: none; +} +#products .listRow { + display: table-row; +} +#products .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#products .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#products .listRow .listCell .tableContainer table thead { + visibility: hidden; + display: none; +} +#products .listRow .listCell .tableContainer table .search { + margin: 3px 0 2px 1px; +} +#products .listRow .listCell .tableContainer table .editorTd { + background: #deeac0; +} +#products .listRow .listCell .tableContainer table input[name="name"], +#products .listRow .listCell .tableContainer table .productTagsEditor, +#products .listRow .listCell .tableContainer table .productAliasesEditor, +#products .listRow .listCell .tableContainer table .productMeasuresEditor { + width: 100%; +} +#products .listRow .listCell .tableContainer table .editorDiv { + margin: 4px 0; +} +#products .listRow .listCell .tableContainer table .editorDiv label { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 0.9em; + padding-bottom: 4px; +} +#products .listRow .listCell .tableContainer table .editorDiv select2 { + font-size: 0.4em; +} +#products .listRow .listCell .tableContainer table > tbody > tr .actionRemove { + color: #f77; +} +#products .listRow .listCell .tableContainer table > tbody > tr .actionEdit { + color: #44f; +} +#products .listRow .listCell .tableContainer table > tbody > tr .editorApply { + color: #008000; +} +#products .listRow .listCell .tableContainer table > tbody > tr .editorCancel { + color: #f00; +} +#products .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#products .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionActivate { + color: #158b18; +} +#products .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionHide { + color: #6a0707; +} +#products .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionEdit { + color: #0101e4; +} +#products .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#products .listRow .listCell .tableContainer table > tbody > tr.hidden { + background-color: #e995ff; +} +#products .listRow .listCell .tableContainer table > tbody > tr.hidden .actionEdit { + color: #0101e4; +} +#products .listRow .listCell .tableContainer table > tbody > tr.hidden .actionShow { + color: #027905; +} +#products .listRow .listCell .tableContainer table > tbody > tr.hidden .actionConvert { + color: #fb0909; +} +#products .listRow .listCell .tableContainer table > tbody > tr.hidden:hover { + background-color: #ffb5ff; +} +#productTags { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#productTags .tagInfo { + display: block; + margin-bottom: 20px; +} +#productTags .tagInfo .tagControls { + display: block; + width: 100%; +} +#productTags .tagInfo .tagControls label { + display: inline-block; +} +#productTags .tagInfo .tagControls input[name="tagName"] { + width: 140px; + display: inline-block; +} +#productTags .tagInfo .tagControls input[name="addTag"] { + margin-top: -4px; +} +#productTags .tagInfo .floatRight { + float: right; +} +#productTags .tagInfo .floatRight .editTags { + font-size: 2em; + border: 1px solid #999; + background: #f7f3a0; + border-radius: 4px; + padding: 2px 3px; +} +#productTags .tagInfo .floatRight .switch { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +/* Hide default HTML checkbox */ +/* The slider */ +/* Rounded sliders */ +} +#productTags .tagInfo .floatRight .switch input { + display: none; +} +#productTags .tagInfo .floatRight .switch .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: 0.4s; + transition: 0.4s; +} +#productTags .tagInfo .floatRight .switch .slider:before { + position: absolute; + font-family: FontAwesome; + padding-left: 4px; + font-size: 20px; + line-height: 26px; + color: #ffa398; + content: "\f040"; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: #fff; + -webkit-transition: 0.4s; + transition: 0.4s; +} +#productTags .tagInfo .floatRight .switch input:checked + .slider { + background-color: #5cb85c; +} +#productTags .tagInfo .floatRight .switch input:focus + .slider { + box-shadow: 0 0 1px #2196f3; +} +#productTags .tagInfo .floatRight .switch input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} +#productTags .tagInfo .floatRight .switch .slider.round { + border-radius: 34px; +} +#productTags .tagInfo .floatRight .switch .slider.round:before { + border-radius: 50%; +} +#productTags .tagInfo .tableTop { + display: table; + width: 100%; + margin-top: 10px; +} +#productTags .tagInfo .tableTop .tagDisplay { + display: table-cell; + width: auto; +} +#productTags .tagInfo .tableTop .tagDisplay .productTagExp { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 14px; + line-height: 34px; + margin: 0; + padding: 4px 14px; + border: 1px solid #999; + border-radius: 4px; + white-space: nowrap; + cursor: pointer; +} +#productTags .tagInfo .tableTop .tagDisplay .productTagExp .hidden { + display: none; +} +#productTags .tagInfo .tableTop .tagDisplay .productTagExp .productTagEditor { + display: inline-block; + font-size: 1em; + height: 20px; + background: transparent; + border: 0; + padding: 0; + margin: 0; +} +#productTags .tagInfo .tableTop .tagDisplay .productTagExp .productTagName { + border: 0; + padding: 0; + margin: 0; +} +#productTags .tagInfo .tableTop .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#productTags .tagInfo .tableTop .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#productTags .tagInfo .tableTop .contentControls a:hover { + text-decoration: underline; +} +#productTags .tagInfo .tableTop .contentControls a.disabled { + visibility: hidden; +} +#productTags .table { + table-layout: fixed; + min-width: 100%; +} +#productTags .table thead > tr > .name, +#productTags .table tbody > tr > .name { + width: 100%; + min-width: 100px; +} +#productTags .table thead > tr > .tags, +#productTags .table tbody > tr > .tags { + width: 100%; + min-width: 100px; +} +#productTags .listRow { + display: table-row; +} +#productTags .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#productTags .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#productTags .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#productTags .listRow .listCell .tableContainer table > thead > tr.deactivated, +#productTags .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#productTags .listRow .listCell .tableContainer table > thead > tr.deactivated:hover, +#productTags .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#productTags td.roles .role { + padding: 4px 4px; + border: 1px solid #555; + border-radius: 0.25em; + background: #fff; + color: #999; + cursor: pointer; +} +#productTags td.roles .selected { + color: #000; +} +#productTags div.roles { + padding: 4px 0; +} +#productTags div.roles .role { + padding: 4px 4px; + border: 1px solid #555; + border-radius: 0.25em; + background: #fff; + color: #999; + cursor: pointer; +} +#productTags div.roles .selected { + color: #000; +} +#productTags .center { + vertical-align: middle !important; +} +#salesMain { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#salesMain .controls { + text-align: left; + display: table; + width: 100%; +} +#salesMain .controls .pageControls { + padding: 4px 8px; + margin: 4px 8px; + display: table-cell; + width: 240px; +} +#salesMain .controls .tableControls { + text-align: right; + padding: 4px 8px; + margin: 4px 12px 4px 8px; + display: table-cell; +} +#salesMain .table { + table-layout: fixed; + min-width: 100%; +} +#salesMain .table thead > tr > .amount, +#salesMain .table tbody > tr > .amount { + width: 90px; + min-width: 90px; +} +#salesMain .table thead > tr > .product, +#salesMain .table tbody > tr > .product { + width: 100%; + min-width: 140px; +} +#salesMain .table thead > tr > .price, +#salesMain .table tbody > tr > .price { + width: 140px; + min-width: 140px; +} +#salesMain .table thead > tr > .measure, +#salesMain .table tbody > tr > .measure { + width: 100px; + min-width: 100px; +} +#salesMain .table thead > tr > .saleDate, +#salesMain .table tbody > tr > .saleDate { + width: 150px; + min-width: 150px; +} +#salesMain .table thead > tr > .createdDate, +#salesMain .table tbody > tr > .createdDate { + width: 100px; + min-width: 100px; +} +#salesMain .table thead > tr > .venue, +#salesMain .table tbody > tr > .venue { + width: 160px; + min-width: 160px; +} +#salesMain .table thead > tr > .actions, +#salesMain .table tbody > tr > .actions { + width: 90px; + min-width: 90px; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton { + padding: 0 12px; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton .fa-plus-circle { + display: inline-block; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton .fa-times-circle { + display: none; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton.active { + background-color: #fb557b; + color: #000; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton.active .fa-times-circle { + display: inline-block; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .newSaleButton.active .fa-plus-circle { + display: none; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .showOnlyComments { + color: #bcb95f; + padding: 4px 8px; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .showOnlyComments:hover { + color: #fff; + text-shadow: 0px 0px 10px #ff6d1f; +} +#salesMain .separatedTableHeader table thead > tr > th.actions .showOnlyComments.on { + color: #fff; +} +#salesMain .separatedTableHeader table thead > tr > th.saleDate input { + width: 130px; +} +#salesMain .listRow { + display: table-row; +} +#salesMain .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#salesMain .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: scroll; +} +#salesMain .listRow .listCell .tableContainer label { + font-size: 10px; + font-weight: 800; +} +#salesMain .listRow .listCell .tableContainer table thead { + visibility: hidden; + display: none; +} +#salesMain .listRow .listCell .tableContainer table .saleRemove { + color: #f00; + margin-left: 8px; +} +#salesMain .listRow .listCell .tableContainer table .saleEdit { + color: #00008b; + margin-right: 8px; +} +#salesMain .listRow .listCell .tableContainer table .editorApply { + color: #008000; +} +#salesMain .listRow .listCell .tableContainer table .editorCancel { + color: #f00; +} +#salesMain .listRow .listCell .tableContainer table .saleDate { + text-align: left; +} +#salesMain .listRow .listCell .tableContainer table .createdDate { + text-align: left; +} +#salesMain .listRow .listCell .tableContainer .editComment { + color: #808080; +} +#salesMain .listRow .listCell .tableContainer .hasComment { + color: #000; +} +#salesMain .listRow .listCell .tableContainer .actionEdit { + margin-right: 6px; + color: #44f; +} +#salesMain .saleEditor .heading { + font-size: 2em; + font-family: verdana, arial, helvetica, sans-serif; + text-transform: uppercase; + font-weight: 800; + margin: 6px 0 14px 0; +} +#salesMain .saleEditor .priceContainer { + display: table; + width: 100%; +} +#salesMain .saleEditor .priceContainer .price { + display: table-cell; + padding-right: 10px; +} +#salesMain .saleEditor .priceContainer .priceButtons { + display: table-cell; + width: 1.5em; +} +#salesMain .saleEditor .priceContainer .priceButtons .setDefaultPrice { + font-size: 1.5em; + padding: 6px 8px; + margin-left: 8px; + border-radius: 8px; +} +#salesMain .saleEditor .priceContainer .priceButtons .setDefaultPrice:hover { + text-shadow: 0px 0px 6px #00b900; +} +#salesMain .saleEditor .priceContainer .priceButtons .setDefaultPrice:active { + text-shadow: 0px 0px 6px #808080; +} +#salesMain .insertSaleForm .form-group, +#salesMain .insertSaleForm label { + text-align: left; +} +#salesMain .insertSaleForm .formGroupHeading { + font-size: 1.6em; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-style: normal; + font-variant: normal; + font-weight: 500; +} +#saleDuplicates { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#saleDuplicates .controls { + text-align: left; + display: table; + width: 100%; +} +#saleDuplicates .controls .pageControls { + padding: 4px 8px; + margin: 4px 8px; + display: table-cell; + width: 240px; +} +#saleDuplicates .controls .tableControls { + text-align: right; + padding: 4px 8px; + margin: 4px 12px 4px 8px; + display: table-cell; +} +#saleDuplicates .controls .tableControls .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#saleDuplicates .listRow { + display: table-row; +} +#saleDuplicates .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#saleDuplicates .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#saleDuplicates .listRow .listCell .tableContainer label { + font-size: 10px; + font-weight: 800; +} +#saleDuplicates .listRow .listCell .tableContainer table { + table-layout: fixed; + min-width: 100%; +} +#saleDuplicates .listRow .listCell .tableContainer table .saleRemove { + color: #f00; + margin-left: 8px; +} +#saleDuplicates .listRow .listCell .tableContainer table .saleEdit { + color: #00008b; + margin-right: 8px; +} +#saleDuplicates .listRow .listCell .tableContainer table .editorApply { + color: #008000; +} +#saleDuplicates .listRow .listCell .tableContainer table .editorCancel { + color: #f00; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.amount { + width: 90px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.product { + width: auto; + min-width: 140px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.price { + width: 140px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.measure { + width: 100px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.saleDate { + width: 140px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.createdDate { + width: 100px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.venue { + width: 160px; +} +#saleDuplicates .listRow .listCell .tableContainer table thead > tr > th.actions { + width: 90px; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .ignoreDuplicatesButton { + padding: 0 2px; + color: #008000; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .ignoreDuplicatesButton:hover { + color: #0b0; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .ignoreDuplicatesButton:active { + color: #000; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .ignoreDuplicatesButton.hidden { + visibility: hidden; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeAllDuplicatesButton, +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeOneDuplicateButton { + padding: 0 2px; + color: #a00000; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeAllDuplicatesButton:hover, +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeOneDuplicateButton:hover { + color: #f00; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeAllDuplicatesButton:active, +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr > td.actions .removeOneDuplicateButton:active { + color: #000; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr.hidden:nth-child(odd) { + background-color: #f4f0ab; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr.hidden:nth-child(even) { + background-color: #fff6c0; +} +#saleDuplicates .listRow .listCell .tableContainer table tbody > tr.hidden:hover { + background-color: #ded; +} +#saleDuplicates .listRow .listCell .tableContainer .editComment { + color: #808080; +} +#saleDuplicates .listRow .listCell .tableContainer .hasComment { + color: #000; +} +#saleDuplicates .listRow .listCell .tableContainer .actionEdit { + margin-right: 6px; + color: #44f; +} +#saleDuplicates .saleEditor .heading { + font-size: 2em; + font-family: verdana, arial, helvetica, sans-serif; + text-transform: uppercase; + font-weight: 800; + margin: 6px 0 14px 0; +} +#saleDuplicates .saleEditor .priceContainer { + display: table; + width: 100%; +} +#saleDuplicates .saleEditor .priceContainer .price { + display: table-cell; + padding-right: 10px; +} +#saleDuplicates .saleEditor .priceContainer .priceButtons { + display: table-cell; + width: 1.5em; +} +#saleDuplicates .saleEditor .priceContainer .priceButtons .setDefaultPrice { + font-size: 1.5em; + padding: 6px 8px; + margin-left: 8px; + border-radius: 8px; +} +#saleDuplicates .saleEditor .priceContainer .priceButtons .setDefaultPrice:hover { + text-shadow: 0px 0px 6px #00b900; +} +#saleDuplicates .saleEditor .priceContainer .priceButtons .setDefaultPrice:active { + text-shadow: 0px 0px 6px #808080; +} +#saleDuplicates .insertSaleForm .form-group, +#saleDuplicates .insertSaleForm label { + text-align: left; +} +#saleDuplicates .insertSaleForm .formGroupHeading { + font-size: 1.6em; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-style: normal; + font-variant: normal; + font-weight: 500; +} +#salesSheetsMain { + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#salesSheetsMain label { + font-family: "Segoe UI", Candara, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif; + font-weight: 800; + text-transform: uppercase; +} +#salesSheetsMain .optionsSection { + display: flex; + flex-flow: column; + justify-content: flex-start; + align-items: flex-start; + align-content: stretch; + width: 100%; +} +#salesSheetsMain .optionsSection .options { + flex: 0 0 auto; + display: flex; + flex-flow: row; + justify-content: flex-start; + align-items: center; + align-content: stretch; + padding: 6px 20px 10px 20px; + white-space: nowrap; + overflow: hidden; + height: 50px; +} +#salesSheetsMain .optionsSection .options .form-control { + display: inline; +} +#salesSheetsMain .optionsSection .options label { + flex: 0 0 auto; + vertical-align: text-bottom; + font-size: 1.2em; +} +#salesSheetsMain .optionsSection .options select[name="sheetSelection"] { + flex: 0 0 auto; + font-size: 1.2em; + padding: 2px; + margin-right: 4px; + min-width: 160px; + width: auto; +} +#salesSheetsMain .optionsSection .options input[name="newSheetName"] { + flex: 0 0 auto; + transition: all 0.75s ease; + width: 0; + border: 0; + opacity: 0; + font-size: 1.2em; +} +#salesSheetsMain .optionsSection .options input[name="newSheetName"].show { + opacity: 1; + border: 1px solid #ccc; + border-radius: 4px; + width: 200px; + transform: translateX(4px); +} +#salesSheetsMain .optionsSection .options .createSheet, +#salesSheetsMain .optionsSection .options .editSheet, +#salesSheetsMain .optionsSection .options .deleteSheet { + flex: 0 0 auto; + padding: 6px; + margin: 0 4px; + width: 33px; + text-align: center; + font-size: 1.5em; + border-radius: 8px; + border: 1px solid rgba(0,0,0,0); + box-sizing: border-box; +} +#salesSheetsMain .optionsSection .options .createSheet:hover, +#salesSheetsMain .optionsSection .options .editSheet:hover, +#salesSheetsMain .optionsSection .options .deleteSheet:hover { + border: 1px inset #b100d1; + -webkit-box-shadow: inset 0px 0px 20px 0px #de7cff; + -moz-box-shadow: inset 0px 0px 20px 0px #de7cff; + box-shadow: inset 0px 0px 20px 0px #de7cff; +} +#salesSheetsMain .optionsSection .options .editSheet.selected { + color: #fff; + border: 1px inset #b100d1; + -webkit-box-shadow: inset 0px 0px 36px 0px #57006c; + -moz-box-shadow: inset 0px 0px 36px 0px #57006c; + box-shadow: inset 0px 0px 36px 0px #57006c; +} +#salesSheetsMain .optionsSection .options .editSheet { + vertical-align: top; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .optionsSection .options .disabled { + color: #808080; + cursor: default; +} +#salesSheetsMain .optionsSection .options .createSheet { + transform: translateX(-25px) rotate(0deg); + transition: all 0.75s ease; +} +#salesSheetsMain .optionsSection .options .createSheet.move { + transform: translateX(6px) rotate(720deg); +} +#salesSheetsMain .optionsSection .separator { + flex: 0 0 auto; + width: 100%; + margin: 0 auto; + padding-top: 6px; + height: 1px; + border-bottom: 1px solid #333; +} +#salesSheetsMain .optionsSection .separator:last-child { + margin-bottom: 10px; +} +#salesSheetsMain .salesSheetProducts > div { + width: 400px; + margin: 0 4px 0 4px; +} +#salesSheetsMain .salesSheetProducts .header { + padding-top: 4px; +} +#salesSheetsMain .salesSheetProducts .header .name { + font-size: 1.5em; + text-transform: uppercase; + color: #0a6f10; + text-shadow: 0px 0px 12px #8fa4d1; + background: #fff; + font-weight: 800; + width: 100%; + padding: 4px 6px 6px 6px; + border-bottom: 2px solid #335a4a; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .salesSheetProducts .product { + background-color: #ffecde; + -webkit-box-shadow: inset 0px 0px 40px 14px #fff; + -moz-box-shadow: inset 0px 0px 40px 14px #fff; + box-shadow: inset 0px 0px 40px 14px #fff; +} +#salesSheetsMain .salesSheetProducts .product .nameAndTotal { + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; + margin-bottom: 4px; +} +#salesSheetsMain .salesSheetProducts .product .nameAndTotal .name { + flex: 1 1 auto; + font-size: 1.5em; + color: #575757; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .salesSheetProducts .product .nameAndTotal .total { + flex: 0 0 auto; + width: 80px; + font-size: 1.2em; + color: #00378b; + text-shadow: 0px 0px 8px #7690d1; + overflow: hidden; +} +#salesSheetsMain .salesSheetProducts .product .measures { + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; + margin-bottom: 6px; +} +#salesSheetsMain .salesSheetProducts .product .measures .measure { + flex: 1 0 auto; + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; +} +#salesSheetsMain .salesSheetProducts .product .measures .measure .label { + font-size: 1em; + font-weight: 600; + margin-right: 4px; +} +#salesSheetsMain .salesSheetProducts .product .measures .measure input[name="price"] { + width: 63px; +} +#salesSheetsMain .salesSheetProducts .product .measures .measure input[name="amount"] { + width: 47px; +} +#salesSheetsMain .salesSheetProducts .product.odd { + background-color: #ede0f1; + -webkit-box-shadow: inset 0px 0px 40px 14px #fff; + -moz-box-shadow: inset 0px 0px 40px 14px #fff; + box-shadow: inset 0px 0px 40px 14px #fff; +} +#salesSheetsMain .salesSheetProducts .sheetControls { + padding-top: 4px; + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; +} +#salesSheetsMain .salesSheetProducts .sheetControls .saveSheet, +#salesSheetsMain .salesSheetProducts .sheetControls .resetSheet { + flex: 1 1 auto; + font-size: 1em; + color: #e9e9e9; + font-weight: 800; + text-transform: uppercase; + text-align: center; + padding: 10px; + margin: 4px; +} +#salesSheetsMain .salesSheetProducts .sheetControls .saveSheet { + background: #007200; + -webkit-box-shadow: inset 0px 0px 20px -2px #fff; + -moz-box-shadow: inset 0px 0px 20px -2px #fff; + box-shadow: inset 0px 0px 20px -2px #fff; +} +#salesSheetsMain .salesSheetProducts .sheetControls .resetSheet { + background: #960000; + -webkit-box-shadow: inset 0px 0px 20px -2px #fff; + -moz-box-shadow: inset 0px 0px 20px -2px #fff; + box-shadow: inset 0px 0px 20px -2px #fff; +} +#salesSheetsMain .salesSheetProducts .sheetControls .saveSheet:hover, +#salesSheetsMain .salesSheetProducts .sheetControls .resetSheet:hover { + text-shadow: 0px 0px 16px #fff; +} +#salesSheetsMain .salesSheetProducts .sheetControls .saveSheet:hover { + background: #005600; +} +#salesSheetsMain .salesSheetProducts .sheetControls .resetSheet:hover { + background: #7f0000; +} +#salesSheetsMain .salesSheetProducts .sheetControls .saveSheet:active { + background: #009000; +} +#salesSheetsMain .salesSheetProducts .sheetControls .resetSheet:active { + background: #b90000; +} +#salesSheetsMain .salesSheetEditorControls { + margin-bottom: 8px; +} +#salesSheetsMain .tableControls { + margin-bottom: 8px; + width: 100%; + border-bottom: 2px solid #a7a8ff; + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; +} +#salesSheetsMain .tableControls div, +#salesSheetsMain .tableControls span, +#salesSheetsMain .tableControls i { + flex: 0 0 auto; + margin-right: 4px; +} +#salesSheetsMain .tableControls .controlLabel { + font-size: 9px; + font-weight: 700; + color: #5a5a5a; + position: relative; + top: -2px; +} +#salesSheetsMain .tableControls .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#salesSheetsMain .tableControls input[name='productFilter'] { + font-size: 1.2em; + display: inline; + width: auto; +} +#salesSheetsMain .tableControls .showAlternateNames { + margin-right: 20px; +} +#salesSheetsMain .tableControls .heading { + display: inline-block; +} +#salesSheetsMain .tableControls .heading .name { + padding: 6px 10px; + margin-bottom: 6px; + border-radius: 10px; + font-size: 1.4em; + text-transform: uppercase; + font-weight: 800; + background: #c1c2ff; +} +#salesSheetsMain .tableControls .heading .nameEditor { + display: none; +} +#salesSheetsMain .tableControls .clearFilter { + font-size: 1.6em; +} +#salesSheetsMain .selectionProductsListing { + width: 100%; +} +#salesSheetsMain .selectionProductsListing .selectionProduct { + color: #9f9f9f; + font-size: 1.3em; + width: 400px; +} +#salesSheetsMain .selectionProductsListing .selectionProduct .include, +#salesSheetsMain .selectionProductsListing .selectionProduct .includeAs { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .selectionProductsListing .selectionProduct .includedRemove, +#salesSheetsMain .selectionProductsListing .selectionProduct .includedAdd { + cursor: pointer; +} +#salesSheetsMain .selectionProductsListing .selectionProduct .includedRemove:hover, +#salesSheetsMain .selectionProductsListing .selectionProduct .includedAdd:hover { + color: #00f; +} +#salesSheetsMain .selectionProductsListing .selectionProduct span.deactivated { + background: #ff0; + box-shadow: inset 0px 0 100px 0px #fff; +} +#salesSheetsMain .selectionProductsListing .selectionProduct span.hidden { + background: rgba(255,20,20,0.7); + box-shadow: inset 0px 0px 100px 0px #fff; +} +#salesSheetsMain .selectionProductsListing .selectionProduct.selected { + color: #000; +} +#salesSheetsMain .configurationProductsListing { + width: 100%; +} +#salesSheetsMain .configurationProductsListing .product { + width: 300px; +} +#salesSheetsMain .configurationProductsListing .product .name { + color: #4a4a4a; + font-size: 1.1em; + margin-bottom: 6px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .configurationProductsListing .product .name.edit { + display: none; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor { + display: none; + margin-bottom: 6px; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor input[name='name'] { + flex: 1 1 auto; + display: inline-block; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor .accept, +#salesSheetsMain .configurationProductsListing .product .nameEditor .reject { + flex: 0 0 auto; + font-size: 1.7em; + margin-left: 8px; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor .accept:hover { + color: #008000; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor .reject:hover { + color: #f00; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor .accept:active { + text-shadow: 0px 0px 10px #fda1ff; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor .reject:active { + text-shadow: 0px 0px 10px #fda1ff; +} +#salesSheetsMain .configurationProductsListing .product .nameEditor.edit { + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; +} +#salesSheetsMain .configurationProductsListing .product .measures { + margin: 1px 0 8px 0; +} +#salesSheetsMain .configurationProductsListing .heading { + width: 300px; +} +#salesSheetsMain .configurationProductsListing .heading .headingNameRow { + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; + margin-top: 4px; + margin-bottom: 2px; + border-bottom: 1px solid #808080; +} +#salesSheetsMain .configurationProductsListing .heading .headingNameRow .name { + flex: 1 0 auto; + color: #000; + font-size: 1.5em; + text-transform: uppercase; + font-weight: 800; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#salesSheetsMain .configurationProductsListing .heading .headingNameRow .sort { + flex: 0 0 auto; +} +#salesSheetsMain .configurationProductsListing .heading .headingNameRow.edit { + display: none; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor { + display: none; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor input[name='name'] { + flex: 1 1 auto; + display: inline-block; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor .accept, +#salesSheetsMain .configurationProductsListing .heading .nameEditor .reject { + flex: 0 0 auto; + font-size: 1.7em; + margin-left: 8px; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor .accept:hover { + color: #008000; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor .reject:hover { + color: #f00; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor .accept:active { + text-shadow: 0px 0px 10px #fda1ff; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor .reject:active { + text-shadow: 0px 0px 10px #fda1ff; +} +#salesSheetsMain .configurationProductsListing .heading .nameEditor.edit { + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + align-content: stretch; +} +.heading.gu-mirror { + width: 300px; +} +.heading.gu-mirror .name { + color: #000; + font-size: 1.5em; + text-transform: uppercase; + font-weight: 800; + margin-top: 4px; + margin-bottom: 2px; + border-bottom: 1px solid #808080; +} +.heading.gu-mirror .nameEditor { + display: none; +} +.product.gu-mirror { + color: #9f9f9f; + font-size: 1.5em; + width: 300px; +} +.product.gu-mirror .name { + font-size: 1em; +} +.product.gu-mirror .nameEditor { + display: none; +} +.product.gu-mirror .measures { + display: none; +} +#pricing { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#pricing .controls { + text-align: left; + display: table; + width: 100%; +} +#pricing .controls .measureGroup { + padding: 4px 8px; + margin: 4px 8px; + display: table-cell; + width: 240px; +} +#pricing .controls .measureGroup select { + width: 100%; +} +#pricing .controls .measureGroup option.deactivated { + color: #a6a6a6; +} +#pricing .controls .controlGroup { + padding: 4px 8px; + margin: 4px 8px; + display: table-cell; +} +#pricing .controls .pagination { + display: table-cell; + width: 240px; + vertical-align: bottom; +} +#pricing .controls .previousSettings { + padding: 4px 8px; + margin: 4px 8px; + display: inline-block; +} +#pricing .controls .outline { + border: 2px dotted #32747e; + border-radius: 10px; +} +#pricing .controls .floatLeft { + float: left; +} +#pricing .controls .floatRight { + float: right; +} +#pricing .controls .controlLabel { + font-size: 0.9em; + font-weight: 700; + margin-top: -2px; +} +#pricing .controls select[name="measures"] { + padding: 4px 8px; + font-size: 1.5em; +} +#pricing .controls input { + padding: 4px 8px; + font-size: 1.5em; +} +#pricing .controls input[type="number"] { + width: 80px; +} +#pricing .controls input[type="button"] { + margin-top: -6px; + margin-right: 20px; +} +#pricing .controls .toggleUpdateHistory { + margin: 0; + position: relative; + top: -4px; + display: inline-block; +} +#pricing .controls input[type="date"] { + width: 180px; + display: inline-block; +} +#pricing .controls .resetButton { + margin-left: 20px; +} +#pricing .controls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; +} +#pricing .controls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#pricing .controls .contentControls a:hover { + text-decoration: underline; +} +#pricing .controls .contentControls a.disabled { + visibility: hidden; +} +#pricing .table { + table-layout: fixed; + min-width: 100%; +} +#pricing .table thead tr > .name, +#pricing .table tbody tr > .name { + width: 100%; + min-width: 100px; +} +#pricing .table thead tr > .current, +#pricing .table tbody tr > .current { + width: 200px; + min-width: 200px; +} +#pricing .table thead tr > .previous, +#pricing .table tbody tr > .previous { + width: 200px; + min-width: 200px; +} +#pricing .table thead tr > .changeDate, +#pricing .table tbody tr > .changeDate { + width: 200px; + min-width: 200px; +} +#pricing .listRow { + display: table-row; +} +#pricing .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#pricing .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#pricing .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#pricing .listRow .listCell .tableContainer table > thead { + visibility: hidden; + display: none; +} +#pricing .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#pricing .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#production { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#production .tableControls { + text-align: right; + margin-right: 20px; + margin-bottom: 4px; + display: table; + width: 100%; +} +#production .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#production .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#production .tableControls .contentControls a:hover { + text-decoration: underline; +} +#production .tableControls .contentControls a.disabled { + visibility: hidden; +} +#production .table { + table-layout: fixed; + min-width: 100%; +} +#production .table thead > tr > .hasLabels, +#production .table tbody > tr > .hasLabels { + width: 30px; +} +#production .table thead > tr > .hasLabels .hasLabels, +#production .table tbody > tr > .hasLabels .hasLabels { + color: #008000; +} +#production .table thead > tr > .hasLabels .noLabels, +#production .table tbody > tr > .hasLabels .noLabels { + color: #f00; +} +#production .table thead > tr > .name, +#production .table tbody > tr > .name { + width: 100%; +} +#production .table thead > tr > .date, +#production .table tbody > tr > .date { + min-width: 150px; + max-width: 180px; +} +#production .table thead > tr > .amount, +#production .table tbody > tr > .amount { + min-width: 100px; + max-width: 100px; +} +#production .table thead > tr > .cook, +#production .table tbody > tr > .cook { + min-width: 150px; + max-width: 180px; +} +#production .table thead > tr > .canner, +#production .table tbody > tr > .canner { + min-width: 150px; + max-width: 180px; +} +#production .table thead > tr > .comment, +#production .table tbody > tr > .comment { + width: 220px; + min-width: 220px; + max-width: 220px; +} +#production .table thead > tr > .actions, +#production .table tbody > tr > .actions { + width: 90px; + min-width: 90px; + max-width: 90px; +} +#production .table thead > tr.deleted, +#production .table tbody > tr.deleted { + background-color: #808080; +} +#production .separatedTableHeader table thead > tr > th.actions { + text-align: center; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton { + margin-top: 4px; + padding: 0 12px; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton .fa-plus-circle { + display: inline-block; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton .fa-times-circle { + display: none; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton:active { + background-color: #fb557b; + color: #000; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton:active .fa-times-circle { + display: inline-block; +} +#production .separatedTableHeader table thead > tr > th.actions .newButton:active .fa-plus-circle { + display: none; +} +#production .separatedTableHeader table thead > tr > th.actions .showDeletedButton { + margin-top: 4px; + padding: 0 12px; + color: #808080; +} +#production .separatedTableHeader table thead > tr > th.actions .showDeletedButton.selected { + color: #000; +} +#production .listRow { + display: table-row; +} +#production .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#production .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#production .listRow .listCell .tableContainer table thead { + visibility: hidden; + display: none; +} +#production .listRow .listCell .tableContainer table .search { + margin: 3px 0 2px 1px; +} +#production .listRow .listCell .tableContainer table .editorTd { + background: #deeac0; +} +#production .listRow .listCell .tableContainer table input, +#production .listRow .listCell .tableContainer table select { + width: 100%; +} +#production .listRow .listCell .tableContainer table .editorDiv { + margin: 4px 0; +} +#production .listRow .listCell .tableContainer table .editorDiv label { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 0.9em; + padding-bottom: 4px; +} +#production .listRow .listCell .tableContainer table .editorDiv select2 { + font-size: 0.4em; +} +#production .listRow .listCell .tableContainer table > tbody > tr .actionRemove { + color: #f77; +} +#production .listRow .listCell .tableContainer table > tbody > tr .actionEdit { + color: #44f; +} +#production .listRow .listCell .tableContainer table > tbody > tr .editorApply { + color: #008000; +} +#production .listRow .listCell .tableContainer table > tbody > tr .editorCancel { + color: #f00; +} +#workers { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#workers .tableControls { + display: table; + width: 100%; + text-align: right; + margin-right: 20px; +} +#workers .tableControls .showHidden { + display: table-cell; + width: 100%; +} +#workers .tableControls .showHidden .controlLabel { + font-size: 9px; + font-weight: 700; + color: #5a5a5a; + position: relative; + top: -2px; +} +#workers .tableControls .showHidden .toggleShowHidden { + margin: 0 40px 0 0; + position: relative; + top: -4px; + display: inline-block; +} +#workers .tableControls .contentControls { + vertical-align: bottom; + display: table-cell; + text-align: right; + min-width: 100px; +} +#workers .tableControls .contentControls a { + font-size: 12px; + font-family: "Arial", san-serif; + font-weight: 800; + color: #2d1b8c; + text-decoration: none; +} +#workers .tableControls .contentControls a:hover { + text-decoration: underline; +} +#workers .tableControls .contentControls a.disabled { + visibility: hidden; +} +#workers .table { + table-layout: fixed; + min-width: 100%; +} +#workers .table thead > tr > .name, +#workers .table tbody > tr > .name { + width: 30%; + min-width: 100px; +} +#workers .table thead > tr > .activities, +#workers .table tbody > tr > .activities { + width: 50%; + min-width: 100px; +} +#workers .table thead > tr > .hourlyRate, +#workers .table tbody > tr > .hourlyRate { + width: 20%; + min-width: 100px; +} +#workers .table thead > tr > .actions, +#workers .table tbody > tr > .actions { + width: 90px; + min-width: 90px; +} +#workers .separatedTableHeader table thead > tr .actions { + text-align: center; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton { + margin-top: 4px; + padding: 0 12px; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton .fa-plus-circle { + display: inline-block; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton .fa-times-circle { + display: none; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton.active { + background-color: #fb557b; + color: #000; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton.active .fa-times-circle { + display: inline-block; +} +#workers .separatedTableHeader table thead > tr .actions .newWorkerButton.active .fa-plus-circle { + display: none; +} +#workers .listRow { + display: table-row; +} +#workers .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: 100%; +} +#workers .listRow .listCell .tableContainer { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: auto; +} +#workers .listRow .listCell .tableContainer table { + table-layout: fixed; + width: 100%; +} +#workers .listRow .listCell .tableContainer table .workerSearch { + margin: 3px 0 2px 1px; +} +#workers .listRow .listCell .tableContainer table .workerEditorTd { + background: #deeac0; +} +#workers .listRow .listCell .tableContainer table input[name="name"], +#workers .listRow .listCell .tableContainer table .activitiesEditor, +#workers .listRow .listCell .tableContainer table input[name="hourlyRate"] { + width: 100%; +} +#workers .listRow .listCell .tableContainer table .editorDiv { + margin: 4px 0; +} +#workers .listRow .listCell .tableContainer table .editorDiv label { + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-size: 0.9em; + padding-bottom: 4px; +} +#workers .listRow .listCell .tableContainer table .editorDiv select2 { + font-size: 0.4em; +} +#workers .listRow .listCell .tableContainer table > thead { + display: none; + visibility: hidden; +} +#workers .listRow .listCell .tableContainer table > tbody > tr .actionRemove { + color: #f77; +} +#workers .listRow .listCell .tableContainer table > tbody > tr .actionEdit { + color: #44f; +} +#workers .listRow .listCell .tableContainer table > tbody > tr .editorApply { + color: #008000; +} +#workers .listRow .listCell .tableContainer table > tbody > tr .editorCancel { + color: #f00; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionActivate { + color: #158b18; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionHide { + color: #6a0707; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.deactivated .actionEdit { + color: #0101e4; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.hidden { + background-color: #e995ff; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.hidden .actionEdit { + color: #0101e4; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.hidden .actionShow { + color: #027905; +} +#workers .listRow .listCell .tableContainer table > tbody > tr.hidden:hover { + background-color: #ffb5ff; +} +#graphs { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; +} +#graphs svg { + width: 100%; +} +#graphs .bar { + fill: #4682b4; +} +#graphs .xAxisLabels { + font-size: 7px; + font-family: "Arial", Gadget, sans-serif; + font-weight: 100; +} +#graphs .yAxisLabels { + font-size: 12px; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-weight: 800; +} +#graphs .barText { + font-size: 14px; + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif; + font-weight: 800; +} +#graphs .table { + table-layout: fixed; +} +#graphs .table .total { + width: 200px; +} +#graphs .table .market { + width: 200px; +} +#graphs .table .week { + width: 200px; +} +#graphs .table .month { + width: 200px; +} +#graphs .table .year { + width: 200px; +} +#graphs .listRow { + display: table-row; +} +#graphs .listRow .listCell { + display: table-cell; + position: relative; + height: 100%; + width: auto; + min-width: 300px; +} +#graphs .listRow .listCell .salesTable { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: auto; + height: auto; + border: 0; + font-size: 12.5px; + overflow-y: scroll; +} +#graphs .listRow .listCell .salesTable .table > thead { + display: none; +} +#graphs .listRow .listCell .salesTable .table > tbody > tr.deactivated { + background-color: #fac0d1; +} +#graphs .listRow .listCell .salesTable .table > tbody > tr.deactivated:hover { + background-color: #ffcadb; +} +#graphs .listRow .spacerCell { + display: table-cell; + position: relative; + width: 100%; + height: 100%; +} +#reports { + display: table; + content-box: border-box; + padding: 10px 20px; + height: 100%; + width: 100%; + text-align: left; + margin-left: 20px; +} +#labelMaker { + margin: 10px 20px; + height: 100%; + width: 100%; + overflow-y: auto; +} +@media not print { + #labelMaker .labelOptions label { + font-family: TimesNewRoman, Times New Roman, Times; + font-weight: 200; + font-size: 14px; + } + #labelMaker .labelOptions .title1 { + width: 500px; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 0.142in; + font-weight: 800; + line-height: 0.142in; + } + #labelMaker .labelOptions .title2 { + width: 500px; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 14px; + font-weight: 800; + line-height: 16px; + } + #labelMaker .labelOptions .ingredients { + width: 500px; + height: 100px; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 12px; + font-weight: 100; + line-height: 14px; + } + #labelMaker .labelOptions .date { + width: 500px; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 12px; + font-weight: 100; + line-height: 14px; + } + #labelMaker .labelContainer { + text-align: center; + width: 100%; + width-min: 3in; + height-min: 2in; + background-color: #808080; + padding: 20px; + } + #labelMaker .labels { + display: none; + } + #labelMaker .printableLabel { + display: none; + } + #labelMaker .label { + display: inline-block; + width: 3in; + height: 2in; + } + #labelMaker .canvasContainer { + padding: 10px; + background-color: #808080; + } +} +@media all { + #labelMaker .label { + position: relative; + background-color: #fff; + color: #000; + text-align: center; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 0.1in; + width: 3in; + height: 2in; + } + #labelMaker .label .barcodeContainer { + position: absolute; + transform: rotate(270deg) scale(0.7); + right: -10em; + top: 7em; + } + #labelMaker .label .qrcode { + position: absolute; + left: 3px; + top: 3px; + } + #labelMaker .label .labelLogo { + width: 8em; + padding: 0; + margin: 0; + padding-top: 0.15em; + margin-bottom: 0.2em; + } + #labelMaker .label .labelLogo3 { + width: 14em; + padding: 0; + margin: 0; + padding-top: 0.15em; + margin-bottom: 0.8em; + } + #labelMaker .label .labelTagline { + font-size: 1em; + font-weight: 100; + line-height: 1em; + } + #labelMaker .label .title1 { + width: 100%; + font-size: 2.5em; + line-height: 0.9em; + font-weight: 800; + text-transform: uppercase; + } + #labelMaker .label .title2 { + width: 100%; + font-size: 1.5em; + line-height: 0.9em; + font-weight: 800; + padding-bottom: 0.2em; + } + #labelMaker .label .ingredients { + width: 100%; + font-size: 1.2em; + font-weight: 100; + line-height: 1em; + min-height: 2em; + } + #labelMaker .label .ingredientsEnding { + width: 100%; + font-size: 1.2em; + font-weight: 100; + } + #labelMaker .label .instructions { + width: 100%; + font-size: 1.2em; + font-weight: 800; + } + #labelMaker .label .address { + width: 100%; + font-size: 1.2em; + font-weight: 100; + } + #labelMaker .label .website { + width: 100%; + font-size: 1.2em; + font-weight: 100; + } +} +@media print { + @page { + size: 3in 2in; + margin: 0; + padding: 0; + } + #labelMaker .labelOptions, + #labelMaker .labelContainer, + #labelMaker .canvasContainer, + #labelMaker .labelCanvas { + display: none; + } + #labelMaker .printableLabel { + display: block; + margin: 0; + padding: 0; + } + #labelMaker .canvasContainer { + display: none; + } +} +@media print { + .labelMaker { + margin: 0; + padding: 0; + overflow: visible; + } +} +#testList { + margin: 10px 20px; + height: 100%; +} +#PrintLabel .labelContainer { + text-align: center; + width-min: 3in; + width: 3in; + height-min: 2in; + height: 2in; +} +#PrintLabel .labels { + display: none; +} +#PrintLabel .printableLabel { + display: none; +} +#PrintLabel .label { + display: inline-block; + width: 3in; + height: 2in; +} +#PrintLabel .canvasContainer { + padding: 10px; + background-color: #808080; +} +#PrintLabel .label { + position: relative; + background-color: #fff; + color: #000; + text-align: center; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 0.1in; + width: 3in; + height: 2in; +} +#PrintLabel .label .barcodeContainer { + position: absolute; + transform: rotate(270deg); + right: -4.5em; + top: 5em; +} +#PrintLabel .label .qrcode { + position: absolute; + left: 10px; + top: 10px; +} +#PrintLabel .label .labelLogo { + width: 8em; + padding: 0; + margin: 0; + padding-top: 0.15em; + margin-bottom: 0.2em; +} +#PrintLabel .label .labelLogo3 { + width: 14em; + padding: 0; + margin: 0; + padding-top: 0.15em; + margin-bottom: 0.8em; +} +#PrintLabel .label .labelTagline { + font-size: 1em; + font-weight: 100; + line-height: 1em; +} +#PrintLabel .label .title1 { + width: 100%; + font-size: 2.5em; + line-height: 0.9em; + font-weight: 800; + text-transform: uppercase; +} +#PrintLabel .label .title2 { + width: 100%; + font-size: 1.5em; + line-height: 0.9em; + font-weight: 800; + padding-bottom: 0.2em; +} +#PrintLabel .label .ingredients { + width: 100%; + font-size: 1.2em; + font-weight: 100; + line-height: 1em; + min-height: 2em; +} +#PrintLabel .label .ingredientsEnding { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} +#PrintLabel .label .instructions { + width: 100%; + font-size: 1.2em; + font-weight: 800; +} +#PrintLabel .label .address { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} +#PrintLabel .label .website { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} diff --git a/client/main.styl b/client/main.styl index 375ca43..e1eb162 100644 --- a/client/main.styl +++ b/client/main.styl @@ -188,4 +188,6 @@ body @import "../imports/ui/Graphs.import.styl" @import "../imports/ui/Reports.import.styl" @import "../imports/ui/Label.import.styl" -@import "../imports/ui/TestList.import.styl" \ No newline at end of file +@import "../imports/ui/TestList.import.styl" + +@import "../imports/ui/PrintLabel.import.styl" \ No newline at end of file diff --git a/imports/api/Barcode.js b/imports/api/Barcode.js new file mode 100644 index 0000000..6b9c0b7 --- /dev/null +++ b/imports/api/Barcode.js @@ -0,0 +1,81 @@ +import {Mongo} from "meteor/mongo"; +import { Meteor } from 'meteor/meteor'; +import { check } from 'meteor/check'; +import {SimpleSchema} from 'meteor/aldeed:simple-schema'; + +Barcodes = new Mongo.Collection('Barcodes'); + +// A simple mapping between a concatenation of the product & measure ID and a unique sequential number for the barcode. This allows us to have a small number to keep our barcodes simple, while maintaining the more traditional MongoDB ID's for the Product and Measure. +const BarcodesSchema = new SimpleSchema({ + barcodeId: { + type: Number, + label: "Barcode ID", + optional: false, + index: 1, + unique: true + }, + productAndMeasureId: { //Just the two ids jammed together with a single space between them. + type: String, + label: "Product And Measure ID", + optional: false, + index: 1, + unique: true + } +}); + +if(Meteor.isServer) { + //Meteor.publish('barcodes', function() { + // return Barcodes.find({}); + //}); + + Meteor.methods({ + getBarcodeId: function(productId, measureId) { + check(productId, String); + check(measureId, String); + + let hasProduct = Meteor.collections.Products.findOne({_id: productId}, {fields: {}}); + let hasMeasure = Meteor.collections.Measures.findOne({_id: measureId}, {fields: {}}); + + if(hasProduct && hasMeasure) { + let existing = Barcodes.findOne({productAndMeasureId: productId + ' ' + measureId}); + + if(existing) { + return existing.barcodeId; + } + else { + let c = 0; + + //Try a thousand times before failing. Should never fail, should also not ever need to try a thousand times (unless we somehow automate label generation to the point where a 1000 processes at once are requesting labels that have never been generated before - highly unlikely). + while(c++ < 1000) { + //Lookup the most likely next barcode id from the db, then attempt to insert with it. If it fails due to duplication, then increment and repeat. + let cursor = Products.find({}, {barcodeId: 1}).sort({barcodeId: -1}).limit(1); //Since currently products are never removed, we shouldn't need to detect sequence gaps and fill them in (odds are we will never use more than 10k numbers anyway). + let barcodeId = cursor.hasNext() ? cursor.next().barcodeId + 1 : 1; + + Barcodes.insert({productAndMeasureId: productId + ' ' + measureId, barcodeId}, function(err, id) { + if(err) console.log(err); + else return barcodeId; + }); + } + + //If we are still here, then there was a massive failure (c exceeded 1000). + console.log("We failed to generate a new barcode ID 1000 times, so we are giving up. This should never happen."); + throw new Meteor.Error(403, "Unable to generate a barcode ID."); + } + } + else { + //Cannot find either the product or the measure in the db. Cannot give an id. + console.log("Unable to generate a barcode ID because we could not find the product " + productId + " OR we could not find the measure " + measureId); + throw new Meteor.Error(403, "Unable to find the product or the measure. Both must exist in order to generate a barcode ID."); + } + }, + }); +} + +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +Barcodes.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + +export default Barcodes; \ No newline at end of file diff --git a/imports/api/Batch.js b/imports/api/Batch.js new file mode 100644 index 0000000..d5fd9f7 --- /dev/null +++ b/imports/api/Batch.js @@ -0,0 +1,265 @@ +import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; +import { check } from 'meteor/check'; +import {SimpleSchema} from 'meteor/aldeed:simple-schema'; + +/** + * Notes: + * The Batch object has a date field which stores the date as a number in the format YYYYMMDD. Converting this number into a local date is done with moment(batch.date.toString(), "YYYYMMDD").toDate(), and converting it to a number from a date can be accomplished with ~~(moment(date).format("YYYYMMDD")), where the ~~ is a bitwise not and converts a string to a number quickly and reliably. + * A Batch in this system refers to one or more instances of cooking or preparing a product on a given date. It does NOT refer to each instance of cooking the product on that date (what might be called a batch in a kitchen). This might be more effectively called a Run, but that is a confusing word to use in a software system, so I chose to reuse the word Batch since we will not be tracking kitchen batches, just kitchen runs. + */ + +let Batches = new Mongo.Collection('Batches'); +let BatchesSchema = new SimpleSchema({ + date: { + type: Number, // A number in the format of YYYYMMDD to allow for searching using greater and less than, and to prevent timezones from messing everything up. + label: "Date", + optional: false, + index: 1 + }, + timestamp: { //This is based off the date with zero for the time and set to GMT (Zulu time). + type: Date, + label: "Timestamp", + optional: true + }, + weekOfYear: { + type: Number, + label: "Week Of Year", + optional: true + }, + amount: { + type: Number, + label: "Amount", + optional: false, + decimal: true + }, + measureId: { + type: String, + label: "Measure Id", + trim: false, + regEx: SimpleSchema.RegEx.Id, + index: 1 + }, + productId: { + type: String, + label: "Product Id", + trim: false, + regEx: SimpleSchema.RegEx.Id, + index: 1, + optional: false + }, + cookId: { + type: String, + label: "Cook Worker Id", + trim: false, + regEx: SimpleSchema.RegEx.Id, + index: 1 + }, + cannerId: { + type: String, + label: "Canner Worker Id", + trim: false, + regEx: SimpleSchema.RegEx.Id, + index: 1, + optional: false + }, + hasLabels: { + type: Boolean, + label: "Has Labels", + optional: false, + defaultValue: false + }, + comment: { + type: String, + trim: false, + optional: true + }, + createdAt: { + type: Date, + label: "Created On", + optional: false + }, + deletedAt: { + type: Date, + label: "Deleted On", + optional: true + } +}); +Batches.attachSchema(BatchesSchema); +//Ensure that the product ID, measure ID, and date combination are unique. +// Note: I took this out because while it provides for cleaner views, it is overly complicated and could be easily done with a cleanup routine after the fact, or by aggregating the data in the queries. +// What makes this complicated is the notes, cook, and canner references which may not be the same. +//Batches.createIndex({productId: 1, measureId: 1, date: 1}, {unique: true, name: "ProductMeasureDateIndex"}); + +if(Meteor.isServer) { + Meteor.publish('batches', function(query, sort, limit = 100, skipCount) { + let dbQuery = []; + + if(query) { + _.each(_.keys(query), function(key) { + //if(_.isObject(query[key])) dbQuery.push({[key]: query[key]}); + if(_.isObject(query[key])) { + if(query[key].type === 'dateRange') { + if(query[key].start && query[key].end) + dbQuery.push({[key]: {$gte: query[key].start, $lte: query[key].end}}); + else if(query[key].start) + dbQuery.push({[key]: {$gte: query[key].start}}); + else if(query[key].end) + dbQuery.push({[key]: {$lte: query[key].end}}); + // Do nothing if a start and/or end are not provided. + } + else { + dbQuery.push({[key]: query[key]}); + } + } + else if(_.isNumber(query[key])) dbQuery.push({[key]: query[key]}); + else { + let searchValue = query[key]; + let searches = searchValue && searchValue.length > 0 ? searchValue.split(/\s+/) : undefined; + + for(let search of searches) { + dbQuery.push({[key]: {$regex: '\\b' + search, $options: 'i'}}); + } + } + }); + } + + if(!_.isNumber(limit)) limit = 100; + if(!_.isNumber(skipCount) || skipCount < 0) skipCount = 0; + + dbQuery = dbQuery.length > 0 ? {$and: dbQuery} : {}; + return Meteor.collections.Batches.find(dbQuery, {limit: limit, sort, skip: skipCount}); + }); + + Meteor.methods({ + getBatchCount: function(query) { + //TODO: Validate the query? + return Sales.find(query).count(); + }, + insertBatches: function(batches) { //Insert one or more batches (if one, you can pass just the batch). + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + //Force it to be an array if it isn't. + if(!Array.isArray(batches)) batches = [batches]; + + //Validate them all. + for(let batch of batches) { + check(batch, { + date: Number, // TODO: Check that the format is YYYYMMDD + amount: Match.Where(function(x) { + check(x, Number); + return x > 0; + }), + measureId: String, + productId: String, + cookId: String, + cannerId: String, + comment: Match.Optional(String) + }); + } + + for(let batch of batches) { + let dateString = batch.date.toString(); + + batch.createdAt = new Date(); + batch.timestamp = new Date(dateString.substring(0, 4) + "-" + dateString.substring(4, 6) + "-" + dateString.substring(6, 8) + "T00:00:00Z"); + batch.weekOfYear = batch.timestamp.getWeek().toString(); + + if(batch.hasLabels === undefined) batch.hasLabels = false; + } + + for(let batch of batches) { + Batches.insert(batch, function(err, id) { + if(err) console.log(err); + }, {bypassCollection2: true}); + } + } + else throw new Meteor.Error(403, "Not authorized."); + }, + deleteBatch: function(id) { //Does not actually delete the batch, but rather just marks it for deleting by applying a deletion date. + check(id, String); + + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + let deletedAt = new Date(); + + //Batches.remove(id); + Batches.update(id, {$set: {deletedAt}}, function(err, id) { + if(err) console.log(err); + }); + } + else throw new Meteor.Error(403, "Not authorized."); + }, + undeleteBatch: function(id) { //Revokes the previous deletion. + check(id, String); + + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + Batches.update(id, {$unset: {deletedAt:""}}, function(err, id) { + if(err) console.log(err); + }); + } + else throw new Meteor.Error(403, "Not authorized."); + }, + editBatchComment: function(id, comment) { + check(id, String); + check(comment, String); + //Trim and convert empty comment to undefined. + comment = comment ? comment.trim() : undefined; + comment = comment && comment.length > 0 ? comment : undefined; + + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + console.log("Changed comment of " + id + " to: " + comment); + + if(comment) { + Batches.update(id, {$set: {comment}}, function(error, count) { + if(error) throw new Meteor.Error(400, "Unexpected database error: " + error); + }); + } + else { + Batches.update(id, {$unset: {comment: ""}}, function(error, count) { + if(error) throw new Meteor.Error(400, "Unexpected database error: " + error); + }); + } + } + else throw new Meteor.Error(403, "Not authorized."); + }, + updateBatch: function(id, date, amount) { + check(id, String); + check(date, Number); // TODO: Check that the format is YYYYMMDD + check(amount, Number); + + let dateString = date.toString(); + let timestamp = new Date(dateString.substring(0, 4) + "-" + dateString.substring(4, 6) + "-" + dateString.substring(6, 8) + "T00:00:00Z"); + let weekOfYear = timestamp.getWeek().toString(); + + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + Batches.update(id, {$set: {date, amount, timestamp, weekOfYear}}, function(err, id) { + if(err) console.log(err); + }, {bypassCollection2: true}); + } + else throw new Meteor.Error(403, "Not authorized."); + }, + setBatchHasLabels: function(id, hasLabels) { + //console.log(id); + //console.log(hasLabels); + //check(id, Meteor.validators.ObjectID); + check(id, String); + check(hasLabels, Boolean); + + if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + Batches.update(id, {$set: {hasLabels}}, function(err, id) { + if(err) console.log(err); + }, {bypassCollection2: true}); + } + else throw new Meteor.Error(403, "Not authorized."); + } + }); +} + + +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +Batches.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + +export default Batches; \ No newline at end of file diff --git a/imports/api/Label.js b/imports/api/Label.js new file mode 100644 index 0000000..9ff2497 --- /dev/null +++ b/imports/api/Label.js @@ -0,0 +1,130 @@ +import { Meteor } from 'meteor/meteor'; +import { Mongo } from 'meteor/mongo'; +import { check } from 'meteor/check'; +import {SimpleSchema} from 'meteor/aldeed:simple-schema'; + + +if(Meteor.isServer) { + const puppeteer = require('puppeteer'); + //let Future = Npm.require('fibers/future'); + // + //async function printLabels(data, callback) { + // let params = ""; + // let url = Meteor.absoluteUrl("/LabelPrint"); + // + // params = Object.keys(data).map(function(k) { + // return encodeURIComponent(k) + "=" + encodeURIComponent(data[k]); + // }).join('&'); + // + // url += "?" + params; + // + // const browser = await puppeteer.launch(); + // const page = await browser.newPage(); + // console.log("Going to: " + url); + // await page.goto(url, {waitUntil: 'networkidle0'}); + // // By removing the `path` option, we will receive a `Buffer` from `page.pdf`. + // const pdf = await page.pdf({ width: "6in", height: "4in"}); // format: "A4" //path: 'C:\\Users\\Grumpy\\label.pdf' + // + // await browser.close(); + // callback(null, pdf); + //} + + Meteor.methods({ + //printLabels: function(width, height, layout, title1, title2, ingredients, date) { + // console.log("Loaded Label"); + // let future = new Future(); + // + // let boundCallback = Meteor.bindEnvironment(function(err, res) { + // if(err) { + // future.throw(err); + // } + // else { + // future.return(res); + // } + // }); + // + // printLabels({width, height, layout, title1, title2, ingredients, date}, boundCallback); + // + // return future.wait(); + //} + + async printLabels(width, height, layout, title1, title2, ingredients, date) { + let data = {width, height, layout, title1, title2, ingredients, date}; + let params = ""; + let url = Meteor.absoluteUrl("/PrintLabel"); + + //Switch to the static page - for some reason the Meteor page is not loading correctly (it just appears blank). + //url = Meteor.absoluteUrl("/LabelPrint.html"); + + params = Object.keys(data).map(function(k) { + return encodeURIComponent(k) + "=" + encodeURIComponent(data[k]); + }).join('&'); + + url += "?" + params; + + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + //url = Meteor.absoluteUrl("/StaticTest.html"); + //url = Meteor.absoluteUrl("/StaticTest.html"); + console.log("Going to: " + url); + await page.goto(url, {waitUntil: 'networkidle0'}); //, {waitUntil: 'networkidle0'} + const pdf = await page.pdf({width: '3in', height: '2in'}); //path: 'C:\\Users\\Grumpy\\label.pdf', + //const pdf = await page.pdf({format: 'A4'}); + //await page.pdf({path: 'C:\\Users\\Grumpy\\label.pdf', width: '6in', height: '4in'}); + await browser.close(); + + return new Uint8Array(pdf, 0, pdf.length); + } + }); + + //Returns a JSON containing a denormalized list of products {product_id, measure_id, product_name, measure_name, price, } + WebApp.connectHandlers.use("/labels/GetBarCodeData", (req, res, next) => { + try { + let barcodes = Meteor.collections.Barcodes.find({}, {fields: {_id: 0, barcodeId: 1, productAndMeasureId: 1}}); + let measures = Meteor.collections.Measures.find({}, {fields: {_id: 1, name: 1}, sort: {order: 1}}).fetch(); + //Note: Price data looks like this: {XZ5Z3CM49NDrJNADA /* MeasureID */: {price: 10.5, effectiveDate: ISODate("2017-01-12T13:14:18.876-08:00"), previousPrice: 9}, ...} + //Measures is an array of MeasureIDs valid for this product. + let products = Meteor.collections.Products.find({}, {fields: {_id: 1, name: 1, measures: 1, prices: 1}, sort: {order: 1}}).fetch(); + //let measuresById = measures.reduce((map, measure) => (map[measure._id] = measure), {}); + let measuresById = {}; + let barcodesByProductAndMeasureIds = {}; + let result = {}; + let today = new Date(); + + for(measure of measures) measuresById[measure._id] = measure; + for(barcode of barcodes) barcodesByProductAndMeasureIds[barcode.productAndMeasureId] = barcode.barcodeId; + //console.log(measuresById); + + //for(let measureId of Object.keys(measuresById)) { + // console.log(measureId + ":" + measuresById[measureId].name); + //} + + for(let product of products) { + for(let measureId of product.measures) { + let measureName = measuresById[measureId] ? measuresById[measureId].name : undefined; + let priceData = product.prices ? product.prices[measureId] : undefined; + let price = (priceData ? (priceData.effectiveDate && moment(priceData.effectiveDate).isAfter(today) ? priceData.previousPrice : priceData.price) : 0); //Get the price based on the effective date - whether we should use the new price or the old. + let barcodeId = barcodesByProductAndMeasureIds[productId + " " + measureId]; + + //Ignore any product/measure combinations that don't have barcodes. + if(barcodeId) { + result[barcodeId] = {productId: product._id, measureId: measureId, productName: product.name, measureName, price}; + } + + //TODO: Pass the product & measure data separately from the barcodes also to handle the missing barcode scenario. When a user types in a product name and picks a measure, we can record in the sale the product ID and measure ID, and we can lookup any pricing data. + + //Log any errors so we can figure out what is going on. + if(measureName === undefined) { + //Note: We will pass a price of zero if the price is unknown. This should be fine for now. + console.log(product._id + " " + product.name + " references a measure (" + measureId + ") which is not in the measures array."); + } + } + } + + res.end(JSON.stringify(result), "JSON"); + } catch(err) { + console.log(err); + res.end(); + } + }); +} \ No newline at end of file diff --git a/imports/api/Measure.js b/imports/api/Measure.js index c4c57de..6477869 100644 --- a/imports/api/Measure.js +++ b/imports/api/Measure.js @@ -120,4 +120,11 @@ if(Meteor.isServer) { }); } +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +Measures.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + export default Measures; \ No newline at end of file diff --git a/imports/api/Product.js b/imports/api/Product.js index 9309488..e880113 100644 --- a/imports/api/Product.js +++ b/imports/api/Product.js @@ -132,12 +132,12 @@ const ProductsSchema = new SimpleSchema({ label: "Updated On", optional: true }, - deactivated: { + deactivated: { //This is turned on first, if true it will hide the product in production views, but keep the product available in the sale views. It is intended to be turned on for products that are no longer produced, but for which we have remaining inventory. type: Boolean, label: "Deactivated", optional: true }, - hidden: { + hidden: { //Deactivated must first be true. Hides the product everywhere in the system except in historical pages. The inventory should be all sold prior to hiding a product. type: Boolean, label: "Hidden", optional: true @@ -188,6 +188,10 @@ if(Meteor.isServer) { if(measures) check(measures, [String]); if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { + //Lookup the most likely next barcode id from the db, then attempt to insert with it. If it fails due to duplication, then increment and repeat. + //let cursor = Products.find({}, {barCodeId: 1}).sort({barCodeId: -1}).limit(1); //Since currently products are never removed, we shouldn't need to detect sequence gaps and fill them in (odds are we will never use more than 10k numbers anyway). + //let barCodeId = cursor.hasNext() ? cursor.next().barCodeId : 1; + // Products.insert({name, tags, aliases, measures, createdAt: new Date()}, {bypassCollection2: true}, function(err, id) { if(err) console.log(err); }); diff --git a/imports/api/ProductTag.js b/imports/api/ProductTag.js index 74d5452..39da302 100644 --- a/imports/api/ProductTag.js +++ b/imports/api/ProductTag.js @@ -90,4 +90,11 @@ if(Meteor.isServer) { }); } +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +ProductTags.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + export default ProductTags; \ No newline at end of file diff --git a/imports/api/SalesSheet.js b/imports/api/SalesSheet.js index 0891492..eda0cb5 100644 --- a/imports/api/SalesSheet.js +++ b/imports/api/SalesSheet.js @@ -157,4 +157,11 @@ if(Meteor.isServer) { }); } +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +SalesSheets.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + export default SalesSheets; \ No newline at end of file diff --git a/imports/api/Venue.js b/imports/api/Venue.js index 49557ff..3e9a64c 100644 --- a/imports/api/Venue.js +++ b/imports/api/Venue.js @@ -126,4 +126,11 @@ if(Meteor.isServer) { }); } +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +Venues.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + export default Venues; \ No newline at end of file diff --git a/imports/api/Worker.js b/imports/api/Worker.js index 7660999..e64315e 100644 --- a/imports/api/Worker.js +++ b/imports/api/Worker.js @@ -3,7 +3,7 @@ import { Mongo } from 'meteor/mongo'; import { check } from 'meteor/check'; import {SimpleSchema} from 'meteor/aldeed:simple-schema'; -Workers = new Mongo.Collection('Workers'); +let Workers = new Mongo.Collection('Workers'); let WORKER_ACTIVITIES = ['sales', 'prep', 'canning', 'farming']; let workersSchema = new SimpleSchema({ name: { @@ -60,7 +60,7 @@ let workersSchema = new SimpleSchema({ workersSchema.constants = {activities: WORKER_ACTIVITIES}; Workers.attachSchema(workersSchema); -if(Meteor.isServer) Meteor.publish('Workers', function() { +if(Meteor.isServer) Meteor.publish('workers', function() { return Workers.find({}); }); @@ -122,4 +122,11 @@ if(Meteor.isServer) { }); } +//Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. +Workers.allow({ + insert: function() {return false;}, + update: function() {return false;}, + remove: function() {return false;} +}); + export default Workers; \ No newline at end of file diff --git a/imports/api/index.js b/imports/api/index.js index 65ed194..ef57950 100644 --- a/imports/api/index.js +++ b/imports/api/index.js @@ -1,3 +1,4 @@ +import {Mongo} from 'meteor/mongo'; import Measures from "./Measure.js"; import Venues from "./Venue.js"; import Products from "./Product.js"; @@ -8,15 +9,18 @@ import Logs from "./Logs.js"; import Users from "./User.js"; import UserRoles from "./Roles.js"; import Workers from "./Worker.js"; +import Barcodes from "./Barcode.js"; +import Batches from "./Batch.js"; import './Reports.js'; +import './Label.js'; //Save the collections in the Meteor.collections property for easy access without name conflicts. -Meteor.collections = {Measures, Venues, Products, ProductTags, Sales, SalesSheets, Logs, Users, UserRoles, Workers}; +Meteor.collections = {Measures, Venues, Products, ProductTags, Sales, SalesSheets, Logs, Users, UserRoles, Workers, Barcodes, Batches}; //If this is the server then setup the default admin user if none exist. if(Meteor.isServer) { //Change this to find admin users, create a default admin user if none exists. - if(Users.find({}).count() == 0) { + if(Users.find({}).count() === 0) { try { console.log("Creating a default admin user: admin/admin"); @@ -28,4 +32,14 @@ if(Meteor.isServer) { console.log(err); } } + + Meteor.validators = {}; + Meteor.validators.ObjectID = Match.Where(function(id) { + if(id instanceof Mongo.ObjectID) { + id = id._str; + } + + check(id, String); + return /[0-9a-fA-F]{24}/.test(id); + }); } \ No newline at end of file diff --git a/imports/startup/client/routes.js b/imports/startup/client/routes.js index f187434..036fcfa 100644 --- a/imports/startup/client/routes.js +++ b/imports/startup/client/routes.js @@ -123,6 +123,13 @@ pri.route('/labels', { BlazeLayout.render('Body', {content: 'LabelMaker'}); } }); +FlowRouter.route('/PrintLabel', { + name: 'PrintLabel', + action: function(params, queryParams) { + require("/imports/ui/PrintLabel.js"); + BlazeLayout.render('Empty', {content: 'PrintLabel'}); + } +}); pri.route('/testList', { name: 'TestList', action: function(params, queryParams) { diff --git a/imports/ui/Label.html b/imports/ui/Label.html index e056112..090d5d1 100644 --- a/imports/ui/Label.html +++ b/imports/ui/Label.html @@ -1,31 +1,46 @@ + + + + + + + +
- diff --git a/imports/ui/Label.import.styl b/imports/ui/Label.import.styl index df74bac..b301206 100644 --- a/imports/ui/Label.import.styl +++ b/imports/ui/Label.import.styl @@ -1,93 +1,163 @@ + #labelMaker - margin: 10px 20px - height: 100% - width: 100% + margin 10px 20px + height 100% + width 100% + overflow-y auto - .labelContents - label - font-family: TimesNewRoman, Times New Roman, Times - font-weight: 200 - font-size: 14px - .title1 - width: 500px - font-family: TimesNewRoman, Times New Roman, Times - font-size: .142in - font-weight: 800 - line-height: .142in - .title2 - width: 500px - font-family: TimesNewRoman, Times New Roman, Times - font-size: 14px - font-weight: 800 - line-height: 16px - .ingredients - width: 500px - height: 100px - font-family: TimesNewRoman, Times New Roman, Times - font-size: 12px - font-weight: 100 - line-height: 14px - .date - width: 500px - font-family: TimesNewRoman, Times New Roman, Times - font-size: 12px - font-weight: 100 - line-height: 14px - .labelContainer - text-align: center - width: 100% - width-min: 3in - height-min: 2in - background-color: grey - padding: 20px - .labelSample - display: inline-block - width: 3in - height: 2in - background-color: white - color: black - text-align: center - .labelLogo - width: .8in - .labelTagline - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 100 - line-height: .2in + @media not print + .labelOptions + label + font-family TimesNewRoman, Times New Roman, Times + font-weight 200 + font-size 14px .title1 - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .2in - font-weight: 800 - text-transform: uppercase + width 500px + font-family TimesNewRoman, Times New Roman, Times + font-size .142in + font-weight 800 + line-height .142in .title2 - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .15in - font-weight: 800 + width 500px + font-family TimesNewRoman, Times New Roman, Times + font-size 14px + font-weight 800 + line-height 16px .ingredients - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 100 + width 500px + height 100px + font-family TimesNewRoman, Times New Roman, Times + font-size 12px + font-weight 100 + line-height 14px + .date + width 500px + font-family TimesNewRoman, Times New Roman, Times + font-size 12px + font-weight 100 + line-height 14px + .labelContainer + text-align center + width 100% + width-min 3in + height-min 2in + background-color grey + padding 20px + .labels + display none + .printableLabel + display none + .label + display inline-block + width 3in + height 2in + .canvasContainer + padding 10px + background-color gray + @media all + .label + position relative + background-color white + color black + text-align center + font-family TimesNewRoman, Times New Roman, Times + //font-family Arial, Helvetica, sans-serif + font-size .1in + width 3in + height 2in + .barcodeContainer + position absolute + transform rotate(270deg) scale(0.7) + right -10em + top 7em + .qrcode + position absolute + left 3px + top 3px + //padding: 2px + //border: 2px solid black + .labelLogo + width 8em + padding 0 + margin 0 + padding-top .15em + margin-bottom .2em + .labelLogo3 + width 14em + padding 0 + margin 0 + padding-top .15em + margin-bottom .8em + .labelTagline + font-size 1em + font-weight 100 + line-height 1em + .title1 + width 100% + font-size 2.5em + line-height .9em + font-weight 800 + text-transform uppercase + .title2 + width 100% + font-size 1.5em + line-height .9em + font-weight 800 + padding-bottom .2em + .ingredients + width 100% + font-size 1.2em + font-weight 100 + line-height 1em + min-height 2em .ingredientsEnding - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 100 + width 100% + font-size 1.2em + font-weight 100 .instructions - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 800 + width 100% + font-size 1.2em + font-weight 800 .address - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 100 + width 100% + font-size 1.2em + font-weight 100 .website - width: 100% - font-family: TimesNewRoman, Times New Roman, Times - font-size: .1in - font-weight: 100 + width 100% + font-size 1.2em + font-weight 100 + @media print + @page + size 3in 2in + margin 0 + padding 0 + .labelOptions, .labelContainer, .canvasContainer, .labelCanvas + display none + .printableLabel + display block + margin 0 + padding 0 + //.printableLabels + // display inline-block + // margin 0 + // padding 0 + //#labelMaker + // display none + //.labels + // display block + //.label + // display block + // width 3in + // height 2in + // //width 100% + // //height 100% + // page-break-after always + // page-break-inside avoid + .canvasContainer + display none +@media print + .labelMaker + margin 0 + padding 0 + overflow visible \ No newline at end of file diff --git a/imports/ui/Label.js b/imports/ui/Label.js index bf023c8..7d0ffc2 100644 --- a/imports/ui/Label.js +++ b/imports/ui/Label.js @@ -1,75 +1,416 @@ - +import dti from 'dom-to-image'; import './Label.html'; +import PDF from 'jspdf'; +import { saveAs } from 'file-saver'; import swal from 'sweetalert2'; import dragula from 'dragula'; +//import JsBarcode from 'JsBarcode'; +import QRCode from '/imports/util/qrcode/qrcode'; +//let QRCode = require('/imports/util/qrcode/qrcode.js'); + +console.log(QRCode); + +//let {qrcode, svg2url} = require('pure-svg-code'); +//let QRCode = require('qrcode-svg'); //****************************************************************** //** Creates printable labels for a roll style printer. //****************************************************************** let PREFIX = "LabelMaker_"; +let PX_PER_MM = 300 / 25.4; +let SCREEN_PX_PER_MM = 96 / 25.4; +let imagePath = "/images/3x2 Label Logo BW.svg";//"/images/Logo_0.8x0.73_300ppi.png"; + +function generateLabels(title1, title2, ingredients, date, count, topSpacing, bottomSpacing) { + //TODO: Allow logo to be removed or altered with an alternative logo for sizing fixes + let label = "
" + + "
" + + //"
" + + //"" + + "" + + //"
We grow it. We can it.
" + + "
" + title1 + "
" + + "
" + (title2 === undefined ? "" : title2) + "
" + + "
Ingredients:" + ingredients + "
" + + "
*grown by us 8oz FD1951 (" + date + ")
" + + "
Refrigerate after opening; return jar when done
" + + "
18601 Hwy 128, Yorkville, CA 95494
" + + "
www.PetitTeton.com
" + + //"
" + + "
"; + let labels = ""; + + //TODO: Include bar code and identifying numbers. + for(let i = 0; i < count; i++) { + labels += label; + } + + return labels; +} + +function printImageOld(template, dataUrl) { + let img = new Image(); + + img.onload = function() { + let imageCanvas = $('.labelCanvas')[0]; + let ctx = imageCanvas.getContext('2d'); + //let threshold = 255 + 200 + 0; + let desiredContrast = 100; + let contrastCorrectionFactor = (259 * (desiredContrast + 255)) / (255 * (259 - desiredContrast)); + + imageCanvas.width = img.width; + imageCanvas.height = img.height; + //console.log("Generated image: " + img.width + ", " + img.height); + //ctx.scale(0.25, 0.25); + ctx.drawImage(img, 0, 0); + + let imageData = ctx.getImageData(0, 0, imageCanvas.width, imageCanvas.height); + let data = imageData.data; + + //Run three times + for(let c = 0; c < 3; c++) { + //Set each pixel to either black or white with the given threshold. + for(let i = 0; i < data.length; i += 4) { + data[i] = contrastCorrectionFactor * (data[i] - 128) + 128; + data[i + 1] = contrastCorrectionFactor * (data[i + 1] - 128) + 128; + data[i + 2] = contrastCorrectionFactor * (data[i + 2] - 128) + 128; + //if(data[i] + data[i + 1] + data[i + 2] < threshold) { + // data[i] = 0; + // data[i + 1] = 0; + // data[i + 2] = 0; + //} + //else { + // data[i] = 255; + // data[i + 1] = 255; + // data[i + 2] = 255; + //} + data[i + 3] = 255; + } + } + + ctx.putImageData(imageData, 0, 0); + + //Convert the canvas content to an image for printing. (cannot print a canvas?) + //sendToPrinter(template, imageCanvas.toDataURL("image/png")); + + //Save to disk. + //imageCanvas.toBlob(function(blob) { + // saveAs(blob, "label.png"); + //}, "image/png", 1); + + //imageCanvas.toBlob(function(blob) { + // let url = URL.createObjectURL(blob); + // window.open(url, "_blank"); + //}, "image/png", 1); + + //let imgData = imageCanvas.toDataURL('image/jpeg', 1.0); + imageCanvas.toBlob(function(blob) { + let pdf = new PDF(); + let url = URL.createObjectURL(blob); + pdf.addImage(url, "image/png", 0, 0); + pdf.save("label.pdf"); + }, "image/png", 1); + }; + img.src = dataUrl; +} + +function printImage(template, raw, width, height) { + let data = raw; + //Run three times + for(let c = 0; c < 3; c++) { + //Set each pixel to either black or white with the given threshold. + for(let i = 0; i < data.length; i += 4) { + data[i] = contrastCorrectionFactor * (data[i] - 128) + 128; + data[i + 1] = contrastCorrectionFactor * (data[i + 1] - 128) + 128; + data[i + 2] = contrastCorrectionFactor * (data[i + 2] - 128) + 128; + //if(data[i] + data[i + 1] + data[i + 2] < threshold) { + // data[i] = 0; + // data[i + 1] = 0; + // data[i + 2] = 0; + //} + //else { + // data[i] = 255; + // data[i + 1] = 255; + // data[i + 2] = 255; + //} + data[i + 3] = 255; + } + } + + let url = URL.createObjectURL(new Blob(raw, {type: "image/png"})); + let test = new Image(); + test.src = url; + $('.testImage').html(test); +} +// Note: Not working correctly. Output seems to be at 96dpi instead of 300+dpi. Using a large image scaled down in in an Image tag seems to not print well. +function sendToPrinter(template, dataUrl) { + let canvasImg = new Image(); + canvasImg.onload = function() { + //window.print(); + }; + canvasImg.src = dataUrl; + canvasImg.style.height = template.labelHeight.get() + "mm"; + canvasImg.style.width = template.labelWidth.get() + "mm"; + $(".printableLabel").html(canvasImg); + + //$('.printableLabel').html(img); + window.print(); +} + +function loadImage(url) { + return new Promise(r => { let i = new Image(); i.onload = (() => r(i)); i.src = url; }); +} +async function refreshLabelCanvas(template) { + let mmWidth = template.labelWidth.get(); + let mmHeight = template.labelHeight.get(); + let title1 = template.title1.get(); + let title1Font = template.title1Font.get(); + let title1YOffset = template.title1YOffset.get(); + let title2 = template.title2.get(); + let title2Font = template.title2Font.get(); + let title2YOffset = template.title2YOffset.get(); + let ingredients = template.ingredients.get(); + let ingredientsFont = template.ingredientsFont.get(); + let ingredientsYOffset = template.ingredientsYOffset.get(); + let date = template.date.get(); + let $labelCanvas = $('.labelCanvas'); + let ctx = $labelCanvas[0].getContext('2d'); + let width = Math.floor(mmWidth * PX_PER_MM); + let height = Math.floor(mmHeight * PX_PER_MM); + let center = width / 2; + + let img = await loadImage(imagePath); + let imageWidth = 241; + let imageHeight = 219; + + let ingredientsY = 180; + let ingredientsEndingY = 240; + let instructionsY = 280; + let addressY = 320; + let websiteY = 380; + + ctx.fillStyle = 'white'; + ctx.fillRect(0,0, width, height); + ctx.fillStyle = 'black'; + ctx.drawImage(img, center - (imageWidth / 2), 0); + ctx.font = title1Font; + ctx.textAlign = 'center'; + ctx.fillText(title1, center, title1YOffset); + + + + ////TODO: Allow logo to be removed or altered with an alternative logo for sizing fixes + //let label = "
" + + // "
" + + // //"" + + // "" + + // "
We grow it. We can it.
" + + // "
" + title1 + "
" + + // "
" + (title2 === undefined ? "" : title2) + "
" + + // "
Ingredients:" + ingredients + "
" + + // "
*grown by us 8oz FD1951 (" + date + ")
" + + // "
Refrigerate after opening; return jar when done
" + + // "
18601 Hwy 128, Yorkville, CA 95494
" + + // "
www.PetitTeton.com
" + + // "
" + + // "
"; + //let labels = ""; + // + ////TODO: Include bar code and identifying numbers. + //for(let i = 0; i < count; i++) { + // labels += label; + //} + // + //return labels; +} +function bufferToBase64(buf) { + var binstr = Array.prototype.map.call(buf, function (ch) { + return String.fromCharCode(ch); + }).join(''); + return btoa(binstr); +} Template.LabelMaker.onCreated(function() { + this.labelWidth = new ReactiveVar(76); + this.labelHeight = new ReactiveVar(50); + + this.title1 = new ReactiveVar("Strawberry"); + this.title2 = new ReactiveVar("w/ Espelette"); + this.ingredients = new ReactiveVar("*strawberry, sugar, *espelette"); + + this.date = new ReactiveVar(19001); + + //Session.set(PREFIX + "title1", "Strawberry"); + //Session.set(PREFIX + "title1Font", "50px Times New Roman"); + //Session.set(PREFIX + "title1YOffset", 260); + //Session.set(PREFIX + "title2", "w/ Espelette"); + //Session.set(PREFIX + "title2Font", "40px Times New Roman"); + //Session.set(PREFIX + "title2YOffset", 340); + //Session.set(PREFIX + "ingredients", "*strawberry, sugar, *espelette"); + //Session.set(PREFIX + "date", 19001); + //Session.set(PREFIX + "count", 3); }); Template.LabelMaker.onRendered(function() { let template = this; + + //Re-run this routine when ever the session variables change. + //Tracker.autorun(function() { + // //refreshLabelCanvas(Session.get(PREFIX + "title1"), Session.get(PREFIX + "title2"), Session.get(PREFIX + "ingredients"), Session.get(PREFIX + "date"), 1, Session.get(PREFIX + "labelSpacing"), 0); + // refreshLabelCanvas(template); + //}); + // + //template.$('.labelContainer').on('DOMSubtreeModified', function() { + // console.log("Initialized barcode"); + // // + //}); + //JsBarcode(".barcode").init(); + + + //const svgString = qrcode({content: "1234567890", padding: 0, width: 60, height: 60, color: "#000000", background: "#FFFFFF", ecl: "L"}); + //this.$('.qrcode').attr('src', svg2url(svgString)); + + //this.$('.qrcode').attr('src', svg2url(new QRCode({content: '1234567890', width: 80, height: 80, color: "#000000", background: "#FFFFFF"}).svg())); + + new QRCode(document.getElementById("qrcode"), {text: "1234567890", width: 60, height: 60}); }); Template.LabelMaker.onDestroyed(function() { }); Template.LabelMaker.events({ - 'change .title1': function(event, template) { - Session.set(PREFIX + "title1", $(event.target).val()); + 'change .labelWidth': function(e, t) { + let x = $(e.target).val(); + + t.labelWidth.set(!Number.isNaN(x) && x > 0 ? parseFloat(x) : 76); }, - 'change .title2': function(event, template) { - Session.set(PREFIX + "title2", $(event.target).val()); + 'change .labelHeight': function(event, template) { + let x = $(event.target).val(); + + t.labelHeight.set(!Number.isNaN(x) && x > 0 ? parseFloat(x) : 50); }, - 'change .ingredients': function(event, template) { - Session.set(PREFIX + "ingredients", $(event.target).val()); - }, - 'change .date': function(event, template) { - Session.set(PREFIX + "date", parseInt($(event.target).val())); - }, - 'click .generate': function(event, template) { + 'change .title1': function(e, t) {t.title1.set($(e.target).val());}, + 'change .title1Font': function(e, t) {t.title1Font.set($(e.target).val());}, + 'change .title1YOffset': function(e, t) {t.title1YOffset.set(parseInt($(e.target).val()));}, + + 'change .title2': function(e, t) {t.title2.set($(e.target).val());}, + 'change .title2Font': function(e, t) {t.title2Font.set($(e.target).val());}, + 'change .title2YOffset': function(e, t) {t.title2YOffset.set(parseInt($(e.target).val()));}, + + 'change .ingredients': function(e, t) {t.ingredients.set($(e.target).val());}, + 'change .ingredientsFont': function(e, t) {t.ingredientsFont.set($(e.target).val());}, + 'change .ingredientsYOffset': function(e, t) {t.ingredientsYOffset.set(parseInt($(e.target).val()));}, + + 'change .date': function(e, t) {t.date.set(parseInt($(e.target).val()));}, + 'click .preview': function(event, template) { + let params = {}; + + params['title1'] = "Strawberry"; + params['title2'] = ""; + params['ingredients'] = "Fairies"; + params['date'] = "1234"; + window.open('/PrintLabel?' + $.param(params)); + }, + 'click .print': function(event, template) { + let _this = template; + let node = $('.label')[0]; + let width = _this.labelWidth.get(); + let height =_this.labelHeight.get(); + let title1 =_this.title1.get(); + let title2 =_this.title2.get(); + let ingredients =_this.ingredients.get(); + let date =_this.date.get(); + + Meteor.call('printLabels', width, height, "3x2Standard", title1, title2, ingredients, date, (error, result) => { + if(error) { + console.log(error); + } + else { + const blob = new Blob([result], {type: 'application/pdf'}); + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = "labels.pdf"; + link.click(); + } + }); + + //dti.toBlob(node, {bgcolor: 'white'}).then(function(blob) { + // printImage(template, blob); + //}).catch(function(err) { + // console.log(err); + //}); + + //dti.toPng(node, {bgcolor: 'white'}).then(function(dataUrl) { + // printImageOld(template, dataUrl); + //}).catch(function(err) { + // console.log(err); + //}); + + + //let count = template.$('input[name="count"]').val(); + //let spacing = Session.get(PREFIX + "labelSpacing"); + // + ////count = (count === undefined || Number.isNaN(count)) ? 1 : parseInt(count); + //// + ////if(count < 1) { + //// count = 1; + ////} + //// + ////Session.set(PREFIX + "generatedLabels", generateLabels(Session.get(PREFIX + "title1"), Session.get(PREFIX + "title2"), Session.get(PREFIX + "ingredients"), Session.get(PREFIX + "date"), count, 0, spacing)); + // + //let $label = $('.printableLabel'); + // + //console.log($label); + //console.log($label.length); + //domtoimage.toPng($label).then(function(dataUrl) { + // console.log("A"); + // let img = new Image(); + // img.src = dataUrl; + // $('.printableLabel').html(img); + // //caman('.printableLabel img', function() { + // // this.contrast(100); + // // this.render(); + // // window.print(); + // //}); + //}).catch(function(error) { + // console.error("failed to convert dom to image"); + // console.error(error); + //}); } }); Template.LabelMaker.helpers({ - title1: function() {return Session.get(PREFIX + "title1")}, - title2: function() {return Session.get(PREFIX + "title2")}, - ingredients: function() {return Session.get(PREFIX + "ingredients")}, - date: function() {return Session.get(PREFIX + "date")}, - labelText: function() { - return "
" + Session.get(PREFIX + "title1") + "
" + - "
" + Session.get(PREFIX + "title2") + "
" + - "
Ingredients:" + Session.get(PREFIX + "ingredients") + "
" + - "
*grown by us 8oz FD1951 (" + Session.get(PREFIX + "date") + ")
" + - "
Refrigerate after opening; return jar when done
" + - "
18601 Hwy 128, Yorkville, CA 95494
" + - "
www.PetitTeton.com
"; - } -}); - -Template.Labels.onCreated(function() { -}); -Template.Labels.onRendered(function() { - let template = this; -}); -Template.Labels.onDestroyed(function() { -}); -Template.Labels.events({ -}); -Template.Labels.helpers({ - labels: function() {return Session.get(PREFIX + "labels")}, - title2: function() {return Session.get(PREFIX + "title2")}, - ingredients: function() {return Session.get(PREFIX + "ingredients")}, - date: function() {return Session.get(PREFIX + "date")}, - labelText: function() { - return "
" + Session.get(PREFIX + "title1") + "
" + - "
" + Session.get(PREFIX + "title2") + "
" + - "
Ingredients:" + Session.get(PREFIX + "ingredients") + "
" + - "
*grown by us 8oz FD1951 (" + Session.get(PREFIX + "date") + ")
" + - "
Refrigerate after opening; return jar when done
" + - "
18601 Hwy 128, Yorkville, CA 95494
" + - "
www.PetitTeton.com
"; + title1: function() {return Template.instance().title1.get();}, + title2: function() {return Template.instance().title2.get();}, + ingredients: function() {return Template.instance().ingredients.get();}, + date: function() {return Template.instance().date.get();}, + labelWidth: function() {return Template.instance().labelWidth.get();}, + labelHeight: function() {return Template.instance().labelHeight.get();}, + sampleLabel: function() { + let t = Template.instance(); + setTimeout(function() {JsBarcode(".barcode").init();}, 500); + return generateLabels(t.title1.get(), t.title2.get(), t.ingredients.get(), t.date.get(), 1, 0); + }, + //canvasLabel: function() { + // return generateLabelCanvas(Session.get(PREFIX + "title1"), Session.get(PREFIX + "title2"), Session.get(PREFIX + "ingredients"), Session.get(PREFIX + "date"), 1, Session.get(PREFIX + "labelSpacing"), 0); + //}, + labels: function() { + return Session.get(PREFIX + "generatedLabels"); + }, + labelPxWidth: function() { + //console.log("label width: " + Template.instance().labelWidth.get()); + //console.log("px_per_mm: " + PX_PER_MM); + //console.log("labelPxWidth: " + (Template.instance().labelWidth.get() * PX_PER_MM)); + return Math.floor(Template.instance().labelWidth.get() * PX_PER_MM); + }, + labelPxHeight: function() { + return Math.floor(Template.instance().labelHeight.get() * PX_PER_MM); + }, + labelPxWidthActual: function() { + //console.log("label width: " + Template.instance().labelWidth.get()); + //console.log("px_per_mm: " + PX_PER_MM); + //console.log("labelPxWidth: " + (Template.instance().labelWidth.get() * PX_PER_MM)); + return Math.floor(Template.instance().labelWidth.get() * SCREEN_PX_PER_MM); + }, + labelPxHeightActual: function() { + return Math.floor(Template.instance().labelHeight.get() * SCREEN_PX_PER_MM); } }); diff --git a/imports/ui/PrintLabel.html b/imports/ui/PrintLabel.html new file mode 100644 index 0000000..e4b5755 --- /dev/null +++ b/imports/ui/PrintLabel.html @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/imports/ui/PrintLabel.import.css b/imports/ui/PrintLabel.import.css new file mode 100644 index 0000000..515b8be --- /dev/null +++ b/imports/ui/PrintLabel.import.css @@ -0,0 +1,85 @@ +#PrintLabel .labelContainer { + text-align: center; + width: 100%; + width-min: 3in; + height-min: 2in; + background-color: #808080; + padding: 20px; +} +#PrintLabel .labels { + display: none; +} +#PrintLabel .printableLabel { + display: none; +} +#PrintLabel .label { + display: inline-block; + width: 3in; + height: 2in; +} +#PrintLabel .canvasContainer { + padding: 10px; + background-color: #808080; +} +#PrintLabel .label { + background-color: #fff; + color: #000; + text-align: center; + font-family: TimesNewRoman, Times New Roman, Times; + font-size: 0.2in; + width: 6in; + height: 4in; +} +#PrintLabel .label .labelLogo { + width: 8em; + padding: 0; + margin: 0; + padding-top: 0.15em; + margin-bottom: -0.25em; +} +#PrintLabel .label .labelTagline { + font-size: 1em; + font-weight: 100; + line-height: 1em; +} +#PrintLabel .label .title1 { + width: 100%; + font-size: 2.5em; + line-height: 0.9em; + font-weight: 800; + text-transform: uppercase; +} +#PrintLabel .label .title2 { + width: 100%; + font-size: 1.5em; + line-height: 0.9em; + font-weight: 800; + padding-bottom: 0.2em; +} +#PrintLabel .label .ingredients { + width: 100%; + font-size: 1.2em; + font-weight: 100; + line-height: 1em; + min-height: 2em; +} +#PrintLabel .label .ingredientsEnding { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} +#PrintLabel .label .instructions { + width: 100%; + font-size: 1.2em; + font-weight: 800; +} +#PrintLabel .label .address { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} +#PrintLabel .label .website { + width: 100%; + font-size: 1.2em; + font-weight: 100; +} diff --git a/imports/ui/PrintLabel.import.styl b/imports/ui/PrintLabel.import.styl new file mode 100644 index 0000000..3632d3d --- /dev/null +++ b/imports/ui/PrintLabel.import.styl @@ -0,0 +1,92 @@ + +#PrintLabel + .labelContainer + text-align center + //width 100% + width-min 3in + width 3in + height-min 2in + height 2in + //background-color grey + //padding 20px + .labels + display none + .printableLabel + display none + .label + display inline-block + width 3in + height 2in + .canvasContainer + padding 10px + background-color gray + + .label + position relative + background-color white + color black + text-align center + font-family TimesNewRoman, Times New Roman, Times + //font-family Arial, Helvetica, sans-serif + font-size .1in + width 3in + height 2in + .barcodeContainer + position absolute + transform rotate(270deg) + right -4.5em + top 5em + .qrcode + position absolute + left 10px + top 10px + .labelLogo + width 8em + padding 0 + margin 0 + padding-top .15em + margin-bottom .2em + .labelLogo3 + width 14em + padding 0 + margin 0 + padding-top .15em + margin-bottom .8em + .labelTagline + font-size 1em + font-weight 100 + line-height 1em + .title1 + width 100% + font-size 2.5em + line-height .9em + font-weight 800 + text-transform uppercase + .title2 + width 100% + font-size 1.5em + line-height .9em + font-weight 800 + padding-bottom .2em + .ingredients + width 100% + font-size 1.2em + font-weight 100 + line-height 1em + min-height 2em + .ingredientsEnding + width 100% + font-size 1.2em + font-weight 100 + .instructions + width 100% + font-size 1.2em + font-weight 800 + .address + width 100% + font-size 1.2em + font-weight 100 + .website + width 100% + font-size 1.2em + font-weight 100 \ No newline at end of file diff --git a/imports/ui/PrintLabel.js b/imports/ui/PrintLabel.js new file mode 100644 index 0000000..0aa05ee --- /dev/null +++ b/imports/ui/PrintLabel.js @@ -0,0 +1,32 @@ +import './PrintLabel.html'; +import JsBarcode from 'JsBarcode'; +//import QRCode from "../util/qrcode/qrcode"; +import QRCode from '/imports/util/qrcode/qrcode'; + +//let {qrcode, svg2url} = require('pure-svg-code'); + +Template.PrintLabel.onCreated(function() { + function getUrlVars() { + let vars = {}; + let parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { + vars[key] = decodeURIComponent(value); + }); + return vars; + } + + this.vars = getUrlVars(); +}); + +Template.PrintLabel.onRendered(function() { + let vars = this.vars; + $('.title1').html(vars['title1']); + $('.title2').html(vars['title2'] === undefined ? "" : vars['title2']); + $('.ingredients').append(vars['ingredients']); + $('.date').html(vars['date']); + $('.size').html(vars['size']); + //JsBarcode(".barcode").init(); + + //const svgString = qrcode({content: "1234567890", padding: 0, width: 50, height: 50, color: "#000000", background: "#FFFFFF", ecl: "L"}); + //this.$('.qrcode').attr('src', svg2url(svgString)); + new QRCode(document.getElementById("qrcode"), {text: "1234567890", width: 60, height: 60}); +}); \ No newline at end of file diff --git a/imports/ui/Production.html b/imports/ui/Production.html index fedd598..652ec06 100644 --- a/imports/ui/Production.html +++ b/imports/ui/Production.html @@ -1,5 +1,136 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/imports/ui/Production.import.styl b/imports/ui/Production.import.styl index 457c9fc..55177af 100644 --- a/imports/ui/Production.import.styl +++ b/imports/ui/Production.import.styl @@ -1,60 +1,142 @@ #production - margin: 10px 20px + display: table + content-box: border-box + padding: 10px 20px height: 100% - //Flex container options. - flex-flow: column nowrap - justify-content: space-around //Spacing between sales along the primary axis. (vertical spacing for a column layout) - align-items: flex-start //Align the sales within a line along the primary axis. (horizontal alignment for a column layout) - align-content: center //Spacing between lines along the secondary axis. (spacing between columns for a column layout) - display: -webkit-box - display: -moz-box - display: -ms-flexbox - display: -moz-flex - display: -webkit-flex - display: flex + width: 100% + text-align: left - .editor - height: 100% - overflow-y: auto - - .insertSale - flex: none + .tableControls + text-align: right + margin-right: 20px + margin-bottom: 4px + display: table width: 100% + .contentControls + vertical-align: bottom + display: table-cell + text-align: right + min-width: 100px + a + font-size: 12px + font-family: "Arial", san-serif + font-weight: 800 + color: #2d1b8c + text-decoration: none + a:hover + text-decoration: underline + a.disabled + visibility: hidden - .formGroupHeading - font-size: 1.6em - font-family: "Arial Black", "Arial Bold", Gadget, sans-serif - font-style: normal - font-variant: normal - font-weight: 500 - - .grid - flex: auto - align-self: stretch - overflow-y: auto - overflow-x: auto - margin-bottom: 20px - border: 0 - padding-top: 20px - - .table > thead > tr > th - border: 0 - padding-top: 0 - padding-bottom: 6px - - .left - text-align: left - .center - text-align: center - - .dataTable - table-layout: fixed - - .tdLarge - font-size: 1.3em - .saleRemove - color: red - margin-left: 8px - .saleEdit - color: darkblue - margin-right: 8px + .table + table-layout: fixed + min-width: 100% + thead, tbody + > tr + > .hasLabels + width: 30px + .hasLabels + color green + .noLabels + color red + > .name + //width: auto + width: 100% + > .date + //width: auto + min-width: 150px + max-width: 180px + > .amount + //width: auto + min-width: 100px + max-width: 100px + > .cook + //width: auto + min-width: 150px + max-width: 180px + > .canner + //width: auto + min-width: 150px + max-width: 180px + > .comment + width: 220px + min-width: 220px + max-width: 220px + > .actions + width: 90px + min-width: 90px + max-width: 90px + > tr.deleted + background-color: gray + .separatedTableHeader + table + thead + > tr + > th.actions + text-align: center + .newButton + margin-top: 4px + padding: 0 12px + .fa-plus-circle + display: inline-block + .fa-times-circle + display: none + .newButton:active + background-color: #fb557b + color: black + .fa-times-circle + display: inline-block + .fa-plus-circle + display: none + .showDeletedButton + margin-top: 4px + padding: 0 12px + color gray + .showDeletedButton.selected + color black + .listRow + display: table-row + .listCell + display: table-cell + position: relative + height: 100% + width: 100% + .tableContainer + position: absolute + top: 0 + bottom: 0 + left: 0 + right: 0 + width: auto + height: auto + border: 0 + font-size: 12.5px + overflow-y: auto + table + thead + visibility: hidden + display: none + .search + margin: 3px 0 2px 1px + .editorTd + background: #deeac0 + input, select + width: 100% + .editorDiv + margin: 4px 0 + label + font-family: "Arial Black", "Arial Bold", Gadget, sans-serif + font-size: .9em + padding-bottom: 4px + select2 + font-size: .4em + > tbody + > tr + .actionRemove + color: #F77 + .actionEdit + color: #44F + .editorApply + color: green + .editorCancel + color: red \ No newline at end of file diff --git a/imports/ui/Production.js b/imports/ui/Production.js index c72cc88..2c092d7 100644 --- a/imports/ui/Production.js +++ b/imports/ui/Production.js @@ -1,2 +1,446 @@ import './Production.html'; + +let QUERY_LIMIT = 100; +let QUERY_LIMIT_INCREMENT = 100; +let PREFIX = "Production."; + +Tracker.autorun(function() { + //Meteor.subscribe("batches"); + Meteor.subscribe("workers"); + Meteor.subscribe("products"); + Meteor.subscribe("measures"); +}); + +Template.Production.onCreated(function() { + Session.set(PREFIX + "displayNew", false); //Whether the new dialog is inlined in the table and visible. + + Session.set(PREFIX + "sortOption", 'date'); //Allows us to sort the results of the batch query by batch attribute. + Session.set(PREFIX + 'skipCount', 0); //Allows us to page through the results of the batch query. Currently not used. + Session.set(PREFIX + 'batchCount', 0); //A count of all batches in the system (that fit our current query). Useful for paging and dynamic loading. + Session.set(PREFIX + "queryLimit", QUERY_LIMIT); + Session.set(PREFIX + "showDeleted", false); + Session.set(PREFIX + "editedId", undefined); + + Tracker.autorun(function() { + let sortOption = Session.get(PREFIX + "sortOption"); + let sort = sortOption == 'createdAt' ? {createdAt: -1} : {date: -1, createdAt: -1}; + //let showOnlyComments = Session.get(PREFIX + "showOnlyComments"); //Not needed here. Shows how to limit the query to only records with certain features. + let query = _.clone(Session.get(PREFIX + 'searchQuery')); + + //if(showOnlyComments) { + // if(!query) query = {}; + // query.comment = {$exists: true}; + //} + + if(!Session.get(PREFIX + "showDeleted")) { + if(!query) query = {}; + query.deletedAt = {$exists: false}; + } + + Template.Production.batchesSubscription = Meteor.subscribe("batches", query, sort, QUERY_LIMIT, Session.get(PREFIX + 'skipCount')); + Session.set(PREFIX + 'batchCount', Meteor.call('getBatchCount', Session.get(PREFIX + 'searchQuery'))); + }); +}); +Template.Production.onDestroyed(function() { + if(Template.Production.batchSubscription) { + Template.Production.batchSubscription.stop(); + } +}); +Template.Production.onRendered(function() { + $(".tableContainer").mCustomScrollbar({ + scrollButtons: {enable:true}, + theme: "light-thick", + scrollbarPosition: "outside", + scrollEasing: "linear" + }); +}); +Template.Production.helpers({ + displayNew: function() { + return Session.get(PREFIX + "displayNew"); + }, + batches: function() { + let sortOption = Session.get(PREFIX + "sortOption"); + + return Meteor.collections.Batches.find({}, {sort: (sortOption == 'createdAt' ? {createdAt: -1} : {date: -1, createdAt: -1})}); + }, + disableLoadMore: function() { + return Session.get(PREFIX + 'batchCount') - (Session.get(PREFIX + 'skipCount') || 0) - Session.get(PREFIX + "queryLimit") <= 0; + }, + showDeletedSelected: function() { + return (Session.get(PREFIX + "showDeleted")) ? "selected" : ""; + } +}); +Template.Production.events({ + 'click .loadMoreLink': function(event, template) { + event.preventDefault(); + Session.set(PREFIX + 'queryLimit', Session.get(PREFIX + "queryLimit") + QUERY_LIMIT_INCREMENT); + }, + 'click .newButton': function(event, template) { + if(template.$('.newButton').hasClass('active')) { + Session.set(PREFIX + 'displayNew', false); + } + else { + Session.set(PREFIX + 'displayNew', true); + Session.set(PREFIX + "editedId", undefined); //Clear the edited product so that only one editor is open at a time. + } + template.$('.newButton').toggleClass('active'); + }, + 'click .showDeletedButton': function(event, template) { + Session.set(PREFIX + "showDeleted", !Session.get(PREFIX + "showDeleted")); //Toggle the display of deleted production. + } +}); + + +Template.Batch.onCreated(function() { +}); +Template.Batch.onRendered(function() { +}); +Template.Batch.helpers({ + hasLabelsClass: function() { + return this.hasLabels === true ? "hasLabels" : "noLabels"; + }, + name: function() { + let product = Meteor.collections.Products.findOne({_id: this.productId}); + let measure = Meteor.collections.Measures.findOne({_id: this.measureId}); + return product.name + " (" + measure.name + ")"; + }, + date: function() { + return moment(this.date, "YYYYMMDD").format("MM/DD/YYYY"); + }, + cook: function() { + let worker = Meteor.collections.Workers.findOne({_id: this.cookId}); + return worker.name; + }, + canner: function() { + let worker = Meteor.collections.Workers.findOne({_id: this.cannerId}); + return worker.name; + }, + editing: function() { + let editedId = Session.get(PREFIX + "editedId"); + + return editedId && editedId.toString() === this._id.toString(); + }, + getRowClass: function() { + return this.deletedAt ? "deleted" : ""; + }, + isDeleted: function() { + return this.deletedAt; + } +}); +Template.Batch.events({ + "click .hasLabels": function(event, template) { + Meteor.call('setBatchHasLabels', this._id, !(this.hasLabels === true), function(error, result) { + if(error) sAlert.error(error); + }); + }, + "click .actionEdit": function(event, template) { + Session.set(PREFIX + "editedId", this._id); + Session.set(PREFIX + 'displayNew', false); //Ensure the new editor is closed. + template.parentTemplate().$('.newButton').removeClass('active'); + }, + "click .actionDelete": function(event, template) { + Meteor.call('deleteBatch', this._id, function(error, result) { + if(error) sAlert.error(error); + else sAlert.success("Production Batch Deleted"); + }); + }, + 'click .actionUndelete': function(event, template) { + Meteor.call('undeleteBatch', this._id, function(error, result) { + if(error) sAlert.error(error); + else sAlert.success("Production Batch No Longer Deleted"); + }); + } +}); + + +Template.BatchEditor.onCreated(function() { +}); +Template.BatchEditor.onRendered(function() { +}); +Template.BatchEditor.helpers({ + name: function() { + let product = Meteor.collections.Products.findOne({_id: this.productId}); + let measure = Meteor.collections.Measures.findOne({_id: this.measureId}); + + return (product ? product.name : "") + " (" + (measure ? measure.name : "") + ")"; + }, + date: function() { + return moment(this.date, "YYYYMMDD").format("MM/DD/YYYY"); + }, + cook: function() { + let worker = Meteor.collections.Workers.findOne({_id: this.cookId}); + return worker.name; + }, + canner: function() { + let worker = Meteor.collections.Workers.findOne({_id: this.cannerId}); + return worker.name; + } +}); +Template.BatchEditor.events({ + 'click .editorCancel': function(event, template) { + Session.set(PREFIX + "editedId", undefined); + }, + 'click input[type="submit"]': function(event, template) { + event.preventDefault(); + template.$('.insertForm').data('bs.validator').validate(function(isValid) { + if(isValid) { + //Allow the user to edit the comment and the amount produced. Sometimes jars pop after the product cools and these things need to be recorded. + + //TODO + } + }); + } +}); + + +Template.BatchNew.onCreated(function() { + this.selectedProduct = new ReactiveVar(); + this.selectedCook = new ReactiveVar(); + this.selectedCanner = new ReactiveVar(); +}); +Template.BatchNew.onRendered(function() { + this.$('.insertForm').validator(); + this.$('[name="product"]').buildCombo({cursor: Meteor.collections.Products.find({$or: [{hidden: false}, {hidden: {$exists:false}}]}), selection: this.selectedProduct, textAttr: 'name', listClass: 'comboList', getClasses: function(data) { + return (data && data.deactivated) ? "deactivated" : ""; + }}); + this.$('[name="cook"]').buildCombo({cursor: Meteor.collections.Workers.find({}), selection: this.selectedCook, textAttr: 'name', listClass: 'comboList'}); + this.$('[name="canner"]').buildCombo({cursor: Meteor.collections.Workers.find({}), selection: this.selectedCanner, textAttr: 'name', listClass: 'comboList'}); + this.$('input[name="product"]').focus(); +}); +Template.BatchNew.helpers({ + //products: function() { + // return Meteor.collections.Products.find({}); + //}, + //productSelected: function() { + // let product = this; + // let batch = Template.parentData(); + // + // return batch.productId === product._id ? "selected" : ""; + //}, + productMeasures: function() { + //Show only the list allowed by the product + let product = Template.instance().selectedProduct.get(); + + if(product) { + let measures = Meteor.collections.Measures.find({}).fetch(); + let measuresById = {}; + let allowedMeasureIds = product.measures; + let allowedMeasures = []; + + //Create a hashmap of measures by their id. + for(let measure of measures) measuresById[measure._id.toString()] = measure; + + //Create a list of measures allowed for the product. + for(let measureId of allowedMeasureIds) { + allowedMeasures.push(measuresById[measureId.toString()]); + } + + return allowedMeasures; + } + else return []; + }, + today: () => { + return moment().format("YYYY-MM-DD"); + } +}); +Template.BatchNew.events({ + 'change input[name="date"]': function(event, template) { + template.selectedDate.set(moment(event.target.value, "YYYY-MM-DD").toDate()); + }, + 'click .editorCancel': function(event, template) { + Session.set(PREFIX + "editedId", undefined); + }, + 'click .editorApply': function(event, template) { + event.preventDefault(); + template.$('.insertForm').data('bs.validator').validate(function(isValid) { + if(isValid) { + let batches = []; + let insertMeasure = template.$(".insertMeasure"); + + let batch = { + date: ~~(moment(template.find("[name='date']").value, "YYYY-MM-DD").format("YYYYMMDD")), // Note: ~~ performs a bitwise not which is a fast method of converting a string to a number. + productId: template.selectedProduct.get()._id, + cookId: template.selectedCook.get()._id, + cannerId: template.selectedCanner.get()._id, + comment: template.$('.comment').val() + }; + + //Iterate over the measures for the batch (based on the product chosen) and amounts. + for(let next = 0; next < insertMeasure.length; next++) { + let nextMeasure = $(insertMeasure[next]); + let measureId = nextMeasure.find(".measureId").val(); + let amount = parseFloat(nextMeasure.find(".amount").val()); + + if(amount > 0) { + let next = _.clone(batch); + + next.measureId = measureId; + next.amount = amount; + batches.push(next); + } + } + + Meteor.call('insertBatches', batches, function(error) { + if(error) sAlert.error("Failed to insert the batch!\n" + error); + else { + let productCombo = template.$("input[name='product']"); + let measureFields = template.$(".amount"); + + sAlert.success("Production batches created."); + + //Clear the measure quantity fields so the user can enter another sale without the quantities already set. + measureFields.val(0); + //Set the focus to the product field of the form. + //productCombo.focus(); + //Clear the product since it is highly unlikely the same product will be added twice for the same date. + productCombo.val(""); + Session.set(PREFIX + "displayNew", false); + } + }); + } + }); + } +}); + + +Template.InsertBatchMeasure.onCreated(function() { + let _this = this; + + this.amount = new ReactiveVar(0); +}); +Template.InsertBatchMeasure.onRendered(function() { +}); +Template.InsertBatchMeasure.helpers({ + amount: function() { + return Template.instance().amount.get(); + } +}); +Template.InsertBatchMeasure.events({ + 'change .amount': function(event, template) { + template.amount.set(parseFloat($(event.target).val())); + }, + 'focus input[name="amount"]': function(event, template) { + //See http://stackoverflow.com/questions/3150275/jquery-input-select-all-on-focus + //Handle selecting the text in the field on receipt of focus. + let $this = $(this) + .one('mouseup.mouseupSelect', function() { + $this.select(); + return false; + }) + .one('mousedown', function() { + // compensate for untriggered 'mouseup' caused by focus via tab + $this.off('mouseup.mouseupSelect'); + }) + .select(); + } +}); + + +Template.BatchSearch.onCreated(function() { +}); +Template.BatchSearch.onRendered(function() { +}); +Template.BatchSearch.helpers({ + searchValue: function() { + let searchFields = Session.get(PREFIX + 'searchFields'); + + return (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : ''; + } +}); +Template.BatchSearch.events({ + "keyup .searchInput": _.throttle(function(event, template) { + let searchQuery = Session.get(PREFIX + 'searchQuery') || {}; + let searchFields = Session.get(PREFIX + 'searchFields') || {}; + let searchValue = template.$(event.target).val(); + + if(searchValue) { + if(this.number) searchValue = parseFloat(searchValue); + + // A collection name will be provided if there is a related table of data that will contain the text provided and will map to an ID that is then searched for in the current table of data. + // For example we are displaying a table of Sales which has the ID of a Product. The Product table has a Name field and the search box searches for Product Names. The ID's of the Products found should be used to filter the Sales by Product ID. + if(this.collection) { + let ids = Meteor.collections[this.collection].find({[this.collectionQueryColumnName]: {$regex: searchValue, $options: 'i'}}, {fields: {[this.collectionResultColumnName]: 1}}).fetch(); + + //Convert the ids to an array of ids instead of an array of objects containing an id. + for(let i = 0; i < ids.length; i++) {ids[i] = ids[i]._id;} + searchQuery[this.columnName] = {$in: ids}; + searchFields[this.columnName] = searchValue; + } + else { + searchFields[this.columnName] = searchQuery[this.columnName] = searchValue; + } + } + else { + //Remove columns from the search query whose values are empty so we don't bother the database with them. + delete searchQuery[this.columnName]; + delete searchFields[this.columnName]; + } + + Session.set(PREFIX + 'searchQuery', searchQuery); + Session.set(PREFIX + 'searchFields', searchFields); + Session.set(PREFIX + 'skipCount', 0); //Reset the paging of the results. + Session.set(PREFIX + "queryLimit", QUERY_LIMIT); //Reset the query limit in case we loaded more + }, 500) +}); + + +Template.BatchDateRangeSearch.helpers({ + startDate: function() { + let searchFields = Session.get(PREFIX + 'searchFields'); + let searchValue = (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : {}; + + return searchValue.start ? moment(searchValue.start.toString(), "YYYYMMDD").format("MM/DD/YYYY") : ""; + }, + endDate: function() { + let searchFields = Session.get(PREFIX + 'searchFields'); + let searchValue = (searchFields && searchFields[this.columnName]) ? searchFields[this.columnName] : {}; + + return searchValue.end ? moment(searchValue.end.toString(), "YYYYMMDD").format("MM/DD/YYYY") : ""; + } +}); +Template.BatchDateRangeSearch.events({ + "change .searchDateStartInput": function(event, template) {Template.DateRangeSearch.dateChanged(true, event, template)}, + "keyup .searchDateStartInput": _.throttle(function(event, template) {Template.DateRangeSearch.dateChanged(true, event, template)}, 500), + "change .searchDateEndInput": function(event, template) {Template.DateRangeSearch.dateChanged(false, event, template)}, + "keyup .searchDateEndInput": _.throttle(function(event, template) {Template.DateRangeSearch.dateChanged(false, event, template)}, 500) +}); +Template.BatchDateRangeSearch.dateChanged = function(isStart, event, template) { + let searchQuery = Session.get(PREFIX + 'searchQuery') || {}; + let searchFields = Session.get(PREFIX + 'searchFields') || {}; + let searchValue = template.$(event.target).val(); + let columnName = template.data.columnName; + + if(searchValue) { + let search = searchQuery[columnName]; + + // Create a search object and attach it to the searchFields and searchQuery objects if needed. + if(!search) { + search = {type: 'dateRange'}; + searchFields[columnName] = searchQuery[columnName] = search; + } + + // Use moment to parse date and convert it to YYYYMMDD for searching the database. + searchValue = ~~(moment(searchValue, searchValue.includes("-") ? "YYYY-MM-DD" : "MM/DD/YYYY").format("YYYYMMDD")); // Note: ~~ performs a bitwise not which is a fast method of converting a string to a number. + // Save the search ending date. + isStart ? search.start = searchValue : search.end = searchValue; + } + else { + if(searchQuery[columnName]) { + // Remove columns from the search query whose values are empty so we don't bother the database with them. + if(isStart) { + delete searchQuery[columnName].start; + delete searchFields[columnName].start; + } + else { + delete searchQuery[columnName].end; + delete searchFields[columnName].end; + } + } + } + + Session.set(PREFIX + 'searchQuery', searchQuery); + Session.set(PREFIX + 'searchFields', searchFields); + Session.set(PREFIX + 'skipCount', 0); //Reset the paging of the results. + Session.set(PREFIX + "queryLimit", QUERY_LIMIT); //Reset the query limit in case we loaded more +}; \ No newline at end of file diff --git a/imports/ui/Products.html b/imports/ui/Products.html index 9d015e7..6f5378a 100644 --- a/imports/ui/Products.html +++ b/imports/ui/Products.html @@ -22,7 +22,7 @@ Tags {{>ProductSearch columnName='tags' collectionQueryColumnName='name' collection='ProductTags' collectionResultColumnName='_id'}} Aliases {{>ProductSearch columnName='aliases'}} Measures {{>ProductSearch columnName='measures' collectionQueryColumnName='name' collection='Measures' collectionResultColumnName='_id'}} - Actions + Actions @@ -32,7 +32,7 @@
- {{#if displayNewProduct}} + {{#if displayNew}} {{> ProductEditor isNew=true}} {{/if}} {{#each products}} @@ -75,7 +75,7 @@ \ No newline at end of file diff --git a/imports/ui/Products.import.styl b/imports/ui/Products.import.styl index 2673ba2..d7823dc 100644 --- a/imports/ui/Products.import.styl +++ b/imports/ui/Products.import.styl @@ -69,14 +69,14 @@ > tr > th.actions text-align: center - .newProductButton + .newButton margin-top: 4px padding: 0 12px .fa-plus-circle display: inline-block .fa-times-circle display: none - .newProductButton:active + .newButton:active background-color: #fb557b color: black .fa-times-circle @@ -105,9 +105,9 @@ thead visibility: hidden display: none - .productSearch + .search margin: 3px 0 2px 1px - .productEditorTd + .editorTd background: #deeac0 input[name="name"], .productTagsEditor, .productAliasesEditor, .productMeasuresEditor width: 100% diff --git a/imports/ui/Products.js b/imports/ui/Products.js index 9894dcc..9f974aa 100644 --- a/imports/ui/Products.js +++ b/imports/ui/Products.js @@ -12,7 +12,7 @@ Tracker.autorun(function() { }); Template.Products.onCreated(function() { - Session.set(PREFIX + "displayNewProduct", false); + Session.set(PREFIX + "displayNew", false); Session.set(PREFIX + "showHidden", false); Session.set(PREFIX + "queryLimit", QUERY_LIMIT); }); @@ -25,8 +25,8 @@ Template.Products.onRendered(function() { }); }); Template.Products.helpers({ - displayNewProduct: function() { - return Session.get(PREFIX + "displayNewProduct"); + displayNew: function() { + return Session.get(PREFIX + "displayNew"); }, products: function() { let skipCount = Session.get(PREFIX + 'skipCount') || 0; @@ -68,16 +68,16 @@ Template.Products.events({ event.preventDefault(); Session.set(PREFIX + 'queryLimit', Session.get(PREFIX + "queryLimit") + QUERY_LIMIT_INCREMENT); }, - 'click .newProductButton': function(event, template) { - if(template.$('.newProductButton').hasClass('active')) { - Session.set(PREFIX + 'displayNewProduct', false); + 'click .newButton': function(event, template) { + if(template.$('.newButton').hasClass('active')) { + Session.set(PREFIX + 'displayNew', false); } else { - Session.set(PREFIX + 'displayNewProduct', true); - Session.set(PREFIX + "editedProduct", undefined); //Clear the edited product so that only one editor is open at a time. + Session.set(PREFIX + 'displayNew', true); + Session.set(PREFIX + "editedId", undefined); //Clear the edited product so that only one editor is open at a time. Session.set(PREFIX + "convertedProduct", undefined); //Clear the converted product so that only one editor is open at a time. } - template.$('.newProductButton').toggleClass('active'); + template.$('.newButton').toggleClass('active'); }, 'change input[name="showHidden"]': function(event, template) { //console.log("changed " + $(event.target).prop('checked')); @@ -166,9 +166,9 @@ Template.Product.helpers({ return result; }, editing: function() { - let editedProduct = Session.get(PREFIX + "editedProduct"); + let editedId = Session.get(PREFIX + "editedId"); - return editedProduct == this._id; + return editedId == this._id; }, converting: function() { let convertedProduct = Session.get(PREFIX + "convertedProduct"); @@ -181,10 +181,10 @@ Template.Product.helpers({ }); Template.Product.events({ "click .actionEdit": function(event, template) { - Session.set(PREFIX + "editedProduct", this._id); - Session.set(PREFIX + 'displayNewProduct', false); //Ensure the new product editor is closed. + Session.set(PREFIX + "editedId", this._id); + Session.set(PREFIX + 'displayNew', false); //Ensure the new editor is closed. Session.set(PREFIX + "convertedProduct", undefined); //Clear the converted product so that only one editor is open at a time. - template.parentTemplate().$('.newProductButton').removeClass('active'); + template.parentTemplate().$('.newButton').removeClass('active'); }, "click .actionDeactivate": function(event, template) { Meteor.call('deactivateProduct', this._id, function(error, result) { @@ -206,9 +206,9 @@ Template.Product.events({ }, "click .actionConvert": function(event, template) { Session.set(PREFIX + "convertedProduct", this._id); - Session.set(PREFIX + 'displayNewProduct', false); //Ensure the new product editor is closed. - Session.set(PREFIX + "editedProduct", undefined); //Clear the edited product so that only one editor is open at a time. - template.$('.newProductButton').removeClass('active'); + Session.set(PREFIX + 'displayNew', false); //Ensure the new editor is closed. + Session.set(PREFIX + "editedId", undefined); //Clear the edited product so that only one editor is open at a time. + template.$('.newButton').removeClass('active'); }, 'click .actionHide': function(event, template) { Meteor.call('hideProduct', this._id, function(error, result) { @@ -249,9 +249,9 @@ Template.ProductEditor.helpers({ }); Template.ProductEditor.events({ "click .editorCancel": function(event, template) { - Session.set(PREFIX + "editedProduct", undefined); - Session.set(PREFIX + 'displayNewProduct', false); - template.parentTemplate().$('.newProductButton').removeClass('active'); + Session.set(PREFIX + "editedId", undefined); + Session.set(PREFIX + 'displayNew', false); + template.parentTemplate().$('.newButton').removeClass('active'); }, "click .editorApply": function(event, template) { let name = template.$("input[name='name']").val().trim(); @@ -263,13 +263,13 @@ Template.ProductEditor.events({ aliases = aliases.map((n)=>n.id); measures = measures.map((n)=>n.id); - if(Session.get(PREFIX + 'displayNewProduct')) { + if(Session.get(PREFIX + 'displayNew')) { Meteor.call("createProduct", name, tags, aliases, measures, function(error, result) { if(error) sAlert.error(error); else { sAlert.success("Product created."); - Session.set(PREFIX + 'displayNewProduct', false); - template.parentTemplate().$('.newProductButton').removeClass('active'); + Session.set(PREFIX + 'displayNew', false); + template.parentTemplate().$('.newButton').removeClass('active'); } }); } @@ -278,8 +278,8 @@ Template.ProductEditor.events({ if(error) sAlert.error(error); else { sAlert.success("Product updated."); - Session.set(PREFIX + "editedProduct", undefined); - template.parentTemplate().$('.newProductButton').removeClass('active'); + Session.set(PREFIX + "editedId", undefined); + template.parentTemplate().$('.newButton').removeClass('active'); } }); } @@ -296,10 +296,10 @@ Template.ConvertProduct.onRendered(function() { }); Template.ConvertProduct.events({ "click .editorCancel": function(event, template) { - Session.set(PREFIX + "editedProduct", undefined); + Session.set(PREFIX + "editedId", undefined); Session.set(PREFIX + "convertedProduct", undefined); - Session.set(PREFIX + 'displayNewProduct', false); - template.parentTemplate().$('.newProductButton').removeClass('active'); + Session.set(PREFIX + 'displayNew', false); + template.parentTemplate().$('.newButton').removeClass('active'); }, "click .editorApply": function(event, template) { let productId = template.selectedProduct.get()._id; @@ -308,10 +308,10 @@ Template.ConvertProduct.events({ if(error) sAlert.error(error); else { sAlert.success("Sales of this product were converted."); - Session.set(PREFIX + "editedProduct", undefined); + Session.set(PREFIX + "editedId", undefined); Session.set(PREFIX + "convertedProduct", undefined); - Session.set(PREFIX + 'displayNewProduct', false); - template.parentTemplate().$('.newProductButton').removeClass('active'); + Session.set(PREFIX + 'displayNew', false); + template.parentTemplate().$('.newButton').removeClass('active'); } }); } diff --git a/imports/ui/layouts/Body.html b/imports/ui/layouts/Body.html index bc4b1d9..14e90bb 100644 --- a/imports/ui/layouts/Body.html +++ b/imports/ui/layouts/Body.html @@ -128,45 +128,4 @@ {{> Template.dynamic template=content}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/imports/ui/layouts/Body.import.styl b/imports/ui/layouts/Body.import.styl index 2ad1145..29ab8d4 100644 --- a/imports/ui/layouts/Body.import.styl +++ b/imports/ui/layouts/Body.import.styl @@ -18,202 +18,211 @@ height: 100% width: 100% - nav.leftSidebarContainer - z-index:999 - position: fixed - top: 0 - width: 220px - padding: 0 - height: 100% - border: 0 - vertical-align: top - text-align: left - background-color: #90b272 //Old browsers - background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%) //FF3.6-15 - background: -webkit-linear-gradient(-180deg, #90b272 0%,#4d7727 100%) //Chrome10-25,Safari5.1-6 - background: linear-gradient(180deg, #90b272 0%,#4d7727 100%) //W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ - font-size: 14px - font-weight: 700 - overflow: visible - margin: 0 0 0 -220px - -webkit-transition: .5s ease-in - -moz-transition: .5s ease-in - -o-transition: .5s ease-in - -ms-transition: .5s ease-in - transition: .5s ease-in - .leftSidebarMenuButton - position: absolute - right: -30px + @media not print + nav.leftSidebarContainer + z-index:999 + position: fixed + top: 0 + width: 220px + padding: 0 + height: 100% + border: 0 + vertical-align: top + text-align: left + background-color: #90b272 //Old browsers + background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%) //FF3.6-15 + background: -webkit-linear-gradient(-180deg, #90b272 0%,#4d7727 100%) //Chrome10-25,Safari5.1-6 + background: linear-gradient(180deg, #90b272 0%,#4d7727 100%) //W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ + font-size: 14px + font-weight: 700 + overflow: visible + margin: 0 0 0 -220px -webkit-transition: .5s ease-in -moz-transition: .5s ease-in -o-transition: .5s ease-in -ms-transition: .5s ease-in transition: .5s ease-in - -webkit-border-top-right-radius: 5px - -webkit-border-bottom-right-radius: 5px - -moz-border-radius-topright: 5px - -moz-border-radius-bottomright: 5px - border-top-right-radius: 5px - border-bottom-right-radius: 5px - color: black - font-size: 20px - line-height: 20px - font-weight: 900 - text-align: center - text-decoration: none - width: 30px - height: 30px - padding: 5px 0 - background-color: #90b272 - display: block - border-top: 1px solid #494 - border-right: 1px solid #494 - border-bottom: 1px solid #494 - .leftSidebarMenuButton:hover - color: rgba(150,0,0,.5) - nav.generalSidebar - .leftSidebarMenuButton - top: 10px - nav.graphsSidebar - .leftSidebarMenuButton - top: 50px - nav.settingsSidebar - .leftSidebarMenuButton - top: 90px - nav.menuHide .leftSidebarMenuButton - right: 60px - nav.menuShow - margin: 0 - nav.menuShow .leftSidebarMenuButton - right: -15px - -webkit-transform: rotate(45deg) !important - -moz-transform: rotate(45deg) !important - -o-transform: rotate(45deg) !important - -ms-transform: rotate(45deg) !important - transform: rotate(45deg) !important - -moz-border-radius-bottomright: 0 - //border-top-right-radius: 0 - border-bottom-right-radius: 0 - border-bottom: 0 - .leftSidebar - flex: 0 0 auto - display: flex - flex-flow: column - justify-content: flex-start - align-items: flex-start - align-content: stretch - height: 100% - //position: absolute - border: 0 - vertical-align: top - padding: 0 - text-align: left - //top: 0px - //left: 0px - //bottom: 0px - width: 220px - //Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#627d4d+0,1f3b08+100;Olive+3D - background-color: #90b272 //Old browsers - background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%) //FF3.6-15 - background: -webkit-linear-gradient(-180deg, #90b272 0%,#4d7727 100%) //Chrome10-25,Safari5.1-6 - background: linear-gradient(180deg, #90b272 0%,#4d7727 100%) //W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ - font-size: 14px - font-weight: 700 - overflow: hidden - - .logoArea - flex: 0 0 auto - width: 100% - .signOut + .leftSidebarMenuButton position: absolute - left: 10px - top: 10px - color: white - cursor: pointer - .signOut:hover - color: #BBB - .signOut:active + right: -30px + -webkit-transition: .5s ease-in + -moz-transition: .5s ease-in + -o-transition: .5s ease-in + -ms-transition: .5s ease-in + transition: .5s ease-in + -webkit-border-top-right-radius: 5px + -webkit-border-bottom-right-radius: 5px + -moz-border-radius-topright: 5px + -moz-border-radius-bottomright: 5px + border-top-right-radius: 5px + border-bottom-right-radius: 5px color: black - .logo + font-size: 20px + line-height: 20px + font-weight: 900 text-align: center - margin-top: 20px - img:hover - //-webkit-animation: neon6_drop 1.5s ease-in-out infinite alternate; - //-moz-animation: neon6_drop 1.5s ease-in-out infinite alternate; - animation: neon6_drop 1.5s ease-in-out infinite alternate; - .menuArea - flex: 1 1 auto - width: 100% - ul - padding: 20px 0 0 0 - margin: 0 - list-style: none - li:first-child - border-top: 1px solid #e4e5e7 - li - border-bottom: 1px solid #e4e5e7 - color: #96a2ae - text-transform: uppercase - display: block - a - color: black - padding: 10px 20px - cursor: pointer - text-decoration: none - display: block - .tag - padding: .3em .6em - margin-top: -.2em - font-size: .8em - color: #ddd - white-space: nowrap - vertical-align: baseline - border-radius: .5em - border: 1px solid #000000 - float: right - .subMenu - background-color: #999 - padding: .3em .6em - margin-top: -.2em - font-size: .8em - color: #fff - white-space: nowrap - vertical-align: baseline - border-radius: .5em - border: 1px solid #000000 - float: right - .subMenu.active - background-color: #333 - li:hover - // Note: neon6 is defined in effects.import.styl - background-color: #666 - -webkit-animation: neon6 1.5s ease-in-out infinite alternate - -moz-animation: neon6 1.5s ease-in-out infinite alternate - animation: neon6 1.5s ease-in-out infinite alternate - .subMenu - // Note: neon6 is defined in effects.import.styl - background-color: #999 - -webkit-animation: neon7 1.5s ease-in-out infinite alternate - -moz-animation: neon7 1.5s ease-in-out infinite alternate - animation: neon7 1.5s ease-in-out infinite alternate - li.active - background-color: #333 - > a - color: #96a2ae - li.active:hover - background-color: #333 - > a - color: white - .footer + text-decoration: none + width: 30px + height: 30px + padding: 5px 0 + background-color: #90b272 + display: block + border-top: 1px solid #494 + border-right: 1px solid #494 + border-bottom: 1px solid #494 + .leftSidebarMenuButton:hover + color: rgba(150,0,0,.5) + nav.generalSidebar + .leftSidebarMenuButton + top: 10px + nav.graphsSidebar + .leftSidebarMenuButton + top: 50px + nav.settingsSidebar + .leftSidebarMenuButton + top: 90px + nav.menuHide .leftSidebarMenuButton + right: 60px + nav.menuShow + margin: 0 + nav.menuShow .leftSidebarMenuButton + right: -15px + -webkit-transform: rotate(45deg) !important + -moz-transform: rotate(45deg) !important + -o-transform: rotate(45deg) !important + -ms-transform: rotate(45deg) !important + transform: rotate(45deg) !important + -moz-border-radius-bottomright: 0 + //border-top-right-radius: 0 + border-bottom-right-radius: 0 + border-bottom: 0 + .leftSidebar flex: 0 0 auto - width: 100% - font-size: 9px - text-align: center + display: flex + flex-flow: column + justify-content: flex-start + align-items: flex-start + align-content: stretch + height: 100% + //position: absolute + border: 0 + vertical-align: top + padding: 0 + text-align: left + //top: 0px + //left: 0px + //bottom: 0px + width: 220px + //Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#627d4d+0,1f3b08+100;Olive+3D + background-color: #90b272 //Old browsers + background: -moz-linear-gradient(-180deg, #90b272 0%, #4d7727 100%) //FF3.6-15 + background: -webkit-linear-gradient(-180deg, #90b272 0%,#4d7727 100%) //Chrome10-25,Safari5.1-6 + background: linear-gradient(180deg, #90b272 0%,#4d7727 100%) //W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ + font-size: 14px + font-weight: 700 + overflow: hidden - .contentBody - flex: 1 1 1px - padding: 10px 20px - -webkit-box-shadow: inset 4px 2px 10px -3px rgba(168,165,168,1) - -moz-box-shadow: inset 4px 2px 10px -3px rgba(168,165,168,1) - box-shadow: inset 8px 0px 10px -3px rgba(168,165,168,1) - overflow: hidden \ No newline at end of file + .logoArea + flex: 0 0 auto + width: 100% + .signOut + position: absolute + left: 10px + top: 10px + color: white + cursor: pointer + .signOut:hover + color: #BBB + .signOut:active + color: black + .logo + text-align: center + margin-top: 20px + img:hover + //-webkit-animation: neon6_drop 1.5s ease-in-out infinite alternate; + //-moz-animation: neon6_drop 1.5s ease-in-out infinite alternate; + animation: neon6_drop 1.5s ease-in-out infinite alternate; + .menuArea + flex: 1 1 auto + width: 100% + ul + padding: 20px 0 0 0 + margin: 0 + list-style: none + li:first-child + border-top: 1px solid #e4e5e7 + li + border-bottom: 1px solid #e4e5e7 + color: #96a2ae + text-transform: uppercase + display: block + a + color: black + padding: 10px 20px + cursor: pointer + text-decoration: none + display: block + .tag + padding: .3em .6em + margin-top: -.2em + font-size: .8em + color: #ddd + white-space: nowrap + vertical-align: baseline + border-radius: .5em + border: 1px solid #000000 + float: right + .subMenu + background-color: #999 + padding: .3em .6em + margin-top: -.2em + font-size: .8em + color: #fff + white-space: nowrap + vertical-align: baseline + border-radius: .5em + border: 1px solid #000000 + float: right + .subMenu.active + background-color: #333 + li:hover + // Note: neon6 is defined in effects.import.styl + background-color: #666 + -webkit-animation: neon6 1.5s ease-in-out infinite alternate + -moz-animation: neon6 1.5s ease-in-out infinite alternate + animation: neon6 1.5s ease-in-out infinite alternate + .subMenu + // Note: neon6 is defined in effects.import.styl + background-color: #999 + -webkit-animation: neon7 1.5s ease-in-out infinite alternate + -moz-animation: neon7 1.5s ease-in-out infinite alternate + animation: neon7 1.5s ease-in-out infinite alternate + li.active + background-color: #333 + > a + color: #96a2ae + li.active:hover + background-color: #333 + > a + color: white + .footer + flex: 0 0 auto + width: 100% + font-size: 9px + text-align: center + .contentBody + flex: 1 1 1px + padding: 10px 20px + -webkit-box-shadow: inset 4px 2px 10px -3px rgba(168,165,168,1) + -moz-box-shadow: inset 4px 2px 10px -3px rgba(168,165,168,1) + box-shadow: inset 8px 0 10px -3px rgba(168,165,168,1) + overflow: hidden + + @media print + nav.leftSidebarContainer + display: none + .contentBody + flex: 1 1 1px + padding: 0 + margin: 0 + overflow: hidden \ No newline at end of file diff --git a/imports/ui/layouts/Empty.html b/imports/ui/layouts/Empty.html new file mode 100644 index 0000000..652b731 --- /dev/null +++ b/imports/ui/layouts/Empty.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/imports/ui/layouts/Empty.js b/imports/ui/layouts/Empty.js new file mode 100644 index 0000000..5d0cc58 --- /dev/null +++ b/imports/ui/layouts/Empty.js @@ -0,0 +1,2 @@ +import { Template } from 'meteor/templating'; +import './Empty.html'; \ No newline at end of file diff --git a/imports/util/qrcode/README.md b/imports/util/qrcode/README.md new file mode 100644 index 0000000..5e2d2dc --- /dev/null +++ b/imports/util/qrcode/README.md @@ -0,0 +1,46 @@ +# QRCode.js +QRCode.js is javascript library for making QRCode. QRCode.js supports Cross-browser with HTML5 Canvas and table tag in DOM. +QRCode.js has no dependencies. + +## Basic Usages +``` +
+ +``` + +or with some options + +``` +
+ +``` + +and you can use some methods + +``` +qrcode.clear(); // clear the code. +qrcode.makeCode("http://naver.com"); // make another code. +``` + +## Browser Compatibility +IE6~10, Chrome, Firefox, Safari, Opera, Mobile Safari, Android, Windows Mobile, ETC. + +## License +MIT License + +## Contact +twitter @davidshimjs + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/davidshimjs/qrcodejs/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + diff --git a/imports/util/qrcode/qrcode.js b/imports/util/qrcode/qrcode.js new file mode 100644 index 0000000..bdc3872 --- /dev/null +++ b/imports/util/qrcode/qrcode.js @@ -0,0 +1,616 @@ +/** + * @fileoverview + * - Using the 'QRCode for Javascript library' + * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. + * - this library has no dependencies. + * + * @author davidshimjs + * @see http://www.d-project.com/ + * @see http://jeromeetienne.github.com/jquery-qrcode/ + */ +var QRCode; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.parsedData.length; + }, + write: function (buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + + QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} + return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);} + if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} + this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} + return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} + for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} + for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} + this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} + var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} + this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} + row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. (" + +buffer.getLengthInBits() + +">" + +totalDataCount*8 + +")");} + if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} + while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} + while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD1,8);} + return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}} + var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} + return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} + return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} + return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}} + for(var row=0;row=256){n-=255;} + return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} + if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} + this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; + + function _isSupportCanvas() { + return typeof CanvasRenderingContext2D != "undefined"; + } + + // android 2.x doesn't support Data-URI spec + function _getAndroid() { + var android = false; + var sAgent = navigator.userAgent; + + if (/android/i.test(sAgent)) { // android + android = true; + var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); + + if (aMat && aMat[1]) { + android = parseFloat(aMat[1]); + } + } + + return android; + } + + var svgDrawer = (function() { + + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + + this.clear(); + + function makeSVG(tag, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (var k in attrs) + if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); + return el; + } + + var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); + svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + _el.appendChild(svg); + + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + if (oQRCode.isDark(row, col)) { + var child = makeSVG("use", {"x": String(col), "y": String(row)}); + child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") + svg.appendChild(child); + } + } + } + }; + Drawing.prototype.clear = function () { + while (this._el.hasChildNodes()) + this._el.removeChild(this._el.lastChild); + }; + return Drawing; + })(); + + var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; + + // Drawing in DOM by using Table tag + var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + var aHTML = ['
']; + + for (var row = 0; row < nCount; row++) { + aHTML.push(''); + + for (var col = 0; col < nCount; col++) { + aHTML.push(''); + } + + aHTML.push(''); + } + + aHTML.push('
'); + _el.innerHTML = aHTML.join(''); + + // Fix the margin values as real size. + var elTable = _el.childNodes[0]; + var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; + var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; + + if (nLeftMarginTable > 0 && nTopMarginTable > 0) { + elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; + } + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._el.innerHTML = ''; + }; + + return Drawing; + })() : (function () { // Drawing in Canvas + function _onMakeImage() { + this._elImage.src = this._elCanvas.toDataURL("image/png"); + this._elImage.style.display = "block"; + this._elCanvas.style.display = "none"; + } + + // Android 2.1 bug workaround + // http://code.google.com/p/android/issues/detail?id=5141 + if (this._android && this._android <= 2.1) { + var factor = 1 / window.devicePixelRatio; + var drawImage = CanvasRenderingContext2D.prototype.drawImage; + CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (("nodeName" in image) && /img/i.test(image.nodeName)) { + for (var i = arguments.length - 1; i >= 1; i--) { + arguments[i] = arguments[i] * factor; + } + } else if (typeof dw == "undefined") { + arguments[1] *= factor; + arguments[2] *= factor; + arguments[3] *= factor; + arguments[4] *= factor; + } + + drawImage.apply(this, arguments); + }; + } + + /** + * Check whether the user's browser supports Data URI or not + * + * @private + * @param {Function} fSuccess Occurs if it supports Data URI + * @param {Function} fFail Occurs if it doesn't support Data URI + */ + function _safeSetDataURI(fSuccess, fFail) { + var self = this; + self._fFail = fFail; + self._fSuccess = fSuccess; + + // Check it just once + if (self._bSupportDataURI === null) { + var el = document.createElement("img"); + var fOnError = function() { + self._bSupportDataURI = false; + + if (self._fFail) { + self._fFail.call(self); + } + }; + var fOnSuccess = function() { + self._bSupportDataURI = true; + + if (self._fSuccess) { + self._fSuccess.call(self); + } + }; + + el.onabort = fOnError; + el.onerror = fOnError; + el.onload = fOnSuccess; + el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. + return; + } else if (self._bSupportDataURI === true && self._fSuccess) { + self._fSuccess.call(self); + } else if (self._bSupportDataURI === false && self._fFail) { + self._fFail.call(self); + } + }; + + /** + * Drawing QRCode by using canvas + * + * @constructor + * @param {HTMLElement} el + * @param {Object} htOption QRCode Options + */ + var Drawing = function (el, htOption) { + this._bIsPainted = false; + this._android = _getAndroid(); + + this._htOption = htOption; + this._elCanvas = document.createElement("canvas"); + this._elCanvas.width = htOption.width; + this._elCanvas.height = htOption.height; + el.appendChild(this._elCanvas); + this._el = el; + this._oContext = this._elCanvas.getContext("2d"); + this._bIsPainted = false; + this._elImage = document.createElement("img"); + this._elImage.alt = "Scan me!"; + this._elImage.style.display = "none"; + this._el.appendChild(this._elImage); + this._bSupportDataURI = null; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _elImage = this._elImage; + var _oContext = this._oContext; + var _htOption = this._htOption; + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + _elImage.style.display = "none"; + this.clear(); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.lineWidth = 1; + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + + // 안티 앨리어싱 방지 처리 + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + } + } + + this._bIsPainted = true; + }; + + /** + * Make the image from Canvas if the browser supports Data URI. + */ + Drawing.prototype.makeImage = function () { + if (this._bIsPainted) { + _safeSetDataURI.call(this, _onMakeImage); + } + }; + + /** + * Return whether the QRCode is painted or not + * + * @return {Boolean} + */ + Drawing.prototype.isPainted = function () { + return this._bIsPainted; + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); + this._bIsPainted = false; + }; + + /** + * @private + * @param {Number} nNumber + */ + Drawing.prototype.round = function (nNumber) { + if (!nNumber) { + return nNumber; + } + + return Math.floor(nNumber * 1000) / 1000; + }; + + return Drawing; + })(); + + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L : + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M : + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q : + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H : + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + /** + * @class QRCode + * @constructor + * @example + * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); + * + * @example + * var oQRCode = new QRCode("test", { + * text : "http://naver.com", + * width : 128, + * height : 128 + * }); + * + * oQRCode.clear(); // Clear the QRCode. + * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. + * + * @param {HTMLElement|String} el target element or 'id' attribute of element. + * @param {Object|String} vOption + * @param {String} vOption.text QRCode link data + * @param {Number} [vOption.width=256] + * @param {Number} [vOption.height=256] + * @param {String} [vOption.colorDark="#000000"] + * @param {String} [vOption.colorLight="#ffffff"] + * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] + */ + QRCode = function (el, vOption) { + this._htOption = { + width : 256, + height : 256, + typeNumber : 4, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text : vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + if (typeof el == "string") { + el = document.getElementById(el); + } + + if (this._htOption.useSVG) { + Drawing = svgDrawer; + } + + this._android = _getAndroid(); + this._el = el; + this._oQRCode = null; + this._oDrawing = new Drawing(this._el, this._htOption); + + if (this._htOption.text) { + this.makeCode(this._htOption.text); + } + }; + + /** + * Make the QRCode + * + * @param {String} sText link data + */ + QRCode.prototype.makeCode = function (sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this._el.title = sText; + this._oDrawing.draw(this._oQRCode); + this.makeImage(); + }; + + /** + * Make the Image from Canvas element + * - It occurs automatically + * - Android below 3 doesn't support Data-URI spec. + * + * @private + */ + QRCode.prototype.makeImage = function () { + if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { + this._oDrawing.makeImage(); + } + }; + + /** + * Clear the QRCode + */ + QRCode.prototype.clear = function () { + this._oDrawing.clear(); + }; + + /** + * @name QRCode.CorrectLevel + */ + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); + +export default QRCode; \ No newline at end of file diff --git a/imports/util/qrcode/qrcode.min.js b/imports/util/qrcode/qrcode.min.js new file mode 100644 index 0000000..993e88f --- /dev/null +++ b/imports/util/qrcode/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d8f7c12..8befc95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,25 +4,100 @@ "lockfileVersion": 1, "dependencies": { "@babel/runtime": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz", - "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" } } }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "requires": { + "acorn": "^2.1.0" + } + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atoa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", "integrity": "sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk=" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -32,11 +107,95 @@ "regenerator-runtime": "^0.11.0" } }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "canvg": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-1.5.3.tgz", + "integrity": "sha512-7Gn2IuQzvUQWPIuZuFHrzsTM0gkPz2RRT9OcbdmA03jeKk8kltrD8gqUzNX15ghY/4PV5bbe5lmD6yDLDY6Ybg==", + "requires": { + "jsdom": "^8.1.0", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^1.4.1", + "xmldom": "^0.1.22" + }, + "dependencies": { + "stackblur-canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-1.4.1.tgz", + "integrity": "sha1-hJqm+UsnL/JvZHH6QTDtH35HlVs=" + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=" }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "contra": { "version": "1.9.4", "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", @@ -51,6 +210,11 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "crossvent": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz", @@ -59,10 +223,31 @@ "custom-event": "1.0.0" } }, + "css-line-break": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.0.1.tgz", + "integrity": "sha1-GfIGOjPpX7KDG4ZEbAuAwYivRQo=", + "requires": { + "base64-arraybuffer": "^0.1.5" + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "requires": { + "cssom": "0.3.x" + } + }, "csv-parse": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.2.3.tgz", - "integrity": "sha1-RmIGtR6vd8y1DD+t69CYzessaec=" + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.4.6.tgz", + "integrity": "sha512-VisC5TBBhOF+70zjrF9FOiqI2LZOhXK/vAWlOrqyqz3lLa+P8jzJ7L/sg90MHmkSY/brAXWwrmGSZR0tM5yi4g==" }, "custom-event": { "version": "1.0.0", @@ -324,6 +509,37 @@ "d3-transition": "1" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dom-to-image": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", + "integrity": "sha1-ilA2CAiMh7HCL5A0rgMuGJiVWGc=" + }, "dragula": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.2.tgz", @@ -333,36 +549,468 @@ "crossvent": "1.5.4" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, + "file-saver": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "html2canvas": { + "version": "1.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.0.0-alpha.12.tgz", + "integrity": "sha1-OxmS48mz9WBjw1/WIElPN+uohRM=", + "requires": { + "css-line-break": "1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" }, "jquery-mousewheel": { "version": "3.1.13", "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=" }, - "lodash._reinterpolate": { + "jsbarcode": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.11.0.tgz", + "integrity": "sha512-/ozCd7wsa+VIHo9sUc03HneVEQrH7cVWfJolUT/WOW1m8mJ2e3iYZje6C9X3LFHdczlesqFHRpxLtbVsNtjyow==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-8.5.0.tgz", + "integrity": "sha1-1Nj12/J2hjW2KmKCO5R89wcevJg=", + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.34 < 0.3.0", + "escodegen": "^1.6.1", + "iconv-lite": "^0.4.13", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^3.0.1", + "whatwg-url": "^2.0.1", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jspdf": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-1.5.3.tgz", + "integrity": "sha512-J9X76xnncMw+wIqb15HeWfPMqPwYxSpPY8yWPJ7rAZN/ZDzFkjCSZObryCyUe8zbrVRNiuCnIeQteCzMn7GnWw==", + "requires": { + "canvg": "1.5.3", + "file-saver": "github:eligrey/FileSaver.js#e865e37af9f9947ddcced76b549e27dc45c1cb2e", + "html2canvas": "1.0.0-alpha.12", + "omggif": "1.0.7", + "promise-polyfill": "8.1.0", + "stackblur-canvas": "2.2.0" + }, + "dependencies": { + "file-saver": { + "version": "github:eligrey/FileSaver.js#e865e37af9f9947ddcced76b549e27dc45c1cb2e", + "from": "github:eligrey/FileSaver.js#1.3.8" + } + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._basecallback": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", + "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", + "requires": { + "lodash._baseisequal": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash._basefind": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + "resolved": "https://registry.npmjs.org/lodash._basefind/-/lodash._basefind-3.0.0.tgz", + "integrity": "sha1-srugXMZF+XLeLPkl+iv2Og9gyK4=" + }, + "lodash._basefindindex": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/lodash._basefindindex/-/lodash._basefindindex-3.6.0.tgz", + "integrity": "sha1-8IM2ChsCJBjtgbyJm+sxLiHnSk8=" + }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "requires": { + "lodash.isarray": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._baseismatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz", + "integrity": "sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U=", + "requires": { + "lodash._baseisequal": "^3.0.0" + } + }, + "lodash._basematches": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._basematches/-/lodash._basematches-3.2.0.tgz", + "integrity": "sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg=", + "requires": { + "lodash._baseismatch": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash.every": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", + "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=" + }, + "lodash.findwhere": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.findwhere/-/lodash.findwhere-3.1.0.tgz", + "integrity": "sha1-eTfTTz6sgY3sf6lOjKXib9uhz8E=", + "requires": { + "lodash._basematches": "^3.0.0", + "lodash.find": "^3.0.0" + }, + "dependencies": { + "lodash.find": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-3.2.1.tgz", + "integrity": "sha1-BG4xnzrOkSrGySRsf2g8XsB7Nq0=", + "requires": { + "lodash._basecallback": "^3.0.0", + "lodash._baseeach": "^3.0.0", + "lodash._basefind": "^3.0.0", + "lodash._basefindindex": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + } + } }, "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, "lodash.isempty": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -373,10 +1021,48 @@ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" }, - "lodash.merge": { + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" + }, + "lodash.pairs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", + "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.union": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "lodash.without": { "version": "4.4.0", @@ -392,37 +1078,17 @@ } }, "message-box": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.1.1.tgz", - "integrity": "sha1-d4VlhUzUUn0mc3P8IBJN4Ycpjaw=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.2.tgz", + "integrity": "sha512-A32m9D2ZaE08ZaXoE74AjcKwjtwwEhDT2EeY7A3YMAEB4ypL0uMZw7HegwZ806GIWyY4VLwe3kGO9reIdjwiRg==", "requires": { - "lodash.merge": "^4.6.0", - "lodash.template": "^4.4.0" - }, - "dependencies": { - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "requires": { - "lodash._reinterpolate": "~3.0.0" - } - } + "lodash": "^4.17.14" } }, "meteor-node-stubs": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.2.11.tgz", - "integrity": "sha1-cV5Owc6IgkiylgThbQkiVrDLfjQ=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-0.4.1.tgz", + "integrity": "sha512-UO2OStvLOKoApmOdIP5eCqoLaa/ritMXRg4ffJVdkNLEsczzPvTjgC0Mxk4cM4R8MZkwll90FYgjDf5qUTJdMA==", "requires": { "assert": "^1.4.1", "browserify-zlib": "^0.1.4", @@ -432,16 +1098,16 @@ "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.7", "events": "^1.1.1", - "http-browserify": "^1.7.0", "https-browserify": "0.0.1", "os-browserify": "^0.2.1", "path-browserify": "0.0.0", "process": "^0.11.9", "punycode": "^1.4.1", "querystring-es3": "^0.2.1", - "readable-stream": "git+https://github.com/meteor/readable-stream.git#2e9112d7d31a2af6e0682db0e18679b1e5fd4694", + "readable-stream": "^2.3.6", "stream-browserify": "^2.0.1", - "string_decoder": "^1.0.1", + "stream-http": "^2.8.0", + "string_decoder": "^1.1.0", "timers-browserify": "^1.4.2", "tty-browserify": "0.0.0", "url": "^0.11.0", @@ -449,15 +1115,9 @@ "vm-browserify": "0.0.4" }, "dependencies": { - "Base64": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", - "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=" - }, "asn1.js": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.0.tgz", - "integrity": "sha1-9xoSQ/PnnUbXsH1/v0gk7nOvBUo=", + "version": "4.10.1", + "bundled": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -466,43 +1126,38 @@ }, "assert": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "bundled": true, "requires": { "util": "0.10.3" } }, "base64-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" + "version": "1.3.0", + "bundled": true }, "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + "version": "4.11.8", + "bundled": true }, "brorand": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.0.6.tgz", - "integrity": "sha1-QChwa5FfkfezSaLgvzw3YDnSFuU=" + "version": "1.1.0", + "bundled": true }, "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "version": "1.2.0", + "bundled": true, "requires": { - "buffer-xor": "^1.0.2", + "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "inherits": "^2.0.1" + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "bundled": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -510,9 +1165,8 @@ } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "bundled": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -521,17 +1175,15 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "bundled": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz", - "integrity": "sha1-EHc5EMPCBtVCCkaq2GlPgguFlo8=", + "version": "4.0.4", + "bundled": true, "requires": { "bn.js": "^4.1.1", "browserify-rsa": "^4.0.0", @@ -544,16 +1196,14 @@ }, "browserify-zlib": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "bundled": true, "requires": { "pako": "~0.2.0" } }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "bundled": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -562,63 +1212,69 @@ }, "buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "bundled": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "bundled": true }, "cipher-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", + "version": "1.0.4", + "bundled": true, "requires": { - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "console-browserify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "bundled": true, "requires": { "date-now": "^0.1.4" } }, "constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "bundled": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" } }, "create-hash": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", - "integrity": "sha1-USEAYte7dHn2xlu0GpIgix1hq60=", + "version": "1.2.0", + "bundled": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "ripemd160": "^1.0.0", - "sha.js": "^2.3.6" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz", - "integrity": "sha1-0/tLolPriz9W456i+8uK90e9MXA=", + "version": "1.1.7", + "bundled": true, "requires": { + "cipher-base": "^1.0.3", "create-hash": "^1.1.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "crypto-browserify": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", - "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", + "version": "3.12.0", + "bundled": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -629,27 +1285,25 @@ "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0" + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "date-now": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "bundled": true }, "des.js": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "bundled": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "bundled": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -657,104 +1311,120 @@ } }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + "version": "1.2.0", + "bundled": true }, "elliptic": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.2.tgz", - "integrity": "sha1-5MgeCCnPCmWrcOmYuCMnI7XBvEg=", + "version": "6.4.0", + "bundled": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", "hash.js": "^1.0.0", - "inherits": "^2.0.1" + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "bundled": true }, "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "version": "1.0.3", + "bundled": true, "requires": { - "create-hash": "^1.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", - "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=", + "version": "1.1.3", + "bundled": true, "requires": { - "inherits": "^2.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "bundled": true + } } }, - "http-browserify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", - "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, "requires": { - "Base64": "~0.2.0", - "inherits": "~2.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "https-browserify": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + "bundled": true }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "version": "1.1.11", + "bundled": true }, "indexof": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + "bundled": true }, "inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "bundled": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "bundled": true + }, + "md5.js": { + "version": "1.3.4", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } }, "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "version": "4.0.1", + "bundled": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" } }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true }, "os-browserify": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + "bundled": true }, "pako": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + "bundled": true }, "parse-asn1": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.0.0.tgz", - "integrity": "sha1-NQYPbVAV03Yox3D04JGgtaJ4vCM=", + "version": "5.1.1", + "bundled": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -765,31 +1435,30 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + "bundled": true }, "pbkdf2": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.9.tgz", - "integrity": "sha1-8sSyWmAAWLPDdzwIbDfbvuH/5pM=", + "version": "3.0.16", + "bundled": true, "requires": { - "create-hmac": "^1.1.2" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "process": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz", - "integrity": "sha1-e9WtIapiU+fahoImTx4R0RwDGME=" + "version": "0.11.10", + "bundled": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "2.0.0", + "bundled": true }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "bundled": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -800,88 +1469,114 @@ }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "bundled": true }, "querystring": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "bundled": true }, "querystring-es3": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "bundled": true }, "randombytes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", - "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + "version": "2.0.6", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "bundled": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } }, "readable-stream": { - "version": "git+https://github.com/meteor/readable-stream.git#2e9112d7d31a2af6e0682db0e18679b1e5fd4694", - "from": "git+https://github.com/meteor/readable-stream.git", + "version": "2.3.6", + "bundled": true, "requires": { - "inherits": "~2.0.1", + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "^5.0.1", - "string_decoder": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "bundled": true + } } }, "ripemd160": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz", - "integrity": "sha1-k6S71JQrxXS2mo+lfHHeEOzKfW4=" + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } }, "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + "version": "5.1.2", + "bundled": true }, "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "version": "2.4.11", + "bundled": true, "requires": { - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "bundled": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "stream-http": { + "version": "2.8.1", + "bundled": true, "requires": { - "safe-buffer": "^5.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" } }, "timers-browserify": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "bundled": true, "requires": { "process": "~0.11.0" } }, + "to-arraybuffer": { + "version": "1.0.1", + "bundled": true + }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + "bundled": true }, "url": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "bundled": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -889,38 +1584,77 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "bundled": true } } }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "bundled": true, "requires": { "inherits": "2.0.1" } }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "bundled": true }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "bundled": true, "requires": { "indexof": "0.0.1" } + }, + "xtend": { + "version": "4.0.1", + "bundled": true } } }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, "mongo-object": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.0.2.tgz", - "integrity": "sha1-Pcq6+RRuGvtjqAlAYUa4VE0olko=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.3.tgz", + "integrity": "sha512-m3vs+a1JkvRXELJMe2ieMmBe03NUy6bctGjWicRhReYj8brDi0ojKHLKLmXWr/RupNaFP8Q7/x8xG8GpFtp9wg==", "requires": { "lodash.foreach": "^4.5.0", "lodash.isempty": "^4.4.0", @@ -928,6 +1662,92 @@ "lodash.without": "^4.4.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "omggif": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.7.tgz", + "integrity": "sha1-WdLuywJj3oRjWz/riHwMmXPx5J0=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise-polyfill": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", + "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==" + }, "properties-reader": { "version": "0.0.15", "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-0.0.15.tgz", @@ -943,32 +1763,213 @@ } } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + }, + "psl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + } + }, + "pure-svg-code": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pure-svg-code/-/pure-svg-code-1.0.6.tgz", + "integrity": "sha512-uxq2BMTdnKW7jDghpLJrczCd9KDOdyghFtEEpfomqMJkUM83/N+W7sFJPJ3AxBf0mJ3xtxAycl6NW8p6F53jEw==" + }, + "qrcode-svg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/qrcode-svg/-/qrcode-svg-1.0.0.tgz", + "integrity": "sha1-Jb3fDAbH5UZiL0tZWjVT76Jke84=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "regenerator-runtime": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=" }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "simpl-schema": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-0.3.2.tgz", - "integrity": "sha1-LHVETpN4UFrFJSGTlN4GPOT28Gg=", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.5.5.tgz", + "integrity": "sha512-LEAKeqXS9VDpH7sVXmsIJsED7fdMj/WAP0roZw0u0IzOgQV7n3x7jcf722cl7WM6U5ANwI4wwv0dujLuwv266A==", "requires": { "clone": "^2.1.1", "extend": "^3.0.1", - "message-box": "^0.1.1", - "mongo-object": "^0.0.2", - "underscore": "^1.8.3" + "lodash.every": "^4.6.0", + "lodash.find": "^4.6.0", + "lodash.findwhere": "^3.1.0", + "lodash.includes": "^4.3.0", + "lodash.isempty": "^4.4.0", + "lodash.isobject": "^3.0.2", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "lodash.union": "^4.6.0", + "lodash.uniq": "^4.5.0", + "message-box": "^0.2.0", + "mongo-object": "^0.1.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stackblur-canvas": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.2.0.tgz", + "integrity": "sha512-5Gf8dtlf8k6NbLzuly2NkGrkS/Ahh+I5VUjO7TnFizdJtgpfpLLEdQlLe9umbcnZlitU84kfYjXE67xlSXfhfQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" }, "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -977,20 +1978,138 @@ "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-6.10.1.tgz", "integrity": "sha1-WyhHd6VG+xFCmRW1dwiEc6ok4P0=" }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "ticky": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", "integrity": "sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0=" }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-2.0.1.tgz", + "integrity": "sha1-U5ayBD8CDub3BNnEXqhRnnJN5lk=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } } } } diff --git a/package.json b/package.json index 911c32b..0273045 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,24 @@ "build": "npm install --product && meteor build --architecture os.linux.x86_64 --server-only ../" }, "dependencies": { - "@babel/runtime": "^7.2.0", + "@babel/runtime": "^7.5.5", "babel-runtime": "^6.18.0", - "csv-parse": "latest", + "csv-parse": "^4.4.6", "d3": "^4.4.2", + "dom-to-image": "latest", "dragula": "^3.7.2", - "jquery": "^3.1.1", + "file-saver": "^2.0.2", + "jquery": "^3.4.1", "jquery-mousewheel": "^3.1.13", + "jsbarcode": "^3.11.0", + "jspdf": "^1.5.3", "malihu-custom-scrollbar-plugin": "latest", - "meteor-node-stubs": "^0.2.4", + "meteor-node-stubs": "^0.4.1", + "nocache": "^2.1.0", "properties-reader": "0.0.15", + "puppeteer": "^1.20.0", + "pure-svg-code": "^1.0.6", + "qrcode-svg": "^1.0.0", "simpl-schema": "latest", "sweetalert2": "^6.3.8" } diff --git a/public/JsBarcode.all.min.js b/public/JsBarcode.all.min.js new file mode 100644 index 0000000..e1db1b5 --- /dev/null +++ b/public/JsBarcode.all.min.js @@ -0,0 +1,3 @@ +/*! JsBarcode v3.6.0 | (c) Johan Lindell | MIT license */ +!function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,e,n){Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var n=t&&t.__esModule?function(){return t["default"]}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=42)}([function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function o(t,e){n(this,o),this.data=t,this.text=e.text||t,this.options=e};e["default"]=r},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){n(this,t),this.startBin="101",this.endBin="101",this.middleBin="01010",this.Lbinary=["0001101","0011001","0010011","0111101","0100011","0110001","0101111","0111011","0110111","0001011"],this.Gbinary=["0100111","0110011","0011011","0100001","0011101","0111001","0000101","0010001","0001001","0010111"],this.Rbinary=["1110010","1100110","1101100","1000010","1011100","1001110","1010000","1000100","1001000","1110100"]}return t.prototype.encode=function(t,e,n){var r="";n=n||"";for(var o=0;o=200)r=t[0]-105,t.shift(),99===r?n=this.nextC(t,e+1):100===r?n=this.nextB(t,e+1):98===r?(t[0]=t[0]>95?t[0]-96:t[0],n=this.nextA(t,e+1)):n=this.nextA(t,e+1);else{var o=t[0];r=o<32?o+64:o-32,t.shift(),n=this.nextA(t,e+1)}var i=this.getEncoding(r),a=r*e;return{result:i+n.result,checksum:a+n.checksum}},e.prototype.nextB=function(t,e){if(t.length<=0)return{result:"",checksum:0};var n,r;t[0]>=200?(r=t[0]-105,t.shift(),99===r?n=this.nextC(t,e+1):101===r?n=this.nextA(t,e+1):98===r?(t[0]=t[0]<32?t[0]+96:t[0],n=this.nextB(t,e+1)):n=this.nextB(t,e+1)):(r=t[0]-32,t.shift(),n=this.nextB(t,e+1));var o=this.getEncoding(r),i=r*e;return{result:o+n.result,checksum:i+n.checksum}},e.prototype.nextC=function(t,e){if(t.length<=0)return{result:"",checksum:0};var n,r;t[0]>=200?(r=t[0]-105,t.shift(),n=100===r?this.nextB(t,e+1):101===r?this.nextA(t,e+1):this.nextC(t,e+1)):(r=10*(t[0]-48)+t[1]-48,t.shift(),t.shift(),n=this.nextC(t,e+1));var o=this.getEncoding(r),i=r*e;return{result:o+n.result,checksum:i+n.checksum}},e}(s["default"]),f=function(t){function e(){o(this,e);var n=i(this,t.call(this));return n.name="InvalidStartCharacterException",n.message="The encoding does not start with a start character.",n}return a(e,t),e}(Error);e["default"]=c},function(t,e){"use strict";function n(t){for(var e=0,n=0;n0?e.fontSize+e.textMargin:0)+e.marginTop+e.marginBottom}function i(t,e,n){if(n.displayValue&&ee&&(e=t[n].height);return e}function c(t,e,n){var r;r="undefined"==typeof n?document.createElement("canvas").getContext("2d"):n,r.font=e.fontOptions+" "+e.fontSize+"px "+e.font;var o=r.measureText(t).width;return o}Object.defineProperty(e,"__esModule",{value:!0}),e.getTotalWidthOfEncodings=e.calculateEncodingAttributes=e.getBarcodePadding=e.getEncodingHeight=e.getMaximumHeightOfEncodings=void 0;var f=n(3),l=r(f);e.getMaximumHeightOfEncodings=s,e.getEncodingHeight=o,e.getBarcodePadding=i,e.calculateEncodingAttributes=a,e.getTotalWidthOfEncodings=u},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(20),o=n(19),i=n(26),a=n(29),u=n(28),s=n(34),c=n(36),f=n(35),l=n(27);e["default"]={CODE39:r.CODE39,CODE128:o.CODE128,CODE128A:o.CODE128A,CODE128B:o.CODE128B,CODE128C:o.CODE128C,EAN13:i.EAN13,EAN8:i.EAN8,EAN5:i.EAN5,EAN2:i.EAN2,UPC:i.UPC,ITF14:a.ITF14,ITF:u.ITF,MSI:s.MSI,MSI10:s.MSI10,MSI11:s.MSI11,MSI1010:s.MSI1010,MSI1110:s.MSI1110,pharmacode:c.pharmacode,codabar:f.codabar,GenericBarcode:l.GenericBarcode}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(e){n(this,t),this.api=e}return t.prototype.handleCatch=function(t){if("InvalidInputException"!==t.name)throw t;if(this.api._options.valid===this.api._defaults.valid)throw t.message;this.api._options.valid(!1),this.api.render=function(){}},t.prototype.wrapBarcodeCall=function(t){try{var e=t.apply(void 0,arguments);return this.api._options.valid(!0),e}catch(n){return this.handleCatch(n),this.api}},t}();e["default"]=r},function(t,e){"use strict";function n(t){return t.marginTop=t.marginTop||t.margin,t.marginBottom=t.marginBottom||t.margin,t.marginRight=t.marginRight||t.margin,t.marginLeft=t.marginLeft||t.margin,t}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=n},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t){if("string"==typeof t)return i(t);if(Array.isArray(t)){for(var e=[],n=0;n=2?String.fromCharCode(210)+f(t):n>r?String.fromCharCode(208)+s(t):String.fromCharCode(209)+c(t),e=e.replace(/[\xCD\xCE]([^])[\xCD\xCE]/,function(t,e){return String.fromCharCode(203)+e})}function s(t){var e=t.match(/^([\x00-\x5F\xC8-\xCF]+?)(([0-9]{2}){2,})([^0-9]|$)/);if(e)return e[1]+String.fromCharCode(204)+f(t.substring(e[1].length));var n=t.match(/^[\x00-\x5F\xC8-\xCF]+/);return n[0].length===t.length?t:n[0]+String.fromCharCode(205)+c(t.substring(n[0].length))}function c(t){var e=t.match(/^([\x20-\x7F\xC8-\xCF]+?)(([0-9]{2}){2,})([^0-9]|$)/);if(e)return e[1]+String.fromCharCode(204)+f(t.substring(e[1].length));var n=t.match(/^[\x20-\x7F\xC8-\xCF]+/);return n[0].length===t.length?t:n[0]+String.fromCharCode(206)+s(t.substring(n[0].length))}function f(t){var e=t.match(/^(\xCF*[0-9]{2}\xCF*)+/)[0],n=e.length;if(n===t.length)return t;t=t.substring(n);var r=t.match(/^[\x00-\x5F\xC8-\xCF]*/)[0].length,o=t.match(/^[\x20-\x7F\xC8-\xCF]*/)[0].length;return r>=o?e+String.fromCharCode(206)+s(t):e+String.fromCharCode(205)+c(t)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(4),p=r(l),h=function(t){function e(n,r){if(o(this,e),n.search(/^[\x00-\x7F\xC8-\xD3]+$/)!==-1)var a=i(this,t.call(this,u(n),r));else var a=i(this,t.call(this,n,r));return i(a)}return a(e,t),e}(p["default"]);e["default"]=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0}),e.CODE128C=e.CODE128B=e.CODE128A=e.CODE128=void 0;var o=n(18),i=r(o),a=n(15),u=r(a),s=n(16),c=r(s),f=n(17),l=r(f);e.CODE128=i["default"],e.CODE128A=u["default"],e.CODE128B=c["default"],e.CODE128C=l["default"]},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t){return s(f(t))}function s(t){return b[t].toString(2)}function c(t){return y[t]}function f(t){return y.indexOf(t)}function l(t){for(var e=0,n=0;n10*r.width?a.fontSize=10*r.width:a.fontSize=r.fontSize,a.guardHeight=r.height+a.fontSize/2+r.textMargin,a.lastChar=r.lastChar,a}return a(e,t),e.prototype.valid=function(){return this.data.search(/^[0-9]{13}$/)!==-1&&this.data[12]==u(this.data)},e.prototype.encode=function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()},e.prototype.getStructure=function(){return["LLLLLL","LLGLGG","LLGGLG","LLGGGL","LGLLGG","LGGLLG","LGGGLL","LGLGLG","LGLGGL","LGGLGL"]},e.prototype.guardedEncoding=function(){var t=new c["default"],e=[],n=this.getStructure()[this.data[0]],r=this.data.substr(1,6),o=this.data.substr(7,6);return this.options.displayValue&&e.push({data:"000000000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101",options:{height:this.guardHeight}}),e.push({data:t.encode(r,n),text:this.text.substr(1,6),options:{fontSize:this.fontSize}}),e.push({data:"01010",options:{height:this.guardHeight}}),e.push({data:t.encode(o,"RRRRRR"),text:this.text.substr(7,6),options:{fontSize:this.fontSize}}),e.push({data:"101",options:{height:this.guardHeight}}),this.options.lastChar&&this.options.displayValue&&(e.push({data:"00"}),e.push({data:"00000",text:this.options.lastChar,options:{fontSize:this.fontSize}})),e},e.prototype.flatEncoding=function(){var t=new c["default"],e="",n=this.getStructure()[this.data[0]];return e+="101",e+=t.encode(this.data.substr(1,6),n),e+="01010",e+=t.encode(this.data.substr(7,6),"RRRRRR"),e+="101",{data:e,text:this.text}},e}(l["default"]);e["default"]=p},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=n(1),s=r(u),c=n(0),f=r(c),l=function(t){function e(n,r){o(this,e);var a=i(this,t.call(this,n,r));return a.structure=["LL","LG","GL","GG"],a}return a(e,t),e.prototype.valid=function(){return this.data.search(/^[0-9]{2}$/)!==-1},e.prototype.encode=function(){var t=new s["default"],e=this.structure[parseInt(this.data)%4],n="1011";return n+=t.encode(this.data,e,"01"),{data:n,text:this.text}},e}(f["default"]);e["default"]=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var u=n(1),s=r(u),c=n(0),f=r(c),l=function(t){function e(n,r){o(this,e);var a=i(this,t.call(this,n,r));return a.structure=["GGLLL","GLGLL","GLLGL","GLLLG","LGGLL","LLGGL","LLLGG","LGLGL","LGLLG","LLGLG"],a}return a(e,t),e.prototype.valid=function(){return this.data.search(/^[0-9]{5}$/)!==-1},e.prototype.encode=function(){var t=new s["default"],e=this.checksum(),n="1011";return n+=t.encode(this.data,this.structure[e],"01"),{data:n,text:this.text}},e.prototype.checksum=function(){var t=0;return t+=3*parseInt(this.data[0]),t+=9*parseInt(this.data[1]),t+=3*parseInt(this.data[2]),t+=9*parseInt(this.data[3]),t+=3*parseInt(this.data[4]),t%10},e}(f["default"]);e["default"]=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t){var e,n=0;for(e=0;e<7;e+=2)n+=3*parseInt(t[e]);for(e=1;e<7;e+=2)n+=parseInt(t[e]);return(10-n%10)%10}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),c=r(s),f=n(0),l=r(f),p=function(t){function e(n,r){return o(this,e),n.search(/^[0-9]{7}$/)!==-1&&(n+=u(n)),i(this,t.call(this,n,r))}return a(e,t),e.prototype.valid=function(){return this.data.search(/^[0-9]{8}$/)!==-1&&this.data[7]==u(this.data)},e.prototype.encode=function(){var t=new c["default"],e="",n=this.data.substr(0,4),r=this.data.substr(4,4);return e+=t.startBin,e+=t.encode(n,"LLLL"),e+=t.middleBin,e+=t.encode(r,"RRRR"),e+=t.endBin,{data:e,text:this.text}},e}(l["default"]);e["default"]=p},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t){var e,n=0;for(e=1;e<11;e+=2)n+=parseInt(t[e]);for(e=0;e<11;e+=2)n+=3*parseInt(t[e]);return(10-n%10)%10}Object.defineProperty(e,"__esModule",{value:!0});var s=n(1),c=r(s),f=n(0),l=r(f),p=function(t){function e(n,r){o(this,e),n.search(/^[0-9]{11}$/)!==-1&&(n+=u(n));var a=i(this,t.call(this,n,r));return a.displayValue=r.displayValue,r.fontSize>10*r.width?a.fontSize=10*r.width:a.fontSize=r.fontSize,a.guardHeight=r.height+a.fontSize/2+r.textMargin,a}return a(e,t),e.prototype.valid=function(){return this.data.search(/^[0-9]{12}$/)!==-1&&this.data[11]==u(this.data)},e.prototype.encode=function(){return this.options.flat?this.flatEncoding():this.guardedEncoding()},e.prototype.flatEncoding=function(){var t=new c["default"],e="";return e+="101",e+=t.encode(this.data.substr(0,6),"LLLLLL"),e+="01010",e+=t.encode(this.data.substr(6,6),"RRRRRR"),e+="101",{data:e,text:this.text}},e.prototype.guardedEncoding=function(){var t=new c["default"],e=[];return this.displayValue&&e.push({data:"00000000",text:this.text.substr(0,1),options:{textAlign:"left",fontSize:this.fontSize}}),e.push({data:"101"+t.encode(this.data[0],"L"),options:{height:this.guardHeight}}),e.push({data:t.encode(this.data.substr(1,5),"LLLLL"),text:this.text.substr(1,5),options:{fontSize:this.fontSize}}),e.push({data:"01010",options:{height:this.guardHeight}}),e.push({data:t.encode(this.data.substr(6,5),"RRRRR"),text:this.text.substr(6,5),options:{fontSize:this.fontSize}}),e.push({data:t.encode(this.data[11],"R")+"101",options:{height:this.guardHeight}}),this.displayValue&&e.push({data:"00000000",text:this.text.substr(11,1),options:{textAlign:"right",fontSize:this.fontSize}}),e},e}(l["default"]);e["default"]=p},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0}),e.UPC=e.EAN2=e.EAN5=e.EAN8=e.EAN13=void 0;var o=n(21),i=r(o),a=n(24),u=r(a),s=n(23),c=r(s),f=n(22),l=r(f),p=n(25),h=r(p);e.EAN13=i["default"],e.EAN8=u["default"],e.EAN5=c["default"],e.EAN2=l["default"],e.UPC=h["default"]},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.GenericBarcode=void 0;var u=n(0),s=r(u),c=function(t){function e(n,r){return o(this,e),i(this,t.call(this,n,r))}return a(e,t),e.prototype.encode=function(){return{data:"10101010101010101010101010101010101010101",text:this.text}},e.prototype.valid=function(){return!0},e}(s["default"]);e.GenericBarcode=c},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ITF=void 0;var u=n(0),s=r(u),c=function(t){function e(n,r){o(this,e);var a=i(this,t.call(this,n,r));return a.binaryRepresentation={0:"00110",1:"10001",2:"01001",3:"11000",4:"00101",5:"10100",6:"01100",7:"00011",8:"10010",9:"01010"},a}return a(e,t),e.prototype.valid=function(){return this.data.search(/^([0-9]{2})+$/)!==-1},e.prototype.encode=function(){for(var t="1010",e=0;e=3&&this.number<=131070},e}(s["default"]);e.pharmacode=c},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t){var e={};for(var n in s["default"])s["default"].hasOwnProperty(n)&&(t.hasAttribute("jsbarcode-"+n.toLowerCase())&&(e[n]=t.getAttribute("jsbarcode-"+n.toLowerCase())),t.hasAttribute("data-"+n.toLowerCase())&&(e[n]=t.getAttribute("data-"+n.toLowerCase())));return e.value=t.getAttribute("jsbarcode-value")||t.getAttribute("data-value"),e=(0,a["default"])(e)}Object.defineProperty(e,"__esModule",{value:!0});var i=n(7),a=r(i),u=n(8),s=r(u);e["default"]=o},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),a=r(i),u=n(9),s=function(){function t(e,n,r){o(this,t),this.canvas=e,this.encodings=n,this.options=r}return t.prototype.render=function(){if(!this.canvas.getContext)throw new Error("The browser does not support canvas.");this.prepareCanvas();for(var t=0;t0?(o=0,n.textAlign="left"):"right"==t.textAlign?(o=e.width-1,n.textAlign="right"):(o=e.width/2,n.textAlign="center"),n.fillText(e.text,o,i)}},t.prototype.moveCanvasDrawing=function(t){var e=this.canvas.getContext("2d");e.translate(t.width,0)},t.prototype.restoreCanvas=function(){var t=this.canvas.getContext("2d");t.restore()},t}();e["default"]=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(38),i=r(o),a=n(41),u=r(a),s=n(40),c=r(s);e["default"]={CanvasRenderer:i["default"],SVGRenderer:u["default"],ObjectRenderer:c["default"]}},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(e,r,o){n(this,t),this.object=e,this.encodings=r,this.options=o}return t.prototype.render=function(){this.object.encodings=this.encodings},t}();e["default"]=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e,n){var r=document.createElementNS(l,"g");return r.setAttribute("transform","translate("+t+", "+e+")"),n.appendChild(r),r}function a(t,e){t.setAttribute("style","fill:"+e.lineColor+";")}function u(t,e,n,r,o){var i=document.createElementNS(l,"rect");return i.setAttribute("x",t),i.setAttribute("y",e),i.setAttribute("width",n),i.setAttribute("height",r),o.appendChild(i),i}Object.defineProperty(e,"__esModule",{value:!0});var s=n(3),c=r(s),f=n(9),l="http://www.w3.org/2000/svg",p=function(){function t(e,n,r){o(this,t),this.svg=e,this.encodings=n,this.options=r}return t.prototype.render=function(){var t=this.options.marginLeft;this.prepareSVG();for(var e=0;e0&&(u(a-e.width*i,r,e.width*i,e.height,t),i=0);i>0&&u(a-e.width*(i-1),r,e.width*i,e.height,t)},t.prototype.drawSVGText=function(t,e,n){var r=document.createElementNS(l,"text");if(e.displayValue){var o,i;r.setAttribute("style","font:"+e.fontOptions+" "+e.fontSize+"px "+e.font),i="top"==e.textPosition?e.fontSize-e.textMargin:e.height+e.textMargin+e.fontSize,"left"==e.textAlign||n.barcodePadding>0?(o=0,r.setAttribute("text-anchor","start")):"right"==e.textAlign?(o=n.width-1,r.setAttribute("text-anchor","end")):(o=n.width/2,r.setAttribute("text-anchor","middle")),r.setAttribute("x",o),r.setAttribute("y",i),r.appendChild(document.createTextNode(n.text)),t.appendChild(r)}},t.prototype.setSvgAttributes=function(t,e){var n=this.svg;n.setAttribute("width",t+"px"),n.setAttribute("height",e+"px"),n.setAttribute("x","0px"),n.setAttribute("y","0px"),n.setAttribute("viewBox","0 0 "+t+" "+e),n.setAttribute("xmlns",l),n.setAttribute("version","1.1"),n.style.transform="translate(0,0)"},t}();e["default"]=p},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){E.prototype[e]=E.prototype[e.toUpperCase()]=E.prototype[e.toLowerCase()]=function(n,r){var o=this;return o._errorHandler.wrapBarcodeCall(function(){r.text="undefined"==typeof r.text?void 0:""+r.text;var a=(0,l["default"])(o._options,r);a=(0,_["default"])(a);var u=t[e],s=i(n,u,a);return o._encodings.push(s),o})}}function i(t,e,n){t=""+t;var r=new e(t,n);if(!r.valid())throw new m.InvalidInputException(r.constructor.name,t);var o=r.encode();o=(0,h["default"])(o);for(var i=0;i + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/public/images/3x2 Label Logo2 BW.svg b/public/images/3x2 Label Logo2 BW.svg new file mode 100644 index 0000000..538306e --- /dev/null +++ b/public/images/3x2 Label Logo2 BW.svg @@ -0,0 +1,90 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/public/images/3x2 Label Logo3 BW.svg b/public/images/3x2 Label Logo3 BW.svg new file mode 100644 index 0000000..26db698 --- /dev/null +++ b/public/images/3x2 Label Logo3 BW.svg @@ -0,0 +1,66 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/public/images/Logo_0.8x0.73_300ppi.png b/public/images/Logo_0.8x0.73_300ppi.png new file mode 100644 index 0000000000000000000000000000000000000000..8706429697f72eb91b9c1490c860630b3298aef9 GIT binary patch literal 39040 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 z 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 literal 0 HcmV?d00001 diff --git a/public/images/Petit Teton Logo Only.png b/public/images/Petit Teton Logo Only.png new file mode 100644 index 0000000000000000000000000000000000000000..53f6447cb97a2a305cf37df1368db922dee4c7bc GIT binary patch literal 132482 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
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0

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�NGEbte@s-#** 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 z z{JGvE1**{BNmA7Yq=hwW-nAv!8@;wBj)a?#wOt;44()y_qfp|(L!A5E5X;tycEpod zMho|U|Ilv7Ge#h?+`vZfCS;AjU`Zv9@WRi@bBM}&|6a-Ub(ZOoqCVS$OvO4 zfc)Drs$FxGQ7FCMhV#z%y|q&p9o}>jB$|AUCFvLBX(kLAhw?Kt2tJqOuaj4=qMave zVkRM+*$4K;8N7%!S_K0o=}stF*_W%6xCXHXz^~Vvg!jyy&|QPP5fB7|4O<@p9r%VG z)yLK!ge^(OHDv2O=}$C7LLE$)ctZpgJI?KT>=~mqioA(13Z+-2#ajn|@!I%zgZcPK z)U+u2`z-iTRk3}b1@-U91J?Vv^6!9T^`F@BOgt|}_8?mIEiJIO!-H63OFYm!Ip5oc zSlE}Rqr2DpJb3N~0DQ)Y_+4{Q68Tw*5P>MT6c~J93%#n3i{UlcLg22c4)0A2lib>m zkyTb6s|iktw-NkK=x7&=Mi_;%rIK!oFR&IZ2`UoFIqkXw2KV#<*YXI!GPOj&TedOElF%lL01TF=E zHn4>rB(rsbVA=4S*Cd*HC$}rd)f92(alayTD=1u(m)JWG{5t4wd~#m9-0geAnnxcQ zW$`Y5bWgNY3QCBsB%rm!BtqZ){yyVp#`=a{_zBNrIIO(g5k%&ULfH=wNun)9A~VDq zEs4jAk#+a-W+B!9R^j=r_aq2=1;(K;o*f9Ha3M%Yfsl9Bx)ZU*Imkl)T}WVAjI^@{ z*3aYzx$qi$lQYG@-)P~hgM5K&r~eLjO&=EJae@S4AL(tRJ-+;TieBNKSwHa@kS-4G zh$7mBl$Y^=5Npis2&i4G@l3u7a}a9)%P7g`yM7LIk8&bMOXp~Sq2!|lHTZ8LqX(H} zeeA=V&~NVD3b%4(O}$Y!*3Ybp9ejnhrnkGlI4#`5SvD zJ)glyrpz(_3DTWVE&8}~ z@k-dF0X5kWY-o*tdC&Iy{H%GOHzZouB`=8stHOW?@d~3*bomw*s;?1iQ1SjNAB)jzgfLH@~!ztOd>sL5Pa>>M|fJ+wlV^%om?aX)} z30k{gtWCuC9EY-SWV?Zu!4RM%xaRG@baiHgQ7ApDyOz{H!QJv(z&yOVD_R5_68Blc zr_xwWPaA1Ma6$C%@G)D%;!F~d)3@j*0;H9T@Uy~P?= zY!Og$uA_8I@(6OtjA{o4i8a1H4?*U5g7z-OaQ(G#r>tM2oxwQRI5-Qd`SOUD2 zSFXv2=#`XNg#S+OqfmOTUlt%MTZj_oY3jD;8VKs6fqV2F8tuiAWBvz>ND4(lO$cT` zg2!?a`DpojxtAVYqr_P}@aN@!gIuEkpML`k|63sEtu;>~N9h6qkH_f7WQkPJ$_ zk3zXjyw7V@`7LkXjcYXxYXn#tY@yVf-TSv?h4unL)EqzN!Fq-#6A$>ts^2y*-x+h> zgqjd*XdIn%QM}&S;XQ~f);PSsWi3T@&-dS$F`@YRo$X6ut3qZ_0V_xoi>LU6kG}uU)CX*~gxvx)vk9`y_Dx7tE?^XzjRq zfoFUP1RHPzK=?uABIs&|%cB4!f;JDvzBLhWo!}($sP+w1N&0Wc65!3GVofe^x(fb{ z#re4`lYM~}VMPl83*n_ZR-2s=%8u`p^mpZ$PkSpO*|i5}_CqiVg*b)oNjeZ&tWlF* z5s^l*hSw1&-#M_JVvTCxH|Hdq{JkfHbDH;_@h7o)M?T-33;}@>>U-cWV5NF&A8EVR z(K@rvZuXp{e=G-@JNGksig2X@RqvxvsscNB7P1orjdQT}zRX4yyjQ*BBW>>^cWWL` zQG={yZ=c#r5?X6zr}ua!N_P#!cx~JlVhzL^(Z`2J6l=TMdF!x{OD1sl*vr5{-%=v@hojS74 z;T?C6osCM6x3h3fMEp4^GVJL1EJ{?iZuJFP$k?^SAOYhXtQ8h$@Img$j$ni88F&iM zKHx`jRL^9nr_OX<-%EFM z`>2!7!7WjAxd*d_HW7rs03wiY;zvt&AW5ouAPZU@xMxE^dS;zNzfWGBpe4xr3I2+c zkvnmBdJbFO9BE(R+4%1uEcW61%oc1Mk{w&0mDvx7!p|`xiH9wT+m7Cgh}0UF6rscK zg85#32cwELM*eo|VvS4kU;W-I@%c#lg$SDNJ@Ks$jE>E|-IKzy!#Tru1I^$95MTqJ z&bp_r4|l#vg9k>s&DU4LckEUB2AYkIdF#uCZWDmxDOZ8J0{BMsO9}pRDgY2-^y|Y}c z#2ea%o{1Q##C&#qCMAf(J-)!w_-_#?>O>XZcT0rLZSvaUgZPMvq9#^*^F5wKF4nt# zee>C@Rh@h9uJKI%I|1~-!SMatJ4#`sSmR>&e%@1zkrlnx{AR%R)TCQzhwYw=ld#=h z*ke=iKcBskhrk#S!bfE=SdX3~AiR)}XTjgyV;l;V$F`k6k50Rn7SA}Z;{)48=Z4e~S(PI&n|71RIifythBAgIPdZ)@vef`_7Qtx3nh`;mHy5gvzU0}@YA{ys6p=_ zsW@4e)(V8$@ZatcFjtPQ2u37$y;fFQ2#B$9`;k-M3N5LsK(D^0lrOjU{`R!B_^Wov zkJ+6XB&$Vxztv|YHe}(b4~>hW?m_S5pqH*N75`&6ym!|?Nd6kp#Tui2``M^Hj4}eH zr!RWO_N%(*K+jpZr1hP*!8p!>kDLWiLWJ-^euLM@81*i}<8$zuQynRX5v@WO0v*#| zbX*PGhePr?3gsz80PJ0_TgP(*VKon11dGLy4=Zh(v~>I-9vu6|MHFltIk!{K7hKZM z{*C9Dgl=T(&H!Q!eWMzyBHI=v?x>UY8eWQ`JPYr{bEmCFs9`(K;Dh%DNl%3lVhs=- zy~$%Q4rVKv)0fZq3^_gVKc^1){@M;>^= zw*atrHN2Ogr?mq{ODocxP+V)qi0)5b?XpD@n)^5Zeq@2a(_^O>$(GkWd~#slC$zZt z(ggs$?LD(-^&=133(v69iOXx8(YqMKvXF9d9FJ7Y^-EYy+*%Q9JX3ozrz){)k;G25 z)0sr9fnYLHTwLGzm)rYyefKE}%cBM~0)YDl0^s126a>BqjEAGOX-)RE1gbp(rp)m* z?euvi*rJR&iyEXABYw)_@XSe)H9bajkpzzG6VCSiq{Ugi?L7&;m~UM)!A9?dN#q!l z4i4Mlxw{5D-*`KOSYy9^s0!Binqnou-%=dWfY))Tj0*+eV<6bDT{H%i22UJ(2stnh znKSn(jvIp27F;1{RAYpF_DT{&ahRi4IY@LyD+b;+&k2)W$&6D1*0D8-I8&@MBA)DN zqmGkp$%A9Q3a2!Ne23>*|DB1y5h!oKlKdv`sJQ+bk;NJ{A=V&X`Q7i_8|PgTVhse8 zAPVxkoxCO+d50(kgYXAn7z&48^dYYtG4KL6fph1DIB0eDTS&wnBxdILiUzfi^xF~T zjg1J21eQdi*Q01ia&BZVati{g7aTNb99Q9RL2JD6Bu0++?J80dPqWI@? zcpQ&M(r%n@i&&%I8Pp(HjdpK(h&9gKd2&4<1j;A(NW0x!5;j1j%uBx^_|C^@w*+s-<)>cz;KKlJ=q(d5Y@ZKCa2;n>Hf( z+0#zVd?!5#tEDkQ_;Pqa@TK(JTM*iKvygrcv>TZDfo6qdRLoxB7s{2-PYvo-hhIK(tg0_ zbq_674I)mPe=m9``901lmlg;0N=h=O%QmuMn>Zpd&4PFJglVhuzapa;rIF6eIHcaRUp z-hhr+IPe5-z|GzBL;|-~KD9nvdx9sbnB^f&(t94KVWnyiXH`cK)O#Jh&99UeLiQxJ z-x7%I7cLY3_7R;Byu`nmqrMvW65DZNt%mzk6k+@k9xE;>&Kl>}TH|pMYkX|WO2B*2 zL#$z?V|Qe+21!(~6?wzm(d>I1umco+0DA-*k2C;(e4HVH`#tupq*mdstH+268n5tJ z$wrqO84*)&@mb-VHNSPe?&~vw=(c;NO&pO3=!qrSO$bH7DB{nnFCpPGc!@JD2ur=3 zOK)5wV~@W^O^7uRYy8}yFrv6=@0wc@g)NCZ5F9aRjc=BXHbQ%G4t9XC;D8`X)%PH9 z0}Ae)CldH1{M*k-Pl6Nt5oLhgJ~>^x9O&(Z0M$n<+?|~)oTfhFxFq|8p9{OZb9!N9&{AS2=NqNyrham=bG9j5@Y1)>wkxgS~6sV=NDMe%?p7 zOYkb*-}6>zx2xor#|Vc(5Ii~X)8`z5c#kwBa9<*=H2(KJJ4qgJN+eCR*%ysM$tXAo z`D#yt_ja^@Cy5L}1b#q|cEYm~&t<@U?42xLlFg)0B-DiXQ`7nO(t0Xw z{V)q7go3?o{)~CskSjX<8Dh;?BRXnu-(wVV@)dX76CA)-+>ON;z`I!EKIxuB^>y|N zWGe3{?*(v)Q|C95*p07ntztOW9QJJwFsezQ=>hX(uv?RptrcH;s=%qNu}d^Z*~ciV z<|W8o$U^JaTYToNic;FgE1mz|a{`vpi}>_R&h!>+jD9QeA9cPf9>t#${EjD4;0&== z#PK|u*O}2teeF$DvBrpVZb_^WITqQo=GHorltey=`vBJRcoOlZW`E?w-G>VYJhn5P zd(@I(>w_&3(0U^qTa)#9AOV~?#zO*L<_~X2lrd*D$bFDXD)w~pz4?+Ox~KIfQhA$f zqsMuenNS^(n6oa};Ew9tBaea&iLP9p1V>u^WKW%256M?NLRa07fmj2v#&`d-2EGS- z#TrNMJXP?(9ZrIGMYF)GaPKJu0sV{!haE>0jDb|8n5T2u+E#nZOmoK0_&NhyKChy? zNL{lc1i;0}9e5;ypBB{4fAc*7%gD)o;@M(i{gxnAv|~h4z+(lZ#GC9T*3{}Jdy6p_ zM}8sk|L497VhzL^(K}D?S#xV+GZ1Sa3I^-$iFAy)1mHFJ;Qzv7;h^J)f*~kEXY=7~ zomzw6){2)sVt~RicJVHGc5Z5*cR2#2NVkij`|54ptVGpm<=HTeUgG(gq~Hhww>LR8 zQm~OZ=9@rESv~Ql7ooGpVx?#DCnWch)O#d4>wf0T-cww$hIG8W^?1;P>)sprs@OK0J!`WRNEGE`R2{!1iu?=O={#0k{Cc*7^5;~6_g%q(M zpe8@@M!^(+$k!m&(Dx>d=JhN0VDmk=aOXpPjMVavY$&qQV2R+L0SR*Mhq>7CK$dw3L)dm-xaul|VWVh!oBty^P}kz$QUB1yF8 z9-O%IAq#+kUo4Z(mF7GUd1i!@paUKp@=po2H;xDBe0Wpq>&>Z>*6DTNQak zqqa3h7~U6=#TwEhA?n7zYou6%&eQt@43#?{^5Z@6iR0w^QHbGaFu*nR4G#Idw%8yB zBu5lvN9&Xa{Qj+-PIw6Ilg$wVrcqVSIH&SN&{O&O|MoX}5&YfAbe2XDXc7V!-X?rR4R&#qJ?Q=Wqy-z5Bd&UXJPI}>5{jPUO-+@;9+RIr z`S1(rvinC^Ox#)#sc-caM#cS4=W%z-IoR@sSREmQSc9Z0_#;ZvQ?ztZzE0fzF(b-= zV`IZ1N2~#Cl8xEfTD1m1twh&Wff^OeVX9Wv6>+p}R(QbdE+POlpGs z0e?jA>XTXT+o-pv_wSSR(Yc?x_s8QtNp+~Jj{GZ)M=oxG#l&qdUU$#<3lCzA zTY?|oa}KQL7nVeBh=MWjs}0cR-Hg`U4-)5XkV>k0 z;YYOaUQef-lceAnK5!mR39*Kh9oX8*r6$Bnqix%kb8t0kPii7JL`(pFwEfL_P$%G$XRSb9VjT(e&7^1KLr9|K7= z316G)eeSy^(gwi>m2_5p8c$vHB$DNx{4Fh&kzU7b)I?H^J@qBJkrKf@cbv5md-6<- z1^SMyVvP%To{yN_6-v@6O3jMb?8g0P#3Il|BBP`SK-SsyIH#&r+;Sf9Z!mv+4sd3+ z;Yi?X9+EAGd)P9~)dgBf`J8Mdu7M9faTZ1qSiR4^L;`oD7|b(9`811@^?GA{UgDnS z`yQT!Un6kk{?iQ$Y)5p(6JiY@<=jgKQx#IS*)ho*18Oi9CHY9wS|-+*13Cve=@sJ*};+IQFcP)+#J}m%v0e4 zUV`B6xSaSEWZ1U>4qu;RzQHEe%JL@)CFQl7I(D5E!!r8zmvw_?|EV zHvBd9}OO{{wsbLC{)H>AD%@8}^6_?2gsZXe&%x35Vb_neb#GX0U@#ec+B zvBojb@8y&6FVBg*mNirb=S*{Vg@PS0+l3S;K-9xr*?M4<5b|b-w~&m>hJR;-CLQhriEDur-pDmk8jg0`&ulj!3h_JR|KxZ=BNnWDJ-SPksLm ztW^lU`NWEtWX~siBtWlG^SmUVZ_xJuArIYDb;)>nteNTur`1boxmqZL= z6=gCHtGyc@_J9Heu+b@vc#x@11Xf9Fk7sv_b6N)M3)MDrAlW6tb0Cw0z2ofN*aZK> z!I>FN%1f--!V}>Jp3cX}cBfkXc6>%#{-8I1LW(HP_*sys6VD$)nsGRE@JoJ88Xl7T z7!Sl6#1uX6z!tHFWg8NyJFDh=(?yv*1l!(_nc}BtoChCox_gv>hnT<&Say0n5;&+2hn~*YEz*3zo3p)>tW50TxGxUQ%;-@C5^IM4>Id0bpgz(@XpDs+NMtaA z`1IiKOZk7EM*P$iM=Tm?Z4vVKK@VZTN6A9T_@-xavWHm3l33%JsKo8D-Z$fM*(H(S z^di8Uuutu19o{hbQ#2V6_oR5lrzeMaImEgK3#NR#6fOX#wv4#$g>MUe?GS~Y5XYXB) z9NU$3y9`-C6Q&6?0rG$*zyx|A$O48epb0dAaV?-cpgiF9;OcU(>b<(Fi{yMD6N$ta z5%bqMdvy`7e0@kXrNuLG2gYOg@5a`PMG+K70JYF=^^^mS*%}4v(gfme#lJxy+YYV$ za|}Lit<>BkS^fH9XVz7dy|0l3y9z`?D^Z$)Ct|b`5f4GEF_J$R?QGQ&RYnpCwraBe9mDfHVMR~oli)>_qQf!dpp+KfGN;=*X&-g)#piqP^jwYzMP&oBY5f${3h7AkqgnC{RivUEMQog zWLbLiGqI$@IdhKz#%?4>G)kgXQ|MPCNWV${LS5_IB^rJ;{%gGCO|&4rcfrQA@b5UX zjKd`NdOu&a3g(fzk{-m~{}|yZ6pQ=^9ZUV59j}B5JJGvDke#2MTg4h0-O6r40q2!3 z{uu1+=(QtKG_i(d5ufK&+cO#E)I4_%+i_0tG!86hlpDD%lJ+nTMJQ0N;UYGL_azR} zo#ot=BqW|ajhk0{jt{19Ga|GuOab=c2t}XK(A-^;oiGdG&`j90!s-Hm_W7S)?BknoE8ChPF@=3K(d--%=|;A7x3Ez}0li)P zqHt9&{>X3gV%~FM8u8a{pZ$CWit@K6hjg|>j$ zGb6q3fG`<0Gg4a`f-}&<;_cQHaNO1wn3p=7O9SAECEb)FB%VDw|DzY;HP8&$)8Omr z)?hw0lC1<>G0{v;wj!EfZ~8h%6ES3XzouvZP%8$F)NRl@-!+OTAa&>)(k5D0tRbRP zkf|xw(0CHUn^+@4HwZ13iZvoUC(}wKFjq{}YnP3@VlGX?&>~N2DqmlB}qvb(? zK#T4K;Ess{cQtDRhow%)l4K^uvGx?DASF5@DVB49`O@^iwiYxayl>kgxpo(lE6~<& zY}tKiOJTTl@*5$hU(+*MH)bQ{P7Z=7K!dX&_U?@u{(UyyYq!e3{~^A_8nyqXt$$DS z_5T=bEIo=f?gqI(kGZJU#p=Wn(Diu~!3Q0wBXsKz2w+Lv!|+%nD{{bbn>LKc(!gm+ z5sjNS?a@fkk08Vu=}o{0HeK_EMRK?YJ-;Pe1C3-8_9!M<5N!PPzB+;pXl0AY69M-jew>|T)#VrXx<`7Gqm z;BO|WFQ_Vxe{T|m6bLq8Hf4Z?N;??n+2BO&46s&RxwJ*^#8`KSMuI;28?KY!fHGfo ziUqw3d0P}qc2Zw3MYpH8oFrbcaLbui7ABPuY>b125cS4c68Uk)=V11!`d(+o;j-25s*$8K%VytIh5Bmm%6Lfph^^dKb-V zD}2hoOj1{1_oy7ZU&WVLqo#o5CKO}eF{)VOS2GzVU6!a-33g*9R!8WZQe+(Gvv*;YX5fAwd>yrD;XVcV z9ni0h^H7*d71sMC6yLyZuk_x{XfG7FJ;m!Ib#%2FQ|6^k%yAQaaYD^!7ix<&&JtIw zaS@8KpX}t4m^+H?%i{N9MXxqxt*>|!#EP(N?{3W#diQ%qs6l(|WCR@&eY0>23wqu= zQCp&KX``AJ{#$cz0P%E^AJ|9jlTp#$4IL$kvSn;0>09xB39|Qi3MDq$Ny*aT?@9}O zHWHBR6%yLIw`WtJbySSj(MY2Io??#CFJoAUHEN&L+4270D%PkmCv=gX$5OFI4)VLR z_&twHV}H+j-?y@r&vnn`kG{{YtzFFU%g6r6CkBD%Pym*5Fj~JU==g03RF^o*6K6$t zOoAO)!$?Zy{lMp+rjoj6(NC)3p6gUXI}? z?ZhP$M?eT)Ym5KtIiKWtzf%VXSMVGPfS)AU2yKie!!gO672S~p;S;tzZXrRlg?V-a^#$C8FKRvWVA55?Zz@LeXW{*4LOT z)+iO{?Cdz7P~(}F8vY-}*m-mRknzMX-o+YcqjSW=zE2Iun2R6Sa_>2%y&$Nd4i3X_ z6rMN$4YHt$YnA9(nnXOwn90fBgY4RSDLT_Y&S&olSgm61Rv}Bz9a>I7&Z-l~{}5=u zW!x%3Q!4$^*n+=SvD8TMr$w%7w6^1S=|kK-adxVUz;{xwKzy#e?;qkz ztWjf5h!Z}Ojpx-1JMsUlX>#E2SzLyh8qEba>N(eXifs^8AiReUq~Hq`rxtomR77rz zzNJ`El>V*EvhLa;9sPz?bXy*!P^XzpDUSA><=66NYfX{MO}G&=3Q?bo+LCNd3;pcE zG8%#+Hg=@Pf{mu|YYMc6w7Wr!mK5zJ-Wa)XRl}#Bn-{4iLa*rq*N(Mn6!mk3zkys; z-Eod4*0_oPc-@1)r=44AF&B~6GQ4J~5Yc(j(fTon-ixuMqwXrH}MGef3hI@MM+t+87b!fYk zNT6cZouH*8FOK%xC;>@LUw{^-`wSDVo1@2yQK$GF#Z6$)p(ub%7`e)9w@7@dd z(VGX1)_E8PHt=f=EkLVafVEpcxL?`{qX-54s19i4M11Q66?R=Ok?O6x#w7mVyY;vh zYWf1aF*z1R;ufDz760Z>=Vf6j;oDS9ZZR$~pNO3BN2}69a(z?*Yz?u-rNLULnS-gB z*Y+URK+Ih~Cc8?kVwOcrVHN9o>Gru+^tU(u8#7yak#Mavw zW#PZa?S($6Ssq%w&rbH)C{Ll(^aTn>J#m*H*mx({DC{5hi^LWHuHixqY8H3W z8S7uXcVs&ZdPd&FR_IbgxKqTbYc2CD7U;tSX;31?wl$tC;UMfQ?Q{~s5!8HNQ^dEcU!+vqEe5nX)PJt8y=MxJ2IJ%MAneH5pN3ZP%OT&4b zD)|DV-p&P^xU1zJsV&&p34#swi{BR5EzlNQvVO=f{X`bum$c}3Vk1z<;zJbi%Rjh_ zFR{j&oAx)M+pE^PkCx}F@%)k3%Qh`@S!4I$^fG#V+G3RRF-yA}D?ia|N0wXTd92kAJaNS1 zPYQyKxrO3az8tNA$y3z&dODLepQVTsP9ttIsASQ=Q3yjcMVWP;6Pw=wb~k;cCl{=Slhz{AvEJ zh`E4xkB_cgP{sKsxew9FhHEx*OV3(Kvzlic1}}bKI!ZC8MUcxgXYUZK7ogV;&@2vU3P#BypphcyDoBgZ;? z5&f*x5}I6z_3#G=&lyb0;}FeGoum&D-1IGG^_CCtDD)leDU_wcfSLlA-G+Qv&3UR> zxXzXSrnwg%??SOfbInH;Ygl)BZYioe8UJlZ zvf+BY2OrBCH^P?O3i*`OJh8l8Q^bFQ)f3i1E?u+cqj6(oZKAQqj%psB5!pI!XO49E zA{p(QUgOHN&@Z5yBL2-tf(`AsG+IHimd~SU!@n0LybnR z618Bz4_l(O-wzIdE5z_`dJ)xKL^m-QjauWP88e=p`?}eoUpQK4rL7%Kw)mlwtQYLm zDm2tAT-Q45=Zf*UHLpA0=fE+RroFc+Hd@V zJ^e1hfD!ahjRfIH&)$sSyy9c6FU0of>v?zzC2jl-*c$jwG1xn;MX8#_(Vu*Cz#kkz zu%RvX%E8u6jmrX>e#lP+DsMvb$)RsJQpbX=zWdfEN!I$nHRJDEPhy=b?%Pj=TW-d# z1F=TGG5gjS_-OPut@ZV4cT1)7&b;%0b96i+zW_m34RDz_Z1n;3;wb09V_EBl`O-q= zP3jgr!Imrg3ddIZ7q!)HXSz1P@38~Rq4RU7aEwEvxT~dLV-nqD>Q85CVp-u2N_=sh z_Kn*q*t)6Ve`&=LuL_giia6f#gd=sx+$zx8D%MyVJJc+s*UHD8EAHD*Vhswh>vI`% z*IVQZIZ4L6Xk*b)WUc);RUQ{&mia!?P3TlKA`cl$s6kf^Ffl*`bU<>DH-oi;?WKE~ zA{u*e6bC;_a34{8Q`=UoQC(+2pkuwSE*#D?x9}3nDl|8PJ=4P) z(iC1s6tiy~FU?%itNhz;pf$%+D6g5*#X(!FvF676t@0Rn$_an!{=gF`HtRhz4&k0d zv9L93b0{@)Y&YTd{F<}&A>&-agMYZnIARUDYQT`20l@~WB^j^P=+8FPx?x@_1^F1n zKG+(tJ_Z`AGJrGNm#seZX~lm(v8+O4 zVRyW*A?;3T(b~)J9IuJg$sAbcLueuY@7moO10Ndv4K;n=T7~PHf7AKH`HA1JKi4_< zzVERcW{pczJMrn`?WCT7=EPQ?J?1yg+2JV?Kev4sx@y1-Zb3IdVQOI|)*_}UxYO05 zUGZU%gk)q8?ae1@r!22;de=zqS&0~W40t>wP#B~ndh zX~(XE_>75a#A}=pbl{PuL=ptS24EaWK>S6PHo}%7 z&TMrGJ|%XWCTT3&G?ER7)Iu{#A)#jb@{zi0c$n)Xh{Qk-3&BR}aQ`gv)lTd^{6QH< zu%X>9{2p-4Y&mDO&Xd%U|B!`CSiR+-j*a%t-q9G;?)EXs&!PhD+p*C($b7Lz^n$l` z_pBZSc3Ohewc^VfIUH`ZFY|G4j4>FU3lV+UG}CuWEUUgqf?xyS_n^#jjXnl&zFOV7 zzH%mXO^rZlBnLkF`+lP*VAd$2d+e@JoXp+TXpUe^5NvEOo@YUjI})RJJIu;Kd&_I~%t-ifOxXXAGfAAaF&kTb40*~3ficXk#x)h_Vge)#XxNzcZfjUd+0ehQ?A zyp5(Hb)BAK!3)WjL5yTpE zpM;5?x6u-dt)>^~uF+>#w57##&A09$CKiH?-fhwxem~<7Y{X@6 zuwO3D$3WYjN3&sB))!k^oQd9U?0d-%7S1=*cz4OZIaVHn8fV;IanEvN-fn%}28gR_ zba9CCw5i4|`n#+XS8XW}Uj#wdQfiBlPYh|ebF$ZS@Sce8fU*Z-|p1$xsy1qVIc@M>J(nCf>0lS zFn(cJTd)!_9$i}i(h^SGI`eZqyc@o@;MNmcg$lLz?%V=$O_4~g!gW^qn`pOho2wY5 zW1)vL){8%(F&1g%zF%`5Yu=)d%vo^_P7E(+Wus5?*|g^wRpYtBJIkscE)vsOpg;>2 z4jS!eUsJn<)t2ODVu^Rh*4tep&3Tcyf{k94^0jV@jL=;}>%I6jEG?vGj%qMiXT8Nh zNoMG$O^K$5Wq8`?fz#2blg&e&_C`SUjZlM~-CdK|Y^s8GAGJ@=fc-NCX(F(xbR z*&<*W6OSU+uzrHu@>?og(6Bda_w8lnIgFso-yYB`nuAaK;U#aaWy7|1)fn-)L6U}! zzcW({3&;)DX!L-jrX#jg1(*c!R__$C6ZrH_RN-aM&SWh$_|#zUSbtsu>ZP}s@iW0| z>@|vDBME|y5lAw&h+g}4S;VBa7lFXkp`Ys^IX*&L^DXxsNYF4Ct*RbW-~LwYqAsH##Ni+i8WV z1;_i~%$TYcAAUFN1l)a6q~BtdHBp6^y|!zcq+QXqx9%FA_Ue)Z0?+P&=QF!?5MCp> zQf8iabWKbLpu-Kf*lbhIXQKG`|l=0ra#mz~M#>Y(ZPF(K-e?8vcg6AlQgb z8aOV?qMyi)#+vhIYBYD=@>P3j?;A#MW4^^t*YKO?2)%0yBWj%Kh&6n3W*+}KTchS{ zwsb11IVNlKzDv&J3poJwGl3^k;5#0>Nnb^`L!L!9CZ0uc&Q9Vw3?%JfF4nixM^LlX zZl}7&!Qu=U*Qw8gjTO(K#0yAA=&n&ZoU;eP4Rqjlwic@vu@mf_iT%Qp4D6BD1iW^F zJEFjO>6mF04Cne|(_rhZRi_g#WZ715+Bf){YVVI4g=@Op`DG`FHGUcs?WfH=T*6pN z%}bNl4RiAl3jWc33!Z`Ko1?R{PBYJ<^#qE?d=WTEfFRfa&$PHnQU(~;+O3-?kd4Qc z_2Tvnvua;B^7*&MhbbM+uP5Q+67e$08fb0bdWeB)oJDh!ugAgsYw{I3pI5X+m=SH- z(!$uJ@Hfo4xNskEz4g*{&0D;tDHeVgv(zrA*CqP%uApFlzUN&>{y#~}<}9f;^_Q^TObc&rU>AA^lk zR6Bkg`1~88yGC*}XGKtbh>wn>`SnVmlU8^v;Wj(!Hvv=VVaMblr z$CUoK1z#^&+T?QasT@-zuG0YUiAmb1@}g6_W!06XIwV)tOOySE=(7EMtVs^^F!!m=|%)~>F!!eI$XMA zLAo3M`+J@@aG%dPbDx-*?_AR;ajvNGfmbX*a4V`6!`5}O_~?73D|st^w=JC`3^jh4j=<(or51PdhywA^GsSl@O@j~jdo~*Z7Lf^FQ|ttx z@8~40%{C}Ef1=_j7#sdl=nGgmM=T+TbWTR??kwlwTwB@*{ygN*=8lBVpZkOtey zLvimx0nQCE_fVh6b)Ehfy)Ff(M=5FKgC_sx&g6in5%{otL4L5YW9u5Rl?UYa@Wbi# zXEdBBedg<(3_k&gjIIucNniYM7&y&NQ0aeNT*4h*G-J^jChAB^3_2H)WDHE*ZaWI+ zMX&HVA&knE>6IT7MzMb7{L%ufn`#<2>Tr7Lk_a(VeD0n%%QRf8XakZK zr-4^F_Zd5JsM6xVI%8e_FJ;5?NVO62U5OP+A1|fb(!vh?49t zZFH9bX~-AfK<;wIFVu!^Q*Y1b`^UG;38fqC`=qDM9JnObJb`uzmfUbEva5U^e4X1+ zMB4+}K*n#LGguza3@(sjml=0(PUNc;9rM2qUha<5{kek%F9f;$+ zF7m*#SUKw1Q}#`;6TejcY$LuM1!SL9sh1j{)!;{(!(I0&zPRn({tjY@anfgUGVE z3Yb*l^Z8a_WxwS}a)!kx|6(gbr#U+*!AQOirkJ3AVi@r>bVJ^!B2Ooct3p-zW4~2; zw|)b~80Bi@9bf&=L>yUI;E%m=$V}gSYS#c3scWc;jaFuTNs585m*h?51*7hEW8+q) zDq>Wpn-LqM5x!%G$)#>#PIZ3!LK<&ZEl#@>ng1zsKM_aQ!iaF~`G~JpfbW}x@**)) zKRluwJxYpuf+_S5Z`Hk3XZ~Ej<<~N6raclP7pE-reAL?eYwf|(eQ$y>+#8=hBStwg zZ~neT4H9}M&MD(MP?m6U3NpsepIx;4ENQUjfk?VlqzheNiVS3~9dxmlMweM(Guk6N zS0QqA;-*gW9{F^9e@4zXNw#YmJA>jo`PC=nW({vJQ_ z59hHVIzDDQ0>2$Ot$?vWx(P0hQM}VU*G@)ool~F(@P%~f>vVTxYXbLVu}u^3j=U-6 z%cS@f>~Zp1BEA;%PjgHKtyC+&npP$+=xobSQdHZ15i3Eh4^%1kRo1)x7I+UQk{X@6 zYKEiRaqCT8qdgbbCU>qRRXF5kxDl;UCH-L!2QiyEO;a}iyy*6`;J-;P<#*gvSC%ZC zCuJxlX=&aGKaqcdGTF(2iyQX>UgFPv^B3c*h9jy1#0ltEu8%#K2)ATaM5Di{0&}Gwz!bJ*sWn&|cXZ1SWnV;{+z;BIC;V zYOZA~4pDN2#q*VWNwB7W=C{|i(g-mr@%-PX2*l0IMJ$bl!tZF7&nSbvNRg>@DU|qr z9nYJES0!sB?&a8RyOh!G9Xr)^J!ghjw&sJ?|EO@fRg+ZGL(kf);2jw%?{y1n%yN16 z0?!mkBPrJh6v5iDHdMn2xG8rV$24cd*^L#^P@Md}I+~0+V5bIBl3sEpl+k;}X!gLy z87-bR+_t*O)q>*yStlU^LJTHz(Ax<(affv6aQl<+9od-j@9M9SOgI)|IC^3h5I&|~ z>F!*PQM!L@K)f}chPMdmzVsu4P#QZ*_caTzH?i`F*0HRnpo9%_N+=s3-hG=rFdJ6k z4hn^!RsQWQwO-viqaGNUdqZiLaZ|Hfo$#j>t`4rmGc%lqTcgUH z)Z7}*K}Q1O&;?K7it z2Qu)i^=|bv-6s3^6zO|JiG+ViBkgRwK@G?ttx=Y|Wm-5#zib**<5hkvi2~Sph-;@$ zg;NApk5?9!XMoGB5WzLy1 zJt@8&tal~+Xc%RL8}_=N3Cv8QarY0g>o=vlY9-x^clQr8567*tcF*v&lky{`#w8_> z)OhEsIcD!cAZ3R(XzKtBhU{pky&PW)7L|52wJZNF?<~2q=)O_k@{KA&=q^XrP4!j- z-iQWUC5MAXdX!b17oYw;f$y3ef1C-^c+nxH7nJAKBhSo1@r^gPct|%Q6hg?UCXD&Rm(IGN@ z^^>u}TT79@A<~x&_A~wcK9>HQ&HW8gl>Wqam$GSSdCU>Y-@ROZmjgWcD$&=Vq%kfN zFab{|1i^&yj#bs)&V_)6Kw4gV3%(XKbE>6opC!?of(g6d^07Vy)i*D5JWvf82nwm# zR3nU!Kb-d>yp`&?^?W}{?D&Mz^O#Lr?e3fa3e`Tb5C+cgud~UZE`bS7lf3tklF$;c zexWg~SYCWHwV|^vwO=kv7rZ=EIw-3D(4a4jT-`8%6kCXFnEO2^e3>n+rD*fg_upDc zP=v@o+i>OwwTntW0c}|Q-?B=-(G|IdJdn2i(|>DZ*JSoca5pqVvBRJX%~9H&u!GkuQpqeWUE&{%VYN z@J0!zuFPpR2o(xxkL1N09MiAO^|YC8i${GIg2F3fZk z7E2ZpKS7iq5te>iZj0|zJE+FTmX02h+>I^wuUzq;7n{CtBVCuj4EskMO(4 zg|c_At7c_>=aJq7Z`1hff5yHMc`#{s4wZsw&L1JyDt~WjZ_XQUHyzPzx!Md96AQvA z9-OJim_{{BM{7p7LjtLWk^Rj-h>DImWRF?;E}5i~adzgmH&4aX=D5#yySJOcL!7?h zijX)a7tB*9HTkV`ySu%~GGfB9sJ2S-j+u1wgJP0)W7>vLo35`v(h@LV>HIu-CdN>~ zM6~nAEFg+qhU=Ixo#O3Z+&-o~rzFf)f|`0>N_mjQ%djSUbcBUgIL=0$2AdpuvyatP zB(2EvD|7l8g01MK44U|Y-MX9$$mW+_$Z-!pisj(uAs2@QEZirgzKJf_8Y6VB`(FH= zIqT=Z9L4h49_Di%dV99QNrd^YKDC2pey)WmwaV38@FL&XgO@`)rn!pTdNH+-@Jn5G zAn#lXZ|=Qi^0OUw51Sp7t(B}gMqmQvYGTg*7)1R2b2Fx*yOgjx1l@Lu|J~a?O&sm9 z)-O%hsB!blXm`edGhCcaLD_NY=uDfR-Wnugn;GA>!i-__bJ>$^w!BKQt87O4s(<1` zM)ShMKAAQ)_>OC8SonQq0pi5NUK0_Nb{_0TwVS?PLkpO1|slkgITa+><3?%lJOK-63O#F95nkRMZ z=yeEEsGcmIx*!J_LvomLEHOWgauqZua5?e3zvcLvX<6h#1tjf=L75P`~lUmIt`JCBay6Y#Lh z`B|s!f$eYZVE#!B0jlfm;gUy_c%LSf!mm;V}K*l_WM&MGkg8LQ)Aa^ z9uAguf?$zq$|4}^I+Uf*j$r)t?ob_8NOO+@cyhok4>ETehw3j7Ns|J+65)ehqAC9C zUFf#V6e9=dxEj5Qf zOr7hRVkfP2Qp9oqMa7`Dw_y5f$hK}UnqTU%Mwlm(aXvrOj?A8S%Q@VPJWX_w;UTVE z1lIgML3_Hs7sUSO#S3~NFr@R|?V5D&)hCk>uNZ!2_+UNf%I3x2$sk9%u zbZ;-eAI)ju!qS@l0j8EL0{Osa15m~WwA^U)HN3|38gtB2CF|x%Ojgr+ktLt zt#Sg)m*)Z_k-ZZ<->NWm9i91%nUCArCL_V|>a=d1^#u_uXvV<}RFvsIr~TWp1qVsB zC-Myc)X>KX<47u_voEJA8hrP#;Xx?!Y(VY;Xg85ANI_i5vi_c*b$kh0%N(&=|5bxqme%$IgDa!!cJ^>T`oPS%^IxT+^s6>7WWP>JR;* znQ#}3l*gn_@#zFM?YgwJ(8!cTmeHHEO<(Ec-(8c_9(&agUea4l+YNL7QBM zx9|2@^~%S`QsX3?Qmk(=)$kAfB{EehS!(C@o8)N zTztm=7vgd!HfR*x{K*0&M9Of>KP2o2KM;okK4-0qc`CMSww`84#=zSvF5iJJR*fiY zLQCoW9}1FLd2F>4YoKgD+D?%vUBL=F-^t{_Aa>LZwd`7b=ebhIq!1P+Dk8Qzgv%DZu;PJrZyDThK`<$6a9IH<*86$!wJdnH>Vu59*nLoAp~AuQ`vJCq z9W}6(k=N@gOl4;mE;n0VjH^z-m-NGw;!``)LO>Ui&1F7^Xh}9YG`KO+RYY;H>e^jt zMu6(0dV49tTjLt1X`;iK<|PrX4sW4c@xGrI-))fs1ds1B@HWUCBaUKoeN40kWIubrqu*WRXX5f zDgH(5-4Rj-ilVH-=&LjmEoS7IL?NbBsZ7YbFoM6_#^s066dL04P7_N896ae=W;jh^yd+#PL5nzXZREhZ5o$o< z!IlloCF%vvS1}d6qWaVH*J?_mEB#wbbmA-P{M$)v5@HI5B~%7Pxm0lhie6B?9( zfgS%>M@_>^GexL}0GK$Qi`$HHB|g|DeUxjFT8?)Jb+6`lITqv3Eu*VN&D6Jaz>YPv z4#IV~;z0zY-}yy1+m>fj+e>H8`SC6!e>(bpnj^{oX=p?Mk1kPx^uq`#^B@Uj&v9>8 z8bL*4^EQJUYbp{z3X+%i@l21l|NZa{g}-I8Qq;xoIcqmf=u2bw6H@Jce|jl7Pfk zKMW56`3cwVx#^q%VTulKj{tyJ%(39h*KvlVB+bUobc%(1R-OHINJ`>9zp+5!pfzFo zcVKywp|!(i{z+twG8jRobhY!>ZFP-e^lezxQ5c`F5AU*LyVvc%5Zr@7>cst1?OyT* ze_UHdmHEEd6yF$@ruf`Ould;h8i8a0KE^SGzDK)*(=edri?{A4Ds?_MkNe6r3w2Ek)nBue zBXyxOp}@c4@vZ+@5q3~Tz@PGo7J;5{DI5gB@5f^v^5((FG%)7Fd3(~>2Hewv`K|BY zg3mV(A_aIHF$H6V)`&V2MDv?1D>bS8Tumbe;*Bpy?xzY$uUJCEanq42W#WCer?$kt z5-6eQSE694Q+Dx7~hh@ z)r9qGXSTOZSfo|6Whf%?OrytAbgenl97xso<-GWsk!M#_4Q=1gBy;g@-k%yNIK7Mc zzJcax6(57)Welz+h;aN3K>x@V7;`-n!>!Hr_f3P>1jY*n;zU$0<@a9k(?ie7o3-QDX{j>hk3Wm7?v#|$;&4g$XoWXz7DehQ<_a0|@&5=<2 zKiBt}i0cT5{wQk1<+MwdMeK@D-4IgKnOF84BWOpI6>LDE^3snK_1BSWKm@M| zFTk(2*)CqRr}Y3!W?J4|7}#U;Q4t~*TIT5Ll}401syXojOFy9m6h$>zZV%!ss2rgX zI4AgS@ejAS9?#uSm;apg>k4|L35e+I@G@iIqkg282N$=W-UkPhhLeY2vqof%US48z zY~+2aCHv0Ol*XBMN5b+RO=p9v7SHj6v^BD1Y?xEcXMWXif?yA=HI%~A?P3$sOP%By zH`)UYRDiJ|GaiCJ1D1#b(}Mx+Q^j-7VR>MJX2WHeqoS-xv77iCFW_|Vzs0=*8O+bt zZeRH&#tpq@D31e~lFo*-0^@59IrCX3d{xl=wY+t+8hnUFk2WRL@b5ZGMQfU~9V(Q6 z`(P5R0%T9!VGuqAHhYUaHSBYX728BC1rzHVb64OiPeBd768PY2(YcQ%9E&UqE{^zH zR#zY+{s0+rWSIXITw|^Ea}-;#cM!tnvCM~wXFXL?^JS+)_8I5Lcag(g$eEzeLQV6R zR;&^#Kx~ZC3TUbG#uOr1fYJD zO5*jSaMP5z)KBI0^XGuDHDv{`s(9nSA-czhLB9lgM0^qYjK~$2k4SAf^3b0;=la{( z&m^%?%LfPUj41Us@QsC5mdjp(9Ox}RA9}JwK3)&C{4m^Rmm%}OceqEcjb5*JiA*+` ztbHDaBi;_xI^z78-QYlO9Y}2*kHTwF9E8r*51TAgN!( zgtHVT%mA^#-=dSDEtuVRV1g)9jo5_fyQ7GF__Zjv!d#8^OY$s>o=NT+uaY`2@BRgrw!9C( zKMq7XOZrrcvF>D!P2j%LyfVSX^{pA~x5Q|0=X04DA|fDFHJrEnD^b73++^nmE#YJ) zg=U2pr6rB_#Dt)eF18jpzl$Rb?*?s_s(|#k9gh$q;o+0FM^T^Oh%3IwTUZoD5c5O_ z=++WCF-KEUr=#?~SM2`PxM8KvmOA#{uRYpjaQpsAgmIfYGel1he*&a$xSPX>N{* z?6)&HGI$N%_4IQ96ELN)tesjt>3Y}!%XHMX2@a=9ZB4@_iW0kMcmLAhd;F$@)V^V;s!~S&}AAk`(~*n$*?B25J0f! zLQD&gY>&A~@FpmUrX=YxhY|1PY4V6H2?kx+o>?J{GNOa;p7M{W>E${-Iq8W^T;d){ z408Z7=AXQT+YS@&h$89{r94E;wN(alNrR{I7#k#SEhp6o|AkkO02r+~;JekuZCD9^ z&e-Z3y{puTV}U|%;cND4-^!4Fp}*#Ip{ZQ}bj;+_g2rHWxlWNtt|yIse$t-L(Lhsh zln#<{q1>GPn-qAo0k?bsHTl{G?vpK{(V1dsS)^g#a>OsbOfJV2qXJZ#-~fJX5z(EA z91-iU^`A6#FNZJgQdt-axq+a3Fp(=mn+qNghYE^5?Td-x-`AG4{;z#BOTNEswN07e z^Y?1kNrH`dMs(pm&FG=#8hRd;?Q21Q9VZI*RGUbjrw=`gFA{CRW zYujk5yjr4F8}5d4kV$<5y_=oi({P&n6C4c1JM_< zR9rRyp+16z5wb<7YijX_`Bk1F?`;xCEpA=qa>n&_;GOmWTKLT&Xx5)MY!W9xwWveFSmhJK`_>(g z1w(!KNImp7@ruHUO)sqt7h*24`zGAnjI*E{*R+LLp{5m6n~-Mf%YtmxIf+plRXg=bV`pw|U4E+xX<7!8w==G5F}~k1Dy$MUBu7 zLB%i+5=8P%69@3cclNpT#@>^;tiQ&6u& zr#8Oz6h~bB_jUi3;jW4(^77czytS@A@uA>{i`4lswpwL2IW83Mih%)NDUkWfyCX9< zh_;%`T@0{B#XWBs?Cv6dm7RhR>V5Oir)?;o zd^)(>nBDLw>eufgt5?%nKK?kkgj&f=GGcCmPmg$a#!cWI&c?c>FM#`2nXIr3B|NUI z79QM>4zYGDPNG($!gpNoB#b17T%W5Fnt-PxQe>C)?R`e1y!cQJCR!OL>RKlsHrvHD z$&21b6%g@K^SuHWr;#^^42q?kej}ry*i-FS5%e2abs(7QB|iHV#Dx+77st+o#q5k9 zht%U`?^r`T1Q$$EM-MHOz1N{i?4^4akg?Bs)vfpq0opeNQF>b&i1z}&T$N}c>WAVZoEuM49 z*JNtiyr$mcH+}Dk<9%fds3mZ`TIsa?fbZBqaXCzb{+Z0J7%xfQ0LN+I;XxG$+C~%G zJL`2Ji?)~I$m%VkCn#*+^q0r^v>X-FgR~b)be6;UNYt&NO7DOE(btn`Luf!$8B!jz z-$mJX+ua&Bems-G)jB3WcEu}kpJ(7daZJjum2upvi7f04MFrvnaJ4_&m|t#~?nl&5 zePnu@UQ)Oi(cL6qy1fxVV>;Y@Rme5_;+AGz4?np?`1yM37q@!?GB*JUcw+iMlol1K;2_lRBP#HGo^Mp?ENuVs{%p z7Cc|n_W3FIbovbDnt$YeY-fq@bTy>CDoofvqg|(Ava1r7e{FmyA+Ykgsd$DkQ8a$< z*nmux1KY%1enz9@MiJ;=g1C4HBizNw`AOqQ@^MtTw}~%;8p$^A(qKAgD6q$+W>Br# zpwDTV5K0A_o$I&yoN^s}Iu&shM(>2;--F%uaYFA@y4UM2rL;?~zPvn}D|{bp4pWUr zhOtOzV0J;=a+B^Oileh@432Mq?~#+q)tm=O!o|NLJ`=2f%laf6ysI8Lc-_2G+8r70 z-rC0Q(_^M~RL1WHGDkP};etkZPJm!}`Us!$V0*DX3x;kc1iZ&jZHNEQm6a&oUie4J zFu$-KELiLbC6cr6s1L#>o$B|9TOo|L$BzPHeEcyXy6wMpKdFvK_(E&|g&a6QrO=AQ z0?~i2Nl1B|p6PpcOs^MJSxq0=b^Bx1msXK7A`F>s#AwRadi@i8lBPbE^428=olA-s z$K2KMG5Zv^!^QNHjl$Q8K)eVAe5Wxws#BEL-}EVu4jSwmSEF(D7?z}EavkXSBZEZk zO)}QT(v4pG8?HwVnob~}iTCBA!u*;)=%MyQ%#u;zAi7)X;@`>^Ha|nuTG%9J-kGXY zkw-_JP)=cGOy1TM91)sTuv#UomI!^X(wz57!3(e0VEat!DQa+hZ-$NokPg&X(?v-Z z4sWa+H3E`N@4a-zm7UQQY@gxhm#9@XMz6cTwMU}-t~+?sW*wf9Rg^)goXO{E55L6n zsj7y?E+Ta0oH08s%ewZ)r$XeIk=Bk$2ZGIV&52*35^Ax{+wwl3mj$fmdxX9Bl#s+Y ztC;8`Mc!7pGpUR1WYm(MPPMsu8gl=0!|i8EM8(Hp`f`U5S|+GHns%|9*q6Eg2HY=nAh_n z!1YwH+<#9ucaTIhenK(%e1!XxP^-1`zxg4$vzg{{uRpkj9s%qzgZkfifS#7U% zWOMtvd$@EY8&XQD!TpBzQbJ<<4Kjpc!Ovb2G}9HdLRb`dH`R}=3gGGP(|Jb%nkPaf zux{47zxT(w*xPU|&@=;2$bc2tugB=^9lFb)<-Y~?tFaL`ULxdv)3hmDhm!?gV#Sv$ z5!N47|ENopZ>Kk5(1LA3_#@Tp6J1;?Zdwf$}|pp&^hsW| z4K@X`D|+T@!I4T;*C}NTmrjxx1|GHjiL?0k zRx$*y|eDT^x{61$qwMpx`>)in#%teT8 zj%C4{NCon}1>4s>0XtdVaKu~4o-QH5R#3-%5WnWwvZjDaedp;+D6LJkh z1;RFgj*{5PT$AHD;>$TxveG4$_jP|F+2OreGS!Q+e@N;*>2 z4J!EC^rXBBO5Iet@z9c5#98$yT_WjYkZ~fCA|*QArId8<|Bq4Hs#; zLYnGM?VcQn1R<1T$;m+%ZzeUU|E`Ns?=mIbju!V{dy$EYIV|556v`5uvp^R-tlUnB z*u8wv(ro@{jX}QR#3(&VM#?%*qGB4?*aneCZ{zW7ab~yV5@56ZIL2d_z9BoSZ$fy8 zR}vHGr38JKpJ&7NO@Zpuqu z`{LW`P8osp{L01c==F2_BPrxEFB@O>e@P<)md?|pt;dU@4`dl>ktL&?P0Zy&YunQ9 zs9ez|VnOFFAhu{U%OO_E?n`}3hw{{^0(a_^ zuNWGh(#F09+59#v^^wyc4M8kjx)%{YM2bU7`)nDi)XsO8o3J330Z>3M8NS%Q{893Zhj4t$we}{kEfJ7oTU~1b>5RnkxR4h9w8h z7LF&}Y$iOEc{L>YpWazIFg4vpQP7pQhBTz_Y8Oo%V7KjX1+k-Gcnm^HqRg$bLUy!L z5R=s8<*rCfkg4<{x>2T~hmD}*okHyr<_WgYHaprEwyQsyEmJ_vhKXvtCt0Dolp$(| z7ko#^)v^DBDBT0-^kC|31}H@Jl_spd|I*dCmY1&24=Z9yA%V>}C~0)WGRWQjbv!Zx zg9cu=-T&pt{}}SRQWRRUSja{4#v}USMvpZb{lA5L0dQ@$F1!qN?CJ%h!AD9e(M#MI zQK8BpHGu0AFUH0V&0hZ9t8S{H64N$`u z{?J9m*1~o4J?L6*0;r)WZe72Yu9vo3AU|2HYG0nlu?_V0R`!uX{cbu2V(>8aZK5PG z_U|C(yu?z&wjWf~!C@gT{b^W;W9os0Rhh}^KZCPvp3|{ngSPJ0lId?4B}}{3c{F95 z13?B1_)~~-U>%K^;KWf7LvY+*J+(0eCr#9;{Ng0D>P7tk#{Ct@$`1cP&dnGBD}t<9 zt{fOc>U|_nY9%lVU3>az?m3NocyRrb>%)%Gu+a=iM8Jmi>g+3W=KD<&GMHn`#OKSA zh-6RF!hEZ}x@sHkvv0-fH(T@M)4y;V@>#;0<|P+k8+nTFk67Rs7haOUVqbHS;Dwr- zF~4ARfY%W`1{!O>e4hVr2$P_o= ze%vl6pjfa^)Go%+cVt1@I?q^$Bha>o9;5lBm?x(s3=MZuowdJHtB#;)sk%?+NojOv zOO8Fu*;Y$8=7jP%o5^2!8n4K@8Q)dGb%nFqY-{1ZR{oeeJf;Kvd{R8a+m^g`Y8FYo zU=1>{%!dKQPF~Hnloo+%qC?|_O3-=guU3ur4bRsH45D4cL|29`^yoKX8tHx8H{YEhkQ++*ec8x zeaFI9t7n7=X2DpcSOckJsdyi^;)L`qE~0rt)X;?i|MCLhBroRm#4m@QD<-?Yy4Y$C zbXuu3Yf+ViBv`ZAob0rmM#AZl5xGvbM}s^X*5gnE;t&88sTW;Z5nY!bTx9U}dmNu2Yx!Pjb-QTIdue9a2_{486owXc? zX~h`IyPhsUVyyE9rqL6;Vgh>JT<(_PuS{4-aN!pdfPA8k+G^u5olS^^Y6G40^+JnnezDL1WxipCTx_X(KPD{aR*G8?8S+nc(Vu z_h3?GvA)a6D)#}i{=9@4xyJ3u&$~Q-bH|%J6lXv*P6wGF|L+q^^bm>)`~j(xtB;|F z44E>Sumy^a2hKsQ3!^5!Iu2>-f#rN;EgtW(wONPeU+*aom`%|$YIs~ z+>tCcauaC}{PSs?uG#CUhFLDO66tI=j5c8oId0cCLqZT2$IPF?i zAjtbNoG+rhurXV2Vf@c)(73T7F#f-v%N?tUt^SG=Iu*EUweD-i6I1|;uLMkL>3^c^ znYz=!K2-tVNKbHt;wl}bO^|JxR*gqNwAt71dr}a_5PMM-cj;G-TnBz`*S=m;W1<|~ z+f1KgkD1<`<5Z0erAX)A^43fK;%hG5U7{YDa|0<7;Tt|E!E>*vM~Wv`D*;tL<7^G@ z><-hg%+E6Bd=)O45uYI0*HG-y3^zcL0>1|)kzJS(Vj`ku$Osc84zN5a9r&JnfVUKX z=hd{9_K^$STj;r-*2FnknH1tkD~4Wz4K3qQztEr!tS|e5;WXj_B_1d}9^wj$7bzcK&S2KuCcos@xjOGWlUlj#35TZ<3Yn>VOzd&_VXO|vbgWvFMbUa!) z$VQ(c)Vv&(ei2gKVDw5zbgME<4kADn_ndZdeC^T7s!yNylZ)SyhS^@74qjCBHCTe2 zM>v}ehw{u0C-ck1vIw29>-q&;C+ejaH(ayCjWY{_u~z*y;dIhC{p@kc$MoHFzB z?Zd4kTT6;@3=7KC_MZ@@gl-<>GXcl=t?5C3-j_%Z&%jc`KnsUmo+PILc95`e0-kyC z-#>(~ippLFe%uW^I@i?@Ay;UM*CUn7?BIp2>IKr6Li>KS1ty#(DyJ%p~b#Eq)^K=Ye&b~}(qoFHF4uh+oqC&hKM0uCCl(ujYsV_m} z&c?n&N;(qFkPN&-HGmVtiE)4>Yi!;|A1PaAf_X$72`I&>kXZ&Y1KYWy%ws?;J1)`PKvXUkC zE9LUJMMU$z!9H}d15A_3IxQFE=M%*p_~%w+krRr5HBSINlJWnkbG?H`W3+YV**+aT z!aYbsyH60RSt$?VNDAUPugUB7=>-$1!^E z^&)J4xG39PX*d#8q5%O&cR2(V6n5` zeQ7X=ce5U1azxU7!VkS?h99)&6)fH?g)=p(Y+*V@iDa0PiQX&43)SK;&3tFyFnnveZ zXnSMS&xZu8ZNfL%k(Nk37EbX};ZSLc=3fsKA%k7qXthL+I`&9+=^6Qx9l<*S%a6}^ zF^3dXbp>TW5VaRI&rBxY_`^?d24jB26+;n18jy>%LW^JtrBN%IegiR9?)Xw?lwwlj zZ*mxAZ|6bpVW-oq=Yz()`I`Oz0>je)||5Nqq&pS)-XL_OANE-hj&0RlR{f8 z(8kiu2H`5AASbG#bHmMelJ1Ui6AP(j-4VXsE^=6_%<#6hq(^`TS@bdpXCeidv9!|h z7hgDl0T^yTvli>0hSrltzh72m5}&%$`pIl$e{h8;r#?KOZ0 z=AWEjXC$cr{+8+~`sC7~i${?r>G%o8$IS$uO{4rNdNt*-`GyglD15wyd>6NpoU9p2 zLQSUV#>-;*+hW8J%EOU`e*@c7#^n5Qora~?E81J7^?LB>;BP^>6w%Rr4cx?hrbPtD zutJ~x{HyNP<$F+=>R9-=vFUmkjad}-qmj%nx$&ZF7qi2wKPUgy)Pqn0#A~%7$@L{X zCOpXbd0>bC2EiJls8xPE!BKB3R`i#DT=LaoO-kTzW#@il>@A;Q13jgSS$Ye05u_#m z4ET~ZN2K$a)v;w9n`r@__d(?P@1EQGv*fi)FrISv#7 z;^f{ZOHPbTQ{4WHUVaCjUP6;Wm&e%`4UK#>3P@ zL1O-92m_45tI$#_7y<{98WP-Fohy*vNF^HSVHgAI{f)oBsvFnZ&AA``1zk=mgEScv7mjPlFl5cgE1L(0O6-#PF4wT9kp-; zJg3g%Yzp~MrH0S_AWNiZ)ZocOM@4Ox zpkF}*pVi%;I0j@x#ox`qIEEtOMq@WUYWsA%jk>ULS~)PnMnot5Oc7u85c9I5mLu$Y zbbfLAt$!UC(L1Hp0I2k2d)DnNdEs}n`Q*+BKY#LPXx}+NrdQMGOxB7nmn=D<>U^^qO2`^^<-)5 zUVdo(Ih5Gg;rQf3igqc;@jBR^LKjIP_Z~E$Oo-6bR~h$`Z|4$&aJPA|U&SqH^ktsj z9aBoD)J;PcwPq!nVFBJCM`k_M%83-_u_)`R1uu%);Y0|8yh;UT?-unzUEZ1S+EsD8 z5e-$dS(oPyHFcjBYRfl3CmT)k#=iZqEOX-u^*;O4?y})P^WyQtl18Oi6bnD@GTJ8M zBcI$`WdG3e5WrDwodO&w*+-{vHE&lHb}1X<6j;Rs1)LrF_&s8(%SBP%?^SO76>6-C z`zcU+Z8s<{)%ExD$SKsL?H20UNtOyyqks3gjwV63DP0xaVz5w- zvtg2b?6JfdnBqq})3T~W5@Z-zs5E52H8Baj{B9#*Qa~=ADNUk8AKC`5TtIDt-Y!~f zOBT+aA0-{HYYb|=X4+{r{ngX+EWC8M7xDkiJwG8Md5Kwh__e)S%FjrYO{t>R+fh`Y zAMIO(6}3)}O9WK{z;e+nLIAO3@%pMi^xg(nftZGjEqXbL zP#Y`$(tZZAf21}b+yLAmQ_`WJ?;}9e0PaD0PapTKXwrQgw%38}htu+4xpNXrS|17% zupG?o6&9k2u(r9J(;a+ow2*iV*P@+_@_V@0)&O+iC@FM#?^Px6>E~90 zPf)S2Q21S(l^0zFf@~grLX~Q$vtkWGk!FI4Oq3OxT^C71EsXfQX}W|2&d>_A4ftPC zM;Q?1vYlPJQ&_q~rE%$4KtZJS3JB67!qOliwICq1gkk{FEiGNrAt)f=f;6IZUO^h( z$MxO!=HJeqnK?1vIcMUWsoL9E#aTRLD!859*!|Rs{O4L4Q(T^2M%B@A(^5}OtY%Ru z^NVq>ijIfO?w8=4kNOQSv2bT?Jeu{liUr@(yYOek-p9pI;BPk)(Kw>6M!BXG_V~8y zO+#m&;M`dG?vIU**%3Z*J++Gfi>>u8bK=?uajdzg-_|}`_?-!(J?2Xq9CFlsY5z{9 zq_e_DWwh~DMebp|GG9TO^+SaZLu4%85DPCp>?q<+y)4}P+XQWro${J~XlTx*3kFrb zuIOSO#|8QyL}q$wJsdp!d2S4?Kh6zJw)cIhSEkvH&^L}&-iago;;1>0mIGF*0H2*) z;fAuJ4JT;hbJ8zYLqO)K`2hLO@lFM^Jd*n7lh8}+=C*gJ~ zo?gR=!@P1NSv61}Q#q!PG~tI)-}gTUO&*1HGm;%72?K!1Jz8|bi9C*W}N$8o^(i&2WNyXq;UO_o#4 zI(rWNTvrqXdns$Zg$?{Pvr)@Zz4o!%5gOGWaze zT}Il_uXs@(!#?9x5TY#J+GUd(iv!#9f!U{#y_7Z%6YH6M~`LbM_n01&exKN@hSC zKj3>>aKZ=4k(r;&SIKi({#KP&r1(K(f9cy;>3Q?PykuBK)6Ng60dv1;yw)d_s%wS_$$^k3pLC-5!&kH8LXGi&GHC_ji7sse z`Z|wIzD3qf@$Tae1eA}}%TTd%)B50-zkH;{q^1ZyCL?&0nR3WqAi8E41b)+GA&M`R zr~azk#sFUyW11-FbXB`iGxau$=Uz%ZXhvd<@iHj9nV{|D)2e(!bEZrzm4w%XkkKw{ zi?E(F7jAs9$GodlQrq1z&LyOU0=(bsrkO^rX8Wq;i8TSP5V3|$a0W$CVO|;YW$}kI zUwNNf7hrYpX(>cJC~olvRTK)yRr$cHAAgDTe=1BD=p!iMbp&M_P?dF2D5FLT@n|Y$ zej0x4!O-9UP(%2J569nS`!2t*gl$6!Wj5gY{mPJ{rtWwM8-36({H}dFY4SHu$1b!8 z0;dLzb<3v&W@rZ^POJ?2^M7%1_ASSo$F{8eus?6)p zZ{$zwI7HFkEs(WLYWZ|5rTM_ct>Ey7uC+{K#h!1gcruhN(0_GQbb+bur(M?AfT7XA zJ#cWnjSI@Hu0t-0F)g0W%=@Yk(Q z#Ued&SIW3t&0Ca;Tb5?K!svm%+q&z_?vMm&RU!exW2@!(W@meWAD%K{2D`}(;_G4h zDclOVU;DqgS^1pxOIDySuR{?Q`mcp-pyxWJYWPS(R?@yz&NA#2c66Vvooi&vZ2r{l zu{ciA^e5#-URMKRC|a;oqD+MSP7nNoHZ<~imxFVv&S0(QN_>T|>dT$COMPDJe&EZ;djh(*RN=yQqy6p{Y_L3SCvB_vQoG$oWGmDBTDQCG^x7 zZ$^@28uPFcmMJh9l5Sdj|tAIN?h=ud^Nq-h6@=Q@=kOAQLx)#~em_JqGM0 zg$}sRr3<%nm#4(BsQuy)B5Q{Dyjn>YR2xwLlkJ5`*R2y5Q)=|C8Uu%3Mtsld^&eE2o^SZhl-KI zxD-#;(!{8VJ|buY`ssEdS>5s*k(u~*6%2tdoG7h5cUmRAYHy(+Pkm^zCjx0%qTC!R z^aJY$t=XTR;$nF{9k(O$m%4S=^}x{F9rwMqd7BVJP6F_uKB`15vV)3;s7D~2p>^Yf zZBR&$agmtk!?Ue`ZSe}njhG9^yt4BWI-Uc^Q`Y-+w3p9KWrVVm*=_0FZ=*MUW54$f zy|uN8z@wcN>MY?xEDy?x)Ka^cfJNqX2+!o*Vfzrg;C&66p4;XT+piBtKB5x?=WL2z z)wfhHu(c6|oT9gEa=iCuY#ksSz1w-)0NR(XS@OAB(H*9E&-PqQ8Bj~Tsgt~(H{iP= zDqaOPE9f1Ea4b($iXH_MUqYqleoQQikH-&)$Uix58EIWe2n)FiDip1;G>6SHO`*(s zYwjNh2|JksHZ}UUZhhME(%l@!5lScnOLbb>zt{zD!7hRL(Ro?=Wg6i#i93f<*=_M{ankvPSfW~RgY}9;jt~PsTEMg4*m%D+KS!41EP_% zi8XF;d2(eC$(E)T%>KpymnEldq7S)tZW)a^0-9(k!JiosP|IPcBJyBK6q7<#Ff0KrIRUuLm`*FW502Zyu0g z0$m9KSa73uPJhBfqQ_%T`qyOu8+T{yWEM+L$7i%}I}bz)0QWPeMTF@F)zu0@RqP?X zN&yV8hA8BI8J8XMu^|Jl>h<-+>ygTITmWFql8)J!;~NqFlSqiNv^|2T{jA zm@lS{5ph|pvvo3`W=!uOGQ($PtO5ZiFM&p;tY+I>{C)i8XW7AYQPfn#$(p(_K>bVP zm{u*nuX4G{PUrhEp64gYpd)Gsv)N6jfUE~-6_3GdbroBqmJ?Z*DKl)ImK~xX#LVPq zsaTR4o(D@NBOWdjm*fa^kpWxOzLGZ?~l9B3UrGv*0@;c9mi)&OPuemM=A%kNB) zh0PNH#Pg9`jj)X1MG94aHZWPociWrdVwuE&>zk_d>-P}!&b(Qu38jXkS#r>n9_t)x zNQyI(a<;C6fjPQr)0XTvgv(Sq`Bh>~Lo}L?wjdlg7KGEjz$y4oSTSPskjhKwJ~D%4suEl;{^AgefJzfS0FUqSj0=*p2Q=jK{H&G`3T$VK34*4Vq+9mALtC7=A>Up%LuuU(48{Wj)rXl|Ni3Y~s-654Fj)tG<*387>Y2R>b6)(q37w z6PqNO05~vKHR6AyLF3$ow>!Wq-pNe-Vb|CsMq%J&OC&%Eb5L8N6STNY*D-oSX!~u^ zlE?5pYI|e-q9PGhtWQo^^GzZZ;JP-KPzOUiiypn?nh+Yyp6XH3$y*x@KzEpk?OZT3 z$tq6=@zAM~dNIvwy99gtp5C0fezC!$M5+a4@$02NUf1jWQ|HIZ4*OND#*=v;H)slk zOVI22?HxqPu1Rcybg)AIj@Y*!QVz*NIki7dC@(Z zQ)+M3hTok6R2nC51uhb;h%mlbY7+5PTCew_?u21Ts^R6I^x@=e%OhrZ+^%%Z*ZBa5 z(WGsVQ1N@^HM~GV4=i>k%eyhqe7qe=ly zQmz?tS&0}-69yWf{UG!dLDn8&`%(_bFv%iymzW+%KR+rtg39W#3 zzeSrd_6pHU!7?mn4nGV+r=8Scw$Gi+kmiRn#Y_M?Hb_&0VOs7T3z0gBW!gPo<`W`= zK3+@!O@l@94&m#T%1cEHKGDYH1E+EKt*JXtH< znbQ`R?RUAfxZ0}^Z$<4GCj_~Bj29eeho9ZCs)M!OnbSyM;N;h$FW|N1gx~lQJSzza zu;cw-)W!%20OHRYpad;`+67-HQtROW6H!rXXoU6NGg##YSHdBH9iD zSix!Dd~$6t3|Km*N3oOvupQk9nOrBOuA;30eKauEOwsM%Q@lFl-RgXnK}W&A10 zc~CwBAy7Ows^38LpYiDDnS=p&qX%j6ZPCFKr_UjyVHYjitR2_3`0sZD3;{3XUw}73 z<_cjfg91EhC6WT+_#xt#7 z3(WDnZg~w&dRxDP&3WTKL~Hta1JKGpa10^vY8)cB)sPd1crA3F7eY*2_U7qQt3r_8 zY#bR2D8G!zv84jQlCHiB!t=2cxfdR=)E+*conaf7alUT_0yPOt;ad76ohcV>BO z%WGy}@m)G9TOQbNhN-ZKIBuZ@~OVk;AQ<@&zCrSz~>+- zRO)9-Fn80A9}Fbj@uslCE@?Rp?#~O-gTDNtaPR(Bf?9kjuRa1)<^*}PgQz_0U?kqx zrc4{$wO2LH_Ns@=yWApcjlsz`I4DTvx71-X{8Ly05pqA_8TzNa(e^3M;H`Ti1F)F> zTUXaOTfwY*&EAFxQ~&94gM-f?Ir-4B3c!59V=?6;m<#pF2XAk&ta^;MQsdrqUs>35 zdC7=jD)yLB9kPx|P+EUYD8|ZF-UvMF#7OeGF_EA-e+XM-uX0Tgr@ zM{lTKh8<*4u!sPErK`kfW1<+O|0AN-%3Q^c!uEVVwxI8a90$KOes?@&1(yb&+6dKE zR}#&=^=f4uzCwrEso^R%Sg2f7>Ug}jPSRRgV$;Nvi)M3~SM!~V+N>K7`o&3vvYl}C z5(6UxlI9a2abvCLc02Q9pJ)Z)(GnKmv&j6AuALz+Cg9*E9snW^8YVt?t%|>5Wbrfn z2bI>Q^UikV#x7yPOxc#$Goz0?Dw`*X0VqXl7-PKqh+9*C#ndc>4%R2J zSLE`*wszS(aiT_?vi+1gWD2xdAZdzCD~w#FL4CnN7^hUUs59We+`VBr?w$m5Bt+%7 zBLH;<91vi7%kwe830ijXs|MV5YHRNpI#-aKOKx9y)CIg3;jU@+$k#;t8?aV+Z znn!<=!+wVG4PM8apf=e3wliDx@}nCh*)J9z$Bp;{_g*x8wq@d>SenZSx`yc zCs9bnxZ=dBarF8+ zS~9%#ttVHgxaTg;6asD`N*X2n0uXSdLQv{yf2>k(oomZAAgxePjnD;Y_n}&5s!%IMg(5e$5^;jC2cH3Nt)> zxRH>pKg^%Z;|zMOF2#l2(BdeRYMz7`3^4qGP1hU}@iK1a&o`M${rXJyE4^cDnw$;? zIA2SJB1N!RS!hxN%$>qY^)hnMb*p8k){!^Iw@tnMWZI9uuW^kG#cxLZ;J%3k(wPQ= z1fW2Rqhr#;yRVvf-&4o!gbBzhx@#MK zpe=xlq93f}OolE_B*&0LM`oX@Pb=8}sR#5|!bF`9hmD|5oHZ1QkNi{n?r-)EsRW3d z6uiK_K(Y9L-6V;GJMre~KhwFWm;HZzW|eHBR8*-Gztc-nOpJ#C)`~*q4~>|pJ+}b0 zmAgrxx1gpxJOf&;LIw3Rx$Z;e=w&*<=9sYA|r`he}ltcBdA2pt(X z0mgnQJvVN&@ZDq0Km4rg@*95ypQ|6PFy+HX)-3A%83I_6m{TtByy6&rbpO`BRhMV1 zlen<-5-SUmu8_m{Pbo)eDUjL*AyT!7{#zqtu&SNVPNhZS(9~nsdNFM;ie<%-vAVvE z9|GI|2Oj{0%vMWxXnraE&QU(|{}#|Fr~KY(k6F zqvLGqjIoM;r~u$fe8W9$rqOYB^)*Nb{3%G^xTR;;hG~S#GE@FY3z|Qdr?36{f10-R zAJIZ06ByC?BRl}+K6aDauTy4|{U1`~NnB5y!Z%j+?8JW?ckH?a-L%Q||Mz#TR?lny z&hiD_&}((8F8}fjJk1&ER$eHxiaCc|mS;O_RwtR-+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="