From 1f0fd5e8ebc33939d9c3464052c63fe57d950fd2 Mon Sep 17 00:00:00 2001 From: Arne Hamann Date: Sun, 24 Apr 2022 13:14:37 +0200 Subject: [PATCH 1/2] Repect .nomedia and .noimage files Signed-off-by: Arne Hamann --- lib/Service/GeophotoService.php | 131 ++++++++++++------ .../Unit/Controller/PhotosControllerTest.php | 47 +++++-- 2 files changed, 127 insertions(+), 51 deletions(-) diff --git a/lib/Service/GeophotoService.php b/lib/Service/GeophotoService.php index 1fc4ae2d..1d6a3548 100644 --- a/lib/Service/GeophotoService.php +++ b/lib/Service/GeophotoService.php @@ -12,7 +12,12 @@ namespace OCA\Maps\Service; +use OC\Files\Search\SearchBinaryOperator; +use OC\Files\Search\SearchComparison; +use OC\Files\Search\SearchQuery; use OCP\Files\FileInfo; +use OCP\Files\Search\ISearchBinaryOperator; +use OCP\Files\Search\ISearchComparison; use OCP\IL10N; use OCP\Files\IRootFolder; use OCP\Files\Storage\IStorage; @@ -60,9 +65,11 @@ class GeophotoService { /** * @param string $userId + * @param bool $respectNomediaAndNoimage=true * @return array with geodatas of all photos */ - public function getAllFromDB($userId) { + public function getAllFromDB(string $userId, bool $respectNomediaAndNoimage=true) { + $ignoredPaths = $respectNomediaAndNoimage ? $this->getIgnoredPaths($userId) : []; $photoEntities = $this->photoMapper->findAll($userId); $userFolder = $this->getFolderForUser($userId); $filesById = []; @@ -70,7 +77,7 @@ class GeophotoService { $previewEnableMimetypes = $this->getPreviewEnabledMimetypes(); foreach ($photoEntities as $photoEntity) { $cacheEntry = $cache->get($photoEntity->getFileId()); - if ($cacheEntry) { + if ($cacheEntry) { // this path is relative to owner's storage //$path = $cacheEntry->getPath(); // but we want it relative to current user's storage @@ -83,26 +90,35 @@ class GeophotoService { continue; } $path = $userFolder->getRelativePath( $file->getPath()); - $isRoot = $file === $userFolder; + $isIgnored = false; + foreach ($ignoredPaths as $ignoredPath) { + if (str_starts_with($path, $ignoredPath)) { + $isIgnored = true; + break; + } + } + if (!$isIgnored) { + $isRoot = $file === $userFolder; - $file_object = new \stdClass(); - $file_object->fileId = $photoEntity->getFileId(); - $file_object->fileid = $file_object->fileId; - $file_object->lat = $photoEntity->getLat(); - $file_object->lng = $photoEntity->getLng(); - $file_object->dateTaken = $photoEntity->getDateTaken() ?? \time(); - $file_object->basename = $isRoot ? '' : $file->getName(); - $file_object->filename = $this->normalizePath($path); - $file_object->etag = $cacheEntry->getEtag(); + $file_object = new \stdClass(); + $file_object->fileId = $photoEntity->getFileId(); + $file_object->fileid = $file_object->fileId; + $file_object->lat = $photoEntity->getLat(); + $file_object->lng = $photoEntity->getLng(); + $file_object->dateTaken = $photoEntity->getDateTaken() ?? \time(); + $file_object->basename = $isRoot ? '' : $file->getName(); + $file_object->filename = $this->normalizePath($path); + $file_object->etag = $cacheEntry->getEtag(); //Not working for NC21 as Viewer requires String representation of permissions // $file_object->permissions = $file->getPermissions(); - $file_object->type = $file->getType(); - $file_object->mime = $file->getMimetype(); - $file_object->lastmod = $file->getMTime(); - $file_object->size = $file->getSize(); - $file_object->path = $path; - $file_object->hasPreview = in_array($cacheEntry->getMimeType(), $previewEnableMimetypes); - $filesById[] = $file_object; + $file_object->type = $file->getType(); + $file_object->mime = $file->getMimetype(); + $file_object->lastmod = $file->getMTime(); + $file_object->size = $file->getSize(); + $file_object->path = $path; + $file_object->hasPreview = in_array($cacheEntry->getMimeType(), $previewEnableMimetypes); + $filesById[] = $file_object; + } } } shuffle($filesById); @@ -111,9 +127,11 @@ class GeophotoService { /** * @param string $userId + * @param bool $respectNomediaAndNoimage * @return array with geodatas of all nonLocalizedPhotos */ - public function getNonLocalizedFromDB ($userId) { + public function getNonLocalizedFromDB (string $userId, bool $respectNomediaAndNoimage=true) { + $ignoredPaths = $respectNomediaAndNoimage ? $this->getIgnoredPaths($userId) : []; $foo = $this->loadTimeorderedPointSets($userId); $photoEntities = $this->photoMapper->findAllNonLocalized($userId); $userFolder = $this->getFolderForUser($userId); @@ -134,21 +152,28 @@ class GeophotoService { if ($file === null) { continue; } - $path = preg_replace('/^\/'.$userId.'\//', '', $file->getPath()); - - $date = $photoEntity->getDateTaken() ?? \time(); - $locations = $this->getLocationGuesses($date); - foreach ($locations as $location) { - $file_object = new \stdClass(); - $file_object->fileId = $photoEntity->getFileId(); - $file_object->path = $this->normalizePath($path); - $file_object->hasPreview = in_array($cacheEntry->getMimeType(), $previewEnableMimetypes); - $file_object->lat = $location[0]; - $file_object->lng = $location[1]; - $file_object->dateTaken = $date; - $filesById[] = $file_object; - } - + $path = $userFolder->getRelativePath( $file->getPath()); + $isIgnored = false; + foreach ($ignoredPaths as $ignoredPath) { + if (str_starts_with($path, $ignoredPath)) { + $isIgnored = true; + break; + } + } + if (!$isIgnored) { + $date = $photoEntity->getDateTaken() ?? \time(); + $locations = $this->getLocationGuesses($date); + foreach ($locations as $location) { + $file_object = new \stdClass(); + $file_object->fileId = $photoEntity->getFileId(); + $file_object->path = $this->normalizePath($path); + $file_object->hasPreview = in_array($cacheEntry->getMimeType(), $previewEnableMimetypes); + $file_object->lat = $location[0]; + $file_object->lng = $location[1]; + $file_object->dateTaken = $date; + $filesById[] = $file_object; + } + } } } @@ -156,6 +181,32 @@ class GeophotoService { return $filesById; } + /** + * @return array + */ + private function getIgnoredPaths($userId){ + $ignoredPaths = []; + $userFolder = $this->root->getUserFolder($userId); + $excludedNodes = $userFolder->search(new SearchQuery( + new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [ + new SearchBinaryOperator( ISearchBinaryOperator::OPERATOR_NOT, [ + new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', FileInfo::TYPE_FOLDER) + ]), + new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, [ + new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'name', '.nomedia'), + new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'name', '.noimage'), + ]), + ]), + 0, + 0, + [] + )); + foreach($excludedNodes as $node) { + $ignoredPaths[] = $userFolder->getRelativePath($node->getParent()->getPath()); + } + return $ignoredPaths; + } + /** * returns a array of locations for a given date * @param $dateTaken @@ -282,6 +333,8 @@ class GeophotoService { return $enabledMimeTypes; } + + private function normalizePath($path) { return str_replace("files","", $path); } @@ -291,13 +344,7 @@ class GeophotoService { * @return Folder */ private function getFolderForUser ($userId) { - $path = '/' . $userId . '/files'; - if ($this->root->nodeExists($path)) { - $folder = $this->root->get($path); - } else { - $folder = $this->root->newFolder($path); - } - return $folder; + return $this->root->getUserFolder($userId); } } diff --git a/tests/Unit/Controller/PhotosControllerTest.php b/tests/Unit/Controller/PhotosControllerTest.php index ecc93bba..103525e0 100644 --- a/tests/Unit/Controller/PhotosControllerTest.php +++ b/tests/Unit/Controller/PhotosControllerTest.php @@ -178,6 +178,8 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $file = $userfolder->get('nc.jpg'); $file->touch(); + $this->photoFileService->addPhotoNow($file, 'test'); + $filename = 'tests/test_files/nut.jpg'; $handle = fopen($filename, 'rb'); $content1 = fread($handle, filesize($filename)); @@ -195,7 +197,7 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { // following section is not valid anymore // TODO fix photo scan (or make it really better) and then adjust tests ;-) - /* + $this->photoFileService->addPhotoNow($file, 'test'); $resp = $this->photosController->getPhotosFromDb(); @@ -203,6 +205,25 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(200, $status); $data = $resp->getData(); $this->assertEquals(1, count($data)); + $this->assertEquals('/nc.jpg', $data[0]->path); + + //Test .nomedia repected + $file = $userfolder->newFile('.nomedia'); + $resp = $this->photosController->getPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(0, count($data)); + $file->delete(); + + //Test .noimage repected + $file = $userfolder->newFile('.noimage'); + $resp = $this->photosController->getPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(0, count($data)); + $file->delete(); // non localized $resp = $this->photosController->getNonLocalizedPhotosFromDb(); @@ -212,14 +233,23 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(1, count($data)); $this->assertEquals('/nut.jpg', $data[0]->path); - foreach ($this->photoFileService->rescan('test') as $path) { - } + //Test .nomedia repected + $file = $userfolder->newFile('.nomedia'); + $resp = $this->photosController->getNonLocalizedPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(0, count($data)); + $file->delete(); - $resp = $this->photosController->getPhotosFromDb(); - $status = $resp->getStatus(); - $this->assertEquals(200, $status); - $data = $resp->getData(); - $this->assertEquals(1, count($data)); + //Test .noimage repected + $file = $userfolder->newFile('.noimage'); + $resp = $this->photosController->getNonLocalizedPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(0, count($data)); + $file->delete(); // place photos $resp = $this->photosController->placePhotos(['/nut.jpg'], [1.2345], [9.8765]); @@ -246,7 +276,6 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(200, $status); $data = $resp->getData(); $this->assertEquals(1, count($data)); - */ } } From 749787a596dd10355821d300ca7fc334186051b0 Mon Sep 17 00:00:00 2001 From: Arne Hamann Date: Sun, 24 Apr 2022 14:51:37 +0200 Subject: [PATCH 2/2] Fixes PhotoController tests Signed-off-by: Arne Hamann --- lib/Helper/ExifGeoData.php | 16 ++++++--- .../Unit/Controller/PhotosControllerTest.php | 35 +++++++++++++++---- tests/test_files/testFile1_locationNut.gpx | 2 ++ 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 tests/test_files/testFile1_locationNut.gpx diff --git a/lib/Helper/ExifGeoData.php b/lib/Helper/ExifGeoData.php index f5398d00..de2e014d 100644 --- a/lib/Helper/ExifGeoData.php +++ b/lib/Helper/ExifGeoData.php @@ -99,10 +99,16 @@ class ExifGeoData */ protected static function get_exif_data_array(string $path) : array{ if( function_exists('exif_read_data') ) { - $data = @exif_read_data($path, null, true)['EXIF']; - if ($data && isset($data[self::LATITUDE]) && isset($data[self::LONGITUDE])) { - return $data; - } + $data = @exif_read_data($path, null, true); + if ($data && isset($data['EXIF']) && isset($data['EXIF'][self::LATITUDE]) && isset($data['EXIF'][self::LONGITUDE])) { + return $data['EXIF']; + } elseif ($data && isset($data['GPS']) && isset($data['GPS'][self::LATITUDE]) && isset($data['GPS'][self::LONGITUDE])) { + $d = $data['GPS']; + if (!isset($d[self::TIMESTAMP]) && isset($data['EXIF'][self::TIMESTAMP])) { + $d[self::TIMESTAMP] = $data['EXIF'][self::TIMESTAMP]; + } + return $data['GPS']; + } } $data = new PelDataWindow(file_get_contents($path)); if (PelJpeg::isValid($data)) { @@ -254,7 +260,7 @@ class ExifGeoData // optional if (isset($this->exif_data[self::TIMESTAMP])) { $t = $this->exif_data[self::TIMESTAMP]; - $this->timestamp = is_string($t) ? $this->string2time($t) : is_int($t) ? $t : null; + $this->timestamp = is_string($t) ? $this->string2time($t) : ( is_int($t) ? $t : null ); } } diff --git a/tests/Unit/Controller/PhotosControllerTest.php b/tests/Unit/Controller/PhotosControllerTest.php index 103525e0..2c849feb 100644 --- a/tests/Unit/Controller/PhotosControllerTest.php +++ b/tests/Unit/Controller/PhotosControllerTest.php @@ -177,7 +177,6 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $file->move($userfolder->getPath().'/nc.jpg'); $file = $userfolder->get('nc.jpg'); $file->touch(); - $this->photoFileService->addPhotoNow($file, 'test'); $filename = 'tests/test_files/nut.jpg'; @@ -197,7 +196,6 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { // following section is not valid anymore // TODO fix photo scan (or make it really better) and then adjust tests ;-) - $this->photoFileService->addPhotoNow($file, 'test'); $resp = $this->photosController->getPhotosFromDb(); @@ -225,12 +223,31 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $this->assertEquals(0, count($data)); $file->delete(); - // non localized + // non localized without track $resp = $this->photosController->getNonLocalizedPhotosFromDb(); $status = $resp->getStatus(); $this->assertEquals(200, $status); $data = $resp->getData(); - $this->assertEquals(1, count($data)); + $this->assertEquals(0, count($data)); + + // with track + $filename = 'tests/test_files/testFile1_locationNut.gpx'; + $content1 = file_get_contents($filename); + $file = $userfolder->newFile('testFile1_locationNut.gpxx'); + $file->putContent($content1); + //$file->touch(); + + $file = $userfolder->get('testFile1_locationNut.gpxx'); + $file->move($userfolder->getPath().'/testFile1_locationNut.gpx'); + //echo 'I MOVE TO '.$userfolder->getPath().'/testFile1.gpx'."\n"; + $file = $userfolder->get('testFile1_locationNut.gpx'); + $file->touch(); + + $resp = $this->photosController->getNonLocalizedPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(1, count($data)); $this->assertEquals('/nut.jpg', $data[0]->path); //Test .nomedia repected @@ -256,7 +273,7 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $status = $resp->getStatus(); $this->assertEquals(200, $status); $data = $resp->getData(); - $this->assertEquals(1, $data); + $this->assertEquals(1, count($data)); $resp = $this->photosController->getPhotosFromDb(); $status = $resp->getStatus(); @@ -264,12 +281,18 @@ class PhotosControllerTest extends \PHPUnit\Framework\TestCase { $data = $resp->getData(); $this->assertEquals(2, count($data)); + $resp = $this->photosController->getNonLocalizedPhotosFromDb(); + $status = $resp->getStatus(); + $this->assertEquals(200, $status); + $data = $resp->getData(); + $this->assertEquals(0, count($data)); + // reset coords $resp = $this->photosController->resetPhotosCoords(['/nut.jpg']); $status = $resp->getStatus(); $this->assertEquals(200, $status); $data = $resp->getData(); - $this->assertEquals(1, $data); + $this->assertEquals(1, count($data)); $resp = $this->photosController->getPhotosFromDb(); $status = $resp->getStatus(); diff --git a/tests/test_files/testFile1_locationNut.gpx b/tests/test_files/testFile1_locationNut.gpx new file mode 100644 index 00000000..f845c6c5 --- /dev/null +++ b/tests/test_files/testFile1_locationNut.gpx @@ -0,0 +1,2 @@ +Garmin International1400.301400.302014-08-14 12:54:50Cyan1401.261401.261399.821397.411395.971397.891398.371397.411399.341401.261404.621403.181400.781401.261400.301396.451397.411398.371397.891398.861397.891399.821399.341398.371397.891397.891400.301400.301400.781401.261400.781401.741402.221405.581407.031409.431412.311414.721416.641417.601423.371428.181431.061431.541432.021432.981432.021432.981434.421436.351438.271439.231441.631444.041445.001447.881451.251452.691455.091457.021458.941460.381463.741466.631469.031471.921474.321475.761477.201479.131481.051481.051483.451484.891487.301486.821486.341486.341486.821492.101490.661488.261489.701487.301485.851484.411484.411482.971481.051480.091479.611478.651477.681477.681479.611482.491487.301489.221489.221488.741487.301488.261489.221489.701493.061494.031492.101492.101489.701489.701489.221483.931482.011478.651475.281470.471468.071466.151465.671466.631468.551470.471471.441470.951469.511469.511470.951471.921470.471469.511471.921471.921470.471470.471470.471472.401471.921470.471467.591467.591466.151465.671463.741460.861457.501456.051456.531457.981457.501458.461458.461457.981457.021457.981457.501457.981456.531455.091453.171452.211451.731451.731451.251450.771449.321448.841447.881447.881448.841449.811449.811450.291450.291450.771450.771451.251452.691453.171454.131456.531456.531456.051456.531457.981459.421458.461459.421463.261466.151467.111469.991471.921474.321475.281476.721475.761478.651481.051483.451484.411487.301488.741490.181492.101492.101490.661491.141491.621494.031494.991496.431501.241502.681504.601507.001507.001509.411509.411509.891508.931507.971508.931515.661517.101518.061520.941520.941523.351525.751528.151528.151531.041532.001534.881537.291539.691541.131542.091544.981544.011544.981549.301553.151558.431558.431556.511557.471557.951559.881559.401561.801565.161565.641568.051571.411574.781576.221579.581582.471584.391582.951586.791591.121593.521596.411599.771599.771599.771600.251601.211603.621606.021606.981608.421610.351613.711616.591621.881623.321626.211626.211623.321621.881624.281628.131628.611627.651630.531631.981633.421633.421632.941633.901634.861637.261638.221639.671643.511645.911646.881648.801649.761653.601654.091655.051656.491657.931658.891658.891660.331659.371659.851659.371658.411657.931656.011656.491654.091655.531657.931656.971657.451656.971656.971656.491656.491657.931657.931655.051651.681656.011656.491656.491657.931661.781666.101668.021672.831675.231675.231675.721678.601680.521681.961684.851687.731688.691690.141690.621692.061693.981695.421698.311700.231701.671703.111704.071705.521705.521706.961708.881707.441707.921707.921708.401708.881711.281713.211713.691714.171713.211713.211712.251712.251715.131717.051718.011719.941718.971718.491718.491718.491719.461718.491717.051714.171712.731710.321709.361708.881707.441705.521703.591705.041704.551703.591702.151703.591706.001706.001706.001705.521702.151702.631703.111704.551707.441708.881711.281714.171712.731712.731709.841706.001702.631701.671702.631704.551704.551706.481706.961707.441707.921707.441708.401709.841710.321710.801710.801712.731714.171713.691713.211712.731712.731715.611718.491720.901722.341722.341722.821722.341721.861721.381720.901721.381721.381721.381722.341722.821722.821722.341721.861721.861721.381720.901720.901722.341722.341724.741726.181726.671726.181725.701725.701723.301722.341721.861721.861721.381720.901720.901720.421718.491717.531718.011718.491718.011717.051715.611714.651714.171712.731713.211712.731712.251712.251712.731713.211714.171713.691714.171714.651714.651715.131715.611715.611715.131715.131714.651714.171713.691710.321707.921708.881710.321710.321710.801710.321709.361709.841710.801711.761711.761711.761711.761710.801709.841708.881708.881708.881708.401706.481705.521708.401708.401707.921706.961704.071700.231699.271696.381693.981693.021689.651688.691688.691687.731685.331684.851682.441682.441681.961678.121675.231671.871671.391671.871671.871671.391672.351672.351674.271678.601679.561675.721672.831665.621660.811657.451656.971655.051654.091654.091654.091654.571652.161652.161652.161654.091654.091654.571654.571654.091653.601654.571654.571655.051655.531655.051656.011657.451660.331661.301664.181665.621666.101668.511671.391672.831673.791674.271678.121683.411686.291688.211689.651691.101690.621690.621691.581691.581690.621689.651689.651688.691684.851683.411682.931681.961679.081676.681673.791670.911671.871680.521681.961685.811686.291686.291686.771688.211687.251687.731687.731687.731686.771685.331687.251689.171686.771684.371684.371681.961680.041678.601680.521679.561678.121681.481681.961684.851686.291684.851681.961681.001681.001678.601676.201671.391671.871673.791669.471672.831675.721683.411682.931675.721681.961682.441682.441678.121683.891685.331688.211688.691689.171690.141689.171690.621690.141690.141690.141701.671707.921705.521705.041699.751710.321706.481704.551706.481710.321704.551703.111704.551701.191699.751700.711699.751700.231698.311695.901693.981693.021694.461693.021698.791700.711701.671699.271698.791697.831697.341696.381695.901693.021693.021691.581693.021693.501694.941693.501693.021692.541691.581690.141688.211685.811688.691693.981693.981699.271711.281720.421724.261728.111730.031734.361735.801741.571745.411751.661760.311763.201768.481769.921768.961767.041765.601765.121760.311757.911757.431759.831759.351756.471758.871756.471757.431758.871758.871757.431755.021750.701750.221747.811746.851747.331747.811738.681710.801707.921699.271698.791694.461696.861699.271698.311698.311699.271699.271700.231701.191703.591706.001706.001705.521703.591704.071702.151701.671701.191704.071705.521708.401708.401711.281710.801709.361708.881709.841709.361715.131718.971720.421720.421722.821723.781725.701730.031733.391733.881735.321737.241736.761739.161742.051742.051741.081741.081743.491744.451749.741754.061755.991757.911760.791760.791761.271763.681764.161765.121768.481770.411772.811772.811774.731775.211776.171778.101779.061780.501778.581778.581781.461782.901784.821783.381780.021780.501782.901783.861785.311785.791785.791790.591790.591790.111790.591789.631788.671792.031791.551789.631788.191789.631789.151788.191788.191792.031794.441797.321797.801799.241800.691800.211802.131802.131800.691800.211801.651799.241798.761794.441793.961790.111788.671788.191788.191790.591791.071792.521794.921791.071789.151788.191788.191788.191788.671792.031793.961794.921794.921794.441796.841800.211801.651802.611805.011807.901810.301812.701812.701811.741813.181815.591815.111814.151814.151813.661811.741808.381814.151817.031817.031814.151813.661813.181813.181813.181813.661812.221812.701813.181811.741809.821811.261811.261811.741813.181814.631816.551817.511820.871822.321821.841820.871819.911821.841821.841819.911816.551812.701812.221808.381807.901807.901805.971804.531805.011804.531804.531804.051805.011803.571803.091803.091801.651798.761797.801794.921793.001792.521791.551791.071791.551786.271785.311783.861780.981781.461780.021779.061778.581779.541780.021780.021779.061780.021779.541781.461780.501778.101778.101776.651774.251774.251774.251773.291771.851771.851772.811772.811770.411770.411768.961767.521767.041766.081766.561767.041768.001768.001768.001771.371773.291775.211776.171775.691773.771775.691775.211775.211774.731774.251774.731775.691774.251773.771772.811773.291773.771773.771773.291773.771772.331772.331772.331772.811771.851771.851770.891768.481768.961769.441770.411774.251775.211774.731773.771772.331770.891771.851771.371770.891770.411770.891770.891769.441770.411772.811776.171778.581778.581780.981781.461782.421784.821786.751787.231789.631793.001794.921796.361799.731802.611803.571803.571806.451810.301812.701815.591817.031817.991818.951821.841823.761825.201827.121829.531830.011832.891835.291836.261835.771838.181838.181840.101841.541842.021842.981845.391845.391845.871849.231851.161851.161850.191851.161850.681848.271848.271849.711850.681849.711851.641852.121852.121852.601853.561857.891862.211863.651865.091866.541868.461871.821871.341873.271876.151878.071878.071881.441883.841884.321887.211890.091890.091890.091888.171887.211887.691886.721884.801886.721886.241886.241888.171890.571892.491892.491893.451894.901894.421896.821896.821897.781895.861894.421892.971890.091887.211886.721887.691888.171887.691886.721887.691888.171890.091888.171887.691888.651892.011893.451893.931895.381894.901896.341900.661902.111901.631902.591903.071903.071905.951906.431907.871908.831912.201912.201911.241912.201912.201912.201912.201911.721911.721910.281910.281909.321908.351907.871906.911906.911905.471902.591901.141901.141898.741894.421893.931893.451890.091887.691887.211886.241886.721885.281885.761887.211889.611891.531892.011891.531891.531891.531892.491891.531894.421895.381896.341897.781898.741903.071902.111903.071904.031904.511904.031903.551903.071895.861892.491891.051891.531891.531891.051891.531890.571892.491892.971891.531890.571889.131891.051892.491892.971892.491893.451892.491893.451893.931892.011889.611888.171889.131888.651889.131888.651888.171886.241884.801885.761886.241891.531890.571892.011891.531890.571890.571892.011892.011888.651889.611889.131886.241886.721886.721883.841880.001877.111872.791869.901869.421866.541866.061865.091862.211864.131865.581866.061865.091865.091861.731860.771859.331860.771862.211861.731860.771859.811858.851853.561853.561849.231846.351845.871844.431842.981837.701835.291832.411829.531828.561827.601827.601826.161824.721824.241823.761824.241823.281819.911819.431818.951817.991817.991817.511816.071814.151813.181812.221812.701813.661814.151816.071817.511820.871821.841825.681827.601826.641828.561833.371837.221839.621844.911847.791850.681851.161852.121852.121853.081853.561856.441857.891859.331861.251861.731860.771860.291860.291860.291859.331859.331861.731862.211861.731863.171862.691860.771861.251862.691863.171865.091866.061866.541866.061866.061864.131861.731858.851857.891855.481853.561853.081852.121849.231846.351843.951841.541834.811833.371830.971830.491831.931834.331833.371831.931833.371833.851835.291836.261837.701836.741836.741836.741839.141842.501842.981844.911846.831846.831846.351846.831849.231850.191851.641854.041853.081855.481857.891856.921855.001855.001855.001857.401859.331862.691864.611865.581867.501868.461870.861872.301874.711876.151879.511881.441883.841886.721890.091892.011894.421896.821898.741901.631904.511908.831909.801910.281909.321909.801912.681911.721911.721912.201912.201911.241909.801910.761911.241913.641911.241911.721908.351910.281909.321909.801909.321907.391908.831909.801910.281912.201910.761911.241911.241911.721914.601916.041910.761906.431900.661897.301897.301897.301897.301896.341895.861893.931893.451892.971890.571887.211886.721887.211884.321882.881880.961880.961879.031878.551877.591876.151875.671873.751874.231874.711877.591879.031880.481881.921880.961878.071879.511885.281886.241888.171888.651888.651889.131889.611891.051893.931894.901898.261895.861892.491890.571890.091891.531891.531893.451894.421892.971894.901895.381896.341897.301898.261898.741901.631901.631905.471906.431907.391909.321911.721913.161916.531917.011918.931919.411921.331922.771923.251924.221925.661926.141924.701925.181923.251924.701925.661926.621928.061929.021927.101925.661925.181921.811920.851919.411919.411918.451917.971916.531915.561915.081914.601913.641916.041916.531915.081915.081914.601913.641910.761910.281910.281909.801909.801907.871904.991904.991900.661897.781895.861894.421895.381895.381895.381894.901894.421893.931892.491892.011886.721922.771919.411915.561909.801907.391904.991907.871905.951905.471904.031904.511904.031904.991905.471906.431905.471905.471905.471907.391911.721914.121917.011920.371921.811922.291920.851919.891917.011915.561917.011917.491917.011917.491916.531917.491916.531917.491918.451917.491917.011916.041913.641913.161911.241910.761908.831908.831908.831908.831908.351907.391906.911902.111900.661898.741895.861895.381895.381896.821898.741897.301892.011885.281873.751869.421863.651863.171858.371857.891855.001854.041853.561852.121851.161850.681849.231848.751848.271844.911842.501839.141836.261836.261834.811831.931830.971830.491827.601827.601827.121827.121826.161822.801822.801822.801821.841819.911819.911816.551812.701811.741810.781809.821806.451802.131801.651798.761797.801795.401791.551793.481790.591789.151787.711783.381782.421778.581778.101775.211773.771770.411769.921767.041765.601764.161761.271760.791760.311758.871758.391758.871755.501751.661747.331745.411744.931741.081740.121734.841734.361730.031726.671725.221724.261722.821720.901720.421718.971715.131712.731710.321710.801710.321708.401707.921705.041700.231696.381695.421694.461691.101689.171688.211683.891681.961683.891690.621692.541692.541693.981688.691688.211689.171692.541691.581691.581690.621691.581682.931675.721680.041683.891685.331686.291685.811685.331676.681672.831672.351667.541662.741659.851658.411658.891656.491657.451652.161652.161652.161653.601654.571653.121653.121652.641647.841644.951642.071638.221637.741637.261637.741637.741635.821635.341634.861634.381630.531627.171626.691623.321618.521616.591612.751609.861608.901607.941606.021606.021604.581599.771598.331596.891595.931597.371596.411595.451596.411596.411593.521588.721592.081594.481596.891597.851591.601588.721587.751585.351581.511582.471581.991580.061576.701572.371572.371575.741578.621578.141574.781573.821571.891569.971567.091566.121565.161562.761558.921558.431556.031553.631550.261546.901543.531541.131537.771534.881530.561526.711526.231522.871519.981519.501518.061516.141514.691513.731510.371510.371508.451505.561503.161499.311496.911495.951495.471492.581489.701492.581492.581491.141491.141490.181489.701488.261487.781486.821485.371483.931481.051475.761473.841472.881468.551464.231461.821461.341458.941458.461456.051453.171450.291448.841447.401446.921444.521441.631442.111441.151437.791432.021425.291424.811423.851420.491419.041419.041417.121416.161415.201414.721413.761412.791409.911406.071405.581405.581403.661403.661407.511406.551405.581402.701397.891395.491391.651390.201388.761387.321382.991383.471381.551377.231373.861369.541367.611365.691362.331359.441359.441358.961361.361361.841358.001351.751350.311349.351345.981343.581342.621342.621344.541339.731338.291337.331333.491332.521333.491333.011333.971334.451334.931335.411337.331339.251338.771338.291341.661342.141342.141342.141340.701339.251334.451326.281322.911323.871324.351321.471318.101317.141317.621315.701313.781309.451306.571304.171302.241300.801297.921296.961295.511292.151289.271289.271290.711285.421283.021278.691278.211273.881269.561270.041271.481275.331273.881270.521267.161265.231259.461248.891246.971246.491239.761240.721238.321237.351230.621225.821221.971217.171217.171218.611219.091216.211216.211216.211218.611217.651214.281212.841212.361209.961207.551207.071207.071203.711201.791198.421197.461191.211186.881184.961183.041174.391169.101164.291159.491155.161153.241153.241153.241153.241157.561158.531149.391144.591143.141139.781137.861136.421133.531128.731123.441115.271103.731098.441100.851101.811102.771102.771103.251103.251099.401096.521096.521093.161091.711089.311089.311087.871087.871087.391084.991075.371069.601068.641066.241056.151054.701059.031058.551058.551058.071057.111057.111056.151050.861048.941047.971047.971046.531043.171038.361036.441036.441034.041033.551030.191026.341025.861025.861023.941022.981019.621015.771012.411010.961009.041007.601007.601000.39998.47998.47997.51997.51992.22989.81987.41988.37988.85992.70993.66996.54996.06990.30985.97990.78992.22993.18987.41983.09983.09986.45988.85984.53986.93983.57979.24976.36979.24978.76974.43967.22964.82965.30966.74969.15965.30963.86964.82971.07966.26964.34972.03971.55969.63970.11975.88972.03978.76978.76990.78988.85983.57984.05982.12982.12981.64984.05979.24984.53986.93991.26986.93982.12973.95975.88977.80979.24981.64982.60981.64985.01987.89988.37996.54998.47995.58994.62989.33990.78990.30985.49985.01988.85995.101000.391009.041008.081011.441013.371008.561007.601009.52995.58996.54996.54985.01976.36972.51976.84978.76989.33993.661006.161011.441010.961001.83990.30982.60977.32985.01976.84978.28983.57983.09976.84968.67963.38956.65960.49960.49959.05958.09958.57960.01976.36975.39977.32981.16976.84977.32978.28977.80982.12981.16977.80975.39976.36977.32972.03972.99976.36975.39976.36973.47970.11969.63968.67973.95982.60983.09980.20971.07970.59971.55967.70962.42955.69948.48948.96947.52947.52950.88958.09961.46965.30968.18972.03975.88982.12985.01983.57983.57980.68980.68983.57983.09982.60982.60983.57985.01985.01984.53984.05982.60979.72980.68982.60982.12981.16980.68980.68982.60984.05984.05986.93988.85988.37987.89988.37988.85990.78989.81989.81998.95997.02997.51996.06994.14996.06997.51997.021000.391005.201015.291016.731014.811012.891012.411015.771018.171021.061025.381035.961037.401036.921041.731047.011049.421047.011045.571052.301054.221056.631059.991065.761067.201064.321064.321062.391058.071055.181054.701057.111056.631057.591059.031062.871062.391064.321065.281065.761067.201064.801068.161079.701083.061083.061085.951089.311093.161092.201085.471091.711097.481102.771101.811106.611109.021116.711120.071122.961123.921124.881123.921120.071125.361126.801127.281127.761129.211132.091133.531135.451134.011135.941136.421136.421137.861138.341138.821139.781140.741140.741140.741140.741140.741140.741140.741141.221141.701142.181142.181142.661143.141160.451202.271179.191174.391170.061162.371162.371161.891160.931161.411158.531159.491157.561158.531159.011159.011158.051158.051158.531157.081156.601155.161154.681154.681154.681154.681155.161154.681154.681154.681155.161170.061170.541176.791167.181172.951179.191173.431177.271177.271178.231178.711176.311173.431172.951174.871181.601187.851188.811189.291189.291187.851187.851187.851189.771192.171192.651193.611195.541196.501198.901198.901200.341201.791201.791202.271202.271202.751202.271202.271202.271203.231205.151206.591208.031216.691218.611219.091221.011219.571218.131215.721216.211220.051223.421230.621234.951239.281241.201241.201244.081247.451249.371250.811252.741255.141258.501258.021258.021261.871264.271266.671268.601268.601269.081269.561269.081268.601268.601268.121269.081270.521270.521270.521271.001271.961272.441274.361274.851275.331275.811275.811276.771277.731277.731278.211279.171279.171279.651281.091281.571283.021284.941285.901287.341288.301287.821287.821288.301288.301288.301288.301288.301288.781288.781288.301288.301287.821297.921303.691304.171310.901311.381311.861312.821315.221325.801325.801328.681331.561333.491331.561333.011334.931339.251345.021346.461346.941348.871350.311348.871348.871348.871347.431347.431347.911348.391354.151354.151353.191352.231352.231351.271350.311353.671352.231351.751352.231352.711352.231350.311350.311349.351349.831349.831353.671355.121354.631354.151356.081357.521360.401363.291364.731366.171368.091370.981374.821377.711379.151379.631382.031385.401391.171395.491401.741403.661405.101412.791413.761415.201416.161418.081421.451421.931417.601420.001421.451427.211432.021435.391438.271440.191441.151441.151446.441448.841450.291452.691453.171456.531459.421461.821462.301465.671466.151470.471469.991470.951471.921471.441472.881475.761479.131481.531483.451486.341488.741490.661492.101494.031494.991494.511494.991497.391498.831500.761502.681503.641505.561507.001507.001508.931511.331512.291512.771514.211515.181516.141517.581518.061520.941521.901523.831524.311525.751527.191530.081533.441534.401534.401537.291537.291538.251540.171539.691538.251537.771537.291536.321537.771539.691540.171541.611543.531545.941546.901545.461546.421549.781551.711554.111556.991557.471557.951560.361561.321563.721565.641566.121569.011569.971572.851575.261580.541581.991582.951585.831588.241587.751587.751588.241589.201590.161592.081592.561593.521594.481595.451594.961598.331600.731604.581608.901611.791615.151616.111619.001619.961621.881622.841623.801626.691631.011631.011630.531633.421635.821639.191641.591644.471644.951644.951648.801651.681656.011659.371662.741665.141666.581667.061666.581667.061668.991671.871673.791674.751676.681676.201679.081681.481681.481683.891685.331686.771692.061694.461693.501695.901698.791699.751700.711701.671704.551705.521707.921711.281712.251716.091717.051717.051718.491721.861722.821723.781724.261728.591728.111728.111728.111728.591728.111731.471733.391735.801731.951732.911735.801734.361734.361729.071731.951732.431731.471730.031725.701722.821721.381721.381723.781724.261724.261724.261724.741725.221724.741726.181723.301724.741723.781723.301725.221723.781722.821725.701724.261722.821723.301723.301725.701726.671725.701723.301724.261722.821722.821720.421722.341721.861720.901721.861722.821723.301723.301725.701727.151727.151727.151729.071731.951731.951735.321736.761738.681739.161739.641741.571741.081742.531743.491743.491746.371747.331749.741752.621755.021756.951758.871760.791763.201764.161767.521768.481768.961771.371773.291776.171777.131777.131779.061780.501784.341787.231790.591792.031791.551792.521794.441797.801800.211802.611805.971808.381810.781812.701814.631817.031817.991821.351823.761826.161828.561829.531830.011830.491832.891831.451830.971831.451830.491831.931830.491829.531824.241827.121830.011833.371834.811837.701839.141841.541842.981844.911845.391846.351848.271850.681854.041857.401858.851858.851857.891859.811862.691865.091868.461870.381871.821873.271876.631880.001882.881884.321885.761887.691889.611891.531894.421894.421895.381898.261902.111905.951908.351911.241912.201912.201911.721912.681915.081917.011919.411920.851919.891921.811925.181928.541930.951931.911933.831934.311934.791935.751936.711939.121940.561941.041942.481944.401943.921945.361946.811946.811946.331945.361948.251950.171950.171952.091951.131951.611952.571954.981957.381958.821961.711964.591967.961970.841969.401970.841974.201977.571979.971982.381981.901984.781987.181988.141991.511993.911994.391997.761996.321996.802000.641998.242000.642001.602004.972007.372009.292011.702014.102015.542017.462018.432019.872022.272023.712024.672025.642028.042031.402032.842035.732039.092040.542043.902047.262048.712047.262050.152053.032053.992056.882059.282064.092066.492068.892070.342069.862070.822071.302068.892069.862070.342069.382067.932067.932068.892067.932067.452070.822071.302070.342072.742075.622078.512081.392081.392082.832083.792085.722088.122091.492090.522091.002093.412095.332096.772099.662102.542103.022105.422107.352108.792111.672113.602114.562114.562115.042116.482117.922120.812119.362122.252121.772122.732122.732123.212124.652127.532128.982130.422130.422130.902131.382133.782134.262135.712136.192137.632136.672133.782136.192138.112139.552140.992143.882143.882147.722149.652152.532155.412158.782159.742160.222164.062166.952169.352172.242171.272171.272174.162175.602175.122175.602177.522178.972180.892181.852185.212186.182184.732184.252183.292182.332181.372184.732188.102189.542189.062188.582190.982193.872197.712199.152202.522203.482206.362207.812208.772210.212213.092215.502218.382220.782222.222223.672227.512228.472230.402232.322233.762236.642239.532239.532238.572238.092240.492238.092228.952250.582248.662247.702245.782243.372240.492240.012239.052239.052235.682233.282231.362229.922229.432226.552225.112223.672218.382215.982213.092212.132211.172210.692210.212210.692212.132206.362204.442206.842206.362206.842203.962202.522202.042202.522202.522201.562199.632197.232195.312192.902191.942190.502187.622185.692184.732182.812181.852178.482178.002177.042173.682170.792170.792170.312169.832168.392168.392166.952164.552165.512162.142159.262159.742157.342156.372159.262161.182162.142162.142159.262155.412153.012151.092150.612149.162148.202149.162149.652150.612147.722144.362143.882142.442142.442140.992139.552136.672136.192135.712134.262130.902128.022128.982125.132126.092127.052122.252121.772121.292120.322119.842116.002116.962117.442119.362117.442115.522112.632106.872105.422105.422106.392107.352104.942104.942105.422105.422104.462102.542103.982103.982103.502102.062099.662092.932093.892092.932091.972090.522090.522090.042090.522088.602084.762083.312079.952077.072078.032075.142074.182073.222072.742073.702073.222073.702074.182075.142073.222069.382067.452066.492064.572061.202058.802055.442057.842056.402054.472050.632047.262047.752047.752046.782046.782046.302046.302043.422041.022040.542035.252031.882032.842034.292033.332028.042024.672027.082029.002029.002024.672025.152021.312021.312019.872016.502014.582015.062014.582013.622012.182011.222011.702009.292007.852005.932002.081997.761994.391997.281996.321993.911990.071987.181985.261983.341980.931979.971977.091974.201973.721973.721969.881971.321971.321971.321969.881969.881966.511963.631962.671958.341954.981955.461956.901954.501951.131950.171949.211948.251944.401943.921942.961945.361944.401940.561939.121936.231934.311931.911930.461928.061927.101927.101924.221922.771921.331920.371918.451918.931912.201915.081914.601913.641911.241909.321907.391907.391905.471905.951903.071899.221896.341893.931893.451892.011892.491892.011890.571891.051892.491889.611892.011890.091892.971887.691883.841882.881881.441877.591877.111878.071875.671873.751872.791872.301871.341870.381868.461866.541865.091860.291860.771855.001850.681848.751853.081852.121850.191849.711849.711848.271847.791847.311844.431843.471841.541840.581838.181838.181835.291833.371834.331831.931832.891836.261835.291831.931830.491824.721821.841823.761823.281822.801822.321820.871822.801825.201825.201827.121830.011831.931832.411831.451834.331835.771834.811832.891832.891831.931830.011829.051829.531830.971831.451830.491831.931832.891830.971826.641827.121830.011830.971831.451831.451830.491829.051830.011831.931832.891832.891835.291832.891832.891832.891830.971832.411830.011829.531830.011828.561827.601826.161825.681825.681825.201823.761817.511817.991814.151812.701811.261811.261808.381806.941803.091801.651801.651800.691798.761794.921792.521790.591787.231784.341783.381781.941780.021779.541780.981779.541777.611775.211773.771771.371769.441767.521763.201763.201762.711763.201763.201763.201760.311757.911757.911756.951756.951755.991756.471754.061750.701750.701749.261747.331745.891745.411743.011741.571741.081739.161738.201737.241735.321733.391732.431731.951731.471731.471731.951731.951729.551730.031728.111727.151725.701724.261722.341720.421720.421720.901719.941719.461717.531716.571714.651713.211711.281708.881707.441705.041704.551707.921705.521701.671699.271699.751698.791696.381694.461693.501690.621690.141688.211686.291683.891681.001679.561679.081676.201674.271671.871672.831669.951670.431670.431667.061665.621663.221662.261659.371658.891656.011657.451656.491655.531653.121649.761646.401644.471644.471641.111639.671637.261633.901632.461629.571627.651624.281619.961619.481618.041615.631613.711610.831609.381610.351609.861608.901606.501602.171600.251598.811597.851597.371595.931594.961595.931594.961594.001593.041592.561592.561591.601588.241586.791584.391584.391583.431583.431581.991581.511578.141575.261572.851570.451569.491569.971566.611564.201561.801560.361556.991556.511556.031554.111552.671550.261548.341544.011541.131539.211539.211540.171541.611543.531543.531541.611542.091541.131540.651540.171536.801534.881534.881535.361535.361533.921533.921532.481530.081529.111528.631526.711526.711525.751527.191528.151527.671527.671525.751524.311521.901521.421518.541518.541514.691514.211510.371508.931507.971507.001503.161497.871495.471495.951494.991492.581491.141488.741487.781483.451484.411485.371485.371479.611476.721475.281474.801469.991466.151462.781463.261462.781460.861461.341464.711464.711461.341460.381458.941457.501458.461455.091450.771448.841445.961443.081441.151439.231436.831438.271438.271437.311441.151445.001439.231434.911438.271438.271441.151439.231437.791435.391440.191441.151446.921446.921449.321445.001446.921442.601442.601445.481442.111439.231439.711437.791437.311436.831435.391432.021427.211422.891419.521416.641413.761409.911406.551404.141402.221400.301396.451395.011392.611393.091392.131390.201389.721390.201388.281387.801387.321388.281388.761387.321384.921382.991378.191373.861370.021366.651361.841358.481354.151351.751351.751351.271350.791348.871347.911347.431341.661340.221335.891335.411337.811339.731339.731339.731338.291336.851334.451334.451332.521326.281325.801328.681326.761327.241328.201329.641329.161331.081329.161333.971332.521333.011333.011331.561331.081332.521331.561332.521331.561331.081332.041332.521327.721322.911321.471318.591316.661312.341310.411308.971309.931309.931308.491305.611302.721297.921296.481295.511292.151291.191289.751286.861285.421283.501283.981286.861286.381283.501283.021283.021280.611276.771277.731276.291276.291274.361272.921270.521271.001271.001269.561268.601265.711264.751261.391261.871264.271263.311262.831261.871258.021257.541255.141251.771248.411247.931247.451246.971243.121240.721237.351234.951233.991233.031230.141227.261224.381219.571218.611214.761214.281211.881211.401211.401209.481207.551206.591206.111205.631204.191201.301199.861197.941197.461196.981196.021192.171188.811187.851184.961182.561178.231175.351179.671178.231177.751179.671180.641180.641180.161180.161181.121182.081182.561179.671177.751177.751177.751175.831172.951170.541169.581172.471171.021170.541168.621166.701163.331159.971155.161147.951140.261134.011133.531132.571136.901135.451141.221149.391152.761151.801150.841149.871149.871148.431146.031145.551145.551143.631143.631142.661141.221140.261139.301138.341138.821138.821139.301139.301139.301138.821138.821135.941136.421137.381138.821137.861136.421135.451132.091128.241125.841123.921120.551117.191115.751115.271114.791116.231114.791113.821113.341109.021106.131106.131100.371097.961095.081089.311084.991082.581082.101082.581083.061082.581087.391090.271091.231092.681090.751089.311086.911084.501083.541082.581083.061081.141078.741074.891073.931072.971071.531070.571069.121068.641065.761066.241066.721067.201066.721066.241065.281065.281062.391059.991060.951060.951061.431056.631055.671052.301051.341052.781052.301052.781052.781051.821051.821049.901049.901049.421048.451047.491045.571043.651042.211039.801043.171043.651043.651040.281040.761038.841037.881037.881036.921036.921034.521032.111030.671027.311026.341025.861025.381025.381023.941023.941022.501022.021021.061020.581019.621019.131014.331006.641002.791001.83999.43997.02996.54995.58993.66993.66993.18994.14989.81988.85988.37990.30991.26992.22992.22992.22990.30989.81988.85988.37987.89985.97986.45985.97983.57983.09982.60982.12981.64980.20981.16980.20980.68979.24980.68977.32974.91975.88972.51968.67968.18967.22961.94958.09958.09954.73955.21955.69954.73955.69955.69956.17956.17956.17961.94963.86963.38961.94962.42962.42962.90962.90962.90962.90964.34964.34963.86963.86962.42960.01959.53959.53962.42964.34967.70970.59970.59971.55972.03970.59969.15969.63971.07972.03972.03972.51975.88973.95973.95973.95972.03971.55971.55971.07971.07970.59970.59970.11970.11970.11969.63969.15969.63970.59970.59967.70966.26966.26966.26964.34961.94961.46957.61956.17955.69955.21955.21954.73954.73954.25953.77953.28953.28951.36950.40950.40949.92949.92949.92949.44948.48948.96948.48946.07945.59945.59943.67944.15944.63945.11945.11948.00949.92928.77927.81932.62934.54937.42938.86935.50 +