diff --git a/.gitignore b/.gitignore index a694dcf6..2cd78d74 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ env.php #Homestead.yaml Homestead.json LocalValetDriver.php +docker-compose-profiler.yml # Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer .rocketeer/ diff --git a/.travis.yml b/.travis.yml index e919cc66..ce0bcbca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,13 +4,13 @@ language: php php: - - '7.2' - - '7.3' - '7.4' + - '7.3' + - '7.2' -env: - - DB=mysql - - DB=mariadb +#env: +# - DB=mysql +# - DB=mariadb cache: # Cache lives for 10 min @@ -23,13 +23,14 @@ cache: services: - mysql -addons: - mariadb: '10.2' +#addons: +# mariadb: '10.2' install: - php --version - mysql --version - composer install --dev --no-interaction --verbose + - npm i tar-to-zip -g - cp .travis/env.travis.php env.php - cp .travis/phpunit.travis.xml phpunit.xml @@ -136,7 +137,7 @@ jobs: on: all_branches: true repo: nabeelio/phpvms - php: '7.2' + php: '7.4' tags: false # RELEASE STAGE @@ -157,4 +158,4 @@ jobs: on: tags: true repo: nabeelio/phpvms - php: '7.2' + php: '7.4' diff --git a/.travis/deploy_script.sh b/.travis/deploy_script.sh index 652471cd..96fb20b2 100755 --- a/.travis/deploy_script.sh +++ b/.travis/deploy_script.sh @@ -1,132 +1,150 @@ #!/usr/bin/env bash -if [ "$TRAVIS" = "true" ]; then - - cd $TRAVIS_BUILD_DIR - - if test "$TRAVIS_TAG"; then - PKG_NAME=$TRAVIS_TAG - VERSION=$TRAVIS_TAG - - # Pass in the tag as the version to write out - php artisan phpvms:version --write $VERSION - else - echo "On branch $TRAVIS_BRANCH" - - if [ "$TRAVIS_BRANCH" != "master" ] && [ "$TRAVIS_BRANCH" != "dev" ]; then - echo "Not on valid branch, exiting" - exit 0 - fi - - # Write the version out but place the branch ID in there - # This is only for the dev branch - BASE_VERSION=$(php artisan phpvms:version --base-only) - - # This now includes the pre-release version, so "-dev" by default - PKG_NAME=${BASE_VERSION} - - # Don't pass in a version here, just write out the latest hash - php artisan phpvms:version --write >VERSION - VERSION=$(cat VERSION) - fi - - echo "Version: $VERSION" - echo "Package name: $TAR_NAME" - - FILE_NAME="phpvms-$PKG_NAME" - TAR_NAME="$FILE_NAME.tar.gz" - - echo "Cleaning files" - - rm -rf vendor - composer install --no-dev --prefer-dist --no-interaction --verbose - - # Leftover individual files to delete - declare -a remove_files=( - .git - .github - .sass-cache - .idea - .travis - docker - _ide_helper.php - .dockerignore - .dpl - .editorconfig - .eslintignore - .eslintrc - .php_cs - .php_cs.cache - .phpstorm.meta.php - .styleci.yml - .phpunit.result.cache - env.php - intellij_style.xml - config.php - docker-compose.yml - Makefile - phpcs.xml - phpunit.xml - phpvms.iml - Procfile - phpstan.neon - node_modules - composer.phar - vendor/willdurand/geocoder/tests - ) - - for file in "${remove_files[@]}"; do - rm -rf $file - done - - find ./vendor -type d -name ".git" -print0 | xargs rm -rf - find . -type d -name "sass-cache" -print0 | xargs rm -rf - - # clear any app specific stuff that might have been loaded in - find bootstrap/cache -mindepth 1 -maxdepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/app -mindepth 1 -maxdepth 1 -not -name '.gitignore' -not -name public -not -name import -print0 -exec rm -rf {} + - find storage/app/public -mindepth 1 -maxdepth 1 -not -name '.gitignore' -not -name avatars -not -name uploads -print0 -exec rm -rf {} + - find storage/app/public/avatars -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/app/public/uploads -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/debugbar -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/docker -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/framework/cache -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/framework/sessions -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/framework/views -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - find storage/logs -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + - - mkdir -p storage/app/public/avatars - mkdir -p storage/app/public/uploads - mkdir -p storage/framework/cache - mkdir -p storage/framework/sessions - mkdir -p storage/framework/views - - # Regenerate the autoloader and classes - composer dump-autoload - make clean - - cd /tmp - tar -czf $TAR_NAME -C $TRAVIS_BUILD_DIR/../ phpvms - sha256sum $TAR_NAME >"$TAR_NAME.sha256" - - echo "Uploading to S3" - mkdir -p $TRAVIS_BUILD_DIR/build - cd $TRAVIS_BUILD_DIR/build - - mv "/tmp/$TAR_NAME" "/tmp/$TAR_NAME.sha256" . - artifacts upload --target-paths "/" $TAR_NAME $TRAVIS_BUILD_DIR/VERSION $TAR_NAME.sha256 - - # Upload the version for a tagged release. Move to a version file in different - # tags. Within phpVMS, we have an option of which version to track in the admin - if test "$TRAVIS_TAG"; then - echo "Uploading release version file" - cp "$TRAVIS_BUILD_DIR/VERSION" release_version - artifacts upload --target-paths "/" release_version - else - echo "Uploading ${TRAVIS_BRANCH}_version file" - cp $TRAVIS_BUILD_DIR/VERSION ${TRAVIS_BRANCH}_version - artifacts upload --target-paths "/" ${TRAVIS_BRANCH}_version - fi - - curl -X POST --data "{\"content\": \"A new build is available at http://downloads.phpvms.net/$TAR_NAME ($VERSION)\"}" -H "Content-Type: application/json" $DISCORD_WEBHOOK_URL +if [ "$TRAVIS" != "true" ]; then + exit 0 fi + +cd $TRAVIS_BUILD_DIR + +if test "$TRAVIS_TAG"; then + VERSION=$TRAVIS_TAG + + # Pass in the tag as the version to write out + php artisan phpvms:version --write --write-full-version "${VERSION}" + FULL_VERSION=$(php artisan phpvms:version) +else + echo "On branch $TRAVIS_BRANCH" + + if [ "$TRAVIS_BRANCH" != "master" ] && [ "$TRAVIS_BRANCH" != "dev" ]; then + echo "Not on valid branch, exiting" + exit 0 + fi + + # Write the version out but place the branch ID in there + # This is only for the dev branch + BASE_VERSION=$(php artisan phpvms:version --base-only) + + # This now includes the pre-release version, so "-dev" by default + VERSION=${BASE_VERSION} + + # Don't pass in a version here, just write out the latest hash + php artisan phpvms:version --write "${VERSION}" + FULL_VERSION=$(php artisan phpvms:version) +fi + +FILE_NAME="phpvms-${VERSION}" +TAR_NAME="$FILE_NAME.tar.gz" +ZIP_NAME="$FILE_NAME.zip" + +echo "Version: ${VERSION}" +echo "Full Version: ${FULL_VERSION}" +echo "Package name: ${TAR_NAME}" + +echo "===========================" + +echo "Cleaning files" + +rm -rf vendor +composer install --no-dev --prefer-dist --no-interaction --verbose + +# Leftover individual files to delete +declare -a remove_files=( + .git + .github + .sass-cache + .idea + .travis + docker + _ide_helper.php + .dockerignore + .dpl + .editorconfig + .eslintignore + .eslintrc + .php_cs + .php_cs.cache + .phpstorm.meta.php + .styleci.yml + .phpunit.result.cache + env.php + intellij_style.xml + config.php + docker-compose.yml + Makefile + phpcs.xml + phpunit.xml + phpvms.iml + Procfile + phpstan.neon + node_modules + composer.phar + vendor/willdurand/geocoder/tests +) + +for file in "${remove_files[@]}"; do + rm -rf $file +done + +find ./vendor -type d -name ".git" -print0 | xargs rm -rf +find . -type d -name "sass-cache" -print0 | xargs rm -rf + +# clear any app specific stuff that might have been loaded in +find bootstrap/cache -mindepth 1 -maxdepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/app -mindepth 1 -maxdepth 1 -not -name '.gitignore' -not -name public -not -name import -print0 -exec rm -rf {} + +find storage/app/public -mindepth 1 -maxdepth 1 -not -name '.gitignore' -not -name avatars -not -name uploads -print0 -exec rm -rf {} + +find storage/app/public/avatars -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/app/public/uploads -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/debugbar -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/docker -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/framework/cache -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/framework/sessions -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/framework/views -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + +find storage/logs -mindepth 1 -not -name '.gitignore' -print0 -exec rm -rf {} + + +mkdir -p storage/app/public/avatars +mkdir -p storage/app/public/uploads +mkdir -p storage/framework/cache +mkdir -p storage/framework/sessions +mkdir -p storage/framework/views + +# Regenerate the autoloader and classes +composer dump-autoload +make clean + +cd /tmp +ls -al $TRAVIS_BUILD_DIR/../ + +tar -czf $TAR_NAME -C $TRAVIS_BUILD_DIR . +sha256sum $TAR_NAME >"$TAR_NAME.sha256" +tar2zip $TAR_NAME +sha256sum $ZIP_NAME >"$ZIP_NAME.sha256" + +ls -al /tmp + +echo "Uploading to S3" +mkdir -p $TRAVIS_BUILD_DIR/build +cd $TRAVIS_BUILD_DIR/build + +mv "/tmp/$TAR_NAME" "/tmp/$ZIP_NAME" "/tmp/$TAR_NAME.sha256" "/tmp/$ZIP_NAME.sha256" . +artifacts upload --target-paths "/" $ZIP_NAME $TAR_NAME $TRAVIS_BUILD_DIR/VERSION $TAR_NAME.sha256 $ZIP_NAME.sha256 + +# Upload the version for a tagged release. Move to a version file in different +# tags. Within phpVMS, we have an option of which version to track in the admin +if test "$TRAVIS_TAG"; then + echo "Uploading release version file" + cp "$TRAVIS_BUILD_DIR/VERSION" release_version + artifacts upload --target-paths "/" release_version +else + echo "Uploading ${TRAVIS_BRANCH}_version file" + cp $TRAVIS_BUILD_DIR/VERSION ${TRAVIS_BRANCH}_version + artifacts upload --target-paths "/" ${TRAVIS_BRANCH}_version +fi + +#if [ "$TRAVIS_BRANCH" != "master" ] && [ "$TRAVIS_BRANCH" != "dev" ]; then +# echo "Skipping Discord branch update broadcast" +#else + curl -X POST \ + --data "{\"content\": \"A new build is available at http://downloads.phpvms.net/$TAR_NAME (${FULL_VERSION})\"}" \ + -H "Content-Type: application/json" \ + $DISCORD_WEBHOOK_URL +#fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 50523d03..3aaca9a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,706 @@ -## Beta 2 (7.0.0-beta.2) +# Changelog -- Switching to semver -- PHP 7.2 minimum -- Lots of fixes, view the [Github Milestone](https://github.com/nabeelio/phpvms/milestone/2?closed=1) for details +## [7.0.0-beta.4](https://github.com/nabeelio/phpvms/tree/7.0.0-beta.4) (2020-05-09) -## Beta 1 (v7.0.0-beta) +[Full Changelog](https://github.com/nabeelio/phpvms/compare/7.0.0-beta.3...7.0.0-beta.4) -- Initial Release +**Implemented enhancements:** + +- Move currency selection to admin settings [\#671](https://github.com/nabeelio/phpvms/issues/671) +- Center live map to custom location [\#661](https://github.com/nabeelio/phpvms/issues/661) +- Pilot Names - Pilots ID [\#656](https://github.com/nabeelio/phpvms/issues/656) +- Simbrief sample data [\#651](https://github.com/nabeelio/phpvms/issues/651) +- Simbrief only available for bids [\#642](https://github.com/nabeelio/phpvms/issues/642) +- PIREP prefile download [\#634](https://github.com/nabeelio/phpvms/issues/634) +- Importer - group imported aircraft by type [\#628](https://github.com/nabeelio/phpvms/issues/628) +- API: When looking up flight, return the load factor [\#611](https://github.com/nabeelio/phpvms/issues/611) +- API: On prefile, return required fields [\#610](https://github.com/nabeelio/phpvms/issues/610) +- Center on active flights [\#605](https://github.com/nabeelio/phpvms/issues/605) +- Profiling/performance improvments [\#602](https://github.com/nabeelio/phpvms/issues/602) +- Aircraft stats resync [\#585](https://github.com/nabeelio/phpvms/issues/585) +- Cron Job [\#553](https://github.com/nabeelio/phpvms/issues/553) +- Importing a CSV with additional airports clears all previous airports [\#490](https://github.com/nabeelio/phpvms/issues/490) +- Use continuation token instead of page/offset [\#469](https://github.com/nabeelio/phpvms/issues/469) +- Combine the Util classes in Facade and Support [\#467](https://github.com/nabeelio/phpvms/issues/467) +- ACARS/Live flight events [\#436](https://github.com/nabeelio/phpvms/issues/436) +- Allow logo upload for airline [\#417](https://github.com/nabeelio/phpvms/issues/417) +- Google Analytics Settings [\#382](https://github.com/nabeelio/phpvms/issues/382) +- Let update only be run if logged in/admin [\#372](https://github.com/nabeelio/phpvms/issues/372) +- Airport Lookup - possible additions [\#364](https://github.com/nabeelio/phpvms/issues/364) +- Set flight type for expenses for flight [\#348](https://github.com/nabeelio/phpvms/issues/348) +- Extend search schedule options [\#297](https://github.com/nabeelio/phpvms/issues/297) +- Change currency from settings \#671 [\#672](https://github.com/nabeelio/phpvms/pull/672) +- Add privatized version of name \#656 [\#658](https://github.com/nabeelio/phpvms/pull/658) +- Add Simbrief entries as sample data for load \#651 [\#652](https://github.com/nabeelio/phpvms/pull/652) +- Option for SB only on bids; add the new file type \#642 [\#643](https://github.com/nabeelio/phpvms/pull/643) +- Account ICAO for subfleet, airline/location if columns exist \#628 [\#632](https://github.com/nabeelio/phpvms/pull/632) +- Performance improvements \#602 [\#607](https://github.com/nabeelio/phpvms/pull/607) +- Center on active flights \#605 [\#606](https://github.com/nabeelio/phpvms/pull/606) +- Installer fixes, remove bcmath, fix design [\#596](https://github.com/nabeelio/phpvms/pull/596) +- Remove airport length restrictions \#590 [\#592](https://github.com/nabeelio/phpvms/pull/592) +- Remove 4 char restriction from ICAO; use decimal type for lat/lon \#590 [\#591](https://github.com/nabeelio/phpvms/pull/591) +- Recalcuate aircraft stats in nightly cron and importer \#585 \#443 [\#587](https://github.com/nabeelio/phpvms/pull/587) +- \(Importer\) Set the pay rate for the ranks \#443 [\#586](https://github.com/nabeelio/phpvms/pull/586) +- Fix rowmapper generator, check for fields, map users \#443 [\#583](https://github.com/nabeelio/phpvms/pull/583) +- Add bcmath to the required extensions list \#558 [\#564](https://github.com/nabeelio/phpvms/pull/564) +- Add the argc\_argv flag for the cgi exec \#553 [\#556](https://github.com/nabeelio/phpvms/pull/556) +- Add logo to the flights page if its set \#417 [\#550](https://github.com/nabeelio/phpvms/pull/550) +- Add additional events for PIREP states \#436 [\#548](https://github.com/nabeelio/phpvms/pull/548) +- Cleanup Utils \#467 [\#547](https://github.com/nabeelio/phpvms/pull/547) +- Add checkbox to clear previous data when importing \#490 [\#546](https://github.com/nabeelio/phpvms/pull/546) +- Distro zip file from tar file \#449 [\#543](https://github.com/nabeelio/phpvms/pull/543) +- Spanish files translation [\#542](https://github.com/nabeelio/phpvms/pull/542) +- Add link to download ACARS config from profile [\#539](https://github.com/nabeelio/phpvms/pull/539) +- Format all blade templates to 2 spaces \#530 [\#531](https://github.com/nabeelio/phpvms/pull/531) +- Add menu bar for mobile [\#529](https://github.com/nabeelio/phpvms/pull/529) +- Fix live and route map errors \#527 [\#528](https://github.com/nabeelio/phpvms/pull/528) +- Set PIREPs page to public [\#526](https://github.com/nabeelio/phpvms/pull/526) +- Try to clear caches before updating [\#522](https://github.com/nabeelio/phpvms/pull/522) +- Reduce number of queries for update check [\#520](https://github.com/nabeelio/phpvms/pull/520) +- Add getRootDomain\(\) to Utils [\#514](https://github.com/nabeelio/phpvms/pull/514) +- Search flights by subfleet \#484 [\#506](https://github.com/nabeelio/phpvms/pull/506) +- Add base Dockerfile for Dockerhub upload [\#504](https://github.com/nabeelio/phpvms/pull/504) +- Add reference to docs on doc site [\#502](https://github.com/nabeelio/phpvms/pull/502) +- Add new command to export a specific PIREP for debugging [\#501](https://github.com/nabeelio/phpvms/pull/501) +- Flight search for departure/arrival airports not using column names [\#496](https://github.com/nabeelio/phpvms/pull/496) +- Split the importer module out from the installer module [\#468](https://github.com/nabeelio/phpvms/pull/468) + +**Fixed bugs:** + +- Aircraft hours not counting [\#683](https://github.com/nabeelio/phpvms/issues/683) +- Error creating first user/airline [\#677](https://github.com/nabeelio/phpvms/issues/677) +- submitting PIREP: Page Not Found [\#676](https://github.com/nabeelio/phpvms/issues/676) +- Filing manual report causes SimBrief Error [\#668](https://github.com/nabeelio/phpvms/issues/668) +- Error on finance page in admin [\#667](https://github.com/nabeelio/phpvms/issues/667) +- API: User bids aren't loading SimBrief data for flight [\#664](https://github.com/nabeelio/phpvms/issues/664) +- .: Links to pilot profiles :. [\#655](https://github.com/nabeelio/phpvms/issues/655) +- Some domains \(ex, .co.uk\) not properly parsed [\#647](https://github.com/nabeelio/phpvms/issues/647) +- API: Load bids through the bids.flight fields, not the flights field on the user [\#639](https://github.com/nabeelio/phpvms/issues/639) +- Login page not using theme [\#638](https://github.com/nabeelio/phpvms/issues/638) +- CSV import error says "csv not found" [\#636](https://github.com/nabeelio/phpvms/issues/636) +- Importer - schedules not importing properly [\#630](https://github.com/nabeelio/phpvms/issues/630) +- Disable using of php opcache [\#625](https://github.com/nabeelio/phpvms/issues/625) +- API: Flight fields are an array when empty [\#618](https://github.com/nabeelio/phpvms/issues/618) +- "Pending Pireps" in admin is blank [\#616](https://github.com/nabeelio/phpvms/issues/616) +- Flight fields show all fields, not custom added ones [\#614](https://github.com/nabeelio/phpvms/issues/614) +- Mixed content causes error [\#612](https://github.com/nabeelio/phpvms/issues/612) +- Fares not appearing in API response for user/subfleets [\#608](https://github.com/nabeelio/phpvms/issues/608) +- Not selecting active for aircraft shows nullable error [\#603](https://github.com/nabeelio/phpvms/issues/603) +- Airports page repeats airport name \(infinite loop\) [\#599](https://github.com/nabeelio/phpvms/issues/599) +- Calculate Distance button not working [\#595](https://github.com/nabeelio/phpvms/issues/595) +- Support Seaports with 3 letter IATA/ID codes [\#590](https://github.com/nabeelio/phpvms/issues/590) +- Hubs only show for registration [\#580](https://github.com/nabeelio/phpvms/issues/580) +- Error when updating user in admin [\#576](https://github.com/nabeelio/phpvms/issues/576) +- Updater not working because Source repository \[github\] is not defined [\#575](https://github.com/nabeelio/phpvms/issues/575) +- Flights Page Search Subfleet Column [\#574](https://github.com/nabeelio/phpvms/issues/574) +- Duplicate key entry for ACARS data [\#572](https://github.com/nabeelio/phpvms/issues/572) +- No hint path defined for updater [\#570](https://github.com/nabeelio/phpvms/issues/570) +- My Bids Page Error [\#561](https://github.com/nabeelio/phpvms/issues/561) +- I can't change Current Theme [\#554](https://github.com/nabeelio/phpvms/issues/554) +- Pilots cannot use the dashboard or flights without admin rights [\#480](https://github.com/nabeelio/phpvms/issues/480) +- Database prefix not being applied [\#442](https://github.com/nabeelio/phpvms/issues/442) +- Install not working [\#411](https://github.com/nabeelio/phpvms/issues/411) +- typo in dependency on 'leaflet.geodesic' [\#687](https://github.com/nabeelio/phpvms/pull/687) +- Emails/notifications not sending \#675 [\#686](https://github.com/nabeelio/phpvms/pull/686) +- Aircraft hours not showing/incrementing \#683 [\#684](https://github.com/nabeelio/phpvms/pull/684) +- METAR: KM as unit in visibility \#680 [\#682](https://github.com/nabeelio/phpvms/pull/682) +- Blank/null IATA code isn't unique when added \#679 [\#681](https://github.com/nabeelio/phpvms/pull/681) +- Fix airline creation in installer \#677 [\#678](https://github.com/nabeelio/phpvms/pull/678) +- Journal not created when airline is created \#667 [\#670](https://github.com/nabeelio/phpvms/pull/670) +- Check for SB being avail before filing \#668 [\#669](https://github.com/nabeelio/phpvms/pull/669) +- Load Simbrief and flight data when getting bids \#664 [\#665](https://github.com/nabeelio/phpvms/pull/665) +- Fix pilots page not showing up \#655 [\#660](https://github.com/nabeelio/phpvms/pull/660) +- Fix PirepComment response; 201 to 200 [\#654](https://github.com/nabeelio/phpvms/pull/654) +- Domain detection failing for .co.uk, etc \#647 [\#648](https://github.com/nabeelio/phpvms/pull/648) +- Auth routes not using themes \#638 [\#645](https://github.com/nabeelio/phpvms/pull/645) +- Don't return bids by default, fix user flight column \#639 [\#640](https://github.com/nabeelio/phpvms/pull/640) +- Account for admin role, don't error out on null rows \#632 [\#637](https://github.com/nabeelio/phpvms/pull/637) +- Fix airline mapping for aircraft \#628 [\#633](https://github.com/nabeelio/phpvms/pull/633) +- Increase ID column size; seed ID generator with uniqid\(\) \#630 [\#631](https://github.com/nabeelio/phpvms/pull/631) +- Disable using apc/opcache by default if found \#625 [\#629](https://github.com/nabeelio/phpvms/pull/629) +- Fix saving of fare \#621 [\#624](https://github.com/nabeelio/phpvms/pull/624) +- API: Flight fields are an array when empty \#618 [\#619](https://github.com/nabeelio/phpvms/pull/619) +- Remove the flight fields link from admin \#614 [\#615](https://github.com/nabeelio/phpvms/pull/615) +- HTTP/HTTPS mixed content errors \#612 [\#613](https://github.com/nabeelio/phpvms/pull/613) +- Fare information not included in subfleet response \#608 [\#609](https://github.com/nabeelio/phpvms/pull/609) +- Aircraft status field blank causes error \#603 [\#604](https://github.com/nabeelio/phpvms/pull/604) +- METAR parsing infinite loop bugfix \#599 [\#600](https://github.com/nabeelio/phpvms/pull/600) +- Table prefixes not being added to indexes [\#597](https://github.com/nabeelio/phpvms/pull/597) +- Import expense and ledger entries \#443 [\#588](https://github.com/nabeelio/phpvms/pull/588) +- User country mapping; ignore unused groups \#443 [\#584](https://github.com/nabeelio/phpvms/pull/584) +- Change fuel used to optional \#512 [\#582](https://github.com/nabeelio/phpvms/pull/582) +- Respect home hubs setting for registration \#580 [\#581](https://github.com/nabeelio/phpvms/pull/581) +- Upstream null version; build version tags not being saved properly \#575 [\#578](https://github.com/nabeelio/phpvms/pull/578) +- Fix edit pilot error \(Facade\Utils missing\) \#576 [\#577](https://github.com/nabeelio/phpvms/pull/577) +- Upsert on ACARS positions \#572 [\#573](https://github.com/nabeelio/phpvms/pull/573) +- Fix the namespace path on updater templates \#570 [\#571](https://github.com/nabeelio/phpvms/pull/571) +- Route not found error for Pirep::resource\(\) call \#559 [\#565](https://github.com/nabeelio/phpvms/pull/565) +- Add extra check for $acars being set \#560 [\#563](https://github.com/nabeelio/phpvms/pull/563) +- Missing $subfleet error on bids page \#561 [\#562](https://github.com/nabeelio/phpvms/pull/562) +- Refresh theme cache on settings page load \#554 [\#557](https://github.com/nabeelio/phpvms/pull/557) +- Fix migrations when table prefix is involved \#442 [\#555](https://github.com/nabeelio/phpvms/pull/555) +- Use optional\(\) around the airport fields [\#537](https://github.com/nabeelio/phpvms/pull/537) +- PIREPS resource except for show [\#536](https://github.com/nabeelio/phpvms/pull/536) +- Fix import during flight cron \#532 [\#535](https://github.com/nabeelio/phpvms/pull/535) +- Fix PIREP edit endpoint [\#534](https://github.com/nabeelio/phpvms/pull/534) +- Add a public\_url\(\) helper \#513 [\#519](https://github.com/nabeelio/phpvms/pull/519) +- Correct text for no subfleets \#507 [\#518](https://github.com/nabeelio/phpvms/pull/518) +- Error page not showing when database isn't configured [\#517](https://github.com/nabeelio/phpvms/pull/517) +- Check user permissions on the routes \#508 [\#516](https://github.com/nabeelio/phpvms/pull/516) +- Show admin dropdown for admin-access ability [\#515](https://github.com/nabeelio/phpvms/pull/515) +- New subfleet not being attached to an airline on import \#479 [\#505](https://github.com/nabeelio/phpvms/pull/505) +- Importing not updating existing items \#486 [\#503](https://github.com/nabeelio/phpvms/pull/503) +- Set a default model value for airports on PIREP [\#500](https://github.com/nabeelio/phpvms/pull/500) +- Fix GeoService errors when viewing PIREP \#498 [\#499](https://github.com/nabeelio/phpvms/pull/499) +- Properly set the distance/planned\_distance [\#497](https://github.com/nabeelio/phpvms/pull/497) +- 491 Installation Error [\#495](https://github.com/nabeelio/phpvms/pull/495) +- Return the flight fares if there are no subfleet fares \#488 [\#489](https://github.com/nabeelio/phpvms/pull/489) +- Error if there are no roles when editing a user \#480 [\#483](https://github.com/nabeelio/phpvms/pull/483) +- Allow nullable field and calculate distance if nulled [\#482](https://github.com/nabeelio/phpvms/pull/482) +- Pilots cannot use the dashboard or flights without admin rights [\#481](https://github.com/nabeelio/phpvms/pull/481) +- Fix BindingResolutionError when debug toolbar isn't present [\#465](https://github.com/nabeelio/phpvms/pull/465) +- Fix CSV imports giving Storage class not found \#454 [\#462](https://github.com/nabeelio/phpvms/pull/462) +- Use PhpExecutableFinder\(\) closes \#457 \#458 [\#460](https://github.com/nabeelio/phpvms/pull/460) +- Avoid proc\_open use \#455 [\#456](https://github.com/nabeelio/phpvms/pull/456) +- Stricter checks on ACARS API data [\#451](https://github.com/nabeelio/phpvms/pull/451) +- Remove bootstrap cache [\#448](https://github.com/nabeelio/phpvms/pull/448) + +**Closed issues:** + +- Dashboard error when METAR visibility in KM [\#680](https://github.com/nabeelio/phpvms/issues/680) +- Error adding multiple airlines without IATA codes [\#679](https://github.com/nabeelio/phpvms/issues/679) +- Pages [\#641](https://github.com/nabeelio/phpvms/issues/641) +- Create a "fare type" for cargo [\#621](https://github.com/nabeelio/phpvms/issues/621) +- Split Sample module out into separate repo [\#593](https://github.com/nabeelio/phpvms/issues/593) +- No way to add files to fleet [\#567](https://github.com/nabeelio/phpvms/issues/567) +- Map Center Coords [\#566](https://github.com/nabeelio/phpvms/issues/566) +- Pilot Profile Page Error [\#560](https://github.com/nabeelio/phpvms/issues/560) +- File New Pirep [\#559](https://github.com/nabeelio/phpvms/issues/559) +- I can't add new flight [\#558](https://github.com/nabeelio/phpvms/issues/558) +- Pilot Pay route modifier [\#487](https://github.com/nabeelio/phpvms/issues/487) +- Auto-update [\#449](https://github.com/nabeelio/phpvms/issues/449) +- Setting to not automatically calculate distances [\#446](https://github.com/nabeelio/phpvms/issues/446) +- Classic importer [\#443](https://github.com/nabeelio/phpvms/issues/443) +- SimBrief integration - pirep prefile [\#405](https://github.com/nabeelio/phpvms/issues/405) +- PIREP rejection doesn't move pilot back to previous airport [\#392](https://github.com/nabeelio/phpvms/issues/392) +- Load Factor for flights [\#352](https://github.com/nabeelio/phpvms/issues/352) + +**Merged pull requests:** + +- Upgrade packages with security alerts [\#653](https://github.com/nabeelio/phpvms/pull/653) +- Add public/private pages \#641 [\#644](https://github.com/nabeelio/phpvms/pull/644) +- SimBrief integration \#405 [\#635](https://github.com/nabeelio/phpvms/pull/635) +- Add fare type for pax/cargo/mixed flights \#621 [\#623](https://github.com/nabeelio/phpvms/pull/623) +- Add fixed pilot pay for a flight \#487 [\#622](https://github.com/nabeelio/phpvms/pull/622) +- Add load factor and variance to flights \#352 [\#620](https://github.com/nabeelio/phpvms/pull/620) +- Module/plugin installation working \#593 [\#594](https://github.com/nabeelio/phpvms/pull/594) +- Add Google Analytics tracking ID to settings and to main template \#382 [\#551](https://github.com/nabeelio/phpvms/pull/551) +- Set expenses on specific flight types \#348 [\#549](https://github.com/nabeelio/phpvms/pull/549) +- Auto update \#449 [\#545](https://github.com/nabeelio/phpvms/pull/545) +- Auto-update functionality \#449 [\#544](https://github.com/nabeelio/phpvms/pull/544) +- ACARS XML config file download [\#540](https://github.com/nabeelio/phpvms/pull/540) +- Make the fuel used optional [\#512](https://github.com/nabeelio/phpvms/pull/512) +- Add PHP 7.4 support [\#464](https://github.com/nabeelio/phpvms/pull/464) +- Replace importer with AJAX powered; better error handling \#443 [\#447](https://github.com/nabeelio/phpvms/pull/447) +- Fix missing newsRepo variable [\#445](https://github.com/nabeelio/phpvms/pull/445) +- Refactor and add importer to Installer module \#443 [\#444](https://github.com/nabeelio/phpvms/pull/444) +- 391 Notification refactorings [\#441](https://github.com/nabeelio/phpvms/pull/441) + +## [7.0.0-beta.3](https://github.com/nabeelio/phpvms/tree/7.0.0-beta.3) (2020-02-08) + +[Full Changelog](https://github.com/nabeelio/phpvms/compare/7.0.0-beta.2...7.0.0-beta.3) + +**Implemented enhancements:** + +- Fix formatting in blade files [\#530](https://github.com/nabeelio/phpvms/issues/530) +- Make PIREP view page public [\#525](https://github.com/nabeelio/phpvms/issues/525) +- Fix map line colors [\#523](https://github.com/nabeelio/phpvms/issues/523) +- Null-able fuel values on PIREP [\#510](https://github.com/nabeelio/phpvms/issues/510) +- include subfleet in search options [\#484](https://github.com/nabeelio/phpvms/issues/484) +- PHP 7.4 in Travis [\#463](https://github.com/nabeelio/phpvms/issues/463) +- Move cron problem report to main page [\#458](https://github.com/nabeelio/phpvms/issues/458) + +**Fixed bugs:** + +- Method GET for /pireps/\/edit not supported [\#533](https://github.com/nabeelio/phpvms/issues/533) +- Cron error for removing expired flights [\#532](https://github.com/nabeelio/phpvms/issues/532) +- Live map marker click not working [\#527](https://github.com/nabeelio/phpvms/issues/527) +- Redirect to installer properly [\#513](https://github.com/nabeelio/phpvms/issues/513) +- Admin panel link not shown for users in role group [\#509](https://github.com/nabeelio/phpvms/issues/509) +- Users without "admin" role can modify roles [\#508](https://github.com/nabeelio/phpvms/issues/508) +- Edit flights page - text error [\#507](https://github.com/nabeelio/phpvms/issues/507) +- Installation error with external databases [\#494](https://github.com/nabeelio/phpvms/issues/494) +- Pirep not in KG [\#493](https://github.com/nabeelio/phpvms/issues/493) +- Installation Error step2 [\#491](https://github.com/nabeelio/phpvms/issues/491) +- Fares assigned to flights not working/overwritten by Subfleet [\#488](https://github.com/nabeelio/phpvms/issues/488) +- Status not changing when importing CSV for aircraft [\#486](https://github.com/nabeelio/phpvms/issues/486) +- Default Theme unusable on Mobile [\#485](https://github.com/nabeelio/phpvms/issues/485) +- Fatal Error in subfleet page when importing routes with new aircraft [\#479](https://github.com/nabeelio/phpvms/issues/479) +- Flights CSV import fails if no distance stipulated [\#478](https://github.com/nabeelio/phpvms/issues/478) +- Subfleet CSV import [\#476](https://github.com/nabeelio/phpvms/issues/476) +- Cron - DateTime::construct\(\) expects parameter 2 to be DateTimeZone, int given [\#461](https://github.com/nabeelio/phpvms/issues/461) +- if PHP\_CLI not found in cron maintenance, put generic `php` exec there [\#457](https://github.com/nabeelio/phpvms/issues/457) +- Importing schedule bug [\#454](https://github.com/nabeelio/phpvms/issues/454) +- The updater/installer should clear all caches [\#408](https://github.com/nabeelio/phpvms/issues/408) + +**Closed issues:** + +- Error 500 when trying to access Dashboard. [\#498](https://github.com/nabeelio/phpvms/issues/498) +- Import multiple aircraft of different subtypes in one sheet [\#477](https://github.com/nabeelio/phpvms/issues/477) +- Split out installer/importer from updater [\#453](https://github.com/nabeelio/phpvms/issues/453) +- ACARS update fields can be nulled [\#450](https://github.com/nabeelio/phpvms/issues/450) +- Retryable HTTP client [\#430](https://github.com/nabeelio/phpvms/issues/430) +- Pireps page: 'Pending' doesn't show pending PIREPs [\#427](https://github.com/nabeelio/phpvms/issues/427) +- Email when news sent out [\#391](https://github.com/nabeelio/phpvms/issues/391) +- Save cron last run time [\#386](https://github.com/nabeelio/phpvms/issues/386) + +**Merged pull requests:** + +- 7.0.0-beta3 Release [\#541](https://github.com/nabeelio/phpvms/pull/541) + +## [7.0.0-beta.2](https://github.com/nabeelio/phpvms/tree/7.0.0-beta.2) (2019-11-19) + +[Full Changelog](https://github.com/nabeelio/phpvms/compare/v7.0.0-beta...7.0.0-beta.2) + +**Implemented enhancements:** + +- CSS Love needed for the Flights Page [\#418](https://github.com/nabeelio/phpvms/issues/418) +- Add Subfleet, Custom Fields and Fares during initial schedule entry [\#410](https://github.com/nabeelio/phpvms/issues/410) +- PIREP from flight/bid; orig: Bid not removed after flight accepted [\#406](https://github.com/nabeelio/phpvms/issues/406) +- Auto airport lookup [\#404](https://github.com/nabeelio/phpvms/issues/404) +- API Changes [\#389](https://github.com/nabeelio/phpvms/issues/389) +- "Maintenance" section in admin [\#376](https://github.com/nabeelio/phpvms/issues/376) +- Auto-calculate Distance on Add Flight page [\#355](https://github.com/nabeelio/phpvms/issues/355) +- Change PIREP fuel field type [\#340](https://github.com/nabeelio/phpvms/issues/340) +- Fuel in pireps [\#295](https://github.com/nabeelio/phpvms/issues/295) +- Add field to set aircraft location [\#277](https://github.com/nabeelio/phpvms/issues/277) +- Suggestion: edit pilot ID [\#265](https://github.com/nabeelio/phpvms/issues/265) +- Combine subfleet and aircraft export [\#233](https://github.com/nabeelio/phpvms/issues/233) +- Allow URL for downloads [\#229](https://github.com/nabeelio/phpvms/issues/229) +- Move settings into database seeder [\#224](https://github.com/nabeelio/phpvms/issues/224) +- Allow specifying transfer hours on registration [\#129](https://github.com/nabeelio/phpvms/issues/129) +- Backend changes separating id from pilot\_id [\#324](https://github.com/nabeelio/phpvms/pull/324) + +**Fixed bugs:** + +- Flight ID's and Airport ICAO's not clickable on airport page [\#419](https://github.com/nabeelio/phpvms/issues/419) +- Distance lookup needs bcmath extension [\#407](https://github.com/nabeelio/phpvms/issues/407) +- Missing flight level field on frontend [\#401](https://github.com/nabeelio/phpvms/issues/401) +- Set distance to 0 if no value [\#400](https://github.com/nabeelio/phpvms/issues/400) +- Upload livery via admin [\#398](https://github.com/nabeelio/phpvms/issues/398) +- Block deleting airline if there are assets associated with it [\#367](https://github.com/nabeelio/phpvms/issues/367) +- Cron not calculating number of flights [\#357](https://github.com/nabeelio/phpvms/issues/357) +- Error Seeing data of pilot profile [\#351](https://github.com/nabeelio/phpvms/issues/351) +- Fresh install doesn't create rank [\#346](https://github.com/nabeelio/phpvms/issues/346) +- Fuel cost only allows whole numbers for price [\#342](https://github.com/nabeelio/phpvms/issues/342) +- API calls in subfolder going to root domain [\#339](https://github.com/nabeelio/phpvms/issues/339) +- Errors versión 7.0.0 \(compilación 181025-6f7735\) [\#332](https://github.com/nabeelio/phpvms/issues/332) +- Error on Install [\#303](https://github.com/nabeelio/phpvms/issues/303) +- Having a "Error 505" when trying to install PHPVMS [\#302](https://github.com/nabeelio/phpvms/issues/302) +- Error when viewing profile or trying to add flights [\#291](https://github.com/nabeelio/phpvms/issues/291) +- "Hubs as home airport" doesn't work [\#288](https://github.com/nabeelio/phpvms/issues/288) +- Undocumented Extension Required - PHP 7.2 GMP [\#285](https://github.com/nabeelio/phpvms/issues/285) +- ErrorException Trying to get property 'name' of non-object [\#281](https://github.com/nabeelio/phpvms/issues/281) + +**Closed issues:** + +- Add settings.yaml changes to update available check [\#437](https://github.com/nabeelio/phpvms/issues/437) +- Write current version to DB [\#428](https://github.com/nabeelio/phpvms/issues/428) +- Message for configuring cron [\#424](https://github.com/nabeelio/phpvms/issues/424) +- Opt in for telemetry on install [\#415](https://github.com/nabeelio/phpvms/issues/415) +- Error when saving a PIREP without filling some fields and attempting to edit it [\#414](https://github.com/nabeelio/phpvms/issues/414) +- Update htaccess file [\#412](https://github.com/nabeelio/phpvms/issues/412) +- Allow typing in drop down menus [\#409](https://github.com/nabeelio/phpvms/issues/409) +- Malformed email error on file [\#402](https://github.com/nabeelio/phpvms/issues/402) +- Residual design issues from Bootstrap update [\#397](https://github.com/nabeelio/phpvms/issues/397) +- Don't allow PIREP cancel if not in PENDING phase [\#395](https://github.com/nabeelio/phpvms/issues/395) +- Pageable Criteria [\#390](https://github.com/nabeelio/phpvms/issues/390) +- Update CSS Libraries [\#387](https://github.com/nabeelio/phpvms/issues/387) +- Laravel 6 [\#384](https://github.com/nabeelio/phpvms/issues/384) +- Profile menu dropdown [\#383](https://github.com/nabeelio/phpvms/issues/383) +- Update vaCentral Library [\#380](https://github.com/nabeelio/phpvms/issues/380) +- Implement Laravel 5.7 Notifications [\#378](https://github.com/nabeelio/phpvms/issues/378) +- Generate random cache prefix on install [\#374](https://github.com/nabeelio/phpvms/issues/374) +- Move transaction/journal code out of controller [\#370](https://github.com/nabeelio/phpvms/issues/370) +- Add Contract for Airport information lookup [\#363](https://github.com/nabeelio/phpvms/issues/363) +- RFC7807 - Standardize API error messages [\#361](https://github.com/nabeelio/phpvms/issues/361) +- Imposible delete bid [\#360](https://github.com/nabeelio/phpvms/issues/360) +- Change theme from settings [\#359](https://github.com/nabeelio/phpvms/issues/359) +- Integration with PACX \[Feature\] [\#338](https://github.com/nabeelio/phpvms/issues/338) +- Why don't you create a free ACARS for PHPVMS7 testing? [\#336](https://github.com/nabeelio/phpvms/issues/336) +- Error add Roles [\#334](https://github.com/nabeelio/phpvms/issues/334) +- Error during installation [\#333](https://github.com/nabeelio/phpvms/issues/333) +- spatie - laravel-backup [\#330](https://github.com/nabeelio/phpvms/issues/330) +- Refactor data seeding [\#329](https://github.com/nabeelio/phpvms/issues/329) +- Notify/download latest version file as part of cron [\#327](https://github.com/nabeelio/phpvms/issues/327) +- Notify if migration/updates are pending [\#326](https://github.com/nabeelio/phpvms/issues/326) +- PIREP ID change [\#318](https://github.com/nabeelio/phpvms/issues/318) +- Missing folders on install [\#316](https://github.com/nabeelio/phpvms/issues/316) +- Pull in VMACars plugin [\#315](https://github.com/nabeelio/phpvms/issues/315) +- Account for fuel in the finances [\#313](https://github.com/nabeelio/phpvms/issues/313) +- Show module in the external website [\#310](https://github.com/nabeelio/phpvms/issues/310) +- Profile picture distorted [\#309](https://github.com/nabeelio/phpvms/issues/309) +- Implement cachable in models [\#307](https://github.com/nabeelio/phpvms/issues/307) +- update [\#305](https://github.com/nabeelio/phpvms/issues/305) +- Error with installer - Permission denied [\#298](https://github.com/nabeelio/phpvms/issues/298) +- No Staff Groups/ Authorised Permissions [\#296](https://github.com/nabeelio/phpvms/issues/296) +- .css and .js 404 [\#294](https://github.com/nabeelio/phpvms/issues/294) +- Error on Install [\#292](https://github.com/nabeelio/phpvms/issues/292) +- Ability to change interval of cron jobs [\#289](https://github.com/nabeelio/phpvms/issues/289) +- ACARS api add response [\#287](https://github.com/nabeelio/phpvms/issues/287) +- No bids returned in json [\#286](https://github.com/nabeelio/phpvms/issues/286) +- Importing \*.csv with special characters [\#282](https://github.com/nabeelio/phpvms/issues/282) +- laravel-theme doesn't seem to be respecting the theme.json extends [\#279](https://github.com/nabeelio/phpvms/issues/279) +- Flight for current location not being restricted [\#263](https://github.com/nabeelio/phpvms/issues/263) +- Self diagnosis [\#253](https://github.com/nabeelio/phpvms/issues/253) +- Add /api/pireps/validate endpoint [\#247](https://github.com/nabeelio/phpvms/issues/247) +- Cosmetic issues [\#245](https://github.com/nabeelio/phpvms/issues/245) +- GDPR Compliance [\#244](https://github.com/nabeelio/phpvms/issues/244) +- Read all settings into the page session [\#243](https://github.com/nabeelio/phpvms/issues/243) +- Open Airspace [\#241](https://github.com/nabeelio/phpvms/issues/241) +- Option to cancel PIREP [\#238](https://github.com/nabeelio/phpvms/issues/238) +- Navdata sources [\#231](https://github.com/nabeelio/phpvms/issues/231) +- Refactor export, use streamed response [\#227](https://github.com/nabeelio/phpvms/issues/227) +- Add expense multiplier to subfleet [\#206](https://github.com/nabeelio/phpvms/issues/206) +- Expenses [\#136](https://github.com/nabeelio/phpvms/issues/136) +- Finances [\#130](https://github.com/nabeelio/phpvms/issues/130) +- phpVMS Classic Importer [\#114](https://github.com/nabeelio/phpvms/issues/114) +- Setup cron tasks [\#95](https://github.com/nabeelio/phpvms/issues/95) +- Warning in admin if Installer module is still present [\#77](https://github.com/nabeelio/phpvms/issues/77) +- flight planning [\#60](https://github.com/nabeelio/phpvms/issues/60) + +**Merged pull requests:** + +- Merge 7.0.0-beta.2 to master [\#440](https://github.com/nabeelio/phpvms/pull/440) +- Refactor the upgrade pending check to see if there are settings/permi… [\#438](https://github.com/nabeelio/phpvms/pull/438) +- Fixes [\#435](https://github.com/nabeelio/phpvms/pull/435) +- \#406 Refactor bids [\#432](https://github.com/nabeelio/phpvms/pull/432) +- fixes for issue \#419 [\#429](https://github.com/nabeelio/phpvms/pull/429) +- Wrap values in travis env [\#426](https://github.com/nabeelio/phpvms/pull/426) +- Show a message about setting up the cron and if there was an error ru… [\#425](https://github.com/nabeelio/phpvms/pull/425) +- 359 Select theme in settings [\#423](https://github.com/nabeelio/phpvms/pull/423) +- Fix blank aircraft field causing error closes \#414 [\#422](https://github.com/nabeelio/phpvms/pull/422) +- Bundle CSS changes [\#421](https://github.com/nabeelio/phpvms/pull/421) +- Some minor CSS fixes as discussed on Discord [\#420](https://github.com/nabeelio/phpvms/pull/420) +- Move telemetry option into settings; checkbox in install refs \#415 [\#416](https://github.com/nabeelio/phpvms/pull/416) +- Issue fixes [\#413](https://github.com/nabeelio/phpvms/pull/413) +- Catch error messages in notifying [\#403](https://github.com/nabeelio/phpvms/pull/403) +- Design and file upload issues [\#399](https://github.com/nabeelio/phpvms/pull/399) +- Don't allow cancels from certain states [\#396](https://github.com/nabeelio/phpvms/pull/396) +- Fix map checkout call [\#394](https://github.com/nabeelio/phpvms/pull/394) +- 389 API Changes [\#393](https://github.com/nabeelio/phpvms/pull/393) +- CSS Libraries and style updates [\#388](https://github.com/nabeelio/phpvms/pull/388) +- 384 Laravel 6 changes [\#385](https://github.com/nabeelio/phpvms/pull/385) +- 380 vacentral library [\#381](https://github.com/nabeelio/phpvms/pull/381) +- Use Notification/Notifiable [\#379](https://github.com/nabeelio/phpvms/pull/379) +- Add maintenance section to admin, clear caches \#376 [\#377](https://github.com/nabeelio/phpvms/pull/377) +- Refactor all JS API calls \#360 [\#375](https://github.com/nabeelio/phpvms/pull/375) +- Set the baseURL for ajax requests [\#373](https://github.com/nabeelio/phpvms/pull/373) +- Move airline transaction code into service layer [\#371](https://github.com/nabeelio/phpvms/pull/371) +- 229 url for downloads [\#369](https://github.com/nabeelio/phpvms/pull/369) +- \#355 Calculate distance button [\#366](https://github.com/nabeelio/phpvms/pull/366) +- Add Contract interface for airport lookup functionality [\#365](https://github.com/nabeelio/phpvms/pull/365) +- Refactor error handling internally to follow RFC7807 [\#362](https://github.com/nabeelio/phpvms/pull/362) +- Additional logging for the stats recalculation [\#358](https://github.com/nabeelio/phpvms/pull/358) +- Add missing expiry time for PIREP API [\#356](https://github.com/nabeelio/phpvms/pull/356) +- Fix/metar reading [\#354](https://github.com/nabeelio/phpvms/pull/354) +- Fix/metar reading [\#353](https://github.com/nabeelio/phpvms/pull/353) +- Add setting to include transfer hours in calculations [\#350](https://github.com/nabeelio/phpvms/pull/350) +- Remove ext-cal from requirements list [\#349](https://github.com/nabeelio/phpvms/pull/349) +- Multiple ticket crash fixes [\#347](https://github.com/nabeelio/phpvms/pull/347) +- Issue/327 versioning [\#345](https://github.com/nabeelio/phpvms/pull/345) +- Update issue templates [\#344](https://github.com/nabeelio/phpvms/pull/344) +- Add step fields to enable decimal points on fields \#342 [\#343](https://github.com/nabeelio/phpvms/pull/343) +- Issue fixes [\#341](https://github.com/nabeelio/phpvms/pull/341) +- Issue/329 refactor seeding [\#337](https://github.com/nabeelio/phpvms/pull/337) +- Fix issue where user stats aren't incremented on PIREP auto accept [\#335](https://github.com/nabeelio/phpvms/pull/335) +- Account for fuel in the finance calculations \#313 [\#331](https://github.com/nabeelio/phpvms/pull/331) +- Middleware to detect is update is pending; move Routes into HTTP [\#328](https://github.com/nabeelio/phpvms/pull/328) +- Change exporter to use utf-8 close \#282 [\#325](https://github.com/nabeelio/phpvms/pull/325) +- Rename Interfaces to Contracts to better match Laravel conventions [\#323](https://github.com/nabeelio/phpvms/pull/323) +- Cleanup SI Unit classes; METAR fixes [\#322](https://github.com/nabeelio/phpvms/pull/322) +- Bump lodash from 4.17.11 to 4.17.13 [\#321](https://github.com/nabeelio/phpvms/pull/321) +- Update composer library versions [\#320](https://github.com/nabeelio/phpvms/pull/320) +- Add missing folders under storage/public \#316 [\#319](https://github.com/nabeelio/phpvms/pull/319) +- Add interface to additional roles/permissions \#296 [\#314](https://github.com/nabeelio/phpvms/pull/314) +- Fix pax count fields; add fuel used field \#295 [\#312](https://github.com/nabeelio/phpvms/pull/312) +- Apply fixes from StyleCI [\#311](https://github.com/nabeelio/phpvms/pull/311) +- Laravel 5.8 Update [\#308](https://github.com/nabeelio/phpvms/pull/308) +- Add more search criteria/dev environment via docker-compose \#297 [\#306](https://github.com/nabeelio/phpvms/pull/306) +- Add gmp to requirements in install \#285 [\#301](https://github.com/nabeelio/phpvms/pull/301) +- Revert "Update issue templates" [\#300](https://github.com/nabeelio/phpvms/pull/300) +- Update issue templates [\#299](https://github.com/nabeelio/phpvms/pull/299) + +## [v7.0.0-beta](https://github.com/nabeelio/phpvms/tree/v7.0.0-beta) (2018-10-25) + +[Full Changelog](https://github.com/nabeelio/phpvms/compare/v7.0.0-alpha2...v7.0.0-beta) + +**Implemented enhancements:** + +- Follow flight checkbox on live map [\#246](https://github.com/nabeelio/phpvms/issues/246) +- PIREP restrictions based on settings [\#221](https://github.com/nabeelio/phpvms/issues/221) +- Save PIREP as draft [\#220](https://github.com/nabeelio/phpvms/issues/220) +- Shorten fields on flights table [\#205](https://github.com/nabeelio/phpvms/issues/205) +- Show bids in profile [\#203](https://github.com/nabeelio/phpvms/issues/203) +- Don't change rank if current rank is higher than the one found [\#196](https://github.com/nabeelio/phpvms/issues/196) +- pagination sizes [\#162](https://github.com/nabeelio/phpvms/issues/162) +- Allow overriding templates [\#161](https://github.com/nabeelio/phpvms/issues/161) +- Replace old pjax library with newer one [\#133](https://github.com/nabeelio/phpvms/issues/133) +- Awards [\#113](https://github.com/nabeelio/phpvms/issues/113) +- Setting to restrict airport selection to hubs [\#104](https://github.com/nabeelio/phpvms/issues/104) +- Pilot leave status [\#96](https://github.com/nabeelio/phpvms/issues/96) +- schedule import [\#15](https://github.com/nabeelio/phpvms/issues/15) + +**Fixed bugs:** + +- Error saving PIREP [\#252](https://github.com/nabeelio/phpvms/issues/252) +- Updater with modules not working [\#249](https://github.com/nabeelio/phpvms/issues/249) +- User registration country and timezone not saving [\#223](https://github.com/nabeelio/phpvms/issues/223) +- Importer inserts invalid data on empty columns/rows [\#222](https://github.com/nabeelio/phpvms/issues/222) +- Import/export - missing fields [\#219](https://github.com/nabeelio/phpvms/issues/219) +- Country flag not showing on user list [\#218](https://github.com/nabeelio/phpvms/issues/218) +- fares/subfleet unique field blocks saving [\#214](https://github.com/nabeelio/phpvms/issues/214) +- module navigation not working \(admin\) [\#201](https://github.com/nabeelio/phpvms/issues/201) +- Bid not removed when pirep if filled [\#200](https://github.com/nabeelio/phpvms/issues/200) +- Not saving Flight Time [\#199](https://github.com/nabeelio/phpvms/issues/199) + +**Closed issues:** + +- SettingsController/Repo are saving as "on" instead of 1/true [\#272](https://github.com/nabeelio/phpvms/issues/272) +- Auto Accept New Pilot isn't working [\#269](https://github.com/nabeelio/phpvms/issues/269) +- Suggestion: button to copy aircraft [\#267](https://github.com/nabeelio/phpvms/issues/267) +- Combine aircraft and subfleet import/export into one [\#256](https://github.com/nabeelio/phpvms/issues/256) +- cron - recalculate hours [\#254](https://github.com/nabeelio/phpvms/issues/254) +- Install Directory is missing from git repo [\#251](https://github.com/nabeelio/phpvms/issues/251) +- Warning: require\(C:\xampp\Virtual Airline Website\bootstrap/../vendor/autoload.php\): failed to open stream: No such file or directory in C:\xampp\Virtual Airline Website\bootstrap\autoload.php on line 17 [\#248](https://github.com/nabeelio/phpvms/issues/248) +- Settings [\#239](https://github.com/nabeelio/phpvms/issues/239) +- HTTP caching [\#237](https://github.com/nabeelio/phpvms/issues/237) +- Module artisan command bug [\#234](https://github.com/nabeelio/phpvms/issues/234) +- Add /api/news [\#232](https://github.com/nabeelio/phpvms/issues/232) +- Start date/end date, along with day of week options [\#230](https://github.com/nabeelio/phpvms/issues/230) +- Replace weather lookup [\#228](https://github.com/nabeelio/phpvms/issues/228) +- File/avatar uploads [\#226](https://github.com/nabeelio/phpvms/issues/226) +- Change fleet page to load subfleets first [\#217](https://github.com/nabeelio/phpvms/issues/217) +- Add sort options [\#216](https://github.com/nabeelio/phpvms/issues/216) +- Auto loader on Line 17 [\#215](https://github.com/nabeelio/phpvms/issues/215) +- Add flight fields [\#213](https://github.com/nabeelio/phpvms/issues/213) +- Recaptcha in registration [\#212](https://github.com/nabeelio/phpvms/issues/212) +- Browser tests [\#211](https://github.com/nabeelio/phpvms/issues/211) +- Axios HTTP library [\#210](https://github.com/nabeelio/phpvms/issues/210) +- Replace skinning with laravel-theme [\#209](https://github.com/nabeelio/phpvms/issues/209) +- Refactor getting expenses in FinanceData [\#208](https://github.com/nabeelio/phpvms/issues/208) +- Change all money to hold in cents, not dollars [\#204](https://github.com/nabeelio/phpvms/issues/204) +- Pilot pay - rank base and subfleet multiplier [\#197](https://github.com/nabeelio/phpvms/issues/197) +- Flight schedule importer/exporter [\#194](https://github.com/nabeelio/phpvms/issues/194) +- use find/replace in bootstrapWith\(\) call [\#163](https://github.com/nabeelio/phpvms/issues/163) +- Awards [\#155](https://github.com/nabeelio/phpvms/issues/155) +- System Changes/Additions [\#135](https://github.com/nabeelio/phpvms/issues/135) +- Airport & Aircraft Changes [\#134](https://github.com/nabeelio/phpvms/issues/134) +- Handle flight specific fares & multipliers [\#125](https://github.com/nabeelio/phpvms/issues/125) +- Flight set day of week [\#122](https://github.com/nabeelio/phpvms/issues/122) +- Airport page [\#85](https://github.com/nabeelio/phpvms/issues/85) +- Bulk upload charts to airport [\#84](https://github.com/nabeelio/phpvms/issues/84) +- Pull some values from existing .env file [\#79](https://github.com/nabeelio/phpvms/issues/79) +- METAR Information [\#61](https://github.com/nabeelio/phpvms/issues/61) +- flights page [\#57](https://github.com/nabeelio/phpvms/issues/57) +- fuel costs to airports and fuel type on subfleet [\#41](https://github.com/nabeelio/phpvms/issues/41) +- generate aircraft hex code on create [\#33](https://github.com/nabeelio/phpvms/issues/33) + +**Merged pull requests:** + +- More acceptable translation to opt-in \(es\) [\#284](https://github.com/nabeelio/phpvms/pull/284) +- Fix 404s to requirements/setup in README.md [\#283](https://github.com/nabeelio/phpvms/pull/283) +- Hide expired live flight from live map and remove from DB [\#280](https://github.com/nabeelio/phpvms/pull/280) +- \[WIP\] Laravel 5.7 Update [\#278](https://github.com/nabeelio/phpvms/pull/278) +- Make admin input outline darker [\#276](https://github.com/nabeelio/phpvms/pull/276) +- capture & display pilot transfer hours [\#275](https://github.com/nabeelio/phpvms/pull/275) +- Optimize query with eager loading [\#274](https://github.com/nabeelio/phpvms/pull/274) +- Fix SettingsController saving boolean value as 'on' [\#273](https://github.com/nabeelio/phpvms/pull/273) +- Hide inactive pilot from pilot list page [\#271](https://github.com/nabeelio/phpvms/pull/271) +- Fix flight search restriction [\#270](https://github.com/nabeelio/phpvms/pull/270) +- Apply fixes from StyleCI [\#268](https://github.com/nabeelio/phpvms/pull/268) +- Fix METAR issue [\#264](https://github.com/nabeelio/phpvms/pull/264) +- Apply fixes from StyleCI [\#262](https://github.com/nabeelio/phpvms/pull/262) +- Apply fixes from StyleCI [\#261](https://github.com/nabeelio/phpvms/pull/261) +- Enable eager loading [\#259](https://github.com/nabeelio/phpvms/pull/259) +- Implement cron to remove expired bids [\#258](https://github.com/nabeelio/phpvms/pull/258) +- Fix timezone list HTML Escaped [\#257](https://github.com/nabeelio/phpvms/pull/257) +- Update 07/13/2018 es-translations [\#255](https://github.com/nabeelio/phpvms/pull/255) +- ES translation [\#250](https://github.com/nabeelio/phpvms/pull/250) +- flights filtered per va [\#242](https://github.com/nabeelio/phpvms/pull/242) +- Avatar Issue [\#236](https://github.com/nabeelio/phpvms/pull/236) +- Install bug [\#235](https://github.com/nabeelio/phpvms/pull/235) + +## [v7.0.0-alpha2](https://github.com/nabeelio/phpvms/tree/v7.0.0-alpha2) (2018-02-23) + +[Full Changelog](https://github.com/nabeelio/phpvms/compare/v7.0.0-alpha1...v7.0.0-alpha2) + +**Implemented enhancements:** + +- Get user PIREPs [\#192](https://github.com/nabeelio/phpvms/issues/192) +- Use time conversion class [\#190](https://github.com/nabeelio/phpvms/issues/190) +- Require inputs in Imperial units [\#189](https://github.com/nabeelio/phpvms/issues/189) +- Make planned\_distance in prefile optional [\#185](https://github.com/nabeelio/phpvms/issues/185) +- If there's no /pirep/route calls, when it's filed, write the route [\#184](https://github.com/nabeelio/phpvms/issues/184) +- Create a /api/flight/{id}/route call [\#183](https://github.com/nabeelio/phpvms/issues/183) +- Make all APIs behind auth [\#173](https://github.com/nabeelio/phpvms/issues/173) +- Add bid [\#172](https://github.com/nabeelio/phpvms/issues/172) +- Setting for only showing aircraft that are at the departure airport [\#171](https://github.com/nabeelio/phpvms/issues/171) +- Font for input [\#169](https://github.com/nabeelio/phpvms/issues/169) +- Read default value from settings table [\#106](https://github.com/nabeelio/phpvms/issues/106) + +**Fixed bugs:** + +- Volume units to lbs/kg, not gal/liter [\#193](https://github.com/nabeelio/phpvms/issues/193) +- Add country to airline missing [\#191](https://github.com/nabeelio/phpvms/issues/191) +- SKIN\_NAME missing on error pages [\#187](https://github.com/nabeelio/phpvms/issues/187) +- Airport timezone not being saved [\#182](https://github.com/nabeelio/phpvms/issues/182) +- Rank checkboxes not being saved [\#181](https://github.com/nabeelio/phpvms/issues/181) +- Make sure cancelled PIREPs don't show [\#180](https://github.com/nabeelio/phpvms/issues/180) +- Ignore cancelled PIREPs in duplicate check [\#179](https://github.com/nabeelio/phpvms/issues/179) +- Make sure all fields are returned in PIREP object [\#178](https://github.com/nabeelio/phpvms/issues/178) +- autopopulate SOURCE field in ACARS [\#177](https://github.com/nabeelio/phpvms/issues/177) +- Make sure pireps.restrict\_aircraft\_to\_rank is respected [\#170](https://github.com/nabeelio/phpvms/issues/170) +- Don't change rank if current rank is non-auto promoting [\#168](https://github.com/nabeelio/phpvms/issues/168) +- PIREP hours can't be changed [\#167](https://github.com/nabeelio/phpvms/issues/167) +- Changing a flight status does not save [\#150](https://github.com/nabeelio/phpvms/issues/150) +- Additional PIREP fields don't save correctly [\#146](https://github.com/nabeelio/phpvms/issues/146) + +**Closed issues:** + +- Cleanup icons [\#195](https://github.com/nabeelio/phpvms/issues/195) +- remove raw\_data field from pirep table [\#188](https://github.com/nabeelio/phpvms/issues/188) +- Remove Resource::withoutWrapping\(\) to follow jsonapi spec [\#186](https://github.com/nabeelio/phpvms/issues/186) +- Add an `artisan phpvms:dev-install` command [\#176](https://github.com/nabeelio/phpvms/issues/176) +- Pagination settings [\#175](https://github.com/nabeelio/phpvms/issues/175) +- Implement setting for flights at pilot's current airport [\#174](https://github.com/nabeelio/phpvms/issues/174) +- Minimum PHP supported version to 7.1 [\#166](https://github.com/nabeelio/phpvms/issues/166) +- Update to Laravel 5.6 [\#165](https://github.com/nabeelio/phpvms/issues/165) +- Updater [\#164](https://github.com/nabeelio/phpvms/issues/164) +- Allow adding rank in subfleet page [\#160](https://github.com/nabeelio/phpvms/issues/160) +- Docs [\#153](https://github.com/nabeelio/phpvms/issues/153) + +## [v7.0.0-alpha1](https://github.com/nabeelio/phpvms/tree/v7.0.0-alpha1) (2018-02-04) + +[Full Changelog](https://github.com/nabeelio/phpvms/compare/f158c11dea7c0a4af27c93382333b67fdc531e3a...v7.0.0-alpha1) + +**Implemented enhancements:** + +- Widgetized components [\#127](https://github.com/nabeelio/phpvms/issues/127) +- Set aircraft location on landing [\#112](https://github.com/nabeelio/phpvms/issues/112) +- save user IP on login [\#110](https://github.com/nabeelio/phpvms/issues/110) +- When rejecting PIREP, add a comment/reason [\#107](https://github.com/nabeelio/phpvms/issues/107) +- Check for duplicate PIREPs and add setting [\#105](https://github.com/nabeelio/phpvms/issues/105) +- create vendor.js with webpack [\#91](https://github.com/nabeelio/phpvms/issues/91) +- move from bower to webpack [\#90](https://github.com/nabeelio/phpvms/issues/90) +- Pilots list and profile [\#82](https://github.com/nabeelio/phpvms/issues/82) +- pirep auto-accept for certain rankings [\#24](https://github.com/nabeelio/phpvms/issues/24) +- Investigate removing the Repository pattern to simplify [\#6](https://github.com/nabeelio/phpvms/issues/6) + +**Fixed bugs:** + +- Error when sending /api/pireps/prefile [\#149](https://github.com/nabeelio/phpvms/issues/149) +- Extra numbers on flights page [\#148](https://github.com/nabeelio/phpvms/issues/148) +- Unable to select any aircraft from fleet on file PIREP page [\#147](https://github.com/nabeelio/phpvms/issues/147) +- Error thrown when editing a saved flight [\#145](https://github.com/nabeelio/phpvms/issues/145) +- When you delete flight from admin, filed pirep will throw error [\#144](https://github.com/nabeelio/phpvms/issues/144) +- Avoid calling MySQL executable for creating database [\#132](https://github.com/nabeelio/phpvms/issues/132) +- Aircraft can be added without specifying a subfleet [\#128](https://github.com/nabeelio/phpvms/issues/128) +- Non error flash messages not showing [\#126](https://github.com/nabeelio/phpvms/issues/126) +- Removing subfleet from flight [\#124](https://github.com/nabeelio/phpvms/issues/124) +- User still has API access if they're not ACTIVE [\#119](https://github.com/nabeelio/phpvms/issues/119) +- Delete bids when flight is deleted [\#103](https://github.com/nabeelio/phpvms/issues/103) +- JSON error messages [\#92](https://github.com/nabeelio/phpvms/issues/92) +- add subfleet to flight broken [\#88](https://github.com/nabeelio/phpvms/issues/88) +- logout functionality not working from frontpage [\#26](https://github.com/nabeelio/phpvms/issues/26) + +**Closed issues:** + +- `fuel\_used` in pirep/file [\#159](https://github.com/nabeelio/phpvms/issues/159) +- Add additional fields for PIREP and flights [\#158](https://github.com/nabeelio/phpvms/issues/158) +- Stub file [\#157](https://github.com/nabeelio/phpvms/issues/157) +- Add config.php in root on install [\#156](https://github.com/nabeelio/phpvms/issues/156) +- New registrations are auto-accepted and put as active [\#151](https://github.com/nabeelio/phpvms/issues/151) +- new version alert [\#143](https://github.com/nabeelio/phpvms/issues/143) +- Footer copyright text [\#142](https://github.com/nabeelio/phpvms/issues/142) +- Version build number to use string/assigned date [\#141](https://github.com/nabeelio/phpvms/issues/141) +- Handle duplicate flight number [\#139](https://github.com/nabeelio/phpvms/issues/139) +- Restrict shown aircraft to user's rank [\#138](https://github.com/nabeelio/phpvms/issues/138) +- Docs [\#137](https://github.com/nabeelio/phpvms/issues/137) +- Checksum for tarball [\#123](https://github.com/nabeelio/phpvms/issues/123) +- API Items need [\#120](https://github.com/nabeelio/phpvms/issues/120) +- ACARS API [\#118](https://github.com/nabeelio/phpvms/issues/118) +- List of cron jobs required [\#117](https://github.com/nabeelio/phpvms/issues/117) +- Add create/edit fields for columns [\#111](https://github.com/nabeelio/phpvms/issues/111) +- Add PIREP cancel endpoint and cleanup job [\#109](https://github.com/nabeelio/phpvms/issues/109) +- ACARS table should save the route [\#102](https://github.com/nabeelio/phpvms/issues/102) +- /api/fleet and /api/user/fleet [\#101](https://github.com/nabeelio/phpvms/issues/101) +- Assign subfleets to ranks [\#100](https://github.com/nabeelio/phpvms/issues/100) +- show dates/times in proper timezone [\#97](https://github.com/nabeelio/phpvms/issues/97) +- editable fields not working [\#94](https://github.com/nabeelio/phpvms/issues/94) +- Settings page needs to be completed [\#93](https://github.com/nabeelio/phpvms/issues/93) +- Airport page pagination & search [\#87](https://github.com/nabeelio/phpvms/issues/87) +- Mark airport as hub [\#86](https://github.com/nabeelio/phpvms/issues/86) +- Terms and Conditions & COPPA during registration [\#81](https://github.com/nabeelio/phpvms/issues/81) +- Look at alternative to Entrust [\#78](https://github.com/nabeelio/phpvms/issues/78) +- Check if .env file exists in installer [\#76](https://github.com/nabeelio/phpvms/issues/76) +- upload travis artifact to phpvms ftp as "latest.zip" [\#75](https://github.com/nabeelio/phpvms/issues/75) +- Track hours on airframes [\#73](https://github.com/nabeelio/phpvms/issues/73) +- PIREP accept/reject in admin should call PIREP service [\#72](https://github.com/nabeelio/phpvms/issues/72) +- Error with MySQL syntax when creating database. [\#71](https://github.com/nabeelio/phpvms/issues/71) +- pirep comments [\#70](https://github.com/nabeelio/phpvms/issues/70) +- findWithoutFail Method does not exist [\#69](https://github.com/nabeelio/phpvms/issues/69) +- Commit error 403 [\#67](https://github.com/nabeelio/phpvms/issues/67) +- Keep Showing 404.... [\#66](https://github.com/nabeelio/phpvms/issues/66) +- wrap migrate command [\#65](https://github.com/nabeelio/phpvms/issues/65) +- Create 404 page [\#63](https://github.com/nabeelio/phpvms/issues/63) +- link to admin in nav if you have permissions [\#62](https://github.com/nabeelio/phpvms/issues/62) +- Error while creating database [\#56](https://github.com/nabeelio/phpvms/issues/56) +- shared hosting stuff [\#55](https://github.com/nabeelio/phpvms/issues/55) +- gravatar url for profile [\#54](https://github.com/nabeelio/phpvms/issues/54) +- news and notams module [\#52](https://github.com/nabeelio/phpvms/issues/52) +- try atoum vs phpunit [\#51](https://github.com/nabeelio/phpvms/issues/51) +- Cache Airports calls [\#49](https://github.com/nabeelio/phpvms/issues/49) +- add custom fields table for flights [\#48](https://github.com/nabeelio/phpvms/issues/48) +- Events system [\#43](https://github.com/nabeelio/phpvms/issues/43) +- add fuel costs types to the airports table [\#40](https://github.com/nabeelio/phpvms/issues/40) +- adjust "created" date for airline [\#39](https://github.com/nabeelio/phpvms/issues/39) +- add gross\_weight to PIREPs [\#38](https://github.com/nabeelio/phpvms/issues/38) +- subfleet to flight pivot values [\#37](https://github.com/nabeelio/phpvms/issues/37) +- API authentication/middleware [\#36](https://github.com/nabeelio/phpvms/issues/36) +- REST API [\#35](https://github.com/nabeelio/phpvms/issues/35) +- use uuids on a few tables [\#34](https://github.com/nabeelio/phpvms/issues/34) +- subfleet \(ranks, expenses\) [\#32](https://github.com/nabeelio/phpvms/issues/32) +- How to install this? [\#31](https://github.com/nabeelio/phpvms/issues/31) +- experiment with changing PDO mode [\#30](https://github.com/nabeelio/phpvms/issues/30) +- forgot password [\#27](https://github.com/nabeelio/phpvms/issues/27) +- rankings [\#23](https://github.com/nabeelio/phpvms/issues/23) +- module system [\#22](https://github.com/nabeelio/phpvms/issues/22) +- pireps [\#21](https://github.com/nabeelio/phpvms/issues/21) +- admin user management [\#20](https://github.com/nabeelio/phpvms/issues/20) +- modify DatabaseSeeder to look at env [\#19](https://github.com/nabeelio/phpvms/issues/19) +- look at flarum method of install [\#18](https://github.com/nabeelio/phpvms/issues/18) +- navdata ingestion [\#17](https://github.com/nabeelio/phpvms/issues/17) +- settings panel [\#16](https://github.com/nabeelio/phpvms/issues/16) +- routing and scheduling [\#14](https://github.com/nabeelio/phpvms/issues/14) +- airport details page [\#13](https://github.com/nabeelio/phpvms/issues/13) +- currency format config [\#12](https://github.com/nabeelio/phpvms/issues/12) +- aircraft details page [\#11](https://github.com/nabeelio/phpvms/issues/11) +- user dashboard and profile pages [\#10](https://github.com/nabeelio/phpvms/issues/10) +- admin panel work [\#9](https://github.com/nabeelio/phpvms/issues/9) +- theme/skins engine [\#8](https://github.com/nabeelio/phpvms/issues/8) +- Integrate roles and permissions [\#7](https://github.com/nabeelio/phpvms/issues/7) +- rebuild tables [\#5](https://github.com/nabeelio/phpvms/issues/5) +- front-end template [\#4](https://github.com/nabeelio/phpvms/issues/4) +- Laravel 5.4 [\#3](https://github.com/nabeelio/phpvms/issues/3) +- look up role-based permissions [\#2](https://github.com/nabeelio/phpvms/issues/2) +- installer [\#1](https://github.com/nabeelio/phpvms/issues/1) + +**Merged pull requests:** + +- Fixed a few field entries [\#116](https://github.com/nabeelio/phpvms/pull/116) +- Remove unique email entry [\#115](https://github.com/nabeelio/phpvms/pull/115) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/Makefile b/Makefile index dce22ee5..0d83227a 100644 --- a/Makefile +++ b/Makefile @@ -74,13 +74,13 @@ reload-db: tests: test .PHONY: test -test: +test: phpcs #php artisan database:create --reset vendor/bin/phpunit --debug --verbose .PHONY: phpcs phpcs: - @vendor/bin/php-cs-fixer fix --config=.php_cs -v --diff --dry-run + @vendor/bin/php-cs-fixer fix --config=.php_cs -v --diff --diff-format=udiff --dry-run #.PHONY: phpstan #phpstan: diff --git a/app/Console/Commands/AcarsReplay.php b/app/Console/Commands/AcarsReplay.php index 0fef140f..2734bb00 100644 --- a/app/Console/Commands/AcarsReplay.php +++ b/app/Console/Commands/AcarsReplay.php @@ -3,7 +3,7 @@ namespace App\Console\Commands; use App\Contracts\Command; -use App\Facades\Utils; +use App\Support\Units\Time; use GuzzleHttp\Client; use Illuminate\Database\Eloquent\Collection; @@ -64,7 +64,7 @@ class AcarsReplay extends Command protected function startPirep($flight): string { // convert the planned flight time to be completely in minutes - $pft = Utils::hoursToMinutes( + $pft = Time::hoursToMinutes( $flight->planned_hrsenroute, $flight->planned_minenroute ); diff --git a/app/Console/Commands/ClearCaches.php b/app/Console/Commands/ClearCaches.php new file mode 100644 index 00000000..32791cf9 --- /dev/null +++ b/app/Console/Commands/ClearCaches.php @@ -0,0 +1,41 @@ + 'getMetar', 'recalculate-stats' => 'recalculateStats', 'reset-install' => 'resetInstall', + 'new-user-email' => 'newUserEmail', 'xml-to-yaml' => 'xmlToYaml', ]; @@ -290,6 +292,16 @@ class DevCommands extends Command $this->info('Done!'); } + /** + * Test sending a user a registered email + */ + protected function newUserEmail() + { + $user_id = $this->argument('param'); + $user = User::find($user_id); + $user->notify(new UserRegistered($user)); + } + public function liveFlights(): void { $acarsRepo = app(AcarsRepository::class); diff --git a/app/Console/Commands/Version.php b/app/Console/Commands/Version.php index e4b4a3b6..bbe271b6 100644 --- a/app/Console/Commands/Version.php +++ b/app/Console/Commands/Version.php @@ -34,7 +34,7 @@ class Version extends Command // If a version is being passed in, the update the build, etc data against this if ($this->argument('version')) { $version = \SemVer\SemVer\Version::fromString($this->argument('version')); - if ($this->option('write_full_version')) { + if ($this->option('write-full-version')) { $cfg['current']['major'] = $version->getMajor(); $cfg['current']['minor'] = $version->getMinor(); $cfg['current']['patch'] = $version->getPatch(); @@ -51,14 +51,15 @@ class Version extends Command } // Always write out the build ID/build number which is the commit hash - $build_number = $this->versionSvc->getBuildId($cfg); + $build_number = $this->versionSvc->generateBuildId($cfg); $cfg['current']['commit'] = $build_number; $cfg['build']['number'] = $build_number; file_put_contents($version_file, Yaml::dump($cfg, 4, 2)); } - $version = $this->versionSvc->getCurrentVersion(!$this->option('base-only')); + $incl_build = empty($this->option('base-only')) ? true : false; + $version = $this->versionSvc->getCurrentVersion($incl_build); echo $version."\n"; } } diff --git a/app/Contracts/Award.php b/app/Contracts/Award.php index 36c382e2..d7c3d337 100644 --- a/app/Contracts/Award.php +++ b/app/Contracts/Award.php @@ -2,10 +2,10 @@ namespace App\Contracts; -use App\Facades\Utils; use App\Models\Award as AwardModel; use App\Models\User; use App\Models\UserAward; +use App\Support\Utils; use Exception; use Illuminate\Support\Facades\Log; diff --git a/app/Contracts/Composer.php b/app/Contracts/Composer.php new file mode 100644 index 00000000..2196e2a2 --- /dev/null +++ b/app/Contracts/Composer.php @@ -0,0 +1,10 @@ +error($message); + Flash::error($message); return redirect(route($route))->withInput(); } diff --git a/app/Contracts/Enum.php b/app/Contracts/Enum.php index 49873aca..5d3c93cb 100644 --- a/app/Contracts/Enum.php +++ b/app/Contracts/Enum.php @@ -46,7 +46,12 @@ abstract class Enum final public static function label($value) { if (isset(static::$labels[$value])) { - return trans(static::$labels[$value]); + $val = static::$labels[$value]; + if (strpos($val, '.') !== false) { + return trans($val); + } + + return $val; } } diff --git a/app/Contracts/FormRequest.php b/app/Contracts/FormRequest.php index 93eb8a0c..8a05d859 100644 --- a/app/Contracts/FormRequest.php +++ b/app/Contracts/FormRequest.php @@ -2,15 +2,16 @@ namespace App\Contracts; -/** - * Class FormRequest - */ +use Illuminate\Validation\Rule; + class FormRequest extends \Illuminate\Foundation\Http\FormRequest { /** + * Authorized by default + * * @return bool */ - public function authorize() + public function authorize(): bool { return true; } @@ -18,8 +19,22 @@ class FormRequest extends \Illuminate\Foundation\Http\FormRequest /** * @return array */ - public function rules() + public function rules(): array { return []; } + + /** + * Set a given column as being unique + * + * @param $table + * + * @return array + */ + public function unique($table) + { + return [ + Rule::unique($table)->ignore($this->id, 'id'), + ]; + } } diff --git a/app/Contracts/Model.php b/app/Contracts/Model.php index bb9d0ddc..bb56dec7 100644 --- a/app/Contracts/Model.php +++ b/app/Contracts/Model.php @@ -13,7 +13,7 @@ abstract class Model extends \Illuminate\Database\Eloquent\Model /** * Max length of ID for string columns */ - public const ID_MAX_LENGTH = 12; + public const ID_MAX_LENGTH = 16; /** * For the factories, skip the mutators. Only apply to one instance diff --git a/app/Contracts/Repository.php b/app/Contracts/Repository.php index 288b44a7..191f6f40 100644 --- a/app/Contracts/Repository.php +++ b/app/Contracts/Repository.php @@ -5,6 +5,9 @@ namespace App\Contracts; use Illuminate\Validation\Validator; use Prettus\Repository\Eloquent\BaseRepository; +/** + * @mixin \Prettus\Repository\Eloquent\BaseRepository + */ abstract class Repository extends BaseRepository { /** diff --git a/app/Http/Resources/Response.php b/app/Contracts/Resource.php similarity index 78% rename from app/Http/Resources/Response.php rename to app/Contracts/Resource.php index 10962f9e..b4f47f98 100644 --- a/app/Http/Resources/Response.php +++ b/app/Contracts/Resource.php @@ -1,14 +1,11 @@ responseUnits as $unit) { - $response[$unit] = $this[$unit]; + $response[$unit] = $this[$unit] ?? 0; } return $response; diff --git a/app/Cron/Nightly/ClearExpiredSimbrief.php b/app/Cron/Nightly/ClearExpiredSimbrief.php new file mode 100644 index 00000000..56ae8156 --- /dev/null +++ b/app/Cron/Nightly/ClearExpiredSimbrief.php @@ -0,0 +1,28 @@ +simbriefSvc = $simbriefSvc; + } + + /** + * @param \App\Events\CronNightly $event + */ + public function handle(CronNightly $event): void + { + $this->simbriefSvc->removeExpiredEntries(); + } +} diff --git a/app/Cron/Nightly/RecalculateStats.php b/app/Cron/Nightly/RecalculateStats.php index cb761372..e4eb2320 100644 --- a/app/Cron/Nightly/RecalculateStats.php +++ b/app/Cron/Nightly/RecalculateStats.php @@ -4,6 +4,7 @@ namespace App\Cron\Nightly; use App\Contracts\Listener; use App\Events\CronNightly; +use App\Services\AircraftService; use App\Services\UserService; use Illuminate\Support\Facades\Log; @@ -12,11 +13,13 @@ use Illuminate\Support\Facades\Log; */ class RecalculateStats extends Listener { + private $aircraftSvc; private $userSvc; - public function __construct(UserService $userService) + public function __construct(AircraftService $aircraftSvc, UserService $userSvc) { - $this->userSvc = $userService; + $this->aircraftSvc = $aircraftSvc; + $this->userSvc = $userSvc; } /** @@ -29,10 +32,10 @@ class RecalculateStats extends Listener */ public function handle(CronNightly $event): void { - Log::info('Recalculating balances'); - + Log::info('Recalculating user stats'); $this->userSvc->recalculateAllUserStats(); - Log::info('Done recalculating stats'); + Log::info('Recalcuating aircraft status'); + $this->aircraftSvc->recalculateStats(); } } diff --git a/app/Database/factories/FlightFactory.php b/app/Database/factories/FlightFactory.php index d6d0cac7..3d117dd3 100644 --- a/app/Database/factories/FlightFactory.php +++ b/app/Database/factories/FlightFactory.php @@ -22,20 +22,22 @@ $factory->define(App\Models\Flight::class, function (Faker $faker) { 'alt_airport_id' => function () { return factory(App\Models\Airport::class)->create()->id; }, - 'distance' => $faker->numberBetween(1, 1000), - 'route' => null, - 'level' => 0, - 'dpt_time' => $faker->time(), - 'arr_time' => $faker->time(), - 'flight_time' => $faker->numberBetween(60, 360), - 'has_bid' => false, - 'active' => true, - 'visible' => true, - 'days' => 0, - 'start_date' => null, - 'end_date' => null, - 'created_at' => $faker->dateTimeBetween('-1 week', 'now'), - 'updated_at' => static function (array $flight) { + 'distance' => $faker->numberBetween(1, 1000), + 'route' => null, + 'level' => 0, + 'dpt_time' => $faker->time(), + 'arr_time' => $faker->time(), + 'flight_time' => $faker->numberBetween(60, 360), + 'load_factor' => $faker->randomElement([15, 20, 50, 90, 100]), + 'load_factor_variance' => $faker->randomElement([15, 20, 50, 90, 100]), + 'has_bid' => false, + 'active' => true, + 'visible' => true, + 'days' => 0, + 'start_date' => null, + 'end_date' => null, + 'created_at' => $faker->dateTimeBetween('-1 week', 'now'), + 'updated_at' => static function (array $flight) { return $flight['created_at']; }, ]; diff --git a/app/Database/factories/SimbriefFactory.php b/app/Database/factories/SimbriefFactory.php new file mode 100644 index 00000000..8c5906f6 --- /dev/null +++ b/app/Database/factories/SimbriefFactory.php @@ -0,0 +1,21 @@ +define(App\Models\SimBrief::class, function (Faker $faker) { + return [ + 'id' => $faker->unique()->numberBetween(10, 10000000), + 'user_id' => null, + 'flight_id' => null, + 'pirep_id' => null, + 'acars_xml' => '', + 'ofp_xml' => '', + 'created_at' => Carbon::now('UTC')->toDateTimeString(), + 'updated_at' => function (array $sb) { + return $sb['created_at']; + }, + ]; +}); diff --git a/app/Database/factories/UserFactory.php b/app/Database/factories/UserFactory.php index 8d18fc15..85ab8cbf 100644 --- a/app/Database/factories/UserFactory.php +++ b/app/Database/factories/UserFactory.php @@ -8,7 +8,7 @@ $factory->define(App\Models\User::class, function (Faker $faker) { return [ 'id' => null, - 'pilot_id' => 0, + 'pilot_id' => null, 'name' => $faker->name, 'email' => $faker->safeEmail, 'password' => $password ?: $password = Hash::make('secret'), diff --git a/app/Database/migrations/2017_06_08_0000_create_users_table.php b/app/Database/migrations/2017_06_08_0000_create_users_table.php index 61339475..cfa66c1a 100755 --- a/app/Database/migrations/2017_06_08_0000_create_users_table.php +++ b/app/Database/migrations/2017_06_08_0000_create_users_table.php @@ -1,6 +1,7 @@ string('country', 2)->nullable(); $table->string('home_airport_id', 5)->nullable(); $table->string('curr_airport_id', 5)->nullable(); - $table->string('last_pirep_id', \App\Models\Pirep::ID_MAX_LENGTH)->nullable(); + $table->string('last_pirep_id', Pirep::ID_MAX_LENGTH)->nullable(); $table->unsignedBigInteger('flights')->default(0); $table->unsignedBigInteger('flight_time')->nullable()->default(0); $table->unsignedBigInteger('transfer_time')->nullable()->default(0); diff --git a/app/Database/migrations/2017_12_20_005147_create_acars_tables.php b/app/Database/migrations/2017_12_20_005147_create_acars_tables.php index 10647470..2222e425 100644 --- a/app/Database/migrations/2017_12_20_005147_create_acars_tables.php +++ b/app/Database/migrations/2017_12_20_005147_create_acars_tables.php @@ -1,6 +1,7 @@ string('id', 12); - $table->string('pirep_id', \App\Contracts\Model::ID_MAX_LENGTH); + $table->string('id', Model::ID_MAX_LENGTH); + $table->string('pirep_id', Model::ID_MAX_LENGTH); $table->unsignedTinyInteger('type'); $table->unsignedInteger('nav_type')->nullable(); $table->unsignedInteger('order')->default(0); diff --git a/app/Database/migrations/2018_01_03_014930_create_stats_table.php b/app/Database/migrations/2018_01_03_014930_create_stats_table.php index f31631e3..3656caac 100644 --- a/app/Database/migrations/2018_01_03_014930_create_stats_table.php +++ b/app/Database/migrations/2018_01_03_014930_create_stats_table.php @@ -2,6 +2,7 @@ use App\Contracts\Migration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; class CreateStatsTable extends Migration { @@ -22,28 +23,6 @@ class CreateStatsTable extends Migration $table->primary('id'); $table->timestamps(); }); - /*$this->addCounterGroups([ - 'flights' => 1, - ]); - - $stats = [ - [ - 'id' => $this->formatSettingId('flights.total_flights'), - 'order' => $this->getNextOrderNumber('flights'), - 'value' => 0, - 'type' => 'int', - 'description' => 'Total number of flights in the VA', - ], - [ - 'id' => $this->formatSettingId('flights.total_time'), - 'order' => $this->getNextOrderNumber('flights'), - 'value' => 0, - 'type' => 'int', - 'description' => 'Total number of hours in the VA', - ], - ]; - - $this->addData('stats', $stats);*/ } /** @@ -53,6 +32,6 @@ class CreateStatsTable extends Migration */ public function down() { - Schema::dropIfExists('settings'); + Schema::dropIfExists('stats'); } } diff --git a/app/Database/migrations/2019_06_19_220910_add_readonly_to_roles.php b/app/Database/migrations/2019_06_19_220910_add_readonly_to_roles.php index 1eaee12f..65ecce47 100644 --- a/app/Database/migrations/2019_06_19_220910_add_readonly_to_roles.php +++ b/app/Database/migrations/2019_06_19_220910_add_readonly_to_roles.php @@ -2,6 +2,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; class AddReadonlyToRoles extends Migration diff --git a/app/Database/migrations/2019_07_16_141152_users_add_pilot_id.php b/app/Database/migrations/2019_07_16_141152_users_add_pilot_id.php index caad035c..5e743df1 100644 --- a/app/Database/migrations/2019_07_16_141152_users_add_pilot_id.php +++ b/app/Database/migrations/2019_07_16_141152_users_add_pilot_id.php @@ -18,7 +18,7 @@ class UsersAddPilotId extends Migration */ public function up() { - Schema::table('users', function (Blueprint $table) { + Schema::table('users', static function (Blueprint $table) { $table->unsignedBigInteger('pilot_id') ->after('id') ->unique() @@ -26,8 +26,7 @@ class UsersAddPilotId extends Migration ->index('users_pilot_id'); }); - // Migrate the current pilot IDs - DB::update('UPDATE `users` SET `pilot_id`=`id`'); + DB::table('users')->update(['pilot_id' => DB::raw('`id`')]); } /** diff --git a/app/Database/migrations/2019_09_16_141152_pireps_change_state_type.php b/app/Database/migrations/2019_09_16_141152_pireps_change_state_type.php index b3eb5e0c..3f9ff911 100644 --- a/app/Database/migrations/2019_09_16_141152_pireps_change_state_type.php +++ b/app/Database/migrations/2019_09_16_141152_pireps_change_state_type.php @@ -16,8 +16,9 @@ class PirepsChangeStateType extends Migration public function up() { // Migrate the old rejected state - DB::update('UPDATE `pireps` SET `state`='.PirepState::REJECTED - .' WHERE state=-1'); + DB::table('pireps') + ->where(['state' => -1]) + ->update(['state' => PirepState::REJECTED]); // Change the column type to an unsigned small int (tinyint not supported on all) Schema::table('pireps', function (Blueprint $table) { diff --git a/app/Database/migrations/2020_02_12_141152_expenses_add_flight_type.php b/app/Database/migrations/2020_02_12_141152_expenses_add_flight_type.php new file mode 100644 index 00000000..b3a3e98b --- /dev/null +++ b/app/Database/migrations/2020_02_12_141152_expenses_add_flight_type.php @@ -0,0 +1,32 @@ +string('flight_type', 50) + ->nullable() + ->after('type'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('expenses', function (Blueprint $table) { + $table->dropColumn('flight_type'); + }); + } +} diff --git a/app/Database/migrations/2020_02_26_044305_modify_airports_coordinates.php b/app/Database/migrations/2020_02_26_044305_modify_airports_coordinates.php new file mode 100644 index 00000000..4803b41c --- /dev/null +++ b/app/Database/migrations/2020_02_26_044305_modify_airports_coordinates.php @@ -0,0 +1,37 @@ +decimal('lat', 10, 5)->change()->default(0.0)->nullable(); + $table->decimal('lon', 11, 5)->change()->default(0.0)->nullable(); + }); + + Schema::table('airports', function ($table) { + $table->decimal('lat', 10, 5)->change()->default(0.0)->nullable(); + $table->decimal('lon', 11, 5)->change()->default(0.0)->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/app/Database/migrations/2020_03_04_044305_flight_field_nullable.php b/app/Database/migrations/2020_03_04_044305_flight_field_nullable.php new file mode 100644 index 00000000..96ecaafa --- /dev/null +++ b/app/Database/migrations/2020_03_04_044305_flight_field_nullable.php @@ -0,0 +1,31 @@ +text('value')->change()->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/app/Database/migrations/2020_03_05_141152_flights_add_load_factor.php b/app/Database/migrations/2020_03_05_141152_flights_add_load_factor.php new file mode 100644 index 00000000..67ea5240 --- /dev/null +++ b/app/Database/migrations/2020_03_05_141152_flights_add_load_factor.php @@ -0,0 +1,37 @@ +decimal('load_factor', 5, 2) + ->nullable() + ->after('flight_type'); + + $table->decimal('load_factor_variance', 5, 2) + ->nullable() + ->after('load_factor'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('flights', function (Blueprint $table) { + $table->dropColumn('load_factor'); + $table->dropColumn('load_factor_variance'); + }); + } +} diff --git a/app/Database/migrations/2020_03_06_141152_flights_add_pilot_pay.php b/app/Database/migrations/2020_03_06_141152_flights_add_pilot_pay.php new file mode 100644 index 00000000..ebce9e0b --- /dev/null +++ b/app/Database/migrations/2020_03_06_141152_flights_add_pilot_pay.php @@ -0,0 +1,32 @@ +decimal('pilot_pay') + ->nullable() + ->after('route'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('flights', function (Blueprint $table) { + $table->dropColumn('pilot_pay'); + }); + } +} diff --git a/app/Database/migrations/2020_03_06_141153_fares_add_type.php b/app/Database/migrations/2020_03_06_141153_fares_add_type.php new file mode 100644 index 00000000..bd0d8c5c --- /dev/null +++ b/app/Database/migrations/2020_03_06_141153_fares_add_type.php @@ -0,0 +1,34 @@ +unsignedTinyInteger('type') + ->default(FareType::PASSENGER) + ->nullable() + ->after('capacity'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('fares', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +} diff --git a/app/Database/migrations/2020_03_09_141152_increase_id_lengths.php b/app/Database/migrations/2020_03_09_141152_increase_id_lengths.php new file mode 100644 index 00000000..32477b55 --- /dev/null +++ b/app/Database/migrations/2020_03_09_141152_increase_id_lengths.php @@ -0,0 +1,45 @@ + ['id', 'pirep_id'], + 'bids' => ['flight_id'], + 'flights' => ['id'], + 'pireps' => ['id', 'flight_id'], + 'flight_fare' => ['flight_id'], + 'flight_field_values' => ['flight_id'], + 'flight_subfleet' => ['flight_id'], + 'pirep_comments' => ['pirep_id'], + 'pirep_fares' => ['pirep_id'], + 'pirep_field_values' => ['pirep_id'], + 'users' => ['last_pirep_id'], + ]; + + foreach ($tables as $table_name => $columns) { + Schema::table($table_name, function (Blueprint $table) use ($columns) { + foreach ($columns as $column) { + $table->string($column, 36)->change(); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/app/Database/migrations/2020_03_09_141153_remove_subfleet_type_index.php b/app/Database/migrations/2020_03_09_141153_remove_subfleet_type_index.php new file mode 100644 index 00000000..81703bf6 --- /dev/null +++ b/app/Database/migrations/2020_03_09_141153_remove_subfleet_type_index.php @@ -0,0 +1,27 @@ +dropUnique(['type']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/app/Database/migrations/2020_03_11_141153_add_simbrief_table.php b/app/Database/migrations/2020_03_11_141153_add_simbrief_table.php new file mode 100644 index 00000000..01a23147 --- /dev/null +++ b/app/Database/migrations/2020_03_11_141153_add_simbrief_table.php @@ -0,0 +1,34 @@ +string('id', 36); // The OFP ID + $table->unsignedInteger('user_id'); + $table->string('flight_id', 36)->nullable(); + $table->string('pirep_id', 36)->nullable(); + $table->mediumText('acars_xml'); + $table->mediumText('ofp_xml'); + $table->timestamps(); + + $table->primary('id'); + $table->index(['user_id', 'flight_id']); + $table->index('pirep_id'); + $table->unique('pirep_id'); // Can only belong to a single PIREP + }); + } + + public function down() + { + Schema::drop('simbrief'); + } +} diff --git a/app/Database/migrations/2020_03_27_174238_create_pages.php b/app/Database/migrations/2020_03_27_174238_create_pages.php new file mode 100644 index 00000000..f7d974c1 --- /dev/null +++ b/app/Database/migrations/2020_03_27_174238_create_pages.php @@ -0,0 +1,44 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('slug'); + $table->string('icon'); + $table->unsignedSmallInteger('type'); + $table->boolean('public'); + $table->boolean('enabled'); + $table->mediumText('body'); + $table->timestamps(); + + $table->index('slug'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('pages'); + } +} diff --git a/app/Database/migrations/2020_03_28_174238_airline_remove_nullable.php b/app/Database/migrations/2020_03_28_174238_airline_remove_nullable.php new file mode 100644 index 00000000..100fac31 --- /dev/null +++ b/app/Database/migrations/2020_03_28_174238_airline_remove_nullable.php @@ -0,0 +1,19 @@ +dropUnique('airlines_iata_unique'); + }); + } + + public function down() + { + } +} diff --git a/app/Database/migrations/2020_03_28_174238_page_icon_nullable.php b/app/Database/migrations/2020_03_28_174238_page_icon_nullable.php new file mode 100644 index 00000000..a8dd355e --- /dev/null +++ b/app/Database/migrations/2020_03_28_174238_page_icon_nullable.php @@ -0,0 +1,19 @@ +string('icon')->change()->nullable(); + }); + } + + public function down() + { + } +} diff --git a/app/Database/seeds/dev/.gitignore b/app/Database/seeds/dev/.gitignore new file mode 100644 index 00000000..20ebc05b --- /dev/null +++ b/app/Database/seeds/dev/.gitignore @@ -0,0 +1 @@ +local.yml diff --git a/app/Database/seeds/dev/sample.yml b/app/Database/seeds/dev/sample.yml index 4af24ff5..c47a6418 100644 --- a/app/Database/seeds/dev/sample.yml +++ b/app/Database/seeds/dev/sample.yml @@ -124,7 +124,16 @@ airports: lat: 25.2528 lon: 55.3644 ground_handling_cost: 50 - + - id: OMAA + iata: AUH + icao: OMAA + name: Abu Dhabi International Airport + location: Abu Dhabi + country: + timezone: Asia/Dubai + lat: 24.433 + lon: 54.6511 + ground_handling_cost: 50 # aircraft: - id: 1 @@ -132,24 +141,28 @@ aircraft: airport_id: KJFK name: Boeing 747-438 registration: 001Z + flight_time: 360 status: A - id: 2 subfleet_id: 2 airport_id: LGRP name: Boeing 777-200 registration: C202 + flight_time: 260 status: A - id: 3 subfleet_id: 1 airport_id: KAUS name: Boeing 747-412 registration: S2333 + flight_time: 0 status: A - id: 4 subfleet_id: 1 airport_id: KAUS name: Boeing 747-436 RETIRED registration: + flight_time: 45 status: R expenses: @@ -283,6 +296,7 @@ flights: arr_time: 11PM EST flight_time: 240 flight_type: J + load_factor: 100 created_at: NOW updated_at: NOW - id: flightid_3 @@ -294,6 +308,7 @@ flights: arr_airport_id: KJFK flight_time: 480 flight_type: J + load_factor: 63 dpt_time: 9AM CST arr_time: 1030AM CST route: PITZZ4 MNURE WLEEE4 @@ -308,6 +323,37 @@ flights: arr_airport_id: MWCR flight_time: 70 flight_type: 'J' + load_factor: 80 + dpt_time: '0800' + arr_time: '0900' + route: 'MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3' + created_at: NOW + updated_at: NOW + - id: flightid_5 + airline_id: 1 + flight_number: 112 + route_code: + route_leg: + dpt_airport_id: OMAA + arr_airport_id: OMDB + flight_time: 30 + flight_type: 'J' + load_factor: + dpt_time: '0800' + arr_time: '0900' + route: 'MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3' + created_at: NOW + updated_at: NOW + - id: flightid_6 + airline_id: 1 + flight_number: 113 + route_code: + route_leg: + dpt_airport_id: OMDB + arr_airport_id: OMAA + flight_time: 30 + flight_type: 'J' + load_factor: 100 dpt_time: '0800' arr_time: '0900' route: 'MLY5 KEMBO UG442 SIA UG633 OTEKO UR640 NALRO GUBEL3' @@ -467,12 +513,8 @@ pirep_fares: pirep_fields: - id: 1 - name: departure terminal - slug: departure-terminal - required: 1 - - id: 2 - name: arrival terminal - slug: arrival-terminal + name: Cost Index + slug: cost-index required: 0 pirep_field_values: diff --git a/app/Database/seeds/dev/simbrief.yml b/app/Database/seeds/dev/simbrief.yml new file mode 100644 index 00000000..4664bd61 --- /dev/null +++ b/app/Database/seeds/dev/simbrief.yml @@ -0,0 +1,22 @@ +settings: + - id: simbrief_api_key + value: xyz +simbrief: + - + id: 1585320637_8D7FFD7036 + user_id: 1 + flight_id: flightid_1 + pirep_id: null + acars_xml: "\n\n \n 19726910\n 120867\n 1585320643\n lido2\n 2001\n lbs\n \n \n 2\n VMS\n 100\n 0\n NONE\n \n 0\n M.78\n 250/300/0.78\n 0.78/300/250\n LRC\n LRC\n 64\n 31000\n KAUS/0310\n 6\n 45153\n 44\n 252\n 050\n 1320\n 1451\n 1316\n 45650\n 463\n .78\n 340\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n \n \n KAUS\n AUS\n \n 542\n 30.194528\n -97.669875\n AUSTIN-BERGSTROM INTL\n 17R\n \n \n KJFK\n JFK\n \n 13\n 40.639928\n -73.778692\n KENNEDY INTL\n 31L\n \n \n KBOS\n BOS\n \n 19\n 42.362944\n -71.006389\n LOGAN INTL\n 32\n 27000\n 162\n 162\n 162\n 049\n 063\n 397\n 397\n P000\n 000\n 000\n 36100\n P00\n 1969\n 8389\n DCT MERIT ROBUC3\n DCT MERIT ROBUC3\n \n \n \n \n \n HOOKK\n HOOKK\n wpt\n 30.360000\n -97.203022\n CLB\n ILEXY2\n 1\n 41\n 067\n 064\n 069\n 065\n 18400\n \n \n ILEXY\n ILEXY\n wpt\n 30.352778\n -97.079294\n CLB\n ILEXY2\n 1\n 6\n 093\n 091\n 099\n 096\n 20300\n \n \n JAYJO\n JAYJO\n wpt\n 30.337150\n -96.815014\n CLB\n ILEXY2\n 1\n 14\n 093\n 091\n 099\n 096\n 23800\n \n \n ASHRR\n ASHRR\n wpt\n 30.317936\n -96.507683\n CLB\n ILEXY2\n 1\n 16\n 094\n 091\n 099\n 096\n 26700\n \n \n ZENZI\n ZENZI\n wpt\n 30.288539\n -96.058431\n CLB\n ILEXY2\n 0\n 23\n 094\n 091\n 098\n 095\n 30000\n \n \n TOC\n TOP OF CLIMB\n ltlg\n 30.440407\n -95.828521\n CLB\n DCT\n 0\n 15\n 052\n 050\n 051\n 048\n 31000\n \n \n LFK\n LUFKIN\n vor\n 31.162442\n -94.716833\n CRZ\n DCT\n 0\n 72\n 052\n 050\n 051\n 048\n 31000\n \n \n AEX\n ALEXANDRIA\n vor\n 31.256728\n -92.500975\n CRZ\n DCT\n 0\n 114\n 086\n 085\n 088\n 086\n 31000\n \n \n MEI\n MERIDIAN\n vor\n 32.378439\n -88.804267\n CRZ\n DCT\n 0\n 200\n 069\n 069\n 069\n 069\n 31000\n \n \n ATL\n ATLANTA\n vor\n 33.629078\n -84.435064\n CRZ\n DCT\n 0\n 232\n 069\n 072\n 069\n 071\n 31000\n \n \n FIGEY\n FIGEY\n wpt\n 33.874150\n -82.872989\n CRZ\n DCT\n 0\n 79\n 078\n 084\n 078\n 083\n 31000\n \n \n GRD\n GREENWOOD\n vor\n 34.251567\n -82.154150\n CRZ\n Q64\n 0\n 42\n 057\n 064\n 055\n 061\n 31000\n \n \n DARRL\n DARRL\n wpt\n 34.797075\n -81.056006\n CRZ\n Q64\n 0\n 63\n 058\n 066\n 056\n 063\n 31000\n \n \n IDDAA\n IDDAA\n wpt\n 35.184750\n -79.991858\n CRZ\n Q64\n 0\n 57\n 065\n 073\n 063\n 071\n 31000\n \n \n TYI\n TAR RIVER (ROCKY MOUNT)\n vor\n 35.976722\n -77.703731\n CRZ\n Q64\n 0\n 121\n 066\n 075\n 064\n 072\n 31000\n \n \n ORF\n NORFOLK\n vor\n 36.891906\n -76.200328\n CRZ\n J209\n 0\n 91\n 052\n 062\n 049\n 059\n 31000\n \n \n SAWED\n SAWED\n wpt\n 37.533536\n -75.858083\n CRZ\n J121\n 0\n 42\n 022\n 034\n 016\n 027\n 31000\n \n \n KALDA\n KALDA\n wpt\n 37.841958\n -75.626483\n CRZ\n J121\n 0\n 22\n 030\n 042\n 024\n 035\n 31000\n \n \n DUNFE\n DUNFE\n wpt\n 37.888564\n -75.591497\n CRZ\n J121\n 0\n 3\n 030\n 042\n 024\n 035\n 31000\n \n \n SWL\n SNOW HILL\n vor\n 38.056594\n -75.463900\n CRZ\n J121\n 0\n 12\n 030\n 042\n 025\n 037\n 31000\n \n \n RADDS\n RADDS\n wpt\n 38.648556\n -75.088467\n CRZ\n J121\n 0\n 40\n 026\n 038\n 019\n 031\n 31000\n \n \n TOD\n TOP OF DESCENT\n ltlg\n 39.050506\n -74.829540\n CRZ\n J121\n 0\n 27\n 026\n 038\n 019\n 031\n 31000\n \n \n SIE\n SEA ISLE\n vor\n 39.095508\n -74.800344\n DSC\n J121\n 0\n 3\n 026\n 039\n 019\n 031\n 30200\n \n \n BOTON\n BOTON\n wpt\n 39.414472\n -74.454744\n DSC\n CAMRN4\n 1\n 25\n 039\n 052\n 033\n 045\n 23200\n \n \n HOGGS\n HOGGS\n wpt\n 39.582847\n -74.270575\n DSC\n CAMRN4\n 1\n 13\n 040\n 053\n 035\n 047\n 19500\n \n \n PANZE\n PANZE\n wpt\n 39.675994\n -74.168181\n DSC\n CAMRN4\n 1\n 7\n 040\n 053\n 035\n 048\n 17600\n \n \n KARRS\n KARRS\n wpt\n 39.840872\n -73.985989\n DSC\n CAMRN4\n 1\n 13\n 040\n 053\n 036\n 049\n 14000\n \n \n CAMRN\n CAMRN\n wpt\n 40.017303\n -73.861058\n DSC\n CAMRN4\n 1\n 12\n 028\n 041\n 023\n 036\n 10600\n \n \n KJFK\n KENNEDY INTL\n apt\n 40.639928\n -73.778692\n DSC\n CAMRN4\n 1\n 46\n 005\n 019\n 357\n 010\n 2500\n \n \n \n (FPL-VMS100-IS\n-A306/H-SDE2E3FGHIRYW/LB1\n-KAUS1230\n-N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY\n Q64 TYI J209 ORF J121 SIE CAMRN4\n-KJFK0302 KBOS\n-PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105\n KZDC0157 KZNY0246 OPR/VMS RMK/TCAS)\n N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n VMS100\n 0463\n N\n 310\n F\n PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105 KZDC0157 KZNY0246 OPR/VMS RMK/TCAS\n KZHU\n KZNY\n KZBW\n \n KZME\n KZTL\n KZDC\n KZNY\n \n \n A306\n \n A300F4-600\n N306SB\n 306\n \n H-SDE2E3FGHIRYW/LB1\n 345\n 1\n \n \n 2000\n 45650\n 3743\n 8389\n 7290\n 0\n 0\n 65072\n 65072\n 67072\n 21422\n 14974\n 68100\n \n \n 10975\n 7140\n 1388579400\n 1388580000\n 1388587140\n 1388587500\n 8100\n 1388579400\n 1388580000\n 1388590975\n 1388591335\n 11935\n -6\n -5\n 600\n 360\n 2700\n 17092\n 900\n 0\n 0\n \n \n 200400\n 340\n 230\n 500\n 78700\n 279100\n 286600\n 344172\n 354250\n 375800\n L\n 298522\n 308600\n 346172\n \n \n VMS\n 100\n A306\n KAUS\n KJFK\n 1388534400\n 43200\n 1800\n ILEXY2 ZENZI LFK AEX MEI ATL FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n 7200\n 900\n \n \n \n auto\n KBOS\n \n NABEEL SHAHZAD\n 120867\n 1\n auto\n 0\n auto\n 45\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n AUTO\n lido\n 1\n 1\n 0\n 1\n 1\n 1\n 0\n 1\n \n \n \n \n \n \n \n \n \n false\n \n \n\n" + ofp_xml: "\n\n \n 19726910\n 120867\n 1585320643\n lido2\n 2001\n lbs\n \n \n 2\n VMS\n 100\n 0\n NONE\n \n 0\n M.78\n 250/300/0.78\n 0.78/300/250\n LRC\n LRC\n 64\n 31000\n KAUS/0310\n 6\n 45153\n 44\n 252\n 050\n 1320\n 1451\n 1316\n 45650\n 463\n .78\n 340\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n \n \n KAUS\n AUS\n \n 542\n 30.194528\n -97.669875\n AUSTIN-BERGSTROM INTL\n 17R\n \n \n KJFK\n JFK\n \n 13\n 40.639928\n -73.778692\n KENNEDY INTL\n 31L\n \n \n KBOS\n BOS\n \n 19\n 42.362944\n -71.006389\n LOGAN INTL\n 32\n 27000\n 162\n 162\n 162\n 049\n 063\n 397\n 397\n P000\n 000\n 000\n 36100\n P00\n 1969\n 8389\n DCT MERIT ROBUC3\n DCT MERIT ROBUC3\n \n \n \n \n \n HOOKK\n HOOKK\n wpt\n \n 30.360000\n -97.203022\n CLB\n ILEXY2\n 1\n 41\n 067\n 064\n 069\n 065\n 18400\n 300\n 408\n 0.64\n 0.64\n 58\n 466\n 427\n 427\n 38213\n 4567\n 4567\n 56762\n 60505\n -11\n 11\n 236\n 59\n 0\n 41700\n 383\n 2700\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 14\n 10\n 20\n \n \n 5000\n 216\n 10\n 14\n \n \n 10000\n 204\n 26\n 5\n \n \n 14000\n 236\n 38\n -2\n \n \n 18000\n 236\n 58\n -11\n \n \n 24000\n 228\n 63\n -24\n \n \n 30000\n 219\n 52\n -38\n \n \n 34000\n 230\n 63\n -47\n \n \n 39000\n 229\n 79\n -59\n \n \n 45000\n 242\n 89\n -61\n \n \n \n \n \n ILEXY\n ILEXY\n wpt\n \n 30.352778\n -97.079294\n CLB\n ILEXY2\n 1\n 6\n 093\n 091\n 099\n 096\n 20300\n 300\n 421\n 0.67\n 0.67\n 45\n 466\n 46\n 473\n 37491\n 483\n 5050\n 56279\n 60022\n -16\n 10\n 232\n 62\n 0\n 41700\n 383\n 2700\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 14\n 10\n 20\n \n \n 5000\n 216\n 10\n 14\n \n \n 10000\n 204\n 26\n 5\n \n \n 14000\n 236\n 38\n -2\n \n \n 18000\n 236\n 58\n -11\n \n \n 24000\n 228\n 63\n -24\n \n \n 30000\n 219\n 52\n -38\n \n \n 34000\n 230\n 63\n -47\n \n \n 39000\n 229\n 79\n -59\n \n \n 45000\n 242\n 89\n -61\n \n \n \n \n \n JAYJO\n JAYJO\n wpt\n \n 30.337150\n -96.815014\n CLB\n ILEXY2\n 1\n 14\n 093\n 091\n 099\n 096\n 23800\n 300\n 447\n 0.72\n 0.72\n 42\n 489\n 103\n 576\n 37158\n 1064\n 6114\n 55215\n 58958\n -23\n 10\n 228\n 63\n 0\n 41700\n 383\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 14\n 10\n 20\n \n \n 5000\n 216\n 10\n 14\n \n \n 10000\n 204\n 26\n 5\n \n \n 14000\n 236\n 38\n -2\n \n \n 18000\n 236\n 58\n -11\n \n \n 24000\n 228\n 63\n -24\n \n \n 30000\n 219\n 52\n -38\n \n \n 34000\n 230\n 63\n -47\n \n \n 39000\n 229\n 79\n -59\n \n \n 45000\n 242\n 89\n -61\n \n \n \n \n \n ASHRR\n ASHRR\n wpt\n \n 30.317936\n -96.507683\n CLB\n ILEXY2\n 1\n 16\n 094\n 091\n 099\n 096\n 26700\n 300\n 471\n 0.77\n 0.77\n 37\n 508\n 113\n 690\n 36540\n 1151\n 7265\n 54064\n 57807\n -29\n 9\n 226\n 59\n 0\n 41700\n 383\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 14\n 10\n 20\n \n \n 5000\n 216\n 10\n 14\n \n \n 10000\n 204\n 26\n 5\n \n \n 14000\n 236\n 38\n -2\n \n \n 18000\n 236\n 58\n -11\n \n \n 24000\n 228\n 63\n -24\n \n \n 30000\n 219\n 52\n -38\n \n \n 34000\n 230\n 63\n -47\n \n \n 39000\n 229\n 79\n -59\n \n \n 45000\n 242\n 89\n -61\n \n \n \n \n \n ZENZI\n ZENZI\n wpt\n \n 30.288539\n -96.058431\n CLB\n ILEXY2\n 0\n 23\n 094\n 091\n 098\n 095\n 30000\n 296\n 466\n 0.78\n 0.78\n 37\n 503\n 165\n 854\n 35348\n 1616\n 8881\n 52448\n 56191\n -38\n 7\n 236\n 48\n 0\n 41500\n 209\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 122\n 11\n 22\n \n \n 5000\n 226\n 11\n 15\n \n \n 10000\n 213\n 22\n 6\n \n \n 14000\n 225\n 40\n -1\n \n \n 18000\n 222\n 54\n -10\n \n \n 24000\n 228\n 61\n -24\n \n \n 30000\n 236\n 48\n -38\n \n \n 34000\n 238\n 63\n -47\n \n \n 39000\n 237\n 73\n -59\n \n \n 45000\n 242\n 85\n -61\n \n \n \n \n \n TOC\n TOP OF CLIMB\n ltlg\n \n 30.440407\n -95.828521\n CLB\n DCT\n 0\n 15\n 052\n 050\n 051\n 048\n 31000\n 289\n 464\n 0.78\n 0.78\n 52\n 516\n 105\n 959\n 34760\n 1010\n 9891\n 51438\n 55181\n -40\n 7\n 237\n 52\n 0\n 41500\n 209\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 122\n 11\n 22\n \n \n 5000\n 226\n 11\n 15\n \n \n 10000\n 213\n 22\n 6\n \n \n 14000\n 225\n 40\n -1\n \n \n 18000\n 222\n 54\n -10\n \n \n 24000\n 228\n 61\n -24\n \n \n 30000\n 236\n 48\n -38\n \n \n 34000\n 238\n 63\n -47\n \n \n 39000\n 237\n 73\n -59\n \n \n 45000\n 242\n 85\n -61\n \n \n \n \n \n LFK\n LUFKIN\n vor\n 112.10\n 31.162442\n -94.716833\n CRZ\n DCT\n 0\n 72\n 052\n 050\n 051\n 048\n 31000\n 289\n 463\n 0.78\n 0.78\n 51\n 514\n 504\n 1463\n 14103\n 1976\n 11867\n 49462\n 53205\n -41\n 6\n 239\n 51\n 0\n 41600\n 294\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 23\n 3\n 21\n \n \n 5000\n 249\n 11\n 15\n \n \n 10000\n 169\n 25\n 5\n \n \n 14000\n 208\n 48\n -2\n \n \n 18000\n 224\n 63\n -10\n \n \n 24000\n 238\n 63\n -23\n \n \n 30000\n 238\n 50\n -38\n \n \n 34000\n 242\n 55\n -49\n \n \n 39000\n 246\n 74\n -60\n \n \n 45000\n 245\n 94\n -61\n \n \n \n \n \n AEX\n ALEXANDRIA\n vor\n 116.10\n 31.256728\n -92.500975\n CRZ\n DCT\n 0\n 114\n 086\n 085\n 088\n 086\n 31000\n 289\n 464\n 0.78\n 0.78\n 49\n 513\n 800\n 2263\n 14061\n 3125\n 14992\n 46337\n 50080\n -40\n 7\n 246\n 53\n 0\n 41900\n 218\n 2500\n KZHU\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 161\n 13\n 21\n \n \n 5000\n 229\n 20\n 16\n \n \n 10000\n 243\n 18\n 5\n \n \n 14000\n 190\n 32\n -2\n \n \n 18000\n 202\n 59\n -10\n \n \n 24000\n 225\n 66\n -23\n \n \n 30000\n 239\n 68\n -38\n \n \n 34000\n 249\n 58\n -48\n \n \n 39000\n 246\n 75\n -58\n \n \n 45000\n 246\n 82\n -61\n \n \n \n \n \n MEI\n MERIDIAN\n vor\n 117.00\n 32.378439\n -88.804267\n CRZ\n DCT\n 0\n 200\n 069\n 069\n 069\n 069\n 31000\n 289\n 464\n 0.78\n 0.78\n 58\n 522\n 1379\n 3643\n 13928\n 5336\n 20328\n 41001\n 44744\n -40\n 7\n 247\n 58\n 0\n 51500\n 274\n 2700\n KZME\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 178\n 11\n 20\n \n \n 5000\n 227\n 25\n 14\n \n \n 10000\n 246\n 38\n 7\n \n \n 14000\n 237\n 28\n -0\n \n \n 18000\n 210\n 42\n -9\n \n \n 24000\n 229\n 54\n -23\n \n \n 30000\n 249\n 47\n -38\n \n \n 34000\n 254\n 57\n -48\n \n \n 39000\n 239\n 55\n -57\n \n \n 45000\n 247\n 72\n -63\n \n \n \n \n KZME\n MEMPHIS FIR/UIR\n 31.77259\n -90.79531\n \n \n \n \n ATL\n ATLANTA\n vor\n 116.90\n 33.629078\n -84.435064\n CRZ\n DCT\n 0\n 232\n 069\n 072\n 069\n 071\n 31000\n 289\n 463\n 0.78\n 0.78\n 42\n 505\n 1654\n 5296\n 13661\n 6276\n 26604\n 34725\n 38468\n -41\n 6\n 249\n 42\n 0\n 51700\n 659\n 3800\n KZTL\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 230\n 4\n 18\n \n \n 5000\n 239\n 32\n 16\n \n \n 10000\n 245\n 34\n 7\n \n \n 14000\n 246\n 37\n -0\n \n \n 18000\n 230\n 40\n -10\n \n \n 24000\n 252\n 49\n -23\n \n \n 30000\n 248\n 45\n -38\n \n \n 34000\n 254\n 44\n -48\n \n \n 39000\n 274\n 62\n -58\n \n \n 45000\n 266\n 69\n -65\n \n \n \n \n KZTL\n ATLANTA FIR/UIR\n 32.61814\n -87.95723\n \n \n \n \n FIGEY\n FIGEY\n wpt\n \n 33.874150\n -82.872989\n CRZ\n DCT\n 0\n 79\n 078\n 084\n 078\n 083\n 31000\n 289\n 462\n 0.78\n 0.78\n 42\n 504\n 564\n 5861\n 13356\n 2093\n 28697\n 32632\n 36375\n -42\n 5\n 254\n 42\n 0\n 44000\n 591\n 3100\n KZTL\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 222\n 5\n 17\n \n \n 5000\n 229\n 38\n 15\n \n \n 10000\n 245\n 32\n 7\n \n \n 14000\n 244\n 34\n 0\n \n \n 18000\n 235\n 37\n -10\n \n \n 24000\n 260\n 48\n -23\n \n \n 30000\n 253\n 42\n -39\n \n \n 34000\n 257\n 41\n -49\n \n \n 39000\n 277\n 58\n -58\n \n \n 45000\n 270\n 70\n -64\n \n \n \n \n \n GRD\n GREENWOOD\n vor\n 115.50\n 34.251567\n -82.154150\n CRZ\n Q64\n 0\n 42\n 057\n 064\n 055\n 061\n 31000\n 289\n 462\n 0.78\n 0.78\n 40\n 502\n 301\n 6162\n 13267\n 1110\n 29807\n 31522\n 35265\n -42\n 5\n 255\n 42\n 0\n 43400\n 505\n 2800\n KZTL\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 210\n 9\n 18\n \n \n 5000\n 231\n 34\n 15\n \n \n 10000\n 240\n 30\n 8\n \n \n 14000\n 242\n 31\n 0\n \n \n 18000\n 249\n 34\n -10\n \n \n 24000\n 254\n 44\n -23\n \n \n 30000\n 253\n 43\n -39\n \n \n 34000\n 259\n 41\n -49\n \n \n 39000\n 278\n 57\n -59\n \n \n 45000\n 271\n 69\n -63\n \n \n \n \n \n DARRL\n DARRL\n wpt\n \n 34.797075\n -81.056006\n CRZ\n Q64\n 0\n 63\n 058\n 066\n 056\n 063\n 31000\n 289\n 462\n 0.78\n 0.78\n 46\n 508\n 446\n 6608\n 13220\n 1640\n 31447\n 29882\n 33625\n -42\n 5\n 259\n 50\n 0\n 42500\n 626\n 2800\n KZTL\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 220\n 5\n 18\n \n \n 5000\n 237\n 36\n 14\n \n \n 10000\n 240\n 37\n 7\n \n \n 14000\n 247\n 36\n 1\n \n \n 18000\n 258\n 39\n -10\n \n \n 24000\n 254\n 46\n -24\n \n \n 30000\n 257\n 49\n -39\n \n \n 34000\n 263\n 51\n -48\n \n \n 39000\n 274\n 59\n -59\n \n \n 45000\n 274\n 71\n -63\n \n \n \n \n \n IDDAA\n IDDAA\n wpt\n \n 35.184750\n -79.991858\n CRZ\n Q64\n 0\n 57\n 065\n 073\n 063\n 071\n 31000\n 289\n 463\n 0.78\n 0.78\n 44\n 507\n 405\n 7013\n 13190\n 1483\n 32930\n 28399\n 32142\n -41\n 6\n 262\n 46\n 0\n 42500\n 316\n 2800\n KZTL\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 217\n 12\n 19\n \n \n 5000\n 242\n 34\n 14\n \n \n 10000\n 239\n 35\n 7\n \n \n 14000\n 252\n 31\n 0\n \n \n 18000\n 265\n 37\n -11\n \n \n 24000\n 252\n 40\n -24\n \n \n 30000\n 261\n 45\n -39\n \n \n 34000\n 265\n 51\n -48\n \n \n 39000\n 277\n 57\n -59\n \n \n 45000\n 276\n 69\n -63\n \n \n \n \n \n TYI\n TAR RIVER (ROCKY MOUNT)\n vor\n 117.80\n 35.976722\n -77.703731\n CRZ\n Q64\n 0\n 121\n 066\n 075\n 064\n 072\n 31000\n 289\n 463\n 0.78\n 0.78\n 48\n 511\n 852\n 7865\n 13127\n 3108\n 36038\n 25291\n 29034\n -41\n 6\n 263\n 50\n 0\n 42600\n 329\n 2800\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 218\n 20\n 19\n \n \n 5000\n 246\n 36\n 14\n \n \n 10000\n 249\n 32\n 7\n \n \n 14000\n 252\n 33\n -0\n \n \n 18000\n 268\n 43\n -11\n \n \n 24000\n 263\n 41\n -24\n \n \n 30000\n 266\n 48\n -38\n \n \n 34000\n 265\n 47\n -49\n \n \n 39000\n 279\n 63\n -60\n \n \n 45000\n 281\n 68\n -64\n \n \n \n \n KZDC\n WASHINGTON FIR/UIR\n 35.20423\n -79.93169\n \n \n \n \n ORF\n NORFOLK\n vor\n 116.90\n 36.891906\n -76.200328\n CRZ\n J209\n 0\n 91\n 052\n 062\n 049\n 059\n 31000\n 289\n 462\n 0.78\n 0.78\n 39\n 501\n 654\n 8519\n 12957\n 2354\n 38392\n 22937\n 26680\n -42\n 5\n 265\n 47\n 0\n 42100\n 1\n 2100\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 228\n 28\n 19\n \n \n 5000\n 249\n 39\n 15\n \n \n 10000\n 246\n 26\n 6\n \n \n 14000\n 261\n 35\n -1\n \n \n 18000\n 273\n 42\n -12\n \n \n 24000\n 262\n 49\n -24\n \n \n 30000\n 266\n 46\n -39\n \n \n 34000\n 262\n 52\n -50\n \n \n 39000\n 283\n 66\n -61\n \n \n 45000\n 286\n 71\n -63\n \n \n \n \n \n SAWED\n SAWED\n wpt\n \n 37.533536\n -75.858083\n CRZ\n J121\n 0\n 42\n 022\n 034\n 016\n 027\n 31000\n 289\n 462\n 0.78\n 0.78\n 25\n 487\n 310\n 8830\n 12858\n 1109\n 39501\n 21828\n 25571\n -42\n 5\n 263\n 58\n 0\n 42300\n 0\n 2100\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 224\n 29\n 20\n \n \n 5000\n 260\n 35\n 16\n \n \n 10000\n 250\n 31\n 5\n \n \n 14000\n 263\n 44\n -2\n \n \n 18000\n 266\n 49\n -12\n \n \n 24000\n 267\n 55\n -24\n \n \n 30000\n 264\n 57\n -39\n \n \n 34000\n 262\n 64\n -50\n \n \n 39000\n 277\n 70\n -60\n \n \n 45000\n 284\n 74\n -64\n \n \n \n \n \n KALDA\n KALDA\n wpt\n \n 37.841958\n -75.626483\n CRZ\n J121\n 0\n 22\n 030\n 042\n 024\n 035\n 31000\n 289\n 462\n 0.78\n 0.78\n 33\n 495\n 160\n 8990\n 12811\n 569\n 40070\n 21259\n 25002\n -42\n 5\n 263\n 58\n 0\n 42300\n 0\n 2100\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 224\n 29\n 20\n \n \n 5000\n 260\n 35\n 16\n \n \n 10000\n 250\n 31\n 5\n \n \n 14000\n 263\n 44\n -2\n \n \n 18000\n 266\n 49\n -12\n \n \n 24000\n 267\n 55\n -24\n \n \n 30000\n 264\n 57\n -39\n \n \n 34000\n 262\n 64\n -50\n \n \n 39000\n 277\n 70\n -60\n \n \n 45000\n 284\n 74\n -64\n \n \n \n \n \n DUNFE\n DUNFE\n wpt\n \n 37.888564\n -75.591497\n CRZ\n J121\n 0\n 3\n 030\n 042\n 024\n 035\n 31000\n 289\n 462\n 0.78\n 0.78\n 33\n 495\n 22\n 9012\n 12787\n 77\n 40147\n 21182\n 24925\n -42\n 5\n 263\n 58\n 0\n 42300\n 0\n 2000\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 224\n 29\n 20\n \n \n 5000\n 260\n 35\n 16\n \n \n 10000\n 250\n 31\n 5\n \n \n 14000\n 263\n 44\n -2\n \n \n 18000\n 266\n 49\n -12\n \n \n 24000\n 267\n 55\n -24\n \n \n 30000\n 264\n 57\n -39\n \n \n 34000\n 262\n 64\n -50\n \n \n 39000\n 277\n 70\n -60\n \n \n 45000\n 284\n 74\n -64\n \n \n \n \n \n SWL\n SNOW HILL\n vor\n 112.40\n 38.056594\n -75.463900\n CRZ\n J121\n 0\n 12\n 030\n 042\n 025\n 037\n 31000\n 289\n 462\n 0.78\n 0.78\n 28\n 490\n 88\n 9100\n 12784\n 313\n 40460\n 20869\n 24612\n -42\n 5\n 265\n 53\n 0\n 42200\n 0\n 2000\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 227\n 35\n 19\n \n \n 5000\n 249\n 39\n 16\n \n \n 10000\n 259\n 32\n 5\n \n \n 14000\n 267\n 42\n -2\n \n \n 18000\n 265\n 46\n -12\n \n \n 24000\n 264\n 55\n -24\n \n \n 30000\n 266\n 53\n -39\n \n \n 34000\n 265\n 54\n -50\n \n \n 39000\n 275\n 67\n -61\n \n \n 45000\n 286\n 74\n -64\n \n \n \n \n \n RADDS\n RADDS\n wpt\n \n 38.648556\n -75.088467\n CRZ\n J121\n 0\n 40\n 026\n 038\n 019\n 031\n 31000\n 289\n 462\n 0.78\n 0.78\n 25\n 487\n 296\n 9396\n 12771\n 1049\n 41509\n 19820\n 23563\n -42\n 5\n 268\n 60\n 0\n 42100\n 1\n 2100\n KZDC\n N,F\n 19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000\n \n \n 0\n 230\n 30\n 19\n \n \n 5000\n 258\n 34\n 16\n \n \n 10000\n 256\n 33\n 4\n \n \n 14000\n 254\n 47\n -2\n \n \n 18000\n 264\n 57\n -11\n \n \n 24000\n 264\n 64\n -25\n \n \n 30000\n 269\n 60\n -40\n \n \n 34000\n 266\n 59\n -50\n \n \n 39000\n 269\n 76\n -61\n \n \n 45000\n 283\n 76\n -64\n \n \n \n \n \n TOD\n TOP OF DESCENT\n ltlg\n \n 39.050506\n -74.829540\n CRZ\n J121\n 0\n 27\n 026\n 038\n 019\n 031\n 31000\n 289\n 462\n 0.78\n 0.78\n 25\n 487\n 200\n 9595\n 12726\n 706\n 42215\n 19114\n 22857\n -42\n 5\n 268\n 60\n 0\n 42100\n 1\n 2100\n KZDC\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 230\n 30\n 19\n \n \n 5000\n 258\n 34\n 16\n \n \n 10000\n 256\n 33\n 4\n \n \n 14000\n 254\n 47\n -2\n \n \n 18000\n 264\n 57\n -11\n \n \n 24000\n 264\n 64\n -25\n \n \n 30000\n 269\n 60\n -40\n \n \n 34000\n 266\n 59\n -50\n \n \n 39000\n 269\n 76\n -61\n \n \n 45000\n 283\n 76\n -64\n \n \n \n \n \n SIE\n SEA ISLE\n vor\n 114.80\n 39.095508\n -74.800344\n DSC\n J121\n 0\n 3\n 026\n 039\n 019\n 031\n 30200\n 294\n 464\n 0.78\n 0.78\n 24\n 488\n 22\n 9617\n 6795\n 42\n 42257\n 19072\n 22815\n -40\n 5\n 269\n 60\n 0\n 42100\n 1\n 2000\n KZDC\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 230\n 30\n 19\n \n \n 5000\n 258\n 34\n 16\n \n \n 10000\n 256\n 33\n 4\n \n \n 14000\n 254\n 47\n -2\n \n \n 18000\n 264\n 57\n -11\n \n \n 24000\n 264\n 64\n -25\n \n \n 30000\n 269\n 60\n -40\n \n \n 34000\n 266\n 59\n -50\n \n \n 39000\n 269\n 76\n -61\n \n \n 45000\n 283\n 76\n -64\n \n \n \n \n \n BOTON\n BOTON\n wpt\n \n 39.414472\n -74.454744\n DSC\n CAMRN4\n 1\n 25\n 039\n 052\n 033\n 045\n 23200\n 300\n 441\n 0.71\n 0.71\n 41\n 482\n 187\n 9804\n 7122\n 369\n 42626\n 18703\n 22446\n -23\n 8\n 267\n 65\n 0\n 42200\n 0\n 2100\n KZDC\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 231\n 34\n 17\n \n \n 5000\n 253\n 38\n 16\n \n \n 10000\n 249\n 36\n 4\n \n \n 14000\n 254\n 39\n -3\n \n \n 18000\n 267\n 51\n -11\n \n \n 24000\n 267\n 64\n -25\n \n \n 30000\n 269\n 57\n -40\n \n \n 34000\n 272\n 58\n -50\n \n \n 39000\n 273\n 71\n -62\n \n \n 45000\n 285\n 73\n -64\n \n \n \n \n \n HOGGS\n HOGGS\n wpt\n \n 39.582847\n -74.270575\n DSC\n CAMRN4\n 1\n 13\n 040\n 053\n 035\n 047\n 19500\n 300\n 415\n 0.66\n 0.66\n 40\n 455\n 103\n 9907\n 7207\n 206\n 42832\n 18497\n 22240\n -14\n 10\n 262\n 56\n 0\n 41300\n 5\n 2100\n KZDC\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 251\n 17\n 13\n \n \n 5000\n 260\n 38\n 14\n \n \n 10000\n 250\n 42\n 3\n \n \n 14000\n 261\n 44\n -3\n \n \n 18000\n 264\n 52\n -11\n \n \n 24000\n 262\n 60\n -25\n \n \n 30000\n 267\n 64\n -40\n \n \n 34000\n 271\n 68\n -50\n \n \n 39000\n 270\n 75\n -63\n \n \n 45000\n 279\n 76\n -63\n \n \n \n \n \n PANZE\n PANZE\n wpt\n \n 39.675994\n -74.168181\n DSC\n CAMRN4\n 1\n 7\n 040\n 053\n 035\n 048\n 17600\n 300\n 403\n 0.63\n 0.63\n 34\n 437\n 58\n 9964\n 7241\n 116\n 42948\n 18381\n 22124\n -9\n 11\n 265\n 50\n 0\n 41300\n 5\n 2100\n KZNY\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 251\n 17\n 13\n \n \n 5000\n 260\n 38\n 14\n \n \n 10000\n 250\n 42\n 3\n \n \n 14000\n 261\n 44\n -3\n \n \n 18000\n 264\n 52\n -11\n \n \n 24000\n 262\n 60\n -25\n \n \n 30000\n 267\n 64\n -40\n \n \n 34000\n 271\n 68\n -50\n \n \n 39000\n 270\n 75\n -63\n \n \n 45000\n 279\n 76\n -63\n \n \n \n \n \n KARRS\n KARRS\n wpt\n \n 39.840872\n -73.985989\n DSC\n CAMRN4\n 1\n 13\n 040\n 053\n 036\n 049\n 14000\n 300\n 379\n 0.59\n 0.59\n 32\n 411\n 114\n 10078\n 7242\n 229\n 43177\n 18152\n 21895\n -3\n 10\n 261\n 44\n 0\n 41300\n 5\n 2100\n KZNY\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 251\n 17\n 13\n \n \n 5000\n 260\n 38\n 14\n \n \n 10000\n 250\n 42\n 3\n \n \n 14000\n 261\n 44\n -3\n \n \n 18000\n 264\n 52\n -11\n \n \n 24000\n 262\n 60\n -25\n \n \n 30000\n 267\n 64\n -40\n \n \n 34000\n 271\n 68\n -50\n \n \n 39000\n 270\n 75\n -63\n \n \n 45000\n 279\n 76\n -63\n \n \n \n \n \n CAMRN\n CAMRN\n wpt\n \n 40.017303\n -73.861058\n DSC\n CAMRN4\n 1\n 12\n 028\n 041\n 023\n 036\n 10600\n 300\n 358\n 0.55\n 0.55\n 30\n 388\n 111\n 10190\n 7211\n 223\n 43400\n 17929\n 21672\n 2\n 8\n 251\n 42\n 0\n 41300\n 5\n 2000\n KZNY\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 251\n 17\n 13\n \n \n 5000\n 260\n 38\n 14\n \n \n 10000\n 250\n 42\n 3\n \n \n 14000\n 261\n 44\n -3\n \n \n 18000\n 264\n 52\n -11\n \n \n 24000\n 262\n 60\n -25\n \n \n 30000\n 267\n 64\n -40\n \n \n 34000\n 271\n 68\n -50\n \n \n 39000\n 270\n 75\n -63\n \n \n 45000\n 279\n 76\n -63\n \n \n \n \n \n KJFK\n KENNEDY INTL\n apt\n \n 40.639928\n -73.778692\n DSC\n CAMRN4\n 1\n 46\n 005\n 019\n 357\n 010\n 2500\n 250\n 262\n 0.39\n 0.39\n 17\n 279\n 785\n 10975\n 7159\n 2250\n 45650\n 15679\n 19422\n 16\n 6\n 247\n 42\n 1\n 41100\n 221\n 2200\n KZNY\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 160\n 2\n 8\n \n \n 5000\n 259\n 43\n 12\n \n \n 10000\n 256\n 39\n 3\n \n \n 14000\n 255\n 43\n -4\n \n \n 18000\n 260\n 53\n -12\n \n \n 24000\n 254\n 60\n -25\n \n \n 30000\n 263\n 67\n -40\n \n \n 34000\n 262\n 60\n -51\n \n \n 39000\n 271\n 80\n -63\n \n \n 45000\n 278\n 82\n -62\n \n \n \n \n \n \n \n (FPL-VMS100-IS\n-A306/H-SDE2E3FGHIRYW/LB1\n-KAUS1230\n-N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY\n Q64 TYI J209 ORF J121 SIE CAMRN4\n-KJFK0302 KBOS\n-PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105\n KZDC0157 KZNY0246 OPR/VMS RMK/TCAS)\n N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n VMS100\n 0463\n N\n 310\n F\n PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105 KZDC0157 KZNY0246 OPR/VMS RMK/TCAS\n KZHU\n KZNY\n KZBW\n \n KZME\n KZTL\n KZDC\n KZNY\n \n \n A306\n \n A300F4-600\n N306SB\n 306\n \n H-SDE2E3FGHIRYW/LB1\n 345\n 1\n \n \n 2000\n 45650\n 3743\n 8389\n 7290\n 0\n 0\n 65072\n 65072\n 67072\n 21422\n 14974\n 68100\n \n \n 10975\n 7140\n 1388579400\n 1388580000\n 1388587140\n 1388587500\n 8100\n 1388579400\n 1388580000\n 1388590975\n 1388591335\n 11935\n -6\n -5\n 600\n 360\n 2700\n 17092\n 900\n 0\n 0\n \n \n 200400\n 340\n 230\n 500\n 78700\n 279100\n 286600\n 344172\n 354250\n 375800\n L\n 298522\n 308600\n 346172\n \n \n \n 11068\n 93\n 47096\n 1446\n 68100\n 250\n 456\n 0.74\n 64\n \n \n 10793\n -182\n 45927\n 277\n 67436\n 270\n 473\n 0.77\n 64\n \n \n 10881\n -94\n 45841\n 191\n 67312\n 290\n 469\n 0.78\n 64\n \n \n \n \n \n \n \n 10975\n 0\n 45782\n 132\n 67215\n 310\n 463\n 0.78\n 64\n \n \n 10974\n -1\n 45462\n -188\n 66869\n 310\n 463\n 0.78\n 64\n \n \n \n 120867\n NABEEL SHAHZAD\n RAMON HERMAN\n GLADYS KAUFMAN\n GERARD HAMMOND\n JOANNA COHEN\n DARRIN SHAW\n JACQUELINE KELLY\n KRISTEN CROSS\n BERNADETTE MACIAS\n BRENDAN MANNING\n JOANNE TANNER\n MARGUERITE HOLT\n HENRIETTA INGRAM\n EDUARDO BOONE\n BENNY PACE\n \n \n \n I\n KAUS\n A0456/20\n 1\n KAUS\n AUS\n 03/078\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202003181631\n 202003181638\n A0456/20 NOTAMN\nQ) KZHU/QMXLC/IV/BO/A/000/999/3012N09740W005\nA) KAUS\nB) 2003181631\nC) PERM\nE) TWY R CLSD\n TWY R CLSD. 18 MAR 16:31 2020 UNTIL PERM. CREATED: 18 MAR 16:38 2020\n NOTAMN\n QMXLC\n \n \n I\n KAUS\n A0335/20\n 1\n KAUS\n AUS\n 03/009\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202003030119\n 202004181700\n 202003030120\n A0335/20 NOTAMN\nQ) KZHU/QMXLC/IV/BO/A/000/999/3012N09740W005\nA) KAUS\nB) 2003030119\nC) 2004181700\nE) TWY G BTN TWY G3 AND TWY C CLSD TO ACFT WINGSPAN MORE THAN\n118FT\n TWY G BTN TWY G3 AND TWY C CLSD TO ACFT WINGSPAN MORE THAN 118FT. 03 MAR 01:19 2020 UNTIL 18 APR 17:00 2020. CREATED: 03 MAR 01:19 2020\n NOTAMN\n QMXLC\n \n \n I\n KAUS\n A0320/20\n 1\n KAUS\n AUS\n 02/100\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202002290501\n 202004301200\n 202002290510\n A0320/20 NOTAMN\nQ) KZHU/QMNHW////000/999/3012N09740W005\nA) KAUS\nB) 2002290501\nC) 2004301200\nE) APRON TERMINAL APN WIP OPN TRENCH ADJ SW CORNER LGTD AND\nBARRICADED\n APRON TERMINAL APN WIP OPN TRENCH ADJ SW CORNER LGTD AND BARRICADED. 29 FEB 05:01 2020 UNTIL 30 APR 12:00 2020. CREATED: 29 FEB 05:10 2020\n NOTAMN\n QMNHW\n \n \n I\n KAUS\n A0317/20\n 1\n KAUS\n AUS\n 02/097\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202002290326\n 202004301800\n 202002290333\n A0317/20 NOTAMN\nQ) KZHU/QMXLC/IV/BO/A/000/999/3012N09740W005\nA) KAUS\nB) 2002290326\nC) 2004301800\nE) TWY C BTN TWY G AND TWY W CLSD\n TWY C BTN TWY G AND TWY W CLSD. 29 FEB 03:26 2020 UNTIL 30 APR 18:00 2020. CREATED: 29 FEB 03:33 2020\n NOTAMN\n QMXLC\n \n \n I\n KAUS\n A0312/20\n 1\n KAUS\n AUS\n 02/095\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202002290200\n 202004301800\n 202002290213\n A0312/20 NOTAMN\nQ) KZHU/QLXAS////000/999/3012N09740W005\nA) KAUS\nB) 2002290200\nC) 2004301800\nE) TWY G3 CL LGT U/S\n TWY G3 CL LGT U/S. 29 FEB 02:00 2020 UNTIL 30 APR 18:00 2020. CREATED: 29 FEB 02:13 2020\n NOTAMN\n QLXAS\n \n \n I\n KAUS\n A0218/20\n 1\n KAUS\n AUS\n 02/019\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202002071352\n 202002071359\n A0218/20 NOTAMN\nQ) KZHU/QLJAS////000/999/3012N09740W005\nA) KAUS\nB) 2002071352\nC) 2102012000 EST\nE) RWY 35L RAI LGT U/S\n RWY 35L RAI LGT U/S. 07 FEB 13:52 2020 UNTIL 01 FEB 20:00 2021 ESTIMATED. CREATED: 07 FEB 13:59 2020\n NOTAMN\n QLJAS\n \n \n I\n KAUS\n A1771/19\n 1\n KAUS\n FDC\n 9/7018\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201911201522\n 201911201523\n A1771/19 NOTAMN\nQ) KZHU/QPICH/I/NBO/A/000/999/\nA) KAUS\nB) 1911201522\nC) 2111201522 EST\nE) ILS OR LOC RWY 35L, AMDT 6B...\nDISREGARD OUTER MARKER INDICATION.\n ILS OR LOC RWY 35L, AMDT 6B... DISREGARD OUTER MARKER INDICATION. 20 NOV 15:22 2019 UNTIL 20 NOV 15:22 2021 ESTIMATED. CREATED: 20 NOV 15:23 2019\n NOTAMN\n QPICH\n \n \n I\n KAUS\n A1466/19\n 1\n KAUS\n FDC\n 9/0357\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201910041331\n 201910041350\n A1466/19 NOTAMN\nQ) KZHU/QPICH/I/NBO/A/000/999/\nA) KAUS\nB) 1910041331\nC) 2110041331 EST\nE) RNAV (RNP) Z RWY 17R, AMDT 1...\nRNP 0.30 DA 885/HAT 343 ALL CATS.\nPERMANENT TOWER, 582FT MSL, 4954FT NORTH OF APCH END RWY 17R.\n RNAV (RNP) Z RWY 17R, AMDT 1... RNP 0.30 DA 885/HAT 343 ALL CATS. PERMANENT TOWER, 582FT MSL, 4954FT NORTH OF APCH END RWY 17R. 04 OCT 13:31 2019 UNTIL 04 OCT 13:31 2021 ESTIMATED. CREATED: 04 OCT 13:50 2019\n NOTAMN\n QPICH\n \n \n I\n KAUS\n A0804/19\n 1\n KAUS\n FDC\n 9/7299\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201905311919\n 201905311921\n A0804/19 NOTAMN\n\tQ) KZHU/QPDCH/I/NBO/A/000/999/\n\tA) KAUS\n\tB) 1905311919\n\tC) 2105311919 EST\n\tE) AUSTIN FIVE DEPARTURE...\n\tMINIMUM ALTITUDE AMUSE INT TO JUNCTION VORTAC, 7000 FT.\n AUSTIN FIVE DEPARTURE... MINIMUM ALTITUDE AMUSE INT TO JUNCTION VORTAC, 7000 FT. 31 MAY 19:19 2019 UNTIL 31 MAY 19:19 2021 ESTIMATED. CREATED: 31 MAY 19:21 2019\n NOTAMN\n QPDCH\n \n \n F\n FDC\n 9/7018\n 1\n AUS\n KAUS\n A1771/19\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201911201522\n 202111201522\n 201911201523\n !FDC 9/7018 AUS IAP AUSTIN-BERGSTROM INTL, AUSTIN, TX.\nILS OR LOC RWY 35L, AMDT 6B...\nDISREGARD OUTER MARKER INDICATION.\n1911201522-2111201522EST\n IAP AUSTIN-BERGSTROM INTL, AUSTIN, TX. ILS OR LOC RWY 35L, AMDT 6B... DISREGARD OUTER MARKER INDICATION. 20 NOV 15:22 2019 UNTIL 20 NOV 15:22 2021 ESTIMATED. CREATED: 20 NOV 15:23 2019\n QPICH\n \n \n F\n FDC\n 9/0357\n 1\n AUS\n KAUS\n A1466/19\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201910041331\n 202110041331\n 201910041350\n !FDC 9/0357 AUS IAP AUSTIN-BERGSTROM INTL, Austin, TX.\nRNAV (RNP) Z RWY 17R, AMDT 1...\nRNP 0.30 DA 885/HAT 343 ALL CATS.\nPERMANENT TOWER, 582 MSL, 4954 FT NORTH OF APCH END RWY 17R\n(48-144442).\n1910041331-2110041331EST\n IAP AUSTIN-BERGSTROM INTL, Austin, TX. RNAV (RNP) Z RWY 17R, AMDT 1... RNP 0.30 DA 885/HAT 343 ALL CATS. PERMANENT TOWER, 582 MSL, 4954 FT NORTH OF APCH END RWY 17R (48-144442). 04 OCT 13:31 2019 UNTIL 04 OCT 13:31 2021 ESTIMATED. CREATED: 04 OCT 13:32 2019\n QPICH\n \n \n F\n FDC\n 9/7299\n 1\n AUS\n KAUS\n A0804/19\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 201905311919\n 202105311919\n 201905311921\n !FDC 9/7299 AUS SID AUSTIN-BERGSTROM INTL, Austin, TX.\n\tAUSTIN FIVE DEPARTURE...\n\tMINIMUM ALTITUDE AMUSE INT TO JUNCTION VORTAC, 7000 FT.\n\t1905311919-2105311919EST\n SID AUSTIN-BERGSTROM INTL, Austin, TX. AUSTIN FIVE DEPARTURE... MINIMUM ALTITUDE AMUSE INT TO JUNCTION VORTAC, 7000 FT. 31 MAY 19:19 2019 UNTIL 31 MAY 19:19 2021 ESTIMATED. CREATED: 31 MAY 19:20 2019\n QPDCH\n \n \n D\n AUS\n 03/094\n 1\n AUS\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202003221310\n 202006200400\n 202003221316\n !AUS 03/094 AUS OBST TOWER LGT (ASR 1058489) 300812.00N0974220.00W (3.9NM SSW AUS) 818.9FT (259.8FT AGL) U/S 2003221310-2006200400\n OBST TOWER LGT (ASR 1058489) 300812.00N0974220.00W (3.9NM SSW AUS) 818.9FT (259.8FT AGL) U/S. 22 MAR 13:10 2020 UNTIL 20 JUN 04:00 2020. CREATED: 22 MAR 13:10 2020\n \n \n D\n AUS\n 03/079\n 1\n AUS\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202003181826\n 202004172359\n 202003181833\n !AUS 03/079 AUS OBST TOWER LGT (ASR 1241722) 301635.90N0973556.30W (6.1NM NE AUS) 807.7FT (234.9FT AGL) U/S 2003181826-2004172359EST\n OBST TOWER LGT (ASR 1241722) 301635.90N0973556.30W (6.1NM NE AUS) 807.7FT (234.9FT AGL) U/S. 18 MAR 18:26 2020 UNTIL 17 APR 23:59 2020 ESTIMATED. CREATED: 18 MAR 18:27 2020\n \n \n D\n AUS\n 03/057\n 1\n AUS\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202003151526\n 202003301525\n 202003151531\n !AUS 03/057 AUS OBST TOWER LGT (ASR 1013180) 301923.80N0974759.50W (10.2NM NW AUS) 2046.9FT (1229.0FT AGL) U/S 2003151526-2003301525\n OBST TOWER LGT (ASR 1013180) 301923.80N0974759.50W (10.2NM NW AUS) 2046.9FT (1229.0FT AGL) U/S. 15 MAR 15:26 2020 UNTIL 30 MAR 15:25 2020. CREATED: 15 MAR 15:25 2020\n \n \n D\n AUS\n 02/099\n 1\n AUS\n KAUS\n AUSTIN-BERGSTROM INTL\n 1\n 202002290500\n 202004301200\n 202002290506\n !AUS 02/099 AUS TWY G3 NORTH OF TWY G EDGE MARKING REMOVED 2002290500-2004301200\n TWY G3 NORTH OF TWY G EDGE MARKING REMOVED. 29 FEB 05:00 2020 UNTIL 30 APR 12:00 2020. CREATED: 29 FEB 05:00 2020\n QMXXX\n \n \n I\n KBOS\n A2515/20\n 1\n KBOS\n BOS\n 03/459\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271249\n 202003281900\n 202003271256\n A2515/20 NOTAMN\nQ) KZBW/QFAXX////000/999/4222N07100W005\nA) KBOS\nB) 2003271249\nC) 2003281900\nE) AP BIRD ACT INCREASED\n AP BIRD ACT INCREASED. 27 MAR 12:49 2020 UNTIL 28 MAR 19:00 2020. CREATED: 27 MAR 12:56 2020\n NOTAMN\n QFAXX\n \n \n I\n KBOS\n A2513/20\n 1\n KBOS\n BOS\n 03/458\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271243\n 202003271900\n 202003271245\n A2513/20 NOTAMN\nQ) KZBW/QMNHW/IV/BO/A/000/999/4222N07100W005\nA) KBOS\nB) 2003271243\nC) 2003271900\nE) NORTH CARGO RAMP WIP\n NORTH CARGO RAMP WIP. 27 MAR 12:43 2020 UNTIL 27 MAR 19:00 2020. CREATED: 27 MAR 12:45 2020\n NOTAMN\n QMNHW\n \n \n I\n KBOS\n A2506/20\n 1\n KBOS\n BOS\n 03/457\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271122\n 202003271830\n 202003271126\n A2506/20 NOTAMN\nQ) KZBW/QMRLC/IV/NBO/A/000/999/4222N07100W005\nA) KBOS\nB) 2003271122\nC) 2003271830\nE) RWY 04R/22L CLSD EXC TAX 30MIN PPR 131.1\n RWY 04R/22L CLSD EXC TAX 30MIN PPR 131.1. 27 MAR 11:22 2020 UNTIL 27 MAR 18:30 2020. CREATED: 27 MAR 11:26 2020\n NOTAMN\n QMRLC\n \n \n I\n KBOS\n A2505/20\n 1\n KBOS\n BOS\n 03/456\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271120\n 202003271830\n 202003271124\n A2505/20 NOTAMN\nQ) KZBW/QMRLC/IV/NBO/A/000/999/4222N07100W005\nA) KBOS\nB) 2003271120\nC) 2003271830\nE) RWY 04L/22R CLSD EXC TAX 30MIN PPR 131.1\n RWY 04L/22R CLSD EXC TAX 30MIN PPR 131.1. 27 MAR 11:20 2020 UNTIL 27 MAR 18:30 2020. CREATED: 27 MAR 11:24 2020\n NOTAMN\n QMRLC\n \n \n I\n KBOS\n A2468/20\n 1\n KBOS\n FDC\n 0/0970\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003261045\n 202003261052\n A2468/20 NOTAMN\nQ) KZBW/QPICH/I/NBO/A/000/999/\nA) KBOS\nB) 2003261045\nC) 2203261045 EST\nE) ILS OR LOC RWY 15R, AMDT 2...\nS-LOC 15R CAT D VISIBILITY 1 1/4 SM..\n ILS OR LOC RWY 15R, AMDT 2... S-LOC 15R CAT D VISIBILITY 1 1/4 SM. 26 MAR 10:45 2020 UNTIL 26 MAR 10:45 2022 ESTIMATED. CREATED: 26 MAR 10:52 2020\n NOTAMN\n QPICH\n \n \n I\n KBOS\n A2437/20\n 1\n KBOS\n BOS\n 03/414\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003251128\n 202004042359\n 202003251134\n A2437/20 NOTAMN\nQ) KZBW/QMRLC/IV/NBO/A/000/999/4222N07100W005\nA) KBOS\nB) 2003251128\nC) 2004042359\nE) RWY 14/32 CLSD\n RWY 14/32 CLSD. 25 MAR 11:28 2020 UNTIL 04 APR 23:59 2020. CREATED: 25 MAR 11:34 2020\n NOTAMN\n QMRLC\n \n \n I\n KBOS\n A2205/20\n 1\n KBOS\n BOS\n 03/272\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003181749\n 202003312100\n 202003181752\n A2205/20 NOTAMN\nQ) KZBW/QMRLC/IV/NBO/A/000/999/4222N07100W005\nA) KBOS\nB) 2003181749\nC) 2003312100\nE) RWY 15L/33R CLSD EXC TAX\n RWY 15L/33R CLSD EXC TAX. 18 MAR 17:49 2020 UNTIL 31 MAR 21:00 2020. CREATED: 18 MAR 17:52 2020\n NOTAMN\n QMRLC\n \n \n I\n KBOS\n A2003/20\n 1\n KBOS\n FDC\n 0/4887\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003101124\n 202003101126\n A2003/20 NOTAMN\nQ) KZBW/QPDCH/I/NBO/A/000/999/\nA) KBOS\nB) 2003101124\nC) 2010261124 EST\nE) TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\nTAKEOFF MINIMUMS: RWY 27, 700-2 1/4 OR STANDARD WITH MINIMUM CLIMB\nOF 491FT PER NM TO 1300.\nTEMPORARY CRANE 697FT MSL 1.41 NM WEST OF RWY 14\n(2019-ANE-1262-OE).\nALL OTHER DATA REMAINS AS PUBLISHED.\n TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A... TAKEOFF MINIMUMS: RWY 27, 700-2 1/4 OR STANDARD WITH MINIMUM CLIMB OF 491FT PER NM TO 1300. TEMPORARY CRANE 697FT MSL 1.41 NM WEST OF RWY 14 (2019-ANE-1262-OE). ALL OTHER DATA REMAINS AS PUBLISHED. 10 MAR 11:24 2020 UNTIL 26 OCT 11:24 2020 ESTIMATED. CREATED: 10 MAR 11:25 2020\n NOTAMN\n QPDCH\n \n \n I\n KBOS\n A1748/20\n 1\n KBOS\n FDC\n 0/0831\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003150000\n 202009142359\n 202002281306\n A1748/20 NOTAMN\nQ) KZBW/QXXXX////000/999/\nA) KBOS\nB) 2003150000\nC) 2009142359\nE) SPECIAL RNAV VISUAL RWY 04L ORIG...PROC NOT AUTH.\n SPECIAL RNAV VISUAL RWY 04L ORIG...PROC NOT AUTH. 15 MAR 00:00 2020 UNTIL 14 SEP 23:59 2020. CREATED: 28 FEB 13:06 2020\n NOTAMN\n QXXXX\n \n \n I\n KBOS\n A1474/20\n 1\n KBOS\n BOS\n 02/342\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002181633\n 202004141000\n 202002181639\n A1474/20 NOTAMN\nQ) KZBW/QOBCE/IV/M/AE/000/999/4222N07100W005\nA) KBOS\nB) 2002181633\nC) 2004141000\nE) CRANE (ASN UNKNOWN) 422157N0710117W (0.36NM NW APCH END\nRWY 04L) UNKNOWN (150FT AGL) FLAGGED AND LGTD\n CRANE (ASN UNKNOWN) 422157N0710117W (0.36NM NW APCH END RWY 04L) UNKNOWN (150FT AGL) FLAGGED AND LGTD. 18 FEB 16:33 2020 UNTIL 14 APR 10:00 2020. CREATED: 18 FEB 16:39 2020\n NOTAMN\n QOBCE\n \n \n I\n KBOS\n A1327/20\n 1\n KBOS\n FDC\n 0/4438\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202002122216\n A1327/20 NOTAMN\nQ) KZBW/QPDCH/I/NBO/A/000/999/\nA) KBOS\nB) 2002122214\nC) 2102122214 EST\nE) TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 1300.\nALL OTHER DATA REMAINS AS PUBLISHED.\n TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 1300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:16 2020\n NOTAMN\n QPDCH\n \n \n I\n KBOS\n A1328/20\n 1\n KBOS\n FDC\n 0/4439\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202002122216\n A1328/20 NOTAMN\nQ) KZBW/QPDCH/I/NBO/A/000/999/\nA) KBOS\nB) 2002122214\nC) 2102122214 EST\nE) BLZZR FOUR DEPARTURE (RNAV)...\nBRUWN FIVE DEPARTURE (RNAV)...\nCELTK FIVE DEPARTURE (RNAV)...\nHYLND FIVE DEPARTURE (RNAV)...\nLBSTA SIX DEPARTURE (RNAV)...\nLOGAN TWO DEPARTURE...\nPATSS FIVE DEPARTURE (RNAV)...\nREVSS FOUR DEPARTURE (RNAV)...\nSSOXS FIVE DEPARTURE (RNAV)...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 1300.\nALL OTHER DATA REMAINS AS PUBLISHED.\n BLZZR FOUR DEPARTURE (RNAV)... BRUWN FIVE DEPARTURE (RNAV)... CELTK FIVE DEPARTURE (RNAV)... HYLND FIVE DEPARTURE (RNAV)... LBSTA SIX DEPARTURE (RNAV)... LOGAN TWO DEPARTURE... PATSS FIVE DEPARTURE (RNAV)... REVSS FOUR DEPARTURE (RNAV)... SSOXS FIVE DEPARTURE (RNAV)... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 1300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:16 2020\n NOTAMN\n QPDCH\n \n \n I\n KBOS\n A1329/20\n 1\n KBOS\n FDC\n 0/4440\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202002122216\n A1329/20 NOTAMN\nQ) KZBW/QPDCH/I/NBO/A/000/999/\nA) KBOS\nB) 2002122214\nC) 2102122214 EST\nE) WYLYY THREE DEPARTURE (RNAV)...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 2300.\nALL OTHER DATA REMAINS AS PUBLISHED.\n WYLYY THREE DEPARTURE (RNAV)... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 2300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:16 2020\n NOTAMN\n QPDCH\n \n \n I\n KBOS\n A0811/19\n 1\n KBOS\n BOS\n 10/402\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 201910221653\n 201910221711\n A0811/19 NOTAMN\nQ) KZBW/QMNLC/IV/NBO/A/000/999/4222N07100W005\nA) KBOS\nB) 1910221653\nC) PERM\nE) APRON GA RAMP CLSD TO GA EXC 4HR PPR 617-561-2500\n APRON GA RAMP CLSD TO GA EXC 4HR PPR 617-561-2500. 22 OCT 16:53 2019 UNTIL PERM. CREATED: 22 OCT 17:11 2019\n NOTAMN\n QMNLC\n \n \n F\n FDC\n 0/0970\n 1\n BOS\n KBOS\n A2468/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003261045\n 202203261045\n 202003261052\n !FDC 0/0970 BOS IAP GENERAL EDWARD LAWRENCE LOGAN\nINTL, BOSTON, MA.\nILS OR LOC RWY 15R, AMDT 2...\nS-LOC 15R CAT D VISIBILITY 1 1/4 SM..\n2003261045-2203261045EST\n IAP GENERAL EDWARD LAWRENCE LOGAN INTL, BOSTON, MA. ILS OR LOC RWY 15R, AMDT 2... S-LOC 15R CAT D VISIBILITY 1 1/4 SM. 26 MAR 10:45 2020 UNTIL 26 MAR 10:45 2022 ESTIMATED. CREATED: 26 MAR 10:46 2020\n QPICH\n \n \n F\n FDC\n 0/0655\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003251036\n 202004241036\n 202003281643\n 202003251643\n !FDC 0/0655 BOS CANCELLED BY FDC 0/0769 ON 03/25/20 16:43\n 0/0655 CANCELLED BY FDC 0/0769 ON 03/25/20 16:43\n QPICH\n \n \n F\n FDC\n 0/4887\n 1\n BOS\n KBOS\n A2003/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003101124\n 202010261124\n 202003101126\n !FDC 0/4887 BOS ODP GENERAL EDWARD LAWRENCE LOGAN\nINTL, Boston, MA.\nTAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\nTAKEOFF MINIMUMS: RWY 27, 700-2 1/4 OR STANDARD WITH MINIMUM CLIMB\nOF 491FT PER NM TO 1300.\nTEMPORARY CRANE 697FT MSL 1.41 NM WEST OF RWY 14\n(2019-ANE-1262-OE).\nALL OTHER DATA REMAINS AS PUBLISHED. 2003101124-2010261124EST\n ODP GENERAL EDWARD LAWRENCE LOGAN INTL, Boston, MA. TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A... TAKEOFF MINIMUMS: RWY 27, 700-2 1/4 OR STANDARD WITH MINIMUM CLIMB OF 491FT PER NM TO 1300. TEMPORARY CRANE 697FT MSL 1.41 NM WEST OF RWY 14 (2019-ANE-1262-OE). ALL OTHER DATA REMAINS AS PUBLISHED. 10 MAR 11:24 2020 UNTIL 26 OCT 11:24 2020 ESTIMATED. CREATED: 10 MAR 11:24 2020\n QPDCH\n \n \n F\n FDC\n 0/0831\n 1\n BOS\n KBOS\n A1748/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003150000\n 202009142359\n 202002281306\n !FDC 0/0831 BOS SPECIAL EDWARD LAWERENCE LOGAN INTL. BOSTON, MA.\nSPECIAL RNAV VISUAL RWY 04L ORIG...PROC NOT AUTH.\n\n2003150000-2009142359\n SPECIAL EDWARD LAWERENCE LOGAN INTL. BOSTON, MA. SPECIAL RNAV VISUAL RWY 04L ORIG...PROC NOT AUTH. 15 MAR 00:00 2020 UNTIL 14 SEP 23:59 2020. CREATED: 28 FEB 13:06 2020\n QXXXX\n \n \n F\n FDC\n 0/4438\n 1\n BOS\n KBOS\n A1327/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202102122214\n 202002122216\n !FDC 0/4438 BOS ODP GENERAL EDWARD LAWRENCE LOGAN\nINTL, BOSTON, MA.\nTAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 1300.\nALL OTHER DATA REMAINS AS PUBLISHED. 2002122214-2102122214EST\n ODP GENERAL EDWARD LAWRENCE LOGAN INTL, BOSTON, MA. TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 1300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:15 2020\n QPDCH\n \n \n F\n FDC\n 0/4439\n 1\n BOS\n KBOS\n A1328/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202102122214\n 202002122216\n !FDC 0/4439 BOS SID GENERAL EDWARD LAWRENCE LOGAN\nINTL, BOSTON, MA.\nBLZZR FOUR DEPARTURE (RNAV)...\nBRUWN FIVE DEPARTURE (RNAV)...\nCELTK FIVE DEPARTURE (RNAV)...\nHYLND FIVE DEPARTURE (RNAV)...\nLBSTA SIX DEPARTURE (RNAV)...\nLOGAN TWO DEPARTURE...\nPATSS FIVE DEPARTURE (RNAV)...\nREVSS FOUR DEPARTURE (RNAV)...\nSSOXS FIVE DEPARTURE (RNAV)...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 1300.\nALL OTHER DATA REMAINS AS PUBLISHED. 2002122214-2102122214EST\n SID GENERAL EDWARD LAWRENCE LOGAN INTL, BOSTON, MA. BLZZR FOUR DEPARTURE (RNAV)... BRUWN FIVE DEPARTURE (RNAV)... CELTK FIVE DEPARTURE (RNAV)... HYLND FIVE DEPARTURE (RNAV)... LBSTA SIX DEPARTURE (RNAV)... LOGAN TWO DEPARTURE... PATSS FIVE DEPARTURE (RNAV)... REVSS FOUR DEPARTURE (RNAV)... SSOXS FIVE DEPARTURE (RNAV)... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 1300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:15 2020\n QPDCH\n \n \n F\n FDC\n 0/4440\n 1\n BOS\n KBOS\n A1329/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002122214\n 202102122214\n 202002122216\n !FDC 0/4440 BOS SID GENERAL EDWARD LAWRENCE LOGAN\nINTL, BOSTON, MA.\nWYLYY THREE DEPARTURE (RNAV)...\nTAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM\nCLIMB GRADIENT OF 500FT PER NM TO 2300.\nALL OTHER DATA REMAINS AS PUBLISHED. 2002122214-2102122214EST\n SID GENERAL EDWARD LAWRENCE LOGAN INTL, BOSTON, MA. WYLYY THREE DEPARTURE (RNAV)... TAKEOFF MINIMUMS: RWY 27, 800 - 2 1/4 OR STANDARD WITH MINIMUM CLIMB GRADIENT OF 500FT PER NM TO 2300. ALL OTHER DATA REMAINS AS PUBLISHED. 12 FEB 22:14 2020 UNTIL 12 FEB 22:14 2021 ESTIMATED. CREATED: 12 FEB 22:15 2020\n QPDCH\n \n \n D\n BOS\n 03/459\n 1\n BOS\n KBOS\n A2515/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271249\n 202003281900\n 202003271256\n !BOS 03/459 BOS AD AP BIRD ACT INCREASED 2003271249-2003281900\n AD AP BIRD ACT INCREASED. 27 MAR 12:49 2020 UNTIL 28 MAR 19:00 2020. CREATED: 27 MAR 12:49 2020\n QFAXX\n \n \n D\n BOS\n 03/458\n 1\n BOS\n KBOS\n A2513/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003271243\n 202003271900\n 202003271245\n !BOS 03/458 BOS APRON NORTH CARGO RAMP WIP 2003271243-2003271900\n APRON NORTH CARGO RAMP WIP. 27 MAR 12:43 2020 UNTIL 27 MAR 19:00 2020. CREATED: 27 MAR 12:43 2020\n QMNHW\n \n \n D\n BOS\n 03/445\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003270010\n 202005011200\n 202003270016\n !BOS 03/445 BOS TWY B TWY DIRECTION SIGN FOR TWY A2 LGT U/S 2003270010-2005011200\n TWY B TWY DIRECTION SIGN FOR TWY A2 LGT U/S. 27 MAR 00:10 2020 UNTIL 01 MAY 12:00 2020. CREATED: 27 MAR 00:10 2020\n QMXXX\n \n \n D\n BOS\n 03/082\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202003051645\n 202204012359\n 202003051650\n !BOS 03/082 BOS OBST STRUCTURE (ASN UNKNOWN) 422209N0710446W (2.6NM W BOS) UNKNOWN (302FT AGL) NOT LGTD 2003051645-2204012359\n OBST STRUCTURE (ASN UNKNOWN) 422209N0710446W (2.6NM W BOS) UNKNOWN (302FT AGL) NOT LGTD. 05 MAR 16:45 2020 UNTIL 01 APR 23:59 2022. CREATED: 05 MAR 16:44 2020\n \n \n D\n BOS\n 02/354\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002182200\n 202003312359\n 202002182206\n !BOS 02/354 BOS OBST BLDG LGT (ASN 2017-ANE-4787-OE) 422042N0710215W (1.8NM SW BOS) 175FT (165FT AGL) U/S 2002182200-2003312359\n OBST BLDG LGT (ASN 2017-ANE-4787-OE) 422042N0710215W (1.8NM SW BOS) 175FT (165FT AGL) U/S. 18 FEB 22:00 2020 UNTIL 31 MAR 23:59 2020. CREATED: 18 FEB 22:00 2020\n \n \n D\n BOS\n 02/342\n 1\n BOS\n KBOS\n A1474/20\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002181633\n 202004141000\n 202002181639\n !BOS 02/342 BOS OBST CRANE (ASN UNKNOWN) 422157N0710117W (0.36NM NW APCH END RWY 04L) UNKNOWN (150FT AGL) FLAGGED AND LGTD 2002181633-2004141000\n OBST CRANE (ASN UNKNOWN) 422157N0710117W (0.36NM NW APCH END RWY 04L) UNKNOWN (150FT AGL) FLAGGED AND LGTD. 18 FEB 16:33 2020 UNTIL 14 APR 10:00 2020. CREATED: 18 FEB 16:33 2020\n QOBCE\n \n \n D\n BOS\n 02/177\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 202002092152\n 202004142000\n 202002092158\n !BOS 02/177 BOS TWY N HLDG PSN MARKINGS FOR RWY 15R/33L REMOVED 2002092152-2004142000\n TWY N HLDG PSN MARKINGS FOR RWY 15R/33L REMOVED. 09 FEB 21:52 2020 UNTIL 14 APR 20:00 2020. CREATED: 09 FEB 21:52 2020\n QMXXX\n \n \n D\n BOS\n 05/479\n 1\n BOS\n KBOS\n GENERAL EDWARD LAWRENCE LOGAN INTL\n 1\n 201905291220\n 201905291226\n !BOS 05/479 BOS OBST WATERTOWER LGT (ASN 2004-ANE-50-OE) 422403N0710149W (2.5NM NNW BOS) 301FT (138FT AGL) OUT OF SERVICE 1905291220-PERM\n OBST WATERTOWER LGT (ASN 2004-ANE-50-OE) 422403N0710149W (2.5NM NNW BOS) 301FT (138FT AGL) OUT OF SERVICE. 29 MAY 12:20 2019 UNTIL PERM. CREATED: 29 MAY 12:20 2019\n \n \n I\n KJFK\n A3101/20\n 1\n KJFK\n JFK\n 03/505\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003221105\n 202004260001\n 202003221114\n A3101/20 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 2003221105\nC) 2004260001\nE) TWY WW ELEVATED GUARD LGT FOR RWY 13L/31R SE SIDE U/S\n TWY WW ELEVATED GUARD LGT FOR RWY 13L/31R SE SIDE U/S. 22 MAR 11:05 2020 UNTIL 26 APR 00:01 2020. CREATED: 22 MAR 11:14 2020\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A2952/20\n 1\n KJFK\n JFK\n 03/408\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003171107\n 202004302359\n 202003171115\n A2952/20 NOTAMN\nQ) KZNY/QFAXX////000/999/4038N07347W005\nA) KJFK\nB) 2003171107\nC) 2004302359\nE) AP ABN ON CONS\n AP ABN ON CONS. 17 MAR 11:07 2020 UNTIL 30 APR 23:59 2020. CREATED: 17 MAR 11:15 2020\n NOTAMN\n QFAXX\n \n \n I\n KJFK\n A2911/20\n 1\n KJFK\n JFK\n 03/376\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003161201\n 202005150001\n 202003161218\n A2911/20 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 2003161201\nC) 2005150001\nE) TWY C1 CLSD\n TWY C1 CLSD. 16 MAR 12:01 2020 UNTIL 15 MAY 00:01 2020. CREATED: 16 MAR 12:18 2020\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A2884/20\n 1\n KJFK\n JFK\n 03/364\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003161100\n 202004012300\n 202003151834\n A2884/20 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 2003161100\nC) 2004012300\nE) TWY C CLSD BTN TWY C1 AND TWY C3 CLSD\n TWY C CLSD BTN TWY C1 AND TWY C3 CLSD. 16 MAR 11:00 2020 UNTIL 01 APR 23:00 2020. CREATED: 15 MAR 18:33 2020\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A2496/20\n 1\n KJFK\n JFK\n 03/126\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003051055\n 202004092200\n 202003051121\n A2496/20 NOTAMN\nQ) KZNY/QLXAS////000/999/4038N07347W005\nA) KJFK\nB) 2003051055\nC) 2004092200\nE) TWY C CL LGT BTN TWY C2 AND TWY C3 U/S\n TWY C CL LGT BTN TWY C2 AND TWY C3 U/S. 05 MAR 10:55 2020 UNTIL 09 APR 22:00 2020. CREATED: 05 MAR 11:21 2020\n NOTAMN\n QLXAS\n \n \n I\n KJFK\n A2481/20\n 1\n KJFK\n JFK\n 03/123\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003050920\n 202008071100\n 202003050932\n A2481/20 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 2003050920\nC) 2008071100\nE) TWY C TWY DIRECTION SIGN BTN TWY C1 AND TWY D LGT U/S\n TWY C TWY DIRECTION SIGN BTN TWY C1 AND TWY D LGT U/S. 05 MAR 09:20 2020 UNTIL 07 AUG 11:00 2020. CREATED: 05 MAR 09:32 2020\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A2482/20\n 1\n KJFK\n JFK\n 03/124\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003050922\n 202008071100\n 202003050932\n A2482/20 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 2003050922\nC) 2008071100\nE) TWY C SIGNS BTN TWY C1 AND TWY D LGT U/S\n TWY C SIGNS BTN TWY C1 AND TWY D LGT U/S. 05 MAR 09:22 2020 UNTIL 07 AUG 11:00 2020. CREATED: 05 MAR 09:32 2020\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A2478/20\n 1\n KJFK\n JFK\n 03/120\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003050554\n 202008071100\n 202003050644\n A2478/20 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 2003050554\nC) 2008071100\nE) TWY C3 HLDG PSN SIGN EAST SIDE FOR RWY 13L/31R LGT U/S\n TWY C3 HLDG PSN SIGN EAST SIDE FOR RWY 13L/31R LGT U/S. 05 MAR 05:54 2020 UNTIL 07 AUG 11:00 2020. CREATED: 05 MAR 06:44 2020\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A2476/20\n 1\n KJFK\n JFK\n 03/118\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003050551\n 202008071100\n 202003050642\n A2476/20 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 2003050551\nC) 2008071100\nE) TWY C3 HLDG PSN SIGN FOR ILS LGT U/S\n TWY C3 HLDG PSN SIGN FOR ILS LGT U/S. 05 MAR 05:51 2020 UNTIL 07 AUG 11:00 2020. CREATED: 05 MAR 06:42 2020\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A2355/20\n 1\n KJFK\n JFK\n 03/029\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003021810\n 202003021812\n A2355/20 NOTAMN\nQ) KZNY/QLPXX////000/999/4038N07347W005\nA) KJFK\nB) 2003021810\nC) PERM\nE) RWY 31R PAPI COMMISSIONED\n RWY 31R PAPI COMMISSIONED. 02 MAR 18:10 2020 UNTIL PERM. CREATED: 02 MAR 18:11 2020\n NOTAMN\n QLPXX\n \n \n I\n KJFK\n A2296/20\n 1\n KJFK\n JFK\n 02/696\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002281251\n 202003312300\n 202002281302\n A2296/20 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 2002281251\nC) 2003312300\nE) TWY B CLSD\nTO SOUTHWESTBOUND TURNS AT TWY U\nTO ACFT WINGSPAN MORE THAN 220FT\n TWY B CLSD TO SOUTHWESTBOUND TURNS AT TWY U TO ACFT WINGSPAN MORE THAN 220FT. 28 FEB 12:51 2020 UNTIL 31 MAR 23:00 2020. CREATED: 28 FEB 13:01 2020\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A2294/20\n 1\n KJFK\n JFK\n 02/695\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002281246\n 202003312300\n 202002281300\n A2294/20 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 2002281246\nC) 2003312300\nE) TWY U CLSD\nTO NORTHWEST BOUND TURNS AT TWY B\nTO ACFT WINGSPAN MORE THAN 220FT\n TWY U CLSD TO NORTHWEST BOUND TURNS AT TWY B TO ACFT WINGSPAN MORE THAN 220FT. 28 FEB 12:46 2020 UNTIL 31 MAR 23:00 2020. CREATED: 28 FEB 13:00 2020\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A2244/20\n 1\n KJFK\n FDC\n 0/0353\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002271529\n 202002271529\n A2244/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2002271529\nC) 2202271528 EST\nE) ILS OR LOC RWY 22L, AMDT 25...\nILS OR LOC RWY 22R, AMDT 3...\nTRANSITION: LENDY TO CIMBL NA.\nTRANSITION: CAMRN TO NRTON NA.\nDISREGARD NOTE: FROM CAMRN, LENDY: RNAV 1-GPS REQUIRED.\n ILS OR LOC RWY 22L, AMDT 25... ILS OR LOC RWY 22R, AMDT 3... TRANSITION: LENDY TO CIMBL NA. TRANSITION: CAMRN TO NRTON NA. DISREGARD NOTE: FROM CAMRN, LENDY: RNAV 1-GPS REQUIRED. 27 FEB 15:29 2020 UNTIL 27 FEB 15:28 2022 ESTIMATED. CREATED: 27 FEB 15:29 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1819/20\n 1\n KJFK\n FDC\n 0/5191\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002142043\n 202002142044\n A1819/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2002142043\nC) PERM\nE) RNAV (GPS) Z RWY 13L, ORIG...\nCHART PLANVIEW NOTE: WHEN VISUAL REFERENCE ESTABLISHED, FLY VISUAL\nTO AIRPORT VIA LEAD-IN LIGHTS TO RWY 13L. CLOSE ADHERENCE TO FLIGHT\nTRACK REQUIRED FOR NOISE ABATEMENT.\nCHANGE MISSED APPROACH TO READ: (DO NOT EXCEED 240K UNTIL CICAV).\nCLIMBING RIGHT TURN TO 4000 ON HEADING 100, WHEN ABLE DIRECT CICAV\nAND TRACK 073 TO HIRBO AND HOLD.\nCHART NOTE: WHEN EXECUTING A MISSED APPROACH OR GO-AROUND, UNLESS\nOTHERWISE INSTRUCTED BY ATC, INITIALLY TURN TO 100 DEGREES\nUTILIZING HEADING MODE.\nTHIS IS RNAV (GPS) Z RWY 13L, ORIG-A.\n RNAV (GPS) Z RWY 13L, ORIG... CHART PLANVIEW NOTE: WHEN VISUAL REFERENCE ESTABLISHED, FLY VISUAL TO AIRPORT VIA LEAD-IN LIGHTS TO RWY 13L. CLOSE ADHERENCE TO FLIGHT TRACK REQUIRED FOR NOISE ABATEMENT. CHANGE MISSED APPROACH TO READ: (DO NOT EXCEED 240K UNTIL CICAV). CLIMBING RIGHT TURN TO 4000 ON HEADING 100, WHEN ABLE DIRECT CICAV AND TRACK 073 TO HIRBO AND HOLD. CHART NOTE: WHEN EXECUTING A MISSED APPROACH OR GO-AROUND, UNLESS OTHERWISE INSTRUCTED BY ATC, INITIALLY TURN TO 100 DEGREES UTILIZING HEADING MODE. THIS IS RNAV (GPS) Z RWY 13L, ORIG-A. 14 FEB 20:43 2020 UNTIL PERM. CREATED: 14 FEB 20:44 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1744/20\n 1\n KJFK\n JFK\n 02/310\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002130551\n 202004010901\n 202002130610\n A1744/20 NOTAMN\nQ) KZNY/QMXLC////000/999/4038N07347W005\nA) KJFK\nB) 2002130551\nC) 2004010901\nE) TWY C5 BTN TWY C AND HANGARS 345 SOUTH RAMP CLSD\n TWY C5 BTN TWY C AND HANGARS 345 SOUTH RAMP CLSD. 13 FEB 05:51 2020 UNTIL 01 APR 09:01 2020. CREATED: 13 FEB 06:09 2020\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A1235/20\n 1\n KJFK\n FDC\n 0/9900\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001311845\n 202001311850\n A1235/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2001311845\nC) 2201311845 EST\nE)\nILS OR LOC RWY 31L, AMDT 11A...\nILS OR LOC RWY 31R, AMDT 16A...\nILS OR LOC RWY 04L, AMDT 11C...\nILS OR LOC RWY 04R, AMDT 30A...\nRNAV (GPS) RWY 22R, AMDT 1F...\nRNAV (GPS) Y RWY 13R, ORIG...\nRNAV (GPS) Y RWY 22L, AMDT 1E...\nRNAV (GPS) Y RWY 31L, AMDT 2A...\nRNAV (GPS) Y RWY 31R, AMDT 2B...\nRNAV (GPS) Y RWY 04L, AMDT 3A...\nRNAV (GPS) Y RWY 04R, AMDT 2A...\nVOR RWY 31L, ORIG-A...\nVOR RWY 04L, AMDT 1A...\nVOR RWY 04R, ORIG-A...\nVOR/DME RWY 22L, AMDT 4E...\nCIRCLING CATS C/D MDA 680/HAA 667.\n ILS OR LOC RWY 31L, AMDT 11A... ILS OR LOC RWY 31R, AMDT 16A... ILS OR LOC RWY 04L, AMDT 11C... ILS OR LOC RWY 04R, AMDT 30A... RNAV (GPS) RWY 22R, AMDT 1F... RNAV (GPS) Y RWY 13R, ORIG... RNAV (GPS) Y RWY 22L, AMDT 1E... RNAV (GPS) Y RWY 31L, AMDT 2A... RNAV (GPS) Y RWY 31R, AMDT 2B... RNAV (GPS) Y RWY 04L, AMDT 3A... RNAV (GPS) Y RWY 04R, AMDT 2A... VOR RWY 31L, ORIG-A... VOR RWY 04L, AMDT 1A... VOR RWY 04R, ORIG-A... VOR/DME RWY 22L, AMDT 4E... CIRCLING CATS C/D MDA 680/HAA 667. 31 JAN 18:45 2020 UNTIL 31 JAN 18:45 2022 ESTIMATED. CREATED: 31 JAN 18:50 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1177/20\n 1\n KJFK\n FDC\n 0/8875\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202001301244\n A1177/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2001301243\nC) 2201301243 EST\nE) RNAV (GPS) Y RWY 31R, AMDT 2B...\nNOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n54).\n RNAV (GPS) Y RWY 31R, AMDT 2B... NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). 30 JAN 12:43 2020 UNTIL 30 JAN 12:43 2022 ESTIMATED. CREATED: 30 JAN 12:44 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1178/20\n 1\n KJFK\n FDC\n 0/8876\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202001301244\n A1178/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2001301243\nC) 2201301243 EST\nE) ILS OR LOC RWY 31R, AMDT 16A...\nNOTE: VGSI AND ILS GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n54).\n ILS OR LOC RWY 31R, AMDT 16A... NOTE: VGSI AND ILS GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). 30 JAN 12:43 2020 UNTIL 30 JAN 12:43 2022 ESTIMATED. CREATED: 30 JAN 12:44 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1176/20\n 1\n KJFK\n FDC\n 0/8874\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202001301244\n A1176/20 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 2001301243\nC) PERM\nE) RNAV (RNP) Z RWY 31R, AMDT 1A...\nCHART NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE\n3.00/TCH 54).\nTHIS IS RNAV (RNP) Z RWY 31R, AMDT 1B.\n RNAV (RNP) Z RWY 31R, AMDT 1A... CHART NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). THIS IS RNAV (RNP) Z RWY 31R, AMDT 1B. 30 JAN 12:43 2020 UNTIL PERM. CREATED: 30 JAN 12:44 2020\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A0062/20\n 1\n KJFK\n JFK\n 01/049\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001041409\n 202006301100\n 202001041418\n A0062/20 NOTAMN\nQ) KZNY/QMNLC////000/999/4038N07347W005\nA) KJFK\nB) 2001041409\nC) 2006301100\nE) HANGARS 345 NORTH RAMP CLSD\n HANGARS 345 NORTH RAMP CLSD. 04 JAN 14:09 2020 UNTIL 30 JUN 11:00 2020. CREATED: 04 JAN 14:18 2020\n NOTAMN\n QMNLC\n \n \n I\n KJFK\n A0179/19\n 1\n KJFK\n JFK\n 12/676\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912250916\n 201912251019\n A0179/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912250916\nC) PERM\nE) TWY C4 DECOMMISSIONED\n TWY C4 DECOMMISSIONED. 25 DEC 09:16 2019 UNTIL PERM. CREATED: 25 DEC 10:19 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9760/19\n 1\n KJFK\n JFK\n 12/414\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912131734\n 202007010300\n 201912131735\n A9760/19 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 1912131734\nC) 2007010300\nE) TWY C2 CLSD\n TWY C2 CLSD. 13 DEC 17:34 2019 UNTIL 01 JUL 03:00 2020. CREATED: 13 DEC 17:35 2019\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A9526/19\n 1\n KJFK\n JFK\n 12/293\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912091631\n 202005131100\n 201912091702\n A9526/19 NOTAMN\nQ) KZNY/QMRXX////000/999/4038N07347W005\nA) KJFK\nB) 1912091631\nC) 2005131100\nE) RWY 13L LEAD OFF LGT AT FOR TWY DB S U/S\n RWY 13L LEAD OFF LGT AT FOR TWY DB S U/S. 09 DEC 16:31 2019 UNTIL 13 MAY 11:00 2020. CREATED: 09 DEC 17:02 2019\n NOTAMN\n QMRXX\n \n \n I\n KJFK\n A9367/19\n 1\n KJFK\n JFK\n 12/181\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912051530\n 201912051536\n A9367/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912051530\nC) PERM\nE) TWY WW COMMISSIONED\n TWY WW COMMISSIONED. 05 DEC 15:30 2019 UNTIL PERM. CREATED: 05 DEC 15:36 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9325/19\n 1\n KJFK\n JFK\n 12/156\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041920\n A9325/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CA CHANGED TO TWY C2\n TWY CA CHANGED TO TWY C2. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 19:20 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9326/19\n 1\n KJFK\n JFK\n 12/157\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041920\n A9326/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY C BTN APCH END RWY 13L AND TWY C CHANGED TO TWY C1\n TWY C BTN APCH END RWY 13L AND TWY C CHANGED TO TWY C1. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 19:20 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9323/19\n 1\n KJFK\n JFK\n 12/155\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041909\n A9323/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY V BTN TWY A AND TERMINAL 7 RAMP CHANGED TO TWY A1\n TWY V BTN TWY A AND TERMINAL 7 RAMP CHANGED TO TWY A1. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 19:09 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9322/19\n 1\n KJFK\n JFK\n 12/154\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041908\n A9322/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY V BTN TWY U AND TERMINAL 7 RAMP CHANGED TO TWY U\n TWY V BTN TWY U AND TERMINAL 7 RAMP CHANGED TO TWY U. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 19:08 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9320/19\n 1\n KJFK\n JFK\n 12/153\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041851\n A9320/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CE CHANGED TO TWY C6\n TWY CE CHANGED TO TWY C6. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 18:51 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9316/19\n 1\n KJFK\n JFK\n 12/149\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041849\n A9316/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CC CHANGED TO TWY C4\n TWY CC CHANGED TO TWY C4. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 18:49 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9318/19\n 1\n KJFK\n JFK\n 12/151\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041849\n A9318/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CB BTN RWY 13L/31R AND TWY C CHANGED TO TWY C3\n TWY CB BTN RWY 13L/31R AND TWY C CHANGED TO TWY C3. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 18:49 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9314/19\n 1\n KJFK\n JFK\n 12/147\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041848\n A9314/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CB BTN RWY 13L/31R AND TWY U CHANGED TO TWY U3\n TWY CB BTN RWY 13L/31R AND TWY U CHANGED TO TWY U3. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 18:48 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9315/19\n 1\n KJFK\n JFK\n 12/148\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041848\n A9315/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY U BTN APCH END RWY 13L AND TWY U CHANGED TO TWY U1\n TWY U BTN APCH END RWY 13L AND TWY U CHANGED TO TWY U1. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 18:48 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9302/19\n 1\n KJFK\n JFK\n 12/145\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041737\n A9302/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CD CHANGED TO TWY C5\n TWY CD CHANGED TO TWY C5. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 17:37 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9303/19\n 1\n KJFK\n JFK\n 12/144\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041737\n A9303/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY CH CHANGED TO TWY C7\n TWY CH CHANGED TO TWY C7. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 17:37 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9282/19\n 1\n KJFK\n JFK\n 12/132\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912050901\n 201912041709\n A9282/19 NOTAMN\nQ) KZNY/QMXXX////000/999/4038N07347W005\nA) KJFK\nB) 1912050901\nC) PERM\nE) TWY UA CHANGED TO TWY U2\n TWY UA CHANGED TO TWY U2. 05 DEC 09:01 2019 UNTIL PERM. CREATED: 04 DEC 17:09 2019\n NOTAMN\n QMXXX\n \n \n I\n KJFK\n A9102/19\n 1\n KJFK\n FDC\n 9/0666\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912031200\n 201912021602\n A9102/19 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 1912031200\nC) 2009151200 EST\nE) ILS OR LOC RWY 22R, AMDT 3...\nS-LOC 22R MDA 600/HAT 587 ALL CATS, VISIBILITY CATS C/D 1 3/4.\nTEMPORARY CRANE 348FT MSL 4.03 NM NORTHEAST OF RWY 22R\n(2019-AEA-12154/12156-OE).\n ILS OR LOC RWY 22R, AMDT 3... S-LOC 22R MDA 600/HAT 587 ALL CATS, VISIBILITY CATS C/D 1 3/4. TEMPORARY CRANE 348FT MSL 4.03 NM NORTHEAST OF RWY 22R (2019-AEA-12154/12156-OE). 03 DEC 12:00 2019 UNTIL 15 SEP 12:00 2020 ESTIMATED. CREATED: 02 DEC 16:02 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A8855/19\n 1\n KJFK\n FDC\n 9/8316\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201911212103\n 201911212114\n A8855/19 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 1911212103\nC) 2111222103 EST\nE) RNAV (GPS) Y RWY 13R, ORIG...\nPROCEDURE NA.\n RNAV (GPS) Y RWY 13R, ORIG... PROCEDURE NA. 21 NOV 21:03 2019 UNTIL 22 NOV 21:03 2021 ESTIMATED. CREATED: 21 NOV 21:14 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A7628/19\n 1\n KJFK\n FDC\n 9/9713\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201910221130\n 201910221132\n A7628/19 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 1910221130\nC) 2110221130 EST\nE) ILS OR LOC RWY 13L, AMDT 18B...\nUXHUB FIX MINIMUMS: CIRCLING CATS C/D MDA 680/HAA 667.\n ILS OR LOC RWY 13L, AMDT 18B... UXHUB FIX MINIMUMS: CIRCLING CATS C/D MDA 680/HAA 667. 22 OCT 11:30 2019 UNTIL 22 OCT 11:30 2021 ESTIMATED. CREATED: 22 OCT 11:32 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A7128/19\n 1\n KJFK\n JFK\n 10/154\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201910081544\n 201910081557\n A7128/19 NOTAMN\nQ) KZNY/QMRXX////000/999/4038N07347W005\nA) KJFK\nB) 1910081544\nC) 2005082111 EST\nE) RWY 04L RWY END ID LGT U/S\n RWY 04L RWY END ID LGT U/S. 08 OCT 15:44 2019 UNTIL 08 MAY 21:11 2020 ESTIMATED. CREATED: 08 OCT 15:57 2019\n NOTAMN\n QMRXX\n \n \n I\n KJFK\n A7126/19\n 1\n KJFK\n FDC\n 9/1769\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201910081320\n 201910081328\n A7126/19 NOTAMN\nQ) KZNY/QPICH/I/NBO/A/000/999/\nA) KJFK\nB) 1910081320\nC) 2110082000 EST\nE) ILS OR LOC RWY 4L, AMDT 11C...\nAUTO COUPLED APPROACHES NA BELOW 500FT MSL.\n ILS OR LOC RWY 4L, AMDT 11C... AUTO COUPLED APPROACHES NA BELOW 500FT MSL. 08 OCT 13:20 2019 UNTIL 08 OCT 20:00 2021 ESTIMATED. CREATED: 08 OCT 13:28 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A6629/19\n 1\n KJFK\n FDC\n 9/3379\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201909201400\n 201909201413\n A6629/19 NOTAMN\nQ) KZNY/QPDCH/I/NBO/A/000/999/\nA) KJFK\nB) 1909201400\nC) 2109201400 EST\nE) GREKI SIX DEPARTURE...\nJUDDS TRANSITION NOT AUTH EXCEPT FOR ACFT EQUIPPED WITH SUITABLE RNAV\nSYSTEM WITH GPS.\nCMK VOR/DME R-057 UNUSABLE.\n GREKI SIX DEPARTURE... JUDDS TRANSITION NOT AUTH EXCEPT FOR ACFT EQUIPPED WITH SUITABLE RNAV SYSTEM WITH GPS. CMK VOR/DME R-057 UNUSABLE. 20 SEP 14:00 2019 UNTIL 20 SEP 14:00 2021 ESTIMATED. CREATED: 20 SEP 14:13 2019\n NOTAMN\n QPDCH\n \n \n I\n KJFK\n A5928/19\n 1\n KJFK\n FDC\n 9/5926\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201908221100\n 202108221100\n 201908221117\n A5928/19 NOTAMN\nQ) KZNY/QXXXX////000/999/\nA) KJFK\nB) 1908221100\nC) 2108221100\nE) SPECIAL RNAV VISUAL RWY 13L, AMDT 2...\nSPECIAL RNAV VISUAL RWY 13R, AMDT 2...\nPROCEDURE NOT AUTH\n SPECIAL RNAV VISUAL RWY 13L, AMDT 2... SPECIAL RNAV VISUAL RWY 13R, AMDT 2... PROCEDURE NOT AUTH. 22 AUG 11:00 2019 UNTIL 22 AUG 11:00 2021. CREATED: 22 AUG 11:17 2019\n NOTAMN\n QXXXX\n \n \n I\n KJFK\n A5908/19\n 1\n KJFK\n JFK\n 08/272\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201908211435\n 202006302359\n 201908211506\n A5908/19 NOTAMN\nQ) KZNY/QMNLC////000/999/4038N07347W005\nA) KJFK\nB) 1908211435\nC) 2006302359\nE) APRON HANGARS 345 SOUTH RAMP CLSD\n APRON HANGARS 345 SOUTH RAMP CLSD. 21 AUG 14:35 2019 UNTIL 30 JUN 23:59 2020. CREATED: 21 AUG 15:06 2019\n NOTAMN\n QMNLC\n \n \n I\n KJFK\n A5439/19\n 1\n KJFK\n JFK\n 07/319\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201907291228\n 202010302200\n 201907291228\n A5439/19 NOTAMN\nQ) KZNY/QMXLC/IV/BO/A/000/999/4038N07347W005\nA) KJFK\nB) 1907291228\nC) 2010302200\nE) TWY Z BTN RWY 04L/22R AND TWY Y CLSD\n TWY Z BTN RWY 04L/22R AND TWY Y CLSD. 29 JUL 12:28 2019 UNTIL 30 OCT 22:00 2020. CREATED: 29 JUL 12:28 2019\n NOTAMN\n QMXLC\n \n \n I\n KJFK\n A3480/19\n 1\n KJFK\n FDC\n 9/4115\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201904181847\n 201904181849\n A3480/19 NOTAMN\n\tQ) KZNY/QPICH/I/NBO/A/000/999/\n\tA) KJFK\n\tB) 1904181847\n\tC) 2104181843 EST\n\tE) RNAV (GPS) Y RWY 31L, AMDT 2A...\n\tRNAV (GPS) Y RWY 31R, AMDT 2B...\n\tCHANGE NOTE: FOR UNCOMPENSATED BARO-VNAV SYSTEMS, PROCEDURE NA\n\tBELOW -12C OR ABOVE 54C TO READ FOR UNCOMPENSATED BARO-VNAV\n\tSYSTEMS, LNAV/VNAV NA BELOW -12C OR ABOVE 54C.\n RNAV (GPS) Y RWY 31L, AMDT 2A... RNAV (GPS) Y RWY 31R, AMDT 2B... CHANGE NOTE: FOR UNCOMPENSATED BARO-VNAV SYSTEMS, PROCEDURE NA BELOW -12C OR ABOVE 54C TO READ FOR UNCOMPENSATED BARO-VNAV SYSTEMS, LNAV/VNAV NA BELOW -12C OR ABOVE 54C. 18 APR 18:47 2019 UNTIL 18 APR 18:43 2021 ESTIMATED. CREATED: 18 APR 18:49 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A1611/19\n 1\n KJFK\n FDC\n 9/0694\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201902281925\n 201902281927\n A1611/19 NOTAMN\n\tQ) KZNY/QPICH/I/NBO/A/000/999/\n\tA) KJFK\n\tB) 1902281925\n\tC) 2102281925 EST\n\tE) ILS OR LOC RWY 31R, AMDT 16A...\n\tMISSED APPROACH: CLIMB TO 1800 THEN CLIMBING LEFT TURN TO 4000 ON\n\tLGA VOR/DME R-207 TO MOVFA INT/LGA 34.31 DME AND HOLD,\n\tCOL VOR U/S.\n ILS OR LOC RWY 31R, AMDT 16A... MISSED APPROACH: CLIMB TO 1800 THEN CLIMBING LEFT TURN TO 4000 ON LGA VOR/DME R-207 TO MOVFA INT/LGA 34.31 DME AND HOLD, COL VOR U/S. 28 FEB 19:25 2019 UNTIL 28 FEB 19:25 2021 ESTIMATED. CREATED: 28 FEB 19:27 2019\n NOTAMN\n QPICH\n \n \n I\n KJFK\n A0224/19\n 1\n KJFK\n FDC\n 9/3359\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201901111513\n 201901111514\n A0224/19 NOTAMN\n\tQ) KZNY/QPKCH/V/NBO/A/000/999/\n\tA) KJFK\n\tB) 1901111513\n\tC) 2101111512 EST\n\tE) BELMONT VISUAL RWY 22L, ORIG...\n\tPROCEDURE NA EXCEPT FOR AIRCRAFT EQUIPPED WITH SUITABLE RNAV SYSTEM\n\tWITH GPS, CRI R-068 UNUSABLE.\n BELMONT VISUAL RWY 22L, ORIG... PROCEDURE NA EXCEPT FOR AIRCRAFT EQUIPPED WITH SUITABLE RNAV SYSTEM WITH GPS, CRI R-068 UNUSABLE. 11 JAN 15:13 2019 UNTIL 11 JAN 15:12 2021 ESTIMATED. CREATED: 11 JAN 15:14 2019\n NOTAMN\n QPKCH\n \n \n F\n FDC\n 0/0353\n 1\n JFK\n KJFK\n A2244/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002271529\n 202202271528\n 202002271529\n !FDC 0/0353 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nILS OR LOC RWY 22L, AMDT 25...\nILS OR LOC RWY 22R, AMDT 3...\nTRANSITION: LENDY TO CIMBL NA.\nTRANSITION: CAMRN TO NRTON NA.\nDISREGARD NOTE: FROM CAMRN, LENDY: RNAV 1-GPS REQUIRED.\n2002271529-2202271528EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. ILS OR LOC RWY 22L, AMDT 25... ILS OR LOC RWY 22R, AMDT 3... TRANSITION: LENDY TO CIMBL NA. TRANSITION: CAMRN TO NRTON NA. DISREGARD NOTE: FROM CAMRN, LENDY: RNAV 1-GPS REQUIRED. 27 FEB 15:29 2020 UNTIL 27 FEB 15:28 2022 ESTIMATED. CREATED: 27 FEB 15:29 2020\n QPICH\n \n \n F\n FDC\n 0/5191\n 1\n JFK\n KJFK\n A1819/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002142043\n 202002142044\n !FDC 0/5191 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nRNAV (GPS) Z RWY 13L, ORIG...\nCHART PLANVIEW NOTE: WHEN VISUAL REFERENCE ESTABLISHED, FLY VISUAL\nTO AIRPORT VIA LEAD-IN LIGHTS TO RWY 13L. CLOSE ADHERENCE TO FLIGHT\nTRACK REQUIRED FOR NOISE ABATEMENT.\nCHANGE MISSED APPROACH TO READ: (DO NOT EXCEED 240K UNTIL CICAV).\nCLIMBING RIGHT TURN TO 4000 ON HEADING 100, WHEN ABLE DIRECT CICAV\nAND TRACK 073 TO HIRBO AND HOLD.\nCHART NOTE: WHEN EXECUTING A MISSED APPROACH OR GO-AROUND, UNLESS\nOTHERWISE INSTRUCTED BY ATC, INITIALLY TURN TO 100 DEGREES\nUTILIZING HEADING MODE.\nTHIS IS RNAV (GPS) Z RWY 13L, ORIG-A. 2002142043-PERM\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. RNAV (GPS) Z RWY 13L, ORIG... CHART PLANVIEW NOTE: WHEN VISUAL REFERENCE ESTABLISHED, FLY VISUAL TO AIRPORT VIA LEAD-IN LIGHTS TO RWY 13L. CLOSE ADHERENCE TO FLIGHT TRACK REQUIRED FOR NOISE ABATEMENT. CHANGE MISSED APPROACH TO READ: (DO NOT EXCEED 240K UNTIL CICAV). CLIMBING RIGHT TURN TO 4000 ON HEADING 100, WHEN ABLE DIRECT CICAV AND TRACK 073 TO HIRBO AND HOLD. CHART NOTE: WHEN EXECUTING A MISSED APPROACH OR GO-AROUND, UNLESS OTHERWISE INSTRUCTED BY ATC, INITIALLY TURN TO 100 DEGREES UTILIZING HEADING MODE. THIS IS RNAV (GPS) Z RWY 13L, ORIG-A. 14 FEB 20:43 2020 UNTIL PERM. CREATED: 14 FEB 20:43 2020\n QPICH\n \n \n F\n FDC\n 0/9900\n 1\n JFK\n KJFK\n A1235/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001311845\n 202201311845\n 202001311850\n !FDC 0/9900 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nILS OR LOC RWY 31L, AMDT 11A...\nILS OR LOC RWY 31R, AMDT 16A...\nILS OR LOC RWY 4L, AMDT 11C...\nILS OR LOC RWY 4R, AMDT 30A...\nRNAV (GPS) RWY 22R, AMDT 1F...\nRNAV (GPS) Y RWY 13R, ORIG...\nRNAV (GPS) Y RWY 22L, AMDT 1E...\nRNAV (GPS) Y RWY 31L, AMDT 2A...\nRNAV (GPS) Y RWY 31R, AMDT 2B...\nRNAV (GPS) Y RWY 4L, AMDT 3A...\nRNAV (GPS) Y RWY 4R, AMDT 2A...\nVOR RWY 31L, ORIG-A...\nVOR RWY 4L, AMDT 1A...\nVOR RWY 4R, ORIG-A...\nVOR/DME RWY 22L, AMDT 4E...\nCIRCLING CATS C/D MDA 680/HAA 667.\n2001311845-2201311845EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. ILS OR LOC RWY 31L, AMDT 11A... ILS OR LOC RWY 31R, AMDT 16A... ILS OR LOC RWY 4L, AMDT 11C... ILS OR LOC RWY 4R, AMDT 30A... RNAV (GPS) RWY 22R, AMDT 1F... RNAV (GPS) Y RWY 13R, ORIG... RNAV (GPS) Y RWY 22L, AMDT 1E... RNAV (GPS) Y RWY 31L, AMDT 2A... RNAV (GPS) Y RWY 31R, AMDT 2B... RNAV (GPS) Y RWY 4L, AMDT 3A... RNAV (GPS) Y RWY 4R, AMDT 2A... VOR RWY 31L, ORIG-A... VOR RWY 4L, AMDT 1A... VOR RWY 4R, ORIG-A... VOR/DME RWY 22L, AMDT 4E... CIRCLING CATS C/D MDA 680/HAA 667. 31 JAN 18:45 2020 UNTIL 31 JAN 18:45 2022 ESTIMATED. CREATED: 31 JAN 18:45 2020\n QPICH\n \n \n F\n FDC\n 0/8874\n 1\n JFK\n KJFK\n A1176/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202001301244\n !FDC 0/8874 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nRNAV (RNP) Z RWY 31R, AMDT 1A...\nCHART NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE\n3.00/TCH 54).\nTHIS IS RNAV (RNP) Z RWY 31R, AMDT 1B. 2001301243-PERM\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. RNAV (RNP) Z RWY 31R, AMDT 1A... CHART NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). THIS IS RNAV (RNP) Z RWY 31R, AMDT 1B. 30 JAN 12:43 2020 UNTIL PERM. CREATED: 30 JAN 12:43 2020\n QPICH\n \n \n F\n FDC\n 0/8875\n 1\n JFK\n KJFK\n A1177/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202201301243\n 202001301244\n !FDC 0/8875 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nRNAV (GPS) Y RWY 31R, AMDT 2B...\nNOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n54).\n2001301243-2201301243EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. RNAV (GPS) Y RWY 31R, AMDT 2B... NOTE: VGSI AND RNAV GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). 30 JAN 12:43 2020 UNTIL 30 JAN 12:43 2022 ESTIMATED. CREATED: 30 JAN 12:43 2020\n QPICH\n \n \n F\n FDC\n 0/8876\n 1\n JFK\n KJFK\n A1178/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001301243\n 202201301243\n 202001301244\n !FDC 0/8876 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nILS OR LOC RWY 31R, AMDT 16A...\nNOTE: VGSI AND ILS GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n54).\n2001301243-2201301243EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. ILS OR LOC RWY 31R, AMDT 16A... NOTE: VGSI AND ILS GLIDEPATH NOT COINCIDENT (VGSI ANGLE 3.00/TCH 54). 30 JAN 12:43 2020 UNTIL 30 JAN 12:43 2022 ESTIMATED. CREATED: 30 JAN 12:43 2020\n QPICH\n \n \n F\n FDC\n 9/0666\n 1\n JFK\n KJFK\n A9102/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912031200\n 202009151200\n 201912021602\n !FDC 9/0666 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nILS OR LOC RWY 22R, AMDT 3...\nS-LOC 22R MDA 600/HAT 587 ALL CATS, VISIBILITY CATS C/D 1 3/4.\nTEMPORARY CRANE 348FT MSL 4.03 NM NORTHEAST OF RWY 22R\n(2019-AEA-12154/12156-OE).\n1912031200-2009151200EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. ILS OR LOC RWY 22R, AMDT 3... S-LOC 22R MDA 600/HAT 587 ALL CATS, VISIBILITY CATS C/D 1 3/4. TEMPORARY CRANE 348FT MSL 4.03 NM NORTHEAST OF RWY 22R (2019-AEA-12154/12156-OE). 03 DEC 12:00 2019 UNTIL 15 SEP 12:00 2020 ESTIMATED. CREATED: 02 DEC 16:01 2019\n QPICH\n \n \n F\n FDC\n 9/8316\n 1\n JFK\n KJFK\n A8855/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201911212103\n 202111222103\n 201911212114\n !FDC 9/8316 JFK IAP JOHN F KENNEDY INTL, NEW YORK, NY.\nRNAV (GPS) Y RWY 13R, ORIG...\nPROCEDURE NA.\n1911212103-2111222103EST\n IAP JOHN F KENNEDY INTL, NEW YORK, NY. RNAV (GPS) Y RWY 13R, ORIG... PROCEDURE NA. 21 NOV 21:03 2019 UNTIL 22 NOV 21:03 2021 ESTIMATED. CREATED: 21 NOV 21:03 2019\n QPICH\n \n \n F\n FDC\n 9/9713\n 1\n JFK\n KJFK\n A7628/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201910221130\n 202110221130\n 201910221132\n !FDC 9/9713 JFK IAP JOHN F KENNEDY INTL, New York, NY.\nILS OR LOC RWY 13L, AMDT 18B...\nUXHUB FIX MINIMUMS: CIRCLING CATS C/D MDA 680/HAA 667.\n1910221130-2110221130EST\n IAP JOHN F KENNEDY INTL, New York, NY. ILS OR LOC RWY 13L, AMDT 18B... UXHUB FIX MINIMUMS: CIRCLING CATS C/D MDA 680/HAA 667. 22 OCT 11:30 2019 UNTIL 22 OCT 11:30 2021 ESTIMATED. CREATED: 22 OCT 11:32 2019\n QPICH\n \n \n F\n FDC\n 9/1769\n 1\n JFK\n KJFK\n A7126/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201910081320\n 202110082000\n 201910081328\n !FDC 9/1769 JFK IAP JOHN F KENNEDY INTL, New York, NY.\nILS OR LOC RWY 4L, AMDT 11C...\nAUTO COUPLED APPROACHES NA BELOW 500FT MSL.\n1910081320-2110082000EST\n IAP JOHN F KENNEDY INTL, New York, NY. ILS OR LOC RWY 4L, AMDT 11C... AUTO COUPLED APPROACHES NA BELOW 500FT MSL. 08 OCT 13:20 2019 UNTIL 08 OCT 20:00 2021 ESTIMATED. CREATED: 08 OCT 13:21 2019\n QPICH\n \n \n F\n FDC\n 9/3379\n 1\n JFK\n KJFK\n A6629/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201909201400\n 202109201400\n 201909201413\n !FDC 9/3379 JFK SID JOHN F KENNEDY INTL, New York, NY.\nGREKI SIX DEPARTURE...\nJUDDS TRANSITION NA EXCEPT FOR ACFT EQUIPPED WITH SUITABLE RNAV\nSYSTEM WITH GPS.\nCMK VOR/DME R-057 UNUSABLE. 1909201400-2109201400EST\n SID JOHN F KENNEDY INTL, New York, NY. GREKI SIX DEPARTURE... JUDDS TRANSITION NA EXCEPT FOR ACFT EQUIPPED WITH SUITABLE RNAV SYSTEM WITH GPS. CMK VOR/DME R-057 UNUSABLE. 20 SEP 14:00 2019 UNTIL 20 SEP 14:00 2021 ESTIMATED. CREATED: 20 SEP 14:01 2019\n QPDCH\n \n \n F\n FDC\n 9/5926\n 1\n JFK\n KJFK\n A5928/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201908221100\n 202108221100\n 201908221117\n !FDC 9/5926 JFK SPECIAL JOHN F KENNEDY INTL,NEW YORK, NY.\nSPECIAL RNAV VISUAL RWY 13L, AMDT 2...\nSPECIAL RNAV VISUAL RWY 13R, AMDT 2...\nPROCEDURE NA\n\n1908221100-2108221100\n SPECIAL JOHN F KENNEDY INTL,NEW YORK, NY. SPECIAL RNAV VISUAL RWY 13L, AMDT 2... SPECIAL RNAV VISUAL RWY 13R, AMDT 2... PROCEDURE NA. 22 AUG 11:00 2019 UNTIL 22 AUG 11:00 2021. CREATED: 22 AUG 11:17 2019\n QXXXX\n \n \n F\n FDC\n 9/4115\n 1\n JFK\n KJFK\n A3480/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201904181847\n 202104181843\n 201904181849\n !FDC 9/4115 JFK IAP JOHN F KENNEDY INTL, New York, NY.\n\tRNAV (GPS) Y RWY 31L, AMDT 2A...\n\tRNAV (GPS) Y RWY 31R, AMDT 2B...\n\tCHANGE NOTE: FOR UNCOMPENSATED BARO-VNAV SYSTEMS, PROCEDURE NA\n\tBELOW -12C OR ABOVE 54C TO READ FOR UNCOMPENSATED BARO-VNAV\n\tSYSTEMS, LNAV/VNAV NA BELOW -12C OR ABOVE 54C.\n\t1904181847-2104181843EST\n IAP JOHN F KENNEDY INTL, New York, NY. RNAV (GPS) Y RWY 31L, AMDT 2A... RNAV (GPS) Y RWY 31R, AMDT 2B... CHANGE NOTE: FOR UNCOMPENSATED BARO-VNAV SYSTEMS, PROCEDURE NA BELOW -12C OR ABOVE 54C TO READ FOR UNCOMPENSATED BARO-VNAV SYSTEMS, LNAV/VNAV NA BELOW -12C OR ABOVE 54C. 18 APR 18:47 2019 UNTIL 18 APR 18:43 2021 ESTIMATED. CREATED: 18 APR 18:47 2019\n QPICH\n \n \n F\n FDC\n 9/0694\n 1\n JFK\n KJFK\n A1611/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201902281925\n 202102281925\n 201902281927\n !FDC 9/0694 JFK IAP JOHN F KENNEDY INTL, New York, NY.\n\tILS OR LOC RWY 31R, AMDT 16A...\n\tMISSED APPROACH: CLIMB TO 1800 THEN CLIMBING LEFT TURN TO 4000 ON\n\tLGA VOR/DME R-207 TO MOVFA INT/LGA 34.31 DME AND HOLD,\n\tCOL VOR OUT OF SERVICE. 1902281925-2102281925EST\n IAP JOHN F KENNEDY INTL, New York, NY. ILS OR LOC RWY 31R, AMDT 16A... MISSED APPROACH: CLIMB TO 1800 THEN CLIMBING LEFT TURN TO 4000 ON LGA VOR/DME R-207 TO MOVFA INT/LGA 34.31 DME AND HOLD, COL VOR OUT OF SERVICE. 28 FEB 19:25 2019 UNTIL 28 FEB 19:25 2021 ESTIMATED. CREATED: 28 FEB 19:25 2019\n QPICH\n \n \n F\n FDC\n 9/3359\n 1\n JFK\n KJFK\n A0224/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201901111513\n 202101111512\n 201901111514\n !FDC 9/3359 JFK VFP JOHN F KENNEDY INTL, New York, NY.\n\tBELMONT VISUAL RWY 22L, ORIG...\n\tPROCEDURE NA EXCEPT FOR AIRCRAFT EQUIPPED WITH SUITABLE RNAV SYSTEM\n\tWITH GPS, CRI R-068 UNUSABLE.\n\t1901111513-2101111512EST\n VFP JOHN F KENNEDY INTL, New York, NY. BELMONT VISUAL RWY 22L, ORIG... PROCEDURE NA EXCEPT FOR AIRCRAFT EQUIPPED WITH SUITABLE RNAV SYSTEM WITH GPS, CRI R-068 UNUSABLE. 11 JAN 15:13 2019 UNTIL 11 JAN 15:12 2021 ESTIMATED. CREATED: 11 JAN 15:13 2019\n QPKCH\n \n \n D\n JFK\n 03/508\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003221625\n 202008310600\n 202003221631\n !JFK 03/508 JFK TWY WW HLDG PSN SIGN WEST SIDE NOT STD 2003221625-2008310600\n TWY WW HLDG PSN SIGN WEST SIDE NOT STD. 22 MAR 16:25 2020 UNTIL 31 AUG 06:00 2020. CREATED: 22 MAR 16:25 2020\n QMXXX\n \n \n D\n JFK\n 03/507\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003221144\n 202005252200\n 202003221150\n !JFK 03/507 JFK RWY 31R RWY EXIT SIGN AT TWY DB MISSING 2003221144-2005252200\n RWY 31R RWY EXIT SIGN AT TWY DB MISSING. 22 MAR 11:44 2020 UNTIL 25 MAY 22:00 2020. CREATED: 22 MAR 11:44 2020\n QMRXX\n \n \n D\n JFK\n 03/506\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003221140\n 202005252200\n 202003221146\n !JFK 03/506 JFK RWY 13L RWY EXIT SIGN AT TWY ZA MISSING 2003221140-2005252200\n RWY 13L RWY EXIT SIGN AT TWY ZA MISSING. 22 MAR 11:40 2020 UNTIL 25 MAY 22:00 2020. CREATED: 22 MAR 11:40 2020\n QMRXX\n \n \n D\n JFK\n 03/408\n 1\n JFK\n KJFK\n A2952/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003171107\n 202004302359\n 202003171115\n !JFK 03/408 JFK AD AP ABN ON CONS 2003171107-2004302359\n AD AP ABN ON CONS. 17 MAR 11:07 2020 UNTIL 30 APR 23:59 2020. CREATED: 17 MAR 11:08 2020\n QFAXX\n \n \n D\n JFK\n 03/367\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003160057\n 202004012300\n 202003160057\n !JFK 03/367 JFK TWY MD HLDG PSN SIGN FOR RWY 13R/31L LGT U/S 2003160057-2004012300\n TWY MD HLDG PSN SIGN FOR RWY 13R/31L LGT U/S. 16 MAR 00:57 2020 UNTIL 01 APR 23:00 2020. CREATED: 16 MAR 00:57 2020\n QMXXX\n \n \n D\n JFK\n 03/364\n 1\n JFK\n KJFK\n A2884/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003161100\n 202004012300\n 202003151834\n !JFK 03/364 JFK TWY C BTN TWY C1 AND TWY C3 CLSD 2003161100-2004012300\n TWY C BTN TWY C1 AND TWY C3 CLSD. 16 MAR 11:00 2020 UNTIL 01 APR 23:00 2020. CREATED: 15 MAR 18:33 2020\n QMXLC\n \n \n D\n JFK\n 03/338\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003131936\n 202009040300\n 202003131942\n !JFK 03/338 JFK TWY Y SFC PAINTED HLDG PSN SIGNS AT RWY 13L/31R SOUTH SIDE NOT STD 2003131936-2009040300\n TWY Y SFC PAINTED HLDG PSN SIGNS AT RWY 13L/31R SOUTH SIDE NOT STD. 13 MAR 19:36 2020 UNTIL 04 SEP 03:00 2020. CREATED: 13 MAR 19:36 2020\n QMXXX\n \n \n D\n JFK\n 03/189\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003070537\n 202005171100\n 202003070544\n !JFK 03/189 JFK TWY E HLDG PSN SIGN SOUTHEAST SIDE LGT U/S 2003070537-2005171100\n TWY E HLDG PSN SIGN SOUTHEAST SIDE LGT U/S. 07 MAR 05:37 2020 UNTIL 17 MAY 11:00 2020. CREATED: 07 MAR 05:38 2020\n QMXXX\n \n \n D\n JFK\n 03/188\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003070532\n 202005171100\n 202003070538\n !JFK 03/188 JFK TWY DB HLDG PSN SIGN NORTHEAST SIDE LGT U/S 2003070532-2005171100\n TWY DB HLDG PSN SIGN NORTHEAST SIDE LGT U/S. 07 MAR 05:32 2020 UNTIL 17 MAY 11:00 2020. CREATED: 07 MAR 05:32 2020\n QMXXX\n \n \n D\n JFK\n 03/125\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202003051055\n 202004030600\n 202003051101\n !JFK 03/125 JFK TWY Y HLDG PSN SIGN FOR ILS NORTHEAST SIDE LGT U/S 2003051055-2004030600\n TWY Y HLDG PSN SIGN FOR ILS NORTHEAST SIDE LGT U/S. 05 MAR 10:55 2020 UNTIL 03 APR 06:00 2020. CREATED: 05 MAR 10:55 2020\n QMXXX\n \n \n D\n JFK\n 02/668\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002271716\n 202006120500\n 202002271722\n !JFK 02/668 JFK TWY WW SFC PAINTED HLDG PSN SIGNS AT RWY 13L/31R FADED 2002271716-2006120500\n TWY WW SFC PAINTED HLDG PSN SIGNS AT RWY 13L/31R FADED. 27 FEB 17:16 2020 UNTIL 12 JUN 05:00 2020. CREATED: 27 FEB 17:16 2020\n QMXXX\n \n \n D\n JFK\n 02/617\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002251735\n 202005080400\n 202002251741\n !JFK 02/617 JFK TWY L CL MARKINGS BTN TWY A AND TWY B REMOVED 2002251735-2005080400\n TWY L CL MARKINGS BTN TWY A AND TWY B REMOVED. 25 FEB 17:35 2020 UNTIL 08 MAY 04:00 2020. CREATED: 25 FEB 17:35 2020\n QMXXX\n \n \n D\n JFK\n 02/549\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002221546\n 202005011200\n 202002221552\n !JFK 02/549 JFK TWY B CL MARKINGS BTN TWY NA AND TWY NB NOT STD 2002221546-2005011200\n TWY B CL MARKINGS BTN TWY NA AND TWY NB NOT STD. 22 FEB 15:46 2020 UNTIL 01 MAY 12:00 2020. CREATED: 22 FEB 15:46 2020\n QMXXX\n \n \n D\n JFK\n 02/486\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002201942\n 202004202359\n 202002201948\n !JFK 02/486 JFK OBST TOWER LGT (ASR 1290125) 403649.80N0734533.70W (1.8NM SSE JFK) 177.8FT (169.9FT AGL) U/S 2002201942-2004202359\n OBST TOWER LGT (ASR 1290125) 403649.80N0734533.70W (1.8NM SSE JFK) 177.8FT (169.9FT AGL) U/S. 20 FEB 19:42 2020 UNTIL 20 APR 23:59 2020. CREATED: 20 FEB 19:42 2020\n \n \n D\n JFK\n 02/478\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002200139\n 202009010001\n 202002200145\n !JFK 02/478 JFK TWY U3 TWY DIRECTION SIGN MISSING 2002200139-2009010001\n TWY U3 TWY DIRECTION SIGN MISSING. 20 FEB 01:39 2020 UNTIL 01 SEP 00:01 2020. CREATED: 20 FEB 01:39 2020\n QMXXX\n \n \n D\n JFK\n 02/411\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202002181814\n 202005152359\n 202002181821\n !JFK 02/411 JFK TWY A CL MARKINGS AT TWY LA NOT STD 2002181814-2005152359\n TWY A CL MARKINGS AT TWY LA NOT STD. 18 FEB 18:14 2020 UNTIL 15 MAY 23:59 2020. CREATED: 18 FEB 18:15 2020\n QMXXX\n \n \n D\n JFK\n 01/644\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001260958\n 202004012300\n 202001261004\n !JFK 01/644 JFK TWY C3 LOCATION SIGN LGT U/S 2001260958-2004012300\n TWY C3 LOCATION SIGN LGT U/S. 26 JAN 09:58 2020 UNTIL 01 APR 23:00 2020. CREATED: 26 JAN 09:58 2020\n QMXXX\n \n \n D\n JFK\n 01/643\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001260956\n 202004012300\n 202001261002\n !JFK 01/643 JFK TWY C3 TWY DIRECTION SIGN LGT U/S 2001260956-2004012300\n TWY C3 TWY DIRECTION SIGN LGT U/S. 26 JAN 09:56 2020 UNTIL 01 APR 23:00 2020. CREATED: 26 JAN 09:56 2020\n QMXXX\n \n \n D\n JFK\n 01/049\n 1\n JFK\n KJFK\n A0062/20\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001041409\n 202006301100\n 202001041418\n !JFK 01/049 JFK APRON HANGARS 345 NORTH RAMP CLSD 2001041409-2006301100\n APRON HANGARS 345 NORTH RAMP CLSD. 04 JAN 14:09 2020 UNTIL 30 JUN 11:00 2020. CREATED: 04 JAN 14:09 2020\n QMNXX\n \n \n D\n JFK\n 01/008\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 202001020046\n 202005010500\n 202001020052\n !JFK 01/008 JFK TWY C5 HLDG PSN SIGN NORTHEAST SIDE LGT U/S 2001020046-2005010500\n TWY C5 HLDG PSN SIGN NORTHEAST SIDE LGT U/S. 02 JAN 00:46 2020 UNTIL 01 MAY 05:00 2020. CREATED: 02 JAN 00:46 2020\n QMXXX\n \n \n D\n JFK\n 12/712\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912280140\n 202004030500\n 201912280146\n !JFK 12/712 JFK TWY A CL MARKINGS BTN TWY A1 AND TWY W OBSC 1912280140-2004030500\n TWY A CL MARKINGS BTN TWY A1 AND TWY W OBSC. 28 DEC 01:40 2019 UNTIL 03 APR 05:00 2020. CREATED: 28 DEC 01:40 2019\n QMXXX\n \n \n D\n JFK\n 12/495\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912171554\n 202003310500\n 201912171600\n !JFK 12/495 JFK RWY 13L/31R CL MARKINGS OBSC 1912171554-2003310500\n RWY 13L/31R CL MARKINGS OBSC. 17 DEC 15:54 2019 UNTIL 31 MAR 05:00 2020. CREATED: 17 DEC 15:54 2019\n QMRXX\n \n \n D\n JFK\n 12/448\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912151657\n 202005010300\n 201912151703\n !JFK 12/448 JFK TWY U1 SFC PAINTED HLDG PSN SIGNS FADED 1912151657-2005010300\n TWY U1 SFC PAINTED HLDG PSN SIGNS FADED. 15 DEC 16:57 2019 UNTIL 01 MAY 03:00 2020. CREATED: 15 DEC 16:57 2019\n QMXXX\n \n \n D\n JFK\n 12/447\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912151654\n 202005010300\n 201912151700\n !JFK 12/447 JFK TWY H SFC PAINTED HLDG PSN SIGNS FOR RWY 04L/22R EAST SIDE FADED 1912151654-2005010300\n TWY H SFC PAINTED HLDG PSN SIGNS FOR RWY 04L/22R EAST SIDE FADED. 15 DEC 16:54 2019 UNTIL 01 MAY 03:00 2020. CREATED: 15 DEC 16:54 2019\n QMXXX\n \n \n D\n JFK\n 12/446\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912151651\n 202005010300\n 201912151657\n !JFK 12/446 JFK TWY MD SFC PAINTED HLDG PSN SIGNS FADED 1912151651-2005010300\n TWY MD SFC PAINTED HLDG PSN SIGNS FADED. 15 DEC 16:51 2019 UNTIL 01 MAY 03:00 2020. CREATED: 15 DEC 16:51 2019\n QMXXX\n \n \n D\n JFK\n 12/293\n 1\n JFK\n KJFK\n A9526/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912091631\n 202005131100\n 201912091702\n !JFK 12/293 JFK RWY 13L LEAD OFF LGT FOR TWY DB SOUTH U/S\n1912091631-2005131100\n RWY 13L LEAD OFF LGT FOR TWY DB SOUTH U/S. 09 DEC 16:31 2019 UNTIL 13 MAY 11:00 2020. CREATED: 09 DEC 16:31 2019\n QMRXX\n \n \n D\n JFK\n 12/294\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912091638\n 202005101100\n 201912091644\n !JFK 12/294 JFK TWY U2 SFC PAINTED HLDG PSN SIGNS FADED 1912091638-2005101100\n TWY U2 SFC PAINTED HLDG PSN SIGNS FADED. 09 DEC 16:38 2019 UNTIL 10 MAY 11:00 2020. CREATED: 09 DEC 16:38 2019\n QMXXX\n \n \n D\n JFK\n 12/206\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201912051741\n 202004010901\n 201912051747\n !JFK 12/206 JFK TWY DB SFC PAINTED HLDG PSN SIGNS SOUTH SIDE FADED 1912051741-2004010901\n TWY DB SFC PAINTED HLDG PSN SIGNS SOUTH SIDE FADED. 05 DEC 17:41 2019 UNTIL 01 APR 09:01 2020. CREATED: 05 DEC 17:41 2019\n QMXXX\n \n \n D\n JFK\n 11/491\n 1\n JFK\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201911170017\n 202007042300\n 201911170023\n !JFK 11/491 JFK RWY 31R 1000FT DIST REMAINING SIGN MISSING 1911170017-2007042300\n RWY 31R 1000FT DIST REMAINING SIGN MISSING. 17 NOV 00:17 2019 UNTIL 04 JUL 23:00 2020. CREATED: 17 NOV 00:17 2019\n QMRXX\n \n \n D\n JFK\n 08/272\n 1\n JFK\n KJFK\n A5908/19\n KJFK\n JOHN F KENNEDY INTL\n 1\n 201908211435\n 202006302359\n 201908211506\n !JFK 08/272 JFK APRON HANGAR 3, 4, 5 SOUTH RAMP CLSD\n1908211435-2006302359\n APRON HANGAR 3, 4, 5 SOUTH RAMP CLSD. 21 AUG 14:35 2019 UNTIL 30 JUN 23:59 2020. CREATED: 21 AUG 14:35 2019\n QMNXX\n \n 138\n \n \n KAUS 271353Z 17010KT 7SM BKN012 OVC018 22/20 A2977 RMK AO2 SLP072\nT02220200 $\n KAUS 271124Z 2712/2818 17006KT P6SM BKN010 BKN250\nFM271500 18012KT P6SM BKN022 BKN200\nFM271700 18013KT P6SM FEW035 BKN200\nFM280700 20008KT P6SM VCSH BKN011 OVC150\nFM281300 32010KT P6SM VCSH SCT012 OVC150\nFM281500 32012KT P6SM SCT150\n KJFK 271351Z 27007KT 10SM FEW035 SCT080 SCT220 13/09 A2981 RMK AO2\nSLP095 T01330094\n KJFK 271333Z 2714/2818 27008KT P6SM FEW050 BKN080\nFM271800 33009KT P6SM FEW050\nTEMPO 2721/2801 14006KT\nFM280400 04005KT P6SM BKN250\nFM280900 08005KT P6SM BKN200\nFM281700 11009KT 6SM -RA BR OVC050\n KBOS 271354Z 31015G20KT 10SM FEW050 FEW140 FEW200 12/01 A2975 RMK\nAO2 SLP074 T01170006\n KBOS 271120Z 2712/2818 28010KT P6SM BKN120\nFM271430 30011G21KT P6SM SCT150\nFM280000 32009KT P6SM FEW250\nFM281400 06006KT P6SM FEW200\nFM281600 11007KT P6SM SCT200\n \n \n \n \n \n \n \n \n \n \n <div style=\"line-height:14px;font-size:13px\"><pre><!--BKMK///OFP///0--><!--BKMK///Summary and Fuel///1--><b>[ OFP ]\n--------------------------------------------------------------------</b>\nVMS0100 01JAN2014 KAUS-KJFK A306 N306SB RELEASE 1450 27MAR20\nOFP 2 AUSTIN-BERGSTROM INT-KENNEDY INTL\n WX PROG 0112 0115 0118 OBS 2012 2012 2012\n\t\n ATC C/S VMS100 KAUS/AUS KJFK/JFK CRZ SYS M.78\n01JAN2014 N306SB 1230/1240 1542/1548 GND DIST 1451\nA300F4-600 / STA 1445 AIR DIST 1316\n CTOT:.... G/C DIST 1320\n AVG WIND 252/050\nMAXIMUM TOW 375800 LAW 308600 ZFW 286600 AVG W/C P044\nESTIMATED TOW 344172 LAW 298522 ZFW 279100 AVG ISA P006\n AVG FF LB/HR 14974\n FUEL BIAS P00.0\nALTN KBOS TKOF ALTN .......\nFL STEPS KAUS/0310/\n--------------------------------------------------------------------\nDISP RMKS NIL\n\n--------------------------------------------------------------------\n PLANNED FUEL\n---------------------------------\nFUEL ARPT FUEL TIME\n---------------------------------\nTRIP JFK 45650 0302\nCONT 15 MIN 3743 0015\nALTN BOS 8389 0032\nFINRES 7290 0045\n---------------------------------\nMINIMUM T/OFF FUEL 65072 0435\n---------------------------------\nEXTRA 0 0000\n---------------------------------\nT/OFF FUEL 65072 0435\nTAXI AUS 2000 0010\n---------------------------------\nBLOCK FUEL AUS 67072\nPIC EXTRA .....\nTOTAL FUEL .....\nREASON FOR PIC EXTRA ............\n--------------------------------------------------------------------\nNO TANKERING RECOMMENDED (P)\n--------------------------------------------------------------------\nI HEREWITH CONFIRM THAT I HAVE PERFORMED A THOROUGH SELF BRIEFING\nABOUT THE DESTINATION AND ALTERNATE AIRPORTS OF THIS FLIGHT \nINCLUDING THE APPLICABLE INSTRUMENT APPROACH PROCEDURES, AIRPORT \nFACILITIES, NOTAMS AND ALL OTHER RELEVANT PARTICULAR INFORMATION.\n\nDISPATCHER: GLADYS KAUFMAN PIC NAME: SHAHZAD, NABEEL\n\nTEL: +1 800 555 0199 PIC SIGNATURE: ...............<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Routing and Impacts///1-->\nALTERNATE ROUTE TO: FINRES 7290\nAPT TRK DST VIA FL WC TIME FUEL\n--------------------------------------------------------------------\nKBOS/32 049 162 DCT MERIT ROBUC3 270 P000 0032 8389\n--------------------------------------------------------------------\n\nMEL/CDL ITEMS DESCRIPTION\n------------- -----------\n\n--------------------------------------------------------------------\n\nROUTING:\n\nROUTE ID: DEFRTE\nKAUS/17R ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64\nTYI J209 ORF J121 SIE CAMRN4 KJFK/31L\n\n--------------------------------------------------------------------\nDEPARTURE ATC CLEARANCE:\n.\n.\n.\n--------------------------------------------------------------------\n OPERATIONAL IMPACTS\n -------------------\nWEIGHT CHANGE UP 1.0 TRIP P 0132 LBS TIME P 0000\nWEIGHT CHANGE DN 1.0 TRIP M 0188 LBS TIME M 0000\nFL CHANGE UP FL1 NOT AVAILABLE\nFL CHANGE DN FL1 TRIP P 0191 LBS TIME M 0001\nFL CHANGE DN FL2 TRIP P 0277 LBS TIME M 0003\nSPD CHANGE CI 0 NOT AVAILABLE\nSPD CHANGE CI 100 NOT AVAILABLE\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Times and Weights///1-->--------------------------------------------------------------------\nATIS:\n.\n.\n--------- --------- --------- --------- --------- --------- --------\nRVSM: ALT SYS LEFT: STBY: RIGHT:\n\n--------- --------- --------- --------- --------- --------- --------\n--------------------------------------------------------------------\n TIMES\n -----\n\t\t\t\t \n ESTIMATED SKED ACTUAL\n\nOUT 1230Z/0630L 1230Z/0630L ......Z\n\nOFF 1240Z/0640L 1240Z/0640L ......Z\n\nON 1542Z/1042L 1439Z/0939L ......Z\n\nIN 1548Z/1048L 1445Z/0945L ......Z\n\nBLOCK TIME 0318 0215 ......\n\n--------------------------------------------------------------------\n WEIGHTS\n -------\n\n EST MAX ACTUAL\n\nPAX 340 ......\n\nCARGO 0.5 ......\n\nPAYLOAD 78.7 ......\n\nZFW 279.1 286.6 ......\n\nFUEL 67.1 68.1 ...... POSS EXTRA 1.0\n\nTOW 344.2 354.3 LDG......\n\nSTAB TRIM ......\n\nLAW 298.5 308.6 ......\n\n--------------------------------------------------------------------\n TERRAIN CLEARANCE CHECK\n -----------------------\nDD CHECK - TERRAIN CLEARANCE CHECK DISABLED\n\nDP CHECK - TERRAIN CLEARANCE CHECK DISABLED\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Flight Log///1--> FLIGHT LOG \n ---------- \n\nMOST CRITICAL MORA 03800 FEET AT MEI///MXSHR 03 AT AEX\n--------------------------------------------------------------------\nAWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\n 064 65.1 2.0\nAUSTIN-BERG N3011.7 ... 27 067 P058 \nKAUS W09740.2 0000 ... 1451 466 .... ....\n\nILEXY2 184 091 .64 236/059 M11 60.5 6.6\nHOOKK N3021.6 0007 ... 27 093 P058 P11\nHOOKK W09712.2 0007 ... 41 1410 466 417 .... ....\n\nILEXY2 203 091 .67 232/062 M16 60.0 7.1\nILEXY N3021.2 0000 ... 25 093 P045 P10\nILEXY W09704.8 0007 ... 6 1404 466 417 .... ....\n\nILEXY2 238 091 .72 228/063 M23 59.0 8.1\nJAYJO N3020.2 0002 ... 25 094 P042 P10\nJAYJO W09648.9 0009 ... 14 1390 489 417 .... ....\n\nILEXY2 267 091 .77 226/059 M29 57.8 9.3\nASHRR N3019.1 0002 ... 25 094 P037 P09\nASHRR W09630.5 0011 ... 16 1374 508 417 .... ....\n\nILEXY2 300 050 .78 236/048 M38 56.2 10.9\nZENZI N3017.3 0003 ... 25 052 P037 P07\nZENZI W09603.5 0014 ... 23 1351 503 415 .... ....\n\nDCT 310 050 .78 237/052 M40 55.2 11.9\nT O C N3026.4 0001 ... 25 052 464 P052 P07\n W09549.7 0015 ... 15 1336 516 2 415 .... ....\n\nDCT 310 085 .78 239/051 M41 53.2 13.9\nLUFKIN N3109.7 0009 ... 25 086 463 P051 P06\nLFK W09443.0 0024 ... 72 1264 514 1 416 .... ....\n112.10\n\nDCT 310 069 .78 246/053 M40 50.1 17.0\nALEXANDRIA N3115.4 0013 ... 27 069 464 P049 P07\nAEX W09230.1 0037 ... 114 1150 513 3 419 .... ....\n116.10\n\nMEMPHIS FIR/UIR \n-KZME N3146.4 0010 ...\n W09047.7 0047 ... 89 1061\n\nDCT 310 072 .78 247/058 M40 44.7 22.3\nMERIDIAN N3222.7 0013 ... 38 069 464 P058 P07\nMEI W08848.3 0100 ... 111 950 522 3 515 .... ....\n117.00\n\n<h2 style=\"page-break-after: always;\"> </h2>AWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\nATLANTA FIR/UIR \n-KZTL N3237.1 0005 ...\n W08757.4 0105 ... 45 905\n\nDCT 310 084 .78 249/042 M41 38.5 28.6\nATLANTA N3337.7 0023 ... 31 078 463 P042 P06\nATL W08426.1 0128 ... 187 718 505 1 517 .... ....\n116.90\n\nDCT 310 064 .78 254/042 M42 36.4 30.7\nFIGEY N3352.4 0009 ... 28 057 462 P042 P05\nFIGEY W08252.4 0137 ... 79 639 504 1 440 .... ....\n\nQ64 310 066 .78 255/042 M42 35.3 31.8\nGREENWOOD N3415.1 0005 ... 28 058 462 P040 P05\nGRD W08209.2 0142 ... 42 597 502 1 434 .... ....\n115.50\n\nQ64 310 073 .78 259/050 M42 33.6 33.4\nDARRL N3447.8 0008 ... 28 065 462 P046 P05\nDARRL W08103.4 0150 ... 63 534 508 2 425 .... ....\n\nQ64 310 075 .78 262/046 M41 32.1 34.9\nIDDAA N3511.1 0006 ... 28 066 463 P044 P06\nIDDAA W07959.5 0156 ... 57 477 507 2 425 .... ....\n\nWASHINGTON FIR/UIR \n-KZDC N3512.3 0000 ...\n W07955.9 0156 ... 1 476\n\nQ64 310 062 .78 263/050 M41 29.0 38.0\nTAR RIVER ( N3558.6 0015 ... 21 052 463 P048 P06\nTYI W07742.2 0211 ... 120 356 511 0 426 .... ....\n117.80\n\nJ209 310 034 .78 265/047 M42 26.7 40.4\nNORFOLK N3653.5 0010 ... 21 022 462 P039 P05\nORF W07612.0 0221 ... 91 265 501 1 421 .... ....\n116.90\n\nJ121 310 042 .78 263/058 M42 25.6 41.5\nSAWED N3732.0 0006 ... 21 030 462 P025 P05\nSAWED W07551.5 0227 ... 42 223 487 2 423 .... ....\n\nJ121 310 042 .78 263/058 M42 25.0 42.1\nKALDA N3750.5 0002 ... 20 030 462 P033 P05\nKALDA W07537.6 0229 ... 22 201 495 2 423 .... ....\n\nJ121 310 042 .78 263/058 M42 24.9 42.1\nDUNFE N3753.3 0001 ... 20 030 462 P033 P05\nDUNFE W07535.5 0230 ... 3 198 495 2 423 .... ....\n\n<h2 style=\"page-break-after: always;\"> </h2>AWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\nJ121 310 038 .78 265/053 M42 24.6 42.5\nSNOW HILL N3803.4 0001 ... 21 026 462 P028 P05\nSWL W07527.8 0231 ... 12 186 490 0 422 .... ....\n112.40\n\nJ121 310 038 .78 268/060 M42 23.6 43.5\nRADDS N3838.9 0005 ... 21 026 462 P025 P05\nRADDS W07505.3 0236 ... 40 146 487 1 421 .... ....\n\nJ121 310 039 .78 268/060 M42 22.9 44.2\nT O D N3903.0 0003 ... 20 026 462 P025 P05\n W07449.8 0239 ... 27 119 487 1 421 .... ....\n\nJ121 302 052 .78 269/060 M40 22.8 44.3\nSEA ISLE N3905.7 0001 ... 21 039 P024 P05\nSIE W07448.0 0240 ... 3 116 488 421 .... ....\n114.80\n\nCAMRN4 232 053 .71 267/065 M23 22.4 44.6\nBOTON N3924.9 0003 ... 21 040 P041 P08\nBOTON W07427.3 0243 ... 25 91 482 422 .... ....\n\nCAMRN4 195 053 .66 262/056 M14 22.2 44.8\nHOGGS N3935.0 0002 ... 21 040 P040 P10\nHOGGS W07416.2 0245 ... 13 78 455 413 .... ....\n\nCAMRN4 176 053 .63 265/050 M09 22.1 44.9\nPANZE N3940.6 0001 ... 21 040 P034 P11\nPANZE W07410.1 0246 ... 7 71 437 413 .... ....\n\nCAMRN4 140 041 .59 261/044 M03 21.9 45.2\nKARRS N3950.5 0001 ... 20 028 P032 P10\nKARRS W07359.2 0247 ... 13 58 411 413 .... ....\n\nCAMRN4 106 019 .55 251/042 02 21.7 45.4\nCAMRN N4001.0 0002 ... 22 005 P030 P08\nCAMRN W07351.7 0249 ... 12 46 388 413 .... ....\n\nCAMRN4 19.4 47.7\nKENNEDY INT N4038.4 0013 ... \nKJFK W07346.7 0302 ... 46 .... ....\n\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Wind Information///1-->--------------------------------------------------------------------\n WIND INFORMATION \n ---------------- \n\nCLIMB T O C LFK AEX\n350 229/067 -50 350 238/065 -50 350 243/059 -51 350 249/061 -50\n310 222/054 -41 330 238/059 -45 330 241/054 -46 330 247/060 -46\n200 232/062 -15 310 237/052 -40 310 239/051 -41 310 242/065 -40\n150 234/043 -04 290 235/050 -35 290 238/053 -35 290 236/066 -35\n100 204/026 +05 270 231/054 -30 270 239/058 -30 270 229/064 -30\n\nMEI ATL FIGEY GRD\n350 251/056 -50 350 260/047 -50 350 263/044 -51 350 264/044 -51\n330 253/055 -45 330 252/044 -46 330 256/041 -46 330 257/042 -46\n310 251/050 -41 310 250/045 -41 310 254/042 -42 310 255/042 -42\n290 245/048 -36 290 248/046 -36 290 252/043 -36 290 251/043 -36\n270 238/051 -31 270 248/048 -30 270 250/044 -30 270 246/043 -30\n\nDARRL IDDAA TYI ORF\n350 266/052 -51 350 268/052 -51 350 269/050 -52 350 267/054 -52\n330 262/051 -46 330 264/050 -46 330 265/047 -47 330 263/050 -47\n310 259/050 -42 310 262/046 -41 310 266/048 -41 310 265/047 -42\n290 254/049 -36 290 258/045 -36 290 266/048 -36 290 265/046 -36\n270 249/049 -31 270 253/045 -31 270 265/048 -31 270 264/047 -31\n\nSAWED KALDA DUNFE SWL\n350 265/065 -52 350 265/065 -52 350 265/065 -52 350 267/057 -52\n330 262/062 -47 330 262/062 -47 330 262/062 -47 330 265/054 -47\n310 263/058 -42 310 263/058 -42 310 263/058 -42 310 265/053 -42\n290 266/057 -37 290 266/057 -37 290 266/057 -37 290 265/054 -37\n270 270/059 -32 270 270/059 -32 270 270/059 -32 270 263/055 -31\n\nRADDS T O D DESCENT\n350 266/063 -52 350 266/063 -52 350 271/070 -53\n330 267/060 -47 330 267/060 -47 310 268/065 -42\n310 268/060 -42 310 268/060 -42 200 261/057 -16\n290 269/061 -37 290 269/061 -37 150 263/045 -05\n270 268/062 -32 270 268/062 -32 100 250/042 +03\n\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///ATC Flight Plan///0--><b>[ ATC Flight Plan ]\n--------------------------------------------------------------------</b>\n ICAO FLIGHT PLAN \n ---------------- \n\nFF KZHUZQZX KZMEZQZX KZTLZQZX KZDCZQZX KZNYZQZX\n271450 CYULSBFP\n(FPL-VMS100-IS\n-A306/H-SDE2E3FGHIRYW/LB1\n-KAUS1230\n-N0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY\n Q64 TYI J209 ORF J121 SIE CAMRN4\n-KJFK0252 KBOS\n-PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105\n KZDC0157 KZNY0246 OPR/VMS RMK/TCAS)<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Additional Info///0--><b>[ Additional Info ]\n--------------------------------------------------------------------</b>\nD I S P A T C H B R I E F I N G I N F O VMS0100 KAUS/KJFK\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Airport WX List///0--><b>[ Airport WX List ]\n--------------------------------------------------------------------</b>\nKAUS --> KJFK VMS 100 / 01JAN2014\nLIDO/WEATHER SERVICE DATE : 27Mar2020 TIME : 14:50 UTC\n\nAIRMETs:\n No Wx data available\n\nSIGMETs:\n No Wx data available\n\nTropical Cyclone SIGMETs:\n No Wx data available\n\nVolcanic Ash SIGMETs:\n No Wx data available\n\nDeparture:\nKAUS/AUS AUSTIN-BERGSTROM INTL\n SA 271353 17010KT 7SM BKN012 OVC018 22/20 A2977 RMK AO2 SLP072\n T02220200 $\n FT 271124 2712/2818 17006KT P6SM BKN010 BKN250\n FM271500 18012KT P6SM BKN022 BKN200\n FM271700 18013KT P6SM FEW035 BKN200\n FM280700 20008KT P6SM VCSH BKN011 OVC150\n FM281300 32010KT P6SM VCSH SCT012 OVC150\n FM281500 32012KT P6SM SCT150\n\nDestination:\nKJFK/JFK KENNEDY INTL\n SA 271351 27007KT 10SM FEW035 SCT080 SCT220 13/09 A2981 RMK AO2\n SLP095 T01330094\n FT 271333 2714/2818 27008KT P6SM FEW050 BKN080\n FM271800 33009KT P6SM FEW050\n TEMPO 2721/2801 14006KT\n FM280400 04005KT P6SM BKN250\n FM280900 08005KT P6SM BKN200\n FM281700 11009KT 6SM -RA BR OVC050\n\nDestination Alternates:\nKBOS/BOS LOGAN INTL\n SA 271354 31015G20KT 10SM FEW050 FEW140 FEW200 12/01 A2975 RMK\n AO2 SLP074 T01170006\n FT 271120 2712/2818 28010KT P6SM BKN120\n FM271430 30011G21KT P6SM SCT150\n FM280000 32009KT P6SM FEW250\n FM281400 06006KT P6SM FEW200\n FM281600 11007KT P6SM SCT200\n\n\n AIRPORTLIST ENDED<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///NOTAM///0--><b>[ NOTAM ]\n--------------------------------------------------------------------</b>\nLIDO-NOTAM-BULLETIN INCLUDES NOTAM, COMP NOTAM AND AIP-REGULATION\n<b>VALID: 1401011230 - 1401011921</b> STD(EOBT)+TRIP+ALTN+3HRS\nVMS 100 /01JAN OFP-NR: 2\nROUTE: KAUS - KJFK ALTN: KBOS\nN0463F310 ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64\nTYI J209 ORF J121 SIE CAMRN4\n\n\n<b>=================================\nDEPARTURE AIRPORT - DETAILED INFO\n=================================</b>\n\n<b>KAUS/AUS AUSTIN-BERGSTROM INTL\n----------------------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A0456/20 </b>\n <b>TWY R</b> <b>CLSD</b>\n<b>A0335/20 </b>\n <b>TWY G</b> BTN <b>TWY G3</b> AND <b>TWY C</b> <b>CLSD</b> TO ACFT WINGSPAN MORE THAN\n 118FT\n<b>A0320/20 </b>\n APRON TERMINAL APN <b>WIP</b> OPN TRENCH ADJ SW CORNER LGTD AND\n BARRICADED\n<b>02/099 </b>\n <b>TWY G3</b> NORTH OF <b>TWY G</b> EDGE MARKING REMOVED\n<b>A0317/20 </b>\n <b>TWY C</b> BTN <b>TWY G</b> AND <b>TWY W</b> <b>CLSD</b>\n<b>A0312/20 </b>\n <b>TWY G3</b> CL LGT <b>U/S</b>\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A0218/20 </b>\n <b>RWY 35L</b> RAI LGT <b>U/S</b>\n\n+++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++\n\n<b>A0804/19 </b>\n AUSTIN FIVE DEPARTURE...\n MINIMUM ALTITUDE AMUSE INT TO JUNCTION <b>VORTAC</b>, 7000 FT.\n\n+++++++++++++++++++++++ APPROACH PROCEDURES ++++++++++++++++++++++++\n\n<b>A1771/19 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 35L</b>, AMDT 6B...\n DISREGARD OUTER MARKER INDICATION.\n<b>A1466/19 </b>\n RNAV (RNP) Z <b>RWY 17R</b>, AMDT 1...\n RNP 0.30 DA 885/HAT 343 ALL CATS.\n PERMANENT TOWER, 582FT MSL, 4954FT NORTH OF APCH END <b>RWY 17R</b>.<h2 style=\"page-break-after: always;\"> </h2><b>===================================\nDESTINATION AIRPORT - DETAILED INFO\n===================================</b>\n\n<b>KJFK/JFK KENNEDY INTL\n-------------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>03/508 </b>\n <b>TWY WW</b> HLDG PSN SIGN WEST SIDE NOT STD\n<b>A3101/20 </b>\n <b>TWY WW</b> ELEVATED GUARD LGT FOR <b>RWY 13L/31R</b> SE SIDE <b>U/S</b>\n<b>A2952/20 </b>\n AP ABN ON CONS\n<b>A2911/20 </b>\n <b>TWY C1</b> <b>CLSD</b>\n<b>A2884/20 </b>\n <b>TWY C</b> <b>CLSD</b> BTN <b>TWY C1</b> AND <b>TWY C3</b> <b>CLSD</b>\n<b>03/367 </b>\n <b>TWY MD</b> HLDG PSN SIGN FOR <b>RWY 13R/31L</b> LGT <b>U/S</b>\n<b>03/338 </b>\n <b>TWY Y</b> SFC PAINTED HLDG PSN SIGNS AT <b>RWY 13L/31R</b>\n SOUTH SIDE NOT STD\n<b>03/189 </b>\n <b>TWY E</b> HLDG PSN SIGN SOUTHEAST SIDE LGT <b>U/S</b>\n<b>03/188 </b>\n <b>TWY DB</b> HLDG PSN SIGN NORTHEAST SIDE LGT <b>U/S</b>\n<b>A2496/20 </b>\n <b>TWY C</b> CL LGT BTN <b>TWY C2</b> AND <b>TWY C3</b> <b>U/S</b>\n<b>03/125 </b>\n <b>TWY Y</b> HLDG PSN SIGN FOR <b>ILS</b> NORTHEAST SIDE LGT <b>U/S</b>\n<b>A2482/20 </b>\n <b>TWY C</b> SIGNS BTN <b>TWY C1</b> AND <b>TWY D</b> LGT <b>U/S</b>\n<b>A2481/20 </b>\n <b>TWY C</b> <b>TWY</b> <b>DIRECTION</b> SIGN BTN <b>TWY C1</b> AND <b>TWY D</b> LGT <b>U/S</b>\n<b>A2478/20 </b>\n <b>TWY C3</b> HLDG PSN SIGN EAST SIDE FOR <b>RWY 13L/31R</b> LGT <b>U/S</b>\n<b>A2476/20 </b>\n <b>TWY C3</b> HLDG PSN SIGN FOR <b>ILS</b> LGT <b>U/S</b>\n<b>A2296/20 </b>\n <b>TWY B</b> <b>CLSD</b>\n TO SOUTHWESTBOUND TURNS AT <b>TWY U</b>\n TO ACFT WINGSPAN MORE THAN 220FT\n<b>A2294/20 </b>\n <b>TWY U</b> <b>CLSD</b>\n TO NORTHWEST BOUND TURNS AT <b>TWY B</b>\n TO ACFT WINGSPAN MORE THAN 220FT\n<b>02/668 </b>\n <b>TWY WW</b> SFC PAINTED HLDG PSN SIGNS AT <b>RWY 13L/31R</b>\n FADED\n<b>02/617 </b>\n <b>TWY L</b> CL MARKINGS BTN <b>TWY A</b> AND <b>TWY B</b> REMOVED\n<b>02/549 </b>\n <b>TWY B</b> CL MARKINGS BTN <b>TWY NA</b> AND <b>TWY NB</b> NOT STD\n<b>02/478 </b>\n <b>TWY U3</b> <b>TWY</b> <b>DIRECTION</b> SIGN MISSING\n<b>02/411 </b>\n <b>TWY A</b> CL MARKINGS AT <b>TWY LA</b> NOT STD\n<b>A1744/20 </b>\n <b>TWY C5</b> BTN <b>TWY C</b> AND HANGARS 345 SOUTH RAMP <b>CLSD</b><h2 style=\"page-break-after: always;\"> </h2><b>01/644 </b>\n <b>TWY C3</b> LOCATION SIGN LGT <b>U/S</b>\n<b>01/643 </b>\n <b>TWY C3</b> <b>TWY</b> <b>DIRECTION</b> SIGN LGT <b>U/S</b>\n<b>A0062/20 </b>\n HANGARS 345 NORTH RAMP <b>CLSD</b>\n<b>01/008 </b>\n <b>TWY C5</b> HLDG PSN SIGN NORTHEAST SIDE LGT <b>U/S</b>\n<b>12/712 </b>\n <b>TWY A</b> CL MARKINGS BTN <b>TWY A1</b> AND <b>TWY W</b> OBSC\n<b>A0179/19 </b>\n <b>TWY C4</b> DECOMMISSIONED\n<b>12/448 </b>\n <b>TWY U1</b> SFC PAINTED HLDG PSN SIGNS FADED\n<b>12/447 </b>\n <b>TWY H</b> SFC PAINTED HLDG PSN SIGNS FOR <b>RWY 04L/22R</b>\n EAST SIDE FADED\n<b>12/446 </b>\n <b>TWY MD</b> SFC PAINTED HLDG PSN SIGNS FADED\n<b>A9760/19 </b>\n <b>TWY C2</b> <b>CLSD</b>\n<b>12/294 </b>\n <b>TWY U2</b> SFC PAINTED HLDG PSN SIGNS FADED\n<b>12/206 </b>\n <b>TWY DB</b> SFC PAINTED HLDG PSN SIGNS SOUTH SIDE FADED\n<b>A9367/19 </b>\n <b>TWY WW</b> COMMISSIONED\n<b>A9282/19 </b>\n <b>TWY UA</b> CHANGED TO <b>TWY U2</b>\n<b>A9303/19 </b>\n <b>TWY CH</b> CHANGED TO <b>TWY C7</b>\n<b>A9302/19 </b>\n <b>TWY CD</b> CHANGED TO <b>TWY C5</b>\n<b>A9315/19 </b>\n <b>TWY U</b> BTN APCH END <b>RWY 13L</b> AND <b>TWY U</b> CHANGED TO <b>TWY U1</b>\n<b>A9314/19 </b>\n <b>TWY CB</b> BTN <b>RWY 13L/31R</b> AND <b>TWY U</b> CHANGED TO <b>TWY U3</b>\n<b>A9318/19 </b>\n <b>TWY CB</b> BTN <b>RWY 13L/31R</b> AND <b>TWY C</b> CHANGED TO <b>TWY C3</b>\n<b>A9316/19 </b>\n <b>TWY CC</b> CHANGED TO <b>TWY C4</b>\n<b>A9320/19 </b>\n <b>TWY CE</b> CHANGED TO <b>TWY C6</b>\n<b>A9322/19 </b>\n <b>TWY V</b> BTN <b>TWY U</b> AND TERMINAL 7 RAMP CHANGED TO <b>TWY U</b>\n<b>A9323/19 </b>\n <b>TWY V</b> BTN <b>TWY A</b> AND TERMINAL 7 RAMP CHANGED TO <b>TWY A1</b>\n<b>A9326/19 </b>\n <b>TWY C</b> BTN APCH END <b>RWY 13L</b> AND <b>TWY C</b> CHANGED TO <b>TWY C1</b>\n<b>A9325/19 </b>\n <b>TWY CA</b> CHANGED TO <b>TWY C2</b>\n<b>A5928/19 </b>\n SPECIAL RNAV VISUAL <b>RWY 13L</b>, AMDT 2...\n SPECIAL RNAV VISUAL <b>RWY 13R</b>, AMDT 2...\n PROCEDURE NOT AUTH\n<b>A5908/19 </b>\n APRON HANGARS 345 SOUTH RAMP <b>CLSD</b>\n<b>A5439/19 </b>\n <b>TWY Z</b> BTN <b>RWY 04L/22R</b> AND <b>TWY Y</b> <b>CLSD</b><h2 style=\"page-break-after: always;\"> </h2><b>A0224/19 </b>\n BELMONT VISUAL <b>RWY 22L</b>, ORIG...\n PROCEDURE NA EXCEPT FOR AIRCRAFT EQUIPPED WITH SUITABLE RNAV\n SYSTEM WITH GPS, CRI R-068 <b>UNUSABLE</b>.\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>03/507 </b>\n <b>RWY 31R</b> <b>RWY</b> EXIT SIGN AT <b>TWY DB</b> MISSING\n<b>03/506 </b>\n <b>RWY 13L</b> <b>RWY</b> EXIT SIGN AT <b>TWY ZA</b> MISSING\n<b>A2355/20 </b>\n <b>RWY 31R</b> PAPI COMMISSIONED\n<b>12/495 </b>\n <b>RWY 13L/31R</b> CL MARKINGS OBSC\n<b>A9526/19 </b>\n <b>RWY 13L</b> LEAD OFF LGT AT FOR <b>TWY DB</b> S <b>U/S</b>\n<b>11/491 </b>\n <b>RWY 31R</b> 1000FT DIST REMAINING SIGN MISSING\n<b>A7128/19 </b>\n <b>RWY 04L</b> <b>RWY</b> END ID LGT <b>U/S</b>\n\n+++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++\n\n<b>A6629/19 </b>\n GREKI SIX DEPARTURE...\n JUDDS TRANSITION NOT AUTH EXCEPT FOR ACFT EQUIPPED WITH SUITABLE\n RNAV SYSTEM WITH GPS.\n CMK <b>VOR/DME</b> R-057 <b>UNUSABLE</b>.\n\n+++++++++++++++++++++++ APPROACH PROCEDURES ++++++++++++++++++++++++\n\n<b>A2244/20 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 22L</b>, AMDT 25...\n <b>ILS</b> OR <b>LOC</b> <b>RWY 22R</b>, AMDT 3...\n TRANSITION: LENDY TO CIMBL NA.\n TRANSITION: CAMRN TO NRTON NA.\n DISREGARD NOTE: FROM CAMRN, LENDY: RNAV 1-GPS REQUIRED.\n<b>A1819/20 </b>\n RNAV (GPS) Z <b>RWY 13L</b>, ORIG...\n CHART PLANVIEW NOTE: WHEN VISUAL REFERENCE ESTABLISHED, FLY VISUAL\n TO AIRPORT VIA LEAD-IN LIGHTS TO <b>RWY 13L</b>. CLOSE ADHERENCE TO\n FLIGHT TRACK REQUIRED FOR NOISE ABATEMENT.\n CHANGE MISSED APPROACH TO READ: (DO NOT EXCEED 240K UNTIL CICAV).\n CLIMBING RIGHT TURN TO 4000 ON HEADING 100, WHEN ABLE DIRECT CICAV\n AND TRACK 073 TO HIRBO AND HOLD.\n CHART NOTE: WHEN EXECUTING A MISSED APPROACH OR GO-AROUND, UNLESS\n OTHERWISE INSTRUCTED BY ATC, INITIALLY TURN TO 100 DEGREES\n UTILIZING HEADING MODE.\n THIS IS RNAV (GPS) Z <b>RWY 13L</b>, ORIG-A.<h2 style=\"page-break-after: always;\"> </h2><b>A1235/20 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 31L</b>, AMDT 11A...\n <b>ILS</b> OR <b>LOC</b> <b>RWY 31R</b>, AMDT 16A...\n <b>ILS</b> OR <b>LOC</b> <b>RWY 04L</b>, AMDT 11C...\n <b>ILS</b> OR <b>LOC</b> <b>RWY 04R</b>, AMDT 30A...\n RNAV (GPS) <b>RWY 22R</b>, AMDT 1F...\n RNAV (GPS) Y <b>RWY 13R</b>, ORIG...\n RNAV (GPS) Y <b>RWY 22L</b>, AMDT 1E...\n RNAV (GPS) Y <b>RWY 31L</b>, AMDT 2A...\n RNAV (GPS) Y <b>RWY 31R</b>, AMDT 2B...\n RNAV (GPS) Y <b>RWY 04L</b>, AMDT 3A...\n RNAV (GPS) Y <b>RWY 04R</b>, AMDT 2A...\n <b>VOR</b> <b>RWY 31L</b>, ORIG-A...\n <b>VOR</b> <b>RWY 04L</b>, AMDT 1A...\n <b>VOR</b> <b>RWY 04R</b>, ORIG-A...\n <b>VOR/DME</b> <b>RWY 22L</b>, AMDT 4E...\n CIRCLING CATS C/D MDA 680/HAA 667.\n<b>A1176/20 </b>\n RNAV (RNP) Z <b>RWY 31R</b>, AMDT 1A...\n CHART NOTE: VGSI AND RNAV <b>GLIDEPATH</b> NOT COINCIDENT (VGSI ANGLE\n 3.00/TCH 54).\n THIS IS RNAV (RNP) Z <b>RWY 31R</b>, AMDT 1B.\n<b>A1178/20 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 31R</b>, AMDT 16A...\n NOTE: VGSI AND <b>ILS</b> <b>GLIDEPATH</b> NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n 54).\n<b>A1177/20 </b>\n RNAV (GPS) Y <b>RWY 31R</b>, AMDT 2B...\n NOTE: VGSI AND RNAV <b>GLIDEPATH</b> NOT COINCIDENT (VGSI ANGLE 3.00/TCH\n 54).\n<b>A9102/19 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 22R</b>, AMDT 3...\n S-LOC 22R MDA 600/HAT 587 ALL CATS, VISIBILITY CATS C/D 1 3/4.\n TEMPORARY CRANE 348FT MSL 4.03 NM NORTHEAST OF <b>RWY 22R</b>\n (2019-AEA-12154/12156-OE).\n<b>A8855/19 </b>\n RNAV (GPS) Y <b>RWY 13R</b>, ORIG...\n PROCEDURE NA.\n<b>A7628/19 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 13L</b>, AMDT 18B...\n UXHUB FIX MINIMUMS: CIRCLING CATS C/D MDA 680/HAA 667.\n<b>A7126/19 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 4L</b>, AMDT 11C...\n AUTO COUPLED APPROACHES NA BELOW 500FT MSL.\n<b>A3480/19 </b>\n RNAV (GPS) Y <b>RWY 31L</b>, AMDT 2A...\n RNAV (GPS) Y <b>RWY 31R</b>, AMDT 2B...\n CHANGE NOTE: FOR UNCOMPENSATED BARO-VNAV SYSTEMS, PROCEDURE NA\n BELOW -12C OR ABOVE 54C TO READ FOR UNCOMPENSATED BARO-VNAV\n SYSTEMS, LNAV/VNAV NA BELOW -12C OR ABOVE 54C.\n<b>A1611/19 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 31R</b>, AMDT 16A...\n MISSED APPROACH: CLIMB TO 1800 THEN CLIMBING LEFT TURN TO 4000 ON\n LGA <b>VOR/DME</b> R-207 TO MOVFA INT/LGA 34.31 <b>DME</b> AND HOLD,\n COL <b>VOR</b> <b>U/S</b>.<h2 style=\"page-break-after: always;\"> </h2><b>================================\nDESTINATION ALTERNATE AIRPORT(S)\n================================</b>\n\n<b>KBOS/BOS LOGAN INTL\n-----------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A2515/20 </b>\n AP BIRD ACT INCREASED\n<b>A2513/20 VALID: 27-MAR-20 1243 - 27-MAR-20 1900</b>\n NORTH CARGO RAMP <b>WIP</b>\n<b>03/445 </b>\n <b>TWY B</b> <b>TWY</b> <b>DIRECTION</b> SIGN FOR <b>TWY A2</b> LGT <b>U/S</b>\n<b>A1748/20 </b>\n SPECIAL RNAV VISUAL <b>RWY 04L</b> ORIG...PROC NOT AUTH.\n<b>03/082 </b>\n OBST STRUCTURE (ASN UNKNOWN) 422209N0710446W\n (2.6NM W BOS) UNKNOWN (302FT AGL) NOT LGTD\n<b>02/354 </b>\n OBST BLDG LGT (ASN 2017-ANE-4787-OE)\n 422042N0710215W (1.8NM SW BOS) 175FT (165FT AGL) <b>U/S</b>\n<b>A1474/20 </b>\n CRANE (ASN UNKNOWN) 422157N0710117W (0.36NM NW APCH END\n <b>RWY</b> 04L) UNKNOWN (150FT AGL) FLAGGED AND LGTD\n<b>02/177 </b>\n <b>TWY N</b> HLDG PSN MARKINGS FOR <b>RWY 15R/33L</b> REMOVED\n<b>A0811/19 </b>\n APRON GA RAMP <b>CLSD</b> TO GA EXC 4HR PPR 617-561-2500\n<b>05/479 </b>\n OBST WATERTOWER LGT (ASN 2004-ANE-50-OE)\n 422403N0710149W (2.5NM NNW BOS) 301FT (138FT AGL) <b>OUT OF SERVICE</b>\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A2506/20 VALID: 27-MAR-20 1122 - 27-MAR-20 1830</b>\n <b>RWY 04R/22L</b> <b>CLSD</b> EXC TAX 30MIN PPR 131.1\n<b>A2505/20 VALID: 27-MAR-20 1120 - 27-MAR-20 1830</b>\n <b>RWY 04L/22R</b> <b>CLSD</b> EXC TAX 30MIN PPR 131.1\n<b>A2437/20 </b>\n <b>RWY 14/32</b> <b>CLSD</b>\n<b>A2205/20 </b>\n <b>RWY 15L/33R</b> <b>CLSD</b> EXC TAX\n\n+++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++\n\n<b>A2003/20 </b>\n TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\n TAKEOFF MINIMUMS: <b>RWY 27</b>, 700-2 1/4 OR STANDARD WITH MINIMUM CLIMB\n OF 491FT PER NM TO 1300.\n TEMPORARY CRANE 697FT MSL 1.41 NM WEST OF <b>RWY 14</b>\n (2019-ANE-1262-OE).\n ALL OTHER DATA REMAINS AS PUBLISHED.\n<b>A1329/20 </b>\n WYLYY THREE DEPARTURE (RNAV)...\n TAKEOFF MINIMUMS: <b>RWY 27</b>, 800 - 2 1/4 OR STANDARD WITH MINIMUM\n CLIMB GRADIENT OF 500FT PER NM TO 2300.\n ALL OTHER DATA REMAINS AS PUBLISHED.<h2 style=\"page-break-after: always;\"> </h2><b>A1328/20 </b>\n BLZZR FOUR DEPARTURE (RNAV)...\n BRUWN FIVE DEPARTURE (RNAV)...\n CELTK FIVE DEPARTURE (RNAV)...\n HYLND FIVE DEPARTURE (RNAV)...\n LBSTA SIX DEPARTURE (RNAV)...\n LOGAN TWO DEPARTURE...\n PATSS FIVE DEPARTURE (RNAV)...\n REVSS FOUR DEPARTURE (RNAV)...\n SSOXS FIVE DEPARTURE (RNAV)...\n TAKEOFF MINIMUMS: <b>RWY 27</b>, 800 - 2 1/4 OR STANDARD WITH MINIMUM\n CLIMB GRADIENT OF 500FT PER NM TO 1300.\n ALL OTHER DATA REMAINS AS PUBLISHED.\n<b>A1327/20 </b>\n TAKEOFF MINIMUMS AND (OBSTACLE) DEPARTURE PROCEDURES AMDT 14A...\n TAKEOFF MINIMUMS: <b>RWY 27</b>, 800 - 2 1/4 OR STANDARD WITH MINIMUM\n CLIMB GRADIENT OF 500FT PER NM TO 1300.\n ALL OTHER DATA REMAINS AS PUBLISHED.\n\n+++++++++++++++++++++++ APPROACH PROCEDURES ++++++++++++++++++++++++\n\n<b>A2468/20 </b>\n <b>ILS</b> OR <b>LOC</b> <b>RWY 15R</b>, AMDT 2...\n S-LOC 15R <b>CAT</b> D VISIBILITY 1 1/4 SM..\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Company NOTAM///0--><b>[ Company NOTAM ]\n--------------------------------------------------------------------</b>\n<b>==========\nCREW ALERT\n==========</b>\n\n<b>SB007/14 </b>\n SUBJECT: AUTO COST INDEXES\n <t>WHEN PLANNING A COST INDEX, 2 OPTIONS ARE AVAILABLE. PILOTS MAY\n EITHER SELECT A SPECIFIC COST INDEX NUMBER FROM THE LIST, OR THEY\n MAY SELECT \"AUTO\". WHEN PLANNING AN \"AUTO\" COST INDEX, THE SYSTEM\n WILL REFERENCE THE \"TIME ENROUTE\" OPTION AND ATTEMPT TO CHOOSE A\n COST INDEX WHICH CLOSELY MATCHES THIS VALUE. NOTE THAT THE \"TIME\n ENROUTE\" OPTION IS MEANT AS A GATE TO GATE TIME (AS INDICATED ON\n AN AIRLINE'S FLIGHT SCHEDULE, FOR EXAMPLE). IF A \"TIME ENROUTE\" OF\n 2:30 IS SELECTED, THE SYSTEM WILL SUBTRACT THE TAXI TIMES FROM\n THIS VALUE TO DETERMINE THE SCHEDULED AIR TIME. IT WILL THEN\n DETERMINE AND USE THE COST INDEX WHICH MATCHES THIS AIR TIME.</t>\n\n<b>SB003/13 </b>\n SUBJECT: FLIGHT RELEASE UNITS\n <t>ALL FLIGHT CREW: PLEASE PAY SPECIAL ATTENTION TO THE UNITS\n SELECTION WHEN GENERATING A FLIGHT PLAN. FAILURE TO IDENTIFY THE\n CORRECT UNITS WHEN REFUELING PRIOR TO FLIGHT CAN RESULT IN\n DEPARTING WITH INSUFFICIENT FUEL AND/OR AN ERRONEOUS PAYLOAD.</t>\n\n<b>=============\nCREW BULLETIN\n=============</b>\n\nNIL\n\n\n==================== END OF LIDO-NOTAM-BULLETIN ====================<h2 style=\"page-break-after: always;\"> </h2>Route\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_ROUTE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_ROUTE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 1 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS24000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS24000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 2 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS30000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS30000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 3 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS34000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_WINDS34000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>Vertical profile\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_PROFILE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/KAUSKJFK_1585320642_PROFILE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a></pre></div>\n \n \n \n 1585320631\n 1585288800\n 1585319581\n 1585320424\n 1585320064\n 1585314540\n \n \n http://www.simbrief.com/ofp/flightplans/\n \n PDF Document\n KAUSKJFK_PDF_1585320643.pdf\n \n \n Aerosoft Airbus\n KAUSKJFK_ABX_1585320643.flp\n \n \n Aerosoft Airbus EFB\n KAUSKJFK_PDF_1585320643.pdf--A3E\n \n \n Aerosoft CRJ\n KAUSKJFK_CRX_1585320643.flp\n \n \n Aerowinx PSX 747\n KAUSKJFK_PSX_1585320643.route\n \n \n AivlaSoft EFB\n KAUSKJFK_EFB_1585320643.efbr\n \n \n AivlaSoft EFB v2\n KAUSKJFK_EF2_1585320643.efbr\n \n \n Black Box Airbus\n KAUSKJFK_BBS_1585320643.pln\n \n \n Captain Sim (PLN)\n KAUSKJFK_CSF_1585320643.pln\n \n \n FeelThere\n KAUSKJFK_FTR_1585320643.fpl\n \n \n Flight1 GTN\n KAUSKJFK_GTN_1585320643.gfp\n \n \n FlightFactor 757-777\n KAUSKJFK_VMX_1585320643.flp\n \n \n FlightFactor A320\n KAUSKJFK_FFA_1585320643.in\n \n \n FS Commander\n KAUSKJFK_FSC_1585320643.pln\n \n \n FS2004\n KAUSKJFK_FS9_1585320643.pln\n \n \n FSLabs A320\n KAUSKJFK_FSL_1585320643.txt\n \n \n FSX/P3D\n KAUSKJFK_FSX_1585320643.pln\n \n \n FSX/P3D (No SID/STAR)\n KAUSKJFK_FSN_1585320643.pln\n \n \n Google Earth KML\n KAUSKJFK_KML_1585320643.kml\n \n \n iFly 737NG\n KAUSKJFK_IFY_1585320643.FLTPLAN\n \n \n iFly 747 V2\n KAUSKJFK_I74_1585320643.route\n \n \n IVAO/IVAP\n KAUSKJFK_IVO_1585320643.fpl\n \n \n IVAO/IVAP (Default.fpl)\n KAUSKJFK_XVD_1585320643.fpl\n \n \n IVAO/XIVAP\n KAUSKJFK_XVP_1585320643.fpl\n \n \n IXEG 737 Classic\n KAUSKJFK_IXG_1585320643.fpl\n \n \n JARDesign Airbus\n KAUSKJFK_JAR_1585320643.txt\n \n \n Leonardo MD80\n KAUSKJFK_MDR_1585320643.mdr\n \n \n Leonardo MD80 (ACARS)\n KAUSKJFK_MDA_1585320643.txt\n \n \n Level-D 767\n KAUSKJFK_LVD_1585320643.rte\n \n \n Majestic Q400\n KAUSKJFK_MJC_1585320643.fpr\n \n \n phpVMS ACARS\n KAUSKJFK_VMS_1585320643.xml\n \n \n PMDG Flightplan\n KAUSKJFK_PMR_1585320643.rte\n \n \n PMDG Wind Uplink\n KAUSKJFK_PMW_1585320643.wx\n \n \n Project Magenta\n KAUSKJFK_MGA_1585320643.sbp\n \n \n ProSim 737\n KAUSKJFK_PSM_1585320643.xml\n \n \n QualityWings\n KAUSKJFK_QTY_1585320643.RTE\n \n \n Sim-Avionics\n xml/KAUSKJFK_XML_1585320643.xml--sbr\n \n \n Squawkbox\n KAUSKJFK_SFP_1585320643.sfp\n \n \n TFDi Design 717\n KAUSKJFK_TFD_1585320643.xml\n \n \n UFMC - Universal FMC\n KAUSKJFK_UFC_1585320643.ufmc\n \n \n vasFMC\n KAUSKJFK_VAS_1585320643.fmc\n \n \n vPilot\n KAUSKJFK_VFP_1585320643.vfp\n \n \n Wilco Airbus Evo\n KAUSKJFK_WAE_1585320643.rte\n \n \n X-FMC\n KAUSKJFK_XFM_1585320643.FPL\n \n \n X-Plane 11\n KAUSKJFK_XPE_1585320643.fms\n \n \n X-Plane 9/10\n KAUSKJFK_XP9_1585320643.fms\n \n \n \n http://www.simbrief.com/ofp/flightplans/\n \n PDF Document\n KAUSKJFK_PDF_1585320643.pdf\n \n \n Aerosoft Airbus\n KAUSKJFK_ABX_1585320643.flp\n \n \n Aerosoft Airbus EFB\n KAUSKJFK_PDF_1585320643.pdf--A3E\n \n \n Aerosoft CRJ\n KAUSKJFK_CRX_1585320643.flp\n \n \n Aerowinx PSX 747\n KAUSKJFK_PSX_1585320643.route\n \n \n AivlaSoft EFB\n KAUSKJFK_EFB_1585320643.efbr\n \n \n AivlaSoft EFB v2\n KAUSKJFK_EF2_1585320643.efbr\n \n \n Black Box Airbus\n KAUSKJFK_BBS_1585320643.pln\n \n \n Captain Sim (PLN)\n KAUSKJFK_CSF_1585320643.pln\n \n \n FeelThere\n KAUSKJFK_FTR_1585320643.fpl\n \n \n Flight1 GTN\n KAUSKJFK_GTN_1585320643.gfp\n \n \n FlightFactor 757-777\n KAUSKJFK_VMX_1585320643.flp\n \n \n FlightFactor A320\n KAUSKJFK_FFA_1585320643.in\n \n \n FS Commander\n KAUSKJFK_FSC_1585320643.pln\n \n \n FS2004\n KAUSKJFK_FS9_1585320643.pln\n \n \n FSLabs A320\n KAUSKJFK_FSL_1585320643.txt\n \n \n FSX/P3D\n KAUSKJFK_FSX_1585320643.pln\n \n \n FSX/P3D (No SID/STAR)\n KAUSKJFK_FSN_1585320643.pln\n \n \n Google Earth KML\n KAUSKJFK_KML_1585320643.kml\n \n \n iFly 737NG\n KAUSKJFK_IFY_1585320643.FLTPLAN\n \n \n iFly 747 V2\n KAUSKJFK_I74_1585320643.route\n \n \n IVAO/IVAP\n KAUSKJFK_IVO_1585320643.fpl\n \n \n IVAO/IVAP (Default.fpl)\n KAUSKJFK_XVD_1585320643.fpl\n \n \n IVAO/XIVAP\n KAUSKJFK_XVP_1585320643.fpl\n \n \n IXEG 737 Classic\n KAUSKJFK_IXG_1585320643.fpl\n \n \n JARDesign Airbus\n KAUSKJFK_JAR_1585320643.txt\n \n \n Leonardo MD80\n KAUSKJFK_MDR_1585320643.mdr\n \n \n Leonardo MD80 (ACARS)\n KAUSKJFK_MDA_1585320643.txt\n \n \n Level-D 767\n KAUSKJFK_LVD_1585320643.rte\n \n \n Majestic Q400\n KAUSKJFK_MJC_1585320643.fpr\n \n \n phpVMS ACARS\n KAUSKJFK_VMS_1585320643.xml\n \n \n PMDG Flightplan\n KAUSKJFK_PMR_1585320643.rte\n \n \n PMDG Wind Uplink\n KAUSKJFK_PMW_1585320643.wx\n \n \n Project Magenta\n KAUSKJFK_MGA_1585320643.sbp\n \n \n ProSim 737\n KAUSKJFK_PSM_1585320643.xml\n \n \n QualityWings\n KAUSKJFK_QTY_1585320643.RTE\n \n \n Sim-Avionics\n xml/KAUSKJFK_XML_1585320643.xml--sbr\n \n \n Squawkbox\n KAUSKJFK_SFP_1585320643.sfp\n \n \n TFDi Design 717\n KAUSKJFK_TFD_1585320643.xml\n \n \n UFMC - Universal FMC\n KAUSKJFK_UFC_1585320643.ufmc\n \n \n vasFMC\n KAUSKJFK_VAS_1585320643.fmc\n \n \n vPilot\n KAUSKJFK_VFP_1585320643.vfp\n \n \n Wilco Airbus Evo\n KAUSKJFK_WAE_1585320643.rte\n \n \n X-FMC\n KAUSKJFK_XFM_1585320643.FPL\n \n \n X-Plane 11\n KAUSKJFK_XPE_1585320643.fms\n \n \n X-Plane 9/10\n KAUSKJFK_XP9_1585320643.fms\n \n \n \n http://www.simbrief.com/ofp/uads/\n \n Route\n KAUSKJFK_1585320642_ROUTE.gif\n \n \n UAD 1 of 3\n KAUSKJFK_1585320642_WINDS24000.gif\n \n \n UAD 2 of 3\n KAUSKJFK_1585320642_WINDS30000.gif\n \n \n UAD 3 of 3\n KAUSKJFK_1585320642_WINDS34000.gif\n \n \n Vertical profile\n KAUSKJFK_1585320642_PROFILE.gif\n \n \n \n http://skyvector.com/?ll=35.97795,-86.490918&chart=304&zoom=9&fpl= KAUS ILEXY2 ZENZI LFK AEX MEI ATL FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4 KJFK\n \n <Form method=\"get\" action=\"https://cert.vatsim.net/fp/file.php\" target=\"_blank\">\n<button type=\"submit\">Pre-file on VATSIM</button>\n<input type=\"hidden\" name=\"2\" value=\"VMS100\">\n<input type=\"hidden\" name=\"3\" value=\"H/A306/L\">\n<input type=\"hidden\" name=\"4\" value=\"463\">\n<input type=\"hidden\" name=\"5\" value=\"KAUS\">\n<input type=\"hidden\" name=\"6\" value=\"1230\">\n<input type=\"hidden\" name=\"7\" value=\"31000\">\n<input type=\"hidden\" name=\"8\" value=\"ILEXY2 ZENZI LFK AEX MEI ATL FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\">\n<input type=\"hidden\" name=\"9\" value=\"KJFK\">\n<input type=\"hidden\" name=\"10a\" value=\"03\">\n<input type=\"hidden\" name=\"10b\" value=\"02\">\n<input type=\"hidden\" name=\"11\" value=\"PBN%2FA1B1C1D1L1O1S2+DOF%2F140101+REG%2FN306SB+EET%2FKZME0047+KZTL0105+KZDC0157+KZNY0246+OPR%2FVMS+RMK%2FTCAS SIMBRIEF\">\n<input type=\"hidden\" name=\"12a\" value=\"04\">\n<input type=\"hidden\" name=\"12b\" value=\"44\">\n<input type=\"hidden\" name=\"13\" value=\"KBOS\">\n<input type=\"hidden\" name=\"14\" value=\"NABEEL SHAHZAD\">\n<input type=\"hidden\" name=\"voice\" value=\"/V/\">\n</Form>\n <form action=\"https://fpl.ivao.aero/api/fp/load\" method=\"POST\" target=\"_blank\">\n<button type=\"submit\">Pre-file on IVAO</button>\n<input type=\"hidden\" name=\"CALLSIGN\" value=\"VMS100\">\n<input type=\"hidden\" name=\"RULES\" value=\"I\">\n<input type=\"hidden\" name=\"FLIGHTTYPE\" value=\"S\">\n<input type=\"hidden\" name=\"NUMBER\" value=\"1\">\n<input type=\"hidden\" name=\"ACTYPE\" value=\"A306\">\n<input type=\"hidden\" name=\"WAKECAT\" value=\"H\">\n<input type=\"hidden\" name=\"EQUIPMENT\" value=\"SDE2E3FGHIRYW\">\n<input type=\"hidden\" name=\"TRANSPONDER\" value=\"LB1\">\n<input type=\"hidden\" name=\"DEPICAO\" value=\"KAUS\">\n<input type=\"hidden\" name=\"DEPTIME\" value=\"1230\">\n<input type=\"hidden\" name=\"SPEEDTYPE\" value=\"N\">\n<input type=\"hidden\" name=\"SPEED\" value=\"0463\">\n<input type=\"hidden\" name=\"LEVELTYPE\" value=\"F\">\n<input type=\"hidden\" name=\"LEVEL\" value=\"310\">\n<input type=\"hidden\" name=\"ROUTE\" value=\"ILEXY2 ZENZI DCT LFK DCT AEX DCT MEI DCT ATL DCT FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\">\n<input type=\"hidden\" name=\"DESTICAO\" value=\"KJFK\">\n<input type=\"hidden\" name=\"EET\" value=\"0302\">\n<input type=\"hidden\" name=\"ALTICAO\" value=\"KBOS\">\n<input type=\"hidden\" name=\"ALTICAO2\" value=\"\">\n<input type=\"hidden\" name=\"OTHER\" value=\"PBN/A1B1C1D1L1O1S2 DOF/140101 REG/N306SB EET/KZME0047 KZTL0105 KZDC0157 KZNY0246 OPR/VMS RMK/TCAS SIMBRIEF\">\n<input type=\"hidden\" name=\"ENDURANCE\" value=\"0444\">\n<input type=\"hidden\" name=\"POB\" value=\"354\">\n</form>\n https://www.simbrief.com/ofp/flightplans/KAUSKJFK_MJS_1585320643.js\n \n VMS\n 100\n A306\n KAUS\n KJFK\n 1388534400\n 43200\n 1800\n ILEXY2 ZENZI LFK AEX MEI ATL FIGEY Q64 TYI J209 ORF J121 SIE CAMRN4\n 7200\n 900\n \n \n \n auto\n KBOS\n \n NABEEL SHAHZAD\n 120867\n 1\n auto\n 0\n auto\n 45\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n AUTO\n lido\n 1\n 1\n 0\n 1\n 1\n 1\n 0\n 1\n \n \n \n \n \n \n \n \n \n false\n \n \n\n" + created_at: '2020-03-27 14:55:51' + updated_at: '2020-03-27 14:55:51' + - + id: 1585669688_A07496CE59 + user_id: 1 + flight_id: flightid_6 + pirep_id: null + acars_xml: "\n\n \n 19893491\n 120867\n 1585669695\n lido2\n 2001\n lbs\n \n \n 1\n VMS\n 113\n 0\n PLANNED OPTIMUM FLIGHT LEVEL\n \n 1\n CI5\n 250/280/78\n 78/280/250\n CI0\n RES\n 5\n 16000\n OMDB/0160\n 8\n 38512\n -6\n 278\n 028\n 63\n 105\n 108\n 2606\n 338\n .53\n 145\n KUTL3F KUTLI DCT EMERU EMER2D\n KUTLI3F KUTLI DCT EMERU EMERU2D\n KUTL3F KUTLI DCT EMERU EMER2D\n \n \n OMDB\n DXB\n \n 62\n 25.252778\n 55.364444\n DUBAI INTL\n 30L\n \n \n OMAA\n AUH\n \n 83\n 24.433056\n 54.651111\n ABU DHABI INTL\n 31L\n \n \n OMDB\n DXB\n \n 62\n 25.252778\n 55.364444\n DUBAI INTL\n 30L\n 18000\n 139\n 63\n 137\n 038\n 036\n 328\n 331\n P003\n 274\n 033\n 39100\n P07\n 2104\n 2906\n DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT\n DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT\n \n \n \n \n \n DB570\n DB570\n wpt\n 25.295528\n 55.294722\n CLB\n KUTL3F\n 1\n 5\n 304\n 302\n 302\n 300\n 9800\n \n \n DB575\n DB575\n wpt\n 25.227500\n 55.181111\n CLB\n KUTL3F\n 1\n 7\n 236\n 234\n 239\n 237\n 14200\n \n \n DB467\n DB467\n wpt\n 25.202222\n 55.091667\n CLB\n KUTL3F\n 1\n 5\n 252\n 250\n 254\n 252\n 15700\n \n \n TOC\n TOP OF CLIMB\n ltlg\n 25.195879\n 55.074647\n CLB\n KUTL3F\n 1\n 1\n 247\n 245\n 250\n 248\n 16000\n \n \n GINLA\n GINLA\n wpt\n 25.140833\n 54.927222\n CRZ\n KUTL3F\n 1\n 9\n 247\n 246\n 250\n 248\n 16000\n \n \n XARTA\n XARTA\n wpt\n 25.025861\n 54.927222\n CRZ\n KUTL3F\n 1\n 7\n 180\n 178\n 186\n 184\n 16000\n \n \n KUTLI\n KUTLI\n wpt\n 24.864250\n 54.938333\n CRZ\n KUTL3F\n 0\n 10\n 176\n 174\n 182\n 180\n 16000\n \n \n TOD\n TOP OF DESCENT\n ltlg\n 24.824103\n 55.018735\n CRZ\n DCT\n 0\n 5\n 118\n 117\n 121\n 119\n 16000\n \n \n EMERU\n EMERU\n wpt\n 24.808056\n 55.050833\n DSC\n DCT\n 0\n 2\n 118\n 117\n 120\n 118\n 15400\n \n \n TUGVA\n TUGVA\n wpt\n 24.583889\n 54.904222\n DSC\n EMER2D\n 1\n 16\n 210\n 209\n 214\n 212\n 10700\n \n \n TONKI\n TONKI\n wpt\n 24.445861\n 54.814222\n DSC\n EMER2D\n 1\n 10\n 210\n 209\n 214\n 212\n 7700\n \n \n LOXIX\n LOXIX\n wpt\n 24.354528\n 54.942417\n DSC\n EMER2D\n 1\n 9\n 128\n 126\n 128\n 126\n 5000\n \n \n OMAA\n ABU DHABI INTL\n apt\n 24.433056\n 54.651111\n DSC\n EMER2D\n 1\n 19\n 286\n 285\n 288\n 286\n 2600\n \n \n \n (FPL-VMS113-IS\n-B737/M-SDE2E3FGHIRWXY/LB1\n-OMDB1230\n-N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n-OMAA0029 OMDB\n-PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS)\n N0338F160 KUTL3F KUTLI DCT EMERU EMER2D\n N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n VMS113\n 0338\n N\n 160\n F\n PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS\n OMAE\n OMAE\n OMAE\n \n \n \n \n B737\n 73G\n B737-700\n N714SB\n 714\n \n M-SDE2E3FGHIRWXY/LB1\n 149\n 1\n \n \n 250\n 2606\n 1338\n 2906\n 2159\n 0\n 0\n 9009\n 9009\n 9259\n 6653\n 5353\n 46100\n \n \n 1753\n 7140\n 1388579400\n 1388580000\n 1388587140\n 1388587500\n 8100\n 1388579400\n 1388580000\n 1388581753\n 1388582113\n 2713\n 4\n 4\n 600\n 360\n 1800\n 6907\n 900\n 0\n 0\n \n \n 84119\n 145\n 230\n 200\n 33550\n 117669\n 121700\n 126678\n 131806\n 154500\n L\n 124072\n 129200\n 126928\n \n \n <div style=\"line-height:14px;font-size:13px\"><pre><!--BKMK///OFP///0--><!--BKMK///Summary and Fuel///1--><b>[ OFP ]\n--------------------------------------------------------------------</b>\nVMS0113 01JAN2014 OMDB-OMAA B737 N714SB RELEASE 1548 31MAR20\nOFP 1 DUBAI INTL-ABU DHABI INTL\n WX PROG 0112 0115 OBS 2412 2412\n\t\n ATC C/S VMS113 OMDB/DXB OMAA/AUH CRZ SYS CI 5\n01JAN2014 N714SB 1230/1240 1309/1315 GND DIST 105\nB737-700 / CFM56-7B24 STA 1445 AIR DIST 108\n CTOT:.... G/C DIST 63\n AVG WIND 278/028\nMAXIMUM TOW 154500 LAW 129200 ZFW 121700 AVG W/C M006\nESTIMATED TOW 126678 LAW 124072 ZFW 117669 AVG ISA P008\n AVG FF LBS/HR 5353\n FUEL BIAS P00.0\nALTN OMDB TKOF ALTN .......\nFL STEPS OMDB/0160/\n--------------------------------------------------------------------\nDISP RMKS PLANNED OPTIMUM FLIGHT LEVEL\n\n--------------------------------------------------------------------\n PLANNED FUEL\n---------------------------------\nFUEL ARPT FUEL TIME\n---------------------------------\nTRIP AUH 2606 0029\nCONT 15 MIN 1338 0015\nALTN DXB 2906 0035\nFINRES 2159 0030\n---------------------------------\nMINIMUM T/OFF FUEL 9009 0149\n---------------------------------\nEXTRA 0 0000\n---------------------------------\nT/OFF FUEL 9009 0149\nTAXI DXB 250 0010\n---------------------------------\nBLOCK FUEL DXB 9259\nPIC EXTRA .....\nTOTAL FUEL .....\nREASON FOR PIC EXTRA ............\n--------------------------------------------------------------------\nNO TANKERING RECOMMENDED (P)\n--------------------------------------------------------------------\nI HEREWITH CONFIRM THAT I HAVE PERFORMED A THOROUGH SELF BRIEFING\nABOUT THE DESTINATION AND ALTERNATE AIRPORTS OF THIS FLIGHT \nINCLUDING THE APPLICABLE INSTRUMENT APPROACH PROCEDURES, AIRPORT \nFACILITIES, NOTAMS AND ALL OTHER RELEVANT PARTICULAR INFORMATION.\n\nDISPATCHER: GENEVA CROSS PIC NAME: SHAHZAD, NABEEL\n\nTEL: +1 800 555 0199 PIC SIGNATURE: ...............<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Routing and Impacts///1-->\nALTERNATE ROUTE TO: FINRES 2159\nAPT TRK DST VIA FL WC TIME FUEL\n--------------------------------------------------------------------\nOMDB/30L 038 139 DCT BOMUP DCT LOVIM DCT RESIG 180 P003 0035 2906\n DCT NODVI DCT OBMUK DCT LORID \n DCT ORGUR DCT PEBUS DCT EMOPO \n DCT LOTUK DCT LAGTA DCT LOVOL \n DCT \n--------------------------------------------------------------------\n\nMEL/CDL ITEMS DESCRIPTION\n------------- -----------\n\n--------------------------------------------------------------------\n\nROUTING:\n\nROUTE ID: DEFRTE\nOMDB/30L KUTLI3F KUTLI DCT EMERU EMERU2D OMAA/31L\n\n--------------------------------------------------------------------\nDEPARTURE ATC CLEARANCE:\n.\n.\n.\n--------------------------------------------------------------------\n OPERATIONAL IMPACTS\n -------------------\nWEIGHT CHANGE UP 1.0 TRIP P 0027 LBS TIME P 0000\nWEIGHT CHANGE DN 1.0 TRIP P 0018 LBS TIME P 0000\nFL CHANGE UP FL1 NOT AVAILABLE\nFL CHANGE DN FL1 TRIP P 0033 LBS TIME P 0000\nFL CHANGE DN FL2 TRIP P 0028 LBS TIME P 0000\nSPD CHANGE CI 0 TRIP M 0001 LBS TIME P 0000\nSPD CHANGE CI 100 TRIP P 0066 LBS TIME M 0001\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Times and Weights///1-->--------------------------------------------------------------------\nATIS:\n.\n.\n--------- --------- --------- --------- --------- --------- --------\nRVSM: ALT SYS LEFT: STBY: RIGHT:\n\n--------- --------- --------- --------- --------- --------- --------\n--------------------------------------------------------------------\n TIMES\n -----\n\t\t\t\t \n ESTIMATED SKED ACTUAL\n\nOUT 1230Z/1630L 1230Z/1630L ......Z\n\nOFF 1240Z/1640L 1240Z/1640L ......Z\n\nON 1309Z/1709L 1439Z/1839L ......Z\n\nIN 1315Z/1715L 1445Z/1845L ......Z\n\nBLOCK TIME 0045 0215 ......\n\n--------------------------------------------------------------------\n WEIGHTS\n -------\n\n EST MAX ACTUAL\n\nPAX 145 ......\n\nCARGO 0.2 ......\n\nPAYLOAD 33.6 ......\n\nZFW 117.7 121.7 ......\n\nFUEL 9.3 14.4 ...... POSS EXTRA 5.1\n\nTOW 126.7 131.8 LDG......\n\nSTAB TRIM ......\n\nLAW 124.1 129.2 ......\n\n--------------------------------------------------------------------\n TERRAIN CLEARANCE CHECK\n -----------------------\nDD CHECK - TERRAIN CLEARANCE CHECK DISABLED\n\nDP CHECK - TERRAIN CLEARANCE CHECK DISABLED\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Flight Log///1--> FLIGHT LOG \n ---------- \n\nMOST CRITICAL MORA 02400 FEET AT TONKI///MXSHR 02 AT TOC\n--------------------------------------------------------------------\nAWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\n 302 9.0 0.3\nDUBAI INTL N2515.2 ... 21 304 M021 \nOMDB E05521.9 0000 ... 105 274 .... ....\n\nKUTLI3F 098 234 .45 282/023 04 8.6 0.7\nDB570 N2517.7 0001 ... 21 236 M021 P09\nDB570 E05517.7 0001 ... 5 100 274 348 .... ....\n\nKUTLI3F 142 250 .55 272/032 M04 8.0 1.2\nDB575 N2513.7 0003 ... 21 252 M026 P09\nDB575 E05510.9 0004 ... 7 93 328 348 .... ....\n\nKUTLI3F 157 245 .57 274/035 M07 7.6 1.6\nDB467 N2512.1 0001 ... 20 247 M033 P09\nDB467 E05505.5 0005 ... 5 88 330 348 .... ....\n\nKUTLI3F 160 246 .57 275/036 M08 7.5 1.7\nT O C N2511.8 0001 ... 20 247 365 M032 P09\n E05504.5 0006 ... 1 87 333 2 348 .... ....\n\nKUTLI3F 160 178 .53 275/036 M08 7.4 1.9\nGINLA N2508.4 0001 ... 21 180 338 M032 P09\nGINLA E05455.6 0007 ... 9 78 306 2 348 .... ....\n\nKUTLI3F 160 174 .52 275/036 M08 7.3 2.0\nXARTA N2501.6 0002 ... 21 176 329 P001 P09\nXARTA E05455.6 0009 ... 7 71 330 2 348 .... ....\n\nKUTLI3F 160 117 .52 275/036 M08 7.2 2.1\nKUTLI N2451.9 0001 ... 23 118 328 P004 P09\nKUTLI E05456.3 0010 ... 10 61 332 2 348 .... ....\n\nDCT 160 117 .51 275/036 M08 7.1 2.2\nT O D N2449.4 0001 ... 22 118 321 P033 P09\n E05501.1 0011 ... 5 56 354 2 348 .... ....\n\nDCT 154 209 .56 274/034 M07 7.1 2.2\nEMERU N2448.5 0001 ... 23 210 P031 P09\nEMERU E05503.0 0012 ... 2 54 392 348 .... ....\n\nEMERU2D 107 209 .51 280/025 02 6.9 2.3\nTUGVA N2435.0 0004 ... 23 210 M009 P08\nTUGVA E05454.3 0016 ... 16 38 325 348 .... ....\n\nEMERU2D 077 126 .43 288/019 08 6.9 2.4\nTONKI N2426.8 0002 ... 24 128 M005 P08\nTONKI E05448.9 0018 ... 10 28 280 516 .... ....\n\n<h2 style=\"page-break-after: always;\"> </h2>AWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\nEMERU2D 050 285 .41 300/015 09 6.8 2.5\nLOXIX N2421.3 0003 ... 23 286 P015 P04\nLOXIX E05456.5 0021 ... 9 19 286 516 .... ....\n\nEMERU2D 6.4 2.9\nABU DHABI I N2426.0 0008 ... \nOMAA E05439.1 0029 ... 19 .... ....\n\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Wind Information///1-->--------------------------------------------------------------------\n WIND INFORMATION \n ---------------- \n\nCLIMB T O C GINLA XARTA\n350 259/067 -51 200 273/042 -19 200 273/042 -19 200 273/042 -19\n310 264/052 -47 180 275/039 -14 180 275/039 -14 180 275/039 -14\n200 273/042 -19 160 275/036 -08 160 275/036 -08 160 275/036 -08\n150 273/033 -06 140 272/031 -04 140 272/031 -04 140 272/031 -04\n100 282/024 +04 120 276/027 +00 120 276/027 +00 120 276/027 +00\n\nKUTLI T O D DESCENT\n200 273/042 -19 200 273/042 -19 350 256/083 -50\n180 275/039 -14 180 275/039 -14 310 256/065 -45\n160 275/036 -08 160 275/036 -08 200 269/044 -18\n140 272/031 -04 140 272/031 -04 150 275/033 -06\n120 276/027 +00 120 276/027 +00 100 269/021 +04\n\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///ATC Flight Plan///0--><b>[ ATC Flight Plan ]\n--------------------------------------------------------------------</b>\n ICAO FLIGHT PLAN \n ---------------- \n\nFF OMAEZQZX\n311548 CYULSBFP\n(FPL-VMS113-IS\n-B737/M-SDE2E3FGHIRWXY/LB1\n-OMDB1230\n-N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n-OMAA0019 OMDB\n-PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS)<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Additional Info///0--><b>[ Additional Info ]\n--------------------------------------------------------------------</b>\nD I S P A T C H B R I E F I N G I N F O VMS0113 OMDB/OMAA\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Airport WX List///0--><b>[ Airport WX List ]\n--------------------------------------------------------------------</b>\nOMDB --> OMAA VMS 113 / 01JAN2014\nLIDO/WEATHER SERVICE DATE : 31Mar2020 TIME : 15:48 UTC\n\nAIRMETs:\n No Wx data available\n\nSIGMETs:\n No Wx data available\n\nTropical Cyclone SIGMETs:\n No Wx data available\n\nVolcanic Ash SIGMETs:\n No Wx data available\n\nDeparture / Destination Alternate:\nOMDB/DXB DUBAI INTL\n SA 311500 28009KT CAVOK 24/16 Q1013 NOSIG\n FT 311101 3112/0118 28014KT CAVOK\n BECMG 3116/3118 20007KT\n BECMG 0108/0110 30012KT\n BECMG 0116/0118 21007KT\n\nDestination:\nOMAA/AUH ABU DHABI INTL\n SA 311500 32011KT CAVOK 24/16 Q1013 NOSIG\n FT 311100 3112/0118 30014KT CAVOK\n BECMG 3118/3120 23006KT\n PROB30 0101/0104 3500 HZ\n BECMG 0107/0109 30012KT\n BECMG 0117/0118 VRB02KT\n\n\n\n AIRPORTLIST ENDED<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///NOTAM///0--><b>[ NOTAM ]\n--------------------------------------------------------------------</b>\nLIDO-NOTAM-BULLETIN INCLUDES NOTAM, COMP NOTAM AND AIP-REGULATION\n<b>VALID: 1401011230 - 1401011650</b> STD(EOBT)+TRIP+ALTN+3HRS\nVMS 113 /01JAN OFP-NR: 1\nROUTE: OMDB - OMAA ALTN: OMDB\nN0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n\n\n<b>=============================================\nDEPARTURE / ALTERNATE AIRPORT - DETAILED INFO\n=============================================</b>\n\n<b>OMDB/DXB DUBAI INTL\n-----------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A0802/20 </b>\n H24\n SECN OF TXL T BTN TXL S AND <b>TWY M</b> <b>CLSD</b>.\n SECN OF <b>TWY M</b> BTN <b>TWY M20</b> AND <b>TWY M21</b> <b>CLSD</b>.\n <b>TWY M21</b> AND ASSOCIATED LINKS <b>CLSD</b>.\n<b>A0817/20 </b>\n H24\n SECN OF TXL J BEHIND STANDS D1 TO D3 <b>CLSD</b>.\n<b>A0808/20 </b>\n H24\n SECN OF TXL P BTN ACFT STANDS E14 AND E18 AND ASSOCIATED <b>TWY P3</b>\n LINK <b>CLSD</b>.\n<b>A0769/20 </b>\n H24\n RFFS <b>CAT</b> <b>DOWNGRADED</b> TO <b>CAT</b> 7.\n <b>CAT</b> 8, <b>CAT</b> 9 AND <b>CAT</b> 10 <b>AVBL</b> WITH 20 MIN PN.\n<b>A0766/20 </b>\n H24\n <b>TWY Z8</b> AND <b>TWY Z9</b> <b>NOT AVBL</b>.\n<b>A0754/20 </b>\n HJ\n UAS ACT WILL TAKE PLACE WI AREA BOUNDED BY LINES JOINING:\n 251806.38N 0551940.66E\n 251636.78N 0551741.26E\n 251730.33N 0551711.46E\n 251809.04N 0551741.28E\n 251815.30N 0551851.37E\n F) SFC G) 200FT AGL\n<b>A0302/20 </b>\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020 <b>TWY</b>\n DETAILS AMD\n VFR CHARTS AMD\n<b>A0689/20 </b>\n H24\n OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E\n ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT\n F) SFC G) 289FT AMSL<h2 style=\"page-break-after: always;\"> </h2><b>A0535/20 </b>\n H24\n <b>TWY K13</b> <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY K</b> EASTBOUND <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY K</b> WESTBOUND <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY J5</b> <b>CLSD</b>\n <b>TWY K</b> CL TO OBJECT CLR REDUCED TO 47.5M ABEAM <b>TWY K13</b>\n<b>A0469/20 </b>\n H24\n OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E\n OMDB ARP BRG 201 DEG MAG DIST 5230M.\n CRANE LGT AT NGT.\n F) SFC G) 1109FT AMSL\n<b>A0264/20 </b>\n DLY BTN 0300-0700\n PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO\n SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC.\n F) 500FT AGL G) 1500FT AGL\n<b>A0171/20 </b>\n H24\n OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E\n ARP BRG 212 DEG MAG DIST 9.93KM.\n CRANE LGT AT NGT.\n F) SFC G) 679FT AMSL\n<b>A0149/20 </b>\n H24\n OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E\n ARP BRG 202 DEG MAG DIST 5.5KM\n CRANE LIT AT NGT.\n F) SFC G) 1004FT AMSL\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A0752/20 </b>\n H24\n <b>RWY 12L/30R</b> <b>CLSD</b>\n\n+++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++\n\n<b>A0275/20 </b>\n SID ITOTU 1F <b>RWY</b> 30L/R <b>WITHDRAWN</b>\n REF UAE AIP CHART OMDB <b>AD</b> 2-42.\n\n<b>===================================\nDESTINATION AIRPORT - DETAILED INFO\n===================================</b>\n\n<b>OMAA/AUH ABU DHABI INTL\n---------------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A0796/20 </b>\n H24\n <b>TWY A</b> BTN <b>TWY A14</b> AND <b>TWY A17</b> INCLUDING INT WITH <b>TWY A16</b> AND <b>TWY</b>\n B15 <b>CLSD</b>.<h2 style=\"page-break-after: always;\"> </h2><b>A0798/20 </b>\n DLY BTN 0300-1400\n <b>TWY A</b> BTN <b>TWY A14</b> AND <b>TWY G</b> INCLUDING INT OF <b>TWY A14</b> AND <b>TWY A</b>\n <b>CLSD</b> DUE <b>WIP</b>.\n INT <b>TWY A17</b> AND <b>TWY A</b> <b>CLSD</b> DUE <b>WIP</b>.\n <b>TWY B</b> BTN <b>TWY A18</b> AND <b>TWY G</b> <b>CLSD</b> DUE <b>WIP</b>.\n<b>A0799/20 </b>\n DLY BTN 0300-1400\n OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING:\n 242636.62N 0543958.28E\n 242630.00N 0544007.42E\n 242634.26N 0543956.35E\n 242627.55N 0544005.24E\n 242636.62N 0543958.28E\n F) SFC G) 036FT AGL\n<b>A0299/20 </b>\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020\n SURVEILLANCE SER BASED ON MODE S MULTILATERATION PROC ADDED MISSED\n APCH ALT AMD\n CHART REF FOR RVR LCA AMD.\n<b>A0738/20 </b>\n H24\n <b>TWY C</b> AND <b>TWY N</b> <b>CLSD</b>.\n<b>A0737/20 </b>\n H24\n SECN OF <b>TWY B</b> BTN <b>TWY B9</b> AND <b>TWY G</b> <b>CLSD</b> DUE <b>WIP</b>.\n<b>A0401/20 </b>\n DLY BTN 0200-1600\n OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN\n 242742.38N 0543602.65E\n F) SFC G) 338FT AGL\n<b>A0408/20 </b>\n DLY BTN 0130-0300 AND 1430-1530\n IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM,\n ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE\n TIMES IN <b>CAT</b> I COND. ATC WILL CONT TO ISSUE STANDARD <b>TWY</b> ROUTINGS\n BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT\n ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND\n THEREFORE SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS\n A DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT\n SHALL CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD\n PSN WHEN SAFE TO DO SO.\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A0797/20 </b>\n DLY BTN 0300-1400\n <b>RWY 13L/31R</b> <b>CLSD</b> DUE <b>WIP</b>.\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Company NOTAM///0--><b>[ Company NOTAM ]\n--------------------------------------------------------------------</b>\n<b>==========\nCREW ALERT\n==========</b>\n\n<b>SB007/14 </b>\n SUBJECT: AUTO COST INDEXES\n <t>WHEN PLANNING A COST INDEX, 2 OPTIONS ARE AVAILABLE. PILOTS MAY\n EITHER SELECT A SPECIFIC COST INDEX NUMBER FROM THE LIST, OR THEY\n MAY SELECT \"AUTO\". WHEN PLANNING AN \"AUTO\" COST INDEX, THE SYSTEM\n WILL REFERENCE THE \"TIME ENROUTE\" OPTION AND ATTEMPT TO CHOOSE A\n COST INDEX WHICH CLOSELY MATCHES THIS VALUE. NOTE THAT THE \"TIME\n ENROUTE\" OPTION IS MEANT AS A GATE TO GATE TIME (AS INDICATED ON\n AN AIRLINE'S FLIGHT SCHEDULE, FOR EXAMPLE). IF A \"TIME ENROUTE\" OF\n 2:30 IS SELECTED, THE SYSTEM WILL SUBTRACT THE TAXI TIMES FROM\n THIS VALUE TO DETERMINE THE SCHEDULED AIR TIME. IT WILL THEN\n DETERMINE AND USE THE COST INDEX WHICH MATCHES THIS AIR TIME.</t>\n\n<b>SB003/13 </b>\n SUBJECT: FLIGHT RELEASE UNITS\n <t>ALL FLIGHT CREW: PLEASE PAY SPECIAL ATTENTION TO THE UNITS\n SELECTION WHEN GENERATING A FLIGHT PLAN. FAILURE TO IDENTIFY THE\n CORRECT UNITS WHEN REFUELING PRIOR TO FLIGHT CAN RESULT IN\n DEPARTING WITH INSUFFICIENT FUEL AND/OR AN ERRONEOUS PAYLOAD.</t>\n\n<b>=============\nCREW BULLETIN\n=============</b>\n\nNIL\n\n\n==================== END OF LIDO-NOTAM-BULLETIN ====================<h2 style=\"page-break-after: always;\"> </h2>Route\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_ROUTE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_ROUTE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>SigWx 1 of 1\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_SIGWX06.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_SIGWX06.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 1 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS14000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS14000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 2 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS18000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS18000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 3 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS24000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS24000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>Vertical profile\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_PROFILE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_PROFILE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a></pre></div>\n \n \n VMS\n 113\n B737\n OMDB\n OMAA\n 1388534400\n 43200\n 1800\n KUTL3F KUTLI EMERU EMER2D\n 7200\n 900\n \n \n \n auto\n OMDB\n \n NABEEL SHAHZAD\n 120867\n 1\n auto\n 0\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n AUTO\n lido\n 1\n 1\n 0\n 0\n 1\n 1\n 0\n 1\n \n \n \n \n \n \n \n \n \n false\n \n \n\n" + ofp_xml: "\n\n \n 19893491\n 120867\n 1585669695\n lido2\n 2001\n lbs\n \n \n 1\n VMS\n 113\n 0\n PLANNED OPTIMUM FLIGHT LEVEL\n \n 1\n CI5\n 250/280/78\n 78/280/250\n CI0\n RES\n 5\n 16000\n OMDB/0160\n 8\n 38512\n -6\n 278\n 028\n 63\n 105\n 108\n 2606\n 338\n .53\n 145\n KUTL3F KUTLI DCT EMERU EMER2D\n KUTLI3F KUTLI DCT EMERU EMERU2D\n KUTL3F KUTLI DCT EMERU EMER2D\n \n \n OMDB\n DXB\n \n 62\n 25.252778\n 55.364444\n DUBAI INTL\n 30L\n \n \n OMAA\n AUH\n \n 83\n 24.433056\n 54.651111\n ABU DHABI INTL\n 31L\n \n \n OMDB\n DXB\n \n 62\n 25.252778\n 55.364444\n DUBAI INTL\n 30L\n 18000\n 139\n 63\n 137\n 038\n 036\n 328\n 331\n P003\n 274\n 033\n 39100\n P07\n 2104\n 2906\n DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT\n DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT\n \n \n \n \n \n DB570\n DB570\n wpt\n \n 25.295528\n 55.294722\n CLB\n KUTL3F\n 1\n 5\n 304\n 302\n 302\n 300\n 9800\n 250\n 295\n 0.45\n 0.45\n -21\n 274\n 100\n 100\n 14149\n 407\n 407\n 7264\n 8602\n 4\n 9\n 282\n 23\n 0\n 34800\n 12\n 2100\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n DB575\n DB575\n wpt\n \n 25.227500\n 55.181111\n CLB\n KUTL3F\n 1\n 7\n 236\n 234\n 239\n 237\n 14200\n 280\n 354\n 0.55\n 0.55\n -26\n 328\n 140\n 240\n 14074\n 568\n 975\n 6696\n 8034\n -4\n 9\n 272\n 32\n 0\n 34800\n 12\n 2100\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n DB467\n DB467\n wpt\n \n 25.202222\n 55.091667\n CLB\n KUTL3F\n 1\n 5\n 252\n 250\n 254\n 252\n 15700\n 280\n 363\n 0.57\n 0.57\n -33\n 330\n 100\n 340\n 14023\n 406\n 1381\n 6290\n 7628\n -7\n 9\n 274\n 35\n 0\n 34800\n 12\n 2100\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n TOC\n TOP OF CLIMB\n ltlg\n \n 25.195879\n 55.074647\n CLB\n KUTL3F\n 1\n 1\n 247\n 245\n 250\n 248\n 16000\n 280\n 365\n 0.57\n 0.57\n -32\n 333\n 20\n 360\n 13999\n 81\n 1462\n 6209\n 7547\n -8\n 9\n 275\n 36\n 0\n 34800\n 12\n 2000\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n GINLA\n GINLA\n wpt\n \n 25.140833\n 54.927222\n CRZ\n KUTL3F\n 1\n 9\n 247\n 246\n 250\n 248\n 16000\n 259\n 338\n 0.53\n 0.532\n -32\n 306\n 106\n 466\n 4796\n 141\n 1603\n 6068\n 7406\n -8\n 9\n 275\n 36\n 0\n 34800\n 12\n 2000\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n XARTA\n XARTA\n wpt\n \n 25.025861\n 54.927222\n CRZ\n KUTL3F\n 1\n 7\n 180\n 178\n 186\n 184\n 16000\n 253\n 329\n 0.52\n 0.519\n 1\n 330\n 76\n 542\n 4669\n 99\n 1702\n 5969\n 7307\n -8\n 9\n 275\n 36\n 0\n 34800\n 12\n 2100\n OMAE\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n KUTLI\n KUTLI\n wpt\n \n 24.864250\n 54.938333\n CRZ\n KUTL3F\n 0\n 10\n 176\n 174\n 182\n 180\n 16000\n 252\n 328\n 0.52\n 0.517\n 4\n 332\n 108\n 651\n 4652\n 140\n 1842\n 5829\n 7167\n -8\n 9\n 275\n 36\n 0\n 34800\n 12\n 2100\n OMAE\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n TOD\n TOP OF DESCENT\n ltlg\n \n 24.824103\n 55.018735\n CRZ\n DCT\n 0\n 5\n 118\n 117\n 121\n 119\n 16000\n 246\n 321\n 0.51\n 0.506\n 33\n 354\n 51\n 702\n 4559\n 64\n 1906\n 5765\n 7103\n -8\n 9\n 275\n 36\n 0\n 34800\n 12\n 2300\n OMAE\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n EMERU\n EMERU\n wpt\n \n 24.808056\n 55.050833\n DSC\n DCT\n 0\n 2\n 118\n 117\n 120\n 118\n 15400\n 280\n 361\n 0.56\n 0.56\n 31\n 392\n 31\n 733\n 3026\n 18\n 1924\n 5747\n 7085\n -7\n 9\n 274\n 34\n 0\n 34800\n 12\n 2200\n OMAE\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n TUGVA\n TUGVA\n wpt\n \n 24.583889\n 54.904222\n DSC\n EMER2D\n 1\n 16\n 210\n 209\n 214\n 212\n 10700\n 280\n 334\n 0.51\n 0.51\n -9\n 325\n 249\n 982\n 3031\n 141\n 2065\n 5606\n 6944\n 2\n 8\n 280\n 25\n 0\n 34800\n 12\n 2300\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 293\n 19\n 20\n \n \n 5000\n 291\n 20\n 10\n \n \n 10000\n 282\n 24\n 4\n \n \n 14000\n 272\n 31\n -4\n \n \n 18000\n 275\n 39\n -14\n \n \n 24000\n 270\n 47\n -29\n \n \n 30000\n 266\n 49\n -45\n \n \n 34000\n 260\n 63\n -51\n \n \n 39000\n 255\n 79\n -52\n \n \n 45000\n 249\n 77\n -56\n \n \n \n \n \n TONKI\n TONKI\n wpt\n \n 24.445861\n 54.814222\n DSC\n EMER2D\n 1\n 10\n 210\n 209\n 214\n 212\n 7700\n 250\n 285\n 0.43\n 0.43\n -5\n 280\n 156\n 1137\n 3036\n 88\n 2153\n 5518\n 6856\n 8\n 8\n 288\n 19\n 0\n 51600\n 369\n 2300\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 316\n 16\n 22\n \n \n 5000\n 300\n 15\n 9\n \n \n 10000\n 269\n 21\n 4\n \n \n 14000\n 273\n 31\n -3\n \n \n 18000\n 271\n 40\n -13\n \n \n 24000\n 268\n 45\n -29\n \n \n 30000\n 256\n 60\n -43\n \n \n 34000\n 255\n 79\n -50\n \n \n 39000\n 258\n 98\n -52\n \n \n 45000\n 252\n 88\n -58\n \n \n \n \n \n LOXIX\n LOXIX\n wpt\n \n 24.354528\n 54.942417\n DSC\n EMER2D\n 1\n 9\n 128\n 126\n 128\n 126\n 5000\n 250\n 271\n 0.41\n 0.41\n 15\n 286\n 140\n 1277\n 3004\n 79\n 2232\n 5439\n 6777\n 9\n 4\n 300\n 15\n 0\n 51600\n 369\n 2400\n OMAE\n N,F\n 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000\n \n \n 0\n 316\n 16\n 22\n \n \n 5000\n 300\n 15\n 9\n \n \n 10000\n 269\n 21\n 4\n \n \n 14000\n 273\n 31\n -3\n \n \n 18000\n 271\n 40\n -13\n \n \n 24000\n 268\n 45\n -29\n \n \n 30000\n 256\n 60\n -43\n \n \n 34000\n 255\n 79\n -50\n \n \n 39000\n 258\n 98\n -52\n \n \n 45000\n 252\n 88\n -58\n \n \n \n \n \n OMAA\n ABU DHABI INTL\n apt\n \n 24.433056\n 54.651111\n DSC\n EMER2D\n 1\n 19\n 286\n 285\n 288\n 286\n 2600\n 250\n 262\n 0.39\n 0.39\n -15\n 247\n 475\n 1753\n 3014\n 374\n 2606\n 5065\n 6403\n 15\n 5\n 313\n 17\n 1\n 51600\n 369\n 2300\n OMAE\n N,F\n 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000\n \n \n 0\n 316\n 16\n 22\n \n \n 5000\n 300\n 15\n 9\n \n \n 10000\n 269\n 21\n 4\n \n \n 14000\n 273\n 31\n -3\n \n \n 18000\n 271\n 40\n -13\n \n \n 24000\n 268\n 45\n -29\n \n \n 30000\n 256\n 60\n -43\n \n \n 34000\n 255\n 79\n -50\n \n \n 39000\n 258\n 98\n -52\n \n \n 45000\n 252\n 88\n -58\n \n \n \n \n \n \n \n (FPL-VMS113-IS\n-B737/M-SDE2E3FGHIRWXY/LB1\n-OMDB1230\n-N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n-OMAA0029 OMDB\n-PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS)\n N0338F160 KUTL3F KUTLI DCT EMERU EMER2D\n N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n VMS113\n 0338\n N\n 160\n F\n PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS\n OMAE\n OMAE\n OMAE\n \n \n \n \n B737\n 73G\n B737-700\n N714SB\n 714\n \n M-SDE2E3FGHIRWXY/LB1\n 149\n 1\n \n \n 250\n 2606\n 1338\n 2906\n 2159\n 0\n 0\n 9009\n 9009\n 9259\n 6653\n 5353\n 46100\n \n \n 1753\n 7140\n 1388579400\n 1388580000\n 1388587140\n 1388587500\n 8100\n 1388579400\n 1388580000\n 1388581753\n 1388582113\n 2713\n 4\n 4\n 600\n 360\n 1800\n 6907\n 900\n 0\n 0\n \n \n 84119\n 145\n 230\n 200\n 33550\n 117669\n 121700\n 126678\n 131806\n 154500\n L\n 124072\n 129200\n 126928\n \n \n \n 1829\n 77\n 2698\n 92\n 9341\n 100\n 294\n 0.45\n 5\n \n \n 1775\n 22\n 2634\n 28\n 9285\n 120\n 315\n 0.49\n 5\n \n \n 1761\n 8\n 2639\n 33\n 9303\n 140\n 327\n 0.51\n 5\n \n \n \n \n \n 1671\n -81\n 2672\n 66\n 9426\n 160\n 432\n 0.68\n 100\n \n \n 1763\n 11\n 2605\n -1\n 9250\n 160\n 328\n 0.52\n 0\n \n \n 1758\n 6\n 2633\n 27\n 9296\n 140\n 328\n 0.51\n 5\n \n \n 1763\n 10\n 2624\n 18\n 9279\n 140\n 325\n 0.51\n 5\n \n \n \n 120867\n NABEEL SHAHZAD\n RAMON HERMAN\n GENEVA CROSS\n GERARD HAMMOND\n JOANNA COHEN\n DARRIN SHAW\n JACQUELINE KELLY\n \n \n \n M\n KNSF\n V0090/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101229\n 202004230001\n 202002101229\n V0090/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101229 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n VOR RWY 31L; MINIMA TO READÂ\NS-31L* CAT AB 520-750M 437 (500-750M).\n CIRCLING CAT AB 800-1600M 717 (800-1600M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED VOR RWY 31L; MINIMA TO READ S-31L* CAT AB 520-750M 437 (500-750M). CIRCLING CAT AB 800-1600M 717 (800-1600M). 10 FEB 12:29 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:29 2020\n NOTAMN\n QPICH\n \n \n M\n KNSF\n V0089/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101228\n 202004230001\n 202002101228\n V0089/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101228 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n VOR RWY 13R; MINIMA TO READÂ\NS-13R* CAT AB 540-1200M 462\n (500-1200M), CAT CD 540-1500M 462 (500-1500M). *WHEN ALS INOP,\n INCREASE CAT CD VIS TO 2200M. CIRCLING CAT AB 800-1900M 717\n (800-1900M), CAT C 900-4000M 817 (900-4000M), CAT D 900-4400M 817\n (900-4400M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED VOR RWY 13R; MINIMA TO READ S-13R* CAT AB 540-1200M 462 (500-1200M), CAT CD 540-1500M 462 (500-1500M). *WHEN ALS INOP, INCREASE CAT CD VIS TO 2200M. CIRCLING CAT AB 800-1900M 717 (800-1900M), CAT C 900-4000M 817 (900-4000M), CAT D 900-4400M 817 (900-4400M). 10 FEB 12:28 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:28 2020\n NOTAMN\n QPICH\n \n \n M\n KNSF\n V0088/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101226\n 202004230001\n 202002101226\n V0088/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101226 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n ILS RWY 31R; MINIMA TO READÂ\NS-LOC 31R* CAT ABCD 750-2400M 678\n (700-2400M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 3100M. CIRCLING\n 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 31R; MINIMA TO READ S-LOC 31R* CAT ABCD 750-2400M 678 (700-2400M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 3100M. CIRCLING 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M). 10 FEB 12:26 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:26 2020\n NOTAMN\n QPICH\n \n \n M\n KNSF\n V0087/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101224\n 202004230001\n 202002101225\n V0087/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101224 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n ILS RWY 31L; MA CG REQUIRED TO CROSS VEDEX AT 4000 IS 247 FPNM OR\n 4.05%. MINIMA TO READÂ\NS-ILS 31L* CAT AB 350-800M 267 (300-800M),\n CAT CD 369-800M 286 (300-800M). *WHEN ALS INOP, INCREASE CAT AB VIS\n TO 1300M, CAT CD VIS TO 1400M. S-LOC 31L** CAT ABCD 480-1100M 397\n (400-1100M). **WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1800M.\n CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 880-3600M 797\n (800-3600M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 31L; MA CG REQUIRED TO CROSS VEDEX AT 4000 IS 247 FPNM OR 4.05%. MINIMA TO READ S-ILS 31L* CAT AB 350-800M 267 (300-800M), CAT CD 369-800M 286 (300-800M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 1300M, CAT CD VIS TO 1400M. S-LOC 31L** CAT ABCD 480-1100M 397 (400-1100M). **WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1800M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M). 10 FEB 12:24 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:25 2020\n NOTAMN\n QPICH\n \n \n M\n KNSF\n V0086/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101221\n 202004230001\n 202002101222\n V0086/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101221 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n ILS RWY 13R; MINIMA TO READÂ\NS-ILS 13R* CAT AB 288-800M 210\n (300-800M), CAT CD 309-800M 231 (300-800M). *WHEN ALS INOP,\n INCREASE CAT ABCD VIS TO 1200M. S-LOC 13R** CAT ABC 510-1300M 427\n (500-1300M). **WHEN ALS INOP, INCREASE CAT ABC VIS TO 2000M.\n CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT C 880-3600M 797\n (800-3600M), CAT D 970-3800M 827 (900-3800M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 13R; MINIMA TO READ S-ILS 13R* CAT AB 288-800M 210 (300-800M), CAT CD 309-800M 231 (300-800M). *WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1200M. S-LOC 13R** CAT ABC 510-1300M 427 (500-1300M). **WHEN ALS INOP, INCREASE CAT ABC VIS TO 2000M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT C 880-3600M 797 (800-3600M), CAT D 970-3800M 827 (900-3800M). 10 FEB 12:21 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:22 2020\n NOTAMN\n QPICH\n \n \n M\n KNSF\n V0085/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002101213\n 202004230001\n 202002101214\n V0085/20 NOTAMN\nQ) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101213 C) 2004230001\nE) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED\n ILS RWY 13L; MINIMA TO READÂ\NS-ILS 13L* CAT AB 375-800M 313\n (300-800M), CAT CD 395-800M 333 (400-800M). *WHEN ALS INOP,\n INCREASE CAT AB VIS TO 1500M AND CAT CD VIS TO 1700M. S-LOC 13L**\n CAT AB 570-1600M 506 (500-1600M). WHEN ALS INOP, INCREASE CAT AB\n VIS TO 2400M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD\n 890-3600M 797 (800-3600M).\n [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 13L; MINIMA TO READ S-ILS 13L* CAT AB 375-800M 313 (300-800M), CAT CD 395-800M 333 (400-800M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 1500M AND CAT CD VIS TO 1700M. S-LOC 13L** CAT AB 570-1600M 506 (500-1600M). WHEN ALS INOP, INCREASE CAT AB VIS TO 2400M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 890-3600M 797 (800-3600M). 10 FEB 12:13 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:13 2020\n NOTAMN\n QPICH\n \n \n I\n OMAEYNYX\n A0799/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003310300\n 202004101400\n 202003301615\n A0799/20 NOTAMN\nQ) OMAE/QOBCE/IV/M/AE/000/001/2426N05439E001\nA) OMAA B) 2003310300 C) 2004101400\nD) DLY BTN 0300-1400\nE) OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING:\n242636.62N 0543958.28E\n242630.00N 0544007.42E\n242634.26N 0543956.35E\n242627.55N 0544005.24E\n242636.62N 0543958.28E\nF) SFC G) 036FT AGL\n OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING: 242636.62N 0543958.28E 242630.00N 0544007.42E 242634.26N 0543956.35E 242627.55N 0544005.24E 242636.62N 0543958.28E. SFC - 036FT AGL, DLY BTN 0300-1400, 31 MAR 03:00 2020 UNTIL 10 APR 14:00 2020. CREATED: 30 MAR 16:15 2020\n NOTAMN\n QOBCE\n \n \n I\n OMAEYNYX\n A0798/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003310300\n 202004051400\n 202003301506\n A0798/20 NOTAMN\nQ) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005\nA) OMAA B) 2003310300 C) 2004051400\nD) DLY BTN 0300-1400\nE) TWY A BTN TWY A14 AND TWY G INCLUDING INT OF TWY A14 AND TWY A CLSD\nDUE WIP.\nINT TWY A17 AND TWY A CLSD DUE WIP.\nTWY B BTN TWY A18 AND TWY G CLSD DUE WIP.\n TWY A BTN TWY A14 AND TWY G INCLUDING INT OF TWY A14 AND TWY A CLSD DUE WIP. INT TWY A17 AND TWY A CLSD DUE WIP. TWY B BTN TWY A18 AND TWY G CLSD DUE WIP. DLY BTN 0300-1400, 31 MAR 03:00 2020 UNTIL 05 APR 14:00 2020. CREATED: 30 MAR 15:06 2020\n NOTAMN\n QMXLC\n \n \n I\n OMAEYNYX\n A0797/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003310300\n 202004051400\n 202003301450\n A0797/20 NOTAMN\nQ) OMAE/QMRLC/IV/NBO/A/000/999/2426N05439E005\nA) OMAA B) 2003310300 C) 2004051400\nD) DLY BTN 0300-1400\nE) RWY 13L/31R CLSD DUE WIP.\n RWY 13L/31R CLSD DUE WIP. DLY BTN 0300-1400, 31 MAR 03:00 2020 UNTIL 05 APR 14:00 2020. CREATED: 30 MAR 14:49 2020\n NOTAMN\n QMRLC\n \n \n I\n OMAEYNYX\n A0796/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003310300\n 202004101400\n 202003301440\n A0796/20 NOTAMN\nQ) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005\nA) OMAA B) 2003310300 C) 2004101400\nD) H24\nE) TWY A BTN TWY A14 AND TWY A17 INCLUDING INT WITH TWY A16 AND TWY\nB15 CLSD.\n TWY A BTN TWY A14 AND TWY A17 INCLUDING INT WITH TWY A16 AND TWY B15 CLSD. H24, 31 MAR 03:00 2020 UNTIL 10 APR 14:00 2020. CREATED: 30 MAR 14:40 2020\n NOTAMN\n QMXLC\n \n \n I\n OMAEYNYX\n A0738/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003250450\n 202004072359\n 202003250450\n A0738/20 NOTAMN\nQ) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005\nA) OMAA B) 2003250450 C) 2004072359\nD) H24\nE) TWY C AND TWY N CLSD.\n TWY C AND TWY N CLSD. H24, 25 MAR 04:50 2020 UNTIL 07 APR 23:59 2020. CREATED: 25 MAR 04:50 2020\n NOTAMN\n QMXLC\n \n \n I\n OMAEYNYX\n A0737/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003250300\n 202004301400\n 202003241615\n A0737/20 NOTAMN\nQ) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005\nA) OMAA B) 2003250300 C) 2004301400\nD) H24\nE) SECN OF TWY B BTN TWY B9 AND TWY G CLSD DUE WIP.\n SECN OF TWY B BTN TWY B9 AND TWY G CLSD DUE WIP. H24, 25 MAR 03:00 2020 UNTIL 30 APR 14:00 2020. CREATED: 24 MAR 16:15 2020\n NOTAMN\n QMXLC\n \n \n I\n OMAEYNYX\n A0408/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002190130\n 202005191530\n 202002182001\n A0408/20 NOTAMN\nQ) OMAE/QMGXX/IV/B/A/000/999/2426N05439E005\nA) OMAA B) 2002190130 C) 2005191530\nD) DLY BTN 0130-0300 AND 1430-1530\nE) IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM,\nATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE\nTIMES IN CAT I COND. ATC WILL CONT TO ISSUE STANDARD TWY ROUTINGS\nBY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT\nROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND THEREFORE\nSHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS A\nDISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT SHALL\nCTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD PSN\nWHEN SAFE TO DO SO.\n IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM, ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE TIMES IN CAT I COND. ATC WILL CONT TO ISSUE STANDARD TWY ROUTINGS BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND THEREFORE SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS A DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT SHALL CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD PSN WHEN SAFE TO DO SO. DLY BTN 0130-0300 AND 1430-1530, 19 FEB 01:30 2020 UNTIL 19 MAY 15:30 2020. CREATED: 18 FEB 20:01 2020\n NOTAMN\n QMGXX\n \n \n I\n OMAEYNYX\n A0401/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202002250200\n 202004201600\n 202002181239\n A0401/20 NOTAMN\nQ) OMAE/QOBCE/IV/M/AE/000/004/2427N05436E001\nA) OMAA B) 2002250200 C) 2004201600\nD) DLY BTN 0200-1600\nE) OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN\n242742.38N 0543602.65E\nF) SFC G) 338FT AGL\n OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN 242742.38N 0543602.65E. SFC - 338FT AGL, DLY BTN 0200-1600, 25 FEB 02:00 2020 UNTIL 20 APR 16:00 2020. CREATED: 18 FEB 12:39 2020\n NOTAMN\n QOBCE\n \n \n I\n OMAEYNYX\n A0299/20\n 1\n OMAA\n OMAA\n ABU DHABI INTL\n 1\n 202003260000\n 202004092359\n 202002050750\n A0299/20 NOTAMN\nQ) OMAE/QFATT/IV/BO/A/000/999/2426N05439E005\nA) OMAA B) 2003260000 C) 2004092359\nE) TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020\nSURVEILLANCE SER BASED ON MODE S MULTILATERATION PROC ADDED\nMISSED APCH ALT AMD\nCHART REF FOR RVR LCA AMD.\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020 SURVEILLANCE SER BASED ON MODE S MULTILATERATION PROC ADDED MISSED APCH ALT AMD CHART REF FOR RVR LCA AMD. 26 MAR 00:00 2020 UNTIL 09 APR 23:59 2020. CREATED: 05 FEB 07:50 2020\n NOTAMN\n QFATT\n \n \n I\n OMAEYNYX\n A0817/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003310210\n 202004300800\n 202003310211\n A0817/20 NOTAMR A0686/20\nQ) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005\nA) OMDB B) 2003310210 C) 2004300800\nD) H24\nE) SECN OF TXL J BEHIND STANDS D1 TO D3 CLSD.\n SECN OF TXL J BEHIND STANDS D1 TO D3 CLSD. H24, 31 MAR 02:10 2020 UNTIL 30 APR 08:00 2020. CREATED: 31 MAR 02:10 2020\n NOTAMR\n QMXLC\n \n \n I\n OMAEYNYX\n A0808/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003310036\n 202004020800\n 202003310036\n A0808/20 NOTAMR A0767/20\nQ) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005\nA) OMDB B) 2003310036 C) 2004020800\nD) H24\nE) SECN OF TXL P BTN ACFT STANDS E14 AND E18 AND ASSOCIATED TWY P3\nLINK CLSD.\n SECN OF TXL P BTN ACFT STANDS E14 AND E18 AND ASSOCIATED TWY P3 LINK CLSD. H24, 31 MAR 00:36 2020 UNTIL 02 APR 08:00 2020. CREATED: 31 MAR 00:36 2020\n NOTAMR\n QMXLC\n \n \n I\n OMAEYNYX\n A0802/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003310800\n 202004130800\n 202003310010\n A0802/20 NOTAMN\nQ) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005\nA) OMDB B) 2003310800 C) 2004130800\nD) H24\nE) SECN OF TXL T BTN TXL S AND TWY M CLSD.\nSECN OF TWY M BTN TWY M20 AND TWY M21 CLSD.\nTWY M21 AND ASSOCIATED LINKS CLSD.\n SECN OF TXL T BTN TXL S AND TWY M CLSD. SECN OF TWY M BTN TWY M20 AND TWY M21 CLSD. TWY M21 AND ASSOCIATED LINKS CLSD. H24, 31 MAR 08:00 2020 UNTIL 13 APR 08:00 2020. CREATED: 31 MAR 00:10 2020\n NOTAMN\n QMXLC\n \n \n I\n OMAEYNYX\n A0769/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003290200\n 202004290200\n 202003281522\n A0769/20 NOTAMN\nQ) OMAE/QFFCG/IV/NBO/A/000/999/2515N05522E005\nA) OMDB B) 2003290200 C) 2004290200\nD) H24\nE) RFFS CAT DOWNGRADED TO CAT 7.\nCAT 8, CAT 9 AND CAT 10 AVBL WITH 20 MIN PN.\n RFFS CAT DOWNGRADED TO CAT 7. CAT 8, CAT 9 AND CAT 10 AVBL WITH 20 MIN PN. H24, 29 MAR 02:00 2020 UNTIL 29 APR 02:00 2020. CREATED: 28 MAR 15:22 2020\n NOTAMN\n QFFCG\n \n \n I\n OMAEYNYX\n A0766/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003281125\n 202004300800\n 202003281125\n A0766/20 NOTAMR A0580/20\nQ) OMAE/QMXXX/IV/M/A/000/999/2515N05522E005\nA) OMDB B) 2003281125 C) 2004300800\nD) H24\nE) TWY Z8 AND TWY Z9 NOT AVBL.\n TWY Z8 AND TWY Z9 NOT AVBL. H24, 28 MAR 11:25 2020 UNTIL 30 APR 08:00 2020. CREATED: 28 MAR 11:25 2020\n NOTAMR\n QMXXX\n \n \n I\n OMAEYNYX\n A0754/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003270200\n 202004171400\n 202003261220\n A0754/20 NOTAMN\nQ) OMAE/QWULW/IV/BO/AW/000/002/2517N05517E005\nA) OMDB B) 2003270200 C) 2004171400\nD) HJ\nE) UAS ACT WILL TAKE PLACE WI AREA BOUNDED BY LINES JOINING:\n251806.38N 0551940.66E\n251636.78N 0551741.26E\n251730.33N 0551711.46E\n251809.04N 0551741.28E\n251815.30N 0551851.37E\nF) SFC G) 200FT AGL\n UAS ACT WILL TAKE PLACE WI AREA BOUNDED BY LINES JOINING: 251806.38N 0551940.66E 251636.78N 0551741.26E 251730.33N 0551711.46E 251809.04N 0551741.28E 251815.30N 0551851.37E. SFC - 200FT AGL, HJ, 27 MAR 02:00 2020 UNTIL 17 APR 14:00 2020. CREATED: 26 MAR 12:20 2020\n NOTAMN\n QWULW\n \n \n I\n OMAEYNYX\n A0752/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003261400\n 202004021059\n 202003261138\n A0752/20 NOTAMN\nQ) OMAE/QMRLC/IV/NBO/A/000/999/2515N05522E005\nA) OMDB B) 2003261400 C) 2004021059\nD) H24\nE) RWY 12L/30R CLSD\n RWY 12L/30R CLSD. H24, 26 MAR 14:00 2020 UNTIL 02 APR 10:59 2020. CREATED: 26 MAR 11:38 2020\n NOTAMN\n QMRLC\n \n \n I\n OMAEYNYX\n A0689/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003220701\n 202005212359\n 202003220702\n A0689/20 NOTAMR A2797/19\nQ) OMAE/QOBCE/IV/M/AE/000/003/2515N05520E005\nA) OMDB B) 2003220701 C) 2005212359\nD) H24\nE) OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E\nARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT\nF) SFC G) 289FT AMSL\n OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT. SFC - 289FT AMSL, H24, 22 MAR 07:01 2020 UNTIL 21 MAY 23:59 2020. CREATED: 22 MAR 07:02 2020\n NOTAMR\n QOBCE\n \n \n I\n OMAEYNYX\n A0535/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003180800\n 202005071400\n 202003021049\n A0535/20 NOTAMN\nQ) OMAE/QMXXX/IV/M/A/000/999/2515N05522E005\nA) OMDB B) 2003180800 C) 2005071400\nD) H24\nE) TWY K13 CLSD\nTWY K13 LINK TO TWY K EASTBOUND CLSD\nTWY K13 LINK TO TWY K WESTBOUND CLSD\nTWY K13 LINK TO TWY J5 CLSD\nTWY K CL TO OBJECT CLR REDUCED TO 47.5M ABEAM TWY K13\n TWY K13 CLSD TWY K13 LINK TO TWY K EASTBOUND CLSD TWY K13 LINK TO TWY K WESTBOUND CLSD TWY K13 LINK TO TWY J5 CLSD TWY K CL TO OBJECT CLR REDUCED TO 47.5M ABEAM TWY K13. H24, 18 MAR 08:00 2020 UNTIL 07 MAY 14:00 2020. CREATED: 02 MAR 10:49 2020\n NOTAMN\n QMXXX\n \n \n I\n OMAEYNYX\n A0469/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202002240909\n 202005240559\n 202002240910\n A0469/20 NOTAMN\nQ) OMAE/QOBCE/IV/M/AE/000/012/2512N05520E001\nA) OMDB B) 2002240909 C) 2005240559\nD) H24\nE) OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E\nOMDB ARP BRG 201 DEG MAG DIST 5230M.\nCRANE LGT AT NGT.\nF) SFC G) 1109FT AMSL\n OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E OMDB ARP BRG 201 DEG MAG DIST 5230M. CRANE LGT AT NGT. SFC - 1109FT AMSL, H24, 24 FEB 09:09 2020 UNTIL 24 MAY 05:59 2020. CREATED: 24 FEB 09:09 2020\n NOTAMN\n QOBCE\n \n \n I\n OMAEYNYX\n A0302/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202003260000\n 202004092359\n 202002050750\n A0302/20 NOTAMN\nQ) OMAE/QMXTT/IV/BO/A/000/999/2515N05522E005\nA) OMDB B) 2003260000 C) 2004092359\nE) TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020\nTWY DETAILS AMD\nVFR CHARTS AMD\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020 TWY DETAILS AMD VFR CHARTS AMD. 26 MAR 00:00 2020 UNTIL 09 APR 23:59 2020. CREATED: 05 FEB 07:50 2020\n NOTAMN\n QMXTT\n \n \n I\n OMAEYNYX\n A0275/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202002031000\n 202002030943\n A0275/20 NOTAMN\nQ) OMAE/QPDAW/I/NBO/A/000/999/2515N05522E005\nA) OMDB B) 2002031000 C) PERM\nE) SID ITOTU 1F RWY 30L/R WITHDRAWN\nREF UAE AIP CHART OMDB AD 2-42.\n SID ITOTU 1F RWY 30L/R WITHDRAWN REF UAE AIP CHART OMDB AD 2-42. 03 FEB 10:00 2020 UNTIL PERM. CREATED: 03 FEB 09:43 2020\n NOTAMN\n QPDAW\n \n \n I\n OMAEYNYX\n A0264/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202002020527\n 202004020700\n 202002020527\n A0264/20 NOTAMR A2125/19\nQ) OMAE/QFAXX/IV/NBO/AW/005/015/2515N05522E005\nA) OMDB B) 2002020527 C) 2004020700\nD) DLY BTN 0300-0700\nE) PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO\nSOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC.\nF) 500FT AGL G) 1500FT AGL\n PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC. 500FT AGL - 1500FT AGL, DLY BTN 0300-0700, 02 FEB 05:27 2020 UNTIL 02 APR 07:00 2020. CREATED: 02 FEB 05:27 2020\n NOTAMR\n QFAXX\n \n \n I\n OMAEYNYX\n A0171/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202001211145\n 202004210559\n 202001211145\n A0171/20 NOTAMR A2077/19\nQ) OMAE/QOBCE/IV/M/AE/000/007/2510N05518E001\nA) OMDB B) 2001211145 C) 2004210559\nD) H24\nE) OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E\nARP BRG 212 DEG MAG DIST 9.93KM.\nCRANE LGT AT NGT.\n\nF) SFC G) 679FT AMSL\n OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E ARP BRG 212 DEG MAG DIST 9.93KM. CRANE LGT AT NGT. SFC - 679FT AMSL, H24, 21 JAN 11:45 2020 UNTIL 21 APR 05:59 2020. CREATED: 21 JAN 11:45 2020\n NOTAMR\n QOBCE\n \n \n I\n OMAEYNYX\n A0149/20\n 1\n OMDB\n OMDB\n DUBAI INTL\n 1\n 202001210600\n 202004210559\n 202001210534\n A0149/20 NOTAMN\nQ) OMAE/QOBCE/IV/M/AE/000/011/2512N05520E005\nA) OMDB B) 2001210600 C) 2004210559\nD) H24\nE) OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E\nARP BRG 202 DEG MAG DIST 5.5KM\nCRANE LIT AT NGT.\nF) SFC G) 1004FT AMSL\n OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E ARP BRG 202 DEG MAG DIST 5.5KM CRANE LIT AT NGT. SFC - 1004FT AMSL, H24, 21 JAN 06:00 2020 UNTIL 21 APR 05:59 2020. CREATED: 21 JAN 05:34 2020\n NOTAMN\n QOBCE\n \n 30\n \n \n OMDB 311500Z 28009KT CAVOK 24/16 Q1013 NOSIG\n OMDB 311101Z 3112/0118 28014KT CAVOK\nBECMG 3116/3118 20007KT\nBECMG 0108/0110 30012KT\nBECMG 0116/0118 21007KT\n OMAA 311500Z 32011KT CAVOK 24/16 Q1013 NOSIG\n OMAA 311100Z 3112/0118 30014KT CAVOK\nBECMG 3118/3120 23006KT\nPROB30 0101/0104 3500 HZ\nBECMG 0107/0109 30012KT\nBECMG 0117/0118 VRB02KT\n OMDB 311500Z 28009KT CAVOK 24/16 Q1013 NOSIG\n OMDB 311101Z 3112/0118 28014KT CAVOK\nBECMG 3116/3118 20007KT\nBECMG 0108/0110 30012KT\nBECMG 0116/0118 21007KT\n \n \n \n \n \n \n \n \n \n \n <div style=\"line-height:14px;font-size:13px\"><pre><!--BKMK///OFP///0--><!--BKMK///Summary and Fuel///1--><b>[ OFP ]\n--------------------------------------------------------------------</b>\nVMS0113 01JAN2014 OMDB-OMAA B737 N714SB RELEASE 1548 31MAR20\nOFP 1 DUBAI INTL-ABU DHABI INTL\n WX PROG 0112 0115 OBS 2412 2412\n\t\n ATC C/S VMS113 OMDB/DXB OMAA/AUH CRZ SYS CI 5\n01JAN2014 N714SB 1230/1240 1309/1315 GND DIST 105\nB737-700 / CFM56-7B24 STA 1445 AIR DIST 108\n CTOT:.... G/C DIST 63\n AVG WIND 278/028\nMAXIMUM TOW 154500 LAW 129200 ZFW 121700 AVG W/C M006\nESTIMATED TOW 126678 LAW 124072 ZFW 117669 AVG ISA P008\n AVG FF LBS/HR 5353\n FUEL BIAS P00.0\nALTN OMDB TKOF ALTN .......\nFL STEPS OMDB/0160/\n--------------------------------------------------------------------\nDISP RMKS PLANNED OPTIMUM FLIGHT LEVEL\n\n--------------------------------------------------------------------\n PLANNED FUEL\n---------------------------------\nFUEL ARPT FUEL TIME\n---------------------------------\nTRIP AUH 2606 0029\nCONT 15 MIN 1338 0015\nALTN DXB 2906 0035\nFINRES 2159 0030\n---------------------------------\nMINIMUM T/OFF FUEL 9009 0149\n---------------------------------\nEXTRA 0 0000\n---------------------------------\nT/OFF FUEL 9009 0149\nTAXI DXB 250 0010\n---------------------------------\nBLOCK FUEL DXB 9259\nPIC EXTRA .....\nTOTAL FUEL .....\nREASON FOR PIC EXTRA ............\n--------------------------------------------------------------------\nNO TANKERING RECOMMENDED (P)\n--------------------------------------------------------------------\nI HEREWITH CONFIRM THAT I HAVE PERFORMED A THOROUGH SELF BRIEFING\nABOUT THE DESTINATION AND ALTERNATE AIRPORTS OF THIS FLIGHT \nINCLUDING THE APPLICABLE INSTRUMENT APPROACH PROCEDURES, AIRPORT \nFACILITIES, NOTAMS AND ALL OTHER RELEVANT PARTICULAR INFORMATION.\n\nDISPATCHER: GENEVA CROSS PIC NAME: SHAHZAD, NABEEL\n\nTEL: +1 800 555 0199 PIC SIGNATURE: ...............<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Routing and Impacts///1-->\nALTERNATE ROUTE TO: FINRES 2159\nAPT TRK DST VIA FL WC TIME FUEL\n--------------------------------------------------------------------\nOMDB/30L 038 139 DCT BOMUP DCT LOVIM DCT RESIG 180 P003 0035 2906\n DCT NODVI DCT OBMUK DCT LORID \n DCT ORGUR DCT PEBUS DCT EMOPO \n DCT LOTUK DCT LAGTA DCT LOVOL \n DCT \n--------------------------------------------------------------------\n\nMEL/CDL ITEMS DESCRIPTION\n------------- -----------\n\n--------------------------------------------------------------------\n\nROUTING:\n\nROUTE ID: DEFRTE\nOMDB/30L KUTLI3F KUTLI DCT EMERU EMERU2D OMAA/31L\n\n--------------------------------------------------------------------\nDEPARTURE ATC CLEARANCE:\n.\n.\n.\n--------------------------------------------------------------------\n OPERATIONAL IMPACTS\n -------------------\nWEIGHT CHANGE UP 1.0 TRIP P 0027 LBS TIME P 0000\nWEIGHT CHANGE DN 1.0 TRIP P 0018 LBS TIME P 0000\nFL CHANGE UP FL1 NOT AVAILABLE\nFL CHANGE DN FL1 TRIP P 0033 LBS TIME P 0000\nFL CHANGE DN FL2 TRIP P 0028 LBS TIME P 0000\nSPD CHANGE CI 0 TRIP M 0001 LBS TIME P 0000\nSPD CHANGE CI 100 TRIP P 0066 LBS TIME M 0001\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Times and Weights///1-->--------------------------------------------------------------------\nATIS:\n.\n.\n--------- --------- --------- --------- --------- --------- --------\nRVSM: ALT SYS LEFT: STBY: RIGHT:\n\n--------- --------- --------- --------- --------- --------- --------\n--------------------------------------------------------------------\n TIMES\n -----\n\t\t\t\t \n ESTIMATED SKED ACTUAL\n\nOUT 1230Z/1630L 1230Z/1630L ......Z\n\nOFF 1240Z/1640L 1240Z/1640L ......Z\n\nON 1309Z/1709L 1439Z/1839L ......Z\n\nIN 1315Z/1715L 1445Z/1845L ......Z\n\nBLOCK TIME 0045 0215 ......\n\n--------------------------------------------------------------------\n WEIGHTS\n -------\n\n EST MAX ACTUAL\n\nPAX 145 ......\n\nCARGO 0.2 ......\n\nPAYLOAD 33.6 ......\n\nZFW 117.7 121.7 ......\n\nFUEL 9.3 14.4 ...... POSS EXTRA 5.1\n\nTOW 126.7 131.8 LDG......\n\nSTAB TRIM ......\n\nLAW 124.1 129.2 ......\n\n--------------------------------------------------------------------\n TERRAIN CLEARANCE CHECK\n -----------------------\nDD CHECK - TERRAIN CLEARANCE CHECK DISABLED\n\nDP CHECK - TERRAIN CLEARANCE CHECK DISABLED\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Flight Log///1--> FLIGHT LOG \n ---------- \n\nMOST CRITICAL MORA 02400 FEET AT TONKI///MXSHR 02 AT TOC\n--------------------------------------------------------------------\nAWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\n 302 9.0 0.3\nDUBAI INTL N2515.2 ... 21 304 M021 \nOMDB E05521.9 0000 ... 105 274 .... ....\n\nKUTLI3F 098 234 .45 282/023 04 8.6 0.7\nDB570 N2517.7 0001 ... 21 236 M021 P09\nDB570 E05517.7 0001 ... 5 100 274 348 .... ....\n\nKUTLI3F 142 250 .55 272/032 M04 8.0 1.2\nDB575 N2513.7 0003 ... 21 252 M026 P09\nDB575 E05510.9 0004 ... 7 93 328 348 .... ....\n\nKUTLI3F 157 245 .57 274/035 M07 7.6 1.6\nDB467 N2512.1 0001 ... 20 247 M033 P09\nDB467 E05505.5 0005 ... 5 88 330 348 .... ....\n\nKUTLI3F 160 246 .57 275/036 M08 7.5 1.7\nT O C N2511.8 0001 ... 20 247 365 M032 P09\n E05504.5 0006 ... 1 87 333 2 348 .... ....\n\nKUTLI3F 160 178 .53 275/036 M08 7.4 1.9\nGINLA N2508.4 0001 ... 21 180 338 M032 P09\nGINLA E05455.6 0007 ... 9 78 306 2 348 .... ....\n\nKUTLI3F 160 174 .52 275/036 M08 7.3 2.0\nXARTA N2501.6 0002 ... 21 176 329 P001 P09\nXARTA E05455.6 0009 ... 7 71 330 2 348 .... ....\n\nKUTLI3F 160 117 .52 275/036 M08 7.2 2.1\nKUTLI N2451.9 0001 ... 23 118 328 P004 P09\nKUTLI E05456.3 0010 ... 10 61 332 2 348 .... ....\n\nDCT 160 117 .51 275/036 M08 7.1 2.2\nT O D N2449.4 0001 ... 22 118 321 P033 P09\n E05501.1 0011 ... 5 56 354 2 348 .... ....\n\nDCT 154 209 .56 274/034 M07 7.1 2.2\nEMERU N2448.5 0001 ... 23 210 P031 P09\nEMERU E05503.0 0012 ... 2 54 392 348 .... ....\n\nEMERU2D 107 209 .51 280/025 02 6.9 2.3\nTUGVA N2435.0 0004 ... 23 210 M009 P08\nTUGVA E05454.3 0016 ... 16 38 325 348 .... ....\n\nEMERU2D 077 126 .43 288/019 08 6.9 2.4\nTONKI N2426.8 0002 ... 24 128 M005 P08\nTONKI E05448.9 0018 ... 10 28 280 516 .... ....\n\n<h2 style=\"page-break-after: always;\"> </h2>AWY FL IMT MN WIND OAT EFOB PBRN\nPOSITION LAT EET ETO MORA ITT TAS COMP TDV\nIDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN\nFREQ\n--------------------------------------------------------------------\nEMERU2D 050 285 .41 300/015 09 6.8 2.5\nLOXIX N2421.3 0003 ... 23 286 P015 P04\nLOXIX E05456.5 0021 ... 9 19 286 516 .... ....\n\nEMERU2D 6.4 2.9\nABU DHABI I N2426.0 0008 ... \nOMAA E05439.1 0029 ... 19 .... ....\n\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Wind Information///1-->--------------------------------------------------------------------\n WIND INFORMATION \n ---------------- \n\nCLIMB T O C GINLA XARTA\n350 259/067 -51 200 273/042 -19 200 273/042 -19 200 273/042 -19\n310 264/052 -47 180 275/039 -14 180 275/039 -14 180 275/039 -14\n200 273/042 -19 160 275/036 -08 160 275/036 -08 160 275/036 -08\n150 273/033 -06 140 272/031 -04 140 272/031 -04 140 272/031 -04\n100 282/024 +04 120 276/027 +00 120 276/027 +00 120 276/027 +00\n\nKUTLI T O D DESCENT\n200 273/042 -19 200 273/042 -19 350 256/083 -50\n180 275/039 -14 180 275/039 -14 310 256/065 -45\n160 275/036 -08 160 275/036 -08 200 269/044 -18\n140 272/031 -04 140 272/031 -04 150 275/033 -06\n120 276/027 +00 120 276/027 +00 100 269/021 +04\n\n--------------------------------------------------------------------<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///ATC Flight Plan///0--><b>[ ATC Flight Plan ]\n--------------------------------------------------------------------</b>\n ICAO FLIGHT PLAN \n ---------------- \n\nFF OMAEZQZX\n311548 CYULSBFP\n(FPL-VMS113-IS\n-B737/M-SDE2E3FGHIRWXY/LB1\n-OMDB1230\n-N0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n-OMAA0019 OMDB\n-PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS)<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Additional Info///0--><b>[ Additional Info ]\n--------------------------------------------------------------------</b>\nD I S P A T C H B R I E F I N G I N F O VMS0113 OMDB/OMAA\n\n\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Airport WX List///0--><b>[ Airport WX List ]\n--------------------------------------------------------------------</b>\nOMDB --> OMAA VMS 113 / 01JAN2014\nLIDO/WEATHER SERVICE DATE : 31Mar2020 TIME : 15:48 UTC\n\nAIRMETs:\n No Wx data available\n\nSIGMETs:\n No Wx data available\n\nTropical Cyclone SIGMETs:\n No Wx data available\n\nVolcanic Ash SIGMETs:\n No Wx data available\n\nDeparture / Destination Alternate:\nOMDB/DXB DUBAI INTL\n SA 311500 28009KT CAVOK 24/16 Q1013 NOSIG\n FT 311101 3112/0118 28014KT CAVOK\n BECMG 3116/3118 20007KT\n BECMG 0108/0110 30012KT\n BECMG 0116/0118 21007KT\n\nDestination:\nOMAA/AUH ABU DHABI INTL\n SA 311500 32011KT CAVOK 24/16 Q1013 NOSIG\n FT 311100 3112/0118 30014KT CAVOK\n BECMG 3118/3120 23006KT\n PROB30 0101/0104 3500 HZ\n BECMG 0107/0109 30012KT\n BECMG 0117/0118 VRB02KT\n\n\n\n AIRPORTLIST ENDED<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///NOTAM///0--><b>[ NOTAM ]\n--------------------------------------------------------------------</b>\nLIDO-NOTAM-BULLETIN INCLUDES NOTAM, COMP NOTAM AND AIP-REGULATION\n<b>VALID: 1401011230 - 1401011650</b> STD(EOBT)+TRIP+ALTN+3HRS\nVMS 113 /01JAN OFP-NR: 1\nROUTE: OMDB - OMAA ALTN: OMDB\nN0338F160 KUTLI3F KUTLI DCT EMERU EMERU2D\n\n\n<b>=============================================\nDEPARTURE / ALTERNATE AIRPORT - DETAILED INFO\n=============================================</b>\n\n<b>OMDB/DXB DUBAI INTL\n-----------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A0802/20 </b>\n H24\n SECN OF TXL T BTN TXL S AND <b>TWY M</b> <b>CLSD</b>.\n SECN OF <b>TWY M</b> BTN <b>TWY M20</b> AND <b>TWY M21</b> <b>CLSD</b>.\n <b>TWY M21</b> AND ASSOCIATED LINKS <b>CLSD</b>.\n<b>A0817/20 </b>\n H24\n SECN OF TXL J BEHIND STANDS D1 TO D3 <b>CLSD</b>.\n<b>A0808/20 </b>\n H24\n SECN OF TXL P BTN ACFT STANDS E14 AND E18 AND ASSOCIATED <b>TWY P3</b>\n LINK <b>CLSD</b>.\n<b>A0769/20 </b>\n H24\n RFFS <b>CAT</b> <b>DOWNGRADED</b> TO <b>CAT</b> 7.\n <b>CAT</b> 8, <b>CAT</b> 9 AND <b>CAT</b> 10 <b>AVBL</b> WITH 20 MIN PN.\n<b>A0766/20 </b>\n H24\n <b>TWY Z8</b> AND <b>TWY Z9</b> <b>NOT AVBL</b>.\n<b>A0754/20 </b>\n HJ\n UAS ACT WILL TAKE PLACE WI AREA BOUNDED BY LINES JOINING:\n 251806.38N 0551940.66E\n 251636.78N 0551741.26E\n 251730.33N 0551711.46E\n 251809.04N 0551741.28E\n 251815.30N 0551851.37E\n F) SFC G) 200FT AGL\n<b>A0302/20 </b>\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020 <b>TWY</b>\n DETAILS AMD\n VFR CHARTS AMD\n<b>A0689/20 </b>\n H24\n OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E\n ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT\n F) SFC G) 289FT AMSL<h2 style=\"page-break-after: always;\"> </h2><b>A0535/20 </b>\n H24\n <b>TWY K13</b> <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY K</b> EASTBOUND <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY K</b> WESTBOUND <b>CLSD</b>\n <b>TWY K13</b> LINK TO <b>TWY J5</b> <b>CLSD</b>\n <b>TWY K</b> CL TO OBJECT CLR REDUCED TO 47.5M ABEAM <b>TWY K13</b>\n<b>A0469/20 </b>\n H24\n OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E\n OMDB ARP BRG 201 DEG MAG DIST 5230M.\n CRANE LGT AT NGT.\n F) SFC G) 1109FT AMSL\n<b>A0264/20 </b>\n DLY BTN 0300-0700\n PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO\n SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC.\n F) 500FT AGL G) 1500FT AGL\n<b>A0171/20 </b>\n H24\n OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E\n ARP BRG 212 DEG MAG DIST 9.93KM.\n CRANE LGT AT NGT.\n F) SFC G) 679FT AMSL\n<b>A0149/20 </b>\n H24\n OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E\n ARP BRG 202 DEG MAG DIST 5.5KM\n CRANE LIT AT NGT.\n F) SFC G) 1004FT AMSL\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A0752/20 </b>\n H24\n <b>RWY 12L/30R</b> <b>CLSD</b>\n\n+++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++\n\n<b>A0275/20 </b>\n SID ITOTU 1F <b>RWY</b> 30L/R <b>WITHDRAWN</b>\n REF UAE AIP CHART OMDB <b>AD</b> 2-42.\n\n<b>===================================\nDESTINATION AIRPORT - DETAILED INFO\n===================================</b>\n\n<b>OMAA/AUH ABU DHABI INTL\n---------------------------</b>\n\n+++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++\n\n<b>A0796/20 </b>\n H24\n <b>TWY A</b> BTN <b>TWY A14</b> AND <b>TWY A17</b> INCLUDING INT WITH <b>TWY A16</b> AND <b>TWY</b>\n B15 <b>CLSD</b>.<h2 style=\"page-break-after: always;\"> </h2><b>A0798/20 </b>\n DLY BTN 0300-1400\n <b>TWY A</b> BTN <b>TWY A14</b> AND <b>TWY G</b> INCLUDING INT OF <b>TWY A14</b> AND <b>TWY A</b>\n <b>CLSD</b> DUE <b>WIP</b>.\n INT <b>TWY A17</b> AND <b>TWY A</b> <b>CLSD</b> DUE <b>WIP</b>.\n <b>TWY B</b> BTN <b>TWY A18</b> AND <b>TWY G</b> <b>CLSD</b> DUE <b>WIP</b>.\n<b>A0799/20 </b>\n DLY BTN 0300-1400\n OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING:\n 242636.62N 0543958.28E\n 242630.00N 0544007.42E\n 242634.26N 0543956.35E\n 242627.55N 0544005.24E\n 242636.62N 0543958.28E\n F) SFC G) 036FT AGL\n<b>A0299/20 </b>\n TRIGGER NOTAM - PERM AIRAC AIP AMDT NR 04/2020 WEF 26 MAR 2020\n SURVEILLANCE SER BASED ON MODE S MULTILATERATION PROC ADDED MISSED\n APCH ALT AMD\n CHART REF FOR RVR LCA AMD.\n<b>A0738/20 </b>\n H24\n <b>TWY C</b> AND <b>TWY N</b> <b>CLSD</b>.\n<b>A0737/20 </b>\n H24\n SECN OF <b>TWY B</b> BTN <b>TWY B9</b> AND <b>TWY G</b> <b>CLSD</b> DUE <b>WIP</b>.\n<b>A0401/20 </b>\n DLY BTN 0200-1600\n OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN\n 242742.38N 0543602.65E\n F) SFC G) 338FT AGL\n<b>A0408/20 </b>\n DLY BTN 0130-0300 AND 1430-1530\n IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM,\n ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE\n TIMES IN <b>CAT</b> I COND. ATC WILL CONT TO ISSUE STANDARD <b>TWY</b> ROUTINGS\n BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT\n ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND\n THEREFORE SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS\n A DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT\n SHALL CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD\n PSN WHEN SAFE TO DO SO.\n\n++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++\n\n<b>A0797/20 </b>\n DLY BTN 0300-1400\n <b>RWY 13L/31R</b> <b>CLSD</b> DUE <b>WIP</b>.\n<h2 style=\"page-break-after: always;\"> </h2><!--BKMK///Company NOTAM///0--><b>[ Company NOTAM ]\n--------------------------------------------------------------------</b>\n<b>==========\nCREW ALERT\n==========</b>\n\n<b>SB007/14 </b>\n SUBJECT: AUTO COST INDEXES\n <t>WHEN PLANNING A COST INDEX, 2 OPTIONS ARE AVAILABLE. PILOTS MAY\n EITHER SELECT A SPECIFIC COST INDEX NUMBER FROM THE LIST, OR THEY\n MAY SELECT \"AUTO\". WHEN PLANNING AN \"AUTO\" COST INDEX, THE SYSTEM\n WILL REFERENCE THE \"TIME ENROUTE\" OPTION AND ATTEMPT TO CHOOSE A\n COST INDEX WHICH CLOSELY MATCHES THIS VALUE. NOTE THAT THE \"TIME\n ENROUTE\" OPTION IS MEANT AS A GATE TO GATE TIME (AS INDICATED ON\n AN AIRLINE'S FLIGHT SCHEDULE, FOR EXAMPLE). IF A \"TIME ENROUTE\" OF\n 2:30 IS SELECTED, THE SYSTEM WILL SUBTRACT THE TAXI TIMES FROM\n THIS VALUE TO DETERMINE THE SCHEDULED AIR TIME. IT WILL THEN\n DETERMINE AND USE THE COST INDEX WHICH MATCHES THIS AIR TIME.</t>\n\n<b>SB003/13 </b>\n SUBJECT: FLIGHT RELEASE UNITS\n <t>ALL FLIGHT CREW: PLEASE PAY SPECIAL ATTENTION TO THE UNITS\n SELECTION WHEN GENERATING A FLIGHT PLAN. FAILURE TO IDENTIFY THE\n CORRECT UNITS WHEN REFUELING PRIOR TO FLIGHT CAN RESULT IN\n DEPARTING WITH INSUFFICIENT FUEL AND/OR AN ERRONEOUS PAYLOAD.</t>\n\n<b>=============\nCREW BULLETIN\n=============</b>\n\nNIL\n\n\n==================== END OF LIDO-NOTAM-BULLETIN ====================<h2 style=\"page-break-after: always;\"> </h2>Route\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_ROUTE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_ROUTE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>SigWx 1 of 1\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_SIGWX06.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_SIGWX06.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 1 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS14000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS14000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 2 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS18000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS18000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>UAD 3 of 3\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS24000.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_WINDS24000.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a><h2 style=\"page-break-after: always;\"> </h2>Vertical profile\n<a class=\"ofpmaplink\" href=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_PROFILE.gif\" target=\"_blank\"><img src=\"http://www.simbrief.com/ofp/uads/OMDBOMAA_1585669694_PROFILE.gif\" alt=\"Image no longer available, please regenerate the flightplan.\" width=\"600px\"></a></pre></div>\n \n \n \n 1585669531\n 1585634400\n 1585668781\n 1585669625\n 1585669264\n 1585660560\n \n \n http://www.simbrief.com/ofp/flightplans/\n \n PDF Document\n OMDBOMAA_PDF_1585669695.pdf\n \n \n Aerosoft Airbus\n OMDBOMAA_ABX_1585669695.flp\n \n \n Aerosoft Airbus EFB\n OMDBOMAA_PDF_1585669695.pdf--A3E\n \n \n Aerosoft CRJ\n OMDBOMAA_CRX_1585669695.flp\n \n \n Aerowinx PSX 747\n OMDBOMAA_PSX_1585669695.route\n \n \n AivlaSoft EFB\n OMDBOMAA_EFB_1585669695.efbr\n \n \n AivlaSoft EFB v2\n OMDBOMAA_EF2_1585669695.efbr\n \n \n Black Box Airbus\n OMDBOMAA_BBS_1585669695.pln\n \n \n Captain Sim (PLN)\n OMDBOMAA_CSF_1585669695.pln\n \n \n FeelThere\n OMDBOMAA_FTR_1585669695.fpl\n \n \n Flight1 GTN\n OMDBOMAA_GTN_1585669695.gfp\n \n \n FlightFactor 757-777\n OMDBOMAA_VMX_1585669695.flp\n \n \n FlightFactor A320\n OMDBOMAA_FFA_1585669695.in\n \n \n FS Commander\n OMDBOMAA_FSC_1585669695.pln\n \n \n FS2004\n OMDBOMAA_FS9_1585669695.pln\n \n \n FSLabs A320\n OMDBOMAA_FSL_1585669695.txt\n \n \n FSX/P3D\n OMDBOMAA_FSX_1585669695.pln\n \n \n FSX/P3D (No SID/STAR)\n OMDBOMAA_FSN_1585669695.pln\n \n \n Google Earth KML\n OMDBOMAA_KML_1585669695.kml\n \n \n iFly 737NG\n OMDBOMAA_IFY_1585669695.FLTPLAN\n \n \n iFly 747 V2\n OMDBOMAA_I74_1585669695.route\n \n \n IVAO/IVAP\n OMDBOMAA_IVO_1585669695.fpl\n \n \n IVAO/IVAP (Default.fpl)\n OMDBOMAA_XVD_1585669695.fpl\n \n \n IVAO/XIVAP\n OMDBOMAA_XVP_1585669695.fpl\n \n \n IXEG 737 Classic\n OMDBOMAA_IXG_1585669695.fpl\n \n \n JARDesign Airbus\n OMDBOMAA_JAR_1585669695.txt\n \n \n Leonardo MD80\n OMDBOMAA_MDR_1585669695.mdr\n \n \n Leonardo MD80 (ACARS)\n OMDBOMAA_MDA_1585669695.txt\n \n \n Level-D 767\n OMDBOMAA_LVD_1585669695.rte\n \n \n Majestic Q400\n OMDBOMAA_MJC_1585669695.fpr\n \n \n phpVMS ACARS\n OMDBOMAA_VMS_1585669695.xml\n \n \n PMDG Flightplan\n OMDBOMAA_PMR_1585669695.rte\n \n \n PMDG Wind Uplink\n OMDBOMAA_PMW_1585669695.wx\n \n \n Project Magenta\n OMDBOMAA_MGA_1585669695.sbp\n \n \n ProSim 737\n OMDBOMAA_PSM_1585669695.xml\n \n \n QualityWings\n OMDBOMAA_QTY_1585669695.RTE\n \n \n Sim-Avionics\n xml/OMDBOMAA_XML_1585669695.xml--sbr\n \n \n Squawkbox\n OMDBOMAA_SFP_1585669695.sfp\n \n \n TFDi Design 717\n OMDBOMAA_TFD_1585669695.xml\n \n \n UFMC - Universal FMC\n OMDBOMAA_UFC_1585669695.ufmc\n \n \n vasFMC\n OMDBOMAA_VAS_1585669695.fmc\n \n \n vPilot\n OMDBOMAA_VFP_1585669695.vfp\n \n \n Wilco Airbus Evo\n OMDBOMAA_WAE_1585669695.rte\n \n \n X-FMC\n OMDBOMAA_XFM_1585669695.FPL\n \n \n X-Plane 11\n OMDBOMAA_XPE_1585669695.fms\n \n \n X-Plane 9/10\n OMDBOMAA_XP9_1585669695.fms\n \n \n \n http://www.simbrief.com/ofp/flightplans/\n \n PDF Document\n OMDBOMAA_PDF_1585669695.pdf\n \n \n Aerosoft Airbus\n OMDBOMAA_ABX_1585669695.flp\n \n \n Aerosoft Airbus EFB\n OMDBOMAA_PDF_1585669695.pdf--A3E\n \n \n Aerosoft CRJ\n OMDBOMAA_CRX_1585669695.flp\n \n \n Aerowinx PSX 747\n OMDBOMAA_PSX_1585669695.route\n \n \n AivlaSoft EFB\n OMDBOMAA_EFB_1585669695.efbr\n \n \n AivlaSoft EFB v2\n OMDBOMAA_EF2_1585669695.efbr\n \n \n Black Box Airbus\n OMDBOMAA_BBS_1585669695.pln\n \n \n Captain Sim (PLN)\n OMDBOMAA_CSF_1585669695.pln\n \n \n FeelThere\n OMDBOMAA_FTR_1585669695.fpl\n \n \n Flight1 GTN\n OMDBOMAA_GTN_1585669695.gfp\n \n \n FlightFactor 757-777\n OMDBOMAA_VMX_1585669695.flp\n \n \n FlightFactor A320\n OMDBOMAA_FFA_1585669695.in\n \n \n FS Commander\n OMDBOMAA_FSC_1585669695.pln\n \n \n FS2004\n OMDBOMAA_FS9_1585669695.pln\n \n \n FSLabs A320\n OMDBOMAA_FSL_1585669695.txt\n \n \n FSX/P3D\n OMDBOMAA_FSX_1585669695.pln\n \n \n FSX/P3D (No SID/STAR)\n OMDBOMAA_FSN_1585669695.pln\n \n \n Google Earth KML\n OMDBOMAA_KML_1585669695.kml\n \n \n iFly 737NG\n OMDBOMAA_IFY_1585669695.FLTPLAN\n \n \n iFly 747 V2\n OMDBOMAA_I74_1585669695.route\n \n \n IVAO/IVAP\n OMDBOMAA_IVO_1585669695.fpl\n \n \n IVAO/IVAP (Default.fpl)\n OMDBOMAA_XVD_1585669695.fpl\n \n \n IVAO/XIVAP\n OMDBOMAA_XVP_1585669695.fpl\n \n \n IXEG 737 Classic\n OMDBOMAA_IXG_1585669695.fpl\n \n \n JARDesign Airbus\n OMDBOMAA_JAR_1585669695.txt\n \n \n Leonardo MD80\n OMDBOMAA_MDR_1585669695.mdr\n \n \n Leonardo MD80 (ACARS)\n OMDBOMAA_MDA_1585669695.txt\n \n \n Level-D 767\n OMDBOMAA_LVD_1585669695.rte\n \n \n Majestic Q400\n OMDBOMAA_MJC_1585669695.fpr\n \n \n phpVMS ACARS\n OMDBOMAA_VMS_1585669695.xml\n \n \n PMDG Flightplan\n OMDBOMAA_PMR_1585669695.rte\n \n \n PMDG Wind Uplink\n OMDBOMAA_PMW_1585669695.wx\n \n \n Project Magenta\n OMDBOMAA_MGA_1585669695.sbp\n \n \n ProSim 737\n OMDBOMAA_PSM_1585669695.xml\n \n \n QualityWings\n OMDBOMAA_QTY_1585669695.RTE\n \n \n Sim-Avionics\n xml/OMDBOMAA_XML_1585669695.xml--sbr\n \n \n Squawkbox\n OMDBOMAA_SFP_1585669695.sfp\n \n \n TFDi Design 717\n OMDBOMAA_TFD_1585669695.xml\n \n \n UFMC - Universal FMC\n OMDBOMAA_UFC_1585669695.ufmc\n \n \n vasFMC\n OMDBOMAA_VAS_1585669695.fmc\n \n \n vPilot\n OMDBOMAA_VFP_1585669695.vfp\n \n \n Wilco Airbus Evo\n OMDBOMAA_WAE_1585669695.rte\n \n \n X-FMC\n OMDBOMAA_XFM_1585669695.FPL\n \n \n X-Plane 11\n OMDBOMAA_XPE_1585669695.fms\n \n \n X-Plane 9/10\n OMDBOMAA_XP9_1585669695.fms\n \n \n \n http://www.simbrief.com/ofp/uads/\n \n Route\n OMDBOMAA_1585669694_ROUTE.gif\n \n \n SigWx 1 of 1\n OMDBOMAA_1585669694_SIGWX06.gif\n \n \n UAD 1 of 3\n OMDBOMAA_1585669694_WINDS14000.gif\n \n \n UAD 2 of 3\n OMDBOMAA_1585669694_WINDS18000.gif\n \n \n UAD 3 of 3\n OMDBOMAA_1585669694_WINDS24000.gif\n \n \n Vertical profile\n OMDBOMAA_1585669694_PROFILE.gif\n \n \n \n http://skyvector.com/?ll=24.844177,55.005425&chart=304&zoom=2&fpl= OMDB KUTLI3F KUTLI EMERU EMERU2D OMAA\n \n <Form method=\"get\" action=\"https://cert.vatsim.net/fp/file.php\" target=\"_blank\">\n<button type=\"submit\">Pre-file on VATSIM</button>\n<input type=\"hidden\" name=\"2\" value=\"VMS113\">\n<input type=\"hidden\" name=\"3\" value=\"B737/L\">\n<input type=\"hidden\" name=\"4\" value=\"338\">\n<input type=\"hidden\" name=\"5\" value=\"OMDB\">\n<input type=\"hidden\" name=\"6\" value=\"1230\">\n<input type=\"hidden\" name=\"7\" value=\"16000\">\n<input type=\"hidden\" name=\"8\" value=\"KUTLI3F KUTLI EMERU EMERU2D\">\n<input type=\"hidden\" name=\"9\" value=\"OMAA\">\n<input type=\"hidden\" name=\"10a\" value=\"00\">\n<input type=\"hidden\" name=\"10b\" value=\"29\">\n<input type=\"hidden\" name=\"11\" value=\"PBN%2FA1B1C1D1S1S2+DOF%2F140101+REG%2FN714SB+OPR%2FVMS+PER%2FC+RMK%2FTCAS SIMBRIEF\">\n<input type=\"hidden\" name=\"12a\" value=\"01\">\n<input type=\"hidden\" name=\"12b\" value=\"55\">\n<input type=\"hidden\" name=\"13\" value=\"OMDB\">\n<input type=\"hidden\" name=\"14\" value=\"NABEEL SHAHZAD\">\n<input type=\"hidden\" name=\"voice\" value=\"/V/\">\n</Form>\n <form action=\"https://fpl.ivao.aero/api/fp/load\" method=\"POST\" target=\"_blank\">\n<button type=\"submit\">Pre-file on IVAO</button>\n<input type=\"hidden\" name=\"CALLSIGN\" value=\"VMS113\">\n<input type=\"hidden\" name=\"RULES\" value=\"I\">\n<input type=\"hidden\" name=\"FLIGHTTYPE\" value=\"S\">\n<input type=\"hidden\" name=\"NUMBER\" value=\"1\">\n<input type=\"hidden\" name=\"ACTYPE\" value=\"B737\">\n<input type=\"hidden\" name=\"WAKECAT\" value=\"M\">\n<input type=\"hidden\" name=\"EQUIPMENT\" value=\"SDE2E3FGHIRWXY\">\n<input type=\"hidden\" name=\"TRANSPONDER\" value=\"LB1\">\n<input type=\"hidden\" name=\"DEPICAO\" value=\"OMDB\">\n<input type=\"hidden\" name=\"DEPTIME\" value=\"1230\">\n<input type=\"hidden\" name=\"SPEEDTYPE\" value=\"N\">\n<input type=\"hidden\" name=\"SPEED\" value=\"0338\">\n<input type=\"hidden\" name=\"LEVELTYPE\" value=\"F\">\n<input type=\"hidden\" name=\"LEVEL\" value=\"160\">\n<input type=\"hidden\" name=\"ROUTE\" value=\"KUTLI3F KUTLI DCT EMERU EMERU2D\">\n<input type=\"hidden\" name=\"DESTICAO\" value=\"OMAA\">\n<input type=\"hidden\" name=\"EET\" value=\"0029\">\n<input type=\"hidden\" name=\"ALTICAO\" value=\"OMDB\">\n<input type=\"hidden\" name=\"ALTICAO2\" value=\"\">\n<input type=\"hidden\" name=\"OTHER\" value=\"PBN/A1B1C1D1S1S2 DOF/140101 REG/N714SB OPR/VMS PER/C RMK/TCAS SIMBRIEF\">\n<input type=\"hidden\" name=\"ENDURANCE\" value=\"0155\">\n<input type=\"hidden\" name=\"POB\" value=\"151\">\n</form>\n https://www.simbrief.com/ofp/flightplans/OMDBOMAA_MJS_1585669695.js\n \n VMS\n 113\n B737\n OMDB\n OMAA\n 1388534400\n 43200\n 1800\n KUTL3F KUTLI EMERU EMER2D\n 7200\n 900\n \n \n \n auto\n OMDB\n \n NABEEL SHAHZAD\n 120867\n 1\n auto\n 0\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n auto\n AUTO\n lido\n 1\n 1\n 0\n 0\n 1\n 1\n 0\n 1\n \n \n \n \n \n \n \n \n \n false\n \n \n\n" + created_at: 'now' + updated_at: 'now' diff --git a/app/Database/seeds/permissions.yml b/app/Database/seeds/permissions.yml index 26561458..9d2befff 100644 --- a/app/Database/seeds/permissions.yml +++ b/app/Database/seeds/permissions.yml @@ -30,6 +30,9 @@ - name: finances display_name: Finances description: Create/view finance related items +- name: pages + display_name: Pages + description: Add/edit/delete pages - name: pireps display_name: PIREPs description: Accept/reject/edit PIREPs diff --git a/app/Database/seeds/settings.yml b/app/Database/seeds/settings.yml index 9ba00020..6b8b2f5a 100644 --- a/app/Database/seeds/settings.yml +++ b/app/Database/seeds/settings.yml @@ -40,6 +40,19 @@ options: '' type: boolean description: 'Send some data (php version, mysql version) to phpVMS. See AnalyticsSvc code for details' +- key: general.google_analytics_id + name: 'Google Analytics Tracking ID' + group: general + value: '' + options: '' + type: text + description: 'Enter your Google Analytics Tracking ID' +- key: units.currency + name: 'Currency' + group: units + value: USD + type: select + description: 'The currency to use' - key: units.distance name: 'Distance Units' group: units @@ -131,6 +144,41 @@ options: '' type: int description: 'Number of hours to expire bids after' +- key: flights.default_load_factor + name: 'Load Factor' + group: flights + value: 82 + options: '' + type: number + description: 'The default load factor for a flight, as a percent' +- key: flights.load_factor_variance + name: 'Load Factor Variance' + group: flights + value: 5 + options: '' + type: number + description: 'How much the load factor can vary per-flight' +- key: simbrief.api_key + name: 'SimBrief API Key' + group: simbrief + value: '' + options: '' + type: string + description: 'Your SimBrief API key' +- key: simbrief.only_bids + name: 'Only allow for bids' + group: simbrief + value: true + options: '' + type: boolean + description: 'Only allow briefs to be created for bidded flights' +- key: simbrief.expire_days + name: 'SimBrief Expire Time' + group: simbrief + value: 5 + options: '' + type: number + description: 'Days after how long to remove unused briefs' - key: pireps.duplicate_check_time name: 'PIREP duplicate time check' group: pireps diff --git a/app/Events/PirepCancelled.php b/app/Events/PirepCancelled.php new file mode 100644 index 00000000..38b72479 --- /dev/null +++ b/app/Events/PirepCancelled.php @@ -0,0 +1,15 @@ +pirep = $pirep; + } +} diff --git a/app/Events/PirepPrefiled.php b/app/Events/PirepPrefiled.php new file mode 100644 index 00000000..830d6366 --- /dev/null +++ b/app/Events/PirepPrefiled.php @@ -0,0 +1,15 @@ +pirep = $pirep; + } +} diff --git a/app/Events/PirepUpdated.php b/app/Events/PirepUpdated.php new file mode 100644 index 00000000..78ff0e11 --- /dev/null +++ b/app/Events/PirepUpdated.php @@ -0,0 +1,15 @@ +pirep = $pirep; + } +} diff --git a/app/Exceptions/PageNotFound.php b/app/Exceptions/PageNotFound.php new file mode 100644 index 00000000..4cd0fb79 --- /dev/null +++ b/app/Exceptions/PageNotFound.php @@ -0,0 +1,43 @@ +exception = $exception; + parent::__construct( + 404, + $exception->getMessage() + ); + } + + /** + * Return the RFC 7807 error type (without the URL root) + */ + public function getErrorType(): string + { + return 'not-found'; + } + + /** + * Get the detailed error string + */ + public function getErrorDetails(): string + { + return $this->getMessage(); + } + + /** + * Return an array with the error details, merged with the RFC7807 response + */ + public function getErrorMetadata(): array + { + return []; + } +} diff --git a/app/Facades/Utils.php b/app/Facades/Utils.php deleted file mode 100644 index 8a9973e0..00000000 --- a/app/Facades/Utils.php +++ /dev/null @@ -1,222 +0,0 @@ -request('GET', $uri, $opts); - - $body = $response->getBody()->getContents(); - if ($response->getHeader('content-type') === 'application/json') { - $body = \GuzzleHttp\json_decode($body); - } - - return $body; - } - - /** - * Returns a 40 character API key that a user can use - * - * @return string - */ - public static function generateApiKey(): string - { - $key = substr(sha1(time().mt_rand()), 0, 20); - return $key; - } - - /** - * @param string $minutes - * - * @return array - */ - public static function minutesToTimeParts($minutes): array - { - $hours = floor($minutes / 60); - $minutes %= 60; - - return ['h' => $hours, 'm' => $minutes]; - } - - public static function minutesToTimeString($minutes): string - { - $hm = self::minutesToTimeParts($minutes); - return $hm['h'].'h '.$hm['m'].'m'; - } - - /** - * Convert seconds to an array of hours, minutes, seconds - * - * @param int $seconds - * - * @throws \Exception - * - * @return array['h', 'm', 's'] - */ - public static function secondsToTimeParts($seconds): array - { - $dtF = new \DateTimeImmutable('@0', new \DateTimeZone('UTC')); - $dtT = new \DateTimeImmutable("@$seconds", new \DateTimeZone('UTC')); - - $t = $dtF->diff($dtT); - - $retval = []; - $retval['h'] = (int) $t->format('%h'); - $retval['m'] = (int) $t->format('%i'); - $retval['s'] = (int) $t->format('%s'); - - return $retval; - } - - /** - * Convert seconds to HH MM format - * - * @param int $seconds - * @param bool $incl_sec - * - * @throws \Exception - * - * @return string - */ - public static function secondsToTimeString($seconds, $incl_sec = false): string - { - $hms = self::secondsToTimeParts($seconds); - $format = $hms['h'].'h '.$hms['m'].'m'; - if ($incl_sec) { - $format .= ' '.$hms['s'].'s'; - } - - return $format; - } - - /** - * @param $minutes - * - * @return float|int - */ - public static function minutesToSeconds($minutes) - { - return $minutes * 60; - } - - /** - * Convert the seconds to minutes and then round it up - * - * @param $seconds - * - * @return float|int - */ - public static function secondsToMinutes($seconds) - { - return ceil($seconds / 60); - } - - /** - * Convert hours to minutes. Pretty complex - * - * @param $minutes - * - * @return float|int - */ - public static function minutesToHours($minutes) - { - return $minutes / 60; - } - - /** - * @param $hours - * @param null $minutes - * - * @return float|int - */ - public static function hoursToMinutes($hours, $minutes = null) - { - $total = (int) $hours * 60; - if ($minutes) { - $total += (int) $minutes; - } - - return $total; - } - - /** - * Bitwise operator for setting days of week to integer field - * - * @param int $datefield initial datefield - * @param array $day_enums Array of values from config("enum.days") - * - * @return int - */ - public static function setDays(int $datefield, array $day_enums): int - { - foreach ($day_enums as $day) { - $datefield |= $day; - } - - return $datefield; - } - - /** - * Bit check if a day exists within a integer bitfield - * - * @param int $datefield datefield from database - * @param int $day_enum Value from config("enum.days") - * - * @return bool - */ - public static function hasDay(int $datefield, int $day_enum): bool - { - return ($datefield & $day_enum) === $datefield; - } -} diff --git a/app/Http/Composers/PageLinksComposer.php b/app/Http/Composers/PageLinksComposer.php new file mode 100644 index 00000000..afe9caf6 --- /dev/null +++ b/app/Http/Composers/PageLinksComposer.php @@ -0,0 +1,44 @@ +pageRepo = $pageRepo; + } + + /** + * @param \Illuminate\View\View $view + */ + public function compose(View $view) + { + try { + // If not logged in, then only get the public pages + $w = ['enabled' => true]; + if (!Auth::check()) { + $w = ['public' => true]; + } + + $pages = $this->pageRepo->findWhere($w, ['id', 'name', 'slug', 'icon']); + } catch (Exception $e) { + $pages = []; + } + + $view->with('page_links', $pages); + } +} diff --git a/app/Http/Composers/VersionComposer.php b/app/Http/Composers/VersionComposer.php new file mode 100644 index 00000000..2f9d984b --- /dev/null +++ b/app/Http/Composers/VersionComposer.php @@ -0,0 +1,23 @@ +versionSvc = $versionSvc; + } + + public function compose(View $view) + { + $view->with('version', $this->versionSvc->getCurrentVersion(false)); + $view->with('version_full', $this->versionSvc->getCurrentVersion(true)); + } +} diff --git a/app/Http/Controllers/Admin/AircraftController.php b/app/Http/Controllers/Admin/AircraftController.php index db7660ae..b0827ba1 100644 --- a/app/Http/Controllers/Admin/AircraftController.php +++ b/app/Http/Controllers/Admin/AircraftController.php @@ -3,11 +3,12 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Http\Controllers\Admin\Traits\Importable; use App\Http\Requests\CreateAircraftRequest; -use App\Http\Requests\ImportRequest; use App\Http\Requests\UpdateAircraftRequest; use App\Models\Aircraft; use App\Models\Enums\AircraftStatus; +use App\Models\Enums\ImportExportType; use App\Models\Expense; use App\Models\Subfleet; use App\Repositories\AircraftRepository; @@ -15,15 +16,12 @@ use App\Repositories\AirportRepository; use App\Services\ExportService; use App\Services\ImportService; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; -/** - * Class AircraftController - */ class AircraftController extends Controller { + use Importable; + private $aircraftRepo; private $airportRepo; private $importSvc; @@ -82,7 +80,7 @@ class AircraftController extends Controller return view('admin.aircraft.create', [ 'airports' => $this->airportRepo->selectBoxList(), 'subfleets' => Subfleet::all()->pluck('name', 'id'), - 'statuses' => AircraftStatus::select(true), + 'statuses' => AircraftStatus::select(false), 'subfleet_id' => $request->query('subfleet'), ]); } @@ -90,7 +88,11 @@ class AircraftController extends Controller /** * Store a newly created Aircraft in storage. * + * @param \App\Http\Requests\CreateAircraftRequest $request + * * @throws \Prettus\Validator\Exceptions\ValidatorException + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ public function store(CreateAircraftRequest $request) { @@ -142,14 +144,15 @@ class AircraftController extends Controller 'aircraft' => $aircraft, 'airports' => $this->airportRepo->selectBoxList(), 'subfleets' => Subfleet::all()->pluck('name', 'id'), - 'statuses' => AircraftStatus::select(true), + 'statuses' => AircraftStatus::select(false), ]); } /** * Update the specified Aircraft in storage. * - * @param mixed $id + * @param mixed $id + * @param UpdateAircraftRequest $request * * @throws \Prettus\Validator\Exceptions\ValidatorException * @@ -218,8 +221,6 @@ class AircraftController extends Controller /** * @param Request $request * - * @throws \Illuminate\Validation\ValidationException - * * @return mixed */ public function import(Request $request) @@ -230,16 +231,7 @@ class AircraftController extends Controller ]; if ($request->isMethod('post')) { - ImportRequest::validate($request); - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_aircraft.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded aircraft import file to '.$path); - $logs = $this->importSvc->importAircraft($path); + $logs = $this->importFile($request, ImportExportType::AIRCRAFT); } return view('admin.aircraft.import', [ diff --git a/app/Http/Controllers/Admin/AirlinesController.php b/app/Http/Controllers/Admin/AirlinesController.php index 4ebe22f0..afbc6104 100644 --- a/app/Http/Controllers/Admin/AirlinesController.php +++ b/app/Http/Controllers/Admin/AirlinesController.php @@ -63,7 +63,7 @@ class AirlinesController extends Controller public function store(CreateAirlineRequest $request) { $input = $request->all(); - $airlines = $this->airlineRepo->create($input); + $this->airlineSvc->createAirline($input); Flash::success('Airlines saved successfully.'); return redirect(route('admin.airlines.index')); diff --git a/app/Http/Controllers/Admin/AirportController.php b/app/Http/Controllers/Admin/AirportController.php index 4d5c0d21..ca611667 100644 --- a/app/Http/Controllers/Admin/AirportController.php +++ b/app/Http/Controllers/Admin/AirportController.php @@ -3,10 +3,11 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Http\Controllers\Admin\Traits\Importable; use App\Http\Requests\CreateAirportRequest; -use App\Http\Requests\ImportRequest; use App\Http\Requests\UpdateAirportRequest; use App\Models\Airport; +use App\Models\Enums\ImportExportType; use App\Models\Expense; use App\Repositories\AirportRepository; use App\Repositories\Criteria\WhereCriteria; @@ -14,12 +15,12 @@ use App\Services\ExportService; use App\Services\ImportService; use App\Support\Timezonelist; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; class AirportController extends Controller { + use Importable; + private $airportRepo; private $importSvc; @@ -223,16 +224,7 @@ class AirportController extends Controller ]; if ($request->isMethod('post')) { - ImportRequest::validate($request); - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_airports.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded airport import file to '.$path); - $logs = $this->importSvc->importAirports($path); + $logs = $this->importFile($request, ImportExportType::AIRPORT); } return view('admin.airports.import', [ diff --git a/app/Http/Controllers/Admin/ExpenseController.php b/app/Http/Controllers/Admin/ExpenseController.php index 184c5ca9..a331dd58 100644 --- a/app/Http/Controllers/Admin/ExpenseController.php +++ b/app/Http/Controllers/Admin/ExpenseController.php @@ -3,21 +3,23 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; -use App\Http\Requests\ImportRequest; +use App\Http\Controllers\Admin\Traits\Importable; use App\Models\Enums\ExpenseType; +use App\Models\Enums\FlightType; +use App\Models\Enums\ImportExportType; use App\Models\Expense; use App\Repositories\AirlineRepository; use App\Repositories\ExpenseRepository; use App\Services\ExportService; use App\Services\ImportService; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; use Prettus\Repository\Criteria\RequestCriteria; class ExpenseController extends Controller { + use Importable; + private $airlineRepo; private $expenseRepo; private $importSvc; @@ -68,6 +70,7 @@ class ExpenseController extends Controller return view('admin.expenses.create', [ 'airlines_list' => $this->airlineRepo->selectBoxList(true), 'expense_types' => ExpenseType::select(), + 'flight_types' => FlightType::select(), ]); } @@ -134,6 +137,7 @@ class ExpenseController extends Controller 'expense' => $expense, 'airlines_list' => $this->airlineRepo->selectBoxList(true), 'expense_types' => ExpenseType::select(), + 'flight_types' => FlightType::select(), ]); } @@ -153,14 +157,12 @@ class ExpenseController extends Controller if (empty($expenses)) { Flash::error('Expense not found'); - return redirect(route('admin.expenses.index')); } $this->expenseRepo->update($request->all(), $id); Flash::success('Expense updated successfully.'); - return redirect(route('admin.expenses.index')); } @@ -223,16 +225,7 @@ class ExpenseController extends Controller ]; if ($request->isMethod('post')) { - ImportRequest::validate($request); - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_expenses.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded expenses import file to '.$path); - $logs = $this->importSvc->importExpenses($path); + $logs = $this->importFile($request, ImportExportType::EXPENSES); } return view('admin.expenses.import', [ diff --git a/app/Http/Controllers/Admin/FareController.php b/app/Http/Controllers/Admin/FareController.php index 23216f0c..82941fdd 100644 --- a/app/Http/Controllers/Admin/FareController.php +++ b/app/Http/Controllers/Admin/FareController.php @@ -3,20 +3,22 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Http\Controllers\Admin\Traits\Importable; use App\Http\Requests\CreateFareRequest; -use App\Http\Requests\ImportRequest; use App\Http\Requests\UpdateFareRequest; +use App\Models\Enums\FareType; +use App\Models\Enums\ImportExportType; use App\Repositories\FareRepository; use App\Services\ExportService; use App\Services\ImportService; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; use Prettus\Repository\Criteria\RequestCriteria; class FareController extends Controller { + use Importable; + private $fareRepo; private $importSvc; @@ -57,7 +59,9 @@ class FareController extends Controller */ public function create() { - return view('admin.fares.create'); + return view('admin.fares.create', [ + 'fare_types' => FareType::select(), + ]); } /** @@ -93,7 +97,9 @@ class FareController extends Controller return redirect(route('admin.fares.index')); } - return view('admin.fares.show')->with('fare', $fare); + return view('admin.fares.show', [ + 'fare' => $fare, + ]); } /** @@ -111,7 +117,10 @@ class FareController extends Controller return redirect(route('admin.fares.index')); } - return view('admin.fares.edit')->with('fare', $fare); + return view('admin.fares.edit', [ + 'fare' => $fare, + 'fare_types' => FareType::select(), + ]); } /** @@ -196,16 +205,7 @@ class FareController extends Controller ]; if ($request->isMethod('post')) { - ImportRequest::validate($request); - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_fares.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded fares import file to '.$path); - $logs = $this->importSvc->importFares($path); + $logs = $this->importFile($request, ImportExportType::FARES); } return view('admin.fares.import', [ diff --git a/app/Http/Controllers/Admin/FlightController.php b/app/Http/Controllers/Admin/FlightController.php index 0cef3c46..5b5263fb 100644 --- a/app/Http/Controllers/Admin/FlightController.php +++ b/app/Http/Controllers/Admin/FlightController.php @@ -3,9 +3,11 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Http\Controllers\Admin\Traits\Importable; use App\Http\Requests\CreateFlightRequest; use App\Http\Requests\UpdateFlightRequest; use App\Models\Enums\FlightType; +use App\Models\Enums\ImportExportType; use App\Models\Flight; use App\Models\FlightField; use App\Models\FlightFieldValue; @@ -23,14 +25,12 @@ use App\Services\ImportService; use App\Support\Units\Time; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; -/** - * Class FlightController - */ class FlightController extends Controller { + use Importable; + private $airlineRepo; private $airportRepo; private $fareRepo; @@ -325,15 +325,7 @@ class FlightController extends Controller ]; if ($request->isMethod('post')) { - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_flights.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded flights import file to '.$path); - $logs = $this->importSvc->importFlights($path); + $logs = $this->importFile($request, ImportExportType::FLIGHTS); } return view('admin.flights.import', [ diff --git a/app/Http/Controllers/Admin/MaintenanceController.php b/app/Http/Controllers/Admin/MaintenanceController.php index 92264e2d..82fe3c78 100644 --- a/app/Http/Controllers/Admin/MaintenanceController.php +++ b/app/Http/Controllers/Admin/MaintenanceController.php @@ -3,18 +3,32 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Repositories\KvpRepository; use App\Services\CronService; +use App\Services\VersionService; +use Codedge\Updater\UpdaterManager; use Illuminate\Http\Request; use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Log; use Laracasts\Flash\Flash; class MaintenanceController extends Controller { private $cronSvc; + private $kvpRepo; + private $updateManager; + private $versionSvc; - public function __construct(CronService $cronSvc) - { + public function __construct( + CronService $cronSvc, + KvpRepository $kvpRepo, + UpdaterManager $updateManager, + VersionService $versionSvc + ) { $this->cronSvc = $cronSvc; + $this->kvpRepo = $kvpRepo; + $this->updateManager = $updateManager; + $this->versionSvc = $versionSvc; } public function index() @@ -22,6 +36,8 @@ class MaintenanceController extends Controller return view('admin.maintenance.index', [ 'cron_path' => $this->cronSvc->getCronExecString(), 'cron_problem_exists' => $this->cronSvc->cronProblemExists(), + 'new_version' => true, //$this->kvpRepo->get('new_version_available', false), + 'new_version_tag' => $this->kvpRepo->get('latest_version_tag'), ]); } @@ -30,7 +46,7 @@ class MaintenanceController extends Controller * * @param \Illuminate\Http\Request $request * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return mixed */ public function cache(Request $request) { @@ -57,4 +73,43 @@ class MaintenanceController extends Controller Flash::success('Cache cleared!'); return redirect(route('admin.maintenance.index')); } + + /** + * Force an update check + * + * @param \Illuminate\Http\Request $request + * + * @return mixed + */ + public function forcecheck(Request $request) + { + $this->versionSvc->isNewVersionAvailable(); + + $new_version_avail = $this->kvpRepo->get('new_version_available', false); + $new_version_tag = $this->kvpRepo->get('latest_version_tag'); + + Log::info('Force check, available='.$new_version_avail.', tag='.$new_version_tag); + + if (!$new_version_avail) { + Flash::success('No new version available'); + } else { + Flash::success('New version available: '.$new_version_tag); + } + + return redirect(route('admin.maintenance.index')); + } + + /** + * Update the phpVMS install + * + * @param \Illuminate\Http\Request $request + * + * @return mixed + */ + public function update(Request $request) + { + $new_version_tag = $this->kvpRepo->get('latest_version_tag'); + Log::info('Attempting to update to '.$new_version_tag); + return redirect('/update/downloader'); + } } diff --git a/app/Http/Controllers/Admin/PagesController.php b/app/Http/Controllers/Admin/PagesController.php new file mode 100644 index 00000000..ef438bb6 --- /dev/null +++ b/app/Http/Controllers/Admin/PagesController.php @@ -0,0 +1,152 @@ +pageRepo = $pageRepo; + } + + /** + * @param Request $request + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function index(Request $request) + { + $pages = $this->pageRepo->all(); + + return view('admin.pages.index', [ + 'pages' => $pages, + ]); + } + + /** + * Show the form for creating a new Airlines. + */ + public function create() + { + return view('admin.pages.create'); + } + + /** + * Store a newly created Airlines in storage. + * + * @param \App\Http\Requests\CreatePageRequest $request + * + * @throws \Prettus\Validator\Exceptions\ValidatorException + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function store(CreatePageRequest $request) + { + $input = $request->all(); + $this->pageRepo->create($input); + + Flash::success('Page saved successfully.'); + return redirect(route('admin.pages.index')); + } + + /** + * Display the specified page + * + * @param int $id + * + * @return mixed + */ + public function show($id) + { + $pages = $this->pageRepo->findWithoutFail($id); + + if (empty($pages)) { + Flash::error('Page not found'); + return redirect(route('admin.page.index')); + } + + return view('admin.pages.show', [ + 'pages' => $pages, + ]); + } + + /** + * Show the form for editing the specified pages + * + * @param int $id + * + * @return mixed + */ + public function edit($id) + { + $page = $this->pageRepo->findWithoutFail($id); + + if (empty($page)) { + Flash::error('Page not found'); + return redirect(route('admin.pages.index')); + } + + return view('admin.pages.edit', [ + 'page' => $page, + ]); + } + + /** + * Update the specified Airlines in storage. + * + * @param int $id + * @param UpdatePageRequest $request + * + * @throws \Prettus\Validator\Exceptions\ValidatorException + * + * @return mixed + */ + public function update($id, UpdatePageRequest $request) + { + $page = $this->pageRepo->findWithoutFail($id); + + if (empty($page)) { + Flash::error('page not found'); + return redirect(route('admin.pages.index')); + } + + $this->pageRepo->update($request->all(), $id); + + Flash::success('pages updated successfully.'); + return redirect(route('admin.pages.index')); + } + + /** + * Remove the specified Airlines from storage. + * + * @param int $id + * + * @return mixed + */ + public function destroy($id) + { + $pages = $this->pageRepo->findWithoutFail($id); + + if (empty($pages)) { + Flash::error('Page not found'); + return redirect(route('admin.pages.index')); + } + + $this->pageRepo->delete($id); + + Flash::success('page deleted successfully.'); + return redirect(route('admin.pages.index')); + } +} diff --git a/app/Http/Controllers/Admin/PirepController.php b/app/Http/Controllers/Admin/PirepController.php index ac12a15a..20f19b40 100644 --- a/app/Http/Controllers/Admin/PirepController.php +++ b/app/Http/Controllers/Admin/PirepController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; -use App\Facades\Utils; use App\Http\Requests\CreatePirepRequest; use App\Http\Requests\UpdatePirepRequest; use App\Models\Enums\PirepSource; @@ -260,7 +259,7 @@ class PirepController extends Controller $hours = (int) $attrs['hours']; $minutes = (int) $attrs['minutes']; - $pirep->flight_time = Utils::hoursToMinutes($hours) + $minutes; + $pirep->flight_time = Time::hoursToMinutes($hours) + $minutes; $this->saveCustomFields($pirep, $request); $this->saveFares($pirep, $request); diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index efd85b65..5f6c74a2 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -4,12 +4,23 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; use App\Models\Setting; +use App\Services\FinanceService; use Igaster\LaravelTheme\Facades\Theme; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; class SettingsController extends Controller { + private $financeSvc; + + /** + * @param FinanceService $financeSvc + */ + public function __construct(FinanceService $financeSvc) + { + $this->financeSvc = $financeSvc; + } + /** * Get a list of themes formatted for a select box * @@ -17,6 +28,7 @@ class SettingsController extends Controller */ private function getThemes(): array { + Theme::rebuildCache(); $themes = Theme::all(); $theme_list = []; foreach ($themes as $t) { @@ -29,6 +41,22 @@ class SettingsController extends Controller return $theme_list; } + /** + * Return the currency list + * + * @return array + */ + private function getCurrencyList(): array + { + $curr = []; + foreach (config('money') as $currency => $attrs) { + $name = $attrs['name'].' ('.$attrs['symbol'].'/'.$currency.')'; + $curr[$currency] = $name; + } + + return $curr; + } + /** * Display the settings. Group them by the setting group */ @@ -38,6 +66,7 @@ class SettingsController extends Controller $settings = $settings->groupBy('group'); return view('admin.settings.index', [ + 'currencies' => $this->getCurrencyList(), 'grouped_settings' => $settings, 'themes' => $this->getThemes(), ]); @@ -67,6 +96,8 @@ class SettingsController extends Controller $setting->save(); } + $this->financeSvc->changeJournalCurrencies(); + flash('Settings saved!'); return redirect('/admin/settings'); diff --git a/app/Http/Controllers/Admin/SubfleetController.php b/app/Http/Controllers/Admin/SubfleetController.php index 8253980a..7943ee11 100644 --- a/app/Http/Controllers/Admin/SubfleetController.php +++ b/app/Http/Controllers/Admin/SubfleetController.php @@ -3,11 +3,13 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; +use App\Http\Controllers\Admin\Traits\Importable; use App\Http\Requests\CreateSubfleetRequest; -use App\Http\Requests\ImportRequest; use App\Http\Requests\UpdateSubfleetRequest; use App\Models\Airline; +use App\Models\Enums\FareType; use App\Models\Enums\FuelType; +use App\Models\Enums\ImportExportType; use App\Models\Expense; use App\Models\Subfleet; use App\Repositories\AircraftRepository; @@ -19,13 +21,13 @@ use App\Services\FareService; use App\Services\FleetService; use App\Services\ImportService; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\Storage; use Laracasts\Flash\Flash; use Prettus\Repository\Criteria\RequestCriteria; class SubfleetController extends Controller { + use Importable; + private $aircraftRepo; private $fareRepo; private $fareSvc; @@ -97,6 +99,7 @@ class SubfleetController extends Controller foreach ($avail_fares as $fare) { $retval[$fare->id] = $fare->name. ' (price: '.$fare->price. + ', type: '.FareType::label($fare->type). ', cost: '.$fare->cost. ', capacity: '.$fare->capacity.')'; } @@ -161,7 +164,9 @@ class SubfleetController extends Controller */ public function show($id) { - $subfleet = $this->subfleetRepo->findWithoutFail($id); + $subfleet = $this->subfleetRepo + ->with(['fares']) + ->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); @@ -184,7 +189,9 @@ class SubfleetController extends Controller */ public function edit($id) { - $subfleet = $this->subfleetRepo->findWithoutFail($id); + $subfleet = $this->subfleetRepo + ->with(['fares', 'ranks']) + ->findWithoutFail($id); if (empty($subfleet)) { Flash::error('Subfleet not found'); @@ -293,17 +300,7 @@ class SubfleetController extends Controller ]; if ($request->isMethod('post')) { - ImportRequest::validate($request); - - $path = Storage::putFileAs( - 'import', - $request->file('csv_file'), - 'import_subfleets.csv' - ); - - $path = storage_path('app/'.$path); - Log::info('Uploaded subfleets import file to '.$path); - $logs = $this->importSvc->importSubfleets($path); + $logs = $this->importFile($request, ImportExportType::SUBFLEETS); } return view('admin.subfleets.import', [ diff --git a/app/Http/Controllers/Admin/Traits/Importable.php b/app/Http/Controllers/Admin/Traits/Importable.php new file mode 100644 index 00000000..a4a38c68 --- /dev/null +++ b/app/Http/Controllers/Admin/Traits/Importable.php @@ -0,0 +1,59 @@ +file('csv_file'), + 'import_'.ImportExportType::label($importType).'.csv' + ); + + /** @var ImportService */ + $importSvc = app(ImportService::class); + + $path = storage_path('app/'.$path); + Log::info('Uploaded airport import file to '.$path); + + $delete_previous = get_truth_state($request->get('delete')); + + switch ($importType) { + case ImportExportType::AIRCRAFT: + return $importSvc->importAircraft($path, $delete_previous); + case ImportExportType::AIRPORT: + return $importSvc->importAirports($path, $delete_previous); + case ImportExportType::EXPENSES: + return $importSvc->importExpenses($path, $delete_previous); + case ImportExportType::FARES: + return $importSvc->importFares($path, $delete_previous); + case ImportExportType::FLIGHTS: + return $importSvc->importFlights($path, $delete_previous); + case ImportExportType::SUBFLEETS: + return $importSvc->importSubfleets($path, $delete_previous); + } + + throw new InvalidArgumentException('Unknown import type!'); + } +} diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 0f669212..563c252d 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Admin; use App\Contracts\Controller; -use App\Facades\Utils; use App\Http\Requests\CreateUserRequest; use App\Http\Requests\UpdateUserRequest; use App\Models\Rank; @@ -15,6 +14,7 @@ use App\Repositories\PirepRepository; use App\Repositories\UserRepository; use App\Services\UserService; use App\Support\Timezonelist; +use App\Support\Utils; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; diff --git a/app/Http/Controllers/Api/AcarsController.php b/app/Http/Controllers/Api/AcarsController.php index dba30e43..d45bb62f 100644 --- a/app/Http/Controllers/Api/AcarsController.php +++ b/app/Http/Controllers/Api/AcarsController.php @@ -119,11 +119,15 @@ class AcarsController extends Controller public function acars_get($id, Request $request) { $this->pirepRepo->find($id); + $acars = Acars::with(['pirep']) + ->where([ + 'pirep_id' => $id, + 'type' => AcarsType::FLIGHT_PATH, + ]) + ->orderBy('sim_time', 'asc') + ->get(); - return new AcarsRouteResource(Acars::where([ - 'pirep_id' => $id, - 'type' => AcarsType::FLIGHT_PATH, - ])->orderBy('sim_time', 'asc')->get()); + return new AcarsRouteResource($acars); } /** @@ -154,7 +158,7 @@ class AcarsController extends Controller $position['pirep_id'] = $id; $position['type'] = AcarsType::FLIGHT_PATH; - if (array_key_exists('sim_time', $position)) { + if (isset($position['sim_time'])) { if ($position['sim_time'] instanceof \DateTime) { $position['sim_time'] = Carbon::instance($position['sim_time']); } else { @@ -162,7 +166,7 @@ class AcarsController extends Controller } } - if (array_key_exists('created_at', $position)) { + if (isset($position['created_at'])) { if ($position['created_at'] instanceof \DateTime) { $position['created_at'] = Carbon::instance($position['created_at']); } else { @@ -171,8 +175,16 @@ class AcarsController extends Controller } try { - $update = Acars::create($position); - $update->save(); + if (isset($position['id'])) { + Acars::updateOrInsert( + ['id' => $position['id']], + $position + ); + } else { + $update = Acars::create($position); + $update->save(); + } + $count++; } catch (QueryException $ex) { Log::info('Error on adding ACARS position: '.$ex->getMessage()); @@ -215,17 +227,25 @@ class AcarsController extends Controller $log['pirep_id'] = $id; $log['type'] = AcarsType::LOG; - if (array_key_exists('sim_time', $log)) { + if (isset($log['sim_time'])) { $log['sim_time'] = Carbon::createFromTimeString($log['sim_time']); } - if (array_key_exists('created_at', $log)) { + if (isset($log['created_at'])) { $log['created_at'] = Carbon::createFromTimeString($log['created_at']); } try { - $acars = Acars::create($log); - $acars->save(); + if (isset($log['id'])) { + Acars::updateOrInsert( + ['id' => $log['id']], + $log + ); + } else { + $acars = Acars::create($log); + $acars->save(); + } + $count++; } catch (QueryException $ex) { Log::info('Error on adding ACARS position: '.$ex->getMessage()); @@ -262,17 +282,25 @@ class AcarsController extends Controller $log['type'] = AcarsType::LOG; $log['log'] = $log['event']; - if (array_key_exists('sim_time', $log)) { + if (isset($log['sim_time'])) { $log['sim_time'] = Carbon::createFromTimeString($log['sim_time']); } - if (array_key_exists('created_at', $log)) { + if (isset($log['created_at'])) { $log['created_at'] = Carbon::createFromTimeString($log['created_at']); } try { - $acars = Acars::create($log); - $acars->save(); + if (isset($log['id'])) { + Acars::updateOrInsert( + ['id' => $log['id']], + $log + ); + } else { + $acars = Acars::create($log); + $acars->save(); + } + $count++; } catch (QueryException $ex) { Log::info('Error on adding ACARS position: '.$ex->getMessage()); diff --git a/app/Http/Controllers/Api/FlightController.php b/app/Http/Controllers/Api/FlightController.php index 070d8176..17664f7a 100644 --- a/app/Http/Controllers/Api/FlightController.php +++ b/app/Http/Controllers/Api/FlightController.php @@ -3,11 +3,14 @@ namespace App\Http\Controllers\Api; use App\Contracts\Controller; +use App\Exceptions\AssetNotFound; use App\Http\Resources\Flight as FlightResource; use App\Http\Resources\Navdata as NavdataResource; +use App\Models\SimBrief; use App\Repositories\Criteria\WhereCriteria; use App\Repositories\FlightRepository; use App\Services\FlightService; +use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Prettus\Repository\Criteria\RequestCriteria; @@ -51,7 +54,18 @@ class FlightController extends Controller */ public function get($id) { - $flight = $this->flightRepo->find($id); + $user = Auth::user(); + $flight = $this->flightRepo->with([ + 'airline', + 'subfleets', + 'subfleets.aircraft', + 'subfleets.fares', + 'field_values', + 'simbrief' => function ($query) use ($user) { + return $query->where('user_id', $user->id); + }, + ])->find($id); + $this->flightSvc->filterSubfleets(Auth::user(), $flight); return new FlightResource($flight); @@ -64,6 +78,7 @@ class FlightController extends Controller */ public function search(Request $request) { + $user = Auth::user(); $where = [ 'active' => true, 'visible' => true, @@ -88,7 +103,18 @@ class FlightController extends Controller $this->flightRepo->pushCriteria(new WhereCriteria($request, $where)); $this->flightRepo->pushCriteria(new RequestCriteria($request)); - $flights = $this->flightRepo->paginate(); + $flights = $this->flightRepo + ->with([ + 'airline', + 'subfleets', + 'subfleets.aircraft', + 'subfleets.fares', + 'field_values', + 'simbrief' => function ($query) use ($user) { + return $query->where('user_id', $user->id); + }, + ]) + ->paginate(); } catch (RepositoryException $e) { return response($e, 503); } @@ -101,6 +127,32 @@ class FlightController extends Controller return FlightResource::collection($flights); } + /** + * Output the flight briefing from simbrief or whatever other format + * + * @param string $id The flight ID + * + * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + */ + public function briefing($id) + { + $user = Auth::user(); + $w = [ + 'user_id' => $user->id, + 'flight_id' => $id, + ]; + + $simbrief = SimBrief::where($w)->first(); + + if ($simbrief === null) { + throw new AssetNotFound(new Exception('Flight briefing not found')); + } + + return response($simbrief->acars_xml, 200, [ + 'Content-Type' => 'application/xml', + ]); + } + /** * Get a flight's route * diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index 9571f214..5e92253c 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -3,10 +3,10 @@ namespace App\Http\Controllers\Api; use App\Contracts\Controller; -use App\Exceptions\AircraftNotAtAirport; +use App\Events\PirepPrefiled; +use App\Events\PirepUpdated; use App\Exceptions\AircraftPermissionDenied; use App\Exceptions\PirepCancelled; -use App\Exceptions\UserNotAtAirport; use App\Http\Requests\Acars\CommentRequest; use App\Http\Requests\Acars\FieldsRequest; use App\Http\Requests\Acars\FileRequest; @@ -20,7 +20,6 @@ use App\Http\Resources\PirepComment as PirepCommentResource; use App\Http\Resources\PirepFieldCollection; use App\Models\Acars; use App\Models\Enums\AcarsType; -use App\Models\Enums\FlightType; use App\Models\Enums\PirepFieldSource; use App\Models\Enums\PirepSource; use App\Models\Enums\PirepState; @@ -111,7 +110,7 @@ class PirepController extends Controller protected function checkCancelled(Pirep $pirep) { if ($pirep->cancelled) { - throw new PirepCancelled(); + throw new PirepCancelled($pirep); } } @@ -163,13 +162,27 @@ class PirepController extends Controller } /** - * @param $pirep_id + * @param string $id The PIREP ID * * @return PirepResource */ - public function get($pirep_id) + public function get($id) { - return new PirepResource($this->pirepRepo->find($pirep_id)); + $with = [ + 'acars', + 'arr_airport', + 'dpt_airport', + 'comments', + 'flight', + 'simbrief', + 'user', + ]; + + $pirep = $this->pirepRepo + ->with($with) + ->find($id); + + return new PirepResource($pirep); } /** @@ -197,49 +210,9 @@ class PirepController extends Controller $user = Auth::user(); $attrs = $this->parsePirep($request); - $attrs['user_id'] = $user->id; $attrs['source'] = PirepSource::ACARS; - $attrs['state'] = PirepState::IN_PROGRESS; - if (!array_key_exists('status', $attrs)) { - $attrs['status'] = PirepStatus::INITIATED; - } - - $pirep = new Pirep($attrs); - - // See if this user is at the current airport - /* @noinspection NotOptimalIfConditionsInspection */ - if (setting('pilots.only_flights_from_current') - && $user->curr_airport_id !== $pirep->dpt_airport_id) { - throw new UserNotAtAirport($user, $pirep->dpt_airport); - } - - // See if this user is allowed to fly this aircraft - if (setting('pireps.restrict_aircraft_to_rank', false) - && !$this->userSvc->aircraftAllowed($user, $pirep->aircraft_id)) { - throw new AircraftPermissionDenied($user, $pirep->aircraft); - } - - // See if this aircraft is at the departure airport - /* @noinspection NotOptimalIfConditionsInspection */ - if (setting('pireps.only_aircraft_at_dpt_airport') - && $pirep->aircraft_id !== $pirep->dpt_airport_id) { - throw new AircraftNotAtAirport($pirep->aircraft); - } - - // Find if there's a duplicate, if so, let's work on that - $dupe_pirep = $this->pirepSvc->findDuplicate($pirep); - if ($dupe_pirep !== false) { - $pirep = $dupe_pirep; - $this->checkCancelled($pirep); - } - - // Default to a scheduled passenger flight - if (!array_key_exists('flight_type', $attrs)) { - $attrs['flight_type'] = FlightType::SCHED_PAX; - } - - $pirep->save(); + $pirep = $this->pirepSvc->prefile($user, $attrs); Log::info('PIREP PREFILED'); Log::info($pirep->id); @@ -247,7 +220,9 @@ class PirepController extends Controller $this->updateFields($pirep, $request); $this->updateFares($pirep, $request); - return new PirepResource($pirep); + event(new PirepPrefiled($pirep)); + + return $this->get($pirep->id); } /** @@ -291,7 +266,9 @@ class PirepController extends Controller $this->updateFields($pirep, $request); $this->updateFares($pirep, $request); - return new PirepResource($pirep); + event(new PirepUpdated($pirep)); + + return $this->get($pirep->id); } /** @@ -354,7 +331,7 @@ class PirepController extends Controller $this->pirepSvc->submit($pirep); - return new PirepResource($pirep); + return $this->get($pirep->id); } /** @@ -494,7 +471,7 @@ class PirepController extends Controller { $pirep = Pirep::find($id); - return AcarsRouteResource::collection(Acars::where([ + return AcarsRouteResource::collection(Acars::with('pirep')->where([ 'pirep_id' => $id, 'type' => AcarsType::ROUTE, ])->orderBy('order', 'asc')->get()); @@ -536,8 +513,12 @@ class PirepController extends Controller $position['pirep_id'] = $id; $position['type'] = AcarsType::ROUTE; - $acars = Acars::create($position); - $acars->save(); + if (isset($position['id'])) { + Acars::updateOrInsert(['id' => $position['id']], $position); + } else { + $acars = Acars::create($position); + $acars->save(); + } $count++; } diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 092399a0..60fc0b15 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -77,7 +77,7 @@ class UserController extends Controller */ public function index(Request $request) { - return new UserResource(Auth::user()); + return $this->get(Auth::user()->id); } /** @@ -89,7 +89,11 @@ class UserController extends Controller */ public function get($id) { - return new UserResource($this->userRepo->find($id)); + $user = $this->userRepo + ->with(['airline', 'bids', 'rank']) + ->find($id); + + return new UserResource($user); } /** diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index ff52dfe7..7775b21e 100755 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers\Auth; use App\Contracts\Controller; -use App\Facades\Utils; +use App\Http\Requests\CreateUserRequest; use App\Models\Enums\UserState; use App\Models\User; use App\Repositories\AirlineRepository; @@ -59,7 +59,7 @@ class RegisterController extends Controller */ public function showRegistrationForm() { - $airports = $this->airportRepo->selectBoxList(false, true); + $airports = $this->airportRepo->selectBoxList(false, setting('pilots.home_hubs_only')); $airlines = $this->airlineRepo->selectBoxList(); return view('auth.register', [ @@ -81,7 +81,7 @@ class RegisterController extends Controller { $rules = [ 'name' => 'required|max:255', - 'email' => 'required|email|max:255|unique:users', + 'email' => 'required|email|max:255|unique:users, email', 'airline_id' => 'required', 'home_airport_id' => 'required', 'password' => 'required|min:5|confirmed', @@ -98,30 +98,24 @@ class RegisterController extends Controller /** * Get a validator for an incoming registration request. * - * @param array $data + * @param array $opts * * @throws \RuntimeException * @throws \Exception * * @return User */ - protected function create(array $data) + protected function create(array $opts) { // Default options - $opts = array_merge([ - 'api_key' => Utils::generateApiKey(), - ], $data); - - $opts['curr_airport_id'] = $data['home_airport_id']; - $opts['password'] = Hash::make($data['password']); + $opts['password'] = Hash::make($opts['password']); // Convert transfer hours into minutes if (isset($opts['transfer_time'])) { $opts['transfer_time'] *= 60; } - $user = User::create($opts); - $user = $this->userService->createUser($user); + $user = $this->userService->createUser($opts); Log::info('User registered: ', $user->toArray()); @@ -137,26 +131,8 @@ class RegisterController extends Controller * * @return mixed */ - public function register(Request $request) + public function register(CreateUserRequest $request) { - $rules = [ - 'name' => 'required', - 'email' => 'required|email|unique:users,email', - 'airline_id' => 'required', - 'home_airport_id' => 'required', - 'password' => 'required|confirmed', - 'timezone' => 'required', - 'country' => 'required', - 'transfer_time' => 'integer|min:0', - 'toc_accepted' => 'accepted', - ]; - - if (config('captcha.enabled')) { - $rules['g-recaptcha-response'] = 'required|captcha'; - } - - $this->validate(request(), $rules); - $user = $this->create($request->all()); if ($user->state === UserState::PENDING) { return view('auth.pending'); diff --git a/app/Http/Controllers/Frontend/FlightController.php b/app/Http/Controllers/Frontend/FlightController.php index 4fe34a4c..b0c3bb4a 100644 --- a/app/Http/Controllers/Frontend/FlightController.php +++ b/app/Http/Controllers/Frontend/FlightController.php @@ -9,11 +9,12 @@ use App\Repositories\AirportRepository; use App\Repositories\Criteria\WhereCriteria; use App\Repositories\FlightRepository; use App\Repositories\SubfleetRepository; +use App\Repositories\UserRepository; use App\Services\GeoService; -use Flash; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; +use Laracasts\Flash\Flash; use Prettus\Repository\Criteria\RequestCriteria; use Prettus\Repository\Exceptions\RepositoryException; @@ -24,28 +25,30 @@ class FlightController extends Controller private $flightRepo; private $subfleetRepo; private $geoSvc; + private $userRepo; /** - * FlightController constructor. - * * @param AirlineRepository $airlineRepo * @param AirportRepository $airportRepo * @param FlightRepository $flightRepo * @param GeoService $geoSvc * @param SubfleetRepository $subfleetRepo + * @param UserRepository $userRepo */ public function __construct( AirlineRepository $airlineRepo, AirportRepository $airportRepo, FlightRepository $flightRepo, GeoService $geoSvc, - SubfleetRepository $subfleetRepo + SubfleetRepository $subfleetRepo, + UserRepository $userRepo ) { $this->airlineRepo = $airlineRepo; $this->airportRepo = $airportRepo; $this->flightRepo = $flightRepo; $this->geoSvc = $geoSvc; $this->subfleetRepo = $subfleetRepo; + $this->userRepo = $userRepo; } /** @@ -114,6 +117,8 @@ class FlightController extends Controller 'arr_icao' => $request->input('arr_icao'), 'dep_icao' => $request->input('dep_icao'), 'subfleet_id' => $request->input('subfleet_id'), + 'simbrief' => !empty(setting('simbrief.api_key')), + 'simbrief_bids' => setting('simbrief.only_bids'), ]); } @@ -126,17 +131,25 @@ class FlightController extends Controller */ public function bids(Request $request) { - $user = Auth::user(); + $user = $this->userRepo + ->with(['bids', 'bids.flight']) + ->find(Auth::user()->id); - $flights = $user->flights()->paginate(); - $saved_flights = $flights->pluck('id')->toArray(); + $flights = collect(); + $saved_flights = []; + foreach ($user->bids as $bid) { + $flights->add($bid->flight); + $saved_flights[] = $bid->flight->id; + } - return view('flights.index', [ - 'title' => trans_choice('flights.mybid', 2), - 'airlines' => $this->airlineRepo->selectBoxList(true), - 'airports' => $this->airportRepo->selectBoxList(true), - 'flights' => $flights, - 'saved' => $saved_flights, + return view('flights.bids', [ + 'airlines' => $this->airlineRepo->selectBoxList(true), + 'airports' => $this->airportRepo->selectBoxList(true), + 'flights' => $flights, + 'saved' => $saved_flights, + 'subfleets' => $this->subfleetRepo->selectBoxList(true), + 'simbrief' => !empty(setting('simbrief.api_key')), + 'simbrief_bids' => setting('simbrief.only_bids'), ]); } diff --git a/app/Http/Controllers/Frontend/HomeController.php b/app/Http/Controllers/Frontend/HomeController.php index be63f83d..d2688182 100644 --- a/app/Http/Controllers/Frontend/HomeController.php +++ b/app/Http/Controllers/Frontend/HomeController.php @@ -5,11 +5,8 @@ namespace App\Http\Controllers\Frontend; use App\Contracts\Controller; use App\Models\User; use Illuminate\Database\QueryException; -use Log; +use Illuminate\Support\Facades\Log; -/** - * Class HomeController - */ class HomeController extends Controller { /** diff --git a/app/Http/Controllers/Frontend/PageController.php b/app/Http/Controllers/Frontend/PageController.php new file mode 100644 index 00000000..12337114 --- /dev/null +++ b/app/Http/Controllers/Frontend/PageController.php @@ -0,0 +1,38 @@ +pageRepo = $pageRepo; + } + + /** + * Show the page + * + * @param $slug + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function show($slug) + { + $page = $this->pageRepo->findWhere(['slug' => $slug])->first(); + if (!$page) { + throw new PageNotFound(new Exception('Page not found')); + } + + return view('pages.index', ['page' => $page]); + } +} diff --git a/app/Http/Controllers/Frontend/PirepController.php b/app/Http/Controllers/Frontend/PirepController.php index 249c4ae5..f0f273c1 100644 --- a/app/Http/Controllers/Frontend/PirepController.php +++ b/app/Http/Controllers/Frontend/PirepController.php @@ -3,13 +3,13 @@ namespace App\Http\Controllers\Frontend; use App\Contracts\Controller; -use App\Facades\Utils; use App\Http\Requests\CreatePirepRequest; use App\Http\Requests\UpdatePirepRequest; use App\Models\Enums\PirepSource; use App\Models\Enums\PirepState; use App\Models\Enums\PirepStatus; use App\Models\Pirep; +use App\Models\SimBrief; use App\Repositories\AircraftRepository; use App\Repositories\AirlineRepository; use App\Repositories\AirportRepository; @@ -20,6 +20,7 @@ use App\Repositories\PirepRepository; use App\Services\FareService; use App\Services\GeoService; use App\Services\PirepService; +use App\Services\SimBriefService; use App\Services\UserService; use App\Support\Units\Fuel; use App\Support\Units\Time; @@ -29,9 +30,6 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; use Laracasts\Flash\Flash; -/** - * Class PirepController - */ class PirepController extends Controller { private $aircraftRepo; @@ -200,7 +198,7 @@ class PirepController extends Controller */ public function show($id) { - $pirep = $this->pirepRepo->find($id); + $pirep = $this->pirepRepo->with(['simbrief'])->find($id); if (empty($pirep)) { Flash::error('Pirep not found'); return redirect(route('frontend.pirep.index')); @@ -246,10 +244,20 @@ class PirepController extends Controller // See if request has a ?flight_id, so we can pre-populate the fields from the flight // Makes filing easier, but we can also more easily find a bid and close it if ($request->has('flight_id')) { - $flight = $this->flightRepo->find($request->get('flight_id')); + $flight = $this->flightRepo->find($request->input('flight_id')); $pirep = Pirep::fromFlight($flight); } + /** + * They have a SimBrief ID, load that up and figure out the flight that it's from + */ + $simbrief_id = null; + if ($request->has('sb_id')) { + $simbrief_id = $request->input('sb_id'); + $brief = SimBrief::find($simbrief_id); + $pirep = Pirep::fromSimBrief($brief); + } + return view('pireps.create', [ 'aircraft' => null, 'pirep' => $pirep, @@ -259,6 +267,7 @@ class PirepController extends Controller 'airport_list' => $this->airportRepo->selectBoxList(true), 'pirep_fields' => $this->pirepFieldRepo->all(), 'field_values' => [], + 'simbrief_id' => $simbrief_id, ]); } @@ -324,7 +333,7 @@ class PirepController extends Controller // Any special fields $hours = (int) $request->input('hours', 0); $minutes = (int) $request->input('minutes', 0); - $pirep->flight_time = Utils::hoursToMinutes($hours) + $minutes; + $pirep->flight_time = Time::hoursToMinutes($hours) + $minutes; // Set the correct fuel units $pirep->block_fuel = new Fuel((float) $request->input('block_fuel'), setting('units.fuel')); @@ -339,6 +348,15 @@ class PirepController extends Controller $this->saveFares($pirep, $request); $this->pirepSvc->saveRoute($pirep); + if ($request->has('sb_id')) { + $brief = SimBrief::find($request->input('sb_id')); + if ($brief !== null) { + /** @var SimBriefService $sbSvc */ + $sbSvc = app(SimBriefService::class); + $sbSvc->attachSimbriefToPirep($pirep, $brief); + } + } + // Depending on the button they selected, set an initial state // Can be saved as a draft or just submitted if ($attrs['submit'] === 'save') { @@ -376,6 +394,11 @@ class PirepController extends Controller $pirep->aircraft->load('subfleet.fares'); } + $simbrief_id = null; + if ($pirep->simbrief) { + $simbrief_id = $pirep->simbrief->id; + } + $time = new Time($pirep->flight_time); $pirep->hours = $time->hours; $pirep->minutes = $time->minutes; @@ -403,6 +426,7 @@ class PirepController extends Controller 'airline_list' => $this->airlineRepo->selectBoxList(), 'airport_list' => $this->airportRepo->selectBoxList(), 'pirep_fields' => $this->pirepFieldRepo->all(), + 'simbrief_id' => $simbrief_id, ]); } diff --git a/app/Http/Controllers/Frontend/ProfileController.php b/app/Http/Controllers/Frontend/ProfileController.php index 2ef5f421..a0d0bc05 100644 --- a/app/Http/Controllers/Frontend/ProfileController.php +++ b/app/Http/Controllers/Frontend/ProfileController.php @@ -3,13 +3,13 @@ namespace App\Http\Controllers\Frontend; use App\Contracts\Controller; -use App\Facades\Utils; use App\Models\User; use App\Repositories\AirlineRepository; use App\Repositories\AirportRepository; use App\Repositories\UserRepository; use App\Support\Countries; use App\Support\Timezonelist; +use App\Support\Utils; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -79,7 +79,7 @@ class ProfileController extends Controller /** * @param $id * - * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + * @return mixed */ public function show($id) { diff --git a/app/Http/Controllers/Frontend/SimBriefController.php b/app/Http/Controllers/Frontend/SimBriefController.php new file mode 100644 index 00000000..7b155db7 --- /dev/null +++ b/app/Http/Controllers/Frontend/SimBriefController.php @@ -0,0 +1,166 @@ +flightRepo = $flightRepo; + $this->simBriefSvc = $simBriefSvc; + } + + /** + * Show the main OFP form + * + * @param Request $request + * + * @throws \Exception + * + * @return mixed + */ + public function generate(Request $request) + { + $flight_id = $request->input('flight_id'); + $flight = $this->flightRepo->find($flight_id); + if (!$flight) { + flash()->error('Unknown flight'); + return redirect(route('frontend.flights.index')); + } + + $apiKey = setting('simbrief.api_key'); + if (empty($apiKey)) { + flash()->error('Invalid SimBrief API key!'); + return redirect(route('frontend.flights.index')); + } + + $user = Auth::user(); + $simbrief = SimBrief::select('id')->where([ + 'flight_id' => $flight_id, + 'user_id' => $user->id, + ])->first(); + + if ($simbrief) { + return redirect(route('frontend.simbrief.briefing', [$simbrief->id])); + } + + return view('flights.simbrief_form', [ + 'flight' => $flight, + ]); + } + + /** + * Show the briefing + * + * @param string $id The OFP ID + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + */ + public function briefing($id) + { + $simbrief = SimBrief::find($id); + if (!$simbrief) { + flash()->error('SimBrief briefing not found'); + return redirect(route('frontend.flights.index')); + } + + return view('flights.simbrief_briefing', [ + 'simbrief' => $simbrief, + ]); + } + + /** + * Create a prefile of this PIREP with a given OFP. Then redirect the + * user to the newly prefiled PIREP + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function prefile(Request $request) + { + $sb = SimBrief::find($request->id); + if (!$sb) { + return redirect(route('frontend.flights.index')); + } + + // Redirect to the prefile page, with the flight_id and a simbrief_id + $rd = route('frontend.pireps.create').'?sb_id='.$sb->id; + return redirect($rd); + } + + /** + * Cancel the SimBrief request + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function cancel(Request $request) + { + $sb = SimBrief::find($request->id); + if (!$sb) { + $sb->delete(); + } + + return redirect(route('frontend.simbrief.prefile', ['id' => $request->id])); + } + + /** + * Check whether the OFP was generated. Pass in two items, the flight_id and ofp_id + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\JsonResponse + */ + public function check_ofp(Request $request) + { + $ofp_id = $request->input('ofp_id'); + $flight_id = $request->input('flight_id'); + + $simbrief = $this->simBriefSvc->checkForOfp(Auth::user()->id, $ofp_id, $flight_id); + if ($simbrief === null) { + $error = new AssetNotFound(new Exception('Simbrief OFP not found')); + return $error->getResponse(); + } + + return response()->json([ + 'id' => $simbrief->id, + ]); + } + + /** + * Generate the API code + * + * @param \Illuminate\Http\Request $request + * + * @throws \Exception + * + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function api_code(Request $request) + { + $apiKey = setting('simbrief.api_key', null); + if (empty($apiKey)) { + flash()->error('Invalid SimBrief API key!'); + return redirect(route('frontend.flights.index')); + } + + $api_code = md5($apiKey.$request->input('api_req')); + + return response()->json([ + 'api_code' => $api_code, + ]); + } +} diff --git a/app/Http/Controllers/Frontend/UserController.php b/app/Http/Controllers/Frontend/UserController.php index 5942f1ca..bb8303f0 100644 --- a/app/Http/Controllers/Frontend/UserController.php +++ b/app/Http/Controllers/Frontend/UserController.php @@ -7,24 +7,19 @@ use App\Models\Enums\UserState; use App\Repositories\Criteria\WhereCriteria; use App\Repositories\UserRepository; use Illuminate\Http\Request; -use Log; +use Illuminate\Support\Facades\Log; +use League\ISO3166\ISO3166; use Prettus\Repository\Exceptions\RepositoryException; -/** - * Class UserController - */ class UserController extends Controller { private $userRepo; /** - * UserController constructor. - * * @param UserRepository $userRepo */ - public function __construct( - UserRepository $userRepo - ) { + public function __construct(UserRepository $userRepo) + { $this->userRepo = $userRepo; } @@ -49,11 +44,11 @@ class UserController extends Controller $users = $this->userRepo ->with(['airline', 'current_airport']) - ->orderBy('name', 'desc') + ->orderBy('pilot_id', 'asc') ->paginate(); return view('users.index', [ - 'country' => new \League\ISO3166\ISO3166(), + 'country' => new ISO3166(), 'users' => $users, ]); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 4fc5cadb..c04016be 100755 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -7,6 +7,8 @@ use App\Http\Middleware\EncryptCookies; use App\Http\Middleware\InstalledCheck; use App\Http\Middleware\JsonResponse; use App\Http\Middleware\RedirectIfAuthenticated; +use App\Http\Middleware\SetActiveTheme; +use App\Http\Middleware\TrustProxies; use App\Http\Middleware\UpdatePending; use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Auth\Middleware\Authorize; @@ -23,6 +25,7 @@ use Illuminate\View\Middleware\ShareErrorsFromSession; class Kernel extends HttpKernel { protected $middleware = [ + TrustProxies::class, CheckForMaintenanceMode::class, TrimStrings::class, ConvertEmptyStringsToNull::class, @@ -52,6 +55,7 @@ class Kernel extends HttpKernel 'can' => Authorize::class, 'guest' => RedirectIfAuthenticated::class, 'json' => JsonResponse::class, + 'theme' => SetActiveTheme::class, 'throttle' => ThrottleRequests::class, 'update_pending' => UpdatePending::class, ]; diff --git a/app/Http/Middleware/InstalledCheck.php b/app/Http/Middleware/InstalledCheck.php index d139baf1..dc2e48d7 100644 --- a/app/Http/Middleware/InstalledCheck.php +++ b/app/Http/Middleware/InstalledCheck.php @@ -23,7 +23,7 @@ class InstalledCheck implements Middleware && !$request->is(['install', 'install/*']) && !$request->is(['update', 'update/*']) ) { - return view('system.errors.not_installed'); + return response(view('system.errors.not_installed')); } return $next($request); diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 00000000..c38a6c35 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,40 @@ +setTrustedProxies([$request->getClientIp()], $this->getTrustedHeaderNames()); + $this->setTrustedProxyIpAddresses($request); + + return $next($request); + } +} diff --git a/app/Http/Requests/Acars/CommentRequest.php b/app/Http/Requests/Acars/CommentRequest.php index 35164a9c..d2b09711 100644 --- a/app/Http/Requests/Acars/CommentRequest.php +++ b/app/Http/Requests/Acars/CommentRequest.php @@ -8,11 +8,9 @@ class CommentRequest extends FormRequest { public function rules(): array { - $rules = [ + return [ 'comment' => 'required', 'created_at' => 'sometimes|date', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/FieldsRequest.php b/app/Http/Requests/Acars/FieldsRequest.php index 76d0a935..fa8344ab 100644 --- a/app/Http/Requests/Acars/FieldsRequest.php +++ b/app/Http/Requests/Acars/FieldsRequest.php @@ -4,9 +4,6 @@ namespace App\Http\Requests\Acars; use App\Contracts\FormRequest; -/** - * Class PrefileRequest - */ class FieldsRequest extends FormRequest { public function rules(): array diff --git a/app/Http/Requests/Acars/FileRequest.php b/app/Http/Requests/Acars/FileRequest.php index 63d9f12c..8a5b0f88 100644 --- a/app/Http/Requests/Acars/FileRequest.php +++ b/app/Http/Requests/Acars/FileRequest.php @@ -16,7 +16,7 @@ class FileRequest extends FormRequest public function rules(): array { - $rules = [ + return [ 'distance' => 'required|numeric', 'flight_time' => 'required|integer', 'fuel_used' => 'required|numeric', @@ -25,8 +25,8 @@ class FileRequest extends FormRequest 'aircraft_id' => 'sometimes|exists:aircraft,id', 'flight_number' => 'sometimes', 'flight_type' => 'sometimes', - 'dpt_airport_id' => 'sometimes|size:4', - 'arr_airport_id' => 'sometimes|size:4', + 'dpt_airport_id' => 'sometimes', + 'arr_airport_id' => 'sometimes', 'route_code' => 'sometimes', 'route_leg' => 'sometimes', 'planned_distance' => 'sometimes|numeric', @@ -48,7 +48,5 @@ class FileRequest extends FormRequest 'fares.*.id' => 'required', 'fares.*.count' => 'required|numeric', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/LogRequest.php b/app/Http/Requests/Acars/LogRequest.php index daaef0e0..2c8f6867 100644 --- a/app/Http/Requests/Acars/LogRequest.php +++ b/app/Http/Requests/Acars/LogRequest.php @@ -16,14 +16,12 @@ class LogRequest extends FormRequest public function rules(): array { - $rules = [ + return [ 'logs' => 'required|array', 'logs.*.log' => 'required', 'logs.*.lat' => 'sometimes|numeric', 'logs.*.lon' => 'sometimes|numeric', 'logs.*.created_at' => 'sometimes|date', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/PositionRequest.php b/app/Http/Requests/Acars/PositionRequest.php index 89d79acf..fdcb4a4b 100644 --- a/app/Http/Requests/Acars/PositionRequest.php +++ b/app/Http/Requests/Acars/PositionRequest.php @@ -19,7 +19,7 @@ class PositionRequest extends FormRequest public function rules(): array { - $rules = [ + return [ 'positions' => 'required|array', 'positions.*.lat' => 'required|numeric', 'positions.*.lon' => 'required|numeric', @@ -36,7 +36,5 @@ class PositionRequest extends FormRequest 'positions.*.sim_time' => 'sometimes|date', 'positions.*.created_at' => 'sometimes|date', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/PrefileRequest.php b/app/Http/Requests/Acars/PrefileRequest.php index e69e4eb1..508732e1 100644 --- a/app/Http/Requests/Acars/PrefileRequest.php +++ b/app/Http/Requests/Acars/PrefileRequest.php @@ -8,15 +8,15 @@ class PrefileRequest extends FormRequest { public function rules(): array { - $rules = [ + return [ 'airline_id' => 'required|exists:airlines,id', 'aircraft_id' => 'required|exists:aircraft,id', 'flight_id' => 'sometimes|exists:flights,id', 'flight_number' => 'required', - 'dpt_airport_id' => 'required|size:4', - 'arr_airport_id' => 'required|size:4', + 'dpt_airport_id' => 'required', + 'arr_airport_id' => 'required', 'source_name' => 'required', - 'alt_airport_id' => 'sometimes|size:4', + 'alt_airport_id' => 'sometimes', 'status' => 'sometimes', 'level' => 'nullable|numeric', 'flight_type' => 'sometimes', @@ -41,7 +41,5 @@ class PrefileRequest extends FormRequest 'fares.*.id' => 'required', 'fares.*.count' => 'required|numeric', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/RouteRequest.php b/app/Http/Requests/Acars/RouteRequest.php index bc61e813..01733a2b 100644 --- a/app/Http/Requests/Acars/RouteRequest.php +++ b/app/Http/Requests/Acars/RouteRequest.php @@ -16,7 +16,7 @@ class RouteRequest extends FormRequest public function rules(): array { - $rules = [ + return [ 'route' => 'required|array', 'route.*.name' => 'required', 'route.*.order' => 'required|int', @@ -24,7 +24,5 @@ class RouteRequest extends FormRequest 'route.*.lat' => 'required|numeric', 'route.*.lon' => 'required|numeric', ]; - - return $rules; } } diff --git a/app/Http/Requests/Acars/UpdateRequest.php b/app/Http/Requests/Acars/UpdateRequest.php index 945684b2..1fca9df9 100644 --- a/app/Http/Requests/Acars/UpdateRequest.php +++ b/app/Http/Requests/Acars/UpdateRequest.php @@ -16,13 +16,13 @@ class UpdateRequest extends FormRequest public function rules(): array { - $rules = [ + return [ 'airline_id' => 'nullable|exists:airlines,id', 'aircraft_id' => 'nullable|exists:aircraft,id', 'flight_id' => 'sometimes|nullable|exists:flights,id', 'flight_number' => 'sometimes|required', - 'dpt_airport_id' => 'sometimes|required|size:4', - 'arr_airport_id' => 'sometimes|required|size:4', + 'dpt_airport_id' => 'sometimes|required', + 'arr_airport_id' => 'sometimes|required', 'route_code' => 'nullable', 'route_leg' => 'nullable', 'distance' => 'sometimes|numeric', @@ -50,7 +50,5 @@ class UpdateRequest extends FormRequest 'fares.*.id' => 'required', 'fares.*.count' => 'required|numeric', ]; - - return $rules; } } diff --git a/app/Http/Requests/CreateAircraftRequest.php b/app/Http/Requests/CreateAircraftRequest.php index 6f8fa34d..c955d9e1 100644 --- a/app/Http/Requests/CreateAircraftRequest.php +++ b/app/Http/Requests/CreateAircraftRequest.php @@ -2,8 +2,8 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Aircraft; -use Illuminate\Foundation\Http\FormRequest; class CreateAircraftRequest extends FormRequest { diff --git a/app/Http/Requests/CreateAirlineRequest.php b/app/Http/Requests/CreateAirlineRequest.php index 6dd8fae1..b2c8c240 100644 --- a/app/Http/Requests/CreateAirlineRequest.php +++ b/app/Http/Requests/CreateAirlineRequest.php @@ -2,17 +2,12 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Airline; -use Illuminate\Foundation\Http\FormRequest; class CreateAirlineRequest extends FormRequest { - public function authorize() - { - return true; - } - - public function rules() + public function rules(): array { $rules = Airline::$rules; $rules['iata'] .= '|unique:airlines'; diff --git a/app/Http/Requests/CreateAirportRequest.php b/app/Http/Requests/CreateAirportRequest.php index 5894cc1d..d1e8dd95 100644 --- a/app/Http/Requests/CreateAirportRequest.php +++ b/app/Http/Requests/CreateAirportRequest.php @@ -2,24 +2,11 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Airport; -use Illuminate\Foundation\Http\FormRequest; -/** - * Class CreateAirportRequest - */ class CreateAirportRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize(): bool - { - return true; - } - /** * Get the validation rules that apply to the request. * diff --git a/app/Http/Requests/CreateAwardRequest.php b/app/Http/Requests/CreateAwardRequest.php index 540086ae..11c80f2c 100755 --- a/app/Http/Requests/CreateAwardRequest.php +++ b/app/Http/Requests/CreateAwardRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Award; -use Illuminate\Foundation\Http\FormRequest; class CreateAwardRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Award::$rules; } diff --git a/app/Http/Requests/CreateFareRequest.php b/app/Http/Requests/CreateFareRequest.php index 7b01a635..d3474796 100644 --- a/app/Http/Requests/CreateFareRequest.php +++ b/app/Http/Requests/CreateFareRequest.php @@ -2,21 +2,11 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Fare; -use Illuminate\Foundation\Http\FormRequest; class CreateFareRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize(): bool - { - return true; - } - /** * Get the validation rules that apply to the request. * diff --git a/app/Http/Requests/CreateFlightRequest.php b/app/Http/Requests/CreateFlightRequest.php index 7c7a945e..0891fa8b 100644 --- a/app/Http/Requests/CreateFlightRequest.php +++ b/app/Http/Requests/CreateFlightRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Flight; -use Illuminate\Foundation\Http\FormRequest; class CreateFlightRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Flight::$rules; } diff --git a/app/Http/Requests/CreatePageRequest.php b/app/Http/Requests/CreatePageRequest.php new file mode 100644 index 00000000..6ea55d87 --- /dev/null +++ b/app/Http/Requests/CreatePageRequest.php @@ -0,0 +1,19 @@ + 'required', + 'email' => 'required|email|unique:users,email', + 'airline_id' => 'required', + 'home_airport_id' => 'required', + 'password' => 'required|confirmed', + 'timezone' => 'required', + 'country' => 'required', + 'transfer_time' => 'sometimes|integer|min:0', + 'toc_accepted' => 'accepted', + ]; - $rules['email'] .= '|unique:users,email'; - $rules['pilot_id'] .= '|unique:users,pilot_id'; + if (config('captcha.enabled')) { + $rules['g-recaptcha-response'] = 'required|captcha'; + } return $rules; } diff --git a/app/Http/Requests/ImportRequest.php b/app/Http/Requests/ImportRequest.php index fc60f04b..aac7257e 100644 --- a/app/Http/Requests/ImportRequest.php +++ b/app/Http/Requests/ImportRequest.php @@ -2,7 +2,7 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +use App\Contracts\FormRequest; use Illuminate\Http\Request; /** @@ -24,11 +24,6 @@ class ImportRequest extends FormRequest \Validator::make($request->all(), static::$rules)->validate(); } - public function authorize(): bool - { - return true; - } - public function rules(): array { return static::$rules; diff --git a/app/Http/Requests/UpdateAircraftRequest.php b/app/Http/Requests/UpdateAircraftRequest.php index 1f8a00de..541a401e 100644 --- a/app/Http/Requests/UpdateAircraftRequest.php +++ b/app/Http/Requests/UpdateAircraftRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Aircraft; -use Illuminate\Foundation\Http\FormRequest; class UpdateAircraftRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Aircraft::$rules; } diff --git a/app/Http/Requests/UpdateAirlineRequest.php b/app/Http/Requests/UpdateAirlineRequest.php index b84bda48..e39abaf2 100644 --- a/app/Http/Requests/UpdateAirlineRequest.php +++ b/app/Http/Requests/UpdateAirlineRequest.php @@ -2,28 +2,22 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Airline; -use Illuminate\Foundation\Http\FormRequest; class UpdateAirlineRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { + $rules = Airline::$rules; + $rules['iata'] .= '|unique:airlines,iata,'.$this->id.',id'; + $rules['icao'] .= '|unique:airlines,icao,'.$this->id.',id'; + return Airline::$rules; } } diff --git a/app/Http/Requests/UpdateAirportRequest.php b/app/Http/Requests/UpdateAirportRequest.php index bf635d41..ed70e1cd 100644 --- a/app/Http/Requests/UpdateAirportRequest.php +++ b/app/Http/Requests/UpdateAirportRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Airport; -use Illuminate\Foundation\Http\FormRequest; class UpdateAirportRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Airport::$rules; } diff --git a/app/Http/Requests/UpdateAwardRequest.php b/app/Http/Requests/UpdateAwardRequest.php index 252361ab..0585e331 100755 --- a/app/Http/Requests/UpdateAwardRequest.php +++ b/app/Http/Requests/UpdateAwardRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Award; -use Illuminate\Foundation\Http\FormRequest; class UpdateAwardRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Award::$rules; } diff --git a/app/Http/Requests/UpdateFareRequest.php b/app/Http/Requests/UpdateFareRequest.php index 5ce7d6d3..89533fb9 100644 --- a/app/Http/Requests/UpdateFareRequest.php +++ b/app/Http/Requests/UpdateFareRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Fare; -use Illuminate\Foundation\Http\FormRequest; class UpdateFareRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Fare::$rules; } diff --git a/app/Http/Requests/UpdateFilesRequest.php b/app/Http/Requests/UpdateFilesRequest.php index fa183d3e..931e8fd2 100644 --- a/app/Http/Requests/UpdateFilesRequest.php +++ b/app/Http/Requests/UpdateFilesRequest.php @@ -2,23 +2,10 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +use App\Contracts\FormRequest; -/** - * Class CreateFilesRequest - */ class UpdateFilesRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize(): bool - { - return true; - } - /** * Get the validation rules that apply to the request. * @@ -29,8 +16,6 @@ class UpdateFilesRequest extends FormRequest return [ 'name' => 'required', 'file' => 'nullable|file', - - //'files.*' => 'required|file', ]; } } diff --git a/app/Http/Requests/UpdateFlightRequest.php b/app/Http/Requests/UpdateFlightRequest.php index 58596fa8..4607ca75 100644 --- a/app/Http/Requests/UpdateFlightRequest.php +++ b/app/Http/Requests/UpdateFlightRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Flight; -use Illuminate\Foundation\Http\FormRequest; class UpdateFlightRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Flight::$rules; } diff --git a/app/Http/Requests/UpdatePageRequest.php b/app/Http/Requests/UpdatePageRequest.php new file mode 100644 index 00000000..4c2a0721 --- /dev/null +++ b/app/Http/Requests/UpdatePageRequest.php @@ -0,0 +1,25 @@ + [ + 'required', + Rule::unique('pages')->ignore($this->id, 'id'), + ], + 'body' => 'required', + ]; + } +} diff --git a/app/Http/Requests/UpdatePirepFieldRequest.php b/app/Http/Requests/UpdatePirepFieldRequest.php index c70b5385..6f576cea 100644 --- a/app/Http/Requests/UpdatePirepFieldRequest.php +++ b/app/Http/Requests/UpdatePirepFieldRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\PirepField; -use Illuminate\Foundation\Http\FormRequest; class UpdatePirepFieldRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return PirepField::$rules; } diff --git a/app/Http/Requests/UpdatePirepRequest.php b/app/Http/Requests/UpdatePirepRequest.php index 56e1530a..8ec7a267 100644 --- a/app/Http/Requests/UpdatePirepRequest.php +++ b/app/Http/Requests/UpdatePirepRequest.php @@ -2,29 +2,19 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Pirep; use App\Repositories\PirepFieldRepository; -use Illuminate\Foundation\Http\FormRequest; -use Log; +use Illuminate\Support\Facades\Log; class UpdatePirepRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { // Don't run validations if it's just being saved $action = strtolower(request('submit', 'submit')); diff --git a/app/Http/Requests/UpdateRankRequest.php b/app/Http/Requests/UpdateRankRequest.php index ab83644e..607633ea 100644 --- a/app/Http/Requests/UpdateRankRequest.php +++ b/app/Http/Requests/UpdateRankRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Rank; -use Illuminate\Foundation\Http\FormRequest; class UpdateRankRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Rank::$rules; } diff --git a/app/Http/Requests/UpdateRoleRequest.php b/app/Http/Requests/UpdateRoleRequest.php index 67eb6629..ce121627 100644 --- a/app/Http/Requests/UpdateRoleRequest.php +++ b/app/Http/Requests/UpdateRoleRequest.php @@ -2,24 +2,14 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Role; -use Illuminate\Foundation\Http\FormRequest; /** * @property array permissions */ class UpdateRoleRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize(): bool - { - return true; - } - /** * Get the validation rules that apply to the request. * diff --git a/app/Http/Requests/UpdateSubfleetRequest.php b/app/Http/Requests/UpdateSubfleetRequest.php index 81b08e8a..04a2e8fb 100644 --- a/app/Http/Requests/UpdateSubfleetRequest.php +++ b/app/Http/Requests/UpdateSubfleetRequest.php @@ -2,27 +2,17 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\Subfleet; -use Illuminate\Foundation\Http\FormRequest; class UpdateSubfleetRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { return Subfleet::$rules; } diff --git a/app/Http/Requests/UpdateUserRequest.php b/app/Http/Requests/UpdateUserRequest.php index 8be4df02..16ee4b4b 100644 --- a/app/Http/Requests/UpdateUserRequest.php +++ b/app/Http/Requests/UpdateUserRequest.php @@ -2,28 +2,18 @@ namespace App\Http\Requests; +use App\Contracts\FormRequest; use App\Models\User; -use Illuminate\Foundation\Http\FormRequest; use function request; class UpdateUserRequest extends FormRequest { - /** - * Determine if the user is authorized to make this request. - * - * @return bool - */ - public function authorize() - { - return true; - } - /** * Get the validation rules that apply to the request. * * @return array */ - public function rules() + public function rules(): array { $rules = User::$rules; diff --git a/app/Http/Resources/Acars.php b/app/Http/Resources/Acars.php index 69c35442..7ef52543 100644 --- a/app/Http/Resources/Acars.php +++ b/app/Http/Resources/Acars.php @@ -2,10 +2,14 @@ namespace App\Http\Resources; +use App\Contracts\Resource; use App\Support\Units\Distance; use App\Support\Units\Fuel; -class Acars extends Response +/** + * @mixin \App\Models\Acars + */ +class Acars extends Resource { /** * Transform the resource into an array. @@ -30,6 +34,8 @@ class Acars extends Response $fuel = new Fuel($fuel, config('phpvms.internal_units.fuel')); $res['fuel'] = $fuel->getResponseUnits(); + $res['pirep'] = Pirep::make($this->whenLoaded('pirep')); + return $res; } } diff --git a/app/Http/Resources/AcarsLog.php b/app/Http/Resources/AcarsLog.php index 9abbc044..1982ee31 100644 --- a/app/Http/Resources/AcarsLog.php +++ b/app/Http/Resources/AcarsLog.php @@ -2,10 +2,12 @@ namespace App\Http\Resources; +use App\Contracts\Resource; + /** * ACARS table but only include the fields for the routes * Class AcarsRoute */ -class AcarsLog extends Response +class AcarsLog extends Resource { } diff --git a/app/Http/Resources/AcarsRoute.php b/app/Http/Resources/AcarsRoute.php index ac53cf51..de23bde4 100644 --- a/app/Http/Resources/AcarsRoute.php +++ b/app/Http/Resources/AcarsRoute.php @@ -2,10 +2,12 @@ namespace App\Http\Resources; +use App\Contracts\Resource; + /** * ACARS table but only include the fields for the routes * Class AcarsRoute */ -class AcarsRoute extends Response +class AcarsRoute extends Resource { } diff --git a/app/Http/Resources/Aircraft.php b/app/Http/Resources/Aircraft.php index 2999ff53..86d6c225 100644 --- a/app/Http/Resources/Aircraft.php +++ b/app/Http/Resources/Aircraft.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; -class Aircraft extends Response +use App\Contracts\Resource; + +class Aircraft extends Resource { } diff --git a/app/Http/Resources/Airline.php b/app/Http/Resources/Airline.php index a5f7d914..58156f05 100644 --- a/app/Http/Resources/Airline.php +++ b/app/Http/Resources/Airline.php @@ -2,7 +2,9 @@ namespace App\Http\Resources; -class Airline extends Response +use App\Contracts\Resource; + +class Airline extends Resource { public function toArray($request) { diff --git a/app/Http/Resources/Airport.php b/app/Http/Resources/Airport.php index e2aa251f..3a3f752e 100644 --- a/app/Http/Resources/Airport.php +++ b/app/Http/Resources/Airport.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; -class Airport extends Response +use App\Contracts\Resource; + +class Airport extends Resource { } diff --git a/app/Http/Resources/AirportDistance.php b/app/Http/Resources/AirportDistance.php index 1e2a5cac..41e01b01 100644 --- a/app/Http/Resources/AirportDistance.php +++ b/app/Http/Resources/AirportDistance.php @@ -2,7 +2,9 @@ namespace App\Http\Resources; -class AirportDistance extends Response +use App\Contracts\Resource; + +class AirportDistance extends Resource { public function toArray($request) { diff --git a/app/Http/Resources/Award.php b/app/Http/Resources/Award.php index deeb29ee..368615e4 100755 --- a/app/Http/Resources/Award.php +++ b/app/Http/Resources/Award.php @@ -2,7 +2,9 @@ namespace App\Http\Resources; -class Award extends Response +use App\Contracts\Resource; + +class Award extends Resource { public function toArray($request) { diff --git a/app/Http/Resources/Bid.php b/app/Http/Resources/Bid.php index b4d007a0..6923e17a 100644 --- a/app/Http/Resources/Bid.php +++ b/app/Http/Resources/Bid.php @@ -2,7 +2,9 @@ namespace App\Http\Resources; -class Bid extends Response +use App\Contracts\Resource; + +class Bid extends Resource { public function toArray($request) { diff --git a/app/Http/Resources/Fare.php b/app/Http/Resources/Fare.php new file mode 100644 index 00000000..a2f290f0 --- /dev/null +++ b/app/Http/Resources/Fare.php @@ -0,0 +1,26 @@ + $this->id, + 'code' => $this->code, + 'name' => $this->name, + 'price' => $this->price, + 'cost' => $this->cost, + 'capacity' => $this->capacity, + 'type' => $this->type, + 'notes' => $this->notes, + 'active' => $this->active, + ]; + } +} diff --git a/app/Http/Resources/Flight.php b/app/Http/Resources/Flight.php index c18918d7..06d17c6e 100644 --- a/app/Http/Resources/Flight.php +++ b/app/Http/Resources/Flight.php @@ -2,19 +2,29 @@ namespace App\Http\Resources; +use App\Contracts\Resource; +use App\Http\Resources\SimBrief as SimbriefResource; use App\Support\Units\Distance; +use stdClass; -class Flight extends Response +/** + * @mixin \App\Models\Flight + */ +class Flight extends Resource { /** * Set the fields on the flight object - * - * @return array */ private function setFields() { + /** @var \Illuminate\Support\Collection $field_values */ + $field_values = $this->field_values; + if (empty($field_values) || $field_values->count() === 0) { + return new stdClass(); + } + $fields = []; - foreach ($this->field_values as $field) { + foreach ($field_values as $field) { $fields[$field->name] = $field->value; } @@ -35,13 +45,24 @@ class Flight extends Response $res['ident'] = $this->ident; + if (empty($res['load_factor'])) { + $res['load_factor'] = setting('flights.default_load_factor'); + } + + if (empty($res['load_factor_variance'])) { + $res['load_factor_variance'] = setting('flights.load_factor_variance'); + } + $distance = new Distance($res['distance'], config('phpvms.internal_units.distance')); $res['distance'] = $distance->getResponseUnits(); $res['airline'] = new Airline($this->airline); - $res['subfleets'] = Subfleet::collection($this->subfleets); + $res['subfleets'] = Subfleet::collection($this->whenLoaded('subfleets')); $res['fields'] = $this->setFields(); + // Simbrief info + $res['simbrief'] = new SimbriefResource($this->whenLoaded('simbrief')); + return $res; } } diff --git a/app/Http/Resources/JournalTransaction.php b/app/Http/Resources/JournalTransaction.php index 63a92260..e20bba2f 100644 --- a/app/Http/Resources/JournalTransaction.php +++ b/app/Http/Resources/JournalTransaction.php @@ -2,7 +2,9 @@ namespace App\Http\Resources; -class JournalTransaction extends Response +use App\Contracts\Resource; + +class JournalTransaction extends Resource { public function toArray($request) { diff --git a/app/Http/Resources/Navdata.php b/app/Http/Resources/Navdata.php index 1087c703..e75f6f7b 100644 --- a/app/Http/Resources/Navdata.php +++ b/app/Http/Resources/Navdata.php @@ -2,8 +2,8 @@ namespace App\Http\Resources; +use App\Contracts\Resource; use App\Models\Enums\NavaidType; -use Illuminate\Http\Resources\Json\Resource; class Navdata extends Resource { diff --git a/app/Http/Resources/News.php b/app/Http/Resources/News.php index 8fd3ea49..ecf69c37 100644 --- a/app/Http/Resources/News.php +++ b/app/Http/Resources/News.php @@ -2,11 +2,8 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; -/** - * Class Response - */ class News extends Resource { /** diff --git a/app/Http/Resources/Pirep.php b/app/Http/Resources/Pirep.php index 2f5de593..502aa071 100644 --- a/app/Http/Resources/Pirep.php +++ b/app/Http/Resources/Pirep.php @@ -2,11 +2,16 @@ namespace App\Http\Resources; +use App\Contracts\Resource; +use App\Http\Resources\SimBrief as SimbriefResource; use App\Models\Enums\PirepStatus; use App\Support\Units\Distance; use App\Support\Units\Fuel; -class Pirep extends Response +/** + * @mixin \App\Models\Pirep + */ +class Pirep extends Resource { /** * Transform the resource into an array. @@ -22,6 +27,7 @@ class Pirep extends Response { $res = parent::toArray($request); $res['ident'] = $this->ident; + $res['status_text'] = PirepStatus::label($this->status); // Set these to the response units if (!array_key_exists('distance', $res)) { @@ -57,24 +63,22 @@ class Pirep extends Response $res['block_off_time'] = $this->block_off_time->toIso8601ZuluString(); } - $res['status_text'] = PirepStatus::label($this->status); - $res['airline'] = new Airline($this->airline); $res['dpt_airport'] = new Airport($this->dpt_airport); $res['arr_airport'] = new Airport($this->arr_airport); - $res['position'] = new Acars($this->position); - $res['comments'] = PirepComment::collection($this->comments); - $res['user'] = [ - 'id' => $this->user->id, - 'name' => $this->user->name, - 'home_airport_id' => $this->user->home_airport_id, - 'curr_airport_id' => $this->user->curr_airport_id, - ]; + $res['position'] = Acars::make($this->whenLoaded('position')); + $res['comments'] = PirepComment::collection($this->whenLoaded('comments')); + $res['user'] = User::make($this->whenLoaded('user')); + + $res['flight'] = Flight::make($this->whenLoaded('flight')); // format to kvp $res['fields'] = new PirepFieldCollection($this->fields); + // Simbrief info + $res['simbrief'] = new SimbriefResource($this->whenLoaded('simbrief')); + return $res; } } diff --git a/app/Http/Resources/PirepComment.php b/app/Http/Resources/PirepComment.php index ff0eabaa..2a3407f7 100644 --- a/app/Http/Resources/PirepComment.php +++ b/app/Http/Resources/PirepComment.php @@ -2,10 +2,10 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; /** - * Class Response + * @mixin \App\Models\PirepComment */ class PirepComment extends Resource { @@ -18,6 +18,10 @@ class PirepComment extends Resource */ public function toArray($request) { + if (!$this->user) { + return []; + } + $user = $this->user; return [ diff --git a/app/Http/Resources/Rank.php b/app/Http/Resources/Rank.php index 4d3d0777..9e17f7ec 100644 --- a/app/Http/Resources/Rank.php +++ b/app/Http/Resources/Rank.php @@ -2,7 +2,7 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; class Rank extends Resource { diff --git a/app/Http/Resources/Setting.php b/app/Http/Resources/Setting.php index c22b2373..a6834a1d 100644 --- a/app/Http/Resources/Setting.php +++ b/app/Http/Resources/Setting.php @@ -2,7 +2,7 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; class Setting extends Resource { diff --git a/app/Http/Resources/SimBrief.php b/app/Http/Resources/SimBrief.php new file mode 100644 index 00000000..fc0fef62 --- /dev/null +++ b/app/Http/Resources/SimBrief.php @@ -0,0 +1,19 @@ + $this->id, + 'url' => url(route('api.flights.briefing', ['id' => $this->flight_id])), + ]; + } +} diff --git a/app/Http/Resources/Subfleet.php b/app/Http/Resources/Subfleet.php index 362cf9a8..263dae98 100644 --- a/app/Http/Resources/Subfleet.php +++ b/app/Http/Resources/Subfleet.php @@ -2,13 +2,14 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; class Subfleet extends Resource { public function toArray($request) { $res = parent::toArray($request); + $res['fares'] = Fare::collection($this->fares); $res['aircraft'] = Aircraft::collection($this->aircraft); return $res; diff --git a/app/Http/Resources/User.php b/app/Http/Resources/User.php index 5e0e1dd8..147dec2d 100644 --- a/app/Http/Resources/User.php +++ b/app/Http/Resources/User.php @@ -2,33 +2,36 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; +/** + * @mixin \App\Models\User + */ class User extends Resource { public function toArray($request) { - return [ + $res = [ 'id' => $this->id, 'pilot_id' => $this->pilot_id, 'ident' => $this->ident, 'name' => $this->name, 'email' => $this->email, - 'apikey' => $this->apikey, + 'avatar' => $this->resolveAvatarUrl(), 'rank_id' => $this->rank_id, 'home_airport' => $this->home_airport_id, 'curr_airport' => $this->curr_airport_id, 'last_pirep_id' => $this->last_pirep_id, - 'flights' => $this->flight, + 'flights' => $this->flights, 'flight_time' => $this->flight_time, - 'balance' => $this->balance, 'timezone' => $this->timezone, - 'status' => $this->status, 'state' => $this->state, - - 'airline' => Airline::make($this->airline), - 'bids' => UserBid::collection($this->bids), - 'rank' => Rank::make($this->rank), ]; + + $res['airline'] = Airline::make($this->whenLoaded('airline')); + $res['bids'] = UserBid::collection($this->whenLoaded('bids')); + $res['rank'] = Rank::make($this->whenLoaded('rank')); + + return $res; } } diff --git a/app/Http/Resources/UserBid.php b/app/Http/Resources/UserBid.php index 59207823..dfaa0bb2 100644 --- a/app/Http/Resources/UserBid.php +++ b/app/Http/Resources/UserBid.php @@ -2,19 +2,22 @@ namespace App\Http\Resources; -use Illuminate\Http\Resources\Json\Resource; +use App\Contracts\Resource; +/** + * @mixin \App\Models\Bid + */ class UserBid extends Resource { public function toArray($request) { return [ - 'id' => $this->id, - 'user_id' => $this->user_id, - 'flight_id' => $this->flight_id, - 'flights' => Flight::collection($this->whenLoaded('flight')), - //'created_at' => $this->created_at, - //'updated_at' => $this->updated_at, + 'id' => $this->id, + 'user_id' => $this->user_id, + 'flight_id' => $this->flight_id, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'flight' => new Flight($this->whenLoaded('flight')), ]; } } diff --git a/app/Http/Routes/admin.php b/app/Http/Routes/admin.php deleted file mode 100644 index 976fe799..00000000 --- a/app/Http/Routes/admin.php +++ /dev/null @@ -1,215 +0,0 @@ - 'Admin', - 'prefix' => 'admin', - 'as' => 'admin.', - 'middleware' => ['auth', 'ability:admin,admin-access'], - ], - static function () { - // CRUD for airlines - Route::resource('airlines', 'AirlinesController')->middleware('ability:admin,airlines'); - - // CRUD for roles - Route::resource('roles', 'RolesController')->middleware('role:admin'); - - Route::get('airports/export', 'AirportController@export') - ->name('airports.export') - ->middleware('ability:admin,airports'); - - Route::match(['get', 'post', 'put'], 'airports/fuel', 'AirportController@fuel') - ->middleware('ability:admin,airports'); - - Route::match(['get', 'post'], 'airports/import', 'AirportController@import') - ->name('airports.import')->middleware('ability:admin,airports'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'airports/{id}/expenses', - 'AirportController@expenses' - )->middleware('ability:admin,airports'); - - Route::resource('airports', 'AirportController')->middleware('ability:admin,airports'); - - // Awards - Route::resource('awards', 'AwardController')->middleware('ability:admin,awards'); - - // aircraft and fare associations - Route::get('aircraft/export', 'AircraftController@export') - ->name('aircraft.export') - ->middleware('ability:admin,aircraft'); - - Route::match(['get', 'post'], 'aircraft/import', 'AircraftController@import') - ->name('aircraft.import')->middleware('ability:admin,aircraft'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'aircraft/{id}/expenses', - 'AircraftController@expenses' - )->middleware('ability:admin,aircraft'); - - Route::resource('aircraft', 'AircraftController')->middleware('ability:admin,aircraft'); - - // expenses - Route::get('expenses/export', 'ExpenseController@export') - ->name('expenses.export') - ->middleware('ability:admin,finances'); - - Route::match(['get', 'post'], 'expenses/import', 'ExpenseController@import') - ->name('expenses.import') - ->middleware('ability:admin,finances'); - - Route::resource('expenses', 'ExpenseController')->middleware('ability:admin,finances'); - - // fares - Route::get('fares/export', 'FareController@export') - ->name('fares.export') - ->middleware('ability:admin,finances'); - - Route::match(['get', 'post'], 'fares/import', 'FareController@import') - ->name('fares.import')->middleware('ability:admin,finances'); - - Route::resource('fares', 'FareController')->middleware('ability:admin,finances'); - - // files - Route::post('files', 'FileController@store') - ->name('files.store') - ->middleware('ability:admin,files'); - - Route::delete('files/{id}', 'FileController@destroy') - ->name('files.delete') - ->middleware('ability:admin,files'); - - // finances - Route::resource('finances', 'FinanceController')->middleware('ability:admin,finances'); - - // flights and aircraft associations - Route::get('flights/export', 'FlightController@export') - ->name('flights.export') - ->middleware('ability:admin,flights'); - - Route::match(['get', 'post'], 'flights/import', 'FlightController@import') - ->name('flights.import') - ->middleware('ability:admin,flights'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'flights/{id}/fares', - 'FlightController@fares' - )->middleware('ability:admin,flights'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'flights/{id}/fields', - 'FlightController@field_values' - )->middleware('ability:admin,flights'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'flights/{id}/subfleets', - 'FlightController@subfleets' - )->middleware('ability:admin,flights'); - - Route::resource('flights', 'FlightController') - ->middleware('ability:admin,flights'); - - Route::resource('flightfields', 'FlightFieldController') - ->middleware('ability:admin,flights'); - - // pirep related routes - Route::get('pireps/fares', 'PirepController@fares')->middleware('ability:admin,pireps'); - Route::get('pireps/pending', 'PirepController@pending')->middleware('ability:admin,pireps'); - Route::resource('pireps', 'PirepController')->middleware('ability:admin,pireps'); - - Route::match(['get', 'post', 'delete'], 'pireps/{id}/comments', 'PirepController@comments') - ->middleware('ability:admin,pireps'); - - Route::match(['post', 'put'], 'pireps/{id}/status', 'PirepController@status') - ->name('pirep.status') - ->middleware('ability:admin,pireps'); - - Route::resource('pirepfields', 'PirepFieldController') - ->middleware('ability:admin,pireps'); - - // rankings - Route::resource('ranks', 'RankController')->middleware('ability:admin,ranks'); - Route::match( - ['get', 'post', 'put', 'delete'], - 'ranks/{id}/subfleets', - 'RankController@subfleets' - )->middleware('ability:admin,ranks'); - - // settings - Route::match(['get'], 'settings', 'SettingsController@index') - ->middleware('ability:admin,settings'); - - Route::match(['post', 'put'], 'settings', 'SettingsController@update') - ->name('settings.update') - ->middleware('ability:admin,settings'); - - // maintenance - Route::match(['get'], 'maintenance', 'MaintenanceController@index') - ->name('maintenance.index') - ->middleware('ability:admin,maintenance'); - - Route::match(['post'], 'maintenance', 'MaintenanceController@cache') - ->name('maintenance.cache') - ->middleware('ability:admin,maintenance'); - - // subfleet - Route::get('subfleets/export', 'SubfleetController@export') - ->name('subfleets.export') - ->middleware('ability:admin,fleet'); - - Route::match(['get', 'post'], 'subfleets/import', 'SubfleetController@import') - ->name('subfleets.import') - ->middleware('ability:admin,fleet'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'subfleets/{id}/expenses', - 'SubfleetController@expenses' - )->middleware('ability:admin,fleet'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'subfleets/{id}/fares', - 'SubfleetController@fares' - )->middleware('ability:admin,fleet'); - - Route::match( - ['get', 'post', 'put', 'delete'], - 'subfleets/{id}/ranks', - 'SubfleetController@ranks' - )->middleware('ability:admin,fleet'); - - Route::resource('subfleets', 'SubfleetController')->middleware('ability:admin,fleet'); - - Route::resource('users', 'UserController')->middleware('ability:admin,users'); - Route::get( - 'users/{id}/regen_apikey', - 'UserController@regen_apikey' - )->name('users.regen_apikey')->middleware('ability:admin,users'); - - // defaults - Route::get('', ['uses' => 'DashboardController@index']) - ->middleware('update_pending', 'ability:admin,admin-access'); - - Route::get('/', ['uses' => 'DashboardController@index']) - ->middleware('update_pending', 'ability:admin,admin-access'); - - Route::get('dashboard', ['uses' => 'DashboardController@index', 'name' => 'dashboard']) - ->middleware('update_pending', 'ability:admin,admin-access'); - - Route::match( - ['get', 'post', 'delete'], - 'dashboard/news', - ['uses' => 'DashboardController@news'] - )->name('dashboard.news')->middleware('update_pending', 'ability:admin,admin-access'); - } -); diff --git a/app/Http/Routes/api.php b/app/Http/Routes/api.php deleted file mode 100755 index 4069059f..00000000 --- a/app/Http/Routes/api.php +++ /dev/null @@ -1,93 +0,0 @@ - ['api.auth']], function () { - Route::get('airlines', 'AirlineController@index'); - Route::get('airlines/{id}', 'AirlineController@get'); - - Route::get('airports', 'AirportController@index'); - Route::get('airports/hubs', 'AirportController@index_hubs'); - Route::get('airports/{id}', 'AirportController@get'); - Route::get('airports/{id}/lookup', 'AirportController@lookup'); - Route::get('airports/{id}/distance/{to}', 'AirportController@distance'); - - Route::get('fleet', 'FleetController@index'); - Route::get('fleet/aircraft/{id}', 'FleetController@get_aircraft'); - - Route::get('flights', 'FlightController@index'); - Route::get('flights/search', 'FlightController@search'); - Route::get('flights/{id}', 'FlightController@get'); - Route::get('flights/{id}/route', 'FlightController@route'); - - Route::get('pireps', 'UserController@pireps'); - Route::put('pireps/{pirep_id}', 'PirepController@update'); - - /* - * ACARS related - */ - Route::post('pireps/prefile', 'PirepController@prefile'); - Route::post('pireps/{pirep_id}', 'PirepController@update'); - Route::patch('pireps/{pirep_id}', 'PirepController@update'); - Route::post('pireps/{pirep_id}/update', 'PirepController@update'); - Route::post('pireps/{pirep_id}/file', 'PirepController@file'); - Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post'); - Route::put('pireps/{pirep_id}/cancel', 'PirepController@cancel'); - Route::delete('pireps/{pirep_id}/cancel', 'PirepController@cancel'); - - Route::get('pireps/{pirep_id}/fields', 'PirepController@fields_get'); - Route::post('pireps/{pirep_id}/fields', 'PirepController@fields_post'); - - Route::get('pireps/{pirep_id}/finances', 'PirepController@finances_get'); - Route::post('pireps/{pirep_id}/finances/recalculate', 'PirepController@finances_recalculate'); - - Route::get('pireps/{pirep_id}/route', 'PirepController@route_get'); - Route::post('pireps/{pirep_id}/route', 'PirepController@route_post'); - Route::delete('pireps/{pirep_id}/route', 'PirepController@route_delete'); - - Route::get('pireps/{pirep_id}/comments', 'PirepController@comments_get'); - - Route::get('pireps/{pirep_id}/acars/position', 'AcarsController@acars_get'); - Route::post('pireps/{pirep_id}/acars/position', 'AcarsController@acars_store'); - Route::post('pireps/{pirep_id}/acars/positions', 'AcarsController@acars_store'); - - Route::post('pireps/{pirep_id}/acars/events', 'AcarsController@acars_events'); - Route::post('pireps/{pirep_id}/acars/logs', 'AcarsController@acars_logs'); - - Route::get('settings', 'SettingsController@index'); - - // This is the info of the user whose token is in use - Route::get('user', 'UserController@index'); - Route::get('user/fleet', 'UserController@fleet'); - Route::get('user/pireps', 'UserController@pireps'); - - Route::get('user/bids', 'UserController@bids'); - Route::put('user/bids', 'UserController@bids'); - Route::post('user/bids', 'UserController@bids'); - Route::delete('user/bids', 'UserController@bids'); - - Route::get('users/{id}', 'UserController@get'); - Route::get('users/{id}/fleet', 'UserController@fleet'); - Route::get('users/{id}/pireps', 'UserController@pireps'); - - Route::get('users/{id}/bids', 'UserController@bids'); - Route::put('users/{id}/bids', 'UserController@bids'); -}); diff --git a/app/Http/Routes/web.php b/app/Http/Routes/web.php deleted file mode 100755 index 2c9782da..00000000 --- a/app/Http/Routes/web.php +++ /dev/null @@ -1,60 +0,0 @@ - 'Frontend', 'prefix' => '', 'as' => 'frontend.', - 'middleware' => [SetActiveTheme::class], -], function () { - Route::get('/', 'HomeController@index')->name('home'); - Route::get('r/{id}', 'PirepController@show')->name('pirep.show.public'); - Route::get('pireps/{id}', 'PirepController@show')->name('pireps.show'); - - Route::get('p/{id}', 'ProfileController@show')->name('profile.show.public'); - Route::get('users', 'UserController@index')->name('users.index'); - Route::get('pilots', 'UserController@index')->name('pilots.index'); - - Route::get('livemap', 'LiveMapController@index')->name('livemap.index'); -}); - -/* - * These are only visible to a logged in user - */ -Route::group([ - 'namespace' => 'Frontend', 'prefix' => '', 'as' => 'frontend.', - 'middleware' => ['auth', SetActiveTheme::class], -], function () { - Route::resource('dashboard', 'DashboardController'); - - Route::get('airports/{id}', 'AirportController@show')->name('airports.show'); - - // Download a file - Route::get('downloads', 'DownloadController@index')->name('downloads.index'); - Route::get('downloads/{id}', 'DownloadController@show')->name('downloads.download'); - - Route::get('flights/bids', 'FlightController@bids')->name('flights.bids'); - Route::get('flights/search', 'FlightController@search')->name('flights.search'); - Route::resource('flights', 'FlightController'); - - Route::resource('pireps', 'PirepController', [ - 'except' => ['show'], - ]); - - Route::get('pireps/fares', 'PirepController@fares'); - Route::post('pireps/{id}/submit', 'PirepController@submit')->name('pireps.submit'); - - Route::get('profile/acars', 'ProfileController@acars')->name('profile.acars'); - Route::get('profile/regen_apikey', 'ProfileController@regen_apikey')->name('profile.regen_apikey'); - - Route::resource('profile', 'ProfileController'); -}); - -Auth::routes(['verify' => true]); -Route::get('/logout', 'Auth\LoginController@logout')->name('logout'); - -require app_path('Http/Routes/admin.php'); diff --git a/app/Models/Acars.php b/app/Models/Acars.php index d81048d8..6dd2d28c 100644 --- a/app/Models/Acars.php +++ b/app/Models/Acars.php @@ -8,16 +8,13 @@ use App\Support\Units\Distance; use App\Support\Units\Fuel; /** - * Class Acars - * - * @param string id - * + * @property string id * @property string pirep_id * @property int type * @property string name - * @property float lat - * @property float lon - * @property float altitude + * @property float lat + * @property float lon + * @property float altitude * @property int gs * @property int heading * @property int order diff --git a/app/Models/Aircraft.php b/app/Models/Aircraft.php index d73bd05f..faff4311 100644 --- a/app/Models/Aircraft.php +++ b/app/Models/Aircraft.php @@ -38,6 +38,7 @@ class Aircraft extends Model 'name', 'registration', 'hex_code', + 'flight_time', 'zfw', 'status', 'state', @@ -49,6 +50,7 @@ class Aircraft extends Model protected $casts = [ 'subfleet_id' => 'integer', 'zfw' => 'float', + 'flight_time' => 'float', 'state' => 'integer', ]; @@ -58,6 +60,7 @@ class Aircraft extends Model public static $rules = [ 'subfleet_id' => 'required', 'name' => 'required', + 'status' => 'required', 'registration' => 'required', ]; diff --git a/app/Models/Airport.php b/app/Models/Airport.php index 4562e090..c200afb1 100644 --- a/app/Models/Airport.php +++ b/app/Models/Airport.php @@ -66,7 +66,7 @@ class Airport extends Model * Validation rules */ public static $rules = [ - 'icao' => 'required|size:4', + 'icao' => 'required', 'iata' => 'sometimes|nullable', 'name' => 'required', 'location' => 'sometimes', diff --git a/app/Models/Bid.php b/app/Models/Bid.php index c8235c97..e389f904 100644 --- a/app/Models/Bid.php +++ b/app/Models/Bid.php @@ -3,7 +3,14 @@ namespace App\Models; use App\Contracts\Model; +use Carbon\Carbon; +/** + * @property string user_id + * @property string flight_id + * @property Carbon created_at + * @property Carbon updated_at + */ class Bid extends Model { public $table = 'bids'; diff --git a/app/Models/Enums/FareType.php b/app/Models/Enums/FareType.php new file mode 100644 index 00000000..f18be6b1 --- /dev/null +++ b/app/Models/Enums/FareType.php @@ -0,0 +1,16 @@ + 'Passenger', + self::CARGO => 'Cargo', + ]; +} diff --git a/app/Models/Enums/ImportExportType.php b/app/Models/Enums/ImportExportType.php new file mode 100644 index 00000000..aa4ee363 --- /dev/null +++ b/app/Models/Enums/ImportExportType.php @@ -0,0 +1,26 @@ + 'airline', + self::AIRCRAFT => 'aircraft', + self::AIRPORT => 'airport', + self::EXPENSES => 'expense', + self::FARES => 'fare', + self::FLIGHTS => 'flight', + self::SUBFLEETS => 'subfleet', + ]; +} diff --git a/app/Models/Enums/PageType.php b/app/Models/Enums/PageType.php new file mode 100644 index 00000000..46a35f24 --- /dev/null +++ b/app/Models/Enums/PageType.php @@ -0,0 +1,11 @@ + 'bool', ]; + /** + * flight_type is stored a comma delimited list in table. Retrieve it as an array + * + * @return array + */ + public function getFlightTypeAttribute() + { + if (empty(trim($this->attributes['flight_type']))) { + return []; + } + + return explode(',', $this->attributes['flight_type']); + } + + /** + * Make sure the flight type is stored a comma-delimited list in the table + * + * @param string $value + */ + public function setFlightTypeAttribute($value) + { + if (is_array($value)) { + $this->attributes['flight_type'] = implode(',', $value); + } else { + $this->attributes['flight_type'] = trim($value); + } + } + /** * Foreign Keys */ @@ -47,4 +78,9 @@ class Expense extends Model { return $this->belongsTo(Airline::class, 'airline_id'); } + + public function ref_model() + { + return $this->morphTo(); + } } diff --git a/app/Models/Fare.php b/app/Models/Fare.php index c4cc8df6..aba31ec3 100644 --- a/app/Models/Fare.php +++ b/app/Models/Fare.php @@ -5,13 +5,15 @@ namespace App\Models; use App\Contracts\Model; /** - * Class Fare - * - * @property int capacity + * @property string name * @property float cost * @property float price - * @property mixed code - * @property mixed count Only when merged with pivot + * @property int code + * @property int capacity + * @property int count Only when merged with pivot + * @property int type + * @property string notes + * @property bool active */ class Fare extends Model { @@ -20,6 +22,7 @@ class Fare extends Model protected $fillable = [ 'code', 'name', + 'type', 'price', 'cost', 'capacity', @@ -31,12 +34,14 @@ class Fare extends Model 'price' => 'float', 'cost' => 'float', 'capacity' => 'integer', + 'type' => 'integer', 'active' => 'boolean', ]; public static $rules = [ 'code' => 'required', 'name' => 'required', + 'type' => 'required', ]; /** diff --git a/app/Models/Flight.php b/app/Models/Flight.php index 4fccc4ef..76cdb4f2 100644 --- a/app/Models/Flight.php +++ b/app/Models/Flight.php @@ -26,6 +26,9 @@ use Illuminate\Support\Collection; * @property int flight_time * @property string route * @property int level + * @property float load_factor + * @property float load_factor_variance + * @property float pilot_pay * @property Airport dpt_airport * @property Airport arr_airport * @property Airport alt_airport @@ -65,6 +68,9 @@ class Flight extends Model 'distance', 'flight_time', 'flight_type', + 'load_factor', + 'load_factor_variance', + 'pilot_pay', 'route', 'notes', 'start_date', @@ -75,27 +81,32 @@ class Flight extends Model ]; protected $casts = [ - 'flight_number' => 'integer', - 'days' => 'integer', - 'level' => 'integer', - 'distance' => 'float', - 'flight_time' => 'integer', - 'start_date' => 'date', - 'end_date' => 'date', - 'has_bid' => 'boolean', - 'route_leg' => 'integer', - 'active' => 'boolean', - 'visible' => 'boolean', + 'flight_number' => 'integer', + 'days' => 'integer', + 'level' => 'integer', + 'distance' => 'float', + 'flight_time' => 'integer', + 'start_date' => 'date', + 'end_date' => 'date', + 'load_factor' => 'double', + 'load_factor_variance' => 'double', + 'pilot_pay' => 'float', + 'has_bid' => 'boolean', + 'route_leg' => 'integer', + 'active' => 'boolean', + 'visible' => 'boolean', ]; public static $rules = [ - 'airline_id' => 'required|exists:airlines,id', - 'flight_number' => 'required', - 'route_code' => 'nullable', - 'route_leg' => 'nullable', - 'dpt_airport_id' => 'required|size:4|exists:airports,id', - 'arr_airport_id' => 'required|size:4|exists:airports,id', - 'level' => 'nullable', + 'airline_id' => 'required|exists:airlines,id', + 'flight_number' => 'required', + 'route_code' => 'nullable', + 'route_leg' => 'nullable', + 'dpt_airport_id' => 'required|exists:airports,id', + 'arr_airport_id' => 'required|exists:airports,id', + 'load_factor' => 'nullable|numeric', + 'load_factor_variance' => 'nullable|numeric', + 'level' => 'nullable', ]; /** @@ -228,6 +239,12 @@ class Flight extends Model return $this->hasMany(FlightFieldValue::class, 'flight_id'); } + public function simbrief() + { + // id = key from table, flight_id = reference key + return $this->belongsTo(SimBrief::class, 'id', 'flight_id'); + } + public function subfleets() { return $this->belongsToMany(Subfleet::class, 'flight_subfleet'); diff --git a/app/Models/FlightField.php b/app/Models/FlightField.php index f337fbb5..40dad611 100644 --- a/app/Models/FlightField.php +++ b/app/Models/FlightField.php @@ -9,6 +9,7 @@ use App\Contracts\Model; * * @property string name * @property string slug + * @property bool required */ class FlightField extends Model { diff --git a/app/Models/Observers/AircraftObserver.php b/app/Models/Observers/AircraftObserver.php index 555fc942..78cddd71 100644 --- a/app/Models/Observers/AircraftObserver.php +++ b/app/Models/Observers/AircraftObserver.php @@ -5,9 +5,6 @@ namespace App\Models\Observers; use App\Models\Aircraft; use App\Support\ICAO; -/** - * Class AircraftObserver - */ class AircraftObserver { /** @@ -17,6 +14,10 @@ class AircraftObserver */ public function creating(Aircraft $aircraft): void { + if (!empty($aircraft->airport_id)) { + $aircraft->airport_id = strtoupper($aircraft->airport_id); + } + if (empty($aircraft->hex_code)) { $aircraft->hex_code = ICAO::createHexCode(); } diff --git a/app/Models/Observers/Sluggable.php b/app/Models/Observers/Sluggable.php index e0415c7d..01cafcbc 100644 --- a/app/Models/Observers/Sluggable.php +++ b/app/Models/Observers/Sluggable.php @@ -4,6 +4,8 @@ namespace App\Models\Observers; /** * Create a slug from a name + * + * @property object attributes */ class Sluggable { diff --git a/app/Models/Page.php b/app/Models/Page.php new file mode 100644 index 00000000..f91f818c --- /dev/null +++ b/app/Models/Page.php @@ -0,0 +1,41 @@ + 'integer', + 'public' => 'boolean', + 'enabled' => 'boolean', + ]; + + public static $rules = [ + 'name' => 'required|unique:pages,name', + 'body' => 'required', + ]; +} diff --git a/app/Models/Pirep.php b/app/Models/Pirep.php index 90d013d3..9409d799 100644 --- a/app/Models/Pirep.php +++ b/app/Models/Pirep.php @@ -14,9 +14,11 @@ use Illuminate\Support\Collection; /** * @property string id + * @property string ident * @property string flight_number * @property string route_code * @property string route_leg + * @property string flight_type * @property int airline_id * @property int user_id * @property int aircraft_id @@ -126,8 +128,8 @@ class Pirep extends Model 'flight_number' => 'required', 'dpt_airport_id' => 'required', 'arr_airport_id' => 'required', - 'block_fuel' => 'sometimes|numeric', - 'fuel_used' => 'sometimes|numeric', + 'block_fuel' => 'nullable|numeric', + 'fuel_used' => 'nullable|numeric', 'level' => 'nullable|numeric', 'notes' => 'nullable', 'route' => 'nullable', @@ -159,7 +161,7 @@ class Pirep extends Model * * @return \App\Models\Pirep */ - public static function fromFlight(Flight $flight) + public static function fromFlight(Flight $flight): self { return new self([ 'flight_id' => $flight->id, @@ -174,6 +176,28 @@ class Pirep extends Model ]); } + /** + * Create a new PIREP from a SimBrief instance + * + * @param \App\Models\SimBrief $simBrief + * + * @return \App\Models\Pirep + */ + public static function fromSimBrief(SimBrief $simBrief): self + { + return new self([ + 'flight_id' => $simBrief->flight->id, + 'airline_id' => $simBrief->flight->airline_id, + 'flight_number' => $simBrief->flight->flight_number, + 'route_code' => $simBrief->flight->route_code, + 'route_leg' => $simBrief->flight->route_leg, + 'dpt_airport_id' => $simBrief->flight->dpt_airport_id, + 'arr_airport_id' => $simBrief->flight->arr_airport_id, + 'route' => $simBrief->xml->getRouteString(), + 'level' => $simBrief->xml->getFlightLevel(), + ]); + } + /** * Get the flight ident, e.,g JBU1900 * @@ -483,6 +507,11 @@ class Pirep extends Model ->latest(); } + public function simbrief() + { + return $this->belongsTo(SimBrief::class, 'id', 'pirep_id'); + } + public function transactions() { return $this->hasMany(JournalTransaction::class, 'ref_model_id') diff --git a/app/Models/PirepComment.php b/app/Models/PirepComment.php index 5bfbf3a3..f7c0bd5a 100644 --- a/app/Models/PirepComment.php +++ b/app/Models/PirepComment.php @@ -5,8 +5,10 @@ namespace App\Models; use App\Contracts\Model; /** - * @property string pirep_id - * @property int user_id + * @property string $pirep_id + * @property int $user_id + * @property Pirep $pirep + * @property User $user */ class PirepComment extends Model { diff --git a/app/Models/SimBrief.php b/app/Models/SimBrief.php new file mode 100644 index 00000000..cfc4b88d --- /dev/null +++ b/app/Models/SimBrief.php @@ -0,0 +1,98 @@ +attributes['ofp_xml'])) { + return null; + } + + if (!$this->xml_instance) { + $this->xml_instance = simplexml_load_string( + $this->attributes['ofp_xml'], + SimBriefXML::class + ); + } + + return $this->xml_instance; + } + + /** + * Returns a list of images + */ + public function getImagesAttribute(): Collection + { + return $this->xml->getImages(); + } + + /** + * Return all of the flight plans + */ + public function getFilesAttribute(): Collection + { + return $this->xml->getFlightPlans(); + } + + /* + * Relationships + */ + + public function flight() + { + if (!empty($this->attributes['flight_id'])) { + return $this->belongsTo(Flight::class, 'flight_id'); + } + + if (!empty($this->attributes['pirep_id'])) { + return $this->belongsTo(Pirep::class, 'pirep_id'); + } + } + + public function user() + { + return $this->belongsTo(User::class, 'user_id'); + } +} diff --git a/app/Models/SimBriefXML.php b/app/Models/SimBriefXML.php new file mode 100644 index 00000000..c95d29fb --- /dev/null +++ b/app/Models/SimBriefXML.php @@ -0,0 +1,136 @@ +alternate->cruise_altitude)) { + return '0'; // unknown? + } + + $fl = (int) ($this->alternate->cruise_altitude) / 100; + + return str_pad($fl, 3, '0', STR_PAD_LEFT); + } + + /** + * Return the URL to the vmsACARS flight plan file + * + * @return string|null + */ + public function getAcarsXmlUrl() + { + if (!empty($this->fms_downloads->vms)) { + $base_url = $this->fms_downloads->directory; + return $base_url.$this->fms_downloads->vms->link; + } + + return null; + } + + /** + * Retrieve all of the flightplans + * + * @return Collection + */ + public function getFlightPlans(): Collection + { + $fps = []; + $base_url = $this->fms_downloads->directory; + + // TODO: Put vmsACARS on top + if (!empty($this->fms_downloads->vms)) { + $fps[] = [ + 'name' => $this->fms_downloads->vms->name->__toString(), + 'url' => $base_url.$this->fms_downloads->vms->link, + ]; + } + + foreach ($this->fms_downloads->children() as $child) { + if ($child->getName() === 'directory') { + continue; + } + + $fps[] = [ + 'name' => $child->name->__toString(), + 'url' => $base_url.$child->link, + ]; + } + + return collect($fps); + } + + /** + * Return a generator which sends out the fix values. This can be a long list + * + * @return \Generator + */ + public function getRoute() + { + foreach ($this->navlog->children()->fix as $fix) { + $type = $fix->type->__toString(); + if ($type === 'apt') { + continue; + } + + $ident = $fix->ident->__toString(); + + if ($ident === 'TOC' || $ident === 'TOD') { + continue; + } + + yield $fix; + } + } + + /** + * Get the route as a string + * + * @return string + */ + public function getRouteString(): string + { + if (!empty($this->general->route)) { + return $this->general->route->__toString(); + } + + $route = []; + foreach ($this->getRoute() as $fix) { + $route[] = $fix->ident->__toString(); + } + + return implode(' ', $route); + } + + /** + * Retrieve all of the image links + * + * @return Collection + */ + public function getImages(): Collection + { + $images = []; + $base_url = $this->images->directory; + foreach ($this->images->map as $image) { + $images[] = [ + 'name' => $image->name->__toString(), + 'url' => $base_url.$image->link, + ]; + } + + return collect($images); + } +} diff --git a/app/Models/Traits/HashIdTrait.php b/app/Models/Traits/HashIdTrait.php index 71ab4848..d24d8ea6 100644 --- a/app/Models/Traits/HashIdTrait.php +++ b/app/Models/Traits/HashIdTrait.php @@ -2,8 +2,7 @@ namespace App\Models\Traits; -use App\Contracts\Model; -use Hashids\Hashids; +use App\Support\Utils; trait HashIdTrait { @@ -14,9 +13,7 @@ trait HashIdTrait */ final protected static function createNewHashId(): string { - $hashids = new Hashids('', Model::ID_MAX_LENGTH); - $mt = str_replace('.', '', microtime(true)); - return $hashids->encode($mt); + return Utils::generateNewId(); } /** diff --git a/app/Models/Traits/JournalTrait.php b/app/Models/Traits/JournalTrait.php index 46aedad6..9198360a 100644 --- a/app/Models/Traits/JournalTrait.php +++ b/app/Models/Traits/JournalTrait.php @@ -12,7 +12,7 @@ trait JournalTrait public static function bootJournalTrait() { static::created(function ($model) { - $model->initJournal(config('phpvms.currency')); + $model->initJournal(setting('units.currency')); }); } diff --git a/app/Models/Traits/ReferenceTrait.php b/app/Models/Traits/ReferenceTrait.php index f7305830..bb6c4bdf 100644 --- a/app/Models/Traits/ReferenceTrait.php +++ b/app/Models/Traits/ReferenceTrait.php @@ -27,7 +27,7 @@ trait ReferenceTrait /** * Return an instance of the object or null * - * @return \App\Contracts\Model|null + * @return \App\Contracts\Model|$this|null */ public function getReferencedObject() { diff --git a/app/Models/User.php b/app/Models/User.php index fe10797a..e36850bf 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -14,6 +14,7 @@ use Laratrust\Traits\LaratrustUserTrait; * @property int pilot_id * @property int airline_id * @property string name + * @property string name_private Only first name, rest are initials * @property string email * @property string password * @property string api_key @@ -21,6 +22,7 @@ use Laratrust\Traits\LaratrustUserTrait; * @property string ident * @property string curr_airport_id * @property string home_airport_id + * @property string avatar * @property Airline airline * @property Flight[] flights * @property int flight_time @@ -109,13 +111,32 @@ class User extends Authenticatable /** * @return string */ - public function getIdentAttribute() + public function getIdentAttribute(): string { $length = setting('pilots.id_length'); return $this->airline->icao.str_pad($this->pilot_id, $length, '0', STR_PAD_LEFT); } + /** + * Return a "privatized" version of someones name - First name full, rest of the names are initials + * + * @return string + */ + public function getNamePrivateAttribute(): string + { + $name_parts = explode(' ', $this->attributes['name']); + $count = count($name_parts); + if ($count === 1) { + return $name_parts[0]; + } + + $first_name = $name_parts[0]; + $last_name = $name_parts[$count - 1]; + + return $first_name.' '.$last_name[0]; + } + /** * Shorthand for getting the timezone * @@ -142,7 +163,7 @@ class User extends Authenticatable public function getAvatarAttribute() { if (!$this->attributes['avatar']) { - return; + return null; } return new File([ @@ -169,6 +190,15 @@ class User extends Authenticatable return $uri; } + public function resolveAvatarUrl() + { + $avatar = $this->getAvatarAttribute(); + if (empty($avatar)) { + return $this->gravatar(); + } + return $avatar->url; + } + /** * Foreign Keys */ @@ -200,10 +230,10 @@ class User extends Authenticatable /** * These are the flights they've bid on */ - public function flights() - { - return $this->belongsToMany(Flight::class, 'bids'); - } + // public function flights() + // { + // return $this->belongsToMany(Flight::class, 'bids'); + // } /** * The bid rows diff --git a/app/Notifications/BaseNotification.php b/app/Notifications/BaseNotification.php index 3b68b31c..234ef5c8 100644 --- a/app/Notifications/BaseNotification.php +++ b/app/Notifications/BaseNotification.php @@ -20,7 +20,7 @@ class BaseNotification extends Notification implements ShouldQueue $klass = get_class($this); $notif_config = config('notifications.channels', []); if (!array_key_exists($klass, $notif_config)) { - Log::error('Notification type '.$klass.' missing from notifications config'); + Log::error('Notification type '.$klass.' missing from notifications config, defaulting to mail'); return; } diff --git a/app/Notifications/Channels/MailChannel.php b/app/Notifications/Channels/MailChannel.php index 3cb150b0..0112882d 100644 --- a/app/Notifications/Channels/MailChannel.php +++ b/app/Notifications/Channels/MailChannel.php @@ -6,9 +6,9 @@ use Illuminate\Notifications\Messages\MailMessage; trait MailChannel { - private $mailSubject; - private $mailTemplate; - private $mailTemplateArgs; + protected $mailSubject; + protected $mailTemplate; + protected $mailTemplateArgs; /** * Set the arguments for the toMail() method diff --git a/app/Notifications/Messages/AdminUserRegistered.php b/app/Notifications/Messages/AdminUserRegistered.php index a007641b..9ddbcd2b 100644 --- a/app/Notifications/Messages/AdminUserRegistered.php +++ b/app/Notifications/Messages/AdminUserRegistered.php @@ -10,6 +10,8 @@ class AdminUserRegistered extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $user; /** diff --git a/app/Notifications/Messages/NewsAdded.php b/app/Notifications/Messages/NewsAdded.php index 38ae343d..3032cab2 100644 --- a/app/Notifications/Messages/NewsAdded.php +++ b/app/Notifications/Messages/NewsAdded.php @@ -10,6 +10,8 @@ class NewsAdded extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $news; public function __construct(News $news) diff --git a/app/Notifications/Messages/PirepAccepted.php b/app/Notifications/Messages/PirepAccepted.php index 70979621..a4b702ec 100644 --- a/app/Notifications/Messages/PirepAccepted.php +++ b/app/Notifications/Messages/PirepAccepted.php @@ -13,6 +13,8 @@ class PirepAccepted extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $pirep; /** diff --git a/app/Notifications/Messages/PirepRejected.php b/app/Notifications/Messages/PirepRejected.php index 6c5ade9b..c28f63da 100644 --- a/app/Notifications/Messages/PirepRejected.php +++ b/app/Notifications/Messages/PirepRejected.php @@ -10,6 +10,8 @@ class PirepRejected extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $pirep; /** diff --git a/app/Notifications/Messages/PirepSubmitted.php b/app/Notifications/Messages/PirepSubmitted.php index bcceedff..40500250 100644 --- a/app/Notifications/Messages/PirepSubmitted.php +++ b/app/Notifications/Messages/PirepSubmitted.php @@ -10,6 +10,8 @@ class PirepSubmitted extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $pirep; /** diff --git a/app/Notifications/Messages/UserPending.php b/app/Notifications/Messages/UserPending.php index 000eb393..f737ea47 100644 --- a/app/Notifications/Messages/UserPending.php +++ b/app/Notifications/Messages/UserPending.php @@ -10,6 +10,8 @@ class UserPending extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $user; /** @@ -17,6 +19,8 @@ class UserPending extends BaseNotification */ public function __construct(User $user) { + parent::__construct(); + $this->user = $user; $this->setMailable( diff --git a/app/Notifications/Messages/UserRegistered.php b/app/Notifications/Messages/UserRegistered.php index 0c766a44..894a03da 100644 --- a/app/Notifications/Messages/UserRegistered.php +++ b/app/Notifications/Messages/UserRegistered.php @@ -10,6 +10,8 @@ class UserRegistered extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $user; /** diff --git a/app/Notifications/Messages/UserRejected.php b/app/Notifications/Messages/UserRejected.php index 8c4b8079..03d64efd 100644 --- a/app/Notifications/Messages/UserRejected.php +++ b/app/Notifications/Messages/UserRejected.php @@ -10,6 +10,8 @@ class UserRejected extends BaseNotification { use MailChannel; + public $channels = ['mail']; + private $user; /** diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 2605280a..99a11adc 100755 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,28 +2,6 @@ namespace App\Providers; -use App\Models\Aircraft; -use App\Models\Airport; -use App\Models\Flight; -use App\Models\FlightField; -use App\Models\FlightFieldValue; -use App\Models\Journal; -use App\Models\JournalTransaction; -use App\Models\Observers\AircraftObserver; -use App\Models\Observers\AirportObserver; -use App\Models\Observers\FlightObserver; -use App\Models\Observers\JournalObserver; -use App\Models\Observers\JournalTransactionObserver; -use App\Models\Observers\SettingObserver; -use App\Models\Observers\Sluggable; -use App\Models\Observers\SubfleetObserver; -use App\Models\Observers\UserObserver; -use App\Models\PirepField; -use App\Models\PirepFieldValue; -use App\Models\Setting; -use App\Models\Subfleet; -use App\Models\User; -use App\Repositories\SettingRepository; use App\Services\ModuleService; use App\Support\Utils; use Illuminate\Support\Facades\Schema; @@ -35,31 +13,7 @@ class AppServiceProvider extends ServiceProvider public function boot(): void { Schema::defaultStringLength(191); - - /*Carbon::serializeUsing(function ($carbon) { - return $carbon->format('U'); - });*/ - - $this->app->bind('setting', SettingRepository::class); - View::share('moduleSvc', app(ModuleService::class)); - - // Model observers - Aircraft::observe(AircraftObserver::class); - Airport::observe(AirportObserver::class); - Journal::observe(JournalObserver::class); - JournalTransaction::observe(JournalTransactionObserver::class); - - Flight::observe(FlightObserver::class); - FlightField::observe(Sluggable::class); - FlightFieldValue::observe(Sluggable::class); - - PirepField::observe(Sluggable::class); - PirepFieldValue::observe(Sluggable::class); - - Setting::observe(SettingObserver::class); - Subfleet::observe(SubfleetObserver::class); - User::observe(UserObserver::class); } /** diff --git a/app/Providers/CronServiceProvider.php b/app/Providers/CronServiceProvider.php index 89364e8e..0dc2f872 100644 --- a/app/Providers/CronServiceProvider.php +++ b/app/Providers/CronServiceProvider.php @@ -5,6 +5,7 @@ namespace App\Providers; use App\Cron\Hourly\RemoveExpiredBids; use App\Cron\Hourly\RemoveExpiredLiveFlights; use App\Cron\Nightly\ApplyExpenses; +use App\Cron\Nightly\ClearExpiredSimbrief; use App\Cron\Nightly\NewVersionCheck; use App\Cron\Nightly\PilotLeave; use App\Cron\Nightly\RecalculateBalances; @@ -29,6 +30,7 @@ class CronServiceProvider extends ServiceProvider SetActiveFlights::class, RecalculateStats::class, NewVersionCheck::class, + ClearExpiredSimbrief::class, ], CronWeekly::class => [ diff --git a/app/Providers/DirectiveServiceProvider.php b/app/Providers/DirectiveServiceProvider.php new file mode 100644 index 00000000..3f7697f7 --- /dev/null +++ b/app/Providers/DirectiveServiceProvider.php @@ -0,0 +1,23 @@ +"; + }); + + Blade::directive('minutestohours', function ($expr) { + return ""; + }); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 6accec41..4f3b0994 100755 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -11,6 +11,8 @@ use App\Listeners\ExpenseListener; use App\Listeners\FinanceEventHandler; use App\Listeners\UserStateListener; use App\Notifications\EventHandler; +use Codedge\Updater\Events\UpdateAvailable; +use Codedge\Updater\Events\UpdateSucceeded; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -33,6 +35,10 @@ class EventServiceProvider extends ServiceProvider UserStatsChanged::class => [ AwardListener::class, ], + + UpdateAvailable::class => [], + UpdateSucceeded::class => [], + ]; protected $subscribe = [ diff --git a/app/Providers/ObserverServiceProviders.php b/app/Providers/ObserverServiceProviders.php new file mode 100644 index 00000000..77ccb608 --- /dev/null +++ b/app/Providers/ObserverServiceProviders.php @@ -0,0 +1,51 @@ +mapWebRoutes(); + $this->mapAdminRoutes(); $this->mapApiRoutes(); } @@ -34,13 +36,347 @@ class RouteServiceProvider extends ServiceProvider * * @return void */ - protected function mapWebRoutes() + private function mapWebRoutes() { Route::group([ - 'middleware' => 'web', + 'middleware' => ['web', 'theme'], 'namespace' => $this->namespace, ], function ($router) { - require app_path('Http/Routes/web.php'); + Route::group([ + 'namespace' => 'Frontend', + 'prefix' => '', + 'as' => 'frontend.', + 'middleware' => ['auth'], + ], function () { + Route::resource('dashboard', 'DashboardController'); + + Route::get('airports/{id}', 'AirportController@show')->name('airports.show'); + + // Download a file + Route::get('downloads', 'DownloadController@index')->name('downloads.index'); + Route::get('downloads/{id}', 'DownloadController@show')->name('downloads.download'); + + Route::get('flights/bids', 'FlightController@bids')->name('flights.bids'); + Route::get('flights/search', 'FlightController@search')->name('flights.search'); + Route::resource('flights', 'FlightController'); + + Route::get('p/{slug}', 'PageController@show')->name('pages.show'); + + Route::get('pireps/fares', 'PirepController@fares'); + Route::post('pireps/{id}/submit', 'PirepController@submit')->name('pireps.submit'); + + Route::resource('pireps', 'PirepController', [ + 'except' => ['show'], + ]); + + Route::get('profile/acars', 'ProfileController@acars')->name('profile.acars'); + Route::get('profile/regen_apikey', 'ProfileController@regen_apikey')->name('profile.regen_apikey'); + + Route::resource('profile', 'ProfileController'); + + // SimBrief stuff + Route::get('simbrief/generate', 'SimBriefController@generate')->name('simbrief.generate'); + Route::post('simbrief/apicode', 'SimBriefController@api_code')->name('simbrief.api_code'); + Route::get('simbrief/check_ofp', 'SimBriefController@check_ofp')->name('simbrief.check_ofp'); + Route::get('simbrief/{id}', 'SimBriefController@briefing')->name('simbrief.briefing'); + Route::get('simbrief/{id}/prefile', 'SimBriefController@prefile')->name('simbrief.prefile'); + Route::get('simbrief/{id}/cancel', 'SimBriefController@cancel')->name('simbrief.cancel'); + }); + + Route::group([ + 'namespace' => 'Frontend', + 'prefix' => '', + 'as' => 'frontend.', + ], function () { + Route::get('/', 'HomeController@index')->name('home'); + Route::get('r/{id}', 'PirepController@show')->name('pirep.show.public'); + Route::get('pireps/{id}', 'PirepController@show')->name('pireps.show'); + + Route::get('users/{id}', 'ProfileController@show')->name('users.show.public'); + Route::get('pilots/{id}', 'ProfileController@show')->name('pilots.show.public'); + + Route::get('p/{id}', 'ProfileController@show')->name('profile.show.public'); + Route::get('users', 'UserController@index')->name('users.index'); + Route::get('pilots', 'UserController@index')->name('pilots.index'); + + Route::get('livemap', 'LiveMapController@index')->name('livemap.index'); + }); + + Auth::routes(['verify' => true]); + Route::get('/logout', 'Auth\LoginController@logout')->name('logout'); + }); + } + + private function mapAdminRoutes() + { + Route::group([ + 'namespace' => $this->namespace.'\\Admin', + 'prefix' => 'admin', + 'as' => 'admin.', + 'middleware' => ['web', 'auth', 'ability:admin,admin-access'], + ], static function () { + // CRUD for airlines + Route::resource('airlines', 'AirlinesController') + ->middleware('ability:admin,airlines'); + + // CRUD for roles + Route::resource('roles', 'RolesController') + ->middleware('role:admin'); + + Route::get('airports/export', 'AirportController@export') + ->name('airports.export') + ->middleware('ability:admin,airports'); + + Route::match([ + 'get', + 'post', + 'put', + ], 'airports/fuel', 'AirportController@fuel') + ->middleware('ability:admin,airports'); + + Route::match([ + 'get', + 'post', + ], 'airports/import', 'AirportController@import') + ->name('airports.import') + ->middleware('ability:admin,airports'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'airports/{id}/expenses', 'AirportController@expenses') + ->middleware('ability:admin,airports'); + + Route::resource('airports', 'AirportController')->middleware('ability:admin,airports'); + + // Awards + Route::resource('awards', 'AwardController')->middleware('ability:admin,awards'); + + // aircraft and fare associations + Route::get('aircraft/export', 'AircraftController@export') + ->name('aircraft.export') + ->middleware('ability:admin,aircraft'); + + Route::match([ + 'get', + 'post', + ], 'aircraft/import', 'AircraftController@import') + ->name('aircraft.import') + ->middleware('ability:admin,aircraft'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'aircraft/{id}/expenses', 'AircraftController@expenses') + ->middleware('ability:admin,aircraft'); + + Route::resource('aircraft', 'AircraftController') + ->middleware('ability:admin,aircraft'); + + // expenses + Route::get('expenses/export', 'ExpenseController@export') + ->name('expenses.export') + ->middleware('ability:admin,finances'); + + Route::match([ + 'get', + 'post', + ], 'expenses/import', 'ExpenseController@import') + ->name('expenses.import') + ->middleware('ability:admin,finances'); + + Route::resource('expenses', 'ExpenseController') + ->middleware('ability:admin,finances'); + + // fares + Route::get('fares/export', 'FareController@export') + ->name('fares.export') + ->middleware('ability:admin,finances'); + + Route::match([ + 'get', + 'post', + ], 'fares/import', 'FareController@import') + ->name('fares.import') + ->middleware('ability:admin,finances'); + + Route::resource('fares', 'FareController')->middleware('ability:admin,finances'); + + // files + Route::post('files', 'FileController@store') + ->name('files.store') + ->middleware('ability:admin,files'); + + Route::delete('files/{id}', 'FileController@destroy') + ->name('files.delete') + ->middleware('ability:admin,files'); + + // finances + Route::resource('finances', 'FinanceController') + ->middleware('ability:admin,finances'); + + // flights and aircraft associations + Route::get('flights/export', 'FlightController@export') + ->name('flights.export') + ->middleware('ability:admin,flights'); + + Route::match([ + 'get', + 'post', + ], 'flights/import', 'FlightController@import') + ->name('flights.import') + ->middleware('ability:admin,flights'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'flights/{id}/fares', 'FlightController@fares') + ->middleware('ability:admin,flights'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'flights/{id}/fields', 'FlightController@field_values') + ->middleware('ability:admin,flights'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'flights/{id}/subfleets', 'FlightController@subfleets') + ->middleware('ability:admin,flights'); + + Route::resource('flights', 'FlightController') + ->middleware('ability:admin,flights'); + + Route::resource('flightfields', 'FlightFieldController') + ->middleware('ability:admin,flights'); + + // pirep related routes + Route::get('pireps/fares', 'PirepController@fares') + ->middleware('ability:admin,pireps'); + + Route::get('pireps/pending', 'PirepController@pending') + ->middleware('ability:admin,pireps'); + + Route::resource('pireps', 'PirepController') + ->middleware('ability:admin,pireps'); + + Route::match([ + 'get', + 'post', + 'delete', + ], 'pireps/{id}/comments', 'PirepController@comments') + ->middleware('ability:admin,pireps'); + + Route::match([ + 'post', + 'put', + ], 'pireps/{id}/status', 'PirepController@status') + ->name('pirep.status') + ->middleware('ability:admin,pireps'); + + Route::resource('pirepfields', 'PirepFieldController') + ->middleware('ability:admin,pireps'); + + // Pages + Route::resource('pages', 'PagesController')->middleware('ability:admin,pages'); + + // rankings + Route::resource('ranks', 'RankController')->middleware('ability:admin,ranks'); + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'ranks/{id}/subfleets', 'RankController@subfleets')->middleware('ability:admin,ranks'); + + // settings + Route::match(['get'], 'settings', 'SettingsController@index')->middleware('ability:admin,settings'); + + Route::match([ + 'post', + 'put', + ], 'settings', 'SettingsController@update') + ->name('settings.update')->middleware('ability:admin,settings'); + + // maintenance + Route::match(['get'], 'maintenance', 'MaintenanceController@index') + ->name('maintenance.index')->middleware('ability:admin,maintenance'); + + Route::match(['post'], 'maintenance/cache', 'MaintenanceController@cache') + ->name('maintenance.cache')->middleware('ability:admin,maintenance'); + + Route::match(['post'], 'maintenance/update', 'MaintenanceController@update') + ->name('maintenance.update')->middleware('ability:admin,maintenance'); + + Route::match(['post'], 'maintenance/forcecheck', 'MaintenanceController@forcecheck') + ->name('maintenance.forcecheck')->middleware('ability:admin,maintenance'); + + // subfleet + Route::get('subfleets/export', 'SubfleetController@export') + ->name('subfleets.export')->middleware('ability:admin,fleet'); + + Route::match([ + 'get', + 'post', + ], 'subfleets/import', 'SubfleetController@import') + ->name('subfleets.import')->middleware('ability:admin,fleet'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'subfleets/{id}/expenses', 'SubfleetController@expenses')->middleware('ability:admin,fleet'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'subfleets/{id}/fares', 'SubfleetController@fares')->middleware('ability:admin,fleet'); + + Route::match([ + 'get', + 'post', + 'put', + 'delete', + ], 'subfleets/{id}/ranks', 'SubfleetController@ranks')->middleware('ability:admin,fleet'); + + Route::resource('subfleets', 'SubfleetController')->middleware('ability:admin,fleet'); + + Route::resource('users', 'UserController')->middleware('ability:admin,users'); + Route::get('users/{id}/regen_apikey', 'UserController@regen_apikey') + ->name('users.regen_apikey')->middleware('ability:admin,users'); + + // defaults + Route::get('', ['uses' => 'DashboardController@index']) + ->middleware('update_pending', 'ability:admin,admin-access'); + + Route::get('/', ['uses' => 'DashboardController@index']) + ->middleware('update_pending', 'ability:admin,admin-access'); + + Route::get('dashboard', [ + 'uses' => 'DashboardController@index', + 'name' => 'dashboard', + ])->middleware('update_pending', 'ability:admin,admin-access'); + + Route::match([ + 'get', + 'post', + 'delete', + ], 'dashboard/news', ['uses' => 'DashboardController@news']) + ->name('dashboard.news')->middleware('update_pending', 'ability:admin,admin-access'); }); } @@ -51,7 +387,7 @@ class RouteServiceProvider extends ServiceProvider * * @return void */ - protected function mapApiRoutes() + private function mapApiRoutes() { Route::group([ 'middleware' => ['api'], @@ -59,7 +395,93 @@ class RouteServiceProvider extends ServiceProvider 'prefix' => 'api', 'as' => 'api.', ], function ($router) { - require app_path('Http/Routes/api.php'); + Route::group([], function () { + Route::get('acars', 'AcarsController@live_flights'); + Route::get('acars/geojson', 'AcarsController@pireps_geojson'); + + Route::get('pireps/{pirep_id}', 'PirepController@get'); + Route::get('pireps/{pirep_id}/acars/geojson', 'AcarsController@acars_geojson'); + + Route::get('news', 'NewsController@index'); + Route::get('status', 'StatusController@status'); + Route::get('version', 'StatusController@status'); + }); + + /* + * These need to be authenticated with a user's API key + */ + Route::group(['middleware' => ['api.auth']], function () { + Route::get('airlines', 'AirlineController@index'); + Route::get('airlines/{id}', 'AirlineController@get'); + + Route::get('airports', 'AirportController@index'); + Route::get('airports/hubs', 'AirportController@index_hubs'); + Route::get('airports/{id}', 'AirportController@get'); + Route::get('airports/{id}/lookup', 'AirportController@lookup'); + Route::get('airports/{id}/distance/{to}', 'AirportController@distance'); + + Route::get('fleet', 'FleetController@index'); + Route::get('fleet/aircraft/{id}', 'FleetController@get_aircraft'); + + Route::get('flights', 'FlightController@index'); + Route::get('flights/search', 'FlightController@search'); + Route::get('flights/{id}', 'FlightController@get'); + Route::get('flights/{id}/briefing', 'FlightController@briefing')->name('flights.briefing'); + Route::get('flights/{id}/route', 'FlightController@route'); + + Route::get('pireps', 'UserController@pireps'); + Route::put('pireps/{pirep_id}', 'PirepController@update'); + + /* + * ACARS related + */ + Route::post('pireps/prefile', 'PirepController@prefile'); + Route::post('pireps/{pirep_id}', 'PirepController@update'); + Route::patch('pireps/{pirep_id}', 'PirepController@update'); + Route::post('pireps/{pirep_id}/update', 'PirepController@update'); + Route::post('pireps/{pirep_id}/file', 'PirepController@file'); + Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post'); + Route::put('pireps/{pirep_id}/cancel', 'PirepController@cancel'); + Route::delete('pireps/{pirep_id}/cancel', 'PirepController@cancel'); + + Route::get('pireps/{pirep_id}/fields', 'PirepController@fields_get'); + Route::post('pireps/{pirep_id}/fields', 'PirepController@fields_post'); + + Route::get('pireps/{pirep_id}/finances', 'PirepController@finances_get'); + Route::post('pireps/{pirep_id}/finances/recalculate', 'PirepController@finances_recalculate'); + + Route::get('pireps/{pirep_id}/route', 'PirepController@route_get'); + Route::post('pireps/{pirep_id}/route', 'PirepController@route_post'); + Route::delete('pireps/{pirep_id}/route', 'PirepController@route_delete'); + + Route::get('pireps/{pirep_id}/comments', 'PirepController@comments_get'); + + Route::get('pireps/{pirep_id}/acars/position', 'AcarsController@acars_get'); + Route::post('pireps/{pirep_id}/acars/position', 'AcarsController@acars_store'); + Route::post('pireps/{pirep_id}/acars/positions', 'AcarsController@acars_store'); + + Route::post('pireps/{pirep_id}/acars/events', 'AcarsController@acars_events'); + Route::post('pireps/{pirep_id}/acars/logs', 'AcarsController@acars_logs'); + + Route::get('settings', 'SettingsController@index'); + + // This is the info of the user whose token is in use + Route::get('user', 'UserController@index'); + Route::get('user/fleet', 'UserController@fleet'); + Route::get('user/pireps', 'UserController@pireps'); + + Route::get('user/bids', 'UserController@bids'); + Route::put('user/bids', 'UserController@bids'); + Route::post('user/bids', 'UserController@bids'); + Route::delete('user/bids', 'UserController@bids'); + + Route::get('users/{id}', 'UserController@get'); + Route::get('users/{id}/fleet', 'UserController@fleet'); + Route::get('users/{id}/pireps', 'UserController@pireps'); + + Route::get('users/{id}/bids', 'UserController@bids'); + Route::put('users/{id}/bids', 'UserController@bids'); + }); }); } } diff --git a/app/Providers/ViewComposerServiceProvider.php b/app/Providers/ViewComposerServiceProvider.php new file mode 100644 index 00000000..f531e99d --- /dev/null +++ b/app/Providers/ViewComposerServiceProvider.php @@ -0,0 +1,17 @@ +where(['state' => PirepState::IN_PROGRESS]); if ($live_time !== null && $live_time > 0) { diff --git a/app/Repositories/AirlineRepository.php b/app/Repositories/AirlineRepository.php index 896a8123..16c7bb1a 100644 --- a/app/Repositories/AirlineRepository.php +++ b/app/Repositories/AirlineRepository.php @@ -7,6 +7,9 @@ use App\Models\Airline; use Prettus\Repository\Contracts\CacheableInterface; use Prettus\Repository\Traits\CacheableRepository; +/** + * @mixin \App\Models\Airline + */ class AirlineRepository extends Repository implements CacheableInterface { use CacheableRepository; diff --git a/app/Repositories/JournalRepository.php b/app/Repositories/JournalRepository.php index 18f5308d..1758a292 100644 --- a/app/Repositories/JournalRepository.php +++ b/app/Repositories/JournalRepository.php @@ -110,7 +110,7 @@ class JournalRepository extends Repository implements CacheableInterface 'journal_id' => $journal->id, 'credit' => $credit ? $credit->getAmount() : null, 'debit' => $debit ? $debit->getAmount() : null, - 'currency' => config('phpvms.currency'), + 'currency' => setting('units.currency', 'USD'), 'memo' => $memo, 'post_date' => $post_date, 'transaction_group' => $transaction_group, diff --git a/app/Repositories/PageRepository.php b/app/Repositories/PageRepository.php new file mode 100644 index 00000000..4c02d6f9 --- /dev/null +++ b/app/Repositories/PageRepository.php @@ -0,0 +1,21 @@ + 'like', ]; diff --git a/app/Services/AircraftService.php b/app/Services/AircraftService.php new file mode 100644 index 00000000..047c7757 --- /dev/null +++ b/app/Services/AircraftService.php @@ -0,0 +1,32 @@ +pirepRepo = $pirepRepo; + } + + /** + * Recalculate all aircraft stats and hours + */ + public function recalculateStats() + { + $allAircraft = Aircraft::all(); // TODO: Soft delete + foreach ($allAircraft as $aircraft) { + $pirep_time_total = Pirep::where('aircraft_id', $aircraft->id) + ->sum('flight_time'); + $aircraft->flight_time = $pirep_time_total; + $aircraft->save(); + } + } +} diff --git a/app/Services/AirlineService.php b/app/Services/AirlineService.php index 56c5ad08..11264de1 100644 --- a/app/Services/AirlineService.php +++ b/app/Services/AirlineService.php @@ -28,6 +28,21 @@ class AirlineService extends Service $this->subfleetRepo = $subfleetRepo; } + /** + * Create a new airline, and initialize the journal + * + * @param array $attr + * + * @return \App\Models\Airline + */ + public function createAirline(array $attr): Airline + { + $airline = $this->airlineRepo->create($attr); + $airline->initJournal(setting('units.currency')); + + return $airline; + } + /** * Can the airline be deleted? Check if there are flights, etc associated with it * diff --git a/app/Services/BidService.php b/app/Services/BidService.php index 9e3e5ef6..c3f84f0b 100644 --- a/app/Services/BidService.php +++ b/app/Services/BidService.php @@ -13,6 +13,19 @@ use Illuminate\Support\Facades\Log; class BidService extends Service { + /** + * Get a specific bid for a user + * + * @param $bid_id + * + * @return \App\Models\Bid|\Illuminate\Database\Eloquent\Model|object|null + */ + public function getBid($bid_id) + { + return Bid::with(['flight', 'flight.simbrief']) + ->where(['id' => $bid_id])->first(); + } + /** * Find all of the bids for a given user * @@ -22,8 +35,8 @@ class BidService extends Service */ public function findBidsForUser(User $user) { - $bids = Bid::where(['user_id' => $user->id])->get(); - return $bids; + return Bid::with(['flight', 'flight.simbrief']) + ->where(['user_id' => $user->id])->get(); } /** @@ -86,7 +99,7 @@ class BidService extends Service $flight->has_bid = true; $flight->save(); - return $bid; + return $this->getBid($bid->id); } /** diff --git a/app/Services/CronService.php b/app/Services/CronService.php index fd1c98fd..6e4f8104 100644 --- a/app/Services/CronService.php +++ b/app/Services/CronService.php @@ -29,11 +29,18 @@ class CronService extends Service { $finder = new PhpExecutableFinder(); $php_path = $finder->find(false); + $php_exec = str_replace('-fpm', '', $php_path); + + // If this is the cgi version of the exec, add this arg, otherwise there's + // an error with no arguments existing + if (str_contains($php_exec, '-cgi')) { + $php_exec .= ' -d register_argc_argv=On'; + } $path = [ 'cd '.base_path(), '&&', - str_replace('-fpm', '', $php_path), + $php_exec, 'artisan schedule:run', ]; diff --git a/app/Services/Finance/PirepFinanceService.php b/app/Services/Finance/PirepFinanceService.php index 2cd99bbc..a5d03854 100644 --- a/app/Services/Finance/PirepFinanceService.php +++ b/app/Services/Finance/PirepFinanceService.php @@ -4,10 +4,14 @@ namespace App\Services\Finance; use App\Contracts\Service; use App\Events\Expenses as ExpensesEvent; +use App\Models\Aircraft; +use App\Models\Airport; use App\Models\Enums\ExpenseType; +use App\Models\Enums\FareType; use App\Models\Enums\PirepSource; use App\Models\Expense; use App\Models\Pirep; +use App\Models\Subfleet; use App\Repositories\ExpenseRepository; use App\Repositories\JournalRepository; use App\Services\FareService; @@ -59,11 +63,11 @@ class PirepFinanceService extends Service public function processFinancesForPirep(Pirep $pirep) { if (!$pirep->airline->journal) { - $pirep->airline->journal = $pirep->airline->initJournal(config('phpvms.currency')); + $pirep->airline->journal = $pirep->airline->initJournal(setting('units.currency', 'USD')); } if (!$pirep->user->journal) { - $pirep->user->journal = $pirep->user->initJournal(config('phpvms.currency')); + $pirep->user->journal = $pirep->user->initJournal(setting('units.currency', 'USD')); } // Clean out the expenses first @@ -121,13 +125,15 @@ class PirepFinanceService extends Service Log::info('Finance: Calculate: C='.$credit->toAmount().', D='.$debit->toAmount()); + $memo = FareType::label($fare->type).' fare: '.$fare->code.$fare->count + .'; price: '.$fare->price.', cost: '.$fare->cost; + $this->journalRepo->post( $pirep->airline->journal, $credit, $debit, $pirep, - 'Fares '.$fare->code.$fare->count - .'; price: '.$fare->price.', cost: '.$fare->cost, + $memo, null, 'Fares', 'fare' @@ -222,13 +228,19 @@ class PirepFinanceService extends Service /* * Go through the expenses and apply a mulitplier if present */ - $expenses->map(function ($expense, $i) use ($pirep) { - /*if ($expense->multiplier) { - # TODO: Modify the amount - }*/ - + $expenses->map(function (/** @var \App\Models\Expense */ $expense, $i) use ($pirep) { Log::info('Finance: PIREP: '.$pirep->id.', expense:', $expense->toArray()); + // Check to see if there is a certain fleet or flight type set on this expense + // if there is and it doesn't match up the flight type for the PIREP, skip it + if ($expense->ref_model === Expense::class) { + if (is_array($expense->flight_type) && count($expense->flight_type) > 0) { + if (!in_array($pirep->flight_type, $expense->flight_type, true)) { + return; + } + } + } + // Get the transaction group name from the ref_model name // This way it can be more dynamic and don't have to add special // tables or specific expense calls to accomodate all of these @@ -239,13 +251,13 @@ class PirepFinanceService extends Service } // Form the memo, with some specific ones depending on the group - if ($klass === 'Airport') { + if ($expense->ref_model === Airport::class) { $memo = "Airport Expense: {$expense->name} ({$expense->ref_model_id})"; $transaction_group = "Airport: {$expense->ref_model_id}"; - } elseif ($klass === 'Subfleet') { + } elseif ($expense->ref_model === Subfleet::class) { $memo = "Subfleet Expense: {$expense->name} ({$pirep->aircraft->subfleet->name})"; $transaction_group = "Subfleet: {$expense->name} ({$pirep->aircraft->subfleet->name})"; - } elseif ($klass === 'Aircraft') { + } elseif ($expense->ref_model === Aircraft::class) { $memo = "Aircraft Expense: {$expense->name} ({$pirep->aircraft->name})"; $transaction_group = "Aircraft: {$expense->name} " ."({$pirep->aircraft->name}-{$pirep->aircraft->registration})"; @@ -365,11 +377,18 @@ class PirepFinanceService extends Service public function payPilotForPirep(Pirep $pirep): void { $pilot_pay = $this->getPilotPay($pirep); - $pilot_pay_rate = $this->getPilotPayRateForPirep($pirep); - $memo = 'Pilot Payment @ '.$pilot_pay_rate; - Log::info('Finance: PIREP: '.$pirep->id - .'; pilot pay: '.$pilot_pay_rate.', total: '.$pilot_pay); + if ($pirep->flight && !empty($pirep->flight->pilot_pay)) { + $memo = 'Pilot fixed payment for flight: '.$pirep->flight->pilot_pay; + Log::info('Finance: PIREP: '.$pirep->id + .'; pilot pay: fixed for flight='.$pirep->flight->pilot_pay.', total: '.$pilot_pay); + } else { + $pilot_pay_rate = $this->getPilotPayRateForPirep($pirep); + $memo = 'Pilot Payment @ '.$pilot_pay_rate; + + Log::info('Finance: PIREP: '.$pirep->id + .'; pilot pay: '.$pilot_pay_rate.', total: '.$pilot_pay); + } $this->financeSvc->debitFromJournal( $pirep->airline->journal, @@ -521,6 +540,13 @@ class PirepFinanceService extends Service */ public function getPilotPay(Pirep $pirep) { + // If there is a fixed price for this flight, return that amount + $flight = $pirep->flight; + if ($flight && !empty($flight->pilot_pay)) { + return new Money(Money::convertToSubunit($flight->pilot_pay)); + } + + // Divided by 60 to get the rate per minute $pilot_rate = $this->getPilotPayRateForPirep($pirep) / 60; $payment = round($pirep->flight_time * $pilot_rate, 2); diff --git a/app/Services/FinanceService.php b/app/Services/FinanceService.php index 13372431..8866e716 100644 --- a/app/Services/FinanceService.php +++ b/app/Services/FinanceService.php @@ -37,6 +37,7 @@ class FinanceService extends Service * @param string $memo * @param string $transaction_group * @param string|array $tag + * @param string $post_date * * @throws \Prettus\Validator\Exceptions\ValidatorException * @@ -48,7 +49,8 @@ class FinanceService extends Service $reference, $memo, $transaction_group, - $tag + $tag, + $post_date = null ) { return $this->journalRepo->post( $journal, @@ -72,6 +74,7 @@ class FinanceService extends Service * @param string $memo * @param string $transaction_group * @param string|array $tag + * @param string $post_date * * @throws \Prettus\Validator\Exceptions\ValidatorException * @@ -83,7 +86,8 @@ class FinanceService extends Service $reference, $memo, $transaction_group, - $tag + $tag, + $post_date = null ) { return $this->journalRepo->post( $journal, @@ -91,7 +95,7 @@ class FinanceService extends Service $amount, $reference, $memo, - null, + $post_date, $transaction_group, $tag ); @@ -164,4 +168,16 @@ class FinanceService extends Service 'transactions' => $transactions, ]; } + + /** + * Change the currencies on the journals and transactions to the current currency value + */ + public function changeJournalCurrencies(): void + { + $currency = setting('units.currency', 'USD'); + $update = ['currency' => $currency]; + + Journal::query()->update($update); + JournalTransaction::query()->update($update); + } } diff --git a/app/Services/FlightService.php b/app/Services/FlightService.php index 14786a3f..f9cb19c3 100644 --- a/app/Services/FlightService.php +++ b/app/Services/FlightService.php @@ -130,7 +130,11 @@ class FlightService extends Service */ public function filterSubfleets($user, $flight) { + /** @var \Illuminate\Support\Collection $subfleets */ $subfleets = $flight->subfleets; + if ($subfleets === null || $subfleets->count() === 0) { + return $flight; + } /* * Only allow aircraft that the user has access to in their rank diff --git a/app/Services/ImportExport/ExpenseImporter.php b/app/Services/ImportExport/ExpenseImporter.php index ef619fea..7b0df07a 100644 --- a/app/Services/ImportExport/ExpenseImporter.php +++ b/app/Services/ImportExport/ExpenseImporter.php @@ -25,6 +25,7 @@ class ExpenseImporter extends ImportExport 'name' => 'required', 'amount' => 'required|numeric', 'type' => 'required', + 'flight_type' => 'nullable', 'charge_to_user' => 'nullable|boolean', 'multiplier' => 'nullable|numeric', 'active' => 'nullable|boolean', diff --git a/app/Services/ImportExport/FlightImporter.php b/app/Services/ImportExport/FlightImporter.php index e9813748..7c9653eb 100644 --- a/app/Services/ImportExport/FlightImporter.php +++ b/app/Services/ImportExport/FlightImporter.php @@ -25,26 +25,29 @@ class FlightImporter extends ImportExport * Should match the database fields, for the most part */ public static $columns = [ - 'airline' => 'required', - 'flight_number' => 'required', - 'route_code' => 'nullable', - 'route_leg' => 'nullable', - 'dpt_airport' => 'required', - 'arr_airport' => 'required', - 'alt_airport' => 'nullable', - 'days' => 'nullable', - 'dpt_time' => 'nullable', - 'arr_time' => 'nullable', - 'level' => 'nullable|integer', - 'distance' => 'nullable|numeric', - 'flight_time' => 'required|integer', - 'flight_type' => 'required|alpha', - 'route' => 'nullable', - 'notes' => 'nullable', - 'active' => 'nullable|boolean', - 'subfleets' => 'nullable', - 'fares' => 'nullable', - 'fields' => 'nullable', + 'airline' => 'required', + 'flight_number' => 'required', + 'route_code' => 'nullable', + 'route_leg' => 'nullable', + 'dpt_airport' => 'required', + 'arr_airport' => 'required', + 'alt_airport' => 'nullable', + 'days' => 'nullable', + 'dpt_time' => 'nullable', + 'arr_time' => 'nullable', + 'level' => 'nullable|integer', + 'distance' => 'nullable|numeric', + 'flight_time' => 'required|integer', + 'flight_type' => 'required|alpha', + 'load_factor' => 'nullable', + 'load_factor_variance' => 'nullable', + 'pilot_pay' => 'nullable', + 'route' => 'nullable', + 'notes' => 'nullable', + 'active' => 'nullable|boolean', + 'subfleets' => 'nullable', + 'fares' => 'nullable', + 'fields' => 'nullable', ]; private $airportSvc; diff --git a/app/Services/Installer/SeederService.php b/app/Services/Installer/SeederService.php index b38ebbf4..d82dd7ff 100644 --- a/app/Services/Installer/SeederService.php +++ b/app/Services/Installer/SeederService.php @@ -248,7 +248,7 @@ class SeederService extends Service // See if any of the options have changed if ($row->type === 'select') { - if ($row->options !== $setting['options']) { + if (!empty($row->options) && $row->options !== $setting['options']) { Log::info('Options for '.$id.' changed, update available'); return true; } diff --git a/app/Services/Metar/AviationWeather.php b/app/Services/Metar/AviationWeather.php index 8c894272..400ce1b3 100644 --- a/app/Services/Metar/AviationWeather.php +++ b/app/Services/Metar/AviationWeather.php @@ -4,6 +4,8 @@ namespace App\Services\Metar; use App\Contracts\Metar; use App\Support\HttpClient; +use function count; +use Exception; use Illuminate\Support\Facades\Log; /** @@ -44,15 +46,31 @@ class AviationWeather extends Metar try { $res = $this->httpClient->get($url, []); $xml = simplexml_load_string($res); - if (\count($xml->data->METAR->raw_text) === 0) { + + $attrs = $xml->data->attributes(); + if (!isset($attrs['num_results'])) { + return ''; + } + + $num_results = $attrs['num_results']; + if (empty($num_results)) { + return ''; + } + + $num_results = (int) $num_results; + if ($num_results === 0) { + return ''; + } + + if (count($xml->data->METAR->raw_text) === 0) { return ''; } return $xml->data->METAR->raw_text->__toString(); - } catch (\Exception $e) { + } catch (Exception $e) { Log::error('Error reading METAR: '.$e->getMessage()); - throw $e; + return ''; } } } diff --git a/app/Services/PirepService.php b/app/Services/PirepService.php index 7684738b..e59685dd 100644 --- a/app/Services/PirepService.php +++ b/app/Services/PirepService.php @@ -4,12 +4,17 @@ namespace App\Services; use App\Contracts\Service; use App\Events\PirepAccepted; +use App\Events\PirepCancelled; use App\Events\PirepFiled; use App\Events\PirepRejected; use App\Events\UserStatsChanged; +use App\Exceptions\AircraftNotAtAirport; +use App\Exceptions\AircraftPermissionDenied; use App\Exceptions\PirepCancelNotAllowed; +use App\Exceptions\UserNotAtAirport; use App\Models\Acars; use App\Models\Enums\AcarsType; +use App\Models\Enums\FlightType; use App\Models\Enums\PirepSource; use App\Models\Enums\PirepState; use App\Models\Enums\PirepStatus; @@ -26,24 +31,84 @@ use Illuminate\Support\Facades\Log; class PirepService extends Service { private $geoSvc; - private $pilotSvc; + private $userSvc; private $pirepRepo; /** * @param GeoService $geoSvc * @param PirepRepository $pirepRepo - * @param UserService $pilotSvc + * @param UserService $userSvc */ public function __construct( GeoService $geoSvc, PirepRepository $pirepRepo, - UserService $pilotSvc + UserService $userSvc ) { $this->geoSvc = $geoSvc; - $this->pilotSvc = $pilotSvc; + $this->userSvc = $userSvc; $this->pirepRepo = $pirepRepo; } + /** + * Create a prefiled PIREP + * + * @param \App\Models\User $user + * @param array $attrs + * + * @throws \Exception + * + * @return \App\Models\Pirep + */ + public function prefile(User $user, array $attrs): Pirep + { + $attrs['user_id'] = $user->id; + $attrs['state'] = PirepState::IN_PROGRESS; + + if (!array_key_exists('status', $attrs)) { + $attrs['status'] = PirepStatus::INITIATED; + } + + // Default to a scheduled passenger flight + if (!array_key_exists('flight_type', $attrs)) { + $attrs['flight_type'] = FlightType::SCHED_PAX; + } + + $pirep = new Pirep($attrs); + + // See if this user is at the current airport + /* @noinspection NotOptimalIfConditionsInspection */ + if (setting('pilots.only_flights_from_current') + && $user->curr_airport_id !== $pirep->dpt_airport_id) { + throw new UserNotAtAirport($user, $pirep->dpt_airport); + } + + // See if this user is allowed to fly this aircraft + if (setting('pireps.restrict_aircraft_to_rank', false) + && !$this->userSvc->aircraftAllowed($user, $pirep->aircraft_id)) { + throw new AircraftPermissionDenied($user, $pirep->aircraft); + } + + // See if this aircraft is at the departure airport + /* @noinspection NotOptimalIfConditionsInspection */ + if (setting('pireps.only_aircraft_at_dpt_airport') + && $pirep->aircraft_id !== $pirep->dpt_airport_id) { + throw new AircraftNotAtAirport($pirep->aircraft); + } + + // Find if there's a duplicate, if so, let's work on that + $dupe_pirep = $this->findDuplicate($pirep); + if ($dupe_pirep !== false) { + $pirep = $dupe_pirep; + if ($pirep->cancelled) { + throw new \App\Exceptions\PirepCancelled($pirep); + } + } + + $pirep->save(); + + return $pirep; + } + /** * Create a new PIREP with some given fields * @@ -255,6 +320,8 @@ class PirepService extends Service 'status' => PirepStatus::CANCELLED, ], $pirep->id); + event(new PirepCancelled($pirep)); + return $pirep; } @@ -345,9 +412,9 @@ class PirepService extends Service $ft = $pirep->flight_time; $pilot = $pirep->user; - $this->pilotSvc->adjustFlightTime($pilot, $ft); - $this->pilotSvc->adjustFlightCount($pilot, +1); - $this->pilotSvc->calculatePilotRank($pilot); + $this->userSvc->adjustFlightTime($pilot, $ft); + $this->userSvc->adjustFlightCount($pilot, +1); + $this->userSvc->calculatePilotRank($pilot); $pirep->user->refresh(); // Change the status @@ -384,9 +451,9 @@ class PirepService extends Service $user = $pirep->user; $ft = $pirep->flight_time * -1; - $this->pilotSvc->adjustFlightTime($user, $ft); - $this->pilotSvc->adjustFlightCount($user, -1); - $this->pilotSvc->calculatePilotRank($user); + $this->userSvc->adjustFlightTime($user, $ft); + $this->userSvc->adjustFlightCount($user, -1); + $this->userSvc->calculatePilotRank($user); $pirep->user->refresh(); } diff --git a/app/Services/RoleService.php b/app/Services/RoleService.php index 1b6c0058..2fce2aca 100644 --- a/app/Services/RoleService.php +++ b/app/Services/RoleService.php @@ -39,7 +39,7 @@ class RoleService extends Service { // Update the permissions, filter out null/invalid values $perms = collect($permissions)->filter(static function ($v, $k) { - return $v; + return !empty($v); }); $role->permissions()->sync($perms); diff --git a/app/Services/SimBriefService.php b/app/Services/SimBriefService.php new file mode 100644 index 00000000..c47191e8 --- /dev/null +++ b/app/Services/SimBriefService.php @@ -0,0 +1,195 @@ +httpClient = $httpClient; + } + + /** + * Check to see if the OFP exists server-side. If it does, download it and + * cache it immediately + * + * @param string $user_id User who generated this + * @param string $ofp_id The SimBrief OFP ID + * @param string $flight_id The flight ID + * + * @return SimBrief|null + */ + public function checkForOfp(string $user_id, string $ofp_id, string $flight_id) + { + $uri = str_replace('{id}', $ofp_id, config('phpvms.simbrief_url')); + + $opts = [ + 'connect_timeout' => 2, // wait two seconds by default + 'allow_redirects' => false, + ]; + + try { + $response = $this->httpClient->request('GET', $uri, $opts); + if ($response->getStatusCode() !== 200) { + return null; + } + } catch (GuzzleException $e) { + Log::error('Simbrief HTTP Error: '.$e->getMessage()); + return null; + } + + $body = $response->getBody()->getContents(); + + /** @var SimBriefXML $ofp */ + $ofp = simplexml_load_string($body, SimBriefXML::class); + + $attrs = [ + 'user_id' => $user_id, + 'flight_id' => $flight_id, + 'ofp_xml' => $ofp->asXML(), + ]; + + // Try to download the XML file for ACARS. If it doesn't work, try to modify the main OFP + $acars_xml = $this->getAcarsOFP($ofp); + if (empty($acars_xml)) { + $new_doctype = ''; + $acars_xml = str_replace('', $new_doctype, $body); + $acars_xml = str_replace('', '', $acars_xml); + $acars_xml = str_replace("\n", '', $acars_xml); + + $attrs['acars_xml'] = simplexml_load_string($acars_xml)->asXML(); + } else { + $attrs['acars_xml'] = $acars_xml->asXML(); + } + + // Save this into the Simbrief table, if it doesn't already exist + return SimBrief::updateOrCreate( + ['id' => $ofp_id], + $attrs + ); + } + + /** + * @param \App\Models\SimBriefXML $ofp + * + * @return \SimpleXMLElement|null + */ + public function getAcarsOFP(SimBriefXML $ofp) + { + $url = $ofp->getAcarsXmlUrl(); + if (empty($url)) { + return null; + } + + $opts = [ + 'connect_timeout' => 2, // wait two seconds by default + 'allow_redirects' => true, + ]; + + try { + $response = $this->httpClient->request('GET', $url, $opts); + if ($response->getStatusCode() !== 200) { + return null; + } + } catch (GuzzleException $e) { + Log::error('Simbrief HTTP Error: '.$e->getMessage()); + dd($e); + return null; + } + + $body = $response->getBody()->getContents(); + return simplexml_load_string($body); + } + + /** + * Create a prefiled PIREP from a given brief. + * + * 1. Read from the XML the basic PIREP info (dep, arr), and then associate the PIREP + * to the flight ID + * 2. Remove the flight ID from the SimBrief field and assign the pirep_id to the row + * 3. Update the planned flight route in the acars table + * 4. Add additional flight fields (ones which match ACARS) + * + * @param $pirep + * @param SimBrief $simBrief The briefing to create the PIREP from + * + * @return \App\Models\Pirep + */ + public function attachSimbriefToPirep($pirep, SimBrief $simBrief): Pirep + { + $this->addRouteToPirep($pirep, $simBrief); + + $simBrief->pirep_id = $pirep->id; + $simBrief->flight_id = null; + $simBrief->save(); + + return $pirep; + } + + /** + * Add the route from a SimBrief flight plan to a PIREP + * + * @param Pirep $pirep + * @param SimBrief $simBrief + * + * @return Pirep + */ + protected function addRouteToPirep($pirep, SimBrief $simBrief): Pirep + { + // Clear previous entries + Acars::where(['pirep_id' => $pirep->id, 'type' => AcarsType::ROUTE])->delete(); + + // Create the flight route + $order = 1; + foreach ($simBrief->xml->getRoute() as $fix) { + $position = [ + 'name' => $fix->ident, + 'pirep_id' => $pirep->id, + 'type' => AcarsType::ROUTE, + 'order' => $order++, + 'lat' => $fix->pos_lat, + 'lon' => $fix->pos_long, + ]; + + $acars = new Acars($position); + $acars->save(); + } + + return $pirep; + } + + /** + * Remove any expired entries from the SimBrief table. Expired means there's + * a flight_id attached to it, but no pirep_id (meaning it was never used for + * an actual flight) + */ + public function removeExpiredEntries(): void + { + $expire_days = setting('simbrief.expire_days', 5); + $expire_time = Carbon::now('UTC')->subDays($expire_days)->toDateTimeString(); + + $briefs = SimBrief::where([ + ['pirep_id', '=', ''], + ['created_at', '<', $expire_time], + ])->get(); + + foreach ($briefs as $brief) { + $brief->delete(); + + // TODO: Delete any assets + } + } +} diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 9d46c1ac..42b955e2 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -17,6 +17,7 @@ use App\Repositories\AircraftRepository; use App\Repositories\SubfleetRepository; use App\Repositories\UserRepository; use App\Support\Units\Time; +use App\Support\Utils; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; use function is_array; @@ -48,15 +49,19 @@ class UserService extends Service * Register a pilot. Also attaches the initial roles * required, and then triggers the UserRegistered event * - * @param User $user User model + * @param array $attrs Array with the user data * @param array $roles List of "display_name" of groups to assign * * @throws \Exception * - * @return mixed + * @return User */ - public function createUser(User $user, array $roles = null) + public function createUser(array $attrs, array $roles = null): User { + $user = User::create($attrs); + $user->api_key = Utils::generateApiKey(); + $user->curr_airport_id = $user->home_airport_id; + // Determine if we want to auto accept if (setting('pilots.auto_accept') === true) { $user->state = UserState::ACTIVE; @@ -130,6 +135,13 @@ class UserService extends Service return $user; } + /** + * Return true or false if a pilot ID already exists + * + * @param int $pilot_id + * + * @return bool + */ public function isPilotIdAlreadyUsed(int $pilot_id): bool { return User::where('pilot_id', '=', $pilot_id)->exists(); diff --git a/app/Services/VersionService.php b/app/Services/VersionService.php index 26b39721..422a1825 100644 --- a/app/Services/VersionService.php +++ b/app/Services/VersionService.php @@ -76,7 +76,7 @@ class VersionService extends Service } /** - * Download the latest version from github + * Download the latest version from github and return the version number */ private function getLatestVersionGithub() { @@ -96,6 +96,7 @@ class VersionService extends Service foreach ($releases as $release) { if ($release['prerelease'] === true) { if ($include_prerelease) { + Log::info('Found latest pre-release of '.$release['tag_name']); return $this->setLatestRelease( $release['tag_name'], $this->getGithubAsset($release) @@ -104,13 +105,14 @@ class VersionService extends Service continue; } + Log::info('Found latest release of '.$release['tag_name']); return $this->setLatestRelease( $release['tag_name'], $this->getGithubAsset($release) ); } - return $releases; + return null; } /** @@ -131,12 +133,30 @@ class VersionService extends Service */ public function getBuildId($cfg) { + return $cfg['build']['number']; + } + + /** + * Generate a build ID + * + * @param array $cfg The version config + * + * @return false|string + */ + public function generateBuildId($cfg) + { + $date = date('ymd'); exec($cfg['git']['git-local'], $version); + if (empty($version)) { + return $date; + } + $version = substr($version[0], 0, $cfg['build']['length']); // prefix with the date in YYMMDD format - $date = date('ymd'); - return $date.'.'.$version; + $version = $date.'.'.$version; + + return $version; } /** @@ -163,8 +183,9 @@ class VersionService extends Service if ($include_build) { // Get the current build id $build_number = $this->getBuildId($cfg); - $cfg['build']['number'] = $build_number; - $version = $version.'+'.$build_number; + if (!empty($build_number)) { + $version = $version.'+'.$build_number; + } } return $version; @@ -186,9 +207,12 @@ class VersionService extends Service } // Replace "dev" with "alpha", since - $latest_version = $this->getLatestVersion(); + if (empty($latest_version)) { + return false; + } + // Convert to semver if ($this->isGreaterThan($latest_version, $current_version)) { $this->kvpRepo->save('new_version_available', true); diff --git a/app/Support/Countries.php b/app/Support/Countries.php index 47151f95..ba881039 100644 --- a/app/Support/Countries.php +++ b/app/Support/Countries.php @@ -12,15 +12,13 @@ class Countries /** * Get a select box list of all the countries * - * @return static + * @return \Illuminate\Support\Collection */ public static function getSelectList() { - $countries = collect((new ISO3166())->all()) + return collect((new ISO3166())->all()) ->mapWithKeys(static function ($item, $key) { return [strtolower($item['alpha2']) => $item['name']]; }); - - return $countries; } } diff --git a/app/Support/Dates.php b/app/Support/Dates.php index a97cc457..6728a6fe 100644 --- a/app/Support/Dates.php +++ b/app/Support/Dates.php @@ -6,6 +6,36 @@ use Carbon\Carbon; class Dates { + /** + * Bitwise operator for setting days of week to integer field + * + * @param int $datefield initial datefield + * @param array $day_enums Array of values from config("enum.days") + * + * @return int + */ + public static function setDays(int $datefield, array $day_enums): int + { + foreach ($day_enums as $day) { + $datefield |= $day; + } + + return $datefield; + } + + /** + * Bit check if a day exists within a integer bitfield + * + * @param int $datefield datefield from database + * @param int $day_enum Value from config("enum.days") + * + * @return bool + */ + public static function hasDay(int $datefield, int $day_enum): bool + { + return ($datefield & $day_enum) === $datefield; + } + /** * Get the list of months, given a start date * diff --git a/app/Support/HttpClient.php b/app/Support/HttpClient.php index cef76136..6bb2f9d0 100644 --- a/app/Support/HttpClient.php +++ b/app/Support/HttpClient.php @@ -44,4 +44,29 @@ class HttpClient return $body; } + + /** + * Download a file to a given path + * + * @param $uri + * @param $local_path + * + * @return string + */ + public function download($uri, $local_path) + { + $opts = []; + if ($local_path !== null) { + $opts['sink'] = $local_path; + } + + $response = $this->httpClient->request('GET', $uri, $opts); + + $body = $response->getBody()->getContents(); + if ($response->getHeader('content-type') === 'application/json') { + $body = \GuzzleHttp\json_decode($body); + } + + return $body; + } } diff --git a/app/Support/Metar.php b/app/Support/Metar.php index 21cfa874..95146e74 100644 --- a/app/Support/Metar.php +++ b/app/Support/Metar.php @@ -843,6 +843,7 @@ class Metar implements \ArrayAccess * if visibility is limited to an integer mile plus a fraction part. * Format is mmSM for mm = statute miles, or m n/dSM for m = mile and n/d = fraction of a mile, * or just a 4-digit number nnnn (with leading zeros) for nnnn = meters. + * Unit can also be in KM * * @param mixed $part * @@ -858,7 +859,7 @@ class Metar implements \ArrayAccess .'([\d]{0,2})?' // 3 .'(([1357])' // 4 .'/(2|4|8|16))?' // 5 - .'SM|////)$@'; // 6 + .'(SM|KM|M|MI)|////)$@'; // 6 if (!preg_match($r, $part, $found)) { return false; @@ -884,8 +885,7 @@ class Metar implements \ArrayAccess // ICAO visibility (in meters) if (isset($found[2]) && !empty($found[2])) { $visibility = $this->createDistance((int) $found[2], 'm'); - } // US visibility (in miles) - else { + } else { if (isset($found[3]) && !empty($found[3])) { $prefix = 'Less than '; } @@ -896,16 +896,34 @@ class Metar implements \ArrayAccess $visibility = (int) $found[4]; } - $visibility = $this->createDistance($visibility, 'mi'); + $units = strtoupper($found[8]); + if ($units == 'MI' || $units == 'SM') { + $unit = 'mi'; + } elseif ($units == 'M') { + $unit = 'm'; + } elseif ($units == 'KM') { + $unit = 'km'; + } else { + $unit = $units; + } + + $visibility = $this->createDistance($visibility, $unit); } - $unit = ' meters'; - if ($visibility['m'] <= 1) { - $unit = ' meter'; + if ($visibility['m'] > 1000) { + $unit = ' km'; + $report = $prefix.$visibility['km'].$unit; + } else { + $unit = ' meters'; + if ($visibility['m'] <= 1) { + $unit = ' meter'; + } + + $report = $prefix.$visibility['m'].$unit; } $this->set_result_value('visibility', $visibility); - $this->set_result_value('visibility_report', $prefix.$visibility['m'].$unit); + $this->set_result_value('visibility_report', $report); } return true; diff --git a/app/Support/Money.php b/app/Support/Money.php index d01d3e8d..6cb25e83 100644 --- a/app/Support/Money.php +++ b/app/Support/Money.php @@ -16,7 +16,9 @@ class Money public static $subunit_multiplier; /** - * @param mixed $amount + * Create a new Money instance, passing in the amount in pennies + * + * @param mixed $amount The amount, in pennies * * @throws \UnexpectedValueException * @throws \InvalidArgumentException @@ -31,7 +33,7 @@ class Money /** * Create from a dollar amount * - * @param mixed $amount + * @param mixed $amount The amount in pennies * * @throws \UnexpectedValueException * @throws \InvalidArgumentException @@ -54,7 +56,7 @@ class Money */ public static function convertToSubunit($amount) { - $currency = config('phpvms.currency'); + $currency = setting('units.currency', 'USD'); return (int) $amount * config('money.'.$currency.'.subunit'); } @@ -69,7 +71,7 @@ class Money public static function currency() { try { - return new Currency(config('phpvms.currency', 'USD')); + return new Currency(setting('units.currency', 'USD')); } catch (\OutOfBoundsException $e) { return new Currency('USD'); } diff --git a/app/Support/Units/Time.php b/app/Support/Units/Time.php index 29d09c24..89add153 100644 --- a/app/Support/Units/Time.php +++ b/app/Support/Units/Time.php @@ -4,9 +4,6 @@ namespace App\Support\Units; use Illuminate\Contracts\Support\Arrayable; -/** - * Class Time - */ class Time implements Arrayable { public $hours; @@ -90,4 +87,118 @@ class Time implements Arrayable { return $this->getMinutes(); } + + /** + * @param string $minutes + * + * @return array + */ + public static function minutesToTimeParts($minutes): array + { + $hours = floor($minutes / 60); + $minutes %= 60; + + return ['h' => $hours, 'm' => $minutes]; + } + + public static function minutesToTimeString($minutes): string + { + $hm = self::minutesToTimeParts($minutes); + return $hm['h'].'h '.$hm['m'].'m'; + } + + /** + * Convert seconds to an array of hours, minutes, seconds + * + * @param int $seconds + * + * @throws \Exception + * + * @return array['h', 'm', 's'] + */ + public static function secondsToTimeParts($seconds): array + { + $dtF = new \DateTimeImmutable('@0', new \DateTimeZone('UTC')); + $dtT = new \DateTimeImmutable("@$seconds", new \DateTimeZone('UTC')); + + $t = $dtF->diff($dtT); + + $retval = []; + $retval['h'] = (int) $t->format('%h'); + $retval['m'] = (int) $t->format('%i'); + $retval['s'] = (int) $t->format('%s'); + + return $retval; + } + + /** + * Convert seconds to HH MM format + * + * @param int $seconds + * @param bool $incl_sec + * + * @throws \Exception + * + * @return string + */ + public static function secondsToTimeString($seconds, $incl_sec = false): string + { + $hms = self::secondsToTimeParts($seconds); + $format = $hms['h'].'h '.$hms['m'].'m'; + if ($incl_sec) { + $format .= ' '.$hms['s'].'s'; + } + + return $format; + } + + /** + * @param $minutes + * + * @return float|int + */ + public static function minutesToSeconds($minutes) + { + return $minutes * 60; + } + + /** + * Convert the seconds to minutes and then round it up + * + * @param $seconds + * + * @return float|int + */ + public static function secondsToMinutes($seconds) + { + return ceil($seconds / 60); + } + + /** + * Convert hours to minutes. Pretty complex + * + * @param $minutes + * + * @return float|int + */ + public static function minutesToHours($minutes) + { + return $minutes / 60; + } + + /** + * @param $hours + * @param null $minutes + * + * @return float|int + */ + public static function hoursToMinutes($hours, $minutes = null) + { + $total = (int) $hours * 60; + if ($minutes) { + $total += (int) $minutes; + } + + return $total; + } } diff --git a/app/Support/Utils.php b/app/Support/Utils.php index 6889e2bb..98455e24 100644 --- a/app/Support/Utils.php +++ b/app/Support/Utils.php @@ -2,8 +2,11 @@ namespace App\Support; +use App\Contracts\Model; +use Hashids\Hashids; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Support\Str; +use LayerShifter\TLDExtract\Extract; use Nwidart\Modules\Facades\Module; /** @@ -11,6 +14,55 @@ use Nwidart\Modules\Facades\Module; */ class Utils { + /** + * Generate a new ID with a given length + * + * @param int [$length] + * + * @return string + */ + public static function generateNewId(int $length = null) + { + if (!$length) { + $length = Model::ID_MAX_LENGTH; + } + + $hashids = new Hashids(uniqid(), $length); + $mt = str_replace('.', '', microtime(true)); + return $hashids->encode($mt); + } + + /** + * Returns a 40 character API key that a user can use + * + * @return string + */ + public static function generateApiKey(): string + { + $key = substr(sha1(time().mt_rand()), 0, 20); + return $key; + } + + /** + * Simple check on the first character if it's an object or not + * + * @param $obj + * + * @return bool + */ + public static function isObject($obj): bool + { + if (!$obj) { + return false; + } + + if ($obj[0] === '{' || $obj[0] === '[') { + return true; + } + + return false; + } + /** * Enable the debug toolbar */ @@ -58,19 +110,14 @@ class Utils */ public static function getRootDomain(string $url): string { - if (!Str::contains($url, ['https://', 'http://'])) { - $url = 'http://'.$url; + if (Str::contains($url, ['https://', 'http://'])) { + $url = str_replace('https://', '', $url); + $url = str_replace('http://', '', $url); } - $domain = parse_url($url, PHP_URL_HOST); - $domain = explode('.', $domain); - $len = count($domain); - if ($len == 1) { - return $domain[0]; - } + $extract = new Extract(); + $result = $extract->parse($url); - $domain = $domain[$len - 2].'.'.$domain[$len - 1]; - - return $domain; + return $result->getRegistrableDomain(); } } diff --git a/app/Widgets/Weather.php b/app/Widgets/Weather.php index 1cf6491d..194e356e 100644 --- a/app/Widgets/Weather.php +++ b/app/Widgets/Weather.php @@ -19,6 +19,7 @@ class Weather extends Widget */ public function run() { + /** @var \App\Services\AirportService $airportSvc */ $airportSvc = app(AirportService::class); $metar = $airportSvc->getMetar($this->config['icao']); diff --git a/app/helpers.php b/app/helpers.php index 379fcc37..48798da7 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -1,6 +1,7 @@ retrieve($key); @@ -177,7 +179,7 @@ if (!function_exists('setting')) { if (!function_exists('setting_save')) { function setting_save($key, $value) { - $settingRepo = app('setting'); + $settingRepo = app(SettingRepository::class); $settingRepo->save($key, $value); return $value; } @@ -192,7 +194,6 @@ if (!function_exists('public_asset')) { { $publicBaseUrl = app()->publicUrlPath(); $path = $publicBaseUrl.$path; - $path = str_replace('//', '/', $path); return url($path, $parameters); @@ -306,3 +307,17 @@ if (!function_exists('_fmt')) { return $line; } } + +if (!function_exists('docs_link')) { + /** + * Return a link to the docs + * + * @param string $key Key from phpvms.config.docs + * + * @return string + */ + function docs_link($key) + { + return config('phpvms.docs.root').config('phpvms.docs.'.$key); + } +} diff --git a/composer.json b/composer.json index 54b37336..48246d30 100755 --- a/composer.json +++ b/composer.json @@ -4,23 +4,28 @@ "keywords": ["phpvms", "virtual", "airlines"], "license": "BSD-3-Clause", "type": "project", - "minimum-stability": "stable", + "minimum-stability": "dev", + "prefer-stable": true, "homepage": "http://www.phpvms.net", "require": { "php": ">=7.2", "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", + "ext-bcmath": "*", "ext-pdo": "*", "composer/composer": "~1.8.0", + "composer/installers": "~1.0", "laravel/framework": "~6.0", "akaunting/money": "^1.0", "anhskohbo/no-captcha": "^3.0", "appstract/laravel-opcache": "^2.0", "arrilot/laravel-widgets": "~3.13.0", + "codedge/laravel-selfupdater": "~2.5.1", "doctrine/dbal": "~2.9.2", "elcobvg/laravel-opcache": "~0.4", "facade/ignition": "^1.6", + "fideloper/proxy": "^4.3", "guzzlehttp/guzzle": "~6.3.3", "hashids/hashids": "^2.0.0", "igaster/laravel-theme": "^2.0", @@ -31,6 +36,7 @@ "laracasts/flash": "^3.0", "laravel/helpers": "^1.0", "laravelcollective/html": "~6.0.0", + "layershifter/tld-extract": "^2.0", "league/csv": "9.2.*", "league/geotools": "0.8.*", "league/iso3166": "2.1.*", @@ -39,6 +45,7 @@ "nabeel/vacentral": "~2.0", "nwidart/laravel-modules": "^6.0", "php-units-of-measure/php-units-of-measure": "~2.1.0", + "phpvms/sample-module": "^1.0", "pragmarx/version": "0.2.*", "prettus/l5-repository": "~2.6.0", "santigarcor/laratrust": "~5.2.0", @@ -49,7 +56,9 @@ "symfony/polyfill-iconv": "~1.12", "theiconic/php-ga-measurement-protocol": "2.7.*", "tivie/php-os-detector": "~1.1.0", - "webpatser/laravel-uuid": "~3.0" + "vlucas/phpdotenv": "v3.6.0", + "webpatser/laravel-uuid": "~3.0", + "oomphinc/composer-installers-extender": "^1.1" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.0", @@ -58,7 +67,7 @@ "codedungeon/phpunit-result-printer": "^0.13.0", "filp/whoops": "~2.0", "fzaninotto/faker": "~1.9.0", - "friendsofphp/php-cs-fixer": "^2.15", + "friendsofphp/php-cs-fixer": "^2.16", "mockery/mockery": "0.9.*", "nunomaduro/collision": "^3.0", "phpunit/phpunit": "~8.3", @@ -85,17 +94,27 @@ ] }, "extra": { + "installer-types": ["phpvms-module"], "installer-paths": { - "modules/{$name}/": [ - "type:laravel-library", - "type:phpvms-plugin" - ] - } + "modules/{$name}/": ["type:phpvms-module"] + }, + "module-dir": "modules" }, "scripts": { + "pre-package-uninstall": [ + "@php -r \"array_map('unlink', glob('bootstrap/cache/*'));\"" + ], + "post-package-uninstall": [ + "@php artisan package:discover --ansi", + "@php artisan phpvms:caches" + ], + "pre-autoload-dump": [ + "@php -r \"array_map('unlink', glob('bootstrap/cache/*'));\"" + ], "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", - "@php artisan package:discover --ansi" + "@php artisan package:discover --ansi", + "@php artisan phpvms:caches" ] }, "config": { diff --git a/composer.lock b/composer.lock index 93751f4d..f8754b1f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,30 +4,30 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7ab7801c9f860a11cf2eca809a84de43", + "content-hash": "a5cdba00988afe1f4de02ee0a1a24fbd", "packages": [ { "name": "akaunting/money", - "version": "1.0.14", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/akaunting/money.git", - "reference": "058b2256344ca5cb17aa1fecb574f5264a2444ef" + "reference": "1bab074aa71ed994eff140b26fb6ce9aecf82430" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/akaunting/money/zipball/058b2256344ca5cb17aa1fecb574f5264a2444ef", - "reference": "058b2256344ca5cb17aa1fecb574f5264a2444ef", + "url": "https://api.github.com/repos/akaunting/money/zipball/1bab074aa71ed994eff140b26fb6ce9aecf82430", + "reference": "1bab074aa71ed994eff140b26fb6ce9aecf82430", "shasum": "" }, "require": { - "illuminate/support": ">=5.2", - "illuminate/view": ">=5.2", - "php": ">=5.5.9" + "illuminate/support": ">=5.4", + "illuminate/view": ">=5.4", + "php": ">=5.6.4" }, "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0" + "mockery/mockery": ">=1.0", + "phpunit/phpunit": ">=5.7" }, "type": "library", "extra": { @@ -65,25 +65,25 @@ "laravel", "money" ], - "time": "2019-12-26T08:11:31+00:00" + "time": "2020-03-09T15:01:03+00:00" }, { "name": "anhskohbo/no-captcha", - "version": "3.1.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/anhskohbo/no-captcha.git", - "reference": "3b2f7d461e1fc7153e0c724c3ccac7a2db156733" + "reference": "c14dd67024f30fd28f38ac9faa44cc47e1d4bddf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/anhskohbo/no-captcha/zipball/3b2f7d461e1fc7153e0c724c3ccac7a2db156733", - "reference": "3b2f7d461e1fc7153e0c724c3ccac7a2db156733", + "url": "https://api.github.com/repos/anhskohbo/no-captcha/zipball/c14dd67024f30fd28f38ac9faa44cc47e1d4bddf", + "reference": "c14dd67024f30fd28f38ac9faa44cc47e1d4bddf", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^6.2", - "illuminate/support": "^5.0|^6.0", + "illuminate/support": "^5.0|^6.0|^7.0", "php": ">=5.5.5" }, "require-dev": { @@ -125,7 +125,7 @@ "no-captcha", "recaptcha" ], - "time": "2019-10-03T06:42:31+00:00" + "time": "2020-03-04T03:27:38+00:00" }, { "name": "appstract/laravel-opcache", @@ -245,6 +245,7 @@ "lush-http", "php" ], + "abandoned": true, "time": "2019-05-28T15:08:43+00:00" }, { @@ -358,7 +359,7 @@ { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" + "homepage": "https://github.com/Nyholm" } ], "description": "Common classes for PSR-6 adapters", @@ -413,7 +414,7 @@ "/Tests/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -426,7 +427,7 @@ { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" + "homepage": "https://github.com/Nyholm" } ], "description": "A PSR-6 cache implementation using a php array. This implementation supports tags", @@ -475,7 +476,7 @@ "/Tests/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -488,7 +489,7 @@ { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" + "homepage": "https://github.com/Nyholm" } ], "description": "A helper trait and interface to your PSR-6 cache to support hierarchical keys.", @@ -530,7 +531,7 @@ "Cache\\TagInterop\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -538,7 +539,7 @@ { "name": "Tobias Nyholm", "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" + "homepage": "https://github.com/Nyholm" }, { "name": "Nicolas Grekas", @@ -557,17 +558,85 @@ "time": "2017-03-13T09:14:27+00:00" }, { - "name": "composer/ca-bundle", - "version": "1.2.6", + "name": "codedge/laravel-selfupdater", + "version": "2.5.2", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e" + "url": "https://github.com/codedge/laravel-selfupdater.git", + "reference": "0d7d4eb7ea9e9ab42177df560d0b2e06296a84bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e", + "url": "https://api.github.com/repos/codedge/laravel-selfupdater/zipball/0d7d4eb7ea9e9ab42177df560d0b2e06296a84bd", + "reference": "0d7d4eb7ea9e9ab42177df560d0b2e06296a84bd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "6.*", + "laravel/framework": "^5.8|6.*", + "php": ">=7.2" + }, + "require-dev": { + "dg/bypass-finals": "^1.1", + "mockery/mockery": "^1.0", + "orchestra/testbench": "^4.0", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Codedge\\Updater\\UpdaterServiceProvider" + ], + "aliases": { + "Updater": "Codedge\\Updater\\UpdaterFacade" + } + } + }, + "autoload": { + "psr-4": { + "Codedge\\Updater\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Holger Lösken", + "email": "holger.loesken@codedge.de", + "homepage": "http://codedge.de", + "role": "Developer" + } + ], + "description": "Providing an auto-updating functionality for your self-hosted Laravel application.", + "keywords": [ + "auto update", + "auto-update", + "laravel", + "laravel application", + "self update", + "self-hosted laravel application", + "self-update", + "update" + ], + "time": "2020-03-02T22:07:04+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.2.7", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd", "shasum": "" }, "require": { @@ -610,7 +679,7 @@ "ssl", "tls" ], - "time": "2020-01-13T10:02:55+00:00" + "time": "2020-04-08T08:27:21+00:00" }, { "name": "composer/composer", @@ -692,6 +761,133 @@ ], "time": "2019-06-11T13:03:06+00:00" }, + { + "name": "composer/installers", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.6.* || 2.0.*@dev", + "composer/semver": "1.0.* || 2.0.*@dev", + "phpunit/phpunit": "^4.8.36", + "sebastian/comparator": "^1.2.4", + "symfony/process": "^2.3" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "time": "2020-04-07T06:57:05+00:00" + }, { "name": "composer/semver", "version": "1.5.1", @@ -755,16 +951,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", - "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", "shasum": "" }, "require": { @@ -811,20 +1007,20 @@ "spdx", "validator" ], - "time": "2019-07-29T10:31:59+00:00" + "time": "2020-02-14T07:44:31+00:00" }, { "name": "composer/xdebug-handler", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "cbe23383749496fe0f373345208b79568e4bc248" + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", - "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", "shasum": "" }, "require": { @@ -855,7 +1051,7 @@ "Xdebug", "performance" ], - "time": "2019-11-06T16:40:04+00:00" + "time": "2020-03-01T12:26:26+00:00" }, { "name": "doctrine/cache", @@ -1282,16 +1478,16 @@ }, { "name": "egulias/email-validator", - "version": "2.1.15", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "e834eea5306d85d67de5a05db5882911d5b29357" + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e834eea5306d85d67de5a05db5882911d5b29357", - "reference": "e834eea5306d85d67de5a05db5882911d5b29357", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", "shasum": "" }, "require": { @@ -1336,7 +1532,7 @@ "validation", "validator" ], - "time": "2020-01-20T21:40:59+00:00" + "time": "2020-02-13T22:36:52+00:00" }, { "name": "elcobvg/laravel-opcache", @@ -1397,23 +1593,23 @@ }, { "name": "facade/flare-client-php", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/facade/flare-client-php.git", - "reference": "24444ea0e1556f0a4b5fc8e61802caf72ae9a408" + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/24444ea0e1556f0a4b5fc8e61802caf72ae9a408", - "reference": "24444ea0e1556f0a4b5fc8e61802caf72ae9a408", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", "shasum": "" }, "require": { "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "~5.5|~5.6|~5.7|~5.8|^6.0", + "illuminate/pipeline": "^5.5|^6.0|^7.0", "php": "^7.1", - "symfony/http-foundation": "~3.3|~4.1", + "symfony/http-foundation": "^3.3|^4.1|^5.0", "symfony/var-dumper": "^3.4|^4.0|^5.0" }, "require-dev": { @@ -1447,20 +1643,20 @@ "flare", "reporting" ], - "time": "2019-12-15T18:28:38+00:00" + "time": "2020-03-02T15:52:04+00:00" }, { "name": "facade/ignition", - "version": "1.16.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "37f094775814b68d0c6cc8b8ff3c3be243f20725" + "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/37f094775814b68d0c6cc8b8ff3c3be243f20725", - "reference": "37f094775814b68d0c6cc8b8ff3c3be243f20725", + "url": "https://api.github.com/repos/facade/ignition/zipball/af05ac5ee8587395d7474ec0681c08776a2cb09d", + "reference": "af05ac5ee8587395d7474ec0681c08776a2cb09d", "shasum": "" }, "require": { @@ -1487,7 +1683,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "v2.x-dev" + "dev-master": "1.x-dev" }, "laravel": { "providers": [ @@ -1518,7 +1714,7 @@ "laravel", "page" ], - "time": "2020-01-21T17:46:02+00:00" + "time": "2020-03-05T12:39:07+00:00" }, { "name": "facade/ignition-contracts", @@ -1564,6 +1760,60 @@ ], "time": "2019-08-30T14:06:08+00:00" }, + { + "name": "fideloper/proxy", + "version": "4.3.0", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "^5.0|^6.0|^7.0|^8.0", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2020-02-22T01:51:47+00:00" + }, { "name": "filp/whoops", "version": "2.7.1", @@ -1724,7 +1974,7 @@ "src/functions_include.php" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1847,7 +2097,7 @@ "Hashids\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1880,20 +2130,20 @@ }, { "name": "igaster/laravel-theme", - "version": "v2.0.14", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/igaster/laravel-theme.git", - "reference": "0be810b650e8b136874022abb8a54fee4fc94280" + "reference": "40417ad73eec8d4edf3267df67fe83ab3f244b43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igaster/laravel-theme/zipball/0be810b650e8b136874022abb8a54fee4fc94280", - "reference": "0be810b650e8b136874022abb8a54fee4fc94280", + "url": "https://api.github.com/repos/igaster/laravel-theme/zipball/40417ad73eec8d4edf3267df67fe83ab3f244b43", + "reference": "40417ad73eec8d4edf3267df67fe83ab3f244b43", "shasum": "" }, "require": { - "illuminate/contracts": "5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0" + "illuminate/contracts": "5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0" }, "suggest": { "orchestra/asset": "Use '@css' and '@js' in Blade files" @@ -1935,7 +2185,7 @@ "themes", "views" ], - "time": "2019-10-11T18:14:33+00:00" + "time": "2020-03-09T10:44:08+00:00" }, { "name": "intervention/image", @@ -2009,20 +2259,20 @@ }, { "name": "irazasyed/laravel-gamp", - "version": "v1.4", + "version": "v1.6", "source": { "type": "git", "url": "https://github.com/irazasyed/laravel-gamp.git", - "reference": "d205a0f800c3f5832d25d95232860f35b2266c55" + "reference": "8fa192f01fc44d99657b10b31956dfa3c37a4623" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/irazasyed/laravel-gamp/zipball/d205a0f800c3f5832d25d95232860f35b2266c55", - "reference": "d205a0f800c3f5832d25d95232860f35b2266c55", + "url": "https://api.github.com/repos/irazasyed/laravel-gamp/zipball/8fa192f01fc44d99657b10b31956dfa3c37a4623", + "reference": "8fa192f01fc44d99657b10b31956dfa3c37a4623", "shasum": "" }, "require": { - "illuminate/support": "^5.0 || ^6.0", + "illuminate/support": "^5.0 || ^6.0 || ^7.0", "php": "^7.2", "theiconic/php-ga-measurement-protocol": "^2.0" }, @@ -2069,7 +2319,7 @@ "measurement protocol", "tracking" ], - "time": "2019-08-22T21:48:44+00:00" + "time": "2020-04-30T10:16:51+00:00" }, { "name": "jmikola/geojson", @@ -2105,7 +2355,7 @@ "stubs/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2156,7 +2406,7 @@ "Joshbrw\\LaravelModuleInstaller\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2275,20 +2525,20 @@ }, { "name": "laracasts/flash", - "version": "3.0.3", + "version": "3.1", "source": { "type": "git", "url": "https://github.com/laracasts/flash.git", - "reference": "77fe3a0f0ebf32c66d9c891782e3fa4b305df249" + "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/flash/zipball/77fe3a0f0ebf32c66d9c891782e3fa4b305df249", - "reference": "77fe3a0f0ebf32c66d9c891782e3fa4b305df249", + "url": "https://api.github.com/repos/laracasts/flash/zipball/150d4348477db31b9a93ccd07f713e3d0513b3bf", + "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf", "shasum": "" }, "require": { - "illuminate/support": "~5.0|^6.0", + "illuminate/support": "~5.0|^6.0|^7.0", "php": ">=5.4.0" }, "require-dev": { @@ -2325,20 +2575,20 @@ } ], "description": "Easy flash notifications", - "time": "2019-09-03T18:59:42+00:00" + "time": "2020-03-03T15:50:52+00:00" }, { "name": "laravel/framework", - "version": "v6.13.1", + "version": "v6.18.11", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f0059760814b76fb5f98bb80628607c7560ebe58" + "reference": "73bc10bb23aab7539c8ffae6d5dc3c4b277de557" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f0059760814b76fb5f98bb80628607c7560ebe58", - "reference": "f0059760814b76fb5f98bb80628607c7560ebe58", + "url": "https://api.github.com/repos/laravel/framework/zipball/73bc10bb23aab7539c8ffae6d5dc3c4b277de557", + "reference": "73bc10bb23aab7539c8ffae6d5dc3c4b277de557", "shasum": "" }, "require": { @@ -2348,8 +2598,7 @@ "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", - "league/commonmark": "^1.1", - "league/commonmark-ext-table": "^2.1", + "league/commonmark": "^1.3", "league/flysystem": "^1.0.8", "monolog/monolog": "^1.12|^2.0", "nesbot/carbon": "^2.0", @@ -2407,7 +2656,7 @@ "aws/aws-sdk-php": "^3.0", "doctrine/dbal": "^2.6", "filp/whoops": "^2.4", - "guzzlehttp/guzzle": "^6.3", + "guzzlehttp/guzzle": "^6.3|^7.0", "league/flysystem-cached-adapter": "^1.0", "mockery/mockery": "^1.3.1", "moontoast/math": "^1.1", @@ -2424,11 +2673,11 @@ "ext-memcached": "Required to use the memcache cache driver.", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "filp/whoops": "Required for friendly error pages in development (^2.4).", - "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", - "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0).", - "laravel/tinker": "Required to use the tinker console command (^1.0).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).", + "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0|^7.0).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", @@ -2472,24 +2721,24 @@ "framework", "laravel" ], - "time": "2020-01-28T21:44:01+00:00" + "time": "2020-04-28T15:18:58+00:00" }, { "name": "laravel/helpers", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/laravel/helpers.git", - "reference": "b8eae9ddd461e89d0296f74fd069c413bf83b6fa" + "reference": "1f978fc5dad9f7f906b18242c654252615201de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/helpers/zipball/b8eae9ddd461e89d0296f74fd069c413bf83b6fa", - "reference": "b8eae9ddd461e89d0296f74fd069c413bf83b6fa", + "url": "https://api.github.com/repos/laravel/helpers/zipball/1f978fc5dad9f7f906b18242c654252615201de4", + "reference": "1f978fc5dad9f7f906b18242c654252615201de4", "shasum": "" }, "require": { - "illuminate/support": "~5.8.0|^6.0", + "illuminate/support": "~5.8.0|^6.0|^7.0", "php": ">=7.1.3" }, "require-dev": { @@ -2525,7 +2774,7 @@ "helpers", "laravel" ], - "time": "2019-07-30T15:25:31+00:00" + "time": "2020-03-03T13:52:16+00:00" }, { "name": "laravelcollective/html", @@ -2596,48 +2845,193 @@ "time": "2019-10-02T00:37:39+00:00" }, { - "name": "league/commonmark", - "version": "1.2.2", + "name": "layershifter/tld-database", + "version": "1.0.69", "source": { "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "34cf4ddb3892c715ae785c880e6691d839cff88d" + "url": "https://github.com/layershifter/TLDDatabase.git", + "reference": "7423c7acdc5147268fb856f532a5d8875f6fe41e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/34cf4ddb3892c715ae785c880e6691d839cff88d", - "reference": "34cf4ddb3892c715ae785c880e6691d839cff88d", + "url": "https://api.github.com/repos/layershifter/TLDDatabase/zipball/7423c7acdc5147268fb856f532a5d8875f6fe41e", + "reference": "7423c7acdc5147268fb856f532a5d8875f6fe41e", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "layershifter/tld-support": "^1.0.0", + "php": "^5.5.0 || ^7.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "mikey179/vfsstream": "^1.6", + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "^4.8 || ^5.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "LayerShifter\\TLDDatabase\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexander Fedyashov", + "email": "a@fedyashov.com" + } + ], + "description": "Database abstraction for Public Suffix List", + "keywords": [ + "PSL", + "Public Suffix List", + "domain database", + "tld database" + ], + "time": "2019-08-04T10:03:36+00:00" + }, + { + "name": "layershifter/tld-extract", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/layershifter/TLDExtract.git", + "reference": "b49cb89a4ed59a9474a47589054e56ce57787348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/layershifter/TLDExtract/zipball/b49cb89a4ed59a9474a47589054e56ce57787348", + "reference": "b49cb89a4ed59a9474a47589054e56ce57787348", + "shasum": "" + }, + "require": { + "layershifter/tld-database": "^1.0", + "layershifter/tld-support": "^1.1", + "php": "^5.5.0 || ^7.0", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "^4.8 || ^5.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/static.php" + ], + "psr-4": { + "LayerShifter\\TLDExtract\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexander Fedyashov", + "email": "a@fedyashov.com" + } + ], + "description": "TLDExtract, library for extracting parts of domain, e.q. domain parser", + "keywords": [ + "TLDExtract", + "domain parser" + ], + "abandoned": true, + "time": "2019-02-11T14:37:05+00:00" + }, + { + "name": "layershifter/tld-support", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/layershifter/TLDSupport.git", + "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/layershifter/TLDSupport/zipball/9b9eb2350db82239289f4e6eb250a2fe4865b0db", + "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "symfony/polyfill-mbstring": "^1.2" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "phpmd/phpmd": "@stable", + "phpunit/phpunit": "4.8.*", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "LayerShifter\\TLDSupport\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Alexander Fedyashov", + "email": "a@fedyashov.com" + } + ], + "description": "Support package for TLDDatabase and TLDExtract", + "abandoned": true, + "time": "2016-06-18T12:28:04+00:00" + }, + { + "name": "league/commonmark", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "9e780d972185e4f737a03bade0fd34a9e67bbf31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/9e780d972185e4f737a03bade0fd34a9e67bbf31", + "reference": "9e780d972185e4f737a03bade0fd34a9e67bbf31", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^7.1" }, - "replace": { - "colinodell/commonmark-php": "*" + "conflict": { + "scrutinizer/ocular": "1.7.*" }, "require-dev": { "cebe/markdown": "~1.0", "commonmark/commonmark.js": "0.29.1", "erusev/parsedown": "~1.0", "ext-json": "*", + "github/gfm": "0.29.0", "michelf/php-markdown": "~1.4", "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan-shim": "^0.11.5", + "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^7.5", "scrutinizer/ocular": "^1.5", "symfony/finder": "^4.2" }, - "suggest": { - "league/commonmark-extras": "Library of useful extensions including smart punctuation" - }, "bin": [ "bin/commonmark" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -2657,79 +3051,19 @@ "role": "Lead Developer" } ], - "description": "PHP Markdown parser based on the CommonMark spec", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", "markdown", + "md", "parser" ], - "time": "2020-01-16T01:18:13+00:00" - }, - { - "name": "league/commonmark-ext-table", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark-ext-table.git", - "reference": "3228888ea69636e855efcf6636ff8e6316933fe7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark-ext-table/zipball/3228888ea69636e855efcf6636ff8e6316933fe7", - "reference": "3228888ea69636e855efcf6636ff8e6316933fe7", - "shasum": "" - }, - "require": { - "league/commonmark": "~0.19.3|^1.0", - "php": "^7.1" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "phpstan/phpstan": "~0.11", - "phpunit/phpunit": "^7.0|^8.0", - "symfony/var-dumper": "^4.0", - "vimeo/psalm": "^3.0" - }, - "type": "commonmark-extension", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "League\\CommonMark\\Ext\\Table\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Martin Hasoň", - "email": "martin.hason@gmail.com" - }, - { - "name": "Webuni s.r.o.", - "homepage": "https://www.webuni.cz" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "description": "Table extension for league/commonmark", - "homepage": "https://github.com/thephpleague/commonmark-ext-table", - "keywords": [ - "commonmark", - "extension", - "markdown", - "table" - ], - "time": "2019-09-26T13:28:33+00:00" + "time": "2020-04-24T13:39:56+00:00" }, { "name": "league/csv", @@ -2800,16 +3134,16 @@ }, { "name": "league/flysystem", - "version": "1.0.63", + "version": "1.0.67", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "8132daec326565036bc8e8d1876f77ec183a7bd6" + "reference": "5b1f36c75c4bdde981294c2a0ebdb437ee6f275e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8132daec326565036bc8e8d1876f77ec183a7bd6", - "reference": "8132daec326565036bc8e8d1876f77ec183a7bd6", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5b1f36c75c4bdde981294c2a0ebdb437ee6f275e", + "reference": "5b1f36c75c4bdde981294c2a0ebdb437ee6f275e", "shasum": "" }, "require": { @@ -2821,7 +3155,7 @@ }, "require-dev": { "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7.10" + "phpunit/phpunit": "^5.7.26" }, "suggest": { "ext-fileinfo": "Required for MimeType", @@ -2880,32 +3214,33 @@ "sftp", "storage" ], - "time": "2020-01-04T16:30:31+00:00" + "time": "2020-04-16T13:21:26+00:00" }, { "name": "league/geotools", - "version": "0.8.0", + "version": "0.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/geotools.git", - "reference": "ed02a15c76bbf793a87932d8c55b83a3783429ea" + "reference": "b62a49e9fc418d0deb3a41e529ccef0d666b06d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/geotools/zipball/ed02a15c76bbf793a87932d8c55b83a3783429ea", - "reference": "ed02a15c76bbf793a87932d8c55b83a3783429ea", + "url": "https://api.github.com/repos/thephpleague/geotools/zipball/b62a49e9fc418d0deb3a41e529ccef0d666b06d0", + "reference": "b62a49e9fc418d0deb3a41e529ccef0d666b06d0", "shasum": "" }, "require": { "cache/array-adapter": "^1.0", + "ext-bcmath": "*", "php": "^7.0", "php-http/discovery": "^1.0", "psr/cache": "^1.0", "react/event-loop": "0.4.*", "react/promise": "^2.2", - "symfony/console": "^2.7 || ^3.0 || ^4.0", - "symfony/property-access": "^2.7 || ^3.0 || ^4.0", - "symfony/serializer": "^2.7 || ^3.0 || ^4.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/property-access": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/serializer": "^2.7 || ^3.0 || ^4.0 || ^5.0", "willdurand/geocoder": "^4.2" }, "replace": { @@ -2942,7 +3277,6 @@ } ], "description": "Geo-related tools PHP 7.0+ library", - "homepage": "http://geotools-php.org/", "keywords": [ "async", "batch", @@ -2950,11 +3284,16 @@ "distance", "geocoder", "geocoding", + "geohash", "geoip", + "geolocation", "geometry", - "geotools" + "geotools", + "latitude", + "latlong", + "longitude" ], - "time": "2018-02-22T05:37:51+00:00" + "time": "2020-01-30T14:23:42+00:00" }, { "name": "league/iso3166", @@ -3243,24 +3582,26 @@ }, { "name": "nesbot/carbon", - "version": "2.29.1", + "version": "2.33.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2" + "reference": "4d93cb95a80d9ffbff4018fe58ae3b7dd7f4b99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e509be5bf2d703390e69e14496d9a1168452b0a2", - "reference": "e509be5bf2d703390e69e14496d9a1168452b0a2", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4d93cb95a80d9ffbff4018fe58ae3b7dd7f4b99b", + "reference": "4d93cb95a80d9ffbff4018fe58ae3b7dd7f4b99b", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", "symfony/translation": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { + "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", "kylekatarnls/multi-tester": "^1.1", "phpmd/phpmd": "^2.8", @@ -3309,20 +3650,20 @@ "datetime", "time" ], - "time": "2020-01-21T09:36:43+00:00" + "time": "2020-04-20T15:05:43+00:00" }, { "name": "nikic/php-parser", - "version": "v4.3.0", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120", + "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120", "shasum": "" }, "require": { @@ -3361,7 +3702,7 @@ "parser", "php" ], - "time": "2019-11-08T13:50:10+00:00" + "time": "2020-04-10T16:34:50+00:00" }, { "name": "nwidart/laravel-modules", @@ -3434,6 +3775,48 @@ ], "time": "2019-11-12T18:38:48+00:00" }, + { + "name": "oomphinc/composer-installers-extender", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/oomphinc/composer-installers-extender.git", + "reference": "ca1c4b16b0905c81d1e77e608f36a2eff1a56f56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oomphinc/composer-installers-extender/zipball/ca1c4b16b0905c81d1e77e608f36a2eff1a56f56", + "reference": "ca1c4b16b0905c81d1e77e608f36a2eff1a56f56", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0", + "composer/installers": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "OomphInc\\ComposerInstallersExtender\\Plugin" + }, + "autoload": { + "psr-4": { + "OomphInc\\ComposerInstallersExtender\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stephen Beemsterboer", + "email": "stephen@oomphinc.com", + "homepage": "https://github.com/balbuf" + } + ], + "description": "Extend the composer/installers plugin to accept any arbitrary package type.", + "homepage": "http://www.oomphinc.com/", + "time": "2017-03-31T16:57:39+00:00" + }, { "name": "opis/closure", "version": "3.5.1", @@ -3635,7 +4018,7 @@ "PhpUnitsOfMeasure\\": "source/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3658,20 +4041,20 @@ }, { "name": "phpoption/phpoption", - "version": "1.7.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959" + "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959", - "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae", + "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0" + "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.3", @@ -3709,7 +4092,42 @@ "php", "type" ], - "time": "2019-12-15T19:35:24+00:00" + "time": "2020-03-21T18:07:53+00:00" + }, + { + "name": "phpvms/sample-module", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/nabeelio/phpvms-module.git", + "reference": "6332c03a6d552c03a1b70d2f2c24da86c6a12132" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nabeelio/phpvms-module/zipball/6332c03a6d552c03a1b70d2f2c24da86c6a12132", + "reference": "6332c03a6d552c03a1b70d2f2c24da86c6a12132", + "shasum": "" + }, + "require": { + "composer/installers": "~1.0" + }, + "type": "phpvms-module", + "extra": { + "laravel": { + "providers": [ + "Modules\\Sample\\Providers\\SampleServiceProvider", + "Modules\\Sample\\Providers\\EventServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Modules\\Sample\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "A sample phpvms module", + "time": "2020-02-28T15:42:04+00:00" }, { "name": "pragmarx/version", @@ -3834,26 +4252,27 @@ }, { "name": "prettus/l5-repository", - "version": "2.6.40", + "version": "2.6.42", "source": { "type": "git", "url": "https://github.com/andersao/l5-repository.git", - "reference": "48ed6d347941bf04927a3cd490df7bba7a02ca36" + "reference": "24c473c08ab46759a2ebe8bb1ec6de1d7c9e9d1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/andersao/l5-repository/zipball/48ed6d347941bf04927a3cd490df7bba7a02ca36", - "reference": "48ed6d347941bf04927a3cd490df7bba7a02ca36", + "url": "https://api.github.com/repos/andersao/l5-repository/zipball/24c473c08ab46759a2ebe8bb1ec6de1d7c9e9d1e", + "reference": "24c473c08ab46759a2ebe8bb1ec6de1d7c9e9d1e", "shasum": "" }, "require": { - "illuminate/config": "~5.0|~6.0", - "illuminate/console": "~5.0|~6.0", - "illuminate/database": "~5.0|~6.0", - "illuminate/filesystem": "~5.0|~6.0", - "illuminate/http": "~5.0|~6.0", - "illuminate/pagination": "~5.0|~6.0", - "illuminate/support": "~5.0|~6.0", + "illuminate/config": "~5.0|~6.0|~7.0", + "illuminate/console": "~5.0|~6.0|~7.0", + "illuminate/database": "~5.0|~6.0|~7.0", + "illuminate/filesystem": "~5.0|~6.0|~7.0", + "illuminate/http": "~5.0|~6.0|~7.0", + "illuminate/pagination": "~5.0|~6.0|~7.0", + "illuminate/support": "~5.0|~6.0|~7.0", + "illuminate/validation": "~5.0|~6.0|~7.0", "prettus/laravel-validation": "~1.1|~1.2" }, "suggest": { @@ -3895,25 +4314,25 @@ "model", "repository" ], - "time": "2019-12-22T13:53:50+00:00" + "time": "2020-03-14T18:53:21+00:00" }, { "name": "prettus/laravel-validation", - "version": "1.2.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/andersao/laravel-validator.git", - "reference": "5ffa053baae31d11fa34da013b940d85c99ba253" + "reference": "3d43037c2f497df3f8fbf3d8c16954a83c72e530" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/5ffa053baae31d11fa34da013b940d85c99ba253", - "reference": "5ffa053baae31d11fa34da013b940d85c99ba253", + "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/3d43037c2f497df3f8fbf3d8c16954a83c72e530", + "reference": "3d43037c2f497df3f8fbf3d8c16954a83c72e530", "shasum": "" }, "require": { - "illuminate/support": "~5.4|^6.0", - "illuminate/validation": "~5.4|^6.0", + "illuminate/support": "~5.4|^6.0|^7.0", + "illuminate/validation": "~5.4|^6.0|^7.0", "php": ">=5.4.0" }, "type": "library", @@ -3938,7 +4357,7 @@ "service", "validation" ], - "time": "2019-09-11T12:19:42+00:00" + "time": "2020-03-14T19:28:36+00:00" }, { "name": "psr/cache", @@ -3968,7 +4387,7 @@ "Psr\\Cache\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4014,7 +4433,7 @@ "Psr\\Container\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4087,16 +4506,16 @@ }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -4130,7 +4549,7 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { "name": "psr/simple-cache", @@ -4222,16 +4641,16 @@ }, { "name": "ramsey/uuid", - "version": "3.9.2", + "version": "3.9.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "7779489a47d443f845271badbdcedfe4df8e06fb" + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7779489a47d443f845271badbdcedfe4df8e06fb", - "reference": "7779489a47d443f845271badbdcedfe4df8e06fb", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", "shasum": "" }, "require": { @@ -4305,7 +4724,7 @@ "identifier", "uuid" ], - "time": "2019-12-17T08:18:51+00:00" + "time": "2020-02-21T04:36:14+00:00" }, { "name": "react/event-loop", @@ -4397,26 +4816,26 @@ }, { "name": "santigarcor/laratrust", - "version": "5.2.6", + "version": "5.2.9", "source": { "type": "git", "url": "https://github.com/santigarcor/laratrust.git", - "reference": "8efac1ee9cc7750c9207e521776a9adbc35ce307" + "reference": "454a338500ea5ab2807da5ee0a799c9c3d01cc05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/santigarcor/laratrust/zipball/8efac1ee9cc7750c9207e521776a9adbc35ce307", - "reference": "8efac1ee9cc7750c9207e521776a9adbc35ce307", + "url": "https://api.github.com/repos/santigarcor/laratrust/zipball/454a338500ea5ab2807da5ee0a799c9c3d01cc05", + "reference": "454a338500ea5ab2807da5ee0a799c9c3d01cc05", "shasum": "" }, "require": { "kkszymanowski/traitor": "^0.2.0", - "laravel/framework": "~5.6.0|~5.7.0|~5.8.0|~6.0", + "laravel/framework": "~5.6.0|~5.7.0|~5.8.0|~6.0|~7.0", "php": "^7.1" }, "require-dev": { "mockery/mockery": ">=0.9.9", - "orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|~3.9.0", + "orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|~3.9.0|4.*|5.*", "phpunit/phpunit": ">=4.1" }, "type": "library", @@ -4458,20 +4877,20 @@ "rbac", "roles" ], - "time": "2019-11-08T13:53:13+00:00" + "time": "2020-04-29T23:28:02+00:00" }, { "name": "scrivo/highlight.php", - "version": "v9.18.0.0", + "version": "v9.18.1.1", "source": { "type": "git", "url": "https://github.com/scrivo/highlight.php.git", - "reference": "0e7860058231b5bc843d1f5ac5c091be6b15b2d1" + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/0e7860058231b5bc843d1f5ac5c091be6b15b2d1", - "reference": "0e7860058231b5bc843d1f5ac5c091be6b15b2d1", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558", + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558", "shasum": "" }, "require": { @@ -4481,6 +4900,7 @@ }, "require-dev": { "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", "symfony/finder": "^2.8|^3.4", "symfony/var-dumper": "^2.8|^3.4" }, @@ -4526,7 +4946,7 @@ "highlight.php", "syntax" ], - "time": "2020-01-29T15:18:09+00:00" + "time": "2020-03-02T05:59:21+00:00" }, { "name": "sebastiaanluca/laravel-helpers", @@ -4580,9 +5000,9 @@ "authors": [ { "name": "Sebastiaan Luca", - "role": "Author", "email": "hello@sebastiaanluca.com", - "homepage": "https://www.sebastiaanluca.com" + "homepage": "https://www.sebastiaanluca.com", + "role": "Author" } ], "description": "An extensive set of Laravel framework helper functions and collection macros.", @@ -4597,20 +5017,20 @@ }, { "name": "seld/jsonlint", - "version": "1.7.2", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" + "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", + "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0" + "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" @@ -4642,20 +5062,20 @@ "parser", "validator" ], - "time": "2019-10-24T14:27:39+00:00" + "time": "2020-04-30T19:05:18+00:00" }, { "name": "seld/phar-utils", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "84715761c35808076b00908a20317a3a8a67d17e" + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/84715761c35808076b00908a20317a3a8a67d17e", - "reference": "84715761c35808076b00908a20317a3a8a67d17e", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", "shasum": "" }, "require": { @@ -4684,9 +5104,9 @@ ], "description": "PHAR file format utilities, for when PHP phars you up", "keywords": [ - "phra" + "phar" ], - "time": "2020-01-13T10:41:09+00:00" + "time": "2020-02-14T15:25:33+00:00" }, { "name": "semver/semver", @@ -4738,16 +5158,16 @@ }, { "name": "spatie/db-dumper", - "version": "2.15.3", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "e167b8bf925c5da553f885326bb7bfaed3f95d15" + "reference": "7c6d3b7f7191e1549aa5996b8ab371de31eec762" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/e167b8bf925c5da553f885326bb7bfaed3f95d15", - "reference": "e167b8bf925c5da553f885326bb7bfaed3f95d15", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/7c6d3b7f7191e1549aa5996b8ab371de31eec762", + "reference": "7c6d3b7f7191e1549aa5996b8ab371de31eec762", "shasum": "" }, "require": { @@ -4784,41 +5204,41 @@ "mysqldump", "spatie" ], - "time": "2020-01-24T13:05:20+00:00" + "time": "2020-04-16T15:10:19+00:00" }, { "name": "spatie/laravel-backup", - "version": "6.7.7", + "version": "6.9.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-backup.git", - "reference": "c2aeb1685007ee1cc2b3f86c26315aeb32602a93" + "reference": "d92ff3a676755f6184a59053f99ca5fe45710c8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/c2aeb1685007ee1cc2b3f86c26315aeb32602a93", - "reference": "c2aeb1685007ee1cc2b3f86c26315aeb32602a93", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/d92ff3a676755f6184a59053f99ca5fe45710c8d", + "reference": "d92ff3a676755f6184a59053f99ca5fe45710c8d", "shasum": "" }, "require": { - "illuminate/console": "^5.8.15|^6.0", - "illuminate/contracts": "^5.8.15|^6.0", - "illuminate/events": "^5.8.15|^6.0", - "illuminate/filesystem": "^5.8.15|^6.0", - "illuminate/notifications": "^5.8.15|^6.0", - "illuminate/support": "^5.8.15|^6.0", + "illuminate/console": "^5.8.15|^6.0|^7.0", + "illuminate/contracts": "^5.8.15|^6.0|^7.0", + "illuminate/events": "^5.8.15|^6.0|^7.0", + "illuminate/filesystem": "^5.8.15|^6.0|^7.0", + "illuminate/notifications": "^5.8.15|^6.0|^7.0", + "illuminate/support": "^5.8.15|^6.0|^7.0", "league/flysystem": "^1.0.49", "php": "^7.2", "spatie/db-dumper": "^2.12", "spatie/temporary-directory": "^1.1", - "symfony/finder": "^4.2" + "symfony/finder": "^4.2|^5.0" }, "require-dev": { "laravel/slack-notification-channel": "^1.0", "league/flysystem-aws-s3-v3": "^1.0", - "mockery/mockery": "^1.0", - "orchestra/testbench": "3.8.*|4.*", - "phpunit/phpunit": "^8.4" + "mockery/mockery": "^1.3", + "orchestra/testbench": "3.8.*|4.*|5.*", + "phpunit/phpunit": "^8.4|^9.0" }, "suggest": { "laravel/slack-notification-channel": "Required for sending notifications via Slack" @@ -4859,7 +5279,7 @@ "laravel-backup", "spatie" ], - "time": "2020-01-27T13:58:27+00:00" + "time": "2020-04-20T10:27:54+00:00" }, { "name": "spatie/temporary-directory", @@ -5024,16 +5444,16 @@ }, { "name": "symfony/console", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f" + "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f", - "reference": "e9ee09d087e2c88eaf6e5fc0f5c574f64d100e4f", + "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", + "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", "shasum": "" }, "require": { @@ -5096,20 +5516,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-10T21:54:01+00:00" + "time": "2020-03-30T11:41:10+00:00" }, { "name": "symfony/css-selector", - "version": "v5.0.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f" + "reference": "5f8d5271303dad260692ba73dfa21777d38e124e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ff60c90cb7950b592ebc84ad1289d0345bf24f9f", - "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/5f8d5271303dad260692ba73dfa21777d38e124e", + "reference": "5f8d5271303dad260692ba73dfa21777d38e124e", "shasum": "" }, "require": { @@ -5149,20 +5569,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-03-27T16:56:45+00:00" }, { "name": "symfony/debug", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "89c3fd5c299b940333bc6fe9f1b8db1b0912c759" + "reference": "346636d2cae417992ecfd761979b2ab98b339a45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/89c3fd5c299b940333bc6fe9f1b8db1b0912c759", - "reference": "89c3fd5c299b940333bc6fe9f1b8db1b0912c759", + "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45", + "reference": "346636d2cae417992ecfd761979b2ab98b339a45", "shasum": "" }, "require": { @@ -5205,26 +5625,26 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "time": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "a59789092e40ad08465dc2cdc55651be503d0d5a" + "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/a59789092e40ad08465dc2cdc55651be503d0d5a", - "reference": "a59789092e40ad08465dc2cdc55651be503d0d5a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358", + "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "^4.4", + "symfony/debug": "^4.4.5", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -5261,20 +5681,20 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "time": "2020-03-30T14:07:33+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b" + "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9e3de195e5bc301704dd6915df55892f6dfc208b", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed", + "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed", "shasum": "" }, "require": { @@ -5331,7 +5751,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-10T21:54:01+00:00" + "time": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5393,16 +5813,16 @@ }, { "name": "symfony/filesystem", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd" + "reference": "a3ebf3bfd8a98a147c010a568add5a8aa4edea0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/266c9540b475f26122b61ef8b23dd9198f5d1cfd", - "reference": "266c9540b475f26122b61ef8b23dd9198f5d1cfd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/a3ebf3bfd8a98a147c010a568add5a8aa4edea0f", + "reference": "a3ebf3bfd8a98a147c010a568add5a8aa4edea0f", "shasum": "" }, "require": { @@ -5439,20 +5859,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:20:44+00:00" + "time": "2020-04-12T14:39:55+00:00" }, { "name": "symfony/finder", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3" + "reference": "5729f943f9854c5781984ed4907bbb817735776b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3", - "reference": "3a50be43515590faf812fbd7708200aabc327ec3", + "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b", + "reference": "5729f943f9854c5781984ed4907bbb817735776b", "shasum": "" }, "require": { @@ -5488,20 +5908,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "c33998709f3fe9b8e27e0277535b07fbf6fde37a" + "reference": "ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c33998709f3fe9b8e27e0277535b07fbf6fde37a", - "reference": "c33998709f3fe9b8e27e0277535b07fbf6fde37a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2", + "reference": "ec5bd254c223786f5fa2bb49a1e705c1b8e7cee2", "shasum": "" }, "require": { @@ -5543,20 +5963,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-04-18T20:40:08+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "16f2aa3c54b08483fba5375938f60b1ff83b6bd2" + "reference": "1799a6c01f0db5851f399151abdb5d6393fec277" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/16f2aa3c54b08483fba5375938f60b1ff83b6bd2", - "reference": "16f2aa3c54b08483fba5375938f60b1ff83b6bd2", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1799a6c01f0db5851f399151abdb5d6393fec277", + "reference": "1799a6c01f0db5851f399151abdb5d6393fec277", "shasum": "" }, "require": { @@ -5633,20 +6053,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-21T13:23:17+00:00" + "time": "2020-04-28T18:47:42+00:00" }, { "name": "symfony/inflector", - "version": "v5.0.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2" + "reference": "70c25c66427e2bb6ba0827d668366d60b0a90cbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", + "url": "https://api.github.com/repos/symfony/inflector/zipball/70c25c66427e2bb6ba0827d668366d60b0a90cbf", + "reference": "70c25c66427e2bb6ba0827d668366d60b0a90cbf", "shasum": "" }, "require": { @@ -5691,20 +6111,20 @@ "symfony", "words" ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-03-27T16:56:45+00:00" }, { "name": "symfony/mime", - "version": "v5.0.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" + "reference": "5d6c81c39225a750f3f43bee15f03093fb9aaa0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "url": "https://api.github.com/repos/symfony/mime/zipball/5d6c81c39225a750f3f43bee15f03093fb9aaa0b", + "reference": "5d6c81c39225a750f3f43bee15f03093fb9aaa0b", "shasum": "" }, "require": { @@ -5753,20 +6173,20 @@ "mime", "mime-type" ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-04-17T03:29:44+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", + "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", "shasum": "" }, "require": { @@ -5778,7 +6198,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -5811,20 +6231,20 @@ "polyfill", "portable" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36" + "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/a019efccc03f1a335af6b4f20c30f5ea8060be36", - "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", + "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8", "shasum": "" }, "require": { @@ -5836,7 +6256,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -5870,26 +6290,26 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -5897,7 +6317,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -5932,20 +6352,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", "shasum": "" }, "require": { @@ -5957,7 +6377,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -5991,20 +6411,20 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "37b0976c78b94856543260ce09b460a7bc852747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", + "reference": "37b0976c78b94856543260ce09b460a7bc852747", "shasum": "" }, "require": { @@ -6013,7 +6433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -6046,20 +6466,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", + "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", "shasum": "" }, "require": { @@ -6068,7 +6488,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -6104,20 +6524,20 @@ "portable", "shim" ], - "time": "2019-11-27T16:25:15+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/process", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36" + "reference": "4b6a9a4013baa65d409153cbb5a895bf093dc7f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f5697ab4cb14a5deed7473819e63141bf5352c36", - "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36", + "url": "https://api.github.com/repos/symfony/process/zipball/4b6a9a4013baa65d409153cbb5a895bf093dc7f4", + "reference": "4b6a9a4013baa65d409153cbb5a895bf093dc7f4", "shasum": "" }, "require": { @@ -6153,28 +6573,28 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-01-09T09:50:08+00:00" + "time": "2020-04-15T15:56:18+00:00" }, { "name": "symfony/property-access", - "version": "v4.4.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "090b4bc92ded1ec512f7e2ed1691210769dffdb3" + "reference": "259f26529231ab653fc96fb358e5e41dbb438aed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/090b4bc92ded1ec512f7e2ed1691210769dffdb3", - "reference": "090b4bc92ded1ec512f7e2ed1691210769dffdb3", + "url": "https://api.github.com/repos/symfony/property-access/zipball/259f26529231ab653fc96fb358e5e41dbb438aed", + "reference": "259f26529231ab653fc96fb358e5e41dbb438aed", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/inflector": "^3.4|^4.0|^5.0" + "php": "^7.2.5", + "symfony/inflector": "^4.4|^5.0" }, "require-dev": { - "symfony/cache": "^3.4|^4.0|^5.0" + "symfony/cache": "^4.4|^5.0" }, "suggest": { "psr/cache-implementation": "To cache access methods." @@ -6182,7 +6602,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -6220,20 +6640,20 @@ "property path", "reflection" ], - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-04-15T15:59:10+00:00" }, { "name": "symfony/routing", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a" + "reference": "67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7bf4e38573728e317b926ca4482ad30470d0e86a", - "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a", + "url": "https://api.github.com/repos/symfony/routing/zipball/67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c", + "reference": "67b4e1f99c050cbc310b8f3d0dbdc4b0212c052c", "shasum": "" }, "require": { @@ -6296,53 +6716,54 @@ "uri", "url" ], - "time": "2020-01-08T17:29:02+00:00" + "time": "2020-04-21T19:59:53+00:00" }, { "name": "symfony/serializer", - "version": "v4.4.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "76ecc214a93b763c29b924277e85f64326f9fbb2" + "reference": "aa5d99bb179b5166cfe15d79dc067f516f3f4343" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/76ecc214a93b763c29b924277e85f64326f9fbb2", - "reference": "76ecc214a93b763c29b924277e85f64326f9fbb2", + "url": "https://api.github.com/repos/symfony/serializer/zipball/aa5d99bb179b5166cfe15d79dc067f516f3f4343", + "reference": "aa5d99bb179b5166cfe15d79dc067f516f3f4343", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.5", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<3.4", - "symfony/property-access": "<3.4", - "symfony/property-info": "<3.4", - "symfony/yaml": "<3.4" + "symfony/dependency-injection": "<4.4", + "symfony/property-access": "<4.4", + "symfony/property-info": "<4.4", + "symfony/yaml": "<4.4" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", "phpdocumentor/reflection-docblock": "^3.2|^4.0", - "symfony/cache": "^3.4|^4.0|^5.0", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/property-info": "^3.4.13|~4.0|^5.0", - "symfony/validator": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/http-foundation": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.0", + "symfony/property-info": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", "doctrine/cache": "For using the default cached annotation reader and metadata cache.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", - "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", "symfony/property-access": "For using the ObjectNormalizer.", "symfony/property-info": "To deserialize relations.", "symfony/yaml": "For using the default YAML mapping loader." @@ -6350,7 +6771,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -6377,7 +6798,7 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-01-07T22:30:39+00:00" + "time": "2020-04-12T16:45:47+00:00" }, { "name": "symfony/service-contracts", @@ -6439,16 +6860,16 @@ }, { "name": "symfony/translation", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c" + "reference": "8272bbd2b7e220ef812eba2a2b30068a5c64b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c", + "url": "https://api.github.com/repos/symfony/translation/zipball/8272bbd2b7e220ef812eba2a2b30068a5c64b191", + "reference": "8272bbd2b7e220ef812eba2a2b30068a5c64b191", "shasum": "" }, "require": { @@ -6511,7 +6932,7 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-01-15T13:29:06+00:00" + "time": "2020-04-12T16:45:36+00:00" }, { "name": "symfony/translation-contracts", @@ -6572,16 +6993,16 @@ }, { "name": "symfony/var-dumper", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "7cfa470bc3b1887a7b2a47c0a702a84ad614fa92" + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7cfa470bc3b1887a7b2a47c0a702a84ad614fa92", - "reference": "7cfa470bc3b1887a7b2a47c0a702a84ad614fa92", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c587e04ce5d1aa62d534a038f574d9a709e814cf", + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf", "shasum": "" }, "require": { @@ -6644,20 +7065,20 @@ "debug", "dump" ], - "time": "2020-01-04T13:00:46+00:00" + "time": "2020-04-12T16:14:02+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.3", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767" + "reference": "b385dce1c0e9f839b384af90188638819433e252" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/cd014e425b3668220adb865f53bff64b3ad21767", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767", + "url": "https://api.github.com/repos/symfony/yaml/zipball/b385dce1c0e9f839b384af90188638819433e252", + "reference": "b385dce1c0e9f839b384af90188638819433e252", "shasum": "" }, "require": { @@ -6703,7 +7124,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-21T11:12:16+00:00" + "time": "2020-04-28T17:55:16+00:00" }, { "name": "theiconic/php-ga-measurement-protocol", @@ -6733,7 +7154,7 @@ "TheIconic\\Tracking\\GoogleAnalytics\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6821,7 +7242,7 @@ "Tivie\\OS\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "APACHE 2.0" ], @@ -7017,26 +7438,26 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.2.8", + "version": "v3.3.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0" + "reference": "95c31aab33689cd4572d27038186886f4bfa63ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/18208d64897ab732f6c04a19b319fe8f1d57a9c0", - "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/95c31aab33689cd4572d27038186886f4bfa63ae", + "reference": "95c31aab33689cd4572d27038186886f4bfa63ae", "shasum": "" }, "require": { - "illuminate/routing": "^5.5|^6", - "illuminate/session": "^5.5|^6", - "illuminate/support": "^5.5|^6", - "maximebf/debugbar": "~1.15.0", + "illuminate/routing": "^5.5|^6|^7", + "illuminate/session": "^5.5|^6|^7", + "illuminate/support": "^5.5|^6|^7", + "maximebf/debugbar": "^1.15.1", "php": ">=7.0", - "symfony/debug": "^3|^4", - "symfony/finder": "^3|^4" + "symfony/debug": "^3|^4|^5", + "symfony/finder": "^3|^4|^5" }, "require-dev": { "laravel/framework": "5.5.x" @@ -7081,37 +7502,37 @@ "profiler", "webprofiler" ], - "time": "2019-08-29T07:01:03+00:00" + "time": "2020-04-16T20:19:40+00:00" }, { "name": "barryvdh/laravel-ide-helper", - "version": "v2.6.6", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "b91b959364d97af658f268c733c75dccdbff197e" + "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/b91b959364d97af658f268c733c75dccdbff197e", - "reference": "b91b959364d97af658f268c733c75dccdbff197e", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/5f677edc14bdcfdcac36633e6eea71b2728a4dbc", + "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc", "shasum": "" }, "require": { "barryvdh/reflection-docblock": "^2.0.6", "composer/composer": "^1.6", "doctrine/dbal": "~2.3", - "illuminate/console": "^5.5|^6", - "illuminate/filesystem": "^5.5|^6", - "illuminate/support": "^5.5|^6", - "php": ">=7" + "illuminate/console": "^5.5|^6|^7", + "illuminate/filesystem": "^5.5|^6|^7", + "illuminate/support": "^5.5|^6|^7", + "php": ">=7.2" }, "require-dev": { - "illuminate/config": "^5.5|^6", - "illuminate/view": "^5.5|^6", - "phpro/grumphp": "^0.14", - "phpunit/phpunit": "4.*", - "scrutinizer/ocular": "~1.1", + "illuminate/config": "^5.5|^6|^7", + "illuminate/view": "^5.5|^6|^7", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^3|^4|^5", + "phpro/grumphp": "^0.17.1", "squizlabs/php_codesniffer": "^3" }, "type": "library", @@ -7152,7 +7573,7 @@ "phpstorm", "sublime" ], - "time": "2019-10-30T20:53:27+00:00" + "time": "2020-04-22T09:57:26+00:00" }, { "name": "barryvdh/reflection-docblock", @@ -7351,20 +7772,21 @@ }, { "name": "doctrine/annotations", - "version": "v1.8.0", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + "reference": "b9d758e831c70751155c698c2f7df4665314a1cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/b9d758e831c70751155c698c2f7df4665314a1cb", + "reference": "b9d758e831c70751155c698c2f7df4665314a1cb", "shasum": "" }, "require": { "doctrine/lexer": "1.*", + "ext-tokenizer": "*", "php": "^7.1" }, "require-dev": { @@ -7374,7 +7796,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.9.x-dev" } }, "autoload": { @@ -7415,7 +7837,7 @@ "docblock", "parser" ], - "time": "2019-10-01T18:55:10+00:00" + "time": "2020-04-20T09:18:32+00:00" }, { "name": "doctrine/instantiator", @@ -7475,16 +7897,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v2.16.1", + "version": "v2.16.3", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "c8afb599858876e95e8ebfcd97812d383fa23f02" + "reference": "83baf823a33a1cbd5416c8626935cf3f843c10b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c8afb599858876e95e8ebfcd97812d383fa23f02", - "reference": "c8afb599858876e95e8ebfcd97812d383fa23f02", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/83baf823a33a1cbd5416c8626935cf3f843c10b0", + "reference": "83baf823a33a1cbd5416c8626935cf3f843c10b0", "shasum": "" }, "require": { @@ -7520,6 +7942,7 @@ "symfony/yaml": "^3.0 || ^4.0 || ^5.0" }, "suggest": { + "ext-dom": "For handling output formats in XML", "ext-mbstring": "For handling non-UTF8 characters in cache signature.", "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", @@ -7542,6 +7965,7 @@ "tests/Test/IntegrationCaseFactory.php", "tests/Test/IntegrationCaseFactoryInterface.php", "tests/Test/InternalIntegrationCaseFactory.php", + "tests/Test/IsIdenticalConstraint.php", "tests/TestCase.php" ] }, @@ -7560,7 +7984,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2019-11-25T22:10:32+00:00" + "time": "2020-04-15T18:51:10+00:00" }, { "name": "fzaninotto/faker", @@ -7804,22 +8228,22 @@ }, { "name": "maximebf/debugbar", - "version": "v1.15.1", + "version": "v1.16.2", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e" + "reference": "40f375504a4dd8e59f779c3f3cac524777ddcde5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6c4277f6117e4864966c9cb58fb835cee8c74a1e", - "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/40f375504a4dd8e59f779c3f3cac524777ddcde5", + "reference": "40f375504a4dd8e59f779c3f3cac524777ddcde5", "shasum": "" }, "require": { - "php": ">=5.6", + "php": "^7.1", "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3|^4" + "symfony/var-dumper": "^2.6|^3|^4|^5" }, "require-dev": { "phpunit/phpunit": "^5" @@ -7832,7 +8256,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-master": "1.16-dev" } }, "autoload": { @@ -7861,7 +8285,7 @@ "debug", "debugbar" ], - "time": "2019-09-24T14:55:42+00:00" + "time": "2020-04-16T09:05:52+00:00" }, { "name": "mockery/mockery", @@ -8147,24 +8571,21 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", "shasum": "" }, "require": { "php": ">=7.1" }, - "require-dev": { - "phpunit/phpunit": "~6" - }, "type": "library", "extra": { "branch-alias": { @@ -8195,45 +8616,42 @@ "reflection", "static analysis" ], - "time": "2018-08-07T13:53:10+00:00" + "time": "2020-04-27T09:25:28+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.4", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpdocumentor/type-resolver": "0.4.*", - "phpunit/phpunit": "^6.4" + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -8244,33 +8662,36 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-12-28T18:55:12+00:00" + "time": "2020-02-22T12:28:44+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", "shasum": "" }, "require": { - "php": "^7.1", + "php": "^7.2", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.1", - "mockery/mockery": "~1", - "phpunit/phpunit": "^7.0" + "ext-tokenizer": "^7.2", + "mockery/mockery": "~1" }, "type": "library", "extra": { @@ -8294,20 +8715,20 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2019-08-22T18:11:29+00:00" + "time": "2020-02-18T18:59:58+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.10.2", + "version": "v1.10.3", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9" + "reference": "451c3cd1418cf640de218914901e51b064abb093" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9", - "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", "shasum": "" }, "require": { @@ -8357,7 +8778,7 @@ "spy", "stub" ], - "time": "2020-01-20T15:57:02+00:00" + "time": "2020-03-05T15:02:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -8613,16 +9034,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.2", + "version": "8.5.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0" + "reference": "8474e22d7d642f665084ba5ec780626cbd1efd23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0", - "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8474e22d7d642f665084ba5ec780626cbd1efd23", + "reference": "8474e22d7d642f665084ba5ec780626cbd1efd23", "shasum": "" }, "require": { @@ -8692,7 +9113,7 @@ "testing", "xunit" ], - "time": "2020-01-08T08:49:49+00:00" + "time": "2020-04-23T04:39:42+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -9311,16 +9732,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.3", + "version": "3.5.5", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb" + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/557a1fc7ac702c66b0bbfe16ab3d55839ef724cb", - "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", "shasum": "" }, "require": { @@ -9358,20 +9779,20 @@ "phpcs", "standards" ], - "time": "2019-12-04T04:46:47+00:00" + "time": "2020-04-17T01:09:41+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.0.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "b1ab86ce52b0c0abe031367a173005a025e30e04" + "reference": "3707e3caeff2b797c0bfaadd5eba723dd44e6bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b1ab86ce52b0c0abe031367a173005a025e30e04", - "reference": "b1ab86ce52b0c0abe031367a173005a025e30e04", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/3707e3caeff2b797c0bfaadd5eba723dd44e6bf1", + "reference": "3707e3caeff2b797c0bfaadd5eba723dd44e6bf1", "shasum": "" }, "require": { @@ -9412,20 +9833,20 @@ "configuration", "options" ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-04-06T10:40:56+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "af23c7bb26a73b850840823662dda371484926c4" + "reference": "2a18e37a489803559284416df58c71ccebe50bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", - "reference": "af23c7bb26a73b850840823662dda371484926c4", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/2a18e37a489803559284416df58c71ccebe50bf0", + "reference": "2a18e37a489803559284416df58c71ccebe50bf0", "shasum": "" }, "require": { @@ -9435,7 +9856,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -9471,20 +9892,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.0.3", + "version": "v5.0.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" + "reference": "a1d86d30d4522423afc998f32404efa34fcf5a73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/a1d86d30d4522423afc998f32404efa34fcf5a73", + "reference": "a1d86d30d4522423afc998f32404efa34fcf5a73", "shasum": "" }, "require": { @@ -9521,7 +9942,7 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-03-27T16:56:45+00:00" }, { "name": "theseer/tokenizer", @@ -9565,16 +9986,16 @@ }, { "name": "webmozart/assert", - "version": "1.6.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" + "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", - "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", + "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", + "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", "shasum": "" }, "require": { @@ -9582,7 +10003,7 @@ "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "vimeo/psalm": "<3.6.0" + "vimeo/psalm": "<3.9.1" }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^7.5.13" @@ -9609,19 +10030,20 @@ "check", "validate" ], - "time": "2019-11-24T13:36:37+00:00" + "time": "2020-04-18T12:12:48+00:00" } ], "aliases": [], - "minimum-stability": "stable", + "minimum-stability": "dev", "stability-flags": [], - "prefer-stable": false, + "prefer-stable": true, "prefer-lowest": false, "platform": { "php": ">=7.2", "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", + "ext-bcmath": "*", "ext-pdo": "*" }, "platform-dev": [] diff --git a/config/app.php b/config/app.php index 2fafc44c..b9f984ee 100755 --- a/config/app.php +++ b/config/app.php @@ -11,7 +11,7 @@ return [ 'name' => env('APP_NAME', 'phpvms'), 'env' => env('APP_ENV', 'dev'), 'debug' => env('APP_DEBUG', true), - 'url' => env('APP_URL', 'http://localhost'), + 'url' => env('APP_URL', ''), 'version' => '7.0.0', 'debug_toolbar' => false, @@ -74,13 +74,16 @@ return [ * Application Service Providers... */ App\Providers\AppServiceProvider::class, - App\Providers\CronServiceProvider::class, - App\Providers\BroadcastServiceProvider::class, App\Providers\AuthServiceProvider::class, - App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, - App\Providers\MeasurementsProvider::class, App\Providers\BindServiceProviders::class, + App\Providers\BroadcastServiceProvider::class, + App\Providers\ViewComposerServiceProvider::class, + App\Providers\CronServiceProvider::class, + App\Providers\DirectiveServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\MeasurementsProvider::class, + App\Providers\ObserverServiceProviders::class, + App\Providers\RouteServiceProvider::class, ], 'aliases' => [ @@ -118,8 +121,8 @@ return [ 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'Theme' => Igaster\LaravelTheme\Facades\Theme::class, + 'Updater' => Codedge\Updater\UpdaterFacade::class, 'URL' => Illuminate\Support\Facades\URL::class, - 'Utils' => App\Facades\Utils::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'Version' => PragmaRX\Version\Package\Facade::class, 'View' => Illuminate\Support\Facades\View::class, diff --git a/config/database.php b/config/database.php index 6cea9cea..0ff7d1cb 100755 --- a/config/database.php +++ b/config/database.php @@ -12,13 +12,14 @@ return [ 'username' => env('DB_USERNAME', ''), 'password' => env('DB_PASSWORD', ''), //'unix_socket' => env('DB_SOCKET', ''), - 'prefix' => env('DB_PREFIX', ''), - 'timezone' => '+00:00', - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'strict' => false, - 'engine' => null, - 'options' => [ + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + 'timezone' => '+00:00', + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'strict' => false, + 'engine' => null, + 'options' => [ PDO::ATTR_EMULATE_PREPARES => env('DB_EMULATE_PREPARES', false), //PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ], @@ -27,22 +28,25 @@ return [ ], ], 'sqlite' => [ - 'driver' => 'sqlite', - 'database' => storage_path('db.sqlite'), - 'timezone' => '+00:00', - 'prefix' => '', + 'driver' => 'sqlite', + 'database' => storage_path('db.sqlite'), + 'timezone' => '+00:00', + 'prefix' => '', + 'prefix_indexes' => true, ], 'testing' => [ - 'driver' => 'sqlite', - 'database' => storage_path('testing.sqlite'), - 'timezone' => '+00:00', - 'prefix' => '', + 'driver' => 'sqlite', + 'database' => storage_path('testing.sqlite'), + 'timezone' => '+00:00', + 'prefix' => '', + 'prefix_indexes' => true, ], 'memory' => [ - 'driver' => 'sqlite', - 'database' => ':memory:', - 'timezone' => '+00:00', - 'prefix' => '', + 'driver' => 'sqlite', + 'database' => ':memory:', + 'timezone' => '+00:00', + 'prefix' => '', + 'prefix_indexes' => true, ], ], diff --git a/config/installer.php b/config/installer.php deleted file mode 100644 index 6922b048..00000000 --- a/config/installer.php +++ /dev/null @@ -1,10 +0,0 @@ - [ - // You can change this to a lower version, the lowest - // can be 7.0. However, there's no guarantee that things - // will work properly. Change at your peril! - 'version' => '7.1.3', - ], -]; diff --git a/config/modules.php b/config/modules.php index 2ec7508d..ee070448 100644 --- a/config/modules.php +++ b/config/modules.php @@ -94,6 +94,7 @@ return [ 'enabled' => false, 'paths' => [ base_path('vendor/*/*'), + base_path('modules/*'), ], ], /* diff --git a/config/phpvms.php b/config/phpvms.php index 6f3a5b41..11d42f13 100644 --- a/config/phpvms.php +++ b/config/phpvms.php @@ -35,14 +35,6 @@ return [ */ 'registration_redirect' => '/profile', - /* - * The ISO "Currency Code" to use, the list is in config/money.php - * - * Note, do not change this after you've set it, unless you don't - * care that the currencies aren't "exchanged" into the new format - */ - 'currency' => 'USD', - /* * Point to the class to use to retrieve the METAR string. If this * goes inactive at some date, it can be replaced @@ -55,6 +47,11 @@ return [ */ 'airport_lookup' => App\Services\AirportLookup\VaCentralLookup::class, + /* + * URL for where to lookup the Simbrief flight plans + */ + 'simbrief_url' => 'https://www.simbrief.com/ofp/flightplans/xml/{id}.xml', + /* * Your vaCentral API key */ @@ -75,6 +72,11 @@ return [ */ 'version_file' => 'https://api.github.com/repos/nabeelio/phpvms/releases', + /** + * The URL to download the latest phpVMS version from + */ + 'distrib_url' => 'http://downloads.phpvms.net/phpvms-{VERSION}.zip', + /* * Where the KVP file is stored */ @@ -104,6 +106,11 @@ return [ * The links to various docs on the documentation site */ 'docs' => [ - 'cron' => 'http://docs.phpvms.net/configuration/cron', + 'root' => 'http://docs.phpvms.net', + 'cron' => '/configuration/cron', + 'finances' => '/concepts/finances', + 'importing_legacy' => '/setup/importing-from-v2-v5', + 'load_factor' => '/operations/flights#load-factor', + 'subfleets' => '/concepts/basics#subfleets-and-aircraft', ], ]; diff --git a/config/queue.php b/config/queue.php index e6031055..e4026e0d 100755 --- a/config/queue.php +++ b/config/queue.php @@ -14,7 +14,7 @@ return [ | */ - 'default' => env('QUEUE_DRIVER', 'database'), + 'default' => env('QUEUE_DRIVER', 'sync'), /* |-------------------------------------------------------------------------- diff --git a/config/self-update.php b/config/self-update.php new file mode 100644 index 00000000..7d039b95 --- /dev/null +++ b/config/self-update.php @@ -0,0 +1,56 @@ + 'vms', + 'version_installed' => '', + + 'repository_types' => [ + 'github' => [ + 'type' => 'github', + 'repository_vendor' => 'nabeelio', + 'repository_name' => 'phpvms', + 'repository_url' => 'https://github.com/nabeelio/phpvms', + 'download_path' => storage_path('app'), + 'private_access_token' => '', + 'use_branch' => '', + ], + ], + + 'mail_to' => [ + 'address' => 'no-reply@phpvms.net', + 'name' => 'no name', + 'subject_update_available' => 'Update available', + 'subject_update_succeeded' => 'Update succeeded', + ], + + 'exclude_folders' => [ + 'node_modules', + 'bootstrap/cache', + 'bower', + 'storage/app', + 'storage/framework', + 'storage/logs', + 'storage/self-update', + ], + + 'log_events' => true, + + /* + |--------------------------------------------------------------------------- + | Register custom artisan commands + |--------------------------------------------------------------------------- + */ + + 'artisan_commands' => [ + 'pre_update' => [ + //'command:signature' => [ + // 'class' => Command class + // 'params' => [] + //] + ], + 'post_update' => [ + + ], + ], + +]; diff --git a/config/themes.php b/config/themes.php index bb1ad37a..8a639499 100644 --- a/config/themes.php +++ b/config/themes.php @@ -4,7 +4,7 @@ return [ 'themes_path' => resource_path('views/layouts'), // eg: base_path('resources/themes') 'asset_not_found' => 'LOG_ERROR', 'default' => 'default', - 'cache' => true, + 'cache' => false, /* |-------------------------------------------------------------------------- diff --git a/config/version.yml b/config/version.yml index 5a8c70ff..ad220595 100644 --- a/config/version.yml +++ b/config/version.yml @@ -29,4 +29,4 @@ format: build: '{$build}' version: '{$major}.{$minor}.{$patch} (build {$build})' full: 'version {{''format.version''}}' - compact: 'v{$major}.{$minor}.{$patch}+{$build}' + compact: '{$major}.{$minor}.{$patch}+{$build}' diff --git a/modules/.gitignore b/modules/.gitignore index f957b1e3..3089778c 100644 --- a/modules/.gitignore +++ b/modules/.gitignore @@ -6,6 +6,5 @@ !/Awards !/Importer !/Installer -!/Sample !/Updater !/Vacentral diff --git a/modules/Importer/Http/Controllers/ImporterController.php b/modules/Importer/Http/Controllers/ImporterController.php index 921f63c8..b499c645 100644 --- a/modules/Importer/Http/Controllers/ImporterController.php +++ b/modules/Importer/Http/Controllers/ImporterController.php @@ -36,6 +36,18 @@ class ImporterController extends Controller return view('importer::step1-configure'); } + protected function testDb(Request $request) + { + $this->dbSvc->checkDbConnection( + $request->post('db_conn'), + $request->post('db_host'), + $request->post('db_port'), + $request->post('db_name'), + $request->post('db_user'), + $request->post('db_pass') + ); + } + /** * Check the database connection * @@ -49,14 +61,7 @@ class ImporterController extends Controller $message = 'Database connection looks good!'; try { - $this->dbSvc->checkDbConnection( - $request->post('db_conn'), - $request->post('db_host'), - $request->post('db_port'), - $request->post('db_name'), - $request->post('db_user'), - $request->post('db_pass') - ); + $this->testDb($request); } catch (\Exception $e) { $status = 'danger'; $message = 'Failed! '.$e->getMessage(); @@ -78,6 +83,8 @@ class ImporterController extends Controller public function config(Request $request) { try { + $this->testDb($request); + // Save the credentials to use later $this->importerSvc->saveCredentialsFromRequest($request); diff --git a/modules/Importer/Resources/views/app.blade.php b/modules/Importer/Resources/views/app.blade.php index ed036daf..cd52b133 100644 --- a/modules/Importer/Resources/views/app.blade.php +++ b/modules/Importer/Resources/views/app.blade.php @@ -6,7 +6,7 @@ - @yield('title') - importer + @yield('title') - installer @@ -35,43 +35,39 @@ - - - - -{{--
--}} -
-
-
-
-
- @include('importer::flash.message') - @yield('content') + + {{----}} - - - + + + }); + @endsection diff --git a/modules/Importer/Services/BaseImporter.php b/modules/Importer/Services/BaseImporter.php index 6790af52..67938181 100644 --- a/modules/Importer/Services/BaseImporter.php +++ b/modules/Importer/Services/BaseImporter.php @@ -5,13 +5,13 @@ namespace Modules\Importer\Services; use App\Services\Installer\LoggerTrait; use Carbon\Carbon; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Support\Facades\Log; use Modules\Importer\Utils\IdMapper; use Modules\Importer\Utils\ImporterDB; -abstract class BaseImporter implements ShouldQueue +abstract class BaseImporter { use LoggerTrait; use Dispatchable; @@ -27,7 +27,7 @@ abstract class BaseImporter implements ShouldQueue /** * The mapper class used for old IDs to new IDs * - * @var \Illuminate\Contracts\Foundation\Application|mixed + * @var IdMapper */ protected $idMapper; @@ -38,6 +38,13 @@ abstract class BaseImporter implements ShouldQueue */ protected $table; + /** + * The column used for the ID, used for the ORDER BY + * + * @var string + */ + protected $idField = 'id'; + public function __construct() { $importerService = app(ImporterService::class); @@ -64,8 +71,16 @@ abstract class BaseImporter implements ShouldQueue { $manifest = []; + // Ensure that the table exists; if it doesn't skip it from the manifest + if (!$this->db->tableExists($this->table)) { + Log::info('Table '.$this->table.' doesn\'t exist'); + return []; + } + $start = 0; $total_rows = $this->db->getTotalRows($this->table); + Log::info('Found '.$total_rows.' rows for '.$this->table); + do { $end = $start + $this->db->batchSize; if ($end > $total_rows) { diff --git a/modules/Importer/Services/ImporterService.php b/modules/Importer/Services/ImporterService.php index 3f72ab21..8a7dd770 100644 --- a/modules/Importer/Services/ImporterService.php +++ b/modules/Importer/Services/ImporterService.php @@ -6,15 +6,19 @@ use App\Contracts\Service; use App\Repositories\KvpRepository; use Exception; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; use Modules\Importer\Services\Importers\AircraftImporter; use Modules\Importer\Services\Importers\AirlineImporter; use Modules\Importer\Services\Importers\AirportImporter; use Modules\Importer\Services\Importers\ClearDatabase; +use Modules\Importer\Services\Importers\ExpenseImporter; use Modules\Importer\Services\Importers\FinalizeImporter; use Modules\Importer\Services\Importers\FlightImporter; use Modules\Importer\Services\Importers\GroupImporter; +use Modules\Importer\Services\Importers\LedgerImporter; use Modules\Importer\Services\Importers\PirepImporter; use Modules\Importer\Services\Importers\RankImport; +use Modules\Importer\Services\Importers\SettingsImporter; use Modules\Importer\Services\Importers\UserImport; class ImporterService extends Service @@ -39,6 +43,9 @@ class ImporterService extends Service FlightImporter::class, UserImport::class, PirepImporter::class, + ExpenseImporter::class, + LedgerImporter::class, + SettingsImporter::class, FinalizeImporter::class, ]; @@ -55,7 +62,6 @@ class ImporterService extends Service public function saveCredentialsFromRequest(Request $request) { $creds = [ - 'admin_email' => $request->post('email'), 'host' => $request->post('db_host'), 'port' => $request->post('db_port'), 'name' => $request->post('db_name'), @@ -130,6 +136,11 @@ class ImporterService extends Service /** @var $importerInst \Modules\Importer\Services\BaseImporter */ $importerInst = new $importer(); - $importerInst->run($start); + + try { + $importerInst->run($start); + } catch (Exception $e) { + Log::error('Error running importer: '.$e->getMessage()); + } } } diff --git a/modules/Importer/Services/Importers/AircraftImporter.php b/modules/Importer/Services/Importers/AircraftImporter.php index 55e70574..7d937bc9 100644 --- a/modules/Importer/Services/Importers/AircraftImporter.php +++ b/modules/Importer/Services/Importers/AircraftImporter.php @@ -9,33 +9,60 @@ use Modules\Importer\Services\BaseImporter; class AircraftImporter extends BaseImporter { - public $table = 'aircraft'; - - /** - * CONSTANTS - */ - public const SUBFLEET_NAME = 'Imported Aircraft'; + protected $table = 'aircraft'; public function run($start = 0) { $this->comment('--- AIRCRAFT IMPORT ---'); - $subfleet = $this->getSubfleet(); + $fields = [ + 'id', + 'icao', + 'name', + 'fullname', + 'registration', + 'enabled', + ]; - $this->info('Subfleet ID is '.$subfleet->id); + // See if there is an airline column + $columns = $this->db->getColumns($this->table); + if (in_array('airline', $columns)) { + $fields[] = 'airline'; + } + + if (in_array('location', $columns)) { + $fields[] = 'location'; + } $count = 0; - foreach ($this->db->readRows($this->table, $start) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start, $fields); + foreach ($rows as $row) { + $subfleet_name = $row->icao; + + $airline_id = null; + if (!empty($row->airline)) { + $subfleet_name = $row->airline.' - '.$row->icao; + $airline_id = $this->idMapper->getMapping('airlines', $row->airline); + } + + $subfleet = $this->getSubfleet($subfleet_name, $row->icao, $airline_id); + $where = [ - 'name' => $row->fullname, 'registration' => $row->registration, ]; - $aircraft = Aircraft::firstOrCreate($where, [ + $cols = [ 'icao' => $row->icao, + 'name' => $row->fullname, 'subfleet_id' => $subfleet->id, 'active' => $row->enabled, - ]); + ]; + + if (!empty($row->location)) { + $cols['airport_id'] = $row->location; + } + + $aircraft = Aircraft::firstOrCreate($where, $cols); $this->idMapper->addMapping('aircraft', $row->id, $aircraft->id); @@ -50,16 +77,22 @@ class AircraftImporter extends BaseImporter /** * Return the subfleet * + * @param string $name + * @param string $icao ICAO of the subfleet + * @param int $airline_id + * * @return mixed */ - protected function getSubfleet() + protected function getSubfleet($name, $icao, $airline_id = null) { - $airline = Airline::first(); - $subfleet = Subfleet::firstOrCreate([ - 'airline_id' => $airline->id, - 'name' => self::SUBFLEET_NAME, - ], ['type' => 'PHPVMS']); + if (empty($airline_id)) { + $airline = Airline::first(); + $airline_id = $airline->id; + } - return $subfleet; + return Subfleet::firstOrCreate([ + 'airline_id' => $airline_id, + 'name' => $name, + ], ['type' => $icao]); } } diff --git a/modules/Importer/Services/Importers/AirlineImporter.php b/modules/Importer/Services/Importers/AirlineImporter.php index 939a6b3f..6b5bcc42 100644 --- a/modules/Importer/Services/Importers/AirlineImporter.php +++ b/modules/Importer/Services/Importers/AirlineImporter.php @@ -18,7 +18,8 @@ class AirlineImporter extends BaseImporter $this->comment('--- AIRLINE IMPORT ---'); $count = 0; - foreach ($this->db->readRows($this->table, $start) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { $attrs = [ 'iata' => $row->code, 'name' => $row->name, diff --git a/modules/Importer/Services/Importers/AirportImporter.php b/modules/Importer/Services/Importers/AirportImporter.php index f37183d5..e0f91880 100644 --- a/modules/Importer/Services/Importers/AirportImporter.php +++ b/modules/Importer/Services/Importers/AirportImporter.php @@ -25,7 +25,8 @@ class AirportImporter extends BaseImporter ]; $count = 0; - foreach ($this->db->readRows($this->table, $start, $fields) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start, $fields); + foreach ($rows as $row) { $attrs = [ 'id' => trim($row->icao), 'icao' => trim($row->icao), diff --git a/modules/Importer/Services/Importers/ClearDatabase.php b/modules/Importer/Services/Importers/ClearDatabase.php index a4e01da6..dc4a86cf 100644 --- a/modules/Importer/Services/Importers/ClearDatabase.php +++ b/modules/Importer/Services/Importers/ClearDatabase.php @@ -3,6 +3,7 @@ namespace Modules\Importer\Services\Importers; use App\Models\Acars; +use App\Models\Aircraft; use App\Models\Airline; use App\Models\Airport; use App\Models\Bid; @@ -13,8 +14,10 @@ use App\Models\FlightField; use App\Models\FlightFieldValue; use App\Models\Journal; use App\Models\JournalTransaction; +use App\Models\Ledger; use App\Models\News; use App\Models\Pirep; +use App\Models\Role; use App\Models\Subfleet; use App\Models\User; use App\Models\UserAward; @@ -60,6 +63,7 @@ class ClearDatabase extends BaseImporter Expense::truncate(); JournalTransaction::truncate(); Journal::truncate(); + Ledger::truncate(); // Clear flights DB::table('flight_fare')->truncate(); @@ -68,12 +72,7 @@ class ClearDatabase extends BaseImporter FlightFieldValue::truncate(); Flight::truncate(); Subfleet::truncate(); - - // Clear permissions - // DB::table('permission_role')->truncate(); - // DB::table('permission_user')->truncate(); - // DB::table('role_user')->truncate(); - // Role::truncate(); + Aircraft::truncate(); Airline::truncate(); Airport::truncate(); @@ -83,6 +82,15 @@ class ClearDatabase extends BaseImporter UserAward::truncate(); User::truncate(); + // Clear permissions + DB::table('permission_role')->truncate(); + DB::table('permission_user')->truncate(); + DB::table('role_user')->truncate(); + + // Role::truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + + $this->idMapper->clear(); } } diff --git a/modules/Importer/Services/Importers/ExpenseImporter.php b/modules/Importer/Services/Importers/ExpenseImporter.php new file mode 100644 index 00000000..dad95dd2 --- /dev/null +++ b/modules/Importer/Services/Importers/ExpenseImporter.php @@ -0,0 +1,48 @@ + ExpenseType::MONTHLY, + 'F' => ExpenseType::FLIGHT, + 'P' => ExpenseType::MONTHLY, // percent, monthly + 'G' => ExpenseType::FLIGHT, // percent, per-flight + ]; + + /** + * {@inheritdoc} + */ + public function run($start = 0) + { + $this->comment('--- EXPENSES IMPORT ---'); + + $count = 0; + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + $attrs = [ + 'airline_id' => null, + 'name' => $row->name, + 'amount' => $row->amount, + 'type' => $this->expense_types[$row->type], + 'active' => 1, + 'ref_model' => Expense::class, + ]; + + $expense = Expense::updateOrCreate(['name' => $row->name], $attrs); + $this->idMapper->addMapping('expenses', $row->id, $expense->id); + $this->idMapper->addMapping('expenses', $row->name, $expense->id); + + $count++; + } + + $this->info('Imported '.$count.' expenses'); + } +} diff --git a/modules/Importer/Services/Importers/ExpenseLogImporter.php b/modules/Importer/Services/Importers/ExpenseLogImporter.php new file mode 100644 index 00000000..9d05b00d --- /dev/null +++ b/modules/Importer/Services/Importers/ExpenseLogImporter.php @@ -0,0 +1,50 @@ +comment('--- EXPENSE LOG IMPORT ---'); + + /** @var FinanceService $financeSvc */ + $financeSvc = app(FinanceService::class); + $airline = Airline::first(); + + $count = 0; + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + $expense_id = $this->idMapper->getMapping('expenses', $row->name); + $expense = Expense::find($expense_id); + + $debit = Money::createFromAmount($expense->amount); + + $financeSvc->debitFromJournal( + $airline->journal, + $debit, + $airline, + 'Expense: '.$expense->name, + $expense->transaction_group ?? 'Expenses', + 'expense' + ); + + $count++; + } + + $this->info('Imported '.$count.' expense logs'); + } +} diff --git a/modules/Importer/Services/Importers/FinalizeImporter.php b/modules/Importer/Services/Importers/FinalizeImporter.php index b3b56b25..7d340de0 100644 --- a/modules/Importer/Services/Importers/FinalizeImporter.php +++ b/modules/Importer/Services/Importers/FinalizeImporter.php @@ -3,6 +3,7 @@ namespace Modules\Importer\Services\Importers; use App\Models\User; +use App\Services\AircraftService; use App\Services\UserService; use Modules\Importer\Services\BaseImporter; @@ -34,6 +35,7 @@ class FinalizeImporter extends BaseImporter { $this->findLastPireps(); $this->recalculateUserStats(); + $this->clearValueStore(); } /** @@ -41,6 +43,7 @@ class FinalizeImporter extends BaseImporter */ protected function findLastPireps() { + // TODO } /** @@ -49,10 +52,32 @@ class FinalizeImporter extends BaseImporter protected function recalculateUserStats() { $this->comment('--- RECALCULATING USER STATS ---'); + + /** @var UserService $userSvc */ $userSvc = app(UserService::class); User::all()->each(function ($user) use ($userSvc) { $userSvc->recalculateStats($user); }); } + + /** + * Update the aircraft stats with the newest/latest PIREPs + */ + protected function recalculateAircraftStats() + { + $this->comment('--- RECALCULATING AIRCRAFT STATS ---'); + + /** @var AircraftService $aircraftSvc */ + $aircraftSvc = app(AircraftService::class); + $aircraftSvc->recalculateStats(); + } + + /** + * Clear the value store of any old value mappings + */ + protected function clearValueStore() + { + $this->idMapper->clear(); + } } diff --git a/modules/Importer/Services/Importers/FlightImporter.php b/modules/Importer/Services/Importers/FlightImporter.php index 2e1a7be1..505956e0 100644 --- a/modules/Importer/Services/Importers/FlightImporter.php +++ b/modules/Importer/Services/Importers/FlightImporter.php @@ -24,13 +24,14 @@ class FlightImporter extends BaseImporter 'flightlevel', 'deptime', 'arrtime', - 'flightttime', + 'flighttime', 'notes', 'enabled', ]; $count = 0; - foreach ($this->db->readRows($this->table, $start, $fields) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start, $fields); + foreach ($rows as $row) { $airline_id = $this->idMapper->getMapping('airlines', $row->code); $flight_num = trim($row->flightnum); @@ -53,7 +54,7 @@ class FlightImporter extends BaseImporter // $flight = Flight::updateOrCreate($w, $attrs); $flight = Flight::create(array_merge($w, $attrs)); } catch (\Exception $e) { - //$this->error($e); + $this->error($e); } $this->idMapper->addMapping('flights', $row->id, $flight->id); diff --git a/modules/Importer/Services/Importers/GroupImporter.php b/modules/Importer/Services/Importers/GroupImporter.php index 97aa9ebf..6999a65c 100644 --- a/modules/Importer/Services/Importers/GroupImporter.php +++ b/modules/Importer/Services/Importers/GroupImporter.php @@ -2,8 +2,10 @@ namespace Modules\Importer\Services\Importers; +use App\Models\Permission; use App\Models\Role; use App\Services\RoleService; +use Illuminate\Support\Facades\Log; use Modules\Importer\Services\BaseImporter; /** @@ -12,6 +14,7 @@ use Modules\Importer\Services\BaseImporter; class GroupImporter extends BaseImporter { protected $table = 'groups'; + protected $idField = 'groupid'; /** * Permissions in the legacy system, mapping them to the current system @@ -65,10 +68,29 @@ class GroupImporter extends BaseImporter { $this->comment('--- ROLES/GROUPS IMPORT ---'); + /** @var \App\Services\RoleService $roleSvc */ $roleSvc = app(RoleService::class); + $permMappings = $this->getPermissions(); $count = 0; - foreach ($this->db->readRows($this->table, $start) as $row) { + $permCount = 0; + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + // Legacy "administrator" role is now "admin", just map that 1:1 + if (strtolower($row->name) === 'administrators') { + $role = Role::where('name', 'admin')->first(); + $this->idMapper->addMapping('group', $row->groupid, $role->id); + continue; + } + + // Map the "core" roles, which are active/inactive pilots to a new ID of + // -1; so then we can ignore/not add these groups, and then ignore them + // for any of the users that are being imported. these groups are unused + if ($row->core === 1 || $row->core === '1') { + $this->idMapper->addMapping('group', $row->groupid, -1); + continue; + } + $name = str_slug($row->name); $role = Role::firstOrCreate( ['name' => $name], @@ -81,22 +103,64 @@ class GroupImporter extends BaseImporter // Add all of the ones which apply, and then set them on the new role $permissions = []; foreach ($this->legacy_permission_set as $legacy_name => $mask) { - if (($row->permissions & $mask) === true) { + $val = $row->permissions & $mask; + if ($val === $mask) { + // Map this legacy permission to what it is under the new system if (!array_key_exists($legacy_name, $this->legacy_to_permission)) { continue; } - $permissions[] = $this->legacy_to_permission[$legacy_name]; + // Get the ID of the permission + try { + $permName = $this->legacy_to_permission[$legacy_name]; + if ($permName === 'admin') { + foreach ($permMappings as $name => $value) { + if (!in_array($value, $permissions)) { + $permissions[] = $value; + } + } + + continue; + } + + $permMapId = $permMappings[$permName]; + if (!in_array($permMapId, $permissions)) { + $permissions[] = $permMapId; + } + } catch (\Exception $e) { + Log::error($e->getMessage()); + } } } - $roleSvc->setPermissionsForRole($role, $permissions); + if (count($permissions) > 0) { + $roleSvc->setPermissionsForRole($role, $permissions); + $permCount += count($permissions); + } if ($role->wasRecentlyCreated) { $count++; } } - $this->info('Imported '.$count.' ranks'); + $this->info('Imported '.$count.' roles, synced '.$permCount.' permissions'); + } + + /** + * Get all of the permissions from locally and return a kvp with the + * key being the permission short-name and the value being the ID + * + * @return array + */ + private function getPermissions(): array + { + $mappings = []; + $permissions = Permission::all(); + /** @var \App\Models\Permission $p */ + foreach ($permissions as $p) { + $mappings[$p->name] = $p->id; + } + + return $mappings; } } diff --git a/modules/Importer/Services/Importers/LedgerImporter.php b/modules/Importer/Services/Importers/LedgerImporter.php new file mode 100644 index 00000000..eb4fd58e --- /dev/null +++ b/modules/Importer/Services/Importers/LedgerImporter.php @@ -0,0 +1,75 @@ + Pirep::class, + ]; + + /** + * {@inheritdoc} + * + * @throws \Prettus\Validator\Exceptions\ValidatorException + */ + public function run($start = 0) + { + if (!$this->db->tableExists('ledger')) { + return; + } + + $this->comment('--- LEDGER IMPORT ---'); + + /** @var FinanceService $financeSvc */ + $financeSvc = app(FinanceService::class); + + $count = 0; + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + $pirep = Pirep::find($this->idMapper->getMapping('pireps', $row->pirepid)); + if (!$pirep) { + continue; + } + + $pilot_pay = Money::createFromAmount($row->amount * 100); + $memo = 'Pilot payment'; + + $financeSvc->debitFromJournal( + $pirep->airline->journal, + $pilot_pay, + $pirep, + $memo, + 'Pilot Pay', + 'pilot_pay', + $row->submitdate + ); + + $financeSvc->creditToJournal( + $pirep->user->journal, + $pilot_pay, + $pirep, + $memo, + 'Pilot Pay', + 'pilot_pay', + $row->submitdate + ); + + $count++; + } + + $this->info('Imported '.$count.' ledger entries'); + } +} diff --git a/modules/Importer/Services/Importers/PirepImporter.php b/modules/Importer/Services/Importers/PirepImporter.php index b4486774..146beee0 100644 --- a/modules/Importer/Services/Importers/PirepImporter.php +++ b/modules/Importer/Services/Importers/PirepImporter.php @@ -11,6 +11,7 @@ use Modules\Importer\Services\BaseImporter; class PirepImporter extends BaseImporter { protected $table = 'pireps'; + protected $idField = 'pirepid'; public function run($start = 0) { @@ -32,11 +33,17 @@ class PirepImporter extends BaseImporter 'distance', 'flighttime_stamp', 'flighttype', - 'flightlevel', ]; + // See if there's a flightlevel column, export that if there is + $columns = $this->db->getColumns($this->table); + if (in_array('flightlevel', $columns)) { + $fields[] = 'flightlevel'; + } + $count = 0; - foreach ($this->db->readRows($this->table, $start, $fields) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start, $fields); + foreach ($rows as $row) { $pirep_id = $row->pirepid; $user_id = $this->idMapper->getMapping('users', $row->pilotid); $airline_id = $this->idMapper->getMapping('airlines', $row->code); diff --git a/modules/Importer/Services/Importers/RankImport.php b/modules/Importer/Services/Importers/RankImport.php index 47e173ac..209a6af7 100644 --- a/modules/Importer/Services/Importers/RankImport.php +++ b/modules/Importer/Services/Importers/RankImport.php @@ -8,16 +8,20 @@ use Modules\Importer\Services\BaseImporter; class RankImport extends BaseImporter { protected $table = 'ranks'; + protected $idField = 'rankid'; public function run($start = 0) { $this->comment('--- RANK IMPORT ---'); $count = 0; - foreach ($this->db->readRows($this->table, $start) as $row) { - $rank = Rank::firstOrCreate(['name' => $row->rank], [ - 'image_url' => $row->rankimage, - 'hours' => $row->minhours, + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + $rank = Rank::updateOrCreate(['name' => $row->rank], [ + 'image_url' => $row->rankimage, + 'hours' => $row->minhours, + 'acars_base_payrate' => $row->payrate, + 'manual_base_payrate' => $row->payrate, ]); $this->idMapper->addMapping('ranks', $row->rankid, $rank->id); diff --git a/modules/Importer/Services/Importers/SettingsImporter.php b/modules/Importer/Services/Importers/SettingsImporter.php new file mode 100644 index 00000000..34da3a99 --- /dev/null +++ b/modules/Importer/Services/Importers/SettingsImporter.php @@ -0,0 +1,31 @@ +comment('--- SETTINGS IMPORT ---'); + + /** @var SettingRepository $settingsRepo */ + $settingsRepo = app(SettingRepository::class); + + $count = 0; + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { + switch ($row->name) { + case 'ADMIN_EMAIL': + $settingsRepo->store('general.admin_email', $row->value); + break; + } + } + + $this->info('Imported '.$count.' settings'); + } +} diff --git a/modules/Importer/Services/Importers/UserImport.php b/modules/Importer/Services/Importers/UserImport.php index 6a417d37..6f4c8a6d 100644 --- a/modules/Importer/Services/Importers/UserImport.php +++ b/modules/Importer/Services/Importers/UserImport.php @@ -2,10 +2,12 @@ namespace Modules\Importer\Services\Importers; -use App\Facades\Utils; use App\Models\Enums\UserState; +use App\Models\Role; use App\Models\User; use App\Services\UserService; +use App\Support\Units\Time; +use App\Support\Utils; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; @@ -14,6 +16,7 @@ use Modules\Importer\Services\BaseImporter; class UserImport extends BaseImporter { protected $table = 'pilots'; + protected $idField = 'pilotid'; /** * @var UserService @@ -28,7 +31,8 @@ class UserImport extends BaseImporter $count = 0; $first_row = true; - foreach ($this->db->readRows($this->table, $start) as $row) { + $rows = $this->db->readRows($this->table, $this->idField, $start); + foreach ($rows as $row) { $pilot_id = $row->pilotid; // This isn't their actual ID $name = $row->firstname.' '.$row->lastname; @@ -48,8 +52,13 @@ class UserImport extends BaseImporter // Look for a user with that pilot ID already. If someone has it if ($this->userSvc->isPilotIdAlreadyUsed($pilot_id)) { - Log::info('User with pilot id '.$pilot_id.' exists, reassigning'); - $pilot_id = $this->userSvc->getNextAvailablePilotId(); + Log::info('User with pilot id '.$pilot_id.' exists'); + + // Is this the same user? If not, get a new pilot ID + $user_exist = User::where('pilot_id', $pilot_id)->first(); + if ($user_exist->email !== $row->email) { + $pilot_id = $this->userSvc->getNextAvailablePilotId(); + } } $attrs = [ @@ -61,8 +70,9 @@ class UserImport extends BaseImporter 'rank_id' => $rank_id, 'home_airport_id' => $row->hub, 'curr_airport_id' => $row->hub, + 'country' => $row->location, 'flights' => (int) $row->totalflights, - 'flight_time' => Utils::hoursToMinutes($row->totalhours), + 'flight_time' => Time::hoursToMinutes($row->totalhours), 'state' => $state, 'created_at' => $this->parseDate($row->joindate), ]; @@ -90,9 +100,24 @@ class UserImport extends BaseImporter { // Be default add them to the user role, and then determine if they // belong to any other groups, and add them to that - $this->userSvc->addUserToRole($user, 'user'); + $newRoles = []; - // Figure out what other groups they belong to + // Figure out what other groups they belong to... read from the old table, and map + // them to the new group(s) + $old_user_groups = $this->db->findBy('groupmembers', ['pilotid' => $old_pilot_id]); + foreach ($old_user_groups as $oldGroup) { + $newRoleId = $this->idMapper->getMapping('group', $oldGroup->groupid); + + // This role should be ignored + if ($newRoleId === -1) { + continue; + } + + $newRoles[] = $newRoleId; + } + + // Assign the groups to the new user + $user->attachRoles($newRoles); } /** diff --git a/modules/Importer/Utils/IdMapper.php b/modules/Importer/Utils/IdMapper.php index 14399b06..4a8e0278 100644 --- a/modules/Importer/Utils/IdMapper.php +++ b/modules/Importer/Utils/IdMapper.php @@ -46,4 +46,12 @@ class IdMapper extends Service return $this->valueStore->get($key_name); } + + /** + * Clear the value store + */ + public function clear() + { + $this->valueStore->flush(); + } } diff --git a/modules/Importer/Utils/ImporterDB.php b/modules/Importer/Utils/ImporterDB.php index 60ce6010..6da3ec49 100644 --- a/modules/Importer/Utils/ImporterDB.php +++ b/modules/Importer/Utils/ImporterDB.php @@ -85,6 +85,49 @@ class ImporterDB return $table; } + /** + * Does a table exist? Try to get the column information on it. + * The result will be 'false' if that table isn't there + * + * @param $table + * + * @return bool + */ + public function tableExists($table): bool + { + $this->connect(); + + $sql = 'SHOW COLUMNS FROM '.$this->tableName($table); + $result = $this->conn->query($sql); + if (!$result) { + return false; + } + + return true; + } + + /** + * Get the names of the columns for a particular table + * + * @param $table + * + * @return mixed + */ + public function getColumns($table) + { + $this->connect(); + + $sql = 'SHOW COLUMNS FROM '.$this->tableName($table); + $result = $this->conn->query($sql)->fetchAll(); + + $rows = []; + foreach ($result as $row) { + $rows[] = $row->Field; + } + + return $rows; + } + /** * @param $table * @@ -102,50 +145,95 @@ class ImporterDB return (int) $rows; } + /** + * Read rows from a table with a given assoc array. Simple + * + * @param string $table + * @param array $attrs + * + * @return false|\PDOStatement + */ + public function findBy($table, array $attrs) + { + $this->connect(); + + $where = []; + foreach ($attrs as $col => $value) { + $where[] = $col.'=\''.$value.'\''; + } + + $where = implode(' AND ', $where); + + $sql = implode(' ', [ + 'SELECT', + '*', + 'FROM', + $this->tableName($table), + 'WHERE', + $where, + ]); + + return $this->conn->query($sql); + } + /** * Read all the rows in a table, but read them in a batched manner * - * @param string $table The name of the table - * @param int [$start_offset] - * @param string [$fields] + * @param string $table The name of the table + * @param string $order_by Column to order by + * @param int $start_offset + * @param string $fields * - * @return \Generator + * @return array */ - public function readRows($table, $start_offset = 0, $fields = '*') + public function readRows($table, $order_by = 'id', $start_offset = 0, $fields = '*') { $this->connect(); $offset = $start_offset; - $total_rows = $this->getTotalRows($table); + // $total_rows = $this->getTotalRows($table); - while ($offset < $total_rows) { - $rows_to_read = $offset + $this->batchSize; - if ($rows_to_read > $total_rows) { - $rows_to_read = $total_rows; - } - - // Log::info('Reading '.$offset.' to '.$rows_to_read.' of '.$total_rows); - yield from $this->readRowsOffset($table, $this->batchSize, $offset, $fields); - - $offset += $this->batchSize; + $rows = []; + $result = $this->readRowsOffset($table, $this->batchSize, $offset, $order_by, $fields); + if ($result === false || $result === null) { + return []; } + + try { + foreach ($result as $row) { + $rows[] = $row; + } + } catch (\Exception $e) { + Log::error('foreach rows error: '.$e->getMessage()); + } + + return $rows; } /** * @param string $table - * @param int $limit Number of rows to read - * @param int $offset Where to start from - * @param string [$fields] + * @param int $limit Number of rows to read + * @param int $offset Where to start from + * @param $order_by + * @param string $fields * - * @return \Generator + * @return false|\PDOStatement|void */ - public function readRowsOffset($table, $limit, $offset, $fields = '*') + public function readRowsOffset($table, $limit, $offset, $order_by, $fields = '*') { if (is_array($fields)) { $fields = implode(',', $fields); } - $sql = 'SELECT '.$fields.' FROM '.$this->tableName($table).' LIMIT '.$limit.' OFFSET '.$offset; + $sql = implode(' ', [ + 'SELECT', + $fields, + 'FROM', + $this->tableName($table), + 'ORDER BY '.$order_by.' ASC', + 'LIMIT '.$limit, + 'OFFSET '.$offset, + ]); try { $result = $this->conn->query($sql); @@ -153,9 +241,7 @@ class ImporterDB return; } - foreach ($result as $row) { - yield $row; - } + return $result; } catch (PDOException $e) { // Without incrementing the offset, it should re-run the same query Log::error('Error readRowsOffset: '.$e->getMessage()); @@ -163,6 +249,8 @@ class ImporterDB if (strpos($e->getMessage(), 'server has gone away') !== false) { $this->connect(); } + } catch (\Exception $e) { + Log::error('Error readRowsOffset: '.$e->getMessage()); } } } diff --git a/modules/Installer/Config/config.php b/modules/Installer/Config/config.php index 60713270..f18f27f5 100644 --- a/modules/Installer/Config/config.php +++ b/modules/Installer/Config/config.php @@ -9,12 +9,13 @@ return [ // Default driver to use when no driver is present 'default' => 'file', 'drivers' => [ - 'Zend OPcache' => 'opcache', - 'apc' => 'apc', + // 'Zend OPcache' => 'opcache', + // 'apc' => 'apc', ], ], 'extensions' => [ + // 'bcmath', 'openssl', 'pdo', 'mbstring', diff --git a/modules/Installer/Http/Controllers/InstallerController.php b/modules/Installer/Http/Controllers/InstallerController.php index 8c04c922..e24e6bff 100644 --- a/modules/Installer/Http/Controllers/InstallerController.php +++ b/modules/Installer/Http/Controllers/InstallerController.php @@ -3,9 +3,7 @@ namespace Modules\Installer\Http\Controllers; use App\Contracts\Controller; -use App\Facades\Utils; -use App\Models\User; -use App\Repositories\AirlineRepository; +use App\Services\AirlineService; use App\Services\AnalyticsService; use App\Services\Installer\DatabaseService; use App\Services\Installer\InstallerService; @@ -13,17 +11,19 @@ use App\Services\Installer\MigrationService; use App\Services\Installer\SeederService; use App\Services\UserService; use App\Support\Countries; +use App\Support\Utils; use Illuminate\Database\QueryException; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; +use Laracasts\Flash\Flash; use Modules\Installer\Services\ConfigService; use Modules\Installer\Services\RequirementsService; class InstallerController extends Controller { - private $airlineRepo; + private $airlineSvc; private $analyticsSvc; private $dbSvc; private $envSvc; @@ -35,7 +35,7 @@ class InstallerController extends Controller /** * InstallerController constructor. * - * @param AirlineRepository $airlineRepo + * @param AirlineService $airlineSvc * @param AnalyticsService $analyticsSvc * @param DatabaseService $dbService * @param ConfigService $envService @@ -45,7 +45,7 @@ class InstallerController extends Controller * @param UserService $userService */ public function __construct( - AirlineRepository $airlineRepo, + AirlineService $airlineSvc, AnalyticsService $analyticsSvc, DatabaseService $dbService, ConfigService $envService, @@ -54,7 +54,7 @@ class InstallerController extends Controller SeederService $seederSvc, UserService $userService ) { - $this->airlineRepo = $airlineRepo; + $this->airlineSvc = $airlineSvc; $this->analyticsSvc = $analyticsSvc; $this->dbSvc = $dbService; $this->envSvc = $envService; @@ -63,7 +63,7 @@ class InstallerController extends Controller $this->seederSvc = $seederSvc; $this->userService = $userService; - \App\Support\Utils::disableDebugToolbar(); + Utils::disableDebugToolbar(); } /** @@ -196,7 +196,7 @@ class InstallerController extends Controller Log::error('Testing db before writing configs failed'); Log::error($e->getMessage()); - flash()->error($e->getMessage()); + Flash::error($e->getMessage()); return redirect(route('installer.step2'))->withInput(); } @@ -224,7 +224,7 @@ class InstallerController extends Controller Log::error('Config files failed to write'); Log::error($e->getMessage()); - flash()->error($e->getMessage()); + Flash::error($e->getMessage()); return redirect(route('installer.step2'))->withInput(); } @@ -238,7 +238,7 @@ class InstallerController extends Controller * * @param Request $request * - * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + * @return mixed */ public function dbsetup(Request $request) { @@ -250,9 +250,9 @@ class InstallerController extends Controller $this->seederSvc->syncAllSeeds(); } catch (QueryException $e) { Log::error('Error on db setup: '.$e->getMessage()); - + dd($e); $this->envSvc->removeConfigFiles(); - flash()->error($e->getMessage()); + Flash::error($e->getMessage()); return redirect(route('installer.step2'))->withInput(); } @@ -282,7 +282,7 @@ class InstallerController extends Controller * @throws \Prettus\Validator\Exceptions\ValidatorException * @throws \Exception * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @return mixed */ public function usersetup(Request $request) { @@ -310,7 +310,7 @@ class InstallerController extends Controller 'country' => $request->get('airline_country'), ]; - $airline = $this->airlineRepo->create($attrs); + $airline = $this->airlineSvc->createAirline($attrs); /** * Create the user, and associate to the airline @@ -325,8 +325,7 @@ class InstallerController extends Controller 'password' => Hash::make($request->get('password')), ]; - $user = User::create($attrs); - $user = $this->userService->createUser($user, ['admin']); + $user = $this->userService->createUser($attrs, ['admin']); Log::info('User registered: ', $user->toArray()); // Set the initial admin e-mail address diff --git a/modules/Installer/Resources/views/app.blade.php b/modules/Installer/Resources/views/app.blade.php index 425c7318..eb0fcf52 100644 --- a/modules/Installer/Resources/views/app.blade.php +++ b/modules/Installer/Resources/views/app.blade.php @@ -35,43 +35,39 @@ - - - - -{{--
--}} -
-
-
-
-
- @include('installer::flash.message') - @yield('content') + + {{----}} - - - + + diff --git a/modules/Installer/Resources/views/update/index-start.blade.php b/modules/Installer/Resources/views/update/index-start.blade.php deleted file mode 100644 index c1e7fefe..00000000 --- a/modules/Installer/Resources/views/update/index-start.blade.php +++ /dev/null @@ -1,12 +0,0 @@ -@extends('installer::app') -@section('title', 'Update phpVMS') - -@section('content') -

phpvms updater

-

Press continue to check if there are any updates available.

- {{ Form::open(['route' => 'update.step1', 'method' => 'post']) }} -

- {{ Form::submit('Start >>', ['class' => 'btn btn-success']) }} -

- {{ Form::close() }} -@endsection diff --git a/modules/Installer/Resources/views/update/steps/step1-no-update.blade.php b/modules/Installer/Resources/views/update/steps/step1-no-update.blade.php deleted file mode 100644 index 52a5383a..00000000 --- a/modules/Installer/Resources/views/update/steps/step1-no-update.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -@extends('installer::app') -@section('title', 'Update phpVMS') - -@section('content') -

phpvms updater

-

It seems like you're up to date!

- {{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }} - -

- {{ Form::submit('Complete >>', ['class' => 'btn btn-success']) }} -

- {{ Form::close() }} -@endsection diff --git a/modules/Installer/Resources/views/update/steps/step2-migrations-done.blade.php b/modules/Installer/Resources/views/update/steps/step2-migrations-done.blade.php deleted file mode 100644 index 19fd4000..00000000 --- a/modules/Installer/Resources/views/update/steps/step2-migrations-done.blade.php +++ /dev/null @@ -1,18 +0,0 @@ -@extends('installer::app') -@section('title', 'Update Completed') -@section('content') -
- {{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }} - -
-        
-            {{ $console_output }}
-        
-    
- -

- {{ Form::submit('Complete >>', ['class' => 'btn btn-success']) }} -

- {{ Form::close() }} -
-@endsection diff --git a/modules/Installer/Resources/views/update/steps/step3-update-complete.blade.php b/modules/Installer/Resources/views/update/steps/step3-update-complete.blade.php deleted file mode 100644 index c8851e96..00000000 --- a/modules/Installer/Resources/views/update/steps/step3-update-complete.blade.php +++ /dev/null @@ -1,13 +0,0 @@ -@extends('installer::app') -@section('title', 'Update Completed') - -@section('content') -

phpvms updater

-

Update completed!.

- - {{ Form::open(['route' => 'update.complete', 'method' => 'GET']) }} -

- {{ Form::submit('Finish >>', ['class' => 'btn btn-success']) }} -

- {{ Form::close() }} -@endsection diff --git a/modules/Sample/Awards/SampleAward.php b/modules/Sample/Awards/SampleAward.php deleted file mode 100644 index cf0e56f2..00000000 --- a/modules/Sample/Awards/SampleAward.php +++ /dev/null @@ -1,27 +0,0 @@ -user, which holds the current - * user the award is being checked against - * - * @param null $params Parameters passed in from the UI - * - * @return bool - */ - public function check($params = null): bool - { - return false; - } -} diff --git a/modules/Sample/Config/config.php b/modules/Sample/Config/config.php deleted file mode 100644 index 798e91df..00000000 --- a/modules/Sample/Config/config.php +++ /dev/null @@ -1,5 +0,0 @@ - 'Sample', -]; diff --git a/modules/Sample/Database/seeders/SampleDatabaseSeeder.php b/modules/Sample/Database/seeders/SampleDatabaseSeeder.php deleted file mode 100644 index 2e84cd0d..00000000 --- a/modules/Sample/Database/seeders/SampleDatabaseSeeder.php +++ /dev/null @@ -1,21 +0,0 @@ -call("OthersTableSeeder"); - } -} diff --git a/modules/Sample/Http/Controllers/Admin/AdminController.php b/modules/Sample/Http/Controllers/Admin/AdminController.php deleted file mode 100644 index b9e112b7..00000000 --- a/modules/Sample/Http/Controllers/Admin/AdminController.php +++ /dev/null @@ -1,65 +0,0 @@ -message('Hello, world!'); - } - - /** - * @param Request $request - * - * @return \Illuminate\Http\JsonResponse - */ - public function hello(Request $request) - { - // Another way to return JSON, this for a custom response - // It's recommended to use Resources for responses from the database - return response()->json([ - 'name' => Auth::user()->name, - ]); - } -} diff --git a/modules/Sample/Http/Controllers/SampleController.php b/modules/Sample/Http/Controllers/SampleController.php deleted file mode 100644 index 118cc975..00000000 --- a/modules/Sample/Http/Controllers/SampleController.php +++ /dev/null @@ -1,67 +0,0 @@ - []], function () { - Route::get('/', 'SampleController@index'); -}); - -/* - * This is required to have a valid API key - */ -Route::group(['middleware' => [ - 'api.auth', -]], function () { - Route::get('/hello', 'SampleController@hello'); -}); diff --git a/modules/Sample/Http/Routes/web.php b/modules/Sample/Http/Routes/web.php deleted file mode 100644 index c36c3395..00000000 --- a/modules/Sample/Http/Routes/web.php +++ /dev/null @@ -1,9 +0,0 @@ - [ - 'role:user', // leave blank to make this public -]], function () { - // all your routes are prefixed with the above prefix - // e.g. yoursite.com/sample - Route::get('/', 'SampleController@index'); -}); diff --git a/modules/Sample/Listeners/TestEventListener.php b/modules/Sample/Listeners/TestEventListener.php deleted file mode 100644 index b6191119..00000000 --- a/modules/Sample/Listeners/TestEventListener.php +++ /dev/null @@ -1,17 +0,0 @@ - [TestEventListener::class], - ]; - - /** - * Register any events for your application. - */ - public function boot() - { - parent::boot(); - } -} diff --git a/modules/Sample/Providers/SampleServiceProvider.php b/modules/Sample/Providers/SampleServiceProvider.php deleted file mode 100644 index 8d2d9cb0..00000000 --- a/modules/Sample/Providers/SampleServiceProvider.php +++ /dev/null @@ -1,153 +0,0 @@ -moduleSvc = app(ModuleService::class); - - $this->registerRoutes(); - $this->registerTranslations(); - $this->registerConfig(); - $this->registerViews(); - - $this->registerLinks(); - - $this->loadMigrationsFrom(__DIR__.'/../Database/migrations'); - } - - /** - * Register the service provider. - */ - public function register() - { - // - } - - /** - * Add module links here - */ - public function registerLinks() - { - // Show this link if logged in - // $this->moduleSvc->addFrontendLink('Sample', '/sample', '', $logged_in=true); - - // Admin links: - $this->moduleSvc->addAdminLink('Sample', '/admin/sample'); - } - - /** - * Register the routes - */ - protected function registerRoutes() - { - /* - * Routes for the frontend - */ - Route::group([ - 'as' => 'sample.', - 'prefix' => 'sample', - // If you want a RESTful module, change this to 'api' - 'middleware' => ['web'], - 'namespace' => 'Modules\Sample\Http\Controllers', - ], function () { - $this->loadRoutesFrom(__DIR__.'/../Http/Routes/web.php'); - }); - - /* - * Routes for the admin - */ - Route::group([ - 'as' => 'sample.', - 'prefix' => 'admin/sample', - // If you want a RESTful module, change this to 'api' - 'middleware' => ['web', 'role:admin'], - 'namespace' => 'Modules\Sample\Http\Controllers\Admin', - ], function () { - $this->loadRoutesFrom(__DIR__.'/../Http/Routes/admin.php'); - }); - - /* - * Routes for an API - */ - Route::group([ - 'as' => 'sample.', - 'prefix' => 'api/sample', - // If you want a RESTful module, change this to 'api' - 'middleware' => ['api'], - 'namespace' => 'Modules\Sample\Http\Controllers\Api', - ], function () { - $this->loadRoutesFrom(__DIR__.'/../Http/Routes/api.php'); - }); - } - - /** - * Register config. - */ - protected function registerConfig() - { - $this->publishes([ - __DIR__.'/../Config/config.php' => config_path('sample.php'), - ], 'config'); - - $this->mergeConfigFrom( - __DIR__.'/../Config/config.php', 'sample' - ); - } - - /** - * Register views. - */ - public function registerViews() - { - $viewPath = resource_path('views/modules/sample'); - $sourcePath = __DIR__.'/../Resources/views'; - - $this->publishes([ - $sourcePath => $viewPath, - ], 'views'); - - $paths = array_map( - function ($path) { - return $path.'/modules/sample'; - }, - \Config::get('view.paths') - ); - - $paths[] = $sourcePath; - $this->loadViewsFrom($paths, 'sample'); - } - - /** - * Register translations. - */ - public function registerTranslations() - { - $langPath = resource_path('lang/modules/sample'); - - if (is_dir($langPath)) { - $this->loadTranslationsFrom($langPath, 'sample'); - } else { - $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'sample'); - } - } - - /** - * Get the services provided by the provider. - */ - public function provides(): array - { - return []; - } -} diff --git a/modules/Sample/Resources/views/admin/create.blade.php b/modules/Sample/Resources/views/admin/create.blade.php deleted file mode 100644 index dd55d46a..00000000 --- a/modules/Sample/Resources/views/admin/create.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@extends('sample::layouts.admin') - -@section('title', 'Sample Create') -@section('actions') -@endsection - -@section('content') -
-
-

Create something!

-

Add a form!

-
-
-@endsection diff --git a/modules/Sample/Resources/views/admin/index.blade.php b/modules/Sample/Resources/views/admin/index.blade.php deleted file mode 100644 index 0d994bc9..00000000 --- a/modules/Sample/Resources/views/admin/index.blade.php +++ /dev/null @@ -1,18 +0,0 @@ -@extends('sample::layouts.admin') - -@section('title', 'Sample') -@section('actions') -
  • - - - Add New -
  • -@endsection -@section('content') -
    -
    -

    Admin Scaffold!

    -

    This view is loaded from module: {{ config('sample.name') }}

    -
    -
    -@endsection diff --git a/modules/Sample/Resources/views/index.blade.php b/modules/Sample/Resources/views/index.blade.php deleted file mode 100644 index 4ecd1f5d..00000000 --- a/modules/Sample/Resources/views/index.blade.php +++ /dev/null @@ -1,9 +0,0 @@ -@extends('sample::layouts.frontend') - -@section('content') -

    Hello World

    - -

    - This view is loaded from module: {{ config('sample.name') }} -

    -@endsection diff --git a/modules/Sample/Resources/views/layouts/admin.blade.php b/modules/Sample/Resources/views/layouts/admin.blade.php deleted file mode 100644 index 421bbe11..00000000 --- a/modules/Sample/Resources/views/layouts/admin.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -{{-- -You probably don't want to edit anything here. Just make -sure to extend this in your views. It will pass the content section through ---}} -@extends('admin.app') diff --git a/modules/Sample/Resources/views/layouts/frontend.blade.php b/modules/Sample/Resources/views/layouts/frontend.blade.php deleted file mode 100644 index 86f3a27a..00000000 --- a/modules/Sample/Resources/views/layouts/frontend.blade.php +++ /dev/null @@ -1,5 +0,0 @@ -{{-- -You probably don't want to edit anything here. Just make -sure to extend this in your views. It will pass the content section through ---}} -@extends('app') diff --git a/modules/Sample/composer.json b/modules/Sample/composer.json deleted file mode 100644 index e05835a4..00000000 --- a/modules/Sample/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "phpvms/sample-module", - "type": "laravel-module", - "description": "", - "require": { - "joshbrw/laravel-module-installer": "0.1.x" - }, - "extra": { - "laravel": { - "providers": [ - "Modules\\Sample\\Providers\\SampleServiceProvider", - "Modules\\Sample\\Providers\\EventServiceProvider" - ], - "aliases": { - - } - } - }, - "autoload": { - "psr-4": { - "Modules\\Sample\\": "" - } - } -} diff --git a/modules/Sample/module.json b/modules/Sample/module.json deleted file mode 100644 index 7f563f3b..00000000 --- a/modules/Sample/module.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "Sample", - "alias": "sample", - "description": "", - "keywords": [], - "active": 1, - "order": 0, - "providers": [ - "Modules\\Sample\\Providers\\SampleServiceProvider", - "Modules\\Sample\\Providers\\EventServiceProvider" - ], - "aliases": {}, - "files": [], - "requires": [] -} diff --git a/modules/Updater/Http/Controllers/UpdateController.php b/modules/Updater/Http/Controllers/UpdateController.php index ea205d57..77ad6fc1 100644 --- a/modules/Updater/Http/Controllers/UpdateController.php +++ b/modules/Updater/Http/Controllers/UpdateController.php @@ -3,9 +3,11 @@ namespace Modules\Updater\Http\Controllers; use App\Contracts\Controller; +use App\Repositories\KvpRepository; use App\Services\Installer\InstallerService; use App\Services\Installer\MigrationService; use App\Services\Installer\SeederService; +use Codedge\Updater\UpdaterManager; use function count; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -13,22 +15,30 @@ use Illuminate\Support\Facades\Log; class UpdateController extends Controller { private $installerSvc; + private $kvpRepo; private $migrationSvc; private $seederSvc; + private $updateManager; /** * @param InstallerService $installerSvc * @param MigrationService $migrationSvc * @param SeederService $seederSvc + * @param KvpRepository $kvpRepo + * @param UpdaterManager $updateManager */ public function __construct( InstallerService $installerSvc, + KvpRepository $kvpRepo, MigrationService $migrationSvc, - SeederService $seederSvc + SeederService $seederSvc, + UpdaterManager $updateManager ) { $this->migrationSvc = $migrationSvc; $this->seederSvc = $seederSvc; $this->installerSvc = $installerSvc; + $this->kvpRepo = $kvpRepo; + $this->updateManager = $updateManager; } /** @@ -94,4 +104,36 @@ class UpdateController extends Controller { return redirect('/login'); } + + /** + * Show the update page with the latest version + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function updater(Request $request) + { + $version = $this->kvpRepo->get('latest_version_tag'); + + return view('updater::downloader/downloader', [ + 'version' => $version, + ]); + } + + /** + * Download the actual update and then forward the user to the updater page + * + * @param \Illuminate\Http\Request $request + * + * @return mixed + */ + public function update_download(Request $request) + { + $version = $this->kvpRepo->get('latest_version_tag'); + $this->updateManager->source('github')->update($version); + + Log::info('Update completed to '.$version.', redirecting'); + return redirect('/update'); + } } diff --git a/modules/Updater/Lib/VmsRepositoryType.php b/modules/Updater/Lib/VmsRepositoryType.php new file mode 100644 index 00000000..825a6ec0 --- /dev/null +++ b/modules/Updater/Lib/VmsRepositoryType.php @@ -0,0 +1,124 @@ +config = $config; + $this->client = $client; + $this->storagePath = Str::finish($this->config['download_path'], DIRECTORY_SEPARATOR); + $this->versionSvc = app(VersionService::class); + } + + /** + * Check repository if a newer version than the installed one is available. + * + * @param string $currentVersion + * + * @throws InvalidArgumentException + * @throws Exception + * + * @return bool + */ + public function isNewVersionAvailable(string $currentVersion = ''): bool + { + return $this->versionSvc->isNewVersionAvailable($currentVersion); + } + + /** + * Get the latest version that has been published in a certain repository. + * Example: 2.6.5 or v2.6.5. + * + * @param string $prepend Prepend a string to the latest version + * @param string $append Append a string to the latest version + * + * @throws Exception + * + * @return string + */ + public function getVersionAvailable(string $prepend = '', string $append = ''): string + { + return $this->versionSvc->getLatestVersion(); + } + + /** + * Fetches the latest version. If you do not want the latest version, specify one and pass it. + * + * @param string $version + * + * @throws Exception + * + * @return void + */ + public function fetch($version = ''): void + { + $response = $this->getRepositoryReleases(); + $releaseCollection = collect(\GuzzleHttp\json_decode($response->getBody()->getContents())); + + if ($releaseCollection->isEmpty()) { + throw new Exception('Cannot find a release to update. Please check the repository you\'re pulling from'); + } + + if (!File::exists($this->storagePath)) { + File::makeDirectory($this->storagePath, 493, true, true); + } + + if (!empty($version)) { + $release = $releaseCollection->where('name', $version)->first(); + } else { + $release = $releaseCollection->first(); + } + + Log::info('Found release='.$release->name.', path='.$release->zipball_url); + $storageFolder = $this->storagePath.$release->name.'-'.now()->timestamp; + $storageFilename = $storageFolder.'.zip'; + + if (!$this->isSourceAlreadyFetched($release->name)) { + $this->downloadRelease($this->client, $release->zipball_url, $storageFilename); + $this->unzipArchive($storageFilename, $storageFolder); + $this->createReleaseFolder($storageFolder, $release->name); + } + } + + protected function getRepositoryReleases(): ResponseInterface + { + $url = self::GITHUB_API_URL + .'/repos/'.$this->config['repository_vendor'] + .'/'.$this->config['repository_name'] + .'/tags'; + + $headers = []; + return $this->client->request('GET', $url, ['headers' => $headers]); + } +} diff --git a/modules/Updater/Providers/UpdateServiceProvider.php b/modules/Updater/Providers/UpdateServiceProvider.php index 2db32de4..7739ce39 100644 --- a/modules/Updater/Providers/UpdateServiceProvider.php +++ b/modules/Updater/Providers/UpdateServiceProvider.php @@ -33,6 +33,10 @@ class UpdateServiceProvider extends ServiceProvider Route::post('/run-migrations', 'UpdateController@run_migrations')->name('run_migrations'); Route::get('/complete', 'UpdateController@complete')->name('complete'); + + // Routes for the update downloader + Route::get('/downloader', 'UpdateController@updater')->name('updater'); + Route::post('/downloader', 'UpdateController@update_download')->name('update_download'); }); } diff --git a/modules/Updater/Resources/views/app.blade.php b/modules/Updater/Resources/views/app.blade.php index dfdd534e..d9c9c647 100644 --- a/modules/Updater/Resources/views/app.blade.php +++ b/modules/Updater/Resources/views/app.blade.php @@ -6,7 +6,7 @@ - @yield('title') - updater + @yield('title') - installer @@ -35,43 +35,39 @@ - - - - -{{--
    --}} -
    -
    -
    -
    -
    - @include('installer::flash.message') - @yield('content') + + {{----}} - - - + + + +

    + diff --git a/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/tmpFrameset.html b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 00000000..38c7540f --- /dev/null +++ b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.css b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.css new file mode 100644 index 00000000..2a622f22 --- /dev/null +++ b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.js b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.js new file mode 100644 index 00000000..6513a9e7 --- /dev/null +++ b/public/assets/vendor/ckeditor4/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,91 @@ +/* + Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function A(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function J(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var d=[],c="",e;for(e in a)for(var f in a[e]){var h=a[e][f];"en_US"==h?c=h:d.push(h)}d.sort();c&&d.unshift(c);return{getCurrentLangGroup:function(d){a:{for(var c in a)for(var e in a[c])if(e.toUpperCase()===d.toUpperCase()){d=c;break a}d=""}return d},setLangList:function(){var d={},c;for(c in a)for(var e in a[c])d[a[c][e]]= +e;return d}()}}var g=function(){var a=function(a,b,e){e=e||{};var f=e.expires;if("number"==typeof f&&f){var h=new Date;h.setTime(h.getTime()+1E3*f);f=e.expires=h}f&&f.toUTCString&&(e.expires=f.toUTCString());b=encodeURIComponent(b);a=a+"\x3d"+b;for(var k in e)b=e[k],a+="; "+k,!0!==b&&(a+="\x3d"+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString, +e=a.fn||null,f=a.id||"",h=a.target||window,k=a.message||{id:f};a.message&&"[object Object]"==b.call(a.message)&&(a.message.id?a.message.id:a.message.id=f,k=a.message);a=window.JSON.stringify(k,e);h.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(new RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, +"\\$1")+"\x3d([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(d){a(d,"",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){var b;(b=0===a.offsetWidth||0==a.offsetHeight)||(b="none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display)); +return!b},hasClass:function(a,b){return!(!a.className||!a.className.match(new RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check= +null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.sessionid="";a.LocalizationButton={ChangeTo_button:{instance:null,text:"Change to",localizationID:"ChangeTo"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking_button:{instance:null,text:"Finish Checking", +localizationID:"FinishChecking"},Option_button:{instance:null,text:"Options",localizationID:"Options"},FinishChecking_button_block:{instance:null,text:"Finish Checking",localizationID:"FinishChecking"}};a.LocalizationLabel={ChangeTo_label:{instance:null,text:"Change to",localizationID:"ChangeTo"},Suggestions:{instance:null,text:"Suggestions"},Categories:{instance:null,text:"Categories"},Synonyms:{instance:null,text:"Synonyms"}};var K=function(b){var d,c,e;for(e in b){if(d=a.dialog.getContentElement(a.dialog._.currentTabId, +e))d=d.getElement();else if(b[e].instance)d=b[e].instance.getElement().getFirst()||b[e].instance.getElement();else continue;c=b[e].localizationID||e;d.setText(a.LocalizationComing[c])}},L=function(b){var d,c,e;for(e in b)d=a.dialog.getContentElement(a.dialog._.currentTabId,e),d||(d=b[e].instance),d.setLabel&&(c=b[e].localizationID||e,d.setLabel(a.LocalizationComing[c]+":"))},t,B;a.framesetHtml=function(b){return"\x3ciframe id\x3d"+a.iframeNumber+"_"+b+' frameborder\x3d"0" allowtransparency\x3d"1" style\x3d"width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"\x3e\x3c/iframe\x3e'}; +a.setIframe=function(b,d){var c;c=a.framesetHtml(d);var e=a.iframeNumber+"_"+d;b.getElement().setHtml(c);c=document.getElementById(e);c=c.contentWindow?c.contentWindow:c.contentDocument.document?c.contentDocument.document:c.contentDocument;c.document.open();c.document.write('\x3c!DOCTYPE html\x3e\x3chtml\x3e\x3chead\x3e\x3cmeta charset\x3d"UTF-8"\x3e\x3ctitle\x3eiframe\x3c/title\x3e\x3cstyle\x3ehtml,body{margin: 0;height: 100%;font: 13px/1.555 "Trebuchet MS", sans-serif;}a{color: #888;font-weight: bold;text-decoration: none;border-bottom: 1px solid #888;}.main-box {color:#252525;padding: 3px 5px;text-align: justify;}.main-box p{margin: 0 0 14px;}.main-box .cerr{color: #f00000;border-bottom-color: #f00000;}\x3c/style\x3e\x3c/head\x3e\x3cbody\x3e\x3cdiv id\x3d"content" class\x3d"main-box"\x3e\x3c/div\x3e\x3ciframe src\x3d"" frameborder\x3d"0" id\x3d"spelltext" name\x3d"spelltext" style\x3d"display:none; width: 100%" \x3e\x3c/iframe\x3e\x3ciframe src\x3d"" frameborder\x3d"0" id\x3d"loadsuggestfirst" name\x3d"loadsuggestfirst" style\x3d"display:none; width: 100%" \x3e\x3c/iframe\x3e\x3ciframe src\x3d"" frameborder\x3d"0" id\x3d"loadspellsuggestall" name\x3d"loadspellsuggestall" style\x3d"display:none; width: 100%" \x3e\x3c/iframe\x3e\x3ciframe src\x3d"" frameborder\x3d"0" id\x3d"loadOptionsForm" name\x3d"loadOptionsForm" style\x3d"display:none; width: 100%" \x3e\x3c/iframe\x3e\x3cscript\x3e(function(window) {var ManagerPostMessage \x3d function() {var _init \x3d function(handler) {if (document.addEventListener) {window.addEventListener("message", handler, false);} else {window.attachEvent("onmessage", handler);};};var _sendCmd \x3d function(o) {var str,type \x3d Object.prototype.toString,fn \x3d o.fn || null,id \x3d o.id || "",target \x3d o.target || window,message \x3d o.message || { "id": id };if (o.message \x26\x26 type.call(o.message) \x3d\x3d "[object Object]") {(o.message["id"]) ? o.message["id"] : o.message["id"] \x3d id;message \x3d o.message;};str \x3d JSON.stringify(message, fn);target.postMessage(str, "*");};return {init: _init,send: _sendCmd};};var manageMessageTmp \x3d new ManagerPostMessage;var appString \x3d (function(){var spell \x3d parent.CKEDITOR.config.wsc.DefaultParams.scriptPath;var serverUrl \x3d parent.CKEDITOR.config.wsc.DefaultParams.serviceHost;return serverUrl + spell;})();function loadScript(src, callback) {var scriptTag \x3d document.createElement("script");scriptTag.type \x3d "text/javascript";callback ? callback : callback \x3d function() {};if(scriptTag.readyState) {scriptTag.onreadystatechange \x3d function() {if (scriptTag.readyState \x3d\x3d "loaded" ||scriptTag.readyState \x3d\x3d "complete") {scriptTag.onreadystatechange \x3d null;setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();}};}else{scriptTag.onload \x3d function() {setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();};};scriptTag.src \x3d src;document.getElementsByTagName("head")[0].appendChild(scriptTag);};window.onload \x3d function(){loadScript(appString, function(){manageMessageTmp.send({"id": "iframeOnload","target": window.parent});});}})(this);\x3c/script\x3e\x3c/body\x3e\x3c/html\x3e'); +c.document.close();a.div_overlay.setEnable()};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(),d=a.dialog.getContentElement("GrammTab","banner").getElement(),c=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");d.setStyle("height","90px");c.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+ +"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var d=b._.currentTabId,c=b._.contents[d].Content,e,f;a.previousTab=d;a.setIframe(c,d);var h=function(h){d=b._.currentTabId;h=h||window.event;h.data.getTarget().is("a")&&d!==a.previousTab&&(a.previousTab=d,c=b._.contents[d].Content,e=a.iframeNumber+"_"+d,a.div_overlay.setEnable(),c.getElement().getChildCount()?F(a.targetFromFrame[e],a.cmd[d]):(a.setIframe(c,d),f=document.getElementById(e),a.targetFromFrame[e]=f.contentWindow))}; +b.parts.tabs.removeListener("click",h);b.parts.tabs.on("click",h)};a.buildSelectLang=function(a){var d=new CKEDITOR.dom.element("div"),c=new CKEDITOR.dom.element("select");a="wscLang"+a;d.addClass("cke_dialog_ui_input_select");d.setAttribute("role","presentation");d.setStyles({height:"auto",position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});c.setAttribute("id",a);c.addClass("cke_dialog_ui_input_select");c.setStyles({width:"160px"});d.append(c);return d};a.buildOptionLang= +function(b,d){var c=document.getElementById("wscLang"+d),e=document.createDocumentFragment(),f,h,k=[];if(0===c.options.length){for(f in b)k.push([f,b[f]]);k.sort();for(var l=0;lm.width-E&&(e=m.width-E);if(gm.height-r&&(g=m.height-r);n.width=e+E;n.height=g+r;a._.fromResizeEvent=!1;a.resize(e,g);setTimeout(function(){a._.fromResizeEvent=!1;CKEDITOR.dialog.fire("resize",{dialog:a,width:e, +height:g},b)},300)}a._.moved||(r=isNaN(c)&&isNaN(d)?0:1,isNaN(c)&&(c=(m.width-n.width)/2),0>c&&(c=0),c>m.width-n.width&&(c=m.width-n.width),isNaN(d)&&(d=(m.height-n.height)/2),0>d&&(d=0),d>m.height-n.height&&(d=m.height-n.height),a.move(c,d,r))}function c(){b.wsc={};(function(a){var b={separator:"\x3c$\x3e",getDataType:function(a){return"undefined"===typeof a?"undefined":null===a?"null":Object.prototype.toString.call(a).slice(8,-1)},convertDataToString:function(a){return this.getDataType(a).toLowerCase()+ +this.separator+a},restoreDataFromString:function(a){var b=a,c;a=this.backCompatibility(a);if("string"===typeof a)switch(b=a.indexOf(this.separator),c=a.substring(0,b),b=a.substring(b+this.separator.length),c){case "boolean":b="true"===b;break;case "number":b=parseFloat(b);break;case "array":b=""===b?[]:b.split(",");break;case "null":b=null;break;case "undefined":b=void 0}return b},backCompatibility:function(a){var b=a,c;"string"===typeof a&&(c=a.indexOf(this.separator),0>c&&(b=parseFloat(a),isNaN(b)&& +("["===a[0]&&"]"===a[a.length-1]?(a=a.replace("[",""),a=a.replace("]",""),b=""===a?[]:a.split(",")):b="true"===a||"false"===a?"true"===a:a),b=this.convertDataToString(b)));return b}},c={get:function(a){return b.restoreDataFromString(window.localStorage.getItem(a))},set:function(a,c){var d=b.convertDataToString(c);window.localStorage.setItem(a,d)},del:function(a){window.localStorage.removeItem(a)},clear:function(){window.localStorage.clear()}},d={expiration:31622400,get:function(a){return b.restoreDataFromString(this.getCookie(a))}, +set:function(a,c){var d=b.convertDataToString(c);this.setCookie(a,d,{expires:this.expiration})},del:function(a){this.deleteCookie(a)},getCookie:function(a){return(a=document.cookie.match(new RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"\x3d([^;]*)")))?decodeURIComponent(a[1]):void 0},setCookie:function(a,b,c){c=c||{};var d=c.expires;if("number"===typeof d&&d){var e=new Date;e.setTime(e.getTime()+1E3*d);d=c.expires=e}d&&d.toUTCString&&(c.expires=d.toUTCString());b=encodeURIComponent(b); +a=a+"\x3d"+b;for(var h in c)b=c[h],a+="; "+h,!0!==b&&(a+="\x3d"+b);document.cookie=a},deleteCookie:function(a){this.setCookie(a,null,{expires:-1})},clear:function(){for(var a=document.cookie.split(";"),b=0;b .cke_dialog_ui_button:first-child +{ + margin-top: 4px; +} + +div[name=SpellTab] .wsc-spelltab-bottom .cke_dialog_ui_hbox_first .cke_dialog_ui_select > label +{ + margin-left: 0; +} + +div[name=SpellTab] .wsc-spelltab-bottom .cke_dialog_ui_hbox_first .cke_dialog_ui_select div.cke_dialog_ui_input_select +{ + width: 140px !important; +} + +div[name=SpellTab] .wsc-spelltab-bottom .cke_dialog_ui_hbox_first .cke_dialog_ui_select select.cke_dialog_ui_input_select, +div[name=Thesaurus] div.cke_dialog_ui_input_select select.cke_dialog_ui_input_select +{ + margin-top: 1px; +} + +div[name=SpellTab] .wsc-spelltab-bottom .cke_dialog_ui_hbox_first .cke_dialog_ui_select select.cke_dialog_ui_input_select:focus, +div[name=Thesaurus] div.cke_dialog_ui_input_select select.cke_dialog_ui_input_select:focus +{ + margin-top: 0; +} + +div[name=GrammTab] .cke_dialog_ui_vbox tbody > tr:first-child .cke_dialog_ui_button, +div[name=Thesaurus] .cke_dialog_ui_vbox tbody > tr:first-child .cke_dialog_ui_button +{ + margin-top: 4px !important; +} + +div[name=Thesaurus] div.cke_dialog_ui_input_select +{ + width: 180px !important; +} diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog.css new file mode 100644 index 00000000..61de6a50 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie.css new file mode 100644 index 00000000..e34c7534 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie8.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie8.css new file mode 100644 index 00000000..f6d8f89b --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button{min-height:18px}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{min-height:18px}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus{padding-top:4px;padding-bottom:2px}select.cke_dialog_ui_input_select{width:100%!important}select.cke_dialog_ui_input_select:focus{margin-left:1px;width:100%!important;padding-top:2px;padding-bottom:2px} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_iequirks.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_iequirks.css new file mode 100644 index 00000000..804e5a88 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#fff}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:12px;cursor:move;position:relative;color:#484848;border-bottom:1px solid #d1d1d1;padding:12px 19px 12px 12px;background:#f8f8f8;letter-spacing:.3px}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border:2px solid rgba(102,102,102,0.2);border-left-color:rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:43px;border-top:1px solid #d1d1d1}.cke_dialog_contents_body{overflow:auto;padding:9px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:33px;display:inline-block;margin:9px 0 0;position:absolute;z-index:2;left:11px}.cke_rtl .cke_dialog_tabs{left:auto;right:11px}a.cke_dialog_tab{height:25px;padding:4px 8px;display:inline-block;cursor:pointer;line-height:26px;outline:0;color:#484848;border:1px solid #d1d1d1;border-radius:3px 3px 0 0;background:#f8f8f8;min-width:90px;text-align:center;margin-left:-1px;letter-spacing:.3px}a.cke_dialog_tab:hover{background-color:#fff}a.cke_dialog_tab:focus{border:2px solid #139ff7;border-bottom-color:#d1d1d1;padding:3px 7px;position:relative;z-index:1}a.cke_dialog_tab_selected{background:#fff;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus{border-bottom-color:#fff}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:16px;width:16px;top:11px;z-index:5;opacity:.7;filter:alpha(opacity = 70)}.cke_rtl .cke_dialog_close_button{left:12px}.cke_ltr .cke_dialog_close_button{right:12px}.cke_hc a.cke_dialog_close_button{background-image:none}.cke_hidpi a.cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}a.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}a.cke_dialog_close_button span{display:none}.cke_hc a.cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%;margin-top:12px}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,input.cke_dialog_ui_input_tel,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #bcbcbc;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:2px;min-height:28px;margin-left:1px}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,input.cke_dialog_ui_input_tel:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,input.cke_dialog_ui_input_tel:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:2px solid #139ff7}input.cke_dialog_ui_input_text:focus{padding-left:5px}textarea.cke_dialog_ui_input_textarea:focus{padding:3px 5px}select.cke_dialog_ui_input_select:focus{margin:0;width:100%!important}input.cke_dialog_ui_checkbox_input,input.cke_dialog_ui_radio_input{margin-left:1px;margin-right:2px}input.cke_dialog_ui_checkbox_input:focus,input.cke_dialog_ui_checkbox_input:active,input.cke_dialog_ui_radio_input:focus,input.cke_dialog_ui_radio_input:active{border:0;outline:2px solid #139ff7}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 1px;margin:0;text-align:center;color:#484848;vertical-align:middle;cursor:pointer;border:1px solid #bcbcbc;border-radius:2px;background:#f8f8f8;letter-spacing:.3px;line-height:18px;box-sizing:border-box}.cke_hc a.cke_dialog_ui_button{border-width:3px}span.cke_dialog_ui_button{padding:0 10px;cursor:pointer}a.cke_dialog_ui_button:hover{background:#fff}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border:2px solid #139ff7;outline:0;padding:3px 0}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;background:#09863e;border:1px solid #09863e}.cke_hc a.cke_dialog_ui_button{border:3px solid #bcbcbc}a.cke_dialog_ui_button_ok:hover{background:#53aa78;border-color:#53aa78}a.cke_dialog_ui_button_ok:focus{box-shadow:inset 0 0 0 2px #FFF}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#139ff7}.cke_hc a.cke_dialog_ui_button_ok:hover,.cke_hc a.cke_dialog_ui_button_ok:focus,.cke_hc a.cke_dialog_ui_button_ok:active{border-color:#484848}a.cke_dialog_ui_button_ok.cke_disabled{background:#d1d1d1;border-color:#d1d1d1;cursor:default}a.cke_dialog_ui_button_ok.cke_disabled span{cursor:default}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:28px;line-height:28px;background-color:#fff;border:1px solid #bcbcbc;padding:3px 3px 3px 6px;outline:0;border-radius:2px;margin:0 1px;box-sizing:border-box;width:calc(100% - 2px)!important}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog_ui_labeled_label{margin-left:1px}.cke_dialog .cke_dark_background{background-color:transparent}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked,.cke_dialog a.cke_btn_reset{margin:2px}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_dialog a.cke_btn_over,.cke_dialog a.cke_btn_locked:hover,.cke_dialog a.cke_btn_locked:focus,.cke_dialog a.cke_btn_locked:active,.cke_dialog a.cke_btn_unlocked:hover,.cke_dialog a.cke_btn_unlocked:focus,.cke_dialog a.cke_btn_unlocked:active,.cke_dialog a.cke_btn_reset:hover,.cke_dialog a.cke_btn_reset:focus,.cke_dialog a.cke_btn_reset:active{cursor:pointer;outline:0;margin:0;border:2px solid #139ff7}.cke_dialog fieldset{border:1px solid #bcbcbc}.cke_dialog fieldset legend{padding:0 6px}.cke_dialog_ui_checkbox,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{display:inline-block}.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox{padding-top:5px}.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input,.cke_dialog fieldset .cke_dialog_ui_vbox .cke_dialog_ui_checkbox .cke_dialog_ui_checkbox_input+label{vertical-align:middle}.cke_dialog .ImagePreviewBox{border:1px ridge #bcbcbc;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:1px solid #bcbcbc;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;cursor:default;letter-spacing:.3px}.cke_dialog_body label+.cke_dialog_ui_labeled_content{margin-top:2px}.cke_dialog_contents_body .cke_dialog_ui_text,.cke_dialog_contents_body .cke_dialog_ui_select,.cke_dialog_contents_body .cke_dialog_ui_hbox_last>a.cke_dialog_ui_button{margin-top:4px}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:2px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_contents_body .cke_accessibility_legend{margin:2px 7px 2px 2px}.cke_dialog_contents_body .cke_accessibility_legend:focus,.cke_dialog_contents_body .cke_accessibility_legend:active{outline:0;border:2px solid #139ff7;margin:0 5px 0 0}.cke_dialog_contents_body input[type=file]:focus,.cke_dialog_contents_body input[type=file]:active{border:2px solid #139ff7}.cke_dialog_find_fieldset{margin-top:10px!important}.cke_dialog_image_ratiolock{margin-top:52px!important}.cke_dialog_forms_select_order label.cke_dialog_ui_labeled_label{margin-left:0}.cke_dialog_forms_select_order div.cke_dialog_ui_input_select{width:100%}.cke_dialog_forms_select_order_txtsize .cke_dialog_ui_hbox_last{padding-top:4px}.cke_dialog_image_url .cke_dialog_ui_hbox_last,.cke_dialog_flash_url .cke_dialog_ui_hbox_last{vertical-align:bottom}a.cke_dialog_ui_button.cke_dialog_image_browse{margin-top:10px}.cke_dialog_contents_body .cke_tpl_list{border:#bcbcbc 1px solid;margin:1px}.cke_dialog_contents_body .cke_tpl_list:focus,.cke_dialog_contents_body .cke_tpl_list:active{outline:0;margin:0;border:2px solid #139ff7}.cke_dialog_contents_body .cke_tpl_list a:focus,.cke_dialog_contents_body .cke_tpl_list a:active{outline:0}.cke_dialog_contents_body .cke_tpl_list a:focus .cke_tpl_item,.cke_dialog_contents_body .cke_tpl_list a:active .cke_tpl_item{border:2px solid #139ff7;padding:6px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password,.cke_rtl input.cke_dialog_ui_input_tel{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password,.cke_rtl div.cke_dialog_ui_input_tel{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_tel,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/editor.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor.css new file mode 100644 index 00000000..676ed8a9 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_gecko.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_gecko.css new file mode 100644 index 00000000..86949191 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie.css new file mode 100644 index 00000000..ac4548fb --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie8.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie8.css new file mode 100644 index 00000000..d1bd02fa --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbar{position:relative}.cke_rtl .cke_toolbar_end{right:auto;left:0}.cke_toolbar_end:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:1px;right:2px}.cke_rtl .cke_toolbar_end:after{right:auto;left:2px}.cke_hc .cke_toolbar_end:after{top:2px;right:5px;border-color:#000}.cke_hc.cke_rtl .cke_toolbar_end:after{right:auto;left:5px}.cke_combo+.cke_toolbar_end:after,.cke_toolbar.cke_toolbar_last .cke_toolbar_end:after{content:none;border:0}.cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:0}.cke_rtl .cke_combo+.cke_toolgroup+.cke_toolbar_end:after{right:auto;left:0}.cke_button__about_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_iequirks.css b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_iequirks.css new file mode 100644 index 00000000..edfb9f09 --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #d1d1d1;padding:0}.cke_inner{display:block;background:#fff;padding:0;-webkit-touch-callout:none}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #d1d1d1;background:#f8f8f8;padding:6px 8px 2px;white-space:normal}.cke_float .cke_top{border:1px solid #d1d1d1}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #d1d1d1;background:#f8f8f8}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #bcbcbc transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #bcbcbc;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #d1d1d1}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_block:focus{outline:0}.cke_panel_list{margin:0;padding:0;list-style-type:none;white-space:nowrap}.cke_panel_listItem{margin:0;padding:0}.cke_panel_listItem a{padding:6px 7px;display:block;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis}.cke_hc .cke_panel_listItem a{border-style:none}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:4px 5px}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:6px 6px 7px 6px;color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock{padding:10px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a.cke_colorbox{padding:2px;float:left;width:20px;height:20px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox{border-color:#bcbcbc}span.cke_colorbox{width:20px;height:20px;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a.cke_colorauto{padding:0;border:1px solid transparent;margin-bottom:6px;height:26px;line-height:26px}a.cke_colormore{margin-top:10px;height:20px;line-height:19px}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,a:hover.cke_colormore{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:.95;filter:alpha(opacity = 95);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png?t=8a12b04171) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png?t=8a12b04171) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/icons.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/icons.png new file mode 100644 index 00000000..5cdb2dbb Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/icons.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/icons_hidpi.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/icons_hidpi.png new file mode 100644 index 00000000..3ddfb1d1 Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/icons_hidpi.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/arrow.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/arrow.png new file mode 100644 index 00000000..d72b5f3b Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/arrow.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/close.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/close.png new file mode 100644 index 00000000..40caa6dd Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/close.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/close.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/close.png new file mode 100644 index 00000000..fa00f4fc Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/close.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock-open.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock-open.png new file mode 100644 index 00000000..c8997890 Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock-open.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock.png new file mode 100644 index 00000000..25ad0f4a Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/lock.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/refresh.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/refresh.png new file mode 100644 index 00000000..117a2d4a Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/hidpi/refresh.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock-open.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock-open.png new file mode 100644 index 00000000..42df5f41 Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock-open.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock.png new file mode 100644 index 00000000..bde67727 Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/lock.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/refresh.png b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/refresh.png new file mode 100644 index 00000000..e363764e Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/refresh.png differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/images/spinner.gif b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/spinner.gif new file mode 100644 index 00000000..d898d41f Binary files /dev/null and b/public/assets/vendor/ckeditor4/skins/moono-lisa/images/spinner.gif differ diff --git a/public/assets/vendor/ckeditor4/skins/moono-lisa/readme.md b/public/assets/vendor/ckeditor4/skins/moono-lisa/readme.md new file mode 100644 index 00000000..c75e949d --- /dev/null +++ b/public/assets/vendor/ckeditor4/skins/moono-lisa/readme.md @@ -0,0 +1,46 @@ +"Moono-lisa" Skin +================= + +This skin has been made a **default skin** starting from CKEditor 4.6.0 and is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](https://ckeditor.com/docs/ckeditor4/latest/guide/skin_sdk_intro.html) +documentation. + +Features +------------------- +"Moono-lisa" is a monochromatic skin, which offers a modern, flat and minimalistic look which blends very well in modern design. +It comes with the following features: + +- Chameleon feature with brightness. +- High-contrast compatibility. +- Graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG and PNG source of the skin icons. + +License +------- + +Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. + +For licensing, see LICENSE.md or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license) diff --git a/public/assets/vendor/ckeditor4/styles.js b/public/assets/vendor/ckeditor4/styles.js new file mode 100644 index 00000000..c7a4b1fc --- /dev/null +++ b/public/assets/vendor/ckeditor4/styles.js @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin which shows the Styles drop-down +// list containing all styles in the editor toolbar. Other plugins, like +// the "div" plugin, use a subset of the styles for their features. +// +// If you do not have plugins that depend on this file in your editor build, you can simply +// ignore it. Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. +// +// For more information refer to: https://ckeditor.com/docs/ckeditor4/latest/guide/dev_styles.html#style-rules + +CKEDITOR.stylesSet.add( 'default', [ + /* Block styles */ + + // These styles are already available in the "Format" drop-down list ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles drop-down list, removing them from the toolbar. + // (This requires the "stylescombo" plugin.) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object styles */ + + { + name: 'Styled Image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled Image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact Table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }, + + /* Widget styles */ + + { name: 'Clean Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-clean' } }, + { name: 'Grayscale Image', type: 'widget', widget: 'image', attributes: { 'class': 'image-grayscale' } }, + + { name: 'Featured Snippet', type: 'widget', widget: 'codeSnippet', attributes: { 'class': 'code-featured' } }, + + { name: 'Featured Formula', type: 'widget', widget: 'mathjax', attributes: { 'class': 'math-featured' } }, + + { name: '240p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-240p' }, group: 'size' }, + { name: '360p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-360p' }, group: 'size' }, + { name: '480p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-480p' }, group: 'size' }, + { name: '720p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-720p' }, group: 'size' }, + { name: '1080p', type: 'widget', widget: 'embedSemantic', attributes: { 'class': 'embed-1080p' }, group: 'size' }, + + // Adding space after the style name is an intended workaround. For now, there + // is no option to create two styles with the same name for different widget types. See https://dev.ckeditor.com/ticket/16664. + { name: '240p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-240p' }, group: 'size' }, + { name: '360p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-360p' }, group: 'size' }, + { name: '480p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-480p' }, group: 'size' }, + { name: '720p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-720p' }, group: 'size' }, + { name: '1080p ', type: 'widget', widget: 'embed', attributes: { 'class': 'embed-1080p' }, group: 'size' } + +] ); + diff --git a/public/assets/vendor/ckeditor4/vendor/promise.js b/public/assets/vendor/ckeditor4/vendor/promise.js new file mode 100644 index 00000000..c4d99120 --- /dev/null +++ b/public/assets/vendor/ckeditor4/vendor/promise.js @@ -0,0 +1,13 @@ +(function(v,w){"object"===typeof exports&&"undefined"!==typeof module?module.exports=w():"function"===typeof define&&define.amd?define(w):v.ES6Promise=w()})(this,function(){function v(a){return"function"===typeof a}function w(){return function(){return process.nextTick(n)}}function R(){return"undefined"!==typeof B?function(){B(n)}:C()}function S(){var a=0,b=new J(n),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}function T(){var a=new MessageChannel; +a.port1.onmessage=n;return function(){return a.port2.postMessage(0)}}function C(){var a=setTimeout;return function(){return a(n,1)}}function n(){for(var a=0;a { * @type {{}} */ const markers_list = {}; - let pannedToCenter = false; + let pannedToFlight = false; let layerFlights = null; let layerSelFlight = null; let layerSelFlightFeature = null; @@ -76,13 +76,13 @@ export default (_opts) => { layerSelFlightLayer = layer; // Center on it, but only do it once, in case the map is moved - if (!pannedToCenter) { + if (!pannedToFlight) { map.panTo({ lat: route.position.lat, lng: route.position.lon, }); - pannedToCenter = true; + pannedToFlight = true; } } @@ -156,7 +156,7 @@ export default (_opts) => { layer.on({ // eslint-disable-next-line no-unused-vars click: (e) => { - pannedToCenter = false; + pannedToFlight = false; liveMapController.controller.onFlightClick(feature, layer); }, }); @@ -183,6 +183,12 @@ export default (_opts) => { // Reload the clicked-flight information if (layerSelFlight !== null) { liveMapController.controller.onFlightClick(layerSelFlightFeature, layerSelFlightLayer); + } else { + // Center on active flights + // eslint-disable-next-line no-lonely-if + if (!pannedToFlight) { + map.panTo(layerFlights.getBounds().getCenter()); + } } }); }; diff --git a/resources/js/request.js b/resources/js/request.js index f5f227ac..03852d75 100644 --- a/resources/js/request.js +++ b/resources/js/request.js @@ -25,5 +25,7 @@ export default async (_opts) => { }, }, _opts); + console.log(opts); + return axios.request(opts); }; diff --git a/resources/lang/en/flights.php b/resources/lang/en/flights.php index cf6afbbe..92fb7236 100644 --- a/resources/lang/en/flights.php +++ b/resources/lang/en/flights.php @@ -6,7 +6,7 @@ return [ 'flighttype' => 'Flight Type', 'flighthours' => 'Flight Hours', 'route' => 'Route', - 'mybid' => 'My Bid|My Bids', + 'mybid' => 'My Bids', 'search' => 'Search', 'addremovebid' => 'Add/Remove Bid', 'bidremoved' => 'Your bid was removed.', diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php index 18fb9f6f..1c7cd591 100644 --- a/resources/lang/es/auth.php +++ b/resources/lang/es/auth.php @@ -15,4 +15,23 @@ return [ 'failed' => 'Estas credenciales no coinciden con nuestros registros.', 'throttle' => 'Demasiados intentos de inicio de sesión. Por favor intente nuevamente en :seconds segundos.', + 'password' => 'Contraseña', + 'createaccount' => 'Crear cuenta', + 'forgotpassword' => 'Olvidé la contraseña', + 'fullname' => 'Nombre completo', + 'emailaddress' => 'Dirección de correo electrónico', + 'fillcaptcha' => 'Completa el captcha', + 'tocaccept' => 'Al registrarse, acepta los términos y condiciones.', + 'register' => 'Registrarse', + 'registrationpending' => 'Registro pendiente', + 'pendingmessage' => 'Tu registro está pendiente de aprobación. Por favor, revise su correo electrónico.', + 'registrationsubmitted' => 'Registro enviado', + 'registrationconfirmation' => 'Confirmación de registro', + 'confirmationmessage' => 'Tu solicitud ha sido enviada. Requiere la aprobación de un miembro del Staff. Una vez haya sido revisado, recibirás un correo de confirmación.', + 'registrationdenied' => 'Registro denegado', + 'deniedmessage' => 'Tu registro fue denegado. Por favor, contacta con un administrador.', + 'accountsuspended' => 'Cuenta suspendida', + 'suspendedmessage' => 'Tu cuenta ha sido suspendida. Por favor, contacta con un administrador.', + 'transferhours' => 'Transferir horas', + ]; diff --git a/resources/lang/es/flights.php b/resources/lang/es/flights.php index 7ec118eb..792eaf66 100644 --- a/resources/lang/es/flights.php +++ b/resources/lang/es/flights.php @@ -6,7 +6,7 @@ return [ 'flighttype' => 'Tipo de vuelo', 'flighthours' => 'Horas de vuelo', 'route' => 'Ruta', - 'mybid' => 'Mi reserva|Mis reservas', + 'mybid' => 'Mis reservas', 'search' => 'Buscar', 'addremovebid' => 'Añadir/Quitar reserva', 'bidremoved' => 'Tu reserva ha sido eliminada.', @@ -21,7 +21,7 @@ return [ 'departuretime' => 'Hora de salida', 'arrivaltime' => 'Hora de llegada', 'type' => [ - 'pass_scheduled' => 'Pasagero - Programado', + 'pass_scheduled' => 'Pasajero - Programado', 'cargo_scheduled' => 'Carga - Programado', 'charter_pass_only' => 'Charter - Solo pasajeros', 'addtl_cargo_mail' => 'Carga/correo adicional', diff --git a/resources/lang/es/passwords.php b/resources/lang/es/passwords.php index 4cc89555..78aad860 100644 --- a/resources/lang/es/passwords.php +++ b/resources/lang/es/passwords.php @@ -18,5 +18,6 @@ return [ 'sent' => '¡Le hemos enviado por correo electrónico el enlace de restablecimiento de contraseña!', 'token' => 'Este token de restablecimiento de contraseña no es válido.', 'user' => 'No podemos encontrar un usuario con esa dirección de correo electrónico.', + 'confirm' => 'Confirmar contraseña', ]; diff --git a/resources/lang/es/profile.php b/resources/lang/es/profile.php index 030adb12..b725bfef 100644 --- a/resources/lang/es/profile.php +++ b/resources/lang/es/profile.php @@ -13,6 +13,7 @@ return [ 'updateprofile' => 'Actualizar perfil', 'editprofile' => 'Editar perfil', 'edityourprofile' => 'Editar tu perfil', + 'transferhours' => 'Horas transferidas', 'opt-in' => 'Inscribirse', 'opt-in-descrip' => 'Sí, incluirme en correos electrónicos no administrativos', ]; diff --git a/resources/lang/es/user.php b/resources/lang/es/user.php index 8cdc2043..fbf87170 100644 --- a/resources/lang/es/user.php +++ b/resources/lang/es/user.php @@ -1,7 +1,7 @@ 'Location', + 'location' => 'Localización', 'state' => [ 'pending' => 'Pendiente', 'active' => 'Activo', diff --git a/resources/lang/es/validation.php b/resources/lang/es/validation.php index 1db4e951..cc6ed4d1 100644 --- a/resources/lang/es/validation.php +++ b/resources/lang/es/validation.php @@ -49,7 +49,7 @@ return [ 'numeric' => 'El :attribute debe tener al menos :min.', 'file' => 'El :attribute debe tener al menos :min kilobytes.', 'string' => 'El :attribute debe tener al menos :min caracteres.', - 'array' => 'El :attribute must have at least :min objetos.', + 'array' => 'El :attribute debe tener al menos :min objetos.', ], 'not_in' => 'El :attribute seleccionado es invalido.', 'numeric' => 'El :attribute debe ser un número.', diff --git a/resources/lang/it/flights.php b/resources/lang/it/flights.php index 2ee71cd2..986e6377 100644 --- a/resources/lang/it/flights.php +++ b/resources/lang/it/flights.php @@ -6,7 +6,7 @@ return [ 'flighttype' => 'Tipo di Volo', 'flighthours' => 'Ore di Volo', 'route' => 'Rotta', - 'mybid' => 'Mia prenotazione|Mie Prenotazioni', + 'mybid' => 'Mie Prenotazioni', 'addremovebid' => 'Aggiungi/Rimuovi Prenotazione', 'bidremoved' => 'La tua prenotazione è stata rimossa.', 'bidadded' => 'La tua prenotazione è stata aggiunta.', diff --git a/resources/sass/admin/paper/_variables.scss b/resources/sass/admin/paper/_variables.scss index d2b58be4..ecda087f 100644 --- a/resources/sass/admin/paper/_variables.scss +++ b/resources/sass/admin/paper/_variables.scss @@ -25,9 +25,9 @@ $black-color: #333333 !default; $black-hr: #444444 !default; $white-background-color: #FFFFFF !default; -//$black-background-color: #212120 !default; +$black-background-color: #212120 !default; //$black-background-color: #1a2932 !default; -$black-background-color: #0c1419 !default; +//$black-background-color: #0c1419 !default; $light-gray: #E3E3E3 !default; @@ -48,7 +48,7 @@ $default-bg: #FFFFFF !default; $default-states-color: #403D39 !default; //$primary-color: #7A9E9F !default; -$primary-color: #f96332 !default; +$primary-color: #067ec1 !default; $primary-bg: darken($primary-color, 5%) !default; $primary-states-color: #427C89 !default; diff --git a/resources/sass/now-ui/now-ui-kit/_buttons.scss b/resources/sass/now-ui/now-ui-kit/_buttons.scss index de369eff..2e88a921 100755 --- a/resources/sass/now-ui/now-ui-kit/_buttons.scss +++ b/resources/sass/now-ui/now-ui-kit/_buttons.scss @@ -94,6 +94,7 @@ .btn-outline-warning { @include outline-buttons($warning-color, $warning-states-color); } .btn-outline-danger { @include outline-buttons($danger-color, $danger-states-color); } .btn-outline-default { @include outline-buttons($default-color, $default-states-color); } +.btn-outline-dark { @include outline-buttons($brand-inverse, $default-states-color); } .btn-round{ border-width: $border-thin; diff --git a/resources/sass/now-ui/now-ui-kit/_sections.scss b/resources/sass/now-ui/now-ui-kit/_sections.scss index 9465b192..6f9e87ac 100755 --- a/resources/sass/now-ui/now-ui-kit/_sections.scss +++ b/resources/sass/now-ui/now-ui-kit/_sections.scss @@ -111,6 +111,10 @@ &[filter-color="orange"]{ @include linear-gradient(rgba($black-color,.20), rgba(224, 23, 3, 0.6)); } + + &[filter-color="blue"]{ + @include linear-gradient(rgba(6, 126, 193,.20), rgba(6, 126, 193, 0.6)); + } } .section-story-overview{ diff --git a/resources/sass/now-ui/now-ui-kit/mixins/_buttons.scss b/resources/sass/now-ui/now-ui-kit/mixins/_buttons.scss index 13da7280..cf7a3719 100755 --- a/resources/sass/now-ui/now-ui-kit/mixins/_buttons.scss +++ b/resources/sass/now-ui/now-ui-kit/mixins/_buttons.scss @@ -2,8 +2,6 @@ @mixin btn-styles($btn-color, $btn-states-color) { background-color: $btn-color; - - &:hover, &:focus, &:not(:disabled):not(.disabled):active, diff --git a/resources/stubs/installer/config.stub b/resources/stubs/installer/config.stub index acd89527..75b8680c 100644 --- a/resources/stubs/installer/config.stub +++ b/resources/stubs/installer/config.stub @@ -23,13 +23,7 @@ return [ // Overrides config/phpvms.php 'phpvms' => [ - /** - * The ISO "Currency Code" to use, the list is in config/money.php - * - * Note, do not change this after you've set it, unless you don't - * care that the currencies aren't "exchanged" into the new format - */ - 'currency' => 'USD', + ], // @@ -64,12 +58,13 @@ return [ 'default' => env('DB_CONNECTION', '$DB_CONN$'), 'connections' => [ 'mysql' => [ - 'host' => env('DB_HOST', '$DB_HOST$'), - 'port' => $DB_PORT$, - 'database' => '$DB_NAME$', - 'username' => '$DB_USER$', - 'password' => '$DB_PASS$', - 'prefix' => '$DB_PREFIX$', + 'host' => env('DB_HOST', '$DB_HOST$'), + 'port' => $DB_PORT$, + 'database' => '$DB_NAME$', + 'username' => '$DB_USER$', + 'password' => '$DB_PASS$', + 'prefix' => '$DB_PREFIX$', + 'prefix_indexes' => true, ], ], ], diff --git a/resources/stubs/modules/composer.stub b/resources/stubs/modules/composer.stub index f8f2c18f..140c27d8 100644 --- a/resources/stubs/modules/composer.stub +++ b/resources/stubs/modules/composer.stub @@ -1,6 +1,6 @@ { "name": "VENDOR/$LOWER_NAME$-module", - "type": "laravel-module", + "type": "phpvms-module", "description": "", "authors": [ { @@ -9,7 +9,7 @@ } ], "require": { - "joshbrw/laravel-module-installer": "0.1.x" + "composer/installers": "~1.0" }, "extra": { "laravel": { @@ -24,7 +24,7 @@ }, "autoload": { "psr-4": { - "$MODULE_NAMESPACE$\\$STUDLY_NAME$\\": "" + "$MODULE_NAMESPACE$\\$STUDLY_NAME$\\": "." } } } diff --git a/resources/stubs/modules/mail.stub b/resources/stubs/modules/mail.stub index aa3f514f..bcb7fc4d 100644 --- a/resources/stubs/modules/mail.stub +++ b/resources/stubs/modules/mail.stub @@ -2,10 +2,8 @@ namespace $NAMESPACE$; -use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; -use Illuminate\Contracts\Queue\ShouldQueue; /** * Class $CLASS$ @@ -13,7 +11,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; */ class $CLASS$ extends Mailable { - use Queueable, SerializesModels; + use SerializesModels; /** * Create a new message instance. diff --git a/resources/views/admin/aircraft/expenses.blade.php b/resources/views/admin/aircraft/expenses.blade.php index 703d5e77..a01fd474 100644 --- a/resources/views/admin/aircraft/expenses.blade.php +++ b/resources/views/admin/aircraft/expenses.blade.php @@ -14,7 +14,7 @@ @if(count($aircraft->expenses) > 0) Name - Cost {{ currency(config('phpvms.currency')) }} + Cost {{ currency(setting('units.currency')) }} Type diff --git a/resources/views/admin/aircraft/table.blade.php b/resources/views/admin/aircraft/table.blade.php index 9a06edc4..83634f7e 100644 --- a/resources/views/admin/aircraft/table.blade.php +++ b/resources/views/admin/aircraft/table.blade.php @@ -24,7 +24,7 @@ {{ $ac->airport_id }} - {{ Utils::minutesToTimeString($ac->flight_hours) }} + @minutestotime($ac->flight_time) @if($ac->status == \App\Models\Enums\AircraftStatus::ACTIVE) diff --git a/resources/views/admin/airports/expenses.blade.php b/resources/views/admin/airports/expenses.blade.php index bfa4ef5a..a4349891 100644 --- a/resources/views/admin/airports/expenses.blade.php +++ b/resources/views/admin/airports/expenses.blade.php @@ -11,7 +11,7 @@ @if(count($airport->expenses)) Name - Cost {{ currency(config('phpvms.currency')) }} + Cost {{ currency(setting('units.currency')) }} Type diff --git a/resources/views/admin/app.blade.php b/resources/views/admin/app.blade.php index f3eb6998..3052fd9b 100644 --- a/resources/views/admin/app.blade.php +++ b/resources/views/admin/app.blade.php @@ -110,6 +110,8 @@ checkboxClass: 'icheckbox_square-blue', radioClass: 'icheckbox_square-blue' }); + + $('[data-toggle="popover"]').popover(); }; $(document).ready(function () { diff --git a/resources/views/admin/common/import.blade.php b/resources/views/admin/common/import.blade.php index c58f9dc8..1ad7fa01 100644 --- a/resources/views/admin/common/import.blade.php +++ b/resources/views/admin/common/import.blade.php @@ -7,6 +7,13 @@ {{ Form::label('csv_file', 'Choose a CSV file to import') }} {{ Form::file('csv_file', ['accept' => '.csv']) }}

    {{ $errors->first('csv_file') }}

    +
    + +
    diff --git a/resources/views/admin/dashboard/index.blade.php b/resources/views/admin/dashboard/index.blade.php index f370bc9a..ee6afc4f 100644 --- a/resources/views/admin/dashboard/index.blade.php +++ b/resources/views/admin/dashboard/index.blade.php @@ -6,7 +6,7 @@ @endif diff --git a/resources/views/admin/expenses/fields.blade.php b/resources/views/admin/expenses/fields.blade.php index 87072a89..8b8253df 100644 --- a/resources/views/admin/expenses/fields.blade.php +++ b/resources/views/admin/expenses/fields.blade.php @@ -1,6 +1,6 @@
    -
    +
    {{ Form::label('airline_id', 'Airline:') }} {{ Form::select('airline_id', $airlines_list, null , ['class' => 'form-control select2']) }} @@ -11,12 +11,20 @@ @endcomponent
    - -
    +
    {{ Form::label('type', 'Expense Type:') }} * {{ Form::select('type', $expense_types, null , ['class' => 'form-control select2']) }}

    {{ $errors->first('type') }}

    + +
    + {{ Form::label('flight_type', 'Flight Types:') }}  + {{ Form::select('flight_type[]', $flight_types, null , ['class' => 'form-control select2', 'multiple']) }} +

    {{ $errors->first('type') }}

    + @component('admin.components.info') + If selected and the expense type is "flight", this expense will only apply to the specified flight types + @endcomponent +
    diff --git a/resources/views/admin/fares/fields.blade.php b/resources/views/admin/fares/fields.blade.php index 3fa6ab5c..fc37e591 100644 --- a/resources/views/admin/fares/fields.blade.php +++ b/resources/views/admin/fares/fields.blade.php @@ -1,65 +1,100 @@ -
    -
    -
    - When a fare is assigned to a subfleet, the price, cost and capacity can be overridden, - so you can create default values that will apply to most of your subfleets, and change - them where they will differ. +
    +
    +  Fare Information +
    +
    +
    +
    +
    + When a fare is assigned to a subfleet, the price, cost and capacity can be overridden, + so you can create default values that will apply to most of your subfleets, and change + them where they will differ. +
    +
    +
    +
    +
    +
    + {{ Form::label('code', 'Code:') }} * + @component('admin.components.info') + How this fare class will show up on a ticket + @endcomponent + {{ Form::text('code', null, ['class' => 'form-control']) }} +

    {{ $errors->first('code') }}

    +
    + +
    + {{ Form::label('name', 'Name:') }} * + @component('admin.components.info') + The fare class name, E.g, "Economy" or "First" + @endcomponent + {{ Form::text('name', null, ['class' => 'form-control']) }} +

    {{ $errors->first('name') }}

    +
    + +
    + {{ Form::label('type', 'Fare Type:') }} * + @component('admin.components.info') + If this is a passenger or cargo fare + @endcomponent + {{ Form::select('type', $fare_types, null , [ + 'id' => 'type', + 'class' => 'form-control select2' + ]) }} +

    {{ $errors->first('type') }}

    +
    +
    -
    +
    +
    +
    +  Base Fare Finances +
    +
    +
    + +
    + {{ Form::label('price', 'Price:') }} + @component('admin.components.info') + This is the price of a ticket or price per {{ setting('units.weight') }} + @endcomponent + {{ Form::text('price', null, ['class' => 'form-control', 'placeholder' => 0]) }} +

    {{ $errors->first('price') }}

    +
    + +
    + {{ Form::label('cost', 'Cost:') }} + @component('admin.components.info') + The operating cost per unit (passenger or {{ setting('units.weight') }}) + @endcomponent + {{ Form::number('cost', null, ['class' => 'form-control', 'placeholder' => 0, 'step' => '0.01']) }} +

    {{ $errors->first('cost') }}

    +
    +
    +
    +
    + {{ Form::label('capacity', 'Capacity:') }} + @component('admin.components.info') + Max seats or capacity available. This can be adjusted in the subfleet + @endcomponent + {{ Form::number('capacity', null, ['class' => 'form-control', 'min' => 0]) }} +

    {{ $errors->first('capacity') }}

    +
    + +
    + {{ Form::label('notes', 'Notes:') }} + @component('admin.components.info') + Notes for this fare + @endcomponent + {{ Form::text('notes', null, ['class' => 'form-control']) }} +

    {{ $errors->first('notes') }}

    +
    + +
    +
    -
    - {{ Form::label('code', 'Code:') }} * - @component('admin.components.info') - How this fare class will show up on a ticket - @endcomponent - {{ Form::text('code', null, ['class' => 'form-control']) }} -

    {{ $errors->first('code') }}

    -
    - -
    - {{ Form::label('name', 'Name:') }} * - @component('admin.components.info') - The fare class name, E.g, "Economy" or "First" - @endcomponent - {{ Form::text('name', null, ['class' => 'form-control']) }} -

    {{ $errors->first('name') }}

    -
    - -
    - {{ Form::label('price', 'Price:') }} - @component('admin.components.info') - This is the price of a ticket for a passenger - @endcomponent - {{ Form::text('price', null, ['class' => 'form-control', 'placeholder' => 0]) }} -

    {{ $errors->first('price') }}

    -
    - -
    - {{ Form::label('cost', 'Cost:') }} - @component('admin.components.info') - The operating cost - @endcomponent - {{ Form::number('cost', null, ['class' => 'form-control', 'placeholder' => 0, 'step' => '0.01']) }} -

    {{ $errors->first('cost') }}

    -
    - -
    - {{ Form::label('capacity', 'Capacity:') }} - @component('admin.components.info') - The number of seats available in this class. - @endcomponent - {{ Form::number('capacity', null, ['class' => 'form-control', 'min' => 0]) }} -

    {{ $errors->first('capacity') }}

    -
    - -
    - {{ Form::label('notes', 'Notes:') }} - {{ Form::text('notes', null, ['class' => 'form-control']) }} -

    {{ $errors->first('notes') }}

    -
    -
    {{ Form::label('active', 'Active:') }} @@ -68,12 +103,12 @@ {{ Form::checkbox('active', 1, null) }}
    - +
    +
    - {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} - Cancel + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-info']) }}
    diff --git a/resources/views/admin/fares/table.blade.php b/resources/views/admin/fares/table.blade.php index 4b3de789..a48a9795 100644 --- a/resources/views/admin/fares/table.blade.php +++ b/resources/views/admin/fares/table.blade.php @@ -2,6 +2,7 @@ Code Name + Type Price Cost Notes @@ -13,6 +14,7 @@ {{ $fare->code }} {{ $fare->name }} + {{ \App\Models\Enums\FareType::label($fare->type) }} {{ $fare->price }} {{ $fare->cost }} {{ $fare->notes }} diff --git a/resources/views/admin/flights/fares.blade.php b/resources/views/admin/flights/fares.blade.php index 1f3cc9f2..e72b01db 100644 --- a/resources/views/admin/flights/fares.blade.php +++ b/resources/views/admin/flights/fares.blade.php @@ -6,8 +6,7 @@ the values used come from the subfleet of the aircraft that the flight is filed with. Only assign the fares you want to override. They can be set as a monetary amount, or a percentage. - Read documentation about finances. + Read documentation about finances. @endcomponent

    {{ $errors->first('value') }}

    diff --git a/resources/views/admin/flights/fields.blade.php b/resources/views/admin/flights/fields.blade.php index 2efd88d6..a5e9c2cb 100644 --- a/resources/views/admin/flights/fields.blade.php +++ b/resources/views/admin/flights/fields.blade.php @@ -1,4 +1,3 @@ -
    @@ -67,6 +66,49 @@
    + {{ Form::label('pilot_pay', 'Pilot Pay:') }} + {{ Form::text('pilot_pay', null, ['class' => 'form-control']) }} +

    {{ $errors->first('pilot_pay') }}

    + @component('admin.components.info') + Fill this in to pay a pilot a fixed amount for this flight. + @endcomponent +
    + +
    + {{ Form::label('load_factor', 'Load Factor:') }} + {{ Form::text('load_factor', null, ['class' => 'form-control']) }} +

    {{ $errors->first('load_factor') }}

    + @component('admin.components.info') + Value between 1 and 100. See + docs. + Leave blank to use the default value. + @endcomponent +
    + +
    + {{ Form::label('load_factor_variance', 'Load Factor Variance:') }} + {{ Form::text('load_factor_variance', null, ['class' => 'form-control']) }} +

    {{ $errors->first('load_factor_variance') }}

    + @component('admin.components.info') + How much the load factor can vary per flight (+ or -). Leave blank to + use the default value. + @endcomponent +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +  Route +
    +
    +
    +
    {{ Form::label('dpt_airport_id', 'Departure Airport:') }} * {{ Form::select('dpt_airport_id', $airports, null , [ @@ -77,7 +119,7 @@
    -
    +
    {{ Form::label('arr_airport_id', 'Arrival Airport:') }} * {{ Form::select('arr_airport_id', $airports, null , [ @@ -87,37 +129,33 @@

    {{ $errors->first('arr_airport_id') }}

    +
    +
    + +
    + {{ Form::label('route', 'Route:') }} + {{ Form::textarea('route', null, [ + 'class' => 'form-control input-text', + 'style' => 'padding: 10px', + ]) }} +

    {{ $errors->first('route') }}

    +
    +
    +
    {{ Form::label('alt_airport_id', 'Alt Airport:') }} {{ Form::select('alt_airport_id', $alt_airports, null , ['class' => 'form-control select2']) }}

    {{ $errors->first('alt_airport_id') }}

    -
    - - {{-- NEXT ROW --}} - -
    -
    - {{ Form::label('dpt_time', 'Departure Time:') }} - {{ Form::text('dpt_time', null, ['class' => 'form-control']) }} -

    {{ $errors->first('dpt_time') }}

    -
    - -
    - {{ Form::label('arr_time', 'Arrival Time:') }} - {{ Form::text('arr_time', null, ['class' => 'form-control']) }} -

    {{ $errors->first('arr_time') }}

    -
    - -
    +
    {{ Form::label('level', 'Flight Level:') }} {{ Form::text('level', null, ['class' => 'form-control']) }}

    {{ $errors->first('level') }}

    -
    +
    {{ Form::label('distance', 'Distance:') }} in nautical miles Calculate {{ Form::text('distance', null, ['id' => 'distance', 'class' => 'form-control']) }} @@ -129,6 +167,7 @@
    +
    @@ -137,7 +176,6 @@
    -
    {{ Form::label('start_date', 'Start Date') }} optional @@ -185,25 +223,19 @@
    -
    -
    -
    -
    -
    -
    -
    -
    -  Route -
    -
    - -
    - {{ Form::textarea('route', null, [ - 'class' => 'form-control input-text', - 'style' => 'padding: 10px', - ]) }} -

    {{ $errors->first('route') }}

    +
    +
    + {{ Form::label('dpt_time', 'Departure Time:') }} + {{ Form::text('dpt_time', null, ['class' => 'form-control']) }} +

    {{ $errors->first('dpt_time') }}

    +
    + +
    + {{ Form::label('arr_time', 'Arrival Time:') }} + {{ Form::text('arr_time', null, ['class' => 'form-control']) }} +

    {{ $errors->first('arr_time') }}

    +
    @@ -216,13 +248,15 @@
     Remarks
    -
    -
    - {{ Form::textarea('notes', null, [ - 'class' => 'form-control input-text', - 'style' => 'padding: 10px', - ]) }} -

    {{ $errors->first('notes') }}

    +
    +
    +
    + {{ Form::textarea('notes', null, [ + 'class' => 'form-control input-text', + 'style' => 'padding: 10px', + ]) }} +

    {{ $errors->first('notes') }}

    +
    @@ -235,15 +269,14 @@
    - {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} - Cancel + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-info']) }}
    diff --git a/resources/views/admin/flights/index.blade.php b/resources/views/admin/flights/index.blade.php index 3e09a80d..7857beb9 100644 --- a/resources/views/admin/flights/index.blade.php +++ b/resources/views/admin/flights/index.blade.php @@ -4,7 +4,6 @@ @section('actions')
  • Export to CSV
  • Import from CSV
  • -
  • Fields
  • diff --git a/resources/views/admin/maintenance/cron.blade.php b/resources/views/admin/maintenance/cron.blade.php index 2e540cc6..1244fdfb 100644 --- a/resources/views/admin/maintenance/cron.blade.php +++ b/resources/views/admin/maintenance/cron.blade.php @@ -15,7 +15,7 @@ @endif
  • diff --git a/resources/views/admin/maintenance/index.blade.php b/resources/views/admin/maintenance/index.blade.php index 5771abf4..6fd62c49 100644 --- a/resources/views/admin/maintenance/index.blade.php +++ b/resources/views/admin/maintenance/index.blade.php @@ -4,6 +4,12 @@ @section('content') @include('flash::message') +
    +
    + @include('admin.maintenance.update') +
    +
    +
    @include('admin.maintenance.cron') diff --git a/resources/views/admin/maintenance/update.blade.php b/resources/views/admin/maintenance/update.blade.php new file mode 100644 index 00000000..21adf1a1 --- /dev/null +++ b/resources/views/admin/maintenance/update.blade.php @@ -0,0 +1,32 @@ +
    +
    +
    +
    +  Update +
    +
    +
    + +
    +
    + @if ($new_version) +

    An update to version {{ $new_version_tag }} is available.

    + {{ Form::open(['route' => 'admin.maintenance.update']) }} + {{ Form::button('Update', ['type' => 'submit', 'class' => 'btn btn-success']) }} + {{ Form::close() }} + @else +

    There is no new version available

    + @endif +
    +
    +

    Force new version check

    + {{ Form::open(['route' => 'admin.maintenance.forcecheck']) }} + {{ Form::button('Force update check', ['type' => 'submit', 'class' => 'btn btn-success']) }} + {{ Form::close() }} +
    +
    +
    +
    +
    +
    +
    diff --git a/resources/views/admin/menu.blade.php b/resources/views/admin/menu.blade.php index 050437d9..b4652fd7 100644 --- a/resources/views/admin/menu.blade.php +++ b/resources/views/admin/menu.blade.php @@ -70,13 +70,17 @@
  • roles
  • @endability - @ability('admin', 'settings') -
  • settings
  • + @ability('admin', 'pages') +
  • pages
  • @endability @ability('admin', 'maintenance')
  • maintenance
  • @endability + + @ability('admin', 'settings') +
  • settings
  • + @endability
    diff --git a/resources/views/admin/pages/create.blade.php b/resources/views/admin/pages/create.blade.php new file mode 100644 index 00000000..18a59ca2 --- /dev/null +++ b/resources/views/admin/pages/create.blade.php @@ -0,0 +1,12 @@ +@extends('admin.app') +@section('title', 'Add Page') +@section('content') +
    +
    + {{ Form::open(['route' => 'admin.pages.store']) }} + @include('admin.pages.fields') + {{ Form::close() }} +
    +
    +@endsection +@include('admin.pages.scripts') diff --git a/resources/views/admin/pages/edit.blade.php b/resources/views/admin/pages/edit.blade.php new file mode 100644 index 00000000..9109cb90 --- /dev/null +++ b/resources/views/admin/pages/edit.blade.php @@ -0,0 +1,12 @@ +@extends('admin.app') +@section('title', "Edit \"$page->name\"") +@section('content') +
    +
    + {{ Form::model($page, ['route' => ['admin.pages.update', $page->id], 'method' => 'patch']) }} + @include('admin.pages.fields') + {{ Form::close() }} +
    +
    +@endsection +@include('admin.pages.scripts') diff --git a/resources/views/admin/pages/fields.blade.php b/resources/views/admin/pages/fields.blade.php new file mode 100644 index 00000000..fe7063f9 --- /dev/null +++ b/resources/views/admin/pages/fields.blade.php @@ -0,0 +1,80 @@ +
    +
    +
    +
    +  Page Information +
    +
    +
    +
    + {{ Form::label('name', 'Page Name:') }} + {{ Form::text('name', null, ['class' => 'form-control']) }} +

    {{ $errors->first('name') }}

    +
    + +
    + {{ Form::label('icon', 'Icon:') }} + {{ Form::text('icon', null, ['class' => 'form-control']) }} +

    {{ $errors->first('icon') }}

    +
    + +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +  Content +
    +
    +
    +
    + {{ Form::textarea('body', null, ['id' => 'editor', 'class' => 'editor']) }} +

    {{ $errors->first('body') }}

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + @if (!empty($page)) + {{ Form::hidden('id') }} + @endif + + {{ Form::hidden('type', \App\Models\Enums\PageType::HTML) }} + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} + Cancel +
    +
    +
    + + diff --git a/resources/views/admin/pages/index.blade.php b/resources/views/admin/pages/index.blade.php new file mode 100644 index 00000000..5107448a --- /dev/null +++ b/resources/views/admin/pages/index.blade.php @@ -0,0 +1,19 @@ +@extends('admin.app') + +@section('title', 'Pages') +@section('actions') +
  • + + + Add New +
  • +@endsection + +@section('content') +
    +
    + @include('admin.pages.table') +
    +
    +@endsection + diff --git a/resources/views/admin/pages/scripts.blade.php b/resources/views/admin/pages/scripts.blade.php new file mode 100644 index 00000000..df54dc53 --- /dev/null +++ b/resources/views/admin/pages/scripts.blade.php @@ -0,0 +1,3 @@ +@section('scripts') + +@endsection diff --git a/resources/views/admin/pages/table.blade.php b/resources/views/admin/pages/table.blade.php new file mode 100644 index 00000000..77084778 --- /dev/null +++ b/resources/views/admin/pages/table.blade.php @@ -0,0 +1,20 @@ + + + + + + + @foreach($pages as $page) + + + + + @endforeach + +
    Name
    {{ $page->name }} + {{ Form::open(['route' => ['admin.pages.destroy', $page->id], 'method' => 'delete']) }} + + {{ Form::button('', ['type' => 'submit', 'class' => 'btn btn-sm btn-danger btn-icon', 'onclick' => "return confirm('Are you sure?')"]) }} + {{ Form::close() }} +
    diff --git a/resources/views/admin/pages/users.blade.php b/resources/views/admin/pages/users.blade.php new file mode 100644 index 00000000..8b201011 --- /dev/null +++ b/resources/views/admin/pages/users.blade.php @@ -0,0 +1,17 @@ +
    + +
    +
    +
    +  Users +
    +
    +
    +
    + TO DO +
    +
    +
    +
    +
    +
    diff --git a/resources/views/admin/pireps/fields.blade.php b/resources/views/admin/pireps/fields.blade.php index 2dbd9fa6..b268a602 100644 --- a/resources/views/admin/pireps/fields.blade.php +++ b/resources/views/admin/pireps/fields.blade.php @@ -266,8 +266,7 @@
    - {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} - Cancel + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-info']) }}
    diff --git a/resources/views/admin/pireps/pirep_card.blade.php b/resources/views/admin/pireps/pirep_card.blade.php index 5e2d70a8..73943fb6 100644 --- a/resources/views/admin/pireps/pirep_card.blade.php +++ b/resources/views/admin/pireps/pirep_card.blade.php @@ -35,7 +35,7 @@
    Flight Time  - {{ Utils::minutesToTimeString($pirep->flight_time) }} + @minutestotime($pirep->flight_time)
    @if($pirep->aircraft) diff --git a/resources/views/admin/pireps/show_fields.blade.php b/resources/views/admin/pireps/show_fields.blade.php index 7b50340e..556063b4 100644 --- a/resources/views/admin/pireps/show_fields.blade.php +++ b/resources/views/admin/pireps/show_fields.blade.php @@ -56,7 +56,7 @@ Flight Time - {{ Utils::minutesToTimeString($pirep->flight_time) }} + @minutestotime($pirep->flight_time) Flight Level diff --git a/resources/views/admin/pireps/transactions.blade.php b/resources/views/admin/pireps/transactions.blade.php index 64ed2614..5125b1a6 100644 --- a/resources/views/admin/pireps/transactions.blade.php +++ b/resources/views/admin/pireps/transactions.blade.php @@ -7,12 +7,12 @@ {{ $entry->memo }} @if($entry->credit) - {{ money($entry->credit, config('phpvms.currency')) }} + {{ money($entry->credit, setting('units.currency')) }} @endif @if($entry->debit) - {{ money($entry->debit, config('phpvms.currency')) }} + {{ money($entry->debit, setting('units.currency')) }} @endif diff --git a/resources/views/admin/settings/table.blade.php b/resources/views/admin/settings/table.blade.php index 5f4bd49f..669788f7 100644 --- a/resources/views/admin/settings/table.blade.php +++ b/resources/views/admin/settings/table.blade.php @@ -1,68 +1,89 @@ {{ Form::model($grouped_settings, ['route' => ['admin.settings.update'], 'method' => 'post']) }} @foreach($grouped_settings as $group => $settings)
    -
    - - - - +
    +
    +
    -
    {{ $group }}
    -
    + + + - @foreach($settings as $setting) - - - + + - - @endforeach -
    +
    {{ $group }}
    +
    -

    {{ $setting->name }}

    -

    - @component('admin.components.info') - {{$setting->description}} - @endcomponent -

    - @if($setting->type === 'date') - {{ Form::input('text', $setting->id, $setting->value, ['class' => 'form-control', 'id' => 'datepicker']) }} - @elseif($setting->type === 'boolean' || $setting->type === 'bool') - {{ Form::hidden($setting->id, 0) }} - {{ Form::checkbox($setting->id, null, $setting->value) }} - @elseif($setting->type === 'int') - {{ Form::number($setting->id, $setting->value, ['class'=>'form-control']) }} - @elseif($setting->type === 'number') - {{ Form::number($setting->id, $setting->value, ['class'=>'form-control', 'step' => '0.01']) }} - @elseif($setting->type === 'select') + @foreach($settings as $setting) +
    +

    {{ $setting->name }}

    +

    + @component('admin.components.info') + {{$setting->description}} + @endcomponent +

    + @if($setting->type === 'date') + {{ Form::input('text', $setting->id, $setting->value, ['class' => 'form-control', 'id' => 'datepicker']) }} + @elseif($setting->type === 'boolean' || $setting->type === 'bool') + {{ Form::hidden($setting->id, 0) }} + {{ Form::checkbox($setting->id, null, $setting->value) }} + @elseif($setting->type === 'int') + {{ Form::number($setting->id, $setting->value, ['class'=>'form-control']) }} + @elseif($setting->type === 'number') + {{ Form::number($setting->id, $setting->value, ['class'=>'form-control', 'step' => '0.01']) }} + @elseif($setting->type === 'select') - @if($setting->id === 'general_theme') - {{ Form::select( - $setting->id, - list_to_assoc($themes), - $setting->value, - ['class' => 'select2', 'style' => 'width: 100%; text-align: left;']) }} - @else - {{ Form::select( + @if($setting->id === 'general_theme') + {{ Form::select( $setting->id, - list_to_assoc(explode(',', $setting->options)), - $setting->value, - ['class' => 'select2', 'style' => 'width: 100%; text-align: left;']) }} + list_to_assoc($themes), + $setting->value, + ['class' => 'select2', 'style' => 'width: 100%; text-align: left;']) }} + @elseif($setting->id === 'units_currency') + {{ Form::select( + $setting->id, + $currencies, + $setting->value, + ['class' => 'select2', 'style' => 'width: 100%; text-align: left;']) }} + @else + {{ Form::select( + $setting->id, + list_to_assoc(explode(',', $setting->options)), + $setting->value, + ['class' => 'select2', 'style' => 'width: 100%; text-align: left;']) }} + @endif + @else + {{ Form::input('text', $setting->id, $setting->value, ['class' => 'form-control']) }} @endif - @else - {{ Form::input('text', $setting->id, $setting->value, ['class' => 'form-control']) }} - @endif -
    + + + @endforeach + +
    + + {{--
    +
    + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} + Cancel +
    +
    --}} +
    @endforeach +
    -
    - {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} - Cancel +
    +
    + {{ Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) }} + Cancel +
    + {{ Form::close() }} + + +{{-- +Google Analytics tracking code. Only active if an ID has been entered +You can modify to any tracking code and re-use that settings field, or +just remove it completely. Only added as a convenience factor +--}} +@php +$gtag = setting('general.google_analytics_id'); +@endphp +@if($gtag) + + + +@endif +{{-- End of the Google Analytics code --}} + diff --git a/resources/views/layouts/default/dashboard/index.blade.php b/resources/views/layouts/default/dashboard/index.blade.php index d8875612..8ab2b3ac 100644 --- a/resources/views/layouts/default/dashboard/index.blade.php +++ b/resources/views/layouts/default/dashboard/index.blade.php @@ -25,7 +25,7 @@
    -

    {{ \App\Facades\Utils::minutesToTimeString($user->flight_time, false)}}

    +

    @minutestotime($user->flight_time)

    @lang('dashboard.totalhours')
    @@ -60,17 +60,17 @@
    -
    - + +
    @if($last_pirep === null)
    @lang('dashboard.noreportsyet') @lang('dashboard.fileonenow')
    @else - @include('pireps.pirep_card', ['pirep' => $last_pirep]) + @include('dashboard.pirep_card', ['pirep' => $last_pirep]) @endif
    diff --git a/resources/views/layouts/default/dashboard/pirep_card.blade.php b/resources/views/layouts/default/dashboard/pirep_card.blade.php new file mode 100644 index 00000000..012a3635 --- /dev/null +++ b/resources/views/layouts/default/dashboard/pirep_card.blade.php @@ -0,0 +1,66 @@ +
    +
    +
    +

    + @lang('common.edit') +

    +
    + + {{ $pirep->airline->code }}{{ $pirep->ident }} + - + {{ $pirep->dpt_airport->name }} + ({{$pirep->dpt_airport->icao}}) + to + {{ $pirep->arr_airport->name }} + ({{$pirep->arr_airport->icao}}) +
    +
    +
    +
    + @if($pirep->state === PirepState::PENDING) +
    + @elseif($pirep->state === PirepState::ACCEPTED) +
    + @elseif($pirep->state === PirepState::REJECTED) +
    + @else +
    + @endif + {{ PirepState::label($pirep->state) }}
    +
    +
    +
    +
    +
    + + + + + + + + + + @if($pirep->level) + + + + + @endif + + + + +
    @lang('pireps.flighttime') @minutestotime($pirep->flight_time)
    @lang('common.aircraft') {{ $pirep->aircraft->name }} + ({{ $pirep->aircraft->registration }}) +
    @lang('pireps.flightlevel') {{ $pirep->level }}
    @lang('pireps.filedon'): {{ show_datetime($pirep->created_at) }}
    +
    +
    +
    +
    +
    diff --git a/resources/views/layouts/default/flights/bids.blade.php b/resources/views/layouts/default/flights/bids.blade.php new file mode 100644 index 00000000..e5625b1e --- /dev/null +++ b/resources/views/layouts/default/flights/bids.blade.php @@ -0,0 +1,15 @@ +@extends('app') +@section('title', __('flights.mybid')) + +@section('content') +
    + @include('flash::message') +
    +

    {{ __('flights.mybid') }}

    + @include('flights.table') +
    +
    +@endsection + +@include('flights.scripts') + diff --git a/resources/views/layouts/default/flights/index.blade.php b/resources/views/layouts/default/flights/index.blade.php index c93b9ba5..46dd4860 100644 --- a/resources/views/layouts/default/flights/index.blade.php +++ b/resources/views/layouts/default/flights/index.blade.php @@ -5,7 +5,7 @@
    @include('flash::message')
    -

    {{ $title ?? trans_choice('common.flight', 2) }}

    +

    {{ trans_choice('common.flight', 2) }}

    @include('flights.table')
    diff --git a/resources/views/layouts/default/flights/nav.blade.php b/resources/views/layouts/default/flights/nav.blade.php index 94bc6515..ea29a04d 100644 --- a/resources/views/layouts/default/flights/nav.blade.php +++ b/resources/views/layouts/default/flights/nav.blade.php @@ -1,7 +1,7 @@
    diff --git a/resources/views/layouts/default/flights/search.blade.php b/resources/views/layouts/default/flights/search.blade.php index d69c43ca..4eb78092 100644 --- a/resources/views/layouts/default/flights/search.blade.php +++ b/resources/views/layouts/default/flights/search.blade.php @@ -1,34 +1,34 @@

    @lang('flights.search')

    -
    -
    +
    +
    {{ Form::open([ 'route' => 'frontend.flights.search', 'method' => 'GET', 'class'=>'form-inline' ]) }} -
    +

    @lang('flights.flightnumber')

    {{ Form::text('flight_number', null, ['class' => 'form-control']) }}
    -
    +

    @lang('airports.departure')

    {{ Form::select('dep_icao', $airports, null , ['class' => 'form-control select2']) }}
    -
    +

    @lang('airports.arrival')

    {{ Form::select('arr_icao', $airports, null , ['class' => 'form-control select2']) }}
    -
    +

    @lang('common.subfleet')

    {{ Form::select('subfleet_id', $subfleets, null , ['class' => 'form-control select2']) }}
    -
    - {{ Form::submit(__('common.find'), ['class' => 'btn btn-primary']) }}  +
    + {{ Form::submit(__('common.find'), ['class' => 'btn btn-outline-primary']) }}  @lang('common.reset')
    {{ Form::close() }} diff --git a/resources/views/layouts/default/flights/simbrief_briefing.blade.php b/resources/views/layouts/default/flights/simbrief_briefing.blade.php new file mode 100644 index 00000000..bd9f7fb1 --- /dev/null +++ b/resources/views/layouts/default/flights/simbrief_briefing.blade.php @@ -0,0 +1,234 @@ +@extends('app') +@section('title', 'Briefing') + +@section('content') +
    +
    +

    {{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }} + : {{ $simbrief->xml->origin->icao_code }} to {{ $simbrief->xml->destination->icao_code }}

    +
    +
    + @if (empty($simbrief->pirep_id)) + Prefile PIREP + @endif +
    +
    + +
    +
    + +
    +
    +
    +
    +  Dispatch Information +
    +
    +
    +
    +

    Flight

    +

    + {{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }}

    +
    +
    + +
    +

    Departure

    +

    + {{ $simbrief->xml->origin->icao_code }}@if(!empty($simbrief->xml->origin->plan_rwy)) + /{{ $simbrief->xml->origin->plan_rwy }} + @endif +

    +
    +
    + +
    +

    Arrival

    +

    + {{ $simbrief->xml->destination->icao_code }}@if(!empty($simbrief->xml->destination->plan_rwy)) + /{{ $simbrief->xml->destination->plan_rwy }} + @endif +

    +
    +
    +
    + +
    + +
    + +
    +

    Aircraft

    +

    + {{ $simbrief->xml->aircraft->name }}

    +
    +
    + +
    +

    Enroute Time

    +

    + @minutestotime($simbrief->xml->times->sched_time_enroute / 60)

    +
    +
    + +
    +

    Cruise Altitude

    +

    + {{ $simbrief->xml->general->initial_altitude }}

    +
    +
    + +
    + +
    + + @if (!empty($simbrief->xml->general->dx_rmk)) +
    +
    +

    Dispatcher Remarks

    +

    + {{ $simbrief->xml->general->dx_rmk }}

    +
    +
    +
    + @endif + + @if (!empty($simbrief->xml->general->sys_rmk)) +
    +
    +

    System Remarks

    +

    + {{ $simbrief->xml->general->sys_rmk }}

    +
    +
    +
    + @endif +
    +
    + +
    +
    +  Flight Plan +
    +
    +
    +
    +

    + {!! str_replace("\n", "
    ", $simbrief->xml->atc->flightplan_text) !!} +

    +
    +
    +
    +
    + +
    +
    +  Weather +
    +
    +
    +
    +

    Departure METAR

    +

    + {{ $simbrief->xml->weather->orig_metar }}

    +
    + +
    + +

    Arrival METAR

    +

    + {{ $simbrief->xml->weather->dest_metar }}

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +  Download Flight Plan +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +  OFP +
    +
    +
    + {!! $simbrief->xml->text->plan_html !!} +
    +
    +
    +
    +
    + +
    +
    +
    +
    +  Flight Maps +
    +
    + @foreach($simbrief->images->chunk(2) as $images) +
    + @foreach($images as $image) +
    +

    + {{ $image['name'] }} + {{ $image['name'] }} +

    +
    + @endforeach +
    + @endforeach +
    +
    +
    +
    + +
    +
    +
    +
    + @if (empty($simbrief->pirep_id)) + Prefile PIREP + @endif +
    +
    +@endsection + +@section('scripts') + +@endsection diff --git a/resources/views/layouts/default/flights/simbrief_form.blade.php b/resources/views/layouts/default/flights/simbrief_form.blade.php new file mode 100644 index 00000000..25fc0e96 --- /dev/null +++ b/resources/views/layouts/default/flights/simbrief_form.blade.php @@ -0,0 +1,269 @@ +@extends('app') +@section('title', 'Generate OFP') + +@section('content') +
    +
    +
    +

    Create Flight Briefing

    +
    +
    +
    +
    +  @lang('pireps.flightinformations') +
    +
    +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +  Briefing Options +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Units:
    Cont Fuel:
    Reserve Fuel:
    Detailed Navlog: +
    ETOPS Planning:
    Plan Stepclimbs: +
    Runway Analysis: +
    Include NOTAMS: +
    FIR NOTAMS:
    Flight Maps:
    +
    +
    +
    + + + + + + + + + {{-- + --}} + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +@endsection +@section('scripts') + +@endsection diff --git a/resources/views/layouts/default/flights/table.blade.php b/resources/views/layouts/default/flights/table.blade.php index 1d1be5c4..c2803195 100644 --- a/resources/views/layouts/default/flights/table.blade.php +++ b/resources/views/layouts/default/flights/table.blade.php @@ -5,17 +5,22 @@ -
    - {{-- NOTE: - Don't remove the "save_flight" class, or the x-id attribute. - It will break the AJAX to save/delete +
    + {{-- + !!! NOTE !!! + Don't remove the "save_flight" class, or the x-id attribute. + It will break the AJAX to save/delete - "x-saved-class" is the class to add/remove if the bid exists or not - If you change it, remember to change it in the in-array line as well + "x-saved-class" is the class to add/remove if the bid exists or not + If you change it, remember to change it in the in-array line as well --}} @if (!setting('pilots.only_flights_from_current') || $flight->dpt_airport_id == Auth::user()->current_airport->icao)
    --}}

    - {{ $user->name }} + {{ $user->name_private }}

    @if ($user->avatar == null) diff --git a/resources/views/layouts/default/nav.blade.php b/resources/views/layouts/default/nav.blade.php index fc7fb029..fca77729 100644 --- a/resources/views/layouts/default/nav.blade.php +++ b/resources/views/layouts/default/nav.blade.php @@ -35,19 +35,18 @@ @endforeach @if(!Auth::check()) + - - @else @endforeach + @foreach($page_links as $page) + + @endforeach +
    diff --git a/resources/views/layouts/default/pireps/pirep_card.blade.php b/resources/views/layouts/default/pireps/pirep_card.blade.php deleted file mode 100644 index b9cb772c..00000000 --- a/resources/views/layouts/default/pireps/pirep_card.blade.php +++ /dev/null @@ -1,68 +0,0 @@ -
    -
    -
    -
    -

    - @lang('common.edit') -

    -
    - - {{ $pirep->airline->code }}{{ $pirep->ident }} - - - {{ $pirep->dpt_airport->name }} - ({{$pirep->dpt_airport->icao}}) - to - {{ $pirep->arr_airport->name }} - ({{$pirep->arr_airport->icao}}) -
    -
    -
    -
    - @if($pirep->state === PirepState::PENDING) -
    - @elseif($pirep->state === PirepState::ACCEPTED) -
    - @elseif($pirep->state === PirepState::REJECTED) -
    - @else -
    - @endif - {{ PirepState::label($pirep->state) }}
    -
    -
    -
    -
    -
    - - - - - - - - - - @if($pirep->level) - - - - - @endif - - - - -
    @lang('pireps.flighttime') {{ Utils::minutesToTimeString($pirep->flight_time) }}
    @lang('common.aircraft') {{ $pirep->aircraft->name }} - ({{ $pirep->aircraft->registration }}) -
    @lang('pireps.flightlevel') {{ $pirep->level }}
    @lang('pireps.filedon'): {{ show_datetime($pirep->created_at) }}
    -
    -
    -
    -
    -
    -
    diff --git a/resources/views/layouts/default/pireps/show.blade.php b/resources/views/layouts/default/pireps/show.blade.php index 16637d03..0ce53e0f 100644 --- a/resources/views/layouts/default/pireps/show.blade.php +++ b/resources/views/layouts/default/pireps/show.blade.php @@ -3,12 +3,40 @@ @section('content')
    -
    -
    -
    -

    {{$pirep->airline->code}}{{ $pirep->ident }}

    +
    +

    {{ $pirep->airline->icao }}{{ $pirep->ident }} + : {{ $pirep->dpt_airport_id }} to {{ $pirep->arr_airport_id }}

    +
    + +
    + {{-- Show the link to edit if it can be edited --}} + @if (!empty($pirep->simbrief)) + View SimBrief + @endif + + @if(!$pirep->read_only) +
    +
    + @csrf + +
    +   +
    + @csrf + +
    -
    + @endif +
    +
    + +
    +
    {{-- DEPARTURE INFO @@ -70,29 +98,7 @@ --}}
    - -

     

    - - {{-- Show the link to edit if it can be edited --}} - @if(!$pirep->read_only) -
    -
    - @csrf - -
    -   -
    - @csrf - -
    -
    - @endif - + @if ($pirep->state !== PirepState::DRAFT) + @endif @@ -153,7 +161,7 @@
    @lang('common.state') @@ -102,6 +108,7 @@
    @lang('common.status') @@ -110,6 +117,7 @@
    @lang('pireps.source')
    - + @foreach($pirep->fields as $field) @@ -217,5 +225,22 @@ @endif -@endsection + @if(!empty($pirep->simbrief)) +
    +
    +
    +
    +
    +  OFP +
    +
    +
    + {!! $pirep->simbrief->xml->text->plan_html !!} +
    +
    +
    +
    +
    + @endif +@endsection diff --git a/resources/views/layouts/default/pireps/table.blade.php b/resources/views/layouts/default/pireps/table.blade.php index 4337d380..2a6c6933 100644 --- a/resources/views/layouts/default/pireps/table.blade.php +++ b/resources/views/layouts/default/pireps/table.blade.php @@ -1,5 +1,5 @@
    -
    @lang('common.name')@lang('common.value'){{ trans_choice('common.value', 1) }}
    +
    @@ -36,19 +36,20 @@ @endif - + @endforeach diff --git a/resources/views/layouts/default/widgets/latest_news.blade.php b/resources/views/layouts/default/widgets/latest_news.blade.php index b97fe0c4..be607c1c 100644 --- a/resources/views/layouts/default/widgets/latest_news.blade.php +++ b/resources/views/layouts/default/widgets/latest_news.blade.php @@ -11,7 +11,7 @@ @foreach($news as $item)

    {{ $item->subject }}

    -

    {{ $item->user->name }} +

    {{ $item->user->name_private }} - {{ show_datetime($item->created_at) }}

    {{ $item->body }} diff --git a/resources/views/layouts/default/widgets/latest_pilots.blade.php b/resources/views/layouts/default/widgets/latest_pilots.blade.php index 16e6e434..fdc4cf4a 100644 --- a/resources/views/layouts/default/widgets/latest_pilots.blade.php +++ b/resources/views/layouts/default/widgets/latest_pilots.blade.php @@ -4,7 +4,7 @@ - + @endforeach
    {{ trans_choice('common.flight', 1) }} - {{ (new \App\Support\Units\Time($pirep->flight_time)) }} + @minutestotime($pirep->flight_time) - @if($pirep->state === PirepState::PENDING) -
    - @elseif($pirep->state === PirepState::ACCEPTED) -
    - @elseif($pirep->state === PirepState::REJECTED) -
    - @else -
    - @endif - {{ PirepState::label($pirep->state) }}
    + @php + $color = 'badge-info'; + if($pirep->state === PirepState::PENDING) { + $color = 'badge-warning'; + } elseif ($pirep->state === PirepState::ACCEPTED) { + $color = 'badge-success'; + } elseif ($pirep->state === PirepState::REJECTED) { + $color = 'badge-danger'; + } + @endphp +
    {{ PirepState::label($pirep->state) }}
    @if(filled($pirep->submitted_at)) @@ -58,7 +59,7 @@ @if(!$pirep->read_only) @lang('common.edit') diff --git a/resources/views/layouts/default/profile/index.blade.php b/resources/views/layouts/default/profile/index.blade.php index 3f92f2af..05b978b8 100644 --- a/resources/views/layouts/default/profile/index.blade.php +++ b/resources/views/layouts/default/profile/index.blade.php @@ -13,7 +13,7 @@

    @@ -47,7 +47,7 @@

    @@ -74,7 +74,7 @@
    @@ -94,7 +94,7 @@
    - @if ($acars) + @if (isset($acars) && $acars === true) ACARS Config   diff --git a/resources/views/layouts/default/users/table.blade.php b/resources/views/layouts/default/users/table.blade.php index d6a00f10..32e8dce4 100644 --- a/resources/views/layouts/default/users/table.blade.php +++ b/resources/views/layouts/default/users/table.blade.php @@ -22,8 +22,8 @@
    - - {{ $user->name }} + + {{$user->ident}} {{ $user->name_private }} @@ -41,7 +41,7 @@ @endif {{ $user->flights }}{{ \App\Facades\Utils::minutesToTimeString($user->flight_time) }}@minutestotime($user->flight_time)
    {{ $u->ident }} {{ $u->name }}{{ $u->name_private }}
    diff --git a/resources/views/system/acars/config.blade.php b/resources/views/system/acars/config.blade.php index df925f87..36534251 100644 --- a/resources/views/system/acars/config.blade.php +++ b/resources/views/system/acars/config.blade.php @@ -1,4 +1,6 @@ - +@php +echo ''; +@endphp {{ config('app.url') }} {{ $user->api_key }} diff --git a/resources/views/vendor/self-update/mails/update-available.blade.php b/resources/views/vendor/self-update/mails/update-available.blade.php new file mode 100644 index 00000000..ffa14dc9 --- /dev/null +++ b/resources/views/vendor/self-update/mails/update-available.blade.php @@ -0,0 +1,5 @@ +Hello! + +The new version {{ $newVersion }} is available. + +Kind regards diff --git a/resources/views/vendor/self-update/self-update.blade.php b/resources/views/vendor/self-update/self-update.blade.php new file mode 100644 index 00000000..e69de29b diff --git a/tests/AcarsTest.php b/tests/AcarsTest.php index e9b1ac80..8dee7278 100644 --- a/tests/AcarsTest.php +++ b/tests/AcarsTest.php @@ -3,7 +3,9 @@ use App\Models\Enums\PirepState; use App\Models\Enums\PirepStatus; use App\Models\PirepFare; +use App\Models\PirepFieldValue; use App\Repositories\SettingRepository; +use App\Support\Utils; /** * Test API calls and authentication, etc @@ -246,7 +248,7 @@ class AcarsTest extends TestCase ]; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); $pirep = $response->json('data'); // See that the fields and fares were set @@ -258,7 +260,7 @@ class AcarsTest extends TestCase $this->assertEquals($fare->capacity, $saved_fare['count']); // Check saved fields - $saved_fields = \App\Models\PirepFieldValue::where('pirep_id', $pirep['id'])->get(); + $saved_fields = PirepFieldValue::where('pirep_id', $pirep['id'])->get(); $this->assertCount(1, $saved_fields); $field = $saved_fields->first(); @@ -333,7 +335,7 @@ class AcarsTest extends TestCase ]; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); $pirep = $response->json('data'); /** @@ -387,13 +389,13 @@ class AcarsTest extends TestCase ]; $response = $this->post($uri, $pirep_create); - $response->assertStatus(201); + $response->assertStatus(200); // Get the PIREP ID $body = $response->json(); $pirep_id = $body['data']['id']; - $this->assertHasKeys($body['data'], ['airline', 'arr_airport', 'dpt_airport', 'position']); + $this->assertHasKeys($body['data'], ['airline', 'arr_airport', 'dpt_airport']); $this->assertNotNull($pirep_id); $this->assertEquals($body['data']['user_id'], $this->user->id); @@ -415,7 +417,8 @@ class AcarsTest extends TestCase */ $uri = '/api/pireps/'.$pirep_id.'/update'; $this->post($uri, [ - 'fields' => [ + 'flight_time' => 60, + 'fields' => [ 'custom_field' => 'custom_value_changed', ], ]); @@ -475,7 +478,23 @@ class AcarsTest extends TestCase $body = $response->json('data'); $this->assertEquals('G26', $body['Departure Gate']); - // File the PIREP now + /* + * Get the live flights and make sure all the fields we want are there + */ + $uri = '/api/acars'; + $response = $this->get($uri); + + $response->assertStatus(200); + $body = collect($response->json('data')); + $body = $body->firstWhere('id', $pirep['id']); + + $this->assertNotEmpty($body['user']['name']); + $this->assertNotEmpty($body['user']['avatar']); + + /* + * File the PIREP + */ + $uri = '/api/pireps/'.$pirep_id.'/file'; $response = $this->post($uri, []); $response->assertStatus(400); // missing field @@ -532,7 +551,7 @@ class AcarsTest extends TestCase ]; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); // Get the PIREP ID $body = $response->json(); @@ -598,7 +617,7 @@ class AcarsTest extends TestCase // Try refiling with a valid aircraft $pirep['aircraft_id'] = $subfleetA['aircraft']->random()->id; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); } /** @@ -639,7 +658,7 @@ class AcarsTest extends TestCase ]; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); } /** @@ -653,20 +672,29 @@ class AcarsTest extends TestCase $uri = '/api/pireps/prefile'; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); $pirep_id = $response->json()['data']['id']; $uri = '/api/pireps/'.$pirep_id.'/acars/position'; // Post an ACARS update - $acars_count = \random_int(2, 10); - $acars = factory(App\Models\Acars::class, $acars_count)->make(['id' => ''])->toArray(); + $acars_count = \random_int(5, 10); + $acars = factory(App\Models\Acars::class, $acars_count)->make(['id' => '']) + ->map(function ($point) { + $point['id'] = Utils::generateNewId(); + return $point; + }) + ->toArray(); $update = ['positions' => $acars]; $response = $this->post($uri, $update); $response->assertStatus(200)->assertJson(['count' => $acars_count]); + // Try posting again, should be ignored/not throw any sql errors + $response = $this->post($uri, $update); + $response->assertStatus(200)->assertJson(['count' => $acars_count]); + $response = $this->get($uri); $response->assertStatus(200)->assertJsonCount($acars_count, 'data'); } @@ -700,11 +728,9 @@ class AcarsTest extends TestCase $dt = date('c'); $uri = '/api/pireps/'.$pirep_id.'/acars/position'; - $acars = factory(App\Models\Acars::class)->make( - [ - 'sim_time' => $dt, - ] - )->toArray(); + $acars = factory(App\Models\Acars::class)->make([ + 'sim_time' => $dt, + ])->toArray(); $update = ['positions' => [$acars]]; $response = $this->post($uri, $update); @@ -729,7 +755,13 @@ class AcarsTest extends TestCase $response->assertStatus(400); $post_route = [ - ['order' => 1, 'name' => 'NAVPOINT', 'lat' => 'notanumber', 'lon' => 34.11], + [ + 'id' => 'NAVPOINT', + 'order' => 1, + 'name' => 'NAVPOINT', + 'lat' => 'notanumber', + 'lon' => 34.11, + ], ]; $uri = '/api/pireps/'.$pirep_id.'/route'; @@ -803,6 +835,10 @@ class AcarsTest extends TestCase $response = $this->post($uri, ['route' => $post_route]); $response->assertStatus(200)->assertJson(['count' => $route_count]); + // Try double post to ignore SQL update + $response = $this->post($uri, ['route' => $post_route]); + $response->assertStatus(200)->assertJson(['count' => $route_count]); + /** * Get */ @@ -834,7 +870,7 @@ class AcarsTest extends TestCase $uri = '/api/pireps/prefile'; $response = $this->post($uri, $pirep); - $response->assertStatus(201); + $response->assertStatus(200); $pirep_id = $response->json()['data']['id']; // try readding diff --git a/tests/AirlineTest.php b/tests/AirlineTest.php index 2ea5886b..50977a64 100644 --- a/tests/AirlineTest.php +++ b/tests/AirlineTest.php @@ -4,6 +4,7 @@ use App\Services\AirlineService; class AirlineTest extends TestCase { + /** @var AirlineService */ protected $airlineSvc; public function setUp(): void @@ -14,6 +15,23 @@ class AirlineTest extends TestCase $this->airlineSvc = app(AirlineService::class); } + public function testAddAirline() + { + $attrs = factory(App\Models\Airline::class)->make([ + 'iata' => '', + ])->toArray(); + + $airline = $this->airlineSvc->createAirline($attrs); + $this->assertNotNull($airline); + + // Add another airline, also blank IATA + $attrs = factory(App\Models\Airline::class)->make([ + 'iata' => '', + ])->toArray(); + $airline = $this->airlineSvc->createAirline($attrs); + $this->assertNotNull($airline); + } + /** * Try deleting an airline which has flights/other assets that exist */ diff --git a/tests/ApiTest.php b/tests/ApiTest.php index 5b0064cb..16aa3253 100644 --- a/tests/ApiTest.php +++ b/tests/ApiTest.php @@ -263,4 +263,25 @@ class ApiTest extends TestCase $res = $this->get('/api/settings')->assertStatus(200); $settings = $res->json(); } + + public function testGetUser() + { + $this->user = factory(App\Models\User::class)->create([ + 'avatar' => '/assets/avatar.jpg', + ]); + + $res = $this->get('/api/user')->assertStatus(200); + $user = $res->json('data'); + $this->assertNotNull($user); + $this->assertTrue(strpos($user['avatar'], 'http') !== -1); + + // Should go to gravatar + + $this->user = factory(App\Models\User::class)->create(); + + $res = $this->get('/api/user')->assertStatus(200); + $user = $res->json('data'); + $this->assertNotNull($user); + $this->assertTrue(strpos($user['avatar'], 'gravatar') !== -1); + } } diff --git a/tests/AwardsTest.php b/tests/AwardsTest.php index 8fba76ee..2efbd8ff 100644 --- a/tests/AwardsTest.php +++ b/tests/AwardsTest.php @@ -6,7 +6,9 @@ use App\Services\PirepService; class AwardsTest extends TestCase { + /** @var AwardService */ private $awardSvc; + private $pirepSvc; public function setUp(): void diff --git a/tests/BidTest.php b/tests/BidTest.php index 5a202785..bc07ea3f 100644 --- a/tests/BidTest.php +++ b/tests/BidTest.php @@ -1,5 +1,6 @@ get('/api/user', $headers); + $req = $this->get('/api/user/bids', $headers); $req->assertStatus(200); $body = $req->json()['data']; - $this->assertCount(1, $body['bids']); - $this->assertEquals($flight->id, $body['bids'][0]['flight_id']); + $req->assertStatus(200); + $this->assertEquals($flight->id, $body[0]['flight_id']); $req = $this->get('/api/users/'.$user->id.'/bids', $headers); @@ -109,17 +110,15 @@ class BidTest extends TestCase $bids = $user->bids()->get(); $this->assertTrue($bids->isEmpty()); - $req = $this->get('/api/user', $headers); + $req = $this->get('/api/user/bids', $headers); $req->assertStatus(200); $body = $req->json()['data']; - $this->assertEquals($user->id, $body['id']); - $this->assertCount(0, $body['bids']); + $this->assertCount(0, $body); $req = $this->get('/api/users/'.$user->id.'/bids', $headers); $req->assertStatus(200); $body = $req->json()['data']; - $this->assertCount(0, $body); } @@ -138,7 +137,7 @@ class BidTest extends TestCase $this->bidSvc->addBid($flight, $user1); // Try adding again, should throw an exception - $this->expectException(\App\Exceptions\BidExistsForFlight::class); + $this->expectException(BidExistsForFlight::class); $this->bidSvc->addBid($flight, $user2); } @@ -196,12 +195,11 @@ class BidTest extends TestCase // Query the API and see that the user has the bids // And pull the flight details for the user/bids - $req = $this->get('/api/user', $headers); + $req = $this->get('/api/user/bids', $headers); $req->assertStatus(200); $body = $req->json()['data']; - $this->assertEquals($user->id, $body['id']); - $this->assertCount(0, $body['bids']); + $this->assertCount(0, $body); $req = $this->get('/api/users/'.$user->id.'/bids', $headers); $req->assertStatus(200); diff --git a/tests/FinanceTest.php b/tests/FinanceTest.php index ed654c5d..e6abeaba 100644 --- a/tests/FinanceTest.php +++ b/tests/FinanceTest.php @@ -1,6 +1,9 @@ create([ 'flight_number' => $flight->flight_number, + 'flight_type' => FlightType::SCHED_PAX, 'route_code' => $flight->route_code, 'route_leg' => $flight->route_leg, 'dpt_airport_id' => $dpt_apt->id, @@ -86,6 +90,7 @@ class FinanceTest extends TestCase 'user_id' => $user->id, 'airline_id' => $user->airline_id, 'aircraft_id' => $subfleet['aircraft']->random(), + 'flight_id' => $flight->id, 'source' => PirepSource::ACARS, 'flight_time' => 120, 'block_fuel' => 10, @@ -114,7 +119,7 @@ class FinanceTest extends TestCase // Add a subfleet expense factory(App\Models\Expense::class)->create([ - 'ref_model' => \App\Models\Subfleet::class, + 'ref_model' => Subfleet::class, 'ref_model_id' => $subfleet['subfleet']->id, 'amount' => 200, ]); @@ -431,7 +436,9 @@ class FinanceTest extends TestCase // Change to a percentage $manual_pay_rate = '50%'; $manual_pay_adjusted = Math::addPercent( - $rank->manual_base_pay_rate, $manual_pay_rate); + $rank->manual_base_pay_rate, + $manual_pay_rate + ); $this->fleetSvc->addSubfleetToRank($subfleet['subfleet'], $rank, [ 'manual_pay' => $manual_pay_rate, @@ -489,6 +496,47 @@ class FinanceTest extends TestCase $this->assertEquals($payment->getValue(), 150); } + public function testGetPirepPilotPayWithFixedPrice() + { + $acars_pay_rate = 100; + + $subfleet = $this->createSubfleetWithAircraft(2); + $rank = $this->createRank(10, [$subfleet['subfleet']->id]); + $this->fleetSvc->addSubfleetToRank($subfleet['subfleet'], $rank, [ + 'acars_pay' => $acars_pay_rate, + ]); + + $this->user = factory(App\Models\User::class)->create([ + 'rank_id' => $rank->id, + ]); + + $flight = factory(App\Models\Flight::class)->create([ + 'airline_id' => $this->user->airline_id, + 'pilot_pay' => 1000, + ]); + + $pirep_acars = factory(App\Models\Pirep::class)->create([ + 'user_id' => $this->user->id, + 'aircraft_id' => $subfleet['aircraft']->random(), + 'source' => PirepSource::ACARS, + 'flight_id' => $flight->id, + 'flight_time' => 60, + ]); + + $payment = $this->financeSvc->getPilotPay($pirep_acars); + $this->assertEquals(1000, $payment->getValue()); + + $pirep_acars = factory(App\Models\Pirep::class)->create([ + 'user_id' => $this->user->id, + 'aircraft_id' => $subfleet['aircraft']->random(), + 'source' => PirepSource::ACARS, + 'flight_time' => 90, + ]); + + $payment = $this->financeSvc->getPilotPay($pirep_acars); + $this->assertEquals($payment->getValue(), 150); + } + /** * @throws \Prettus\Validator\Exceptions\ValidatorException */ @@ -594,7 +642,7 @@ class FinanceTest extends TestCase $expenses = $this->expenseRepo->getAllForType( ExpenseType::FLIGHT, $airline->id, - \App\Models\Expense::class + Expense::class ); $this->assertCount(2, $expenses); @@ -615,7 +663,7 @@ class FinanceTest extends TestCase $subfleet = factory(App\Models\Subfleet::class)->create(); factory(App\Models\Expense::class)->create([ 'airline_id' => null, - 'ref_model' => \App\Models\Subfleet::class, + 'ref_model' => Subfleet::class, 'ref_model_id' => $subfleet->id, ]); @@ -628,7 +676,7 @@ class FinanceTest extends TestCase $this->assertCount(1, $expenses); $expense = $expenses->random(); - $this->assertEquals(\App\Models\Subfleet::class, $expense->ref_model); + $this->assertEquals(Subfleet::class, $expense->ref_model); $obj = $expense->getReferencedObject(); $this->assertEquals($obj->id, $expense->ref_model_id); } @@ -641,7 +689,7 @@ class FinanceTest extends TestCase $journalRepo = app(JournalRepository::class); [$user, $pirep, $fares] = $this->createFullPirep(); - $user->airline->initJournal(config('phpvms.currency')); + $user->airline->initJournal(setting('units.currency', 'USD')); // Override the fares $fare_counts = []; @@ -680,4 +728,97 @@ class FinanceTest extends TestCase $this->assertEquals($count, $find->count()); } } + + /** + * @throws Exception + */ + public function testPirepFinancesSpecificExpense() + { + $journalRepo = app(JournalRepository::class); + + // Add an expense that's only for a cargo flight + factory(App\Models\Expense::class)->create([ + 'airline_id' => null, + 'amount' => 100, + 'flight_type' => FlightType::SCHED_CARGO, + ]); + + [$user, $pirep, $fares] = $this->createFullPirep(); + $user->airline->initJournal(setting('units.currency', 'USD')); + + // Override the fares + $fare_counts = []; + foreach ($fares as $fare) { + $fare_counts[] = [ + 'fare_id' => $fare->id, + 'price' => $fare->price, + 'count' => 100, + ]; + } + + $this->fareSvc->saveForPirep($pirep, $fare_counts); + + // This should process all of the + $pirep = $this->pirepSvc->accept($pirep); + + $transactions = $journalRepo->getAllForObject($pirep); + +// $this->assertCount(9, $transactions['transactions']); + $this->assertEquals(3020, $transactions['credits']->getValue()); + $this->assertEquals(1960, $transactions['debits']->getValue()); + + // Check that all the different transaction types are there + // test by the different groups that exist + $transaction_tags = [ + 'fuel' => 1, + 'expense' => 1, + 'subfleet' => 2, + 'fare' => 3, + 'ground_handling' => 1, + 'pilot_pay' => 2, // debit on the airline, credit to the pilot + ]; + + foreach ($transaction_tags as $type => $count) { + $find = $transactions['transactions']->where('tags', $type); + $this->assertEquals($count, $find->count()); + } + + // Add a new PIREP; + $pirep2 = factory(App\Models\Pirep::class)->create([ + 'flight_number' => 100, + 'flight_type' => FlightType::SCHED_CARGO, + 'dpt_airport_id' => $pirep->dpt_airport_id, + 'arr_airport_id' => $pirep->arr_airport_id, + 'user_id' => $user->id, + 'airline_id' => $user->airline_id, + 'aircraft_id' => $pirep->aircraft_id, + 'source' => PirepSource::ACARS, + 'flight_time' => 120, + 'block_fuel' => 10, + 'fuel_used' => 9, + ]); + + $this->fareSvc->saveForPirep($pirep2, $fare_counts); + $pirep2 = $this->pirepSvc->accept($pirep2); + + $transactions = $journalRepo->getAllForObject($pirep2); + $this->assertEquals(3020, $transactions['credits']->getValue()); + $this->assertEquals(2060, $transactions['debits']->getValue()); + + // Check that all the different transaction types are there + // test by the different groups that exist + $transaction_tags = [ + 'fuel' => 1, + 'expense' => 2, + 'subfleet' => 2, + 'fare' => 3, + 'ground_handling' => 1, + 'pilot_pay' => 2, // debit on the airline, credit to the pilot + ]; + + foreach ($transaction_tags as $type => $count) { + $find = $transactions['transactions']->where('tags', $type); + $this->assertEquals($count, $find->count()); + } + } } diff --git a/tests/FlightTest.php b/tests/FlightTest.php index e61ce6e5..2f805834 100644 --- a/tests/FlightTest.php +++ b/tests/FlightTest.php @@ -27,15 +27,18 @@ class FlightTest extends TestCase /** * Add a single flight * - * @param $user + * @param $user + * @param array $flight_properties * * @return mixed */ - public function addFlight($user) + public function addFlight($user, $flight_properties = []) { - $flight = factory(App\Models\Flight::class)->create([ + $opts = array_merge([ 'airline_id' => $user->airline_id, - ]); + ], $flight_properties); + + $flight = factory(App\Models\Flight::class)->create($opts); $flight->subfleets()->syncWithoutDetaching([ factory(App\Models\Subfleet::class)->create([ @@ -119,7 +122,10 @@ class FlightTest extends TestCase public function testGetFlight() { $this->user = factory(App\Models\User::class)->create(); - $flight = $this->addFlight($this->user); + $flight = $this->addFlight($this->user, [ + 'load_factor' => '', + 'load_factor_variance' => '', + ]); $req = $this->get('/api/flights/'.$flight->id); $req->assertStatus(200); @@ -128,6 +134,7 @@ class FlightTest extends TestCase $this->assertEquals($flight->id, $body['id']); $this->assertEquals($flight->dpt_airport_id, $body['dpt_airport_id']); $this->assertEquals($flight->arr_airport_id, $body['arr_airport_id']); + $this->assertEquals(setting('flights.default_load_factor'), $body['load_factor']); // Distance conversion $this->assertHasKeys($body['distance'], ['mi', 'nmi', 'km']); @@ -167,6 +174,12 @@ class FlightTest extends TestCase $flight->route = $route_text; $flight->save(); + $req = $this->get('/api/flights/'.$flight->id); + $req->assertStatus(200); + + $body = $req->json()['data']; + $this->assertEquals($flight->load_factor, $body['load_factor']); + $res = $this->get('/api/flights/'.$flight->id.'/route'); $res->assertStatus(200); $body = $res->json(); diff --git a/tests/MetarTest.php b/tests/MetarTest.php index c0472ea0..a4cc9f51 100644 --- a/tests/MetarTest.php +++ b/tests/MetarTest.php @@ -3,10 +3,6 @@ use App\Repositories\SettingRepository; use App\Services\AirportService; use App\Support\Metar; -use GuzzleHttp\Client; -use GuzzleHttp\Handler\MockHandler; -use GuzzleHttp\HandlerStack; -use GuzzleHttp\Psr7\Response; /** * Test the parsing/support class of the metar @@ -21,25 +17,6 @@ class MetarTest extends TestCase $this->settingsRepo = app(SettingRepository::class); } - /** - * @param string $filename - */ - private function mockXmlResponse($filename) - { - $mock = new MockHandler([ - new Response(200, - [ - 'Content-Type' => 'text/xml', - ], - $this->readDataFile($filename) - ), - ]); - - $handler = HandlerStack::create($mock); - $guzzleClient = new Client(['handler' => $handler]); - app()->instance(Client::class, $guzzleClient); - } - /** * Make sure a blank metar doesn't give problems */ @@ -85,7 +62,8 @@ class MetarTest extends TestCase $this->assertCount(4, $parsed['clouds']); $this->assertEquals( 'A few at 1676 meters; scattered at 2896 meters; broken sky at 3353 meters; broken sky at 7010 meters', - $parsed['clouds_report']); + $parsed['clouds_report'] + ); $this->assertEquals(1676.4, $parsed['cloud_height']['m']); $this->assertEquals(false, $parsed['cavok']); @@ -170,6 +148,20 @@ class MetarTest extends TestCase $this->assertEquals('A few at 1500 feet; a few at 25000 feet', $metar['clouds_report_ft']); } + /** + * Visibility in KM not parsed + * + * https://github.com/nabeelio/phpvms/issues/680 + */ + public function testMetar5() + { + $metar = 'NZOH 031300Z 04004KT 38KM SCT075 BKN090 15/14 Q1002 RMK AUTO NZPM VATSIM USE ONL'; + $metar = Metar::parse($metar); + + $this->assertEquals(38, $metar['visibility']['km']); + $this->assertEquals('38 km', $metar['visibility_report']); + } + public function testHttpCallSuccess() { $this->mockXmlResponse('aviationweather/kjfk.xml'); @@ -185,4 +177,15 @@ class MetarTest extends TestCase $this->assertNull($airportSvc->getMetar('idk')); } + + public function testHttpCallUnknown() + { + $this->mockXmlResponse('aviationweather/unknown.xml'); + + /** @var AirportService $airportSvc */ + $airportSvc = app(AirportService::class); + + $metar = $airportSvc->getMetar('7AK4'); + $this->assertNull($metar); + } } diff --git a/tests/PIREPTest.php b/tests/PIREPTest.php index 48e6dc22..dd379803 100644 --- a/tests/PIREPTest.php +++ b/tests/PIREPTest.php @@ -1,6 +1,7 @@ pilot->flights + 1; - $new_flight_time = $pirep->pilot->flight_time + $pirep->flight_time; + $new_pirep_count = $pirep->user->flights + 1; + $new_flight_time = $pirep->user->flight_time + $pirep->flight_time; $this->pirepSvc->changeState($pirep, PirepState::ACCEPTED); $this->assertEquals($new_pirep_count, $pirep->pilot->flights); @@ -223,6 +225,9 @@ class PIREPTest extends TestCase 'flight_time' => 360, ]); + $aircraft = Aircraft::find(1); + $flight_time_initial = $aircraft->flight_time; + foreach ($pireps as $pirep) { $this->pirepSvc->create($pirep); $this->pirepSvc->accept($pirep); @@ -234,9 +239,12 @@ class PIREPTest extends TestCase // Make sure rank went up $this->assertGreaterThan($user->rank_id, $pilot->rank_id); $this->assertEquals($last_pirep->arr_airport_id, $pilot->curr_airport_id); - $this->assertEquals(2, $pilot->flights); + $aircraft = Aircraft::find(1); + $after_time = $flight_time_initial + 720; + $this->assertEquals($after_time, $aircraft->flight_time); + // // Submit another PIREP, adding another 6 hours // it should automatically be accepted @@ -299,6 +307,22 @@ class PIREPTest extends TestCase // Make sure rank went up $this->assertGreaterThan($user->rank_id, $pilot->rank_id); + + // Check the aircraft + $aircraft = Aircraft::where('id', 1)->first(); + $this->assertEquals(120, $aircraft->flight_time); + + // Reset the aircraft flight time + $aircraft->flight_time = 10; + $aircraft->save(); + + // Recalculate the status + /** @var AircraftService $aircraftSvc */ + $aircraftSvc = app(AircraftService::class); + $aircraftSvc->recalculateStats(); + + $aircraft = Aircraft::where('id', 1)->first(); + $this->assertEquals(120, $aircraft->flight_time); } /** diff --git a/tests/RegistrationTest.php b/tests/RegistrationTest.php index 1f5f43c5..a57c1777 100644 --- a/tests/RegistrationTest.php +++ b/tests/RegistrationTest.php @@ -1,7 +1,10 @@ create(); - $user = $userSvc->createUser($user); + $attrs = factory(App\Models\User::class)->make()->toArray(); + $attrs['password'] = Hash::make('secret'); + $user = $userSvc->createUser($attrs); $this->assertEquals(UserState::ACTIVE, $user->state); - Event::assertDispatched(\App\Events\UserRegistered::class, function ($e) use ($user) { + Event::assertDispatched(UserRegistered::class, function ($e) use ($user) { return $e->user->id === $user->id && $e->user->state === $user->state; }); - /*Mail::assertSent(\App\Mail\UserRegistered::class, function ($mail) use ($user) { - return $mail->user->id === $user->id - && $mail->user->state === $user->state; - });*/ + /*Notification::assertSentTo( + [$user], + \App\Notifications\Messages\UserRegistered::class + );*/ } } diff --git a/tests/SimBriefTest.php b/tests/SimBriefTest.php new file mode 100644 index 00000000..a4a34531 --- /dev/null +++ b/tests/SimBriefTest.php @@ -0,0 +1,193 @@ +create([ + 'id' => self::$simbrief_flight_id, + 'dpt_airport_id' => 'OMAA', + 'arr_airport_id' => 'OMDB', + ]); + + $this->mockXmlResponse([ + 'simbrief/briefing.xml', + 'simbrief/acars_briefing.xml', + ]); + + /** @var SimBriefService $sb */ + $sb = app(SimBriefService::class); + + return $sb->checkForOfp($user->id, Utils::generateNewId(), $flight->id); + } + + /** + * Read from the SimBrief URL + */ + public function testReadSimbrief() + { + $this->user = factory(App\Models\User::class)->create(); + $briefing = $this->loadSimBrief($this->user); + + $this->assertNotEmpty($briefing->ofp_xml); + $this->assertNotNull($briefing->xml); + + // Spot check reading of the files + $files = $briefing->files; + $this->assertEquals(47, $files->count()); + $this->assertEquals( + 'http://www.simbrief.com/ofp/flightplans/OMAAOMDB_PDF_1584226092.pdf', + $files->firstWhere('name', 'PDF Document')['url'] + ); + + // Spot check reading of images + $images = $briefing->images; + $this->assertEquals(5, $images->count()); + $this->assertEquals( + 'http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_ROUTE.gif', + $images->firstWhere('name', 'Route')['url'] + ); + + $level = $briefing->xml->getFlightLevel(); + $this->assertEquals('380', $level); + + // Read the flight route + $routeStr = $briefing->xml->getRouteString(); + $this->assertEquals( + 'DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT '. + 'ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT', + $routeStr + ); + } + + /** + * Check that the API calls are working (simbrief in the response, can retrieve the briefing) + */ + public function testApiCalls() + { + $this->user = factory(App\Models\User::class)->create(); + $briefing = $this->loadSimBrief($this->user); + + // Check the flight API response + $response = $this->get('/api/flights/'.$briefing->flight_id); + $response->assertOk(); + $flight = $response->json('data'); + + $this->assertNotNull($flight['simbrief']); + $this->assertEquals($briefing->id, $flight['simbrief']['id']); + + $url = str_replace('http://', 'https://', $flight['simbrief']['url']); + $this->assertEquals( + 'https://localhost/api/flights/'.$briefing->flight_id.'/briefing', + $url + ); + + // Retrieve the briefing via API, and then check the doctype + $response = $this->get('/api/flights/'.$briefing->flight_id.'/briefing'); + $response->assertOk(); + // $response->assertHeader('Content-Type', 'application/xml'); + + $xml = simplexml_load_string($response->content()); + $this->assertNotNull($xml); + + $this->assertEquals('VMSAcars', $xml->getName()); + $this->assertEquals('FlightPlan', $xml->attributes()->Type); + } + + /** + * Make sure the user's bids have the Simbrief data show up + */ + public function testUserBidSimbrief() + { + $this->user = factory(App\Models\User::class)->create(); + $this->loadSimBrief($this->user); + + // Find the flight + $uri = '/api/user/bids'; + $data = ['flight_id' => self::$simbrief_flight_id]; + + $body = $this->put($uri, $data); + $body = $body->json('data'); + + // Make sure Simbrief is there + $this->assertNotNull($body['flight']['simbrief']['id']); + } + + public function testAttachToPirep() + { + $user = factory(App\Models\User::class)->create(); + $pirep = factory(App\Models\Pirep::class)->create([ + 'user_id' => $user->id, + 'dpt_airport_id' => 'OMAA', + 'arr_airport_id' => 'OMDB', + ]); + + $briefing = $this->loadSimBrief($user); + + /** @var SimBriefService $sb */ + $sb = app(SimBriefService::class); + $sb->attachSimbriefToPirep($pirep, $briefing); + + /* + * Checks - ACARS entries for the route are loaded + */ + $acars = Acars::where(['pirep_id' => $pirep->id, 'type' => AcarsType::ROUTE])->get(); + $this->assertEquals(12, $acars->count()); + + $fix = $acars->firstWhere('name', 'BOMUP'); + $this->assertEquals($fix['name'], 'BOMUP'); + $this->assertEquals($fix['lat'], 24.484639); + $this->assertEquals($fix['lon'], 54.578444); + $this->assertEquals($fix['order'], 1); + + $briefing->refresh(); + + $this->assertEmpty($briefing->flight_id); + $this->assertEquals($pirep->id, $briefing->pirep_id); + } + + /** + * Test clearing expired briefs + */ + public function testClearExpiredBriefs() + { + $user = factory(App\Models\User::class)->create(); + $sb_ignored = factory(SimBrief::class)->create([ + 'user_id' => $user->id, + 'flight_id' => 'a_flight_id', + 'pirep_id' => 'a_pirep_id', + 'created_at' => Carbon::now('UTC')->subDays(6)->toDateTimeString(), + ]); + + factory(SimBrief::class)->create([ + 'user_id' => $user->id, + 'flight_id' => 'a_flight_Id', + 'pirep_id' => '', + 'created_at' => Carbon::now('UTC')->subDays(6)->toDateTimeString(), + ]); + + /** @var SimBriefService $sb */ + $sb = app(SimBriefService::class); + $sb->removeExpiredEntries(); + + $all_briefs = SimBrief::all(); + $this->assertEquals(1, $all_briefs->count()); + $this->assertEquals($sb_ignored->id, $all_briefs[0]->id); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 14be075c..a08caa78 100755 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -125,23 +125,52 @@ class TestCase extends Illuminate\Foundation\Testing\TestCase return file_get_contents($p); } } + + return false; } /** * Return a mock Guzzle Client with a response loaded from $mockFile * - * @param $mockFile + * @param array|string $files */ - public function mockGuzzleClient($mockFile): void + public function mockGuzzleClient($files): void { - $mock = new MockHandler([ - new Response(200, - [ - 'Content-Type' => 'application/json; charset=utf-8', - ], - $this->readDataFile($mockFile) - ), - ]); + if (!is_array($files)) { + $files = [$files]; + } + + $responses = []; + foreach ($files as $file) { + $responses[] = new Response(200, [ + 'Content-Type' => 'application/json; charset=utf-8', + ], $this->readDataFile($file)); + } + + $mock = new MockHandler($responses); + + $handler = HandlerStack::create($mock); + $guzzleClient = new Client(['handler' => $handler]); + app()->instance(Client::class, $guzzleClient); + } + + /** + * @param array|string $files The filename or files to respond with + */ + public function mockXmlResponse($files) + { + if (!is_array($files)) { + $files = [$files]; + } + + $responses = []; + foreach ($files as $file) { + $responses[] = new Response(200, [ + 'Content-Type' => 'text/xml', + ], $this->readDataFile($file)); + } + + $mock = new MockHandler($responses); $handler = HandlerStack::create($mock); $guzzleClient = new Client(['handler' => $handler]); diff --git a/tests/UserTest.php b/tests/UserTest.php index c25c67ec..7b74d19d 100644 --- a/tests/UserTest.php +++ b/tests/UserTest.php @@ -4,6 +4,7 @@ use App\Exceptions\UserPilotIdExists; use App\Models\User; use App\Repositories\SettingRepository; use App\Services\UserService; +use Illuminate\Support\Facades\Hash; class UserTest extends TestCase { @@ -208,12 +209,14 @@ class UserTest extends TestCase */ public function testUserPilotIdAdded() { - $new_user = factory(App\Models\User::class)->create(['id' => 1]); + $new_user = factory(App\Models\User::class)->make()->toArray(); + $new_user['password'] = Hash::make('secret'); $user = $this->userSvc->createUser($new_user); $this->assertEquals($user->id, $user->pilot_id); // Add a second user - $new_user = factory(App\Models\User::class)->create(['id' => 2]); + $new_user = factory(App\Models\User::class)->make()->toArray(); + $new_user['password'] = Hash::make('secret'); $user2 = $this->userSvc->createUser($new_user); $this->assertEquals($user2->id, $user2->pilot_id); @@ -222,7 +225,24 @@ class UserTest extends TestCase $this->assertEquals(3, $user->pilot_id); // Create a new user and the pilot_id should be 4 - $user3 = factory(App\Models\User::class)->create(['id' => 3]); + $user3 = factory(App\Models\User::class)->create(); $this->assertEquals(4, $user3->pilot_id); } + + /** + * Test that a user's name is private + */ + public function testUserNamePrivate() + { + $vals = [ + 'Firstname' => 'Firstname', + 'Firstname Lastname' => 'Firstname L', + 'Firstname Middlename Lastname' => 'Firstname L', + ]; + + foreach ($vals as $input => $expected) { + $user = new User(['name' => $input]); + $this->assertEquals($expected, $user->name_private); + } + } } diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php index 7c27e4dc..c9d3269e 100644 --- a/tests/UtilsTest.php +++ b/tests/UtilsTest.php @@ -1,12 +1,15 @@ assertNotNull($carbon); } @@ -15,46 +18,49 @@ class UtilsTest extends TestCase */ public function testSecondsToTimeParts() { - $t = Utils::secondsToTimeParts(3600); + $t = Time::secondsToTimeParts(3600); $this->assertEquals(['h' => 1, 'm' => 0, 's' => 0], $t); - $t = Utils::secondsToTimeParts(3720); + $t = Time::secondsToTimeParts(3720); $this->assertEquals(['h' => 1, 'm' => 2, 's' => 0], $t); - $t = Utils::secondsToTimeParts(3722); + $t = Time::secondsToTimeParts(3722); $this->assertEquals(['h' => 1, 'm' => 2, 's' => 2], $t); - $t = Utils::secondsToTimeParts(60); + $t = Time::secondsToTimeParts(60); $this->assertEquals(['h' => 0, 'm' => 1, 's' => 0], $t); - $t = Utils::secondsToTimeParts(62); + $t = Time::secondsToTimeParts(62); $this->assertEquals(['h' => 0, 'm' => 1, 's' => 2], $t); } + /** + * @throws \Exception + */ public function testSecondsToTime() { - $t = Utils::secondsToTimeString(3600); + $t = Time::secondsToTimeString(3600); $this->assertEquals('1h 0m', $t); - $t = Utils::secondsToTimeString(3720); + $t = Time::secondsToTimeString(3720); $this->assertEquals('1h 2m', $t); - $t = Utils::secondsToTimeString(3722); + $t = Time::secondsToTimeString(3722); $this->assertEquals('1h 2m', $t); - $t = Utils::secondsToTimeString(3722, true); + $t = Time::secondsToTimeString(3722, true); $this->assertEquals('1h 2m 2s', $t); } public function testMinutesToTime() { - $t = Utils::minutesToTimeParts(65); + $t = Time::minutesToTimeParts(65); $this->assertEquals(['h' => 1, 'm' => 5], $t); - $t = Utils::minutesToTimeString(65); + $t = Time::minutesToTimeString(65); $this->assertEquals('1h 5m', $t); - $t = Utils::minutesToTimeString(43200); + $t = Time::minutesToTimeString(43200); $this->assertEquals('720h 0m', $t); } @@ -64,9 +70,12 @@ class UtilsTest extends TestCase $this->assertNotNull($api_key); } + /** + * @throws \Exception + */ public function testHexCode() { - $hex_code = \App\Support\ICAO::createHexCode(); + $hex_code = ICAO::createHexCode(); $this->assertNotNull($hex_code); } @@ -82,9 +91,10 @@ class UtilsTest extends TestCase ]; foreach ($tests as $case) { - $this->assertEquals('phpvms.net', \App\Support\Utils::getRootDomain($case)); + $this->assertEquals('phpvms.net', Utils::getRootDomain($case)); } - $this->assertEquals('phpvms', \App\Support\Utils::getRootDomain('http://phpvms')); + $this->assertEquals('phpvms.co.uk', Utils::getRootDomain('http://phpvms.co.uk')); + $this->assertEquals('phpvms.co.uk', Utils::getRootDomain('http://www.phpvms.co.uk')); } } diff --git a/tests/data/aviationweather/unknown.xml b/tests/data/aviationweather/unknown.xml new file mode 100644 index 00000000..e69de29b diff --git a/tests/data/expenses.csv b/tests/data/expenses.csv index 64ea6d94..8f584693 100644 --- a/tests/data/expenses.csv +++ b/tests/data/expenses.csv @@ -1,9 +1,9 @@ -airline,name,amount,type,charge_to_user,multiplier,active,ref_model,ref_model_id -,"Per-Flight (no muliplier)",100,F,0,0,1,, -,"Per-Flight (multiplier)",100,F,0,1,1,, -VMS,"Per-Flight (multiplier, on airline)",200,F,0,1,1,, -,"A daily fee",800,D,0,0,1,, -,"A monthly fee",5000,M,0,0,1,, -,Catering,1000,F,0,0,1,Subfleet,744-3X-RB211 -,"Catering Staff",1000,D,0,0,1,Subfleet,744-3X-RB211 -,Maintenance,1000,D,0,0,1,App\Models\Aircraft,001Z +airline,name,amount,type,flight_type,charge_to_user,multiplier,active,ref_model,ref_model_id +,"Per-Flight (no muliplier)",100,F,,0,0,1,, +,"Per-Flight (multiplier)",100,F,,0,1,1,, +VMS,"Per-Flight (multiplier, on airline)",200,F,,0,1,1,, +,"A daily fee",800,D,,0,0,1,, +,"A monthly fee",5000,M,,0,0,1,, +,Catering,1000,F,J,0,0,1,Subfleet,744-3X-RB211 +,"Catering Staff",1000,D,J,0,0,1,Subfleet,744-3X-RB211 +,Maintenance,1000,D,F,0,0,1,App\Models\Aircraft,001Z diff --git a/tests/data/expenses_empty_rows.csv b/tests/data/expenses_empty_rows.csv index da4b1e17..c762f833 100644 --- a/tests/data/expenses_empty_rows.csv +++ b/tests/data/expenses_empty_rows.csv @@ -1,11 +1,11 @@ -airline,name,amount,type,charge_to_user,multiplier,active,ref_model,ref_model_id -,"Per-Flight (no muliplier)",100,F,0,0,1,, -,"Per-Flight (multiplier)",100,F,0,1,1,, -VMS,"Per-Flight (multiplier, on airline)",200,F,0,1,1,, -,"A daily fee",800,D,0,0,1,, -,"A monthly fee",5000,M,0,0,1,, -,Catering,1000,F,0,0,1,Subfleet,744-3X-RB211 -,"Catering Staff",1000,D,0,0,1,Subfleet,744-3X-RB211 -,Maintenance,1000,D,0,0,1,App\Models\Aircraft,001Z +airline,name,amount,type,flight_type,charge_to_user,multiplier,active,ref_model,ref_model_id +,"Per-Flight (no muliplier)",100,F,,0,0,1,, +,"Per-Flight (multiplier)",100,F,,0,1,1,, +VMS,"Per-Flight (multiplier, on airline)",200,F,,0,1,1,, +,"A daily fee",800,D,,0,0,1,, +,"A monthly fee",5000,M,,0,0,1,, +,Catering,1000,F,,0,0,1,Subfleet,744-3X-RB211 +,"Catering Staff",1000,D,,0,0,1,Subfleet,744-3X-RB211 +,Maintenance,1000,D,,0,0,1,App\Models\Aircraft,001Z diff --git a/tests/data/flights.csv b/tests/data/flights.csv index 5210eb51..0474a0f9 100644 --- a/tests/data/flights.csv +++ b/tests/data/flights.csv @@ -1,4 +1,4 @@ -airline,flight_number,route_code,route_leg,dpt_airport,arr_airport,alt_airport,days,dpt_time,arr_time,level,distance,flight_time,flight_type,route,notes,active,subfleets,fares,fields -VMS,1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=4;Arrival Gate=C41 -" ",1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=4;Arrival Gate=C41 -VMS,113,,,KJFK,KAUS,KDFW,15,0810 EST,1035 CST,350,,207,J,,"Empty distance",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=C41;Arrival Gate=2 +airline,flight_number,route_code,route_leg,dpt_airport,arr_airport,alt_airport,days,dpt_time,arr_time,level,distance,flight_time,flight_type,load_factor, load_factor_variance,pilot_pay,route,notes,active,subfleets,fares,fields +VMS,1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,85,0,100, ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=4;Arrival Gate=C41 +" ",1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,100,10, ,ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=4;Arrival Gate=C41 +VMS,113,,,KJFK,KAUS,KDFW,15,0810 EST,1035 CST,350,,207,J,70,2,,,"Empty distance",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?,Departure Gate=C41;Arrival Gate=2 diff --git a/tests/data/flights_empty_fields.csv b/tests/data/flights_empty_fields.csv index df70414a..3e2b4a18 100644 --- a/tests/data/flights_empty_fields.csv +++ b/tests/data/flights_empty_fields.csv @@ -1,2 +1,2 @@ -airline,flight_number,route_code,route_leg,dpt_airport,arr_airport,alt_airport,days,dpt_time,arr_time,level,distance,flight_time,flight_type,route,notes,active,subfleets,fares,fields -VMS,1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?, +airline,flight_number,route_code,route_leg,dpt_airport,arr_airport,alt_airport,days,dpt_time,arr_time,level,distance,flight_time,flight_type,load_factor, load_factor_variance,pilot_pay,route,notes,active,subfleets,fares,fields +VMS,1972,,,KAUS,KJFK,KLGA,15,0810 CST,1235 EST,350,1477,207,J,,,,ILEXY2 ZENZI LFK ELD J29 MEM Q29 JHW J70 STENT J70 MAGIO J70 LVZ LENDY6,"Just a flight",1,A32X,Y?price=300&cost=100&capacity=130;F?price=600&cost=400;B?, diff --git a/tests/data/simbrief/acars_briefing.xml b/tests/data/simbrief/acars_briefing.xml new file mode 100644 index 00000000..aa62dd9b --- /dev/null +++ b/tests/data/simbrief/acars_briefing.xml @@ -0,0 +1,475 @@ + + + + 19722791 + 120867 + 1585313544 + lido2 + 2001 + lbs + + + 1 + VMS + 99 + 0 + PAYLOAD/CARGO LIMITED BY MLW + + 1 + CI5 + 250/300/78 + 78/300/250 + CI0 + RES + 5 + 23000 + MKJP/0230 + 11 + 56792 + 12 + 064 + 018 + 273 + 319 + 307 + 5723 + 388 + .63 + 171 + LEXUV3 KEMBO G633 NALRO GUBEL3 + LEXUV3 KEMBO G633 NALRO GUBEL3 + LEXUV3 KEMBO G633 NALRO GUBEL3 + + + MKJP + KIN + + 18 + 17.935556 + -76.787500 + NORMAN MANLEY INTL + 12 + + + MWCR + GCM + + 8 + 19.292781 + -81.357767 + ROBERTS INTL + 08 + + + MKJS + MBJ + + 4 + 18.503669 + -77.913389 + SANGSTER INTL + 07 + 31000 + 232 + 201 + 233 + 103 + 109 + 411 + 410 + M001 + 018 + 018 + 57000 + P12 + 2575 + 4302 + NALRO2 NALRO DCT OTEKO DCT IMONI OMAXI5 + NALRO2 NALRO DCT OTEKO DCT IMONI OMAXI5 + + + + + + UKIMO + UKIMO + wpt + 17.918556 + -76.743300 + CLB + LEXUV3 + 1 + 5 + 112 + 119 + 111 + 118 + 4900 + + + PEMPE + PEMPE + wpt + 17.809956 + -76.789128 + CLB + LEXUV3 + 1 + 7 + 201 + 210 + 199 + 207 + 10800 + + + LEXUV + LEXUV + wpt + 17.853819 + -76.902525 + CLB + LEXUV3 + 1 + 7 + 292 + 300 + 293 + 301 + 14200 + + + KEMBO + KEMBO + wpt + 18.218889 + -77.354722 + CLB + LEXUV3 + 0 + 34 + 310 + 318 + 311 + 319 + 22200 + + + TOC + TOP OF CLIMB + ltlg + 18.288425 + -77.494553 + CLB + G633 + 0 + 9 + 297 + 305 + 298 + 306 + 23000 + + + SIA + SANGSTER + vor + 18.501047 + -77.924100 + CRZ + G633 + 0 + 28 + 297 + 305 + 298 + 305 + 23000 + + + PETSI + PETSI + wpt + 18.660278 + -78.595833 + CRZ + G633 + 0 + 39 + 284 + 291 + 285 + 292 + 23000 + + + FROST + FROST + wpt + 18.756944 + -79.009167 + CRZ + G633 + 0 + 24 + 283 + 291 + 284 + 291 + 23000 + + + OTEKO + OTEKO + wpt + 18.870278 + -79.500000 + CRZ + G633 + 0 + 29 + 283 + 290 + 285 + 292 + 23000 + + + NALRO + NALRO + wpt + 19.030822 + -80.206147 + CRZ + G633 + 0 + 41 + 283 + 290 + 285 + 291 + 23000 + + + TOD + TOP OF DESCENT + ltlg + 19.126848 + -80.634858 + CRZ + GUBEL3 + 1 + 25 + 283 + 289 + 286 + 292 + 23000 + + + D107Q + D107Q + wpt + 19.225436 + -81.080228 + DSC + GUBEL3 + 1 + 26 + 283 + 288 + 285 + 290 + 10500 + + + D080O + D080O + wpt + 19.350150 + -81.115561 + DSC + GUBEL3 + 1 + 8 + 345 + 350 + 348 + 353 + 6700 + + + GUBEL + GUBEL + wpt + 19.338075 + -81.166667 + DSC + GUBEL3 + 1 + 3 + 255 + 261 + 255 + 260 + 5300 + + + MWCR + ROBERTS INTL + apt + 19.292781 + -81.357767 + DSC + GUBEL3 + 1 + 34 + 255 + 261 + 255 + 260 + 2500 + + + + (FPL-VMS99-IS +-A320/M-SDE3FGHIRWY/LB1 +-MKJP1230 +-N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3 +-MWCR0100 MKJS +-PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS) + N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3 + N0388F230 LEXUV3 KEMBO G633 NALRO GUBEL3 + VMS99 + 0388 + N + 230 + F + PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS + MKJK + MKJK + MKJK + + + + + A320 + 320 + A320-200 + N320SB + 205 + + M-SDE3FGHIRWY/LB1 + 180 + 1 + + + 220 + 5723 + 1411 + 4302 + 3967 + 0 + 0 + 15403 + 15403 + 15623 + 9900 + 5643 + 42600 + + + 3651 + 7620 + 1388579400 + 1388579700 + 1388587320 + 1388587500 + 8100 + 1388579400 + 1388579700 + 1388583351 + 1388583531 + 4131 + -5 + -5 + 300 + 180 + 2700 + 10496 + 900 + 0 + 0 + + + 96518 + 171 + 230 + 0 + 39307 + 135825 + 137789 + 151228 + 151228 + 171961 + L + 145505 + 145505 + 151448 + + + VMS + 99 + A320 + MKJP + MWCR + 1388534400 + 43200 + 1800 + LEXUV3 KEMBO G633 NALRO GUBEL3 + 7200 + 900 + + + + auto + MKJS + + NABEEL SHAHZAD + 120867 + 1 + auto + 0 + auto + 45 + auto + auto + auto + auto + auto + auto + auto + auto + AUTO + lido + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + + + + + + + + + false + + + diff --git a/tests/data/simbrief/briefing.xml b/tests/data/simbrief/briefing.xml new file mode 100644 index 00000000..3c6359d5 --- /dev/null +++ b/tests/data/simbrief/briefing.xml @@ -0,0 +1,4598 @@ + + + + 19317474 + 120867 + 1584226092 + lido2 + 2001 + lbs + + + 1 + VMS + 112 + 0 + PLANNED OPTIMUM FLIGHT LEVEL + PAYLOAD/CARGO LIMITED BY MLW + + 1 + CI5 + 250/300/78 + 78/300/250 + CI0 + RES + 5 + 16000 + OMAA/0160 + 11 + 53437 + 7 + 283 + 018 + 63 + 138 + 134 + 3340 + 344 + .54 + 167 + DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT + DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT + DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT + + + OMAA + AUH + + 83 + 24.433056 + 54.651111 + ABU DHABI INTL + 31L + + + OMDB + DXB + + 62 + 25.252778 + 55.364444 + DUBAI INTL + 12R + + + OTHH + DOH + + 13 + 25.274564 + 51.608378 + HAMAD INTL + 16L + 38000 + 298 + 204 + 343 + 271 + 269 + 453 + 404 + M049 + 270 + 057 + 53600 + P11 + 3259 + 5323 + NABI2G NABIX P699 ORMID UP699 DASLO UY856 ALKAN UL721 BAYAN BAYA1M + NABIX2G NABIX P699 ORMID UP699 DASLO UY856 ALKAN UL721 BAYAN BAYAN1M + + + + + + BOMUP + BOMUP + wpt + + 24.484639 + 54.578444 + CLB + DCT + 0 + 5 + 307 + 306 + 306 + 304 + 7100 + 250 + 283 + 0.43 + 0.43 + -6 + 277 + 65 + 65 + 16524 + 256 + 256 + 12390 + 13837 + 10 + 9 + 259 + 09 + 0 + 54300 + 369 + 2100 + OMAE + N,F + 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000 + + + 0 + 68 + 7 + 23 + + + 5000 + 214 + 11 + 14 + + + 10000 + 328 + 15 + 6 + + + 14000 + 299 + 15 + -2 + + + 18000 + 293 + 18 + -12 + + + 24000 + 270 + 48 + -24 + + + 30000 + 264 + 99 + -31 + + + 34000 + 262 + 103 + -40 + + + 39000 + 267 + 88 + -51 + + + 45000 + 269 + 66 + -63 + + + + + + LOVIM + LOVIM + wpt + + 24.495750 + 54.564972 + CLB + DCT + 0 + 1 + 312 + 310 + 312 + 310 + 7900 + 250 + 287 + 0.43 + 0.43 + -12 + 275 + 13 + 77 + 16597 + 51 + 307 + 12339 + 13786 + 10 + 11 + 301 + 12 + 0 + 54300 + 369 + 2100 + OMAE + N,F + 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000 + + + 0 + 68 + 7 + 23 + + + 5000 + 214 + 11 + 14 + + + 10000 + 328 + 15 + 6 + + + 14000 + 299 + 15 + -2 + + + 18000 + 293 + 18 + -12 + + + 24000 + 270 + 48 + -24 + + + 30000 + 264 + 99 + -31 + + + 34000 + 262 + 103 + -40 + + + 39000 + 267 + 88 + -51 + + + 45000 + 269 + 66 + -63 + + + + + + RESIG + RESIG + wpt + + 24.525611 + 54.552889 + CLB + DCT + 0 + 2 + 339 + 338 + 338 + 336 + 9200 + 250 + 293 + 0.44 + 0.44 + -14 + 279 + 25 + 103 + 16581 + 102 + 409 + 12237 + 13684 + 8 + 11 + 313 + 15 + 0 + 53400 + 12 + 2100 + OMAE + N,F + 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + NODVI + NODVI + wpt + + 24.577889 + 54.479444 + CLB + DCT + 0 + 5 + 308 + 306 + 308 + 306 + 11500 + 300 + 364 + 0.56 + 0.56 + -19 + 345 + 64 + 166 + 16498 + 255 + 664 + 11982 + 13429 + 2 + 10 + 309 + 19 + 0 + 53000 + 0 + 2100 + OMAE + N,F + 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000 + + + 0 + 108 + 11 + 22 + + + 5000 + 249 + 11 + 15 + + + 10000 + 318 + 15 + 5 + + + 14000 + 296 + 23 + -2 + + + 18000 + 276 + 23 + -12 + + + 24000 + 275 + 39 + -27 + + + 30000 + 266 + 89 + -33 + + + 34000 + 266 + 94 + -39 + + + 39000 + 268 + 81 + -49 + + + 45000 + 274 + 65 + -62 + + + + + + OBMUK + OBMUK + wpt + + 24.734194 + 54.491778 + CLB + DCT + 0 + 9 + 004 + 002 + 001 + 359 + 14200 + 300 + 381 + 0.59 + 0.59 + -9 + 372 + 115 + 281 + 16442 + 459 + 1123 + 11523 + 12970 + -3 + 10 + 295 + 23 + 0 + 53000 + 0 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 108 + 11 + 22 + + + 5000 + 249 + 11 + 15 + + + 10000 + 318 + 15 + 5 + + + 14000 + 296 + 23 + -2 + + + 18000 + 276 + 23 + -12 + + + 24000 + 275 + 39 + -27 + + + 30000 + 266 + 89 + -33 + + + 34000 + 266 + 94 + -39 + + + 39000 + 268 + 81 + -49 + + + 45000 + 274 + 65 + -62 + + + + + + TOC + TOP OF CLIMB + ltlg + + 24.881909 + 54.611176 + CLB + DCT + 0 + 11 + 036 + 034 + 034 + 032 + 16000 + 300 + 392 + 0.61 + 0.61 + 8 + 400 + 140 + 421 + 16429 + 561 + 1684 + 10962 + 12409 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + LORID + LORID + wpt + + 24.931250 + 54.651139 + CRZ + DCT + 0 + 4 + 036 + 034 + 033 + 031 + 16000 + 263 + 344 + 0.54 + 0.54 + 8 + 352 + 41 + 462 + 5349 + 61 + 1745 + 10901 + 12348 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + ORGUR + ORGUR + wpt + + 25.103583 + 54.785972 + CRZ + DCT + 0 + 13 + 035 + 033 + 032 + 030 + 16000 + 263 + 344 + 0.54 + 0.54 + 8 + 352 + 133 + 595 + 5341 + 197 + 1942 + 10704 + 12151 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + PEBUS + PEBUS + wpt + + 25.154944 + 54.826278 + CRZ + DCT + 0 + 4 + 035 + 033 + 032 + 030 + 16000 + 263 + 344 + 0.54 + 0.539 + 8 + 352 + 41 + 636 + 5331 + 61 + 2003 + 10643 + 12090 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + EMOPO + EMOPO + wpt + + 25.286056 + 54.948444 + CRZ + DCT + 0 + 10 + 040 + 038 + 037 + 035 + 16000 + 262 + 343 + 0.54 + 0.539 + 9 + 352 + 102 + 738 + 5322 + 151 + 2154 + 10492 + 11939 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2000 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + LOTUK + LOTUK + wpt + + 25.188889 + 55.145000 + CRZ + DCT + 0 + 12 + 118 + 116 + 119 + 117 + 16000 + 261 + 341 + 0.54 + 0.535 + 18 + 359 + 120 + 858 + 5289 + 177 + 2331 + 10315 + 11762 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2100 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + TOD + TOP OF DESCENT + ltlg + + 25.127188 + 55.431415 + CRZ + DCT + 0 + 16 + 103 + 101 + 103 + 101 + 16000 + 260 + 341 + 0.53 + 0.535 + 19 + 360 + 160 + 1018 + 5349 + 238 + 2569 + 10077 + 11524 + -6 + 11 + 280 + 19 + 0 + 53400 + 12 + 2400 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + LAGTA + LAGTA + wpt + + 25.100556 + 55.554167 + DSC + DCT + 0 + 7 + 103 + 101 + 103 + 101 + 11100 + 300 + 362 + 0.55 + 0.55 + 13 + 375 + 164 + 1183 + 3554 + 67 + 2636 + 10010 + 11457 + 4 + 11 + 290 + 13 + 0 + 53800 + 1070 + 2600 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 96 + 3 + 23 + + + 5000 + 229 + 13 + 14 + + + 10000 + 290 + 12 + 6 + + + 14000 + 283 + 15 + -2 + + + 18000 + 281 + 20 + -12 + + + 24000 + 274 + 36 + -26 + + + 30000 + 262 + 88 + -33 + + + 34000 + 262 + 100 + -40 + + + 39000 + 265 + 89 + -50 + + + 45000 + 274 + 69 + -62 + + + + + + LOVOL + LOVOL + wpt + + 25.144167 + 55.567222 + DSC + DCT + 0 + 3 + 015 + 013 + 013 + 011 + 9000 + 250 + 292 + 0.44 + 0.44 + 1 + 293 + 70 + 1253 + 3558 + 29 + 2665 + 9981 + 11428 + 8 + 11 + 281 + 10 + 0 + 53800 + 1070 + 2500 + OMAE + N,F + 1000,3000,5000,7000,9000,11000,13000,15000,17000,19000,21000,23000,25000,27000,29000,31000,33000,35000,37000,39000,41000,45000,49000,53000,57000,61000,65000,69000 + + + 0 + 96 + 3 + 23 + + + 5000 + 229 + 13 + 14 + + + 10000 + 290 + 12 + 6 + + + 14000 + 283 + 15 + -2 + + + 18000 + 281 + 20 + -12 + + + 24000 + 274 + 36 + -26 + + + 30000 + 262 + 88 + -33 + + + 34000 + 262 + 100 + -40 + + + 39000 + 265 + 89 + -50 + + + 45000 + 274 + 69 + -62 + + + + + + OMDB + DUBAI INTL + apt + + 25.252778 + 55.364444 + DSC + DCT + 0 + 36 + 300 + 299 + 299 + 297 + 2600 + 250 + 264 + 0.39 + 0.39 + 1 + 265 + 824 + 2077 + 3552 + 675 + 3340 + 9306 + 10753 + 20 + 10 + 180 + 03 + 1 + 53400 + 12 + 2500 + OMAE + N,F + 2000,4000,6000,8000,10000,12000,14000,16000,18000,20000,22000,24000,26000,28000,30000,32000,34000,36000,38000,40000,43000,47000,51000,55000,59000,63000,67000 + + + 0 + 71 + 10 + 22 + + + 5000 + 219 + 12 + 14 + + + 10000 + 317 + 15 + 6 + + + 14000 + 289 + 18 + -2 + + + 18000 + 280 + 21 + -12 + + + 24000 + 274 + 37 + -27 + + + 30000 + 264 + 89 + -33 + + + 34000 + 264 + 98 + -39 + + + 39000 + 267 + 84 + -49 + + + 45000 + 274 + 66 + -62 + + + + + + + + (FPL-VMS112-IS +-A320/M-SDE3FGHIRWY/LB1 +-OMAA1230 +-N0344F160 DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT + LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL + DCT +-OMDB0034 OTHH +-PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS) + N0344F160 DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT + N0344F160 DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT + VMS112 + 0344 + N + 160 + F + PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS + OMAE + OMAE + OBBB + + + + + A320 + 320 + A320-200 + N320SB + 205 + + M-SDE3FGHIRWY/LB1 + 180 + 1 + + + 220 + 3340 + 1447 + 5323 + 3983 + 0 + 0 + 14093 + 14093 + 14313 + 10973 + 5788 + 42600 + + + 2077 + 7140 + 1388579400 + 1388580000 + 1388587140 + 1388587500 + 8100 + 1388579400 + 1388580000 + 1388582077 + 1388582437 + 3037 + 4 + 4 + 600 + 360 + 2700 + 9488 + 900 + 0 + 0 + + + 96518 + 167 + 230 + 0 + 38234 + 134752 + 137789 + 148845 + 148845 + 171961 + L + 145505 + 145505 + 149065 + + + + 2183 + 106 + 3386 + 46 + 14308 + 100 + 316 + 0.49 + 5 + + + 2199 + 122 + 3411 + 71 + 14333 + 120 + 323 + 0.50 + 5 + + + 2106 + 29 + 3363 + 23 + 14326 + 140 + 334 + 0.52 + 5 + + + 2052 + -25 + 3330 + -10 + 14316 + 180 + 354 + 0.56 + 5 + + + + + 2001 + -76 + 3389 + 49 + 14439 + 160 + 395 + 0.62 + 50 + + + 2090 + 13 + 3332 + -8 + 14293 + 160 + 336 + 0.53 + 0 + + + 2076 + -2 + 3360 + 20 + 14343 + 160 + 345 + 0.54 + 5 + + + 2090 + 12 + 3334 + -6 + 14296 + 160 + 343 + 0.54 + 5 + + + + 120867 + NABEEL SHAHZAD + SHANE WALKER + CONSTANCE DIXON + TOMMIE SHORT + ANGELICA AYALA + BYRON THOMPSON + RANDAL ROWE + + + + M + KNSF + V0090/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101229 + 202004230001 + 202002101229 + V0090/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101229 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + VOR RWY 31L; MINIMA TO READÂ…S-31L* CAT AB 520-750M 437 (500-750M). + CIRCLING CAT AB 800-1600M 717 (800-1600M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED VOR RWY 31L; MINIMA TO READ S-31L* CAT AB 520-750M 437 (500-750M). CIRCLING CAT AB 800-1600M 717 (800-1600M). 10 FEB 12:29 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:29 2020 + NOTAMN + QPICH + + + M + KNSF + V0089/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101228 + 202004230001 + 202002101228 + V0089/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101228 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + VOR RWY 13R; MINIMA TO READÂ…S-13R* CAT AB 540-1200M 462 + (500-1200M), CAT CD 540-1500M 462 (500-1500M). *WHEN ALS INOP, + INCREASE CAT CD VIS TO 2200M. CIRCLING CAT AB 800-1900M 717 + (800-1900M), CAT C 900-4000M 817 (900-4000M), CAT D 900-4400M 817 + (900-4400M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED VOR RWY 13R; MINIMA TO READ S-13R* CAT AB 540-1200M 462 (500-1200M), CAT CD 540-1500M 462 (500-1500M). *WHEN ALS INOP, INCREASE CAT CD VIS TO 2200M. CIRCLING CAT AB 800-1900M 717 (800-1900M), CAT C 900-4000M 817 (900-4000M), CAT D 900-4400M 817 (900-4400M). 10 FEB 12:28 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:28 2020 + NOTAMN + QPICH + + + M + KNSF + V0088/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101226 + 202004230001 + 202002101226 + V0088/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101226 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + ILS RWY 31R; MINIMA TO READÂ…S-LOC 31R* CAT ABCD 750-2400M 678 + (700-2400M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 3100M. CIRCLING + 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 31R; MINIMA TO READ S-LOC 31R* CAT ABCD 750-2400M 678 (700-2400M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 3100M. CIRCLING 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M). 10 FEB 12:26 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:26 2020 + NOTAMN + QPICH + + + M + KNSF + V0087/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101224 + 202004230001 + 202002101225 + V0087/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101224 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + ILS RWY 31L; MA CG REQUIRED TO CROSS VEDEX AT 4000 IS 247 FPNM OR + 4.05%. MINIMA TO READÂ…S-ILS 31L* CAT AB 350-800M 267 (300-800M), + CAT CD 369-800M 286 (300-800M). *WHEN ALS INOP, INCREASE CAT AB VIS + TO 1300M, CAT CD VIS TO 1400M. S-LOC 31L** CAT ABCD 480-1100M 397 + (400-1100M). **WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1800M. + CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 + (800-3600M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 31L; MA CG REQUIRED TO CROSS VEDEX AT 4000 IS 247 FPNM OR 4.05%. MINIMA TO READ S-ILS 31L* CAT AB 350-800M 267 (300-800M), CAT CD 369-800M 286 (300-800M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 1300M, CAT CD VIS TO 1400M. S-LOC 31L** CAT ABCD 480-1100M 397 (400-1100M). **WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1800M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 880-3600M 797 (800-3600M). 10 FEB 12:24 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:25 2020 + NOTAMN + QPICH + + + M + KNSF + V0086/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101221 + 202004230001 + 202002101222 + V0086/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101221 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + ILS RWY 13R; MINIMA TO READÂ…S-ILS 13R* CAT AB 288-800M 210 + (300-800M), CAT CD 309-800M 231 (300-800M). *WHEN ALS INOP, + INCREASE CAT ABCD VIS TO 1200M. S-LOC 13R** CAT ABC 510-1300M 427 + (500-1300M). **WHEN ALS INOP, INCREASE CAT ABC VIS TO 2000M. + CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT C 880-3600M 797 + (800-3600M), CAT D 970-3800M 827 (900-3800M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 13R; MINIMA TO READ S-ILS 13R* CAT AB 288-800M 210 (300-800M), CAT CD 309-800M 231 (300-800M). *WHEN ALS INOP, INCREASE CAT ABCD VIS TO 1200M. S-LOC 13R** CAT ABC 510-1300M 427 (500-1300M). **WHEN ALS INOP, INCREASE CAT ABC VIS TO 2000M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT C 880-3600M 797 (800-3600M), CAT D 970-3800M 827 (900-3800M). 10 FEB 12:21 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:22 2020 + NOTAMN + QPICH + + + M + KNSF + V0085/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002101213 + 202004230001 + 202002101214 + V0085/20 NOTAMN +Q) OMAE/QPICH/I/BO/A/000/999/2426N05439E005 A) OMAA B) 2002101213 C) 2004230001 +E) [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED + ILS RWY 13L; MINIMA TO READÂ…S-ILS 13L* CAT AB 375-800M 313 + (300-800M), CAT CD 395-800M 333 (400-800M). *WHEN ALS INOP, + INCREASE CAT AB VIS TO 1500M AND CAT CD VIS TO 1700M. S-LOC 13L** + CAT AB 570-1600M 506 (500-1600M). WHEN ALS INOP, INCREASE CAT AB + VIS TO 2400M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD + 890-3600M 797 (800-3600M). + [US DOD PROCEDURAL NOTAM] INSTRUMENT APPROACH PROCEDURE CHANGED ILS RWY 13L; MINIMA TO READ S-ILS 13L* CAT AB 375-800M 313 (300-800M), CAT CD 395-800M 333 (400-800M). *WHEN ALS INOP, INCREASE CAT AB VIS TO 1500M AND CAT CD VIS TO 1700M. S-LOC 13L** CAT AB 570-1600M 506 (500-1600M). WHEN ALS INOP, INCREASE CAT AB VIS TO 2400M. CIRCLING CAT AB 780-3200M 697 (700-3200M), CAT CD 890-3600M 797 (800-3600M). 10 FEB 12:13 2020 UNTIL 23 APR 00:01 2020. CREATED: 10 FEB 12:13 2020 + NOTAMN + QPICH + + + I + OMAEYNYX + A0612/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003121410 + A0612/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/001/2428N05436E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242802.03N +0543619.44E +F) SFC G) 100FT AGL + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242802.03N 0543619.44E. SFC - 100FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 14:10 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0611/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003121406 + A0611/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/001/2428N05436E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242830.15N +0543614.02E +F) SFC G) 100FT AGL + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242830.15N 0543614.02E. SFC - 100FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 14:06 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0610/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003121359 + A0610/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/001/2428N05436E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242800.04N +0543633.98E +F) SFC G) 100FT AGL + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242800.04N 0543633.98E. SFC - 100FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 13:59 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0609/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003121343 + A0609/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/001/2427N05435E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242743.28N +0543532.12E +F) SFC G) 100FT AGL + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242743.28N 0543532.12E. SFC - 100FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 13:43 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0599/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003120942 + A0599/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/002/2429N05436E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242901.69N +0543624.97E. +F) SFC G) 200FT AGL + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242901.69N 0543624.97E. SFC - 200FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 09:42 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0598/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003150200 + 202003151415 + 202003120941 + A0598/20 NOTAMN +Q) OMAE/QWULW/IV/BO/AW/000/002/2429N05436E001 +A) OMAA B) 2003150200 C) 2003151415 +E) UAS ACT WILL TAKE PLACE WI 250M RADIUS CENTERED ON PSN 242920.0N +0543559.1E. +F) SFC G) 200FT AGL + UAS ACT WILL TAKE PLACE WI 250M RADIUS CENTERED ON PSN 242920.0N 0543559.1E. SFC - 200FT AGL, 15 MAR 02:00 2020 UNTIL 15 MAR 14:15 2020. CREATED: 12 MAR 09:41 2020 + NOTAMN + QWULW + + + I + OMAEYNYX + A0568/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003080300 + 202003251400 + 202003051237 + A0568/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/001/2426N05439E001 +A) OMAA B) 2003080300 C) 2003251400 +D) H24 +E) OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING: +242655.40N 0543922.10E +242654.80N 0543922.90E +242621.50N 0543853.50E +242620.80N 0543854.80E +F) SFC G) 036FT AGL + OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING: 242655.40N 0543922.10E 242654.80N 0543922.90E 242621.50N 0543853.50E 242620.80N 0543854.80E. SFC - 036FT AGL, H24, 08 MAR 03:00 2020 UNTIL 25 MAR 14:00 2020. CREATED: 05 MAR 12:36 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0563/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003080300 + 202003171400 + 202003051214 + A0563/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2003080300 C) 2003171400 +D) DLY BTN 0300-1400 +E) SECN OF TWY H BTN TWY B AND TWY L2 CLSD DUE WIP + SECN OF TWY H BTN TWY B AND TWY L2 CLSD DUE WIP. DLY BTN 0300-1400, 08 MAR 03:00 2020 UNTIL 17 MAR 14:00 2020. CREATED: 05 MAR 12:14 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A0562/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202003080300 + 202003171400 + 202003051211 + A0562/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2003080300 C) 2003171400 +D) H24 +E) SECN OF TWY H BTN TWY C AND TWY L3 CLSD DUE WIP + SECN OF TWY H BTN TWY C AND TWY L3 CLSD DUE WIP. H24, 08 MAR 03:00 2020 UNTIL 17 MAR 14:00 2020. CREATED: 05 MAR 12:11 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A0408/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002190130 + 202005191530 + 202002182001 + A0408/20 NOTAMN +Q) OMAE/QMGXX/IV/B/A/000/999/2426N05439E005 +A) OMAA B) 2002190130 C) 2005191530 +D) DLY BTN 0130-0300 AND 1430-1530 +E) IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM, +ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE +TIMES IN CAT I COND. ATC WILL CONT TO ISSUE STANDARD TWY ROUTINGS +BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT +ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND THEREFORE +SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS A +DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT SHALL +CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD PSN +WHEN SAFE TO DO SO. + IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM, ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE TIMES IN CAT I COND. ATC WILL CONT TO ISSUE STANDARD TWY ROUTINGS BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND THEREFORE SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS A DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT SHALL CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD PSN WHEN SAFE TO DO SO. DLY BTN 0130-0300 AND 1430-1530, 19 FEB 01:30 2020 UNTIL 19 MAY 15:30 2020. CREATED: 18 FEB 20:01 2020 + NOTAMN + QMGXX + + + I + OMAEYNYX + A0401/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002250200 + 202004201600 + 202002181239 + A0401/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/004/2427N05436E001 +A) OMAA B) 2002250200 C) 2004201600 +D) DLY BTN 0200-1600 +E) OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN +242742.38N 0543602.65E +F) SFC G) 338FT AGL + OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN 242742.38N 0543602.65E. SFC - 338FT AGL, DLY BTN 0200-1600, 25 FEB 02:00 2020 UNTIL 20 APR 16:00 2020. CREATED: 18 FEB 12:39 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0395/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002190300 + 202003191400 + 202002181117 + A0395/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2002190300 C) 2003191400 +D) H24 +E) TWY B BTN TWY B4 AND TWY B7 CLSD DUE WIP. + TWY B BTN TWY B4 AND TWY B7 CLSD DUE WIP. H24, 19 FEB 03:00 2020 UNTIL 19 MAR 14:00 2020. CREATED: 18 FEB 11:16 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A0340/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002110800 + 202003262359 + 202002110803 + A0340/20 NOTAMN +Q) OMAE/QMRAK/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2002110800 C) 2003262359 +E) CNL UAE SUP 07/2019 + CNL UAE SUP 07/2019. 11 FEB 08:00 2020 UNTIL 26 MAR 23:59 2020. CREATED: 11 FEB 08:00 2020 + NOTAMN + + + I + OMAEYNYX + A0314/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002061110 + 202002061110 + A0314/20 NOTAMR A2227/19 +Q) OMAE/QOBCE/IV/M/AE/000/001/2427N05437E001 +A) OMAA B) 2002061110 C) PERM +D) DLY BTN 0200-1800 +E) OBST CRANE ELEV 20M ERECTED AT PSN 242759.50N 0543755.10E. +F) SFC G) 065FT AGL + OBST CRANE ELEV 20M ERECTED AT PSN 242759.50N 0543755.10E. SFC - 065FT AGL, DLY BTN 0200-1800, 06 FEB 11:10 2020 UNTIL PERM. CREATED: 06 FEB 11:10 2020 + NOTAMR + QOBCE + + + I + OMAEYNYX + A0284/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002040802 + 202005031800 + 202002040803 + A0284/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/002/2427N05437E001 +A) OMAA B) 2002040802 C) 2005031800 +D) DLY BTN 0200-1800 +E) OBST CRANE ERECTED AT PSN 242715.90N 0543658.18E. +F) SFC G) 167FT AMSL + OBST CRANE ERECTED AT PSN 242715.90N 0543658.18E. SFC - 167FT AMSL, DLY BTN 0200-1800, 04 FEB 08:02 2020 UNTIL 03 MAY 18:00 2020. CREATED: 04 FEB 08:03 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0277/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002031500 + 202002031501 + A0277/20 NOTAMN +Q) OMAE/QMXAO/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2002031500 C) PERM +E) TWY D3 OPR. REF UAE AIP SUP 09/2019 + TWY D3 OPR. REF UAE AIP SUP 09/2019. 03 FEB 15:00 2020 UNTIL PERM. CREATED: 03 FEB 14:58 2020 + NOTAMN + + + I + OMAEYNYX + A0276/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002031500 + 202002031459 + A0276/20 NOTAMN +Q) OMAE/QMYAO/IV/M/A/000/999/2426N05439E005 +A) OMAA B) 2002031500 C) PERM +E) RAPID EXIT TWY D5 OPR +REF UAE AIP SUP 09/2019 + RAPID EXIT TWY D5 OPR REF UAE AIP SUP 09/2019. 03 FEB 15:00 2020 UNTIL PERM. CREATED: 03 FEB 14:56 2020 + NOTAMN + + + I + OMAEYNYX + A0271/20 + 1 + OMAA + OMAA + ABU DHABI INTL + 1 + 202002030655 + 202005021800 + 202002030655 + A0271/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/002/2427N05437E001 +A) OMAA B) 2002030655 C) 2005021800 +D) DLY BTN 0200-1800 +E) OBST CRANE ERECTED AT PSN 242718.01N 0543659.38E. +F) SFC G) 169FT AMSL + OBST CRANE ERECTED AT PSN 242718.01N 0543659.38E. SFC - 169FT AMSL, DLY BTN 0200-1800, 03 FEB 06:55 2020 UNTIL 02 MAY 18:00 2020. CREATED: 03 FEB 06:55 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0580/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202003080915 + 202003310800 + 202003080915 + A0580/20 NOTAMR A0514/20 +Q) OMAE/QMXXX/IV/M/A/000/999/2515N05522E005 +A) OMDB B) 2003080915 C) 2003310800 +D) H24 +E) TWY Z8 AND TWY Z9 NOT AVBL. + TWY Z8 AND TWY Z9 NOT AVBL. H24, 08 MAR 09:15 2020 UNTIL 31 MAR 08:00 2020. CREATED: 08 MAR 09:14 2020 + NOTAMR + QMXXX + + + I + OMAEYNYX + A0531/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202003091200 + 202003171300 + 202003020915 + A0531/20 NOTAMN +Q) OMAE/QMRXX/IV/NBO/A/000/999/2515N05522E005 +A) OMDB B) 2003091200 C) 2003171300 +D) EV MON AND TUE BTN 1200-1300 +E) RWY 12L/30R AND RWY 12R/30L NOT AVBL. FLT CLBR INPR + RWY 12L/30R AND RWY 12R/30L NOT AVBL. FLT CLBR INPR. EV MON AND TUE BTN 1200-1300, 09 MAR 12:00 2020 UNTIL 17 MAR 13:00 2020. CREATED: 02 MAR 09:15 2020 + NOTAMN + QMRXX + + + I + OMAEYNYX + A0476/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202003120800 + 202003160800 + 202002241201 + A0476/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005 +A) OMDB B) 2003120800 C) 2003160800 +D) H24 +E) SECN OF TXL P BTN ACFT STANDS E34 AND E38 CLSD. + SECN OF TXL P BTN ACFT STANDS E34 AND E38 CLSD. H24, 12 MAR 08:00 2020 UNTIL 16 MAR 08:00 2020. CREATED: 24 FEB 12:01 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A0475/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202003080800 + 202003150800 + 202002241157 + A0475/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005 +A) OMDB B) 2003080800 C) 2003150800 +D) H24 +E) SECN OF TWY M WEST OF TWY M1B CLSD. +TWY M1A CLSD + SECN OF TWY M WEST OF TWY M1B CLSD. TWY M1A CLSD. H24, 08 MAR 08:00 2020 UNTIL 15 MAR 08:00 2020. CREATED: 24 FEB 11:57 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A0469/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202002240909 + 202005240559 + 202002240910 + A0469/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/012/2512N05520E001 +A) OMDB B) 2002240909 C) 2005240559 +D) H24 +E) OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E +OMDB ARP BRG 201 DEG MAG DIST 5230M. +CRANE LGT AT NGT. +F) SFC G) 1109FT AMSL + OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E OMDB ARP BRG 201 DEG MAG DIST 5230M. CRANE LGT AT NGT. SFC - 1109FT AMSL, H24, 24 FEB 09:09 2020 UNTIL 24 MAY 05:59 2020. CREATED: 24 FEB 09:09 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0275/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202002031000 + 202002030943 + A0275/20 NOTAMN +Q) OMAE/QPDAW/I/NBO/A/000/999/2515N05522E005 +A) OMDB B) 2002031000 C) PERM +E) SID ITOTU 1F RWY 30L/R WITHDRAWN +REF UAE AIP CHART OMDB AD 2-42. + SID ITOTU 1F RWY 30L/R WITHDRAWN REF UAE AIP CHART OMDB AD 2-42. 03 FEB 10:00 2020 UNTIL PERM. CREATED: 03 FEB 09:43 2020 + NOTAMN + QPDAW + + + I + OMAEYNYX + A0264/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202002020527 + 202004020700 + 202002020527 + A0264/20 NOTAMR A2125/19 +Q) OMAE/QFAXX/IV/NBO/AW/005/015/2515N05522E005 +A) OMDB B) 2002020527 C) 2004020700 +D) DLY BTN 0300-0700 +E) PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO +SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC. +F) 500FT AGL G) 1500FT AGL + PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC. 500FT AGL - 1500FT AGL, DLY BTN 0300-0700, 02 FEB 05:27 2020 UNTIL 02 APR 07:00 2020. CREATED: 02 FEB 05:27 2020 + NOTAMR + QFAXX + + + I + OMAEYNYX + A0171/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202001211145 + 202004210559 + 202001211145 + A0171/20 NOTAMR A2077/19 +Q) OMAE/QOBCE/IV/M/AE/000/007/2510N05518E001 +A) OMDB B) 2001211145 C) 2004210559 +D) H24 +E) OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E +ARP BRG 212 DEG MAG DIST 9.93KM. +CRANE LGT AT NGT. + +F) SFC G) 679FT AMSL + OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E ARP BRG 212 DEG MAG DIST 9.93KM. CRANE LGT AT NGT. SFC - 679FT AMSL, H24, 21 JAN 11:45 2020 UNTIL 21 APR 05:59 2020. CREATED: 21 JAN 11:45 2020 + NOTAMR + QOBCE + + + I + OMAEYNYX + A0154/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202001210725 + 202003301500 + 202001210726 + A0154/20 NOTAMR A2849/19 +Q) OMAE/QPICH/I/NBO/A/000/999/2515N05522E005 +A) OMDB B) 2001210725 C) 2003301500 +D) DLY BTN 0300-1500 +E) DUE TO CRANE ACTIVITIES IN THE VCY OF OMDB AD. +GP INOP OCA/H RWY 12L TO READ AS 540(529) REF CHART OMDB AD 2-66. + DUE TO CRANE ACTIVITIES IN THE VCY OF OMDB AD. GP INOP OCA/H RWY 12L TO READ AS 540(529) REF CHART OMDB AD 2-66. DLY BTN 0300-1500, 21 JAN 07:25 2020 UNTIL 30 MAR 15:00 2020. CREATED: 21 JAN 07:25 2020 + NOTAMR + QPICH + + + I + OMAEYNYX + A0149/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202001210600 + 202004210559 + 202001210534 + A0149/20 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/011/2512N05520E005 +A) OMDB B) 2001210600 C) 2004210559 +D) H24 +E) OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E +ARP BRG 202 DEG MAG DIST 5.5KM +CRANE LIT AT NGT. +F) SFC G) 1004FT AMSL + OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E ARP BRG 202 DEG MAG DIST 5.5KM CRANE LIT AT NGT. SFC - 1004FT AMSL, H24, 21 JAN 06:00 2020 UNTIL 21 APR 05:59 2020. CREATED: 21 JAN 05:34 2020 + NOTAMN + QOBCE + + + I + OMAEYNYX + A0127/20 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 202002040800 + 202003150800 + 202001151235 + A0127/20 NOTAMN +Q) OMAE/QMXLC/IV/M/A/000/999/2515N05522E005 +A) OMDB B) 2002040800 C) 2003150800 +D) H24 +E) SECN OF TWY K BTN TWY K5 AND TWY K7 CLSD. +EAST LINK OF TWY K6 CLSD. TWY Z10 CLSD. +SECN OF TXL W BTN TWY K AND TXL Z CLSD. +PILOTS TO EXER CTN AT TWY K8-J2 INT. +REF UAE AIP SUP 33/2019 AREA C27 + C28 + SECN OF TWY K BTN TWY K5 AND TWY K7 CLSD. EAST LINK OF TWY K6 CLSD. TWY Z10 CLSD. SECN OF TXL W BTN TWY K AND TXL Z CLSD. PILOTS TO EXER CTN AT TWY K8-J2 INT. REF UAE AIP SUP 33/2019 AREA C27 + C28. H24, 04 FEB 08:00 2020 UNTIL 15 MAR 08:00 2020. CREATED: 15 JAN 12:35 2020 + NOTAMN + QMXLC + + + I + OMAEYNYX + A2848/19 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 201912300300 + 202003301500 + 201912291137 + A2848/19 NOTAMN +Q) OMAE/QOBCE/IV/M/AE/000/003/2517N05518E005 +A) OMDB B) 1912300300 C) 2003301500 +D) H24 +E) OBST CRANE ELEV 87M ERECTED AT VCY OF PSN 251739N 0551804E ARP BRG +304 DEG MAG DIST 7.8KM. +CRANE LGT AT NGT. +F) SFC G) 286FT AMSL + OBST CRANE ELEV 87M ERECTED AT VCY OF PSN 251739N 0551804E ARP BRG 304 DEG MAG DIST 7.8KM. CRANE LGT AT NGT. SFC - 286FT AMSL, H24, 30 DEC 03:00 2019 UNTIL 30 MAR 15:00 2020. CREATED: 29 DEC 11:37 2019 + NOTAMN + QOBCE + + + I + OMAEYNYX + A2797/19 + 1 + OMDB + OMDB + DUBAI INTL + 1 + 201912240805 + 202003250559 + 201912240805 + A2797/19 NOTAMR A1842/19 +Q) OMAE/QOBCE/IV/M/AE/000/003/2515N05520E005 +A) OMDB B) 1912240805 C) 2003250559 +D) H24 +E) OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E +ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT +F) SFC G) 289FT AMSL + OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT. SFC - 289FT AMSL, H24, 24 DEC 08:05 2019 UNTIL 25 MAR 05:59 2020. CREATED: 24 DEC 08:05 2019 + NOTAMR + QOBCE + + + I + OBBBYNYX + G0248/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003110752 + 202004161100 + 202003110752 + G0248/20 NOTAMR G0177/20 +Q) OBBB/QOBCE/IV/M/A/000/999/2515N05136E001 +A) OTHH B) 2003110752 C) 2004161100 +E) MOBILE CRANE WITH MAX HEIGHT OF 22M AGL OPERATING WI AN AREA +BOUNDED BY THE FLW COORDINATES: + +AREA 1 +251719.93N 0513550.34E - 251722.97N 0513553.14E - +251721.04N 0513555.65E - 251718.00N 0513552.84E - +251719.93N 0513550.34E. + +AREA 2 +25168.88N 0513622.83E - 25167.72N 0513625.82E - +25168.15N 0513626.02E - 25166.62N 0513629.96E - +25164.25N 0513628.85E - 25166.94N 0513621.92E - +25168.88N 0513622.83E. + +AREA 3 +25152.88N 0513648.69E - 25151.44N 0513649.06E - +25151.12N 0513647.58E - 25152.55N 0513647.22E - +25152.88N 0513648.69E. + +AREA 4 +251627.96N 0513608.96E - 251629.06N 0513612.28E - +251626.28N 0513613.49E - 251625.08N 0513610.17E - +251627.96N 0513608.96E. + MOBILE CRANE WITH MAX HEIGHT OF 22M AGL OPERATING WI AN AREA BOUNDED BY THE FLW COORDINATES: AREA 1 251719.93N 0513550.34E - 251722.97N 0513553.14E - 251721.04N 0513555.65E - 251718.00N 0513552.84E - 251719.93N 0513550.34E. AREA 2 25168.88N 0513622.83E - 25167.72N 0513625.82E - 25168.15N 0513626.02E - 25166.62N 0513629.96E - 25164.25N 0513628.85E - 25166.94N 0513621.92E - 25168.88N 0513622.83E. AREA 3 25152.88N 0513648.69E - 25151.44N 0513649.06E - 25151.12N 0513647.58E - 25152.55N 0513647.22E - 25152.88N 0513648.69E. AREA 4 251627.96N 0513608.96E - 251629.06N 0513612.28E - 251626.28N 0513613.49E - 251625.08N 0513610.17E - 251627.96N 0513608.96E. 11 MAR 07:52 2020 UNTIL 16 APR 11:00 2020. CREATED: 11 MAR 07:52 2020 + NOTAMR + QOBCE + + + I + OBBBYNYX + G0247/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003140300 + 202003101404 + G0247/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05136E001 +A) OTHH B) 2003140300 C) 2006142359 EST +E) MOBILE CRANE WITH MAX HEIGHT OF 37M AGL OPERATING WI THE AREA +BOUNDED BY FLW COORDS: + +251633.82N 0513609.79E - 251631.53N 0513603.61E - +251625.73N 0513606.16E - 251626.32N 0513607.78E - +251624.11N 0513608.75E - 251625.79N 0513613.37E - +251633.82N 0513609.79E. + MOBILE CRANE WITH MAX HEIGHT OF 37M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251633.82N 0513609.79E - 251631.53N 0513603.61E - 251625.73N 0513606.16E - 251626.32N 0513607.78E - 251624.11N 0513608.75E - 251625.79N 0513613.37E - 251633.82N 0513609.79E. 14 MAR 03:00 2020 UNTIL 14 JUN 23:59 2020 ESTIMATED. CREATED: 10 MAR 14:04 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0245/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003120700 + 202006121100 + 202003081216 + G0245/20 NOTAMN +Q) OBBB/QOBCE/IV/M/AE/000/999/2516N05137E005 +A) OTHH B) 2003120700 C) 2006121100 +E) PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE +AREA BOUNDED BY FLW COORDS: +251727.04N 0513616.86E - 251725.83N 0513617.39E - +251725.23N 0513615.74E - 251726.43N 0513615.20E - +251727.04N 0513616.86E + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251727.04N 0513616.86E - 251725.83N 0513617.39E - 251725.23N 0513615.74E - 251726.43N 0513615.20E - 251727.04N 0513616.86E. 12 MAR 07:00 2020 UNTIL 12 JUN 11:00 2020. CREATED: 08 MAR 12:15 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0227/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003080600 + 202003291500 + 202003031821 + G0227/20 NOTAMN +Q) OBBB/QWULW/IV/BO/AW/000/004/2516N05137E002 +A) OTHH B) 2003080600 C) 2003291500 +D) 08 0600-0800, 15 1100-1800, 22 0200-0500, 24 29 1200-1500 +E) REMOTELY PILOTED ACFT SYSTEM (RPAS) ACTIVITY WILL TAKE PLACE WITHIN +AN AREA BOUNDED BY FLW COORDS: (LUSAIL CITY) +252430.4378N 0513029.5162E - 252448.3950N 0513136.6036E - +252300.4224N 0513216.5810E - 252239.8611N 0513109.4344E - +252430.4378N 0513029.5162E +F) SFC G) 330FT AGL + REMOTELY PILOTED ACFT SYSTEM (RPAS) ACTIVITY WILL TAKE PLACE WITHIN AN AREA BOUNDED BY FLW COORDS: (LUSAIL CITY) 252430.4378N 0513029.5162E - 252448.3950N 0513136.6036E - 252300.4224N 0513216.5810E - 252239.8611N 0513109.4344E - 252430.4378N 0513029.5162E. SFC - 330FT AGL, 08 0600-0800, 15 1100-1800, 22 0200-0500, 24 29 1200-1500, 08 MAR 06:00 2020 UNTIL 29 MAR 15:00 2020. CREATED: 03 MAR 18:21 2020 + NOTAMN + QWULW + + + I + OBBBYNYX + G0225/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003070700 + 202003031811 + G0225/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2003070700 C) 2006072359 EST +E) PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE +AREA BOUNDED BY FLW COORDS: +251704.71N 0513615.00E - 251703.48N 0513615.54E - +251701.13N 0513609.05E - 251702.36N 0513608.51E - +251704.71N 0513615.00E + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251704.71N 0513615.00E - 251703.48N 0513615.54E - 251701.13N 0513609.05E - 251702.36N 0513608.51E - 251704.71N 0513615.00E. 07 MAR 07:00 2020 UNTIL 07 JUN 23:59 2020 ESTIMATED. CREATED: 03 MAR 18:11 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0220/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003080300 + 202003020435 + G0220/20 NOTAMN +Q) OBBB/QOBCE/IV/M/AE/000/999/2517N05136E001 +A) OTHH B) 2003080300 C) 2006082359 EST +E) PRESENCE OF TOWER CRANE AND MOBILE CRANE WITH MAX HEIGHT OF 42.08M +AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: + +251658.74N 0513557.28E - 251657.54N 0513555.72E - +251655.59N 0513556.58E - 251656.30N 0513558.54E - +251658.24N 0513558.44E - 251658.74N 0513557.28E. + PRESENCE OF TOWER CRANE AND MOBILE CRANE WITH MAX HEIGHT OF 42.08M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251658.74N 0513557.28E - 251657.54N 0513555.72E - 251655.59N 0513556.58E - 251656.30N 0513558.54E - 251658.24N 0513558.44E - 251658.74N 0513557.28E. 08 MAR 03:00 2020 UNTIL 08 JUN 23:59 2020 ESTIMATED. CREATED: 02 MAR 04:35 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0213/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002261525 + G0213/20 NOTAMN +Q) OBBB/QMPLC/IV/BO/A/000/999/2516N05137E005 +A) OTHH B) 2003010700 C) 2005311100 +E) ACFT STAND V5 CLSD. + ACFT STAND V5 CLSD. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 15:25 2020 + NOTAMN + QMPLC + + + I + OBBBYNYX + G0212/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002261523 + G0212/20 NOTAMN +Q) OBBB/QMXLC/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2003010700 C) 2005311100 +E) PORTIONS OF FLW TWY CLOSED DUE WIP. +1.TWY C BETWEEN TWY A1 AND TWY E +2.TWY A2 BETWEEN TWY B AND TWY C +3.TWY V BETWEEN TWY C AND ACFT STAND V5 + PORTIONS OF FLW TWY CLOSED DUE WIP. 1.TWY C BETWEEN TWY A1 AND TWY E 2.TWY A2 BETWEEN TWY B AND TWY C 3.TWY V BETWEEN TWY C AND ACFT STAND V5. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 15:23 2020 + NOTAMN + QMXLC + + + I + OBBBYNYX + G0211/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002261518 + G0211/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2003010700 C) 2005311100 +E) PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 18M AGL OPERATING WI THE +AREA BOUNDED BY FLW COORDS: + +251543.0290N 0513716.7545E - 251533.2698N 0513721.0536E - +251529.7637N 0513718.2849E - 251528.5570N 0513718.8162E - +251528.3154N 0513716.7545E - 251529.5222N 0513717.6218E - +251527.5328N 0513712.1584E - 251528.4378N 0513711.7602E - +251529.7749N 0513715.4315E - 251532.6099N 0513714.1830E - +251534.6882N 0513715.2746E - 251535.1198N 0513716.4651E - +251541.1811N 0513713.7657E - 251539.9668N 0513710.4621E - +251540.6307N 0513710.1698E - 251543.0290N 0513716.7545E + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 18M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251543.0290N 0513716.7545E - 251533.2698N 0513721.0536E - 251529.7637N 0513718.2849E - 251528.5570N 0513718.8162E - 251528.3154N 0513716.7545E - 251529.5222N 0513717.6218E - 251527.5328N 0513712.1584E - 251528.4378N 0513711.7602E - 251529.7749N 0513715.4315E - 251532.6099N 0513714.1830E - 251534.6882N 0513715.2746E - 251535.1198N 0513716.4651E - 251541.1811N 0513713.7657E - 251539.9668N 0513710.4621E - 251540.6307N 0513710.1698E - 251543.0290N 0513716.7545E. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 15:18 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0210/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002260955 + G0210/20 NOTAMN +Q) OBBB/QMXLC/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2003010700 C) 2005311100 +E) PORTION OF TWY A9 (BTN TWY B AND TWY C) CLOSED DUE WIP. + PORTION OF TWY A9 (BTN TWY B AND TWY C) CLOSED DUE WIP. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 09:54 2020 + NOTAMN + QMXLC + + + I + OBBBYNYX + G0209/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002260952 + G0209/20 NOTAMN +Q) OBBB/QMXLC/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2003010700 C) 2005311100 +E) PORTION OF TWY C (BTN TWY A8 AND ACFT STAND F11) CLOSED DUE WIP. + PORTION OF TWY C (BTN TWY A8 AND ACFT STAND F11) CLOSED DUE WIP. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 09:52 2020 + NOTAMN + QMXLC + + + I + OBBBYNYX + G0208/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202003010700 + 202005311100 + 202002260950 + G0208/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2517N05137E001 +A) OTHH B) 2003010700 C) 2005311100 +E) PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 22M AGL OPERATING WI THE +AREA BOUNDED BY FLW COORDS: + +251700.59N 0513638.64E - 251701.83N 0513642.04E - +251645.22N 0513649.36E - 251643.98N 0513645.96E - +251700.59N 0513638.64E. + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 22M AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: 251700.59N 0513638.64E - 251701.83N 0513642.04E - 251645.22N 0513649.36E - 251643.98N 0513645.96E - 251700.59N 0513638.64E. 01 MAR 07:00 2020 UNTIL 31 MAY 11:00 2020. CREATED: 26 FEB 09:49 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0200/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002212059 + 202005212059 + 202002200635 + G0200/20 NOTAMN +Q) OBBB/QMPLC/IV/BO/A/000/999/2516N05137E005 +A) OTHH B) 2002212059 C) 2005212059 +E) ACFT STAND D2, D4, E2, E4, E6, E6L, E6R, E8, E8L AND E8R CLSD DUE +WIP. + ACFT STAND D2, D4, E2, E4, E6, E6L, E6R, E8, E8L AND E8R CLSD DUE WIP. 21 FEB 20:59 2020 UNTIL 21 MAY 20:59 2020. CREATED: 20 FEB 06:35 2020 + NOTAMN + QMPLC + + + I + OBBBYNYX + G0199/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002212059 + 202005212059 + 202002200632 + G0199/20 NOTAMN +Q) OBBB/QMXLC/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2002212059 C) 2005212059 +E) PORTION OF TWY N (BTN TWY S AND ACFT STAND E10R) CLOSED DUE WIP. +REMARK: TWY S AND STAND E10R AVAILABLE. + PORTION OF TWY N (BTN TWY S AND ACFT STAND E10R) CLOSED DUE WIP. REMARK: TWY S AND STAND E10R AVAILABLE. 21 FEB 20:59 2020 UNTIL 21 MAY 20:59 2020. CREATED: 20 FEB 06:32 2020 + NOTAMN + QMXLC + + + I + OBBBYNYX + G0194/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002190700 + 202003261100 + 202002190559 + G0194/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05137E001 +A) OTHH B) 2002190700 C) 2003261100 +D) WED THU 0700-1100 1800-1930, SAT 1800-1930 +E) CRANE ACTIVITY WITH MAX HEIGHT OF 20M AGL OPERATING WI AN AREA +BOUNDED BY THE FLW COORD: + +251641.08513N 0513538.99532E - 251631.35282N 0513543.01840E - +251623.93970N 0513521.32799E - 251633.67185N 0513517.30449E - +251641.08513N 0513538.99532E. + CRANE ACTIVITY WITH MAX HEIGHT OF 20M AGL OPERATING WI AN AREA BOUNDED BY THE FLW COORD: 251641.08513N 0513538.99532E - 251631.35282N 0513543.01840E - 251623.93970N 0513521.32799E - 251633.67185N 0513517.30449E - 251641.08513N 0513538.99532E. WED THU 0700-1100 1800-1930, SAT 1800-1930, 19 FEB 07:00 2020 UNTIL 26 MAR 11:00 2020. CREATED: 19 FEB 05:59 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0191/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002230400 + 202003221600 + 202002171614 + G0191/20 NOTAMN +Q) OBBB/QWULW/IV/BO/AW/000/007/2516N05137E001 +A) OTHH B) 2002230400 C) 2003221600 +D) 0400-0500 1500-1600 +E) REMOTELY PILOTED ACFT SYSTEM (RPAS) WILL TAKE PLACE WI AN AREA +BOUNDED BY THE FLW COORDS (KATARA TOWER LUSAIL): +252328.81N 0513152.80E - 252327.76N 0513157.82E - +252314.95N 0513154.45E - 252316.81N 0513147.73E - +252325.95N 0513149.66E - 252328.81N 0513152.80E +F) SFC G) 665FT AGL + REMOTELY PILOTED ACFT SYSTEM (RPAS) WILL TAKE PLACE WI AN AREA BOUNDED BY THE FLW COORDS (KATARA TOWER LUSAIL): 252328.81N 0513152.80E - 252327.76N 0513157.82E - 252314.95N 0513154.45E - 252316.81N 0513147.73E - 252325.95N 0513149.66E - 252328.81N 0513152.80E. SFC - 665FT AGL, 0400-0500 1500-1600, 23 FEB 04:00 2020 UNTIL 22 MAR 16:00 2020. CREATED: 17 FEB 16:14 2020 + NOTAMN + QWULW + + + I + OBBBYNYX + G0159/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002120500 + 202005121100 + 202002091353 + G0159/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05137E001 +A) OTHH B) 2002120500 C) 2005121100 +E) CRANE WITH MAX HEIGHT OF 25M AGL OPERATING WI THE WORK AREA BOUNDED +BY THE FLW COORDS: + +251541.17N 0513713.79E - 251535.11N 0513716.46E - +251534.68N 0513715.26E - 251532.60N 0513714.17E - +251529.77N 0513715.42E - 251528.43N 0513711.75E - +251532.76N 0513709.85E - 251535.22N 0513709.83E - +251536.07N 0513712.17E - 251539.96N 0513710.45E - +251541.17N 0513713.79E. + CRANE WITH MAX HEIGHT OF 25M AGL OPERATING WI THE WORK AREA BOUNDED BY THE FLW COORDS: 251541.17N 0513713.79E - 251535.11N 0513716.46E - 251534.68N 0513715.26E - 251532.60N 0513714.17E - 251529.77N 0513715.42E - 251528.43N 0513711.75E - 251532.76N 0513709.85E - 251535.22N 0513709.83E - 251536.07N 0513712.17E - 251539.96N 0513710.45E - 251541.17N 0513713.79E. 12 FEB 05:00 2020 UNTIL 12 MAY 11:00 2020. CREATED: 09 FEB 13:53 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0138/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202002050700 + 202005050700 + 202002021450 + G0138/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2516N05135E002 +A) OTHH B) 2002050700 C) 2005050700 +E) CRANE WITH MAX HEIGHT OF 45M AGL OPERATING WI THE WORK AREA BOUNDED +BY THE FLW COORDS: +251453.4999N 0513608.5400E - 251633.9599N 0513521.5100E - +251641.7999N 0513514.2800E - 251632.8899N 0513435.7100E - +251614.0999N 0513444.0400E - 251435.8499N 0513527.6700E - +251453.4999N 0513608.5400E. + CRANE WITH MAX HEIGHT OF 45M AGL OPERATING WI THE WORK AREA BOUNDED BY THE FLW COORDS: 251453.4999N 0513608.5400E - 251633.9599N 0513521.5100E - 251641.7999N 0513514.2800E - 251632.8899N 0513435.7100E - 251614.0999N 0513444.0400E - 251435.8499N 0513527.6700E - 251453.4999N 0513608.5400E. 05 FEB 07:00 2020 UNTIL 05 MAY 07:00 2020. CREATED: 02 FEB 14:50 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0127/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001301458 + 202001301500 + G0127/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2513N05136E001 +A) OTHH B) 2001301458 C) 2004302359 EST +E) CRANE (LIGHTED) WITH MAX HEIGHT OF 35M AGL OPERATING WI THE WORK +AREA BOUNDED BY THE FLW COORDS: +251254.3060N 0513510.7628E - 251255.3284N 0513608.9640E - +251234.7220N 0513608.7912E - 251234.7688N 0513527.1176E - +251254.3060N 0513510.7628E. + CRANE (LIGHTED) WITH MAX HEIGHT OF 35M AGL OPERATING WI THE WORK AREA BOUNDED BY THE FLW COORDS: 251254.3060N 0513510.7628E - 251255.3284N 0513608.9640E - 251234.7220N 0513608.7912E - 251234.7688N 0513527.1176E - 251254.3060N 0513510.7628E. 30 JAN 14:58 2020 UNTIL 30 APR 23:59 2020 ESTIMATED. CREATED: 30 JAN 14:59 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0125/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001301455 + 202001301456 + G0125/20 NOTAMN +Q) OBBB/QOBCE/IV/M/A/000/999/2513N05136E001 +A) OTHH B) 2001301455 C) 2004302359 EST +E) CRANE (LIGHTED) WITH MAX HEIGHT OF 26M AGL OPERATING WI THE WORK +AREA BOUNDED BY THE FLW COORDS: +251259.1804N 0513513.9560E - 251300.6204N 0513559.7336E - +251301.2108N 0513611.3616E - 251256.7576N 0513535.1672E - +251259.1804N 0513513.9560E. + CRANE (LIGHTED) WITH MAX HEIGHT OF 26M AGL OPERATING WI THE WORK AREA BOUNDED BY THE FLW COORDS: 251259.1804N 0513513.9560E - 251300.6204N 0513559.7336E - 251301.2108N 0513611.3616E - 251256.7576N 0513535.1672E - 251259.1804N 0513513.9560E. 30 JAN 14:55 2020 UNTIL 30 APR 23:59 2020 ESTIMATED. CREATED: 30 JAN 14:56 2020 + NOTAMN + QOBCE + + + I + OBBBYNYX + G0119/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001300902 + 202001300902 + G0119/20 NOTAMN +Q) OBBB/QOBXX/IV/M/A/000/999/2516N05137E005 +A) OTHH B) 2001300902 C) 2004292359 EST +E) REF QATAR AIRAC AIP SUP 01/20 WEF 02 JAN 2020, AMEND THE FOLLOWING. + + +CRANE ID A-29, HEIGHT TO READ AS 55M AMSL AND END DATE OF OPERATION +TO READ AS 30 JUN 2020. + +CRANE ID A-30, HEIGHT TO READ AS 55M AMSL AND END DATE OF OPERATION +TO READ AS 30 JUN 2020. + REF QATAR AIRAC AIP SUP 01/20 WEF 02 JAN 2020, AMEND THE FOLLOWING. CRANE ID A-29, HEIGHT TO READ AS 55M AMSL AND END DATE OF OPERATION TO READ AS 30 JUN 2020. CRANE ID A-30, HEIGHT TO READ AS 55M AMSL AND END DATE OF OPERATION TO READ AS 30 JUN 2020. 30 JAN 09:02 2020 UNTIL 29 APR 23:59 2020 ESTIMATED. CREATED: 30 JAN 09:02 2020 + NOTAMN + QOBXX + + + I + OBBBYNYX + G0087/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001230620 + 202003311200 + 202001230621 + G0087/20 NOTAMR G1238/19 +Q) OBBB/QOBXX/IV/BO/A/000/999/2516N05137E005 +A) OTHH B) 2001230620 C) 2003311200 +E) UNMARKED JET BLAST DEFLECTOR (LIGHTED AT NIGHT) INSTALLED NORTH OF +STAND 519. +PILOT TO EXER CTN. + UNMARKED JET BLAST DEFLECTOR (LIGHTED AT NIGHT) INSTALLED NORTH OF STAND 519. PILOT TO EXER CTN. 23 JAN 06:20 2020 UNTIL 31 MAR 12:00 2020. CREATED: 23 JAN 06:21 2020 + NOTAMR + QOBXX + + + I + OBBBYNYX + G0032/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001160700 + 202003261100 + 202001071007 + G0032/20 NOTAMN +Q) OBBB/QMRLC/IV/NBO/A/000/999/2516N05137E005 +A) OTHH B) 2001160700 C) 2003261100 +D) THU 0700-1100 +E) RWY 16R/34L CLSD DUE MAINT. + RWY 16R/34L CLSD DUE MAINT. THU 0700-1100, 16 JAN 07:00 2020 UNTIL 26 MAR 11:00 2020. CREATED: 07 JAN 10:06 2020 + NOTAMN + QMRLC + + + I + OBBBYNYX + G0031/20 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001180700 + 202003311100 + 202001071002 + G0031/20 NOTAMN +Q) OBBB/QMRLC/IV/NBO/A/000/999/2516N05137E005 +A) OTHH B) 2001180700 C) 2003311100 +D) EVERY SAT SUN TUE 0700-1100 +E) RWY 16L/34R CLSD DUE MAINT. + RWY 16L/34R CLSD DUE MAINT. EVERY SAT SUN TUE 0700-1100, 18 JAN 07:00 2020 UNTIL 31 MAR 11:00 2020. CREATED: 07 JAN 10:02 2020 + NOTAMN + QMRLC + + + I + OBBBYNYX + G1498/19 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 201912311405 + 201912311407 + G1498/19 NOTAMR G1158/19 +Q) OBBB/QOBCE/IV/M/A/000/999/2517N05134E001 +A) OTHH B) 1912311405 C) 2003312359 EST +E) CRANE (LIGHTED) WITH MAX HEIGHT OF 48M AMSL OPERATING WI AN AREA +BOUNDED BY FOLLOWING COORDINATES: + +251640.1059N 0513417.6546E - 251641.6754N 0513420.0882E - +251621.6847N E 0513428.6272 - 251620.5579N 0513426.1181E - +251640.1059N 0513417.6546E + +PILOT TO EXER CTN. + CRANE (LIGHTED) WITH MAX HEIGHT OF 48M AMSL OPERATING WI AN AREA BOUNDED BY FOLLOWING COORDINATES: 251640.1059N 0513417.6546E - 251641.6754N 0513420.0882E - 251621.6847N E 0513428.6272 - 251620.5579N 0513426.1181E - 251640.1059N 0513417.6546E PILOT TO EXER CTN. 31 DEC 14:05 2019 UNTIL 31 MAR 23:59 2020 ESTIMATED. CREATED: 31 DEC 14:07 2019 + NOTAMR + QOBCE + + + I + OBBBYNYX + G1497/19 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 201912311403 + 201912311403 + G1497/19 NOTAMR G1446/19 +Q) OBBB/QOBCE/IV/M/A/000/999/2515N05136E001 +A) OTHH B) 1912311403 C) 2003312359 EST +E) CRANE WITH MAX HEIGHT OF 26M AGL OPERATING WI AN AREA BOUNDED BY +THE FLW COORDINATES: + +AREA 1 +251436.0631N 0513536.7128E - 251437.1772N 0513538.4147E - +251438.3471N 0513538.0518E - 251439.0482N 0513539.9115E - +251435.1789N 0513538.5902E - 251435.9742N 0513539.2138E - +251436.0631N 0513536.7128E. + +AREA 2 +251452.2400N 0513608.7100E - 251451.1300N 0513609.3300E - +251448.6700N 0513604.5800E - 251450.3800N 0513603.8500E - +251452.2400N 0513608.7100E. + CRANE WITH MAX HEIGHT OF 26M AGL OPERATING WI AN AREA BOUNDED BY THE FLW COORDINATES: AREA 1 251436.0631N 0513536.7128E - 251437.1772N 0513538.4147E - 251438.3471N 0513538.0518E - 251439.0482N 0513539.9115E - 251435.1789N 0513538.5902E - 251435.9742N 0513539.2138E - 251436.0631N 0513536.7128E. AREA 2 251452.2400N 0513608.7100E - 251451.1300N 0513609.3300E - 251448.6700N 0513604.5800E - 251450.3800N 0513603.8500E - 251452.2400N 0513608.7100E. 31 DEC 14:03 2019 UNTIL 31 MAR 23:59 2020 ESTIMATED. CREATED: 31 DEC 14:03 2019 + NOTAMR + QOBCE + + + I + OBBBYNYX + G1487/19 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001021800 + 202003281930 + 201912310924 + G1487/19 NOTAMN +Q) OBBB/QMRLC/IV/NBO/A/000/999/2516N05137E005 +A) OTHH B) 2001021800 C) 2003281930 +D) EVERY THU SAT 1800-1930 +E) RWY 16R/34L CLSD DUE MAINT. + RWY 16R/34L CLSD DUE MAINT. EVERY THU SAT 1800-1930, 02 JAN 18:00 2020 UNTIL 28 MAR 19:30 2020. CREATED: 31 DEC 09:24 2019 + NOTAMN + QMRLC + + + I + OBBBYNYX + G1486/19 + 1 + OTHH + OTHH + HAMAD INTL + 1 + 202001051800 + 202003311930 + 201912310914 + G1486/19 NOTAMN +Q) OBBB/QMRLC/IV/NBO/A/000/999/2516N05137E005 +A) OTHH B) 2001051800 C) 2003311930 +D) EVERY SUN TUE 1800-1930 +E) RWY 16L/34R CLSD DUE MAINT. + RWY 16L/34R CLSD DUE MAINT. EVERY SUN TUE 1800-1930, 05 JAN 18:00 2020 UNTIL 31 MAR 19:30 2020. CREATED: 31 DEC 09:14 2019 + NOTAMN + QMRLC + + 65 + + + OMAA 142200Z VRB02KT CAVOK 23/13 Q1012 NOSIG + OMAA 141700Z 1418/1600 10006KT 8000 NSC +BECMG 1500/1502 17012KT +PROB30 TEMPO 1503/1509 17018KT 3000 BLDU +BECMG 1514/1516 06006KT +BECMG 1522/1600 14010KT + OMDB 142200Z 08005KT 040V120 CAVOK 25/11 Q1012 NOSIG + OMDB 141659Z 1418/1600 09005KT 8000 NSC +BECMG 1502/1504 18010KT +BECMG 1510/1512 35012KT +BECMG 1515/1517 05007KT + OTHH 142200Z AUTO 09013KT CAVOK 22/16 Q1010 NOSIG + OTHH 141704Z 1418/1524 12010KT 8000 NSC +TEMPO 1418/1502 06007KT 8000 -RA FEW035 BKN120 + + + + + + + + + + + <div style="line-height:14px;font-size:13px"><pre><!--BKMK///OFP///0--><!--BKMK///Summary and Fuel///1--><b>[ OFP ] +--------------------------------------------------------------------</b> +VMS0112 01JAN2014 OMAA-OMDB A320 N320SB RELEASE 2248 14MAR20 +OFP 1 ABU DHABI INTL-DUBAI INTL + WX PROG 0112 0115 OBS 0800 0800 + + ATC C/S VMS112 OMAA/AUH OMDB/DXB CRZ SYS CI 5 +01JAN2014 N320SB 1230/1240 1314/1320 GND DIST 138 +A320-200 / CFM56-5B4/P STA 1445 AIR DIST 134 + CTOT:.... G/C DIST 63 + AVG WIND 283/018 +MAXIMUM TOW 171961 LAW 145505 ZFW 137789 AVG W/C P007 +ESTIMATED TOW 148845 LAW 145505 ZFW 134752 AVG ISA P011 + AVG FF LBS/HR 5788 + FUEL BIAS P00.0 +ALTN OTHH TKOF ALTN ....... +FL STEPS OMAA/0160/ +-------------------------------------------------------------------- +DISP RMKS PLANNED OPTIMUM FLIGHT LEVEL + PAYLOAD/CARGO LIMITED BY MLW + +-------------------------------------------------------------------- + PLANNED FUEL +--------------------------------- +FUEL ARPT FUEL TIME +--------------------------------- +TRIP DXB 3340 0034 +CONT 15 MIN 1447 0015 +ALTN DOH 5323 0054 +FINRES 3983 0045 +--------------------------------- +MINIMUM T/OFF FUEL 14093 0228 +--------------------------------- +EXTRA 0 0000 +--------------------------------- +T/OFF FUEL 14093 0228 +TAXI AUH 220 0010 +--------------------------------- +BLOCK FUEL AUH 14313 +PIC EXTRA ..... +TOTAL FUEL ..... +REASON FOR PIC EXTRA ............ +-------------------------------------------------------------------- +NO TANKERING RECOMMENDED (P) +-------------------------------------------------------------------- +I HEREWITH CONFIRM THAT I HAVE PERFORMED A THOROUGH SELF BRIEFING +ABOUT THE DESTINATION AND ALTERNATE AIRPORTS OF THIS FLIGHT +INCLUDING THE APPLICABLE INSTRUMENT APPROACH PROCEDURES, AIRPORT +FACILITIES, NOTAMS AND ALL OTHER RELEVANT PARTICULAR INFORMATION. + +DISPATCHER: CONSTANCE DIXON PIC NAME: SHAHZAD, NABEEL + +TEL: +1 800 555 0199 PIC SIGNATURE: ...............<h2 style="page-break-after: always;"> </h2><!--BKMK///Routing and Impacts///1--> +ALTERNATE ROUTE TO: FINRES 3983 +APT TRK DST VIA FL WC TIME FUEL +-------------------------------------------------------------------- +OTHH/16L 271 298 NABIX2G NABIX P699 ORMID 380 M049 0054 5323 + UP699 DASLO UY856 ALKAN UL721 + BAYAN BAYAN1M +-------------------------------------------------------------------- + +MEL/CDL ITEMS DESCRIPTION +------------- ----------- + +-------------------------------------------------------------------- + +ROUTING: + +ROUTE ID: DEFRTE +OMAA/31L DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID +DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT +OMDB/12R + +-------------------------------------------------------------------- +DEPARTURE ATC CLEARANCE: +. +. +. +-------------------------------------------------------------------- + OPERATIONAL IMPACTS + ------------------- +WEIGHT CHANGE UP 1.0 TRIP P 0020 LBS TIME M 0000 +WEIGHT CHANGE DN 1.0 TRIP M 0006 LBS TIME P 0000 +FL CHANGE UP FL1 TRIP M 0010 LBS TIME M 0000 +FL CHANGE DN FL1 TRIP P 0023 LBS TIME P 0000 +FL CHANGE DN FL2 TRIP P 0071 LBS TIME P 0002 +SPD CHANGE CI 0 TRIP M 0008 LBS TIME P 0000 +SPD CHANGE CI 50 TRIP P 0049 LBS TIME M 0001 +--------------------------------------------------------------------<h2 style="page-break-after: always;"> </h2><!--BKMK///Times and Weights///1-->-------------------------------------------------------------------- +ATIS: +. +. +--------- --------- --------- --------- --------- --------- -------- +RVSM: ALT SYS LEFT: STBY: RIGHT: + +--------- --------- --------- --------- --------- --------- -------- +-------------------------------------------------------------------- + TIMES + ----- + + ESTIMATED SKED ACTUAL + +OUT 1230Z/1630L 1230Z/1630L ......Z + +OFF 1240Z/1640L 1240Z/1640L ......Z + +ON 1314Z/1714L 1439Z/1839L ......Z + +IN 1320Z/1720L 1445Z/1845L ......Z + +BLOCK TIME 0050 0215 ...... + +-------------------------------------------------------------------- + WEIGHTS + ------- + + EST MAX ACTUAL + +PAX 167 ...... + +CARGO 0.0 ...... + +PAYLOAD 38.2 ...... + +ZFW 134.8 137.8 ...... + +FUEL 14.3 14.3 ...... POSS EXTRA 0.0 + +TOW 148.8 148.8 LDG...... + +STAB TRIM ...... + +LAW 145.5 145.5 ...... + +-------------------------------------------------------------------- + TERRAIN CLEARANCE CHECK + ----------------------- +DD CHECK - TERRAIN CLEARANCE CHECK DISABLED + +DP CHECK - TERRAIN CLEARANCE CHECK DISABLED +--------------------------------------------------------------------<h2 style="page-break-after: always;"> </h2><!--BKMK///Flight Log///1--> FLIGHT LOG + ---------- + +MOST CRITICAL MORA 02600 FEET AT TOD///MXSHR 01 AT TOC +-------------------------------------------------------------------- +AWY FL IMT MN WIND OAT EFOB PBRN +POSITION LAT EET ETO MORA ITT TAS COMP TDV +IDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN +FREQ +-------------------------------------------------------------------- + 306 14.1 0.2 +ABU DHABI I N2426.0 ... 21 307 M006 +OMAA E05439.1 0000 ... 138 277 .... .... + +DCT 071 310 .43 259/009 10 13.8 0.5 +BOMUP N2429.1 0001 ... 21 312 M006 P09 +BOMUP E05434.7 0001 ... 5 133 277 543 .... .... + +DCT 079 338 .43 301/012 10 13.8 0.5 +LOVIM N2429.7 0000 ... 21 339 M012 P11 +LOVIM E05433.9 0001 ... 1 132 275 543 .... .... + +DCT 092 306 .44 313/015 08 13.7 0.6 +RESIG N2431.5 0000 ... 21 308 M014 P11 +RESIG E05433.2 0001 ... 2 130 279 534 .... .... + +DCT 115 002 .56 309/019 02 13.4 0.9 +NODVI N2434.7 0001 ... 20 004 M019 P10 +NODVI E05428.8 0002 ... 5 125 345 530 .... .... + +DCT 142 034 .59 295/023 M03 13.0 1.3 +OBMUK N2444.1 0002 ... 20 036 M009 P10 +OBMUK E05429.5 0004 ... 9 116 372 530 .... .... + +DCT 160 034 .61 280/019 M06 12.4 1.9 +T O C N2452.9 0003 ... 20 036 392 P008 P11 + E05436.7 0007 ... 11 105 400 1 534 .... .... + +DCT 160 033 .54 280/019 M06 12.3 2.0 +LORID N2455.9 0000 ... 20 035 344 P008 P11 +LORID E05439.1 0007 ... 4 101 352 1 534 .... .... + +DCT 160 033 .54 280/019 M06 12.2 2.2 +ORGUR N2506.2 0002 ... 20 035 344 P008 P11 +ORGUR E05447.2 0009 ... 13 88 352 1 534 .... .... + +DCT 160 038 .54 280/019 M06 12.1 2.2 +PEBUS N2509.3 0001 ... 20 040 344 P008 P11 +PEBUS E05449.6 0010 ... 4 84 352 1 534 .... .... + +DCT 160 116 .54 280/019 M06 11.9 2.4 +EMOPO N2517.2 0002 ... 21 118 343 P009 P11 +EMOPO E05456.9 0012 ... 10 74 352 1 534 .... .... + +DCT 160 101 .54 280/019 M06 11.8 2.6 +LOTUK N2511.3 0002 ... 24 103 341 P018 P11 +LOTUK E05508.7 0014 ... 12 62 359 1 534 .... .... + +<h2 style="page-break-after: always;"> </h2>AWY FL IMT MN WIND OAT EFOB PBRN +POSITION LAT EET ETO MORA ITT TAS COMP TDV +IDENT LONG TTLT ATO DIS RDIS GS SHR TRP AFOB ABRN +FREQ +-------------------------------------------------------------------- +DCT 160 101 .53 280/019 M06 11.5 2.8 +T O D N2507.6 0002 ... 26 103 341 P019 P11 + E05525.9 0016 ... 16 46 360 1 534 .... .... + +DCT 111 013 .55 290/013 04 11.5 2.9 +LAGTA N2506.0 0003 ... 25 015 P013 P11 +LAGTA E05533.3 0019 ... 7 39 375 538 .... .... + +DCT 090 299 .44 281/010 08 11.4 2.9 +LOVOL N2508.7 0001 ... 25 300 P001 P11 +LOVOL E05534.0 0020 ... 3 36 293 538 .... .... + +DCT 10.8 3.6 +DUBAI INTL N2515.2 0014 ... +OMDB E05521.9 0034 ... 36 .... .... + + + +<h2 style="page-break-after: always;"> </h2><!--BKMK///Wind Information///1-->-------------------------------------------------------------------- + WIND INFORMATION + ---------------- + +CLIMB T O C LORID ORGUR +350 263/100 -42 200 276/023 -17 200 276/023 -17 200 276/023 -17 +310 264/101 -34 180 280/021 -12 180 280/021 -12 180 280/021 -12 +200 287/022 -17 160 280/019 -06 160 280/019 -06 160 280/019 -06 +150 297/015 -04 140 289/018 -02 140 289/018 -02 140 289/018 -02 +100 328/015 +06 120 297/015 +01 120 297/015 +01 120 297/015 +01 + +PEBUS EMOPO LOTUK T O D +200 276/023 -17 200 276/023 -17 200 276/023 -17 200 276/023 -17 +180 280/021 -12 180 280/021 -12 180 280/021 -12 180 280/021 -12 +160 280/019 -06 160 280/019 -06 160 280/019 -06 160 280/019 -06 +140 289/018 -02 140 289/018 -02 140 289/018 -02 140 289/018 -02 +120 297/015 +01 120 297/015 +01 120 297/015 +01 120 297/015 +01 + +DESCENT +350 262/098 -42 +310 262/092 -35 +200 282/022 -17 +150 283/016 -04 +100 290/012 +06 + +--------------------------------------------------------------------<h2 style="page-break-after: always;"> </h2><!--BKMK///ATC Flight Plan///0--><b>[ ATC Flight Plan ] +--------------------------------------------------------------------</b> + ICAO FLIGHT PLAN + ---------------- + +FF OMAEZQZX +142248 CYULSBFP +(FPL-VMS112-IS +-A320/M-SDE3FGHIRWY/LB1 +-OMAA1230 +-N0344F160 DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT + LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL + DCT +-OMDB0024 OTHH +-PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS)<h2 style="page-break-after: always;"> </h2><!--BKMK///Additional Info///0--><b>[ Additional Info ] +--------------------------------------------------------------------</b> +D I S P A T C H B R I E F I N G I N F O VMS0112 OMAA/OMDB + + +<h2 style="page-break-after: always;"> </h2><!--BKMK///Airport WX List///0--><b>[ Airport WX List ] +--------------------------------------------------------------------</b> +OMAA --> OMDB VMS 112 / 01JAN2014 +LIDO/WEATHER SERVICE DATE : 14Mar2020 TIME : 22:48 UTC + +AIRMETs: + No Wx data available + +SIGMETs: + No Wx data available + +Tropical Cyclone SIGMETs: + No Wx data available + +Volcanic Ash SIGMETs: + No Wx data available + +Departure: +OMAA/AUH ABU DHABI INTL + SA 142200 VRB02KT CAVOK 23/13 Q1012 NOSIG + FT 141700 1418/1600 10006KT 8000 NSC + BECMG 1500/1502 17012KT + PROB30 TEMPO 1503/1509 17018KT 3000 BLDU + BECMG 1514/1516 06006KT + BECMG 1522/1600 14010KT + +Destination: +OMDB/DXB DUBAI INTL + SA 142200 08005KT 040V120 CAVOK 25/11 Q1012 NOSIG + FT 141659 1418/1600 09005KT 8000 NSC + BECMG 1502/1504 18010KT + BECMG 1510/1512 35012KT + BECMG 1515/1517 05007KT + +Destination Alternates: +OTHH/DOH HAMAD INTL + SA 142200 AUTO 09013KT CAVOK 22/16 Q1010 NOSIG + FT 141704 1418/1524 12010KT 8000 NSC + TEMPO 1418/1502 06007KT 8000 -RA FEW035 BKN120 + + + AIRPORTLIST ENDED<h2 style="page-break-after: always;"> </h2><!--BKMK///NOTAM///0--><b>[ NOTAM ] +--------------------------------------------------------------------</b> +LIDO-NOTAM-BULLETIN INCLUDES NOTAM, COMP NOTAM AND AIP-REGULATION +<b>VALID: 1401011230 - 1401011714</b> STD(EOBT)+TRIP+ALTN+3HRS +VMS 112 /01JAN OFP-NR: 1 +ROUTE: OMAA - OMDB ALTN: OTHH +N0344F160 DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT +LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL +DCT + + +<b>================================= +DEPARTURE AIRPORT - DETAILED INFO +=================================</b> + +<b>OMAA/AUH ABU DHABI INTL +---------------------------</b> + ++++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++ + +<b>A0609/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242743.28N + 0543532.12E + F) SFC G) 100FT AGL +<b>A0610/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242800.04N + 0543633.98E + F) SFC G) 100FT AGL +<b>A0611/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242830.15N + 0543614.02E + F) SFC G) 100FT AGL +<b>A0612/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242802.03N + 0543619.44E + F) SFC G) 100FT AGL +<b>A0598/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 250M RADIUS CENTERED ON PSN 242920.0N + 0543559.1E. + F) SFC G) 200FT AGL +<b>A0599/20 VALID: 15-MAR-20 0200 - 15-MAR-20 1415</b> + UAS ACT WILL TAKE PLACE WI 120M RADIUS CENTERED ON PSN 242901.69N + 0543624.97E. + F) SFC G) 200FT AGL +<b>A0562/20 </b> + H24 + SECN OF <b>TWY H</b> BTN <b>TWY C</b> AND <b>TWY L3</b> <b>CLSD</b> DUE <b>WIP</b> +<b>A0563/20 </b> + DLY BTN 0300-1400 + SECN OF <b>TWY H</b> BTN <b>TWY B</b> AND <b>TWY L2</b> <b>CLSD</b> DUE <b>WIP</b> +<b>A0568/20 </b> + H24 + OBST CRANE OPR WI AREA BOUNDED BY LINES JOINING: + 242655.40N 0543922.10E + 242654.80N 0543922.90E + 242621.50N 0543853.50E + 242620.80N 0543854.80E + F) SFC G) 036FT AGL<h2 style="page-break-after: always;"> </h2><b>A0401/20 </b> + DLY BTN 0200-1600 + OBST CRAWLER CRANE OPR IN YAS ISLAND WI RADIUS 56M AT PSN + 242742.38N 0543602.65E + F) SFC G) 338FT AGL +<b>A0395/20 </b> + H24 + <b>TWY B</b> BTN <b>TWY B4</b> AND <b>TWY B7</b> <b>CLSD</b> DUE <b>WIP</b>. +<b>A0408/20 </b> + DLY BTN 0130-0300 AND 1430-1530 + IN ORDER TO MNTN ATC FAMILIARITY WITH THE NEW AIRFIELD LGT SYSTEM, + ATC WILL UTILISE THE SYSTEM IN THE SOUTH AIRFIELD DURING THESE + TIMES IN <b>CAT</b> I COND. ATC WILL CONT TO ISSUE STANDARD <b>TWY</b> ROUTINGS + BY RTF, AND WILL SUPPLEMENT THESE BY PROVIDING GREEN CL LIGHT + ROUTINGS. INSTRUCTIONS ISSUED BY RTF TAKE PRECEDENCE, AND + THEREFORE SHOULD THERE BE ANY DOUBT, OR IF IT IS BELIEVED THERE IS + A DISCREPANCY BTN RTF INSTRUCTIONS AND GND LGT ROUTINGS, ACFT + SHALL CTC ATC AT THE EARLIEST OPPORTUNITY AND, IF NECCESSARY, HOLD + PSN WHEN SAFE TO DO SO. +<b>A0340/20 </b> + CNL UAE SUP 07/2019 +<b>A0314/20 </b> + DLY BTN 0200-1800 + OBST CRANE ELEV 20M ERECTED AT PSN 242759.50N 0543755.10E. + F) SFC G) 065FT AGL +<b>A0284/20 </b> + DLY BTN 0200-1800 + OBST CRANE ERECTED AT PSN 242715.90N 0543658.18E. + F) SFC G) 167FT AMSL +<b>A0276/20 </b> + RAPID EXIT <b>TWY D5</b> OPR + REF UAE AIP SUP 09/2019 +<b>A0277/20 </b> + <b>TWY D3</b> OPR. REF UAE AIP SUP 09/2019 +<b>A0271/20 </b> + DLY BTN 0200-1800 + OBST CRANE ERECTED AT PSN 242718.01N 0543659.38E. + F) SFC G) 169FT AMSL + +<b>=================================== +DESTINATION AIRPORT - DETAILED INFO +===================================</b> + +<b>OMDB/DXB DUBAI INTL +-----------------------</b> + ++++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++ + +<b>A0476/20 </b> + H24 + SECN OF TXL P BTN ACFT STANDS E34 AND E38 <b>CLSD</b>. +<b>A0580/20 </b> + H24 + <b>TWY Z8</b> AND <b>TWY Z9</b> <b>NOT AVBL</b>. +<b>A0475/20 </b> + H24 + SECN OF <b>TWY M</b> WEST OF <b>TWY</b> M1B <b>CLSD</b>. + <b>TWY</b> M1A <b>CLSD</b><h2 style="page-break-after: always;"> </h2><b>A0469/20 </b> + H24 + OBST CRANE ELEV 338M ERECTED AT VCY OF PSN 251233.9N 0552037.8E + OMDB ARP BRG 201 DEG MAG DIST 5230M. + CRANE LGT AT NGT. + F) SFC G) 1109FT AMSL +<b>A0127/20 </b> + H24 + SECN OF <b>TWY K</b> BTN <b>TWY K5</b> AND <b>TWY K7</b> <b>CLSD</b>. + EAST LINK OF <b>TWY K6</b> <b>CLSD</b>. <b>TWY Z10</b> <b>CLSD</b>. + SECN OF TXL W BTN <b>TWY K</b> AND TXL Z <b>CLSD</b>. + PILOTS TO EXER CTN AT <b>TWY</b> K8-J2 INT. + REF UAE AIP SUP 33/2019 AREA C27 + C28 +<b>A0264/20 </b> + DLY BTN 0300-0700 + PILOTS TO BE ADVISED OF FLOCKS OF GULLS TRAVELLING FM NORTH TO + SOUTH AND VICE VERSA. ANY BIRDSTRIKE TO BE REPORTED TO ATC. + F) 500FT AGL G) 1500FT AGL +<b>A0171/20 </b> + H24 + OBST CRANE ELEV 207M ERECTED AT VCY OF PSN 251043.69N 0551835.79E + ARP BRG 212 DEG MAG DIST 9.93KM. + CRANE LGT AT NGT. + F) SFC G) 679FT AMSL +<b>A0149/20 </b> + H24 + OBST CRANES ELEV 306M ERECTED AT VCY OF PSN 251225.83N 0552032.74E + ARP BRG 202 DEG MAG DIST 5.5KM + CRANE LIT AT NGT. + F) SFC G) 1004FT AMSL +<b>A2848/19 </b> + H24 + OBST CRANE ELEV 87M ERECTED AT VCY OF PSN 251739N 0551804E ARP BRG + 304 DEG MAG DIST 7.8KM. + CRANE LGT AT NGT. + F) SFC G) 286FT AMSL +<b>A2797/19 </b> + H24 + OBST CRANE ELEV 88M ERECTED AT VCY OF PSN 251505.28N 0552024.29E + ARP BRG 266 DEG MAG DIST 2.5KM. CRANE LGT AT NGT + F) SFC G) 289FT AMSL + +++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++ + +<b>A0531/20 </b> + EV MON AND TUE BTN 1200-1300 + <b>RWY 12L/30R</b> AND <b>RWY 12R/30L</b> <b>NOT AVBL</b>. FLT CLBR INPR + ++++++++++++++++++++++++++++++++ SID ++++++++++++++++++++++++++++++++ + +<b>A0275/20 </b> + SID ITOTU 1F <b>RWY</b> 30L/R <b>WITHDRAWN</b> + REF UAE AIP CHART OMDB <b>AD</b> 2-42. + ++++++++++++++++++++++++ APPROACH PROCEDURES ++++++++++++++++++++++++ + +<b>A0154/20 </b> + DLY BTN 0300-1500 + DUE TO CRANE ACTIVITIES IN THE VCY OF OMDB <b>AD</b>. + <b>GP</b> INOP OCA/H <b>RWY 12L</b> TO READ AS 540(529) REF CHART OMDB <b>AD</b> 2-66.<h2 style="page-break-after: always;"> </h2><b>================================ +DESTINATION ALTERNATE AIRPORT(S) +================================</b> + +<b>OTHH/DOH HAMAD INTL +-----------------------</b> + ++++++++++++++++++++++++++++++ AIRPORT ++++++++++++++++++++++++++++++ + +<b>G0247/20 </b> + MOBILE CRANE WITH MAX HEIGHT OF 37M AGL OPERATING WI THE AREA + BOUNDED BY FLW COORDS: + 251633.82N 0513609.79E - 251631.53N 0513603.61E - + 251625.73N 0513606.16E - 251626.32N 0513607.78E - + 251624.11N 0513608.75E - 251625.79N 0513613.37E - + 251633.82N 0513609.79E. +<b>G0245/20 </b> + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE + AREA BOUNDED BY FLW COORDS: + 251727.04N 0513616.86E - 251725.83N 0513617.39E - + 251725.23N 0513615.74E - 251726.43N 0513615.20E - + 251727.04N 0513616.86E +<b>G0248/20 </b> + MOBILE CRANE WITH MAX HEIGHT OF 22M AGL OPERATING WI AN AREA + BOUNDED BY THE FLW COORDINATES: + AREA 1 + 251719.93N 0513550.34E - 251722.97N 0513553.14E - + 251721.04N 0513555.65E - 251718.00N 0513552.84E - + 251719.93N 0513550.34E. + AREA 2 + 25168.88N 0513622.83E - 25167.72N 0513625.82E - + 25168.15N 0513626.02E - 25166.62N 0513629.96E - + 25164.25N 0513628.85E - 25166.94N 0513621.92E - + 25168.88N 0513622.83E. + AREA 3 + 25152.88N 0513648.69E - 25151.44N 0513649.06E - + 25151.12N 0513647.58E - 25152.55N 0513647.22E - + 25152.88N 0513648.69E. + AREA 4 + 251627.96N 0513608.96E - 251629.06N 0513612.28E - + 251626.28N 0513613.49E - 251625.08N 0513610.17E - + 251627.96N 0513608.96E. +<b>G0227/20 </b> + 08 0600-0800, 15 1100-1800, 22 0200-0500, 24 29 1200-1500 + REMOTELY PILOTED ACFT SYSTEM (RPAS) ACTIVITY WILL TAKE PLACE + WITHIN AN AREA BOUNDED BY FLW COORDS: (LUSAIL CITY) + 252430.4378N 0513029.5162E - 252448.3950N 0513136.6036E - + 252300.4224N 0513216.5810E - 252239.8611N 0513109.4344E - + 252430.4378N 0513029.5162E + F) SFC G) 330FT AGL +<b>G0220/20 </b> + PRESENCE OF TOWER CRANE AND MOBILE CRANE WITH MAX HEIGHT OF 42.08M + AGL OPERATING WI THE AREA BOUNDED BY FLW COORDS: + 251658.74N 0513557.28E - 251657.54N 0513555.72E - + 251655.59N 0513556.58E - 251656.30N 0513558.54E - + 251658.24N 0513558.44E - 251658.74N 0513557.28E.<h2 style="page-break-after: always;"> </h2><b>G0225/20 </b> + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 42M AGL OPERATING WI THE + AREA BOUNDED BY FLW COORDS: + 251704.71N 0513615.00E - 251703.48N 0513615.54E - + 251701.13N 0513609.05E - 251702.36N 0513608.51E - + 251704.71N 0513615.00E +<b>G0208/20 </b> + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 22M AGL OPERATING WI THE + AREA BOUNDED BY FLW COORDS: + 251700.59N 0513638.64E - 251701.83N 0513642.04E - + 251645.22N 0513649.36E - 251643.98N 0513645.96E - + 251700.59N 0513638.64E. +<b>G0209/20 </b> + PORTION OF <b>TWY C</b> (BTN <b>TWY A8</b> AND ACFT STAND F11) <b>CLOSED</b> DUE <b>WIP</b>. +<b>G0210/20 </b> + PORTION OF <b>TWY A9</b> (BTN <b>TWY B</b> AND <b>TWY</b> C) <b>CLOSED</b> DUE <b>WIP</b>. +<b>G0211/20 </b> + PRESENCE OF EQUIPMENT WITH MAX HEIGHT OF 18M AGL OPERATING WI THE + AREA BOUNDED BY FLW COORDS: + 251543.0290N 0513716.7545E - 251533.2698N 0513721.0536E - + 251529.7637N 0513718.2849E - 251528.5570N 0513718.8162E - + 251528.3154N 0513716.7545E - 251529.5222N 0513717.6218E - + 251527.5328N 0513712.1584E - 251528.4378N 0513711.7602E - + 251529.7749N 0513715.4315E - 251532.6099N 0513714.1830E - + 251534.6882N 0513715.2746E - 251535.1198N 0513716.4651E - + 251541.1811N 0513713.7657E - 251539.9668N 0513710.4621E - + 251540.6307N 0513710.1698E - 251543.0290N 0513716.7545E +<b>G0212/20 </b> + PORTIONS OF FLW <b>TWY</b> <b>CLOSED</b> DUE <b>WIP</b>. + 1.TWY C BETWEEN <b>TWY A1</b> AND <b>TWY E</b> + 2.TWY A2 BETWEEN <b>TWY B</b> AND <b>TWY C</b> + 3.TWY V BETWEEN <b>TWY C</b> AND ACFT STAND V5 +<b>G0213/20 </b> + ACFT STAND V5 <b>CLSD</b>. +<b>G0191/20 </b> + 0400-0500 1500-1600 + REMOTELY PILOTED ACFT SYSTEM (RPAS) WILL TAKE PLACE WI AN AREA + BOUNDED BY THE FLW COORDS (KATARA TOWER LUSAIL): + 252328.81N 0513152.80E - 252327.76N 0513157.82E - + 252314.95N 0513154.45E - 252316.81N 0513147.73E - + 252325.95N 0513149.66E - 252328.81N 0513152.80E + F) SFC G) 665FT AGL +<b>G0199/20 </b> + PORTION OF <b>TWY N</b> (BTN <b>TWY S</b> AND ACFT STAND E10R) <b>CLOSED</b> DUE <b>WIP</b>. + REMARK: <b>TWY S</b> AND STAND E10R <b>AVAILABLE</b>. +<b>G0200/20 </b> + ACFT STAND D2, D4, E2, E4, E6, E6L, E6R, E8, E8L AND E8R <b>CLSD</b> DUE + <b>WIP</b>. +<b>G0194/20 </b> + WED THU 0700-1100 1800-1930, SAT 1800-1930 + CRANE ACTIVITY WITH MAX HEIGHT OF 20M AGL OPERATING WI AN AREA + BOUNDED BY THE FLW COORD: + 251641.08513N 0513538.99532E - 251631.35282N 0513543.01840E - + 251623.93970N 0513521.32799E - 251633.67185N 0513517.30449E - + 251641.08513N 0513538.99532E.<h2 style="page-break-after: always;"> </h2><b>G0159/20 </b> + CRANE WITH MAX HEIGHT OF 25M AGL OPERATING WI THE WORK AREA + BOUNDED BY THE FLW COORDS: + 251541.17N 0513713.79E - 251535.11N 0513716.46E - + 251534.68N 0513715.26E - 251532.60N 0513714.17E - + 251529.77N 0513715.42E - 251528.43N 0513711.75E - + 251532.76N 0513709.85E - 251535.22N 0513709.83E - + 251536.07N 0513712.17E - 251539.96N 0513710.45E - + 251541.17N 0513713.79E. +<b>G0138/20 </b> + CRANE WITH MAX HEIGHT OF 45M AGL OPERATING WI THE WORK AREA + BOUNDED BY THE FLW COORDS: + 251453.4999N 0513608.5400E - 251633.9599N 0513521.5100E - + 251641.7999N 0513514.2800E - 251632.8899N 0513435.7100E - + 251614.0999N 0513444.0400E - 251435.8499N 0513527.6700E - + 251453.4999N 0513608.5400E. +<b>G0127/20 </b> + CRANE (LIGHTED) WITH MAX HEIGHT OF 35M AGL OPERATING WI THE WORK + AREA BOUNDED BY THE FLW COORDS: + 251254.3060N 0513510.7628E - 251255.3284N 0513608.9640E - + 251234.7220N 0513608.7912E - 251234.7688N 0513527.1176E - + 251254.3060N 0513510.7628E. +<b>G0125/20 </b> + CRANE (LIGHTED) WITH MAX HEIGHT OF 26M AGL OPERATING WI THE WORK + AREA BOUNDED BY THE FLW COORDS: + 251259.1804N 0513513.9560E - 251300.6204N 0513559.7336E - + 251301.2108N 0513611.3616E - 251256.7576N 0513535.1672E - + 251259.1804N 0513513.9560E. +<b>G0119/20 </b> + REF QATAR AIRAC AIP SUP 01/20 WEF 02 JAN 2020, AMEND THE + FOLLOWING. + CRANE ID A-29, HEIGHT TO READ AS 55M AMSL AND END DATE OF + OPERATION TO READ AS 30 JUN 2020. + CRANE ID A-30, HEIGHT TO READ AS 55M AMSL AND END DATE OF + OPERATION TO READ AS 30 JUN 2020. +<b>G0087/20 </b> + UNMARKED JET BLAST DEFLECTOR (LIGHTED AT NIGHT) INSTALLED NORTH OF + STAND 519. + PILOT TO EXER CTN. +<b>G1498/19 </b> + CRANE (LIGHTED) WITH MAX HEIGHT OF 48M AMSL OPERATING WI AN AREA + BOUNDED BY FOLLOWING COORDINATES: + 251640.1059N 0513417.6546E - 251641.6754N 0513420.0882E - + 251621.6847N E 0513428.6272 - 251620.5579N 0513426.1181E - + 251640.1059N 0513417.6546E + PILOT TO EXER CTN. +<b>G1497/19 </b> + CRANE WITH MAX HEIGHT OF 26M AGL OPERATING WI AN AREA BOUNDED BY + THE FLW COORDINATES: + AREA 1 + 251436.0631N 0513536.7128E - 251437.1772N 0513538.4147E - + 251438.3471N 0513538.0518E - 251439.0482N 0513539.9115E - + 251435.1789N 0513538.5902E - 251435.9742N 0513539.2138E - + 251436.0631N 0513536.7128E. + AREA 2 + 251452.2400N 0513608.7100E - 251451.1300N 0513609.3300E - + 251448.6700N 0513604.5800E - 251450.3800N 0513603.8500E - + 251452.2400N 0513608.7100E.<h2 style="page-break-after: always;"> </h2>++++++++++++++++++++++++++++++ RUNWAY ++++++++++++++++++++++++++++++ + +<b>G0031/20 </b> + EVERY SAT SUN TUE 0700-1100 + <b>RWY 16L/34R</b> <b>CLSD</b> DUE MAINT. +<b>G0032/20 </b> + THU 0700-1100 + <b>RWY 16R/34L</b> <b>CLSD</b> DUE MAINT. +<b>G1486/19 </b> + EVERY SUN TUE 1800-1930 + <b>RWY 16L/34R</b> <b>CLSD</b> DUE MAINT. +<b>G1487/19 </b> + EVERY THU SAT 1800-1930 + <b>RWY 16R/34L</b> <b>CLSD</b> DUE MAINT. +<h2 style="page-break-after: always;"> </h2><!--BKMK///Company NOTAM///0--><b>[ Company NOTAM ] +--------------------------------------------------------------------</b> +<b>========== +CREW ALERT +==========</b> + +<b>SB007/14 </b> + SUBJECT: AUTO COST INDEXES + WHEN PLANNING A COST INDEX, 2 OPTIONS ARE AVAILABLE. PILOTS MAY + EITHER SELECT A SPECIFIC COST INDEX NUMBER FROM THE LIST, OR THEY + MAY SELECT "AUTO". WHEN PLANNING AN "AUTO" COST INDEX, THE SYSTEM + WILL REFERENCE THE "TIME ENROUTE" OPTION AND ATTEMPT TO CHOOSE A + COST INDEX WHICH CLOSELY MATCHES THIS VALUE. NOTE THAT THE "TIME + ENROUTE" OPTION IS MEANT AS A GATE TO GATE TIME (AS INDICATED ON + AN AIRLINE'S FLIGHT SCHEDULE, FOR EXAMPLE). IF A "TIME ENROUTE" OF + 2:30 IS SELECTED, THE SYSTEM WILL SUBTRACT THE TAXI TIMES FROM + THIS VALUE TO DETERMINE THE SCHEDULED AIR TIME. IT WILL THEN + DETERMINE AND USE THE COST INDEX WHICH MATCHES THIS AIR TIME. + +<b>SB003/13 </b> + SUBJECT: FLIGHT RELEASE UNITS + ALL FLIGHT CREW: PLEASE PAY SPECIAL ATTENTION TO THE UNITS + SELECTION WHEN GENERATING A FLIGHT PLAN. FAILURE TO IDENTIFY THE + CORRECT UNITS WHEN REFUELING PRIOR TO FLIGHT CAN RESULT IN + DEPARTING WITH INSUFFICIENT FUEL AND/OR AN ERRONEOUS PAYLOAD. + +<b>============= +CREW BULLETIN +=============</b> + +NIL + + +==================== END OF LIDO-NOTAM-BULLETIN ====================<h2 style="page-break-after: always;"> </h2>Route +<a class="ofpmaplink" href="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_ROUTE.gif" target="_blank"><img src="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_ROUTE.gif" alt="Image no longer available, please regenerate the flightplan." width="600px"></a><h2 style="page-break-after: always;"> </h2>UAD 1 of 3 +<a class="ofpmaplink" href="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS14000.gif" target="_blank"><img src="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS14000.gif" alt="Image no longer available, please regenerate the flightplan." width="600px"></a><h2 style="page-break-after: always;"> </h2>UAD 2 of 3 +<a class="ofpmaplink" href="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS18000.gif" target="_blank"><img src="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS18000.gif" alt="Image no longer available, please regenerate the flightplan." width="600px"></a><h2 style="page-break-after: always;"> </h2>UAD 3 of 3 +<a class="ofpmaplink" href="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS24000.gif" target="_blank"><img src="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_WINDS24000.gif" alt="Image no longer available, please regenerate the flightplan." width="600px"></a><h2 style="page-break-after: always;"> </h2>Vertical profile +<a class="ofpmaplink" href="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_PROFILE.gif" target="_blank"><img src="http://www.simbrief.com/ofp/uads/OMAAOMDB_1584226092_PROFILE.gif" alt="Image no longer available, please regenerate the flightplan." width="600px"></a></pre></div> + + + + 1584225901 + 1584208800 + 1584225181 + 1584226028 + 1584225663 + 1584216960 + + + http://www.simbrief.com/ofp/flightplans/ + + PDF Document + OMAAOMDB_PDF_1584226092.pdf + + + Aerosoft Airbus + OMAAOMDB_ABX_1584226092.flp + + + Aerosoft Airbus EFB + OMAAOMDB_PDF_1584226092.pdf--A3E + + + Aerosoft CRJ + OMAAOMDB_CRX_1584226092.flp + + + Aerowinx PSX 747 + OMAAOMDB_PSX_1584226092.route + + + AivlaSoft EFB + OMAAOMDB_EFB_1584226092.efbr + + + AivlaSoft EFB v2 + OMAAOMDB_EF2_1584226092.efbr + + + Black Box Airbus + OMAAOMDB_BBS_1584226092.pln + + + Captain Sim (PLN) + OMAAOMDB_CSF_1584226092.pln + + + FeelThere + OMAAOMDB_FTR_1584226092.fpl + + + Flight1 GTN + OMAAOMDB_GTN_1584226092.gfp + + + FlightFactor 757-777 + OMAAOMDB_VMX_1584226092.flp + + + FlightFactor A320 + OMAAOMDB_FFA_1584226092.in + + + FS Commander + OMAAOMDB_FSC_1584226092.pln + + + FS2004 + OMAAOMDB_FS9_1584226092.pln + + + FSLabs A320 + OMAAOMDB_FSL_1584226092.txt + + + FSX/P3D + OMAAOMDB_FSX_1584226092.pln + + + FSX/P3D (No SID/STAR) + OMAAOMDB_FSN_1584226092.pln + + + Google Earth KML + OMAAOMDB_KML_1584226092.kml + + + iFly 737NG + OMAAOMDB_IFY_1584226092.FLTPLAN + + + iFly 747 V2 + OMAAOMDB_I74_1584226092.route + + + IVAO/IVAP + OMAAOMDB_IVO_1584226092.fpl + + + IVAO/IVAP (Default.fpl) + OMAAOMDB_XVD_1584226092.fpl + + + IVAO/XIVAP + OMAAOMDB_XVP_1584226092.fpl + + + IXEG 737 Classic + OMAAOMDB_IXG_1584226092.fpl + + + JARDesign Airbus + OMAAOMDB_JAR_1584226092.txt + + + Leonardo MD80 + OMAAOMDB_MDR_1584226092.mdr + + + Leonardo MD80 (ACARS) + OMAAOMDB_MDA_1584226092.txt + + + Level-D 767 + OMAAOMDB_LVD_1584226092.rte + + + Majestic Q400 + OMAAOMDB_MJC_1584226092.fpr + + + PMDG Flightplan + OMAAOMDB_PMR_1584226092.rte + + + PMDG Wind Uplink + OMAAOMDB_PMW_1584226092.wx + + + Project Magenta + OMAAOMDB_MGA_1584226092.sbp + + + ProSim 737 + OMAAOMDB_PSM_1584226092.xml + + + QualityWings + OMAAOMDB_QTY_1584226092.RTE + + + Sim-Avionics + xml/OMAAOMDB_XML_1584226092.xml--sbr + + + Squawkbox + OMAAOMDB_SFP_1584226092.sfp + + + TFDi Design 717 + OMAAOMDB_TFD_1584226092.xml + + + UFMC - Universal FMC + OMAAOMDB_UFC_1584226092.ufmc + + + vasFMC + OMAAOMDB_VAS_1584226092.fmc + + + vPilot + OMAAOMDB_VFP_1584226092.vfp + + + Wilco Airbus Evo + OMAAOMDB_WAE_1584226092.rte + + + X-FMC + OMAAOMDB_XFM_1584226092.FPL + + + X-Plane 11 + OMAAOMDB_XPE_1584226092.fms + + + X-Plane 9/10 + OMAAOMDB_XP9_1584226092.fms + + + phpVMS ACARS + MKJPMWCR_VMS_1585313544.xml + + + + http://www.simbrief.com/ofp/flightplans/ + + PDF Document + OMAAOMDB_PDF_1584226092.pdf + + + Aerosoft Airbus + OMAAOMDB_ABX_1584226092.flp + + + Aerosoft Airbus EFB + OMAAOMDB_PDF_1584226092.pdf--A3E + + + Aerosoft CRJ + OMAAOMDB_CRX_1584226092.flp + + + Aerowinx PSX 747 + OMAAOMDB_PSX_1584226092.route + + + AivlaSoft EFB + OMAAOMDB_EFB_1584226092.efbr + + + AivlaSoft EFB v2 + OMAAOMDB_EF2_1584226092.efbr + + + Black Box Airbus + OMAAOMDB_BBS_1584226092.pln + + + Captain Sim (PLN) + OMAAOMDB_CSF_1584226092.pln + + + FeelThere + OMAAOMDB_FTR_1584226092.fpl + + + Flight1 GTN + OMAAOMDB_GTN_1584226092.gfp + + + FlightFactor 757-777 + OMAAOMDB_VMX_1584226092.flp + + + FlightFactor A320 + OMAAOMDB_FFA_1584226092.in + + + FS Commander + OMAAOMDB_FSC_1584226092.pln + + + FS2004 + OMAAOMDB_FS9_1584226092.pln + + + FSLabs A320 + OMAAOMDB_FSL_1584226092.txt + + + FSX/P3D + OMAAOMDB_FSX_1584226092.pln + + + FSX/P3D (No SID/STAR) + OMAAOMDB_FSN_1584226092.pln + + + Google Earth KML + OMAAOMDB_KML_1584226092.kml + + + iFly 737NG + OMAAOMDB_IFY_1584226092.FLTPLAN + + + iFly 747 V2 + OMAAOMDB_I74_1584226092.route + + + IVAO/IVAP + OMAAOMDB_IVO_1584226092.fpl + + + IVAO/IVAP (Default.fpl) + OMAAOMDB_XVD_1584226092.fpl + + + IVAO/XIVAP + OMAAOMDB_XVP_1584226092.fpl + + + IXEG 737 Classic + OMAAOMDB_IXG_1584226092.fpl + + + JARDesign Airbus + OMAAOMDB_JAR_1584226092.txt + + + Leonardo MD80 + OMAAOMDB_MDR_1584226092.mdr + + + Leonardo MD80 (ACARS) + OMAAOMDB_MDA_1584226092.txt + + + Level-D 767 + OMAAOMDB_LVD_1584226092.rte + + + Majestic Q400 + OMAAOMDB_MJC_1584226092.fpr + + + PMDG Flightplan + OMAAOMDB_PMR_1584226092.rte + + + PMDG Wind Uplink + OMAAOMDB_PMW_1584226092.wx + + + Project Magenta + OMAAOMDB_MGA_1584226092.sbp + + + ProSim 737 + OMAAOMDB_PSM_1584226092.xml + + + QualityWings + OMAAOMDB_QTY_1584226092.RTE + + + Sim-Avionics + xml/OMAAOMDB_XML_1584226092.xml--sbr + + + Squawkbox + OMAAOMDB_SFP_1584226092.sfp + + + TFDi Design 717 + OMAAOMDB_TFD_1584226092.xml + + + UFMC - Universal FMC + OMAAOMDB_UFC_1584226092.ufmc + + + vasFMC + OMAAOMDB_VAS_1584226092.fmc + + + vPilot + OMAAOMDB_VFP_1584226092.vfp + + + Wilco Airbus Evo + OMAAOMDB_WAE_1584226092.rte + + + X-FMC + OMAAOMDB_XFM_1584226092.FPL + + + X-Plane 11 + OMAAOMDB_XPE_1584226092.fms + + + X-Plane 9/10 + OMAAOMDB_XP9_1584226092.fms + + + phpVMS ACARS + MKJPMWCR_VMS_1585313544.xml + + + + http://www.simbrief.com/ofp/uads/ + + Route + OMAAOMDB_1584226092_ROUTE.gif + + + UAD 1 of 3 + OMAAOMDB_1584226092_WINDS14000.gif + + + UAD 2 of 3 + OMAAOMDB_1584226092_WINDS18000.gif + + + UAD 3 of 3 + OMAAOMDB_1584226092_WINDS24000.gif + + + Vertical profile + OMAAOMDB_1584226092_PROFILE.gif + + + + http://skyvector.com/?ll=24.840821,55.01014&chart=304&zoom=2&fpl= OMAA BOMUP LOVIM RESIG NODVI OBMUK LORID ORGUR PEBUS EMOPO LOTUK LAGTA LOVOL OMDB + + <Form method="get" action="https://cert.vatsim.net/fp/file.php" target="_blank"> +<button type="submit">Pre-file on VATSIM</button> +<input type="hidden" name="2" value="VMS112"> +<input type="hidden" name="3" value="A320/L"> +<input type="hidden" name="4" value="344"> +<input type="hidden" name="5" value="OMAA"> +<input type="hidden" name="6" value="1230"> +<input type="hidden" name="7" value="16000"> +<input type="hidden" name="8" value="BOMUP LOVIM RESIG NODVI OBMUK LORID ORGUR PEBUS EMOPO LOTUK LAGTA LOVOL"> +<input type="hidden" name="9" value="OMDB"> +<input type="hidden" name="10a" value="00"> +<input type="hidden" name="10b" value="34"> +<input type="hidden" name="11" value="PBN%2FA1B1C1D1O1S1+DOF%2F140101+REG%2FN320SB+OPR%2FVMS+PER%2FC+RMK%2FTCAS SIMBRIEF"> +<input type="hidden" name="12a" value="02"> +<input type="hidden" name="12b" value="38"> +<input type="hidden" name="13" value="OTHH"> +<input type="hidden" name="14" value="NABEEL SHAHZAD"> +<input type="hidden" name="voice" value="/V/"> +</Form> + <form action="https://fpl.ivao.aero/api/fp/load" method="POST" target="_blank"> +<button type="submit">Pre-file on IVAO</button> +<input type="hidden" name="CALLSIGN" value="VMS112"> +<input type="hidden" name="RULES" value="I"> +<input type="hidden" name="FLIGHTTYPE" value="S"> +<input type="hidden" name="NUMBER" value="1"> +<input type="hidden" name="ACTYPE" value="A320"> +<input type="hidden" name="WAKECAT" value="M"> +<input type="hidden" name="EQUIPMENT" value="SDE3FGHIRWY"> +<input type="hidden" name="TRANSPONDER" value="LB1"> +<input type="hidden" name="DEPICAO" value="OMAA"> +<input type="hidden" name="DEPTIME" value="1230"> +<input type="hidden" name="SPEEDTYPE" value="N"> +<input type="hidden" name="SPEED" value="0344"> +<input type="hidden" name="LEVELTYPE" value="F"> +<input type="hidden" name="LEVEL" value="160"> +<input type="hidden" name="ROUTE" value="DCT BOMUP DCT LOVIM DCT RESIG DCT NODVI DCT OBMUK DCT LORID DCT ORGUR DCT PEBUS DCT EMOPO DCT LOTUK DCT LAGTA DCT LOVOL DCT"> +<input type="hidden" name="DESTICAO" value="OMDB"> +<input type="hidden" name="EET" value="0034"> +<input type="hidden" name="ALTICAO" value="OTHH"> +<input type="hidden" name="ALTICAO2" value=""> +<input type="hidden" name="OTHER" value="PBN/A1B1C1D1O1S1 DOF/140101 REG/N320SB OPR/VMS PER/C RMK/TCAS SIMBRIEF"> +<input type="hidden" name="ENDURANCE" value="0238"> +<input type="hidden" name="POB" value="167"> +</form> + https://www.simbrief.com/ofp/flightplans/OMAAOMDB_MJS_1584226092.js + + VMS + 112 + A320 + OMAA + OMDB + 1388534400 + 43200 + 1800 + BOMUP LOVIM RESIG NODVI OBMUK LORID ORGUR PEBUS EMOPO LOTUK LAGTA LOVOL + 7200 + 900 + + + + auto + OTHH + + NABEEL SHAHZAD + 120867 + 1 + auto + 0 + auto + 45 + auto + auto + auto + auto + auto + auto + auto + auto + AUTO + lido + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + + + + + + + + + + false + + + diff --git a/webpack.mix.js b/webpack.mix.js index 00118a7e..0e41a969 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -25,6 +25,9 @@ function copyAssets() mix.copy('node_modules/icheck/skins/square/blue*.png', 'public/assets/admin/css'); } +/** + * + */ function buildFrontendAssets() { mix.sass('resources/sass/now-ui/now-ui-kit.scss', 'public/assets/frontend/css/now-ui-kit.css') @@ -38,6 +41,9 @@ function buildFrontendAssets() ], 'public/assets/frontend/js/vendor.js'); } +/** + * + */ function buildAdminAssets() { mix.sass('resources/sass/admin/paper-dashboard.scss', @@ -75,6 +81,8 @@ function buildAdminAssets() 'node_modules/jquery-pjax/jquery.pjax.js', 'node_modues/paper-dashboard/assets/js/paper-dashboard.js', ], 'public/assets/admin/js/vendor.js'); + + mix.copy('node_modules/ckeditor4', 'public/assets/vendor/ckeditor4/'); } function buildGlobalAssets() diff --git a/yarn.lock b/yarn.lock index 0bb252e4..62f7e424 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,10 +85,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.16.tgz#3ebcbd7bf978fa4c5120fee8be57083271a8b3ac" integrity sha512-vRuMyoOr5yfNf8QWxXegOjeyjpWJxFePzHzmBOIzDIzo+rSqF94RW0PkS6y4T2+VjAWLXHWrfbIJY3E3aS7lUw== -"Leaflet.Geodesic@git+https://git@github.com/henrythasler/Leaflet.Geodesic.git": - version "2.5.1" - resolved "git+https://git@github.com/henrythasler/Leaflet.Geodesic.git#92e96cc0576be3b00d63b26a4ea13294e983f86a" - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -139,6 +135,11 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== +acorn@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + adjust-sourcemap-loader@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz#e33fde95e50db9f2a802e3647e311d2fc5000c69" @@ -1502,6 +1503,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +ckeditor4@ckeditor/ckeditor4-releases#full/latest: + version "4.14.0" + resolved "https://codeload.github.com/ckeditor/ckeditor4-releases/tar.gz/11f834a9713b9c8ee4e6cd7aa5bf603ff331ba14" + clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -4909,6 +4914,11 @@ minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.2: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"